2012-06-04 44 views
2

我正在嘗試編寫一個類的複製構造函數,但我得到了這兩個我無法解密的錯誤消息。有人能告訴我我做錯了什麼嗎?在C++中編寫複製構造函數時出錯

class Critter 
    { 

    public: 
     Critter(){} 
     explicit Critter(int hungerLevelParam):hungerLevel(hungerLevelParam){} 
     int GetHungerLevel(){return hungerLevel;} 

     // Copy Constructors 
     explicit Critter(const Critter& rhs); 
     const Critter& operator=(const Critter& rhs); 

    private: 
     int hungerLevel; 
    }; 

Critter::Critter(const Critter& rhs) 
    { 
    *this = rhs; 
    } 

const Critter& Critter::operator=(const Critter& rhs) 
    { 
    if(this != &rhs) 
     { 
     this->hungerLevel = rhs.GetHungerLevel(); // ERROR: object has type qualifier not compatible with member function 
     } 
    return *this; 
    } 

int _tmain(int argc, _TCHAR* argv[]) 
    { 
    Critter aCritter2(10); 
    Critter aCritter3 = aCritter2; // ERROR : No suitable copy constructor 
    Critter aCritter4(aCritter3); 
    return 0; 
    } 
+2

不要拷貝構造函數明確! –

回答

4

你需要int GetHungerLevel() const {return hungerLevel;}

否則,不允許使用參考給const rhs調用GetHungerLevel()

而且,你不能做副本初始化與explicit拷貝構造函數,只有直接初始化:Critter aCritter3(aCritter2);

也許你想拷貝構造函數不明確的,而不是必然改變aCritter3定義,但你的來電。

+0

我不認爲我明白。爲什麼我不能調用getter,即使它是一個const? – unj2

+2

@ kunj2aan:編譯器不知道'GetHungerLevel()'是一個getter。我想在這個例子中它可以解決這個問題,但是語言標準禁止它這樣做。使用reference-to-'const'的目的是阻止你調用非const成員函數(並執行其他非const函數,如分配給數據成員)。所以,如果你想通過reference-to-const調用一個函數,你需要標記函數const。這就是const正確性在C++中的工作原理。 –

+0

有沒有可以瞭解const的有效用法的地方?這件事讓我瘋狂。謝謝。 - – unj2

2

添加const限定GetHungerLevel()

int GetHungerLevel() const {return hungerLevel;} 
4

1)你宣佈你的拷貝構造函數explicit(你需要的是明確的?),所以正確的語法是

Critter aCritter3 (aCritter2); 

Critter aCritter3 = aCritter2; 

2)此外,賦值運算符的正確簽名是:

Critter& operator=(const Critter& rhs); 

3)的方法GetHungerLevel應該是const,但你不知道需要使用它 - 你可以這樣寫:

this->hungerLevel = rhs.hungerLevel; 
+1

這不是賦值運算符的正確簽名。它不能是一個const函數。好吧,我猜可以,但它會很無用。 –

+0

由於賦值會改變對象,不會聲明它的const不正確? – crashmstr

+0

您的*正確*分配簽名不正確。賦值顯然是非const操作! –