我正在尝试为类编写一个复制构造函数,但是我收到了这两个错误消息,我无法解密。有人可以告诉我我做错了吗?
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;
}
答案 0 :(得分:4)
您需要int GetHungerLevel() const {return hungerLevel;}
否则,您无权使用引用至GetHungerLevel()
来呼叫rhs
。
此外,您无法使用explicit
复制构造函数进行复制初始化,只能直接初始化:Critter aCritter3(aCritter2);
可能你想让副本ctor不明确,而不是必须改变aCritter3
的定义,而是你的电话。
答案 1 :(得分:4)
1)你声明了你的复制构造函数explicit
(你需要它是显式的吗?),所以正确的语法是
Critter aCritter3 (aCritter2);
不
Critter aCritter3 = aCritter2;
2)此外,赋值运算符的正确签名是:
Critter& operator=(const Critter& rhs);
3)方法GetHungerLevel
应为const
,但您需要才能使用它 - 您只需编写:
this->hungerLevel = rhs.hungerLevel;
答案 2 :(得分:2)
将const限定符添加到GetHungerLevel()
int GetHungerLevel() const {return hungerLevel;}