2014-10-20 90 views
2

我oveloaded一个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... 
} 

然后,在我的主()函数,我打电话给这样的构造函数:

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

或像这样:

LCDRange* range2 = new LCDRange(this); 

的问题是,第二个(范围2)不会在所有的工作。 编译器抱怨:

main.cpp中:26:错误:重载 'LCDRange类(进myWidget * const的)' 的呼叫是不明确的
LCDRange类*范围2 =新LCDRange类(本);
候选人是:
LCDRange类:: LCDRange类(QWidget的*,为const char *)
LCDRange类:: LCDRange类(QWidget的*)
LCDRange类:: LCDRange的(常量LCDRange的&)

我不明白哪儿来的第三个构造出现... 为什么它说,在“常量”:

overloaded 'LCDRange(MyWidget* const)

+1

第三个构造函数是自动创建的拷贝构造 – 2014-10-20 12:14:47

+1

请还显示构造器的定义.. .h文件中定义 – Pratham 2014-10-20 12:15:46

+0

我更新我的帖子 – 2014-10-20 12:20:41

回答

5

他们是模糊的,因为两者都可以不带参数使用,那么你有

public: 
    LCDRange(); 
    LCDRange(); 

您可以删除第一个构造函数,只需使用

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

另一种方法是典型的Qt与2层的构造函数:

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

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

+1

你的意思有两个解决方案:要么删除第一个构造函数或改变参数顺序。 – 2014-10-21 07:16:14

+0

你是对的,这个答案也不明确;) – 2014-10-21 08:27:37