Использование QTimeEdit с time_t - шаблон адаптера C++
Мне нужно сделать адаптер для QTimeEdit, чтобы использовать его с time_t в:
- конструктор QTimeEdit(time_t)
- недействительным setTime (time_t)
- 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)
метод.