Использование QTimeEdit с time_t - шаблон адаптера C++

Мне нужно сделать адаптер для QTimeEdit, чтобы использовать его с time_t в:

  1. конструктор QTimeEdit(time_t)
  2. недействительным setTime (time_t)
  3. time_t time() я сделал 1. и его работа.
class QTimeEditAdapter: public QTimeEdit {
public:
    QTimeEditAdapter(time_t t) {
        tm1 = t;
        tm *ltm = localtime(&tm1);
        int hours = ltm->tm_hour;
        int min = ltm->tm_min;
        this->setTime(QTime(hours,min));
    }
private:
    time_t tm1;
};
int main(int argc, char *argv[])
{
    time_t tm1;
    tm1 = time(NULL);

    //other qt widgets code

    QTimeEdit* timeEdit = new QTimeEditAdapter(tm1);

    //more other qt widgets code

Но если я адаптирую setTime, добавляя

void setTime(time_t t1)

классу он переопределяет setTime, и я получаю ошибки как от конструктора, так и от метода setTime. Я не нашел другого способа установить время в QTimeEdit, но я думаю, что должен быть способ лучше, чем мой

1 ответ

Решение

Член производного класса с тем же именем, что и член базового класса, скрывает прямое использование члена базового класса - C++ Primer (5-е издание), стр. 618

Перегрузка функций на основе списка параметров невозможна между производными и базовыми классами. Если вы позвоните какthis->setTime(QTime(hours,min)); где this это QTimeEditAdapterтолько твой новый QTimeEditAdapter::setTime(time_t)будет учитываться при разрешении перегрузки. Это вызывает ошибку компиляции.

Чтобы обойти это, вы можете напрямую ссылаться на базовый класс в конструкторе:

QTimeEditAdapter::setTime(QTime(hours,min));

но это не поможет другим пользователям вашего адаптера получить доступ к исходному setTime.

Другой обходной путь - вместо этого добавить следующее:

void setTime(QTime qt)
{
        QTimeEdit::setTime(qt);
}

Это устраняет проблему, но теперь вы несете ответственность за перечисление всех (настоящих или будущих) возможных перегрузок, определяемых базовым классом.

Чтобы избежать этих сложных проблем, вероятно, лучше просто выбрать другое имя метода для вашего QTimeEditAdapter::setTime(time_t) метод.

Другие вопросы по тегам