我应该如何重载构造函数

Hél*_*ène 2 qt constructor overloading

我开发了像这样的QWidget构造函数:

.h文件:

public:
    LCDRange(QWidget* parent = 0);
    LCDRange(QWidget* parent = 0, const char* text = 0);
Run Code Online (Sandbox Code Playgroud)

.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...
}
Run Code Online (Sandbox Code Playgroud)

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

LCDRange* range1 = new LCDRange(this, "Text 1");
Run Code Online (Sandbox Code Playgroud)

或者像这样:

LCDRange* range2 = new LCDRange(this);
Run Code Online (Sandbox Code Playgroud)

问题是第二个(范围2)根本不起作用.编译器抱怨:

main.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)

Kai*_*alz 5

它们含糊不清,因为两者都可以在没有参数的情况下使用,然后就可以了

public:
    LCDRange();
    LCDRange();
Run Code Online (Sandbox Code Playgroud)

您可以删除第一个构造函数,然后使用

public:
    LCDRange(QWidget* parent = 0, const char* text = 0);
Run Code Online (Sandbox Code Playgroud)

另一种是具有2个构造函数的典型qt风格:

public:
    explicit LCDRange(QWidget* parent = 0);
    explicit LCDRange(const char* text, QWidget* parent = 0);
Run Code Online (Sandbox Code Playgroud)

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