将 QTimeEdit 与 time_t 一起使用 - 适配器模式 C++

Using QTimeEdit with time_t - Adapter pattern C++

我需要为 QTimeEdit 创建一个适配器,以便在 time_t 中使用它:

  1. 构造函数 QTimeEdit(time_t)
  2. void setTime(time_t)
  3. time_t 时间() 我做了 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)

到 class 它重新定义了 setTime,我在构造函数和方法 setTime 中都遇到了错误。 我没有找到任何其他方法在 QTimeEdit 中设置时间,但我想一定有比我的更好的方法

A derived-class member with the same name as a member of the base class hides direct use off the base-class member -- C++ Primer (5th Edition), Pg 618

基于参数列表的函数重载在派生和基础 classes 之间是不可能的。如果你像 this->setTime(QTime(hours,min)); 这样调用,其中 this 是一个 QTimeEditAdapter,只有你的新 QTimeEditAdapter::setTime(time_t) 会在重载决议中被考虑。这会导致编译错误。

要解决此问题,您可以在构造函数中直接引用基数-class:

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

但这不会帮助您的适配器的其他用户访问原始 setTime

另一种解决方法是改为添加以下内容:

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

这解决了问题,但现在您要负责枚举基础 class 定义的所有(现在或将来)可能的重载。

为了避免这些棘手的问题,最好为您的 QTimeEditAdapter::setTime(time_t) 方法选择一个不同的方法名称。