【问题标题】:How should I overload the constructor我应该如何重载构造函数
【发布时间】:2014-10-20 12:09:28
【问题描述】:

我像这样重载了一个 QWidget 构造函数:

.h 文件:

public:
    LCDRange(QWidget* parent = 0);
    LCDRange(QWidget* parent = 0, const char* text = 0);

.cpp 文件:

LCDRange::LCDRange(QWidget* parent): QWidget(parent){
    init();
    std::cout << "constr 1 called" <<std::endl;
}


LCDRange::LCDRange(QWidget* parent, const char* text): QWidget(parent){
    init();
    setText(text);
    std::cout << "constr 2 called" <<std::endl;
}

    void LCDRange::init(){
//code...
}

然后,在我的 main() 函数中,我这样调用构造函数:

LCDRange* range1 = new LCDRange(this, "Text 1");

或者像这样:

LCDRange* range2 = new LCDRange(this);

问题是第二个(range2)根本不起作用。 编译器抱怨:

ma​​in.cpp:26: 错误:重载 'LCDRange(MyWidget* const)' 的调用不明确
LCDRange* range2 = new LCDRange(this);
候选人是:
LCDRange::LCDRange(QWidget*, const char*)
LCDRange::LCDRange(QWidget*)
LCDRange::LCDRange(const LCDRange&)

我不明白第三个构造函数出现在哪里... 为什么它在中说“const”:

重载 'LCDRange(MyWidget* const)

【问题讨论】:

  • 第三个构造函数是自动创建的拷贝构造函数
  • 请同时显示构造函数定义.. .h 文件定义

标签: qt constructor overloading


【解决方案1】:

它们是模棱两可的,因为两者都可以在没有参数的情况下使用,那么你就有了

public:
    LCDRange();
    LCDRange();

您可以删除第一个构造函数并使用

public:
    LCDRange(QWidget* parent = 0, const char* text = 0);

另一种方法是带有 2 个构造函数的典型 qt 样式:

public:
    explicit LCDRange(QWidget* parent = 0);
    explicit LCDRange(const char* text, QWidget* parent = 0);

现在,您有一个默认构造函数和一个专用于const char* text 的构造函数。此外,我添加了explicit 以防止编译器进行隐式转换。您可以在cppreference.com 上阅读更多内容。

【讨论】:

  • 您的意思是有两种解决方案:删除第一个构造函数或更改参数顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多