2

クラスのコピー コンストラクターを作成しようとしていますが、解読できないこれら 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);

おそらく、必ずしも の定義を変更するのではなく、copy 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

GetHungerLevel() に const 修飾子を追加

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