3

ゲームを作成していますが、次のエラーが発生します。

class Apple:public Fruit{
public:
    bool isAppleOK = false;
Apple(int amount, int pHValue) {
    amount = amount;
    pHValue= pHValue;
} ~Apple() {
}
    /*code trimmed*/

エラー C2864: 'Apple::isAppleOK': クラス内で初期化できるのは static const 整数データ メンバーのみです

ここで何が欠けていますか?

4

3 に答える 3

11

これは、C++ でメンバー変数を初期化する方法ではありません。コンストラクターの初期化リストに値を設定する必要があります。

Apple(int amount, int pHValue) : isAppleOK(false) {
    amount = amount;
    pHValue= pHValue;
}

他の変数の初期化を初期化リストに移動することもできます。

Apple(int amt, int pHv)
:   isAppleOK(false)
,   amount(amt)
,   pHValue(pHv) {
}
于 2012-07-04T21:52:16.813 に答える
6

ここで何が欠けていますか?

あなたはこれを見逃しています:

クラス内で初期化できるのは static const 整数データ メンバーのみです。

isAppleOkの static const 積分メンバーですかApple? いいえ、ちがいます。コンストラクターの初期化リストで初期化します。

class Apple {
public:
    Apple() : isAppleOk(false) { }
private:
    bool isAppleOk;
}
于 2012-07-04T21:52:05.833 に答える
2

宣言内で変数を初期化することはできません。

class Apple: public Fruit{
public:
    bool isAppleOK;
    Apple(int amount, int pHValue) : amount(amount), pHValue(pHValue),
                                     isAppleOK(false)
    {
    } 

    ~Apple() {
    }
};

完全に関連しているわけではありませんが、コンパイラが変換する可能性があるため、初期化リストも使用します。

class Apple:public Fruit{
public:
    bool isAppleOK;
    Apple(int amount, int pHValue) {
    amount = amount;
    pHValue= pHValue;
    } 
    ~Apple() {
    }
};

class Apple:public Fruit{
    public:
        bool isAppleOK;
        Apple(int amount, int pHValue): amount(), phValue(), 
                                        isAppleOk() {
        amount = amount;
        pHValue= pHValue;
        } 
        ~Apple() {
        }
    };

コンストラクターのパラメーターとして複雑な型がある場合、最初にクラスメンバーが初期化され、その後新しい値が割り当てられるため、各オブジェクトの構築でオーバーヘッドが発生する可能性があります。

初期化リストを使用すると、これはオーバーヘッドなしで同時に実行されます。

于 2012-07-04T21:54:19.900 に答える