2014-10-20 46 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