2

我正在尝试为一个类编写一个复制构造函数,但我收到了这两条错误消息,我无法破译。有人可以告诉我我做错了什么吗?

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;
    }
4

3 回答 3

4

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

否则,您不能GetHungerLevel()使用 reference-to-const进行调用rhs

此外,您不能使用explicit复制构造函数进行复制初始化,只能直接初始化:Critter aCritter3(aCritter2);

可能您想使复制 ctor 不显式,而不是必须更改 的定义aCritter3,而是您的调用。

于 2012-06-04T17:51:56.587 回答
4

1)你声明了你的复制构造函数explicit(你需要它是显式的吗?),所以正确的语法是

Critter aCritter3 (aCritter2);

不是

Critter aCritter3 = aCritter2;

2)此外,赋值运算符的正确签名是:

Critter& operator=(const Critter& rhs);

3)方法GetHungerLevel应该是const,但你不需要使用它 - 你可以写:

this->hungerLevel = rhs.hungerLevel;
于 2012-06-04T17:52:07.437 回答
2

将 const 限定符添加到 GetHungerLevel()

  int GetHungerLevel() const {return hungerLevel;}  
于 2012-06-04T17:52:03.473 回答