2

Visual C ++2010Expressの一部のコードに問題があります。デフォルト値の引数を受け入れるコンストラクターを持つクラスを作成しようとしています。これが私が達成しようとしていることを示す短いプログラムです:

//Class declaration
class Class {
private:
    int mValue;
public:
    Class(int);
    int GetValue();
};

Class::Class(int val=1) : mValue(val)
{
}

int Class::GetValue()
{
    return mValue;
}

int main()
{
    Class test;
    cout << test.GetValue() << endl;
}

今、これはうまくいくようです。たとえば、に置き換えるClass testClass test(10)mValue正しく初期化されます。

しかし、2番目のプログラムでは、まったく同じことをしようとしています。私はこのように定義されたクラスを持っています:

namespace mobs {
    Class Monster {
    private:
        mHitPoints;
    public:
        Monster(int);
        int GetHitPoints() const;
    };
}

このような関数の実装で:

namespace mobs {

    Monster::Monster(int hp=10) : mHitPoints(hp)
    {
    }

    int Monster::GetHitPoints() const
    {
        return mHitPoints;
    }
}

しかし、クラスを宣言して次のGetHitPoints()ような関数を使用しようとすると、次のようになります。

mobs::Monster testmonster;
cout << testmonster.GetHitPoints() << endl;

Visual C ++は、「クラスmobs::Monsterのデフォルトコンストラクターは存在しない」と言っています。どうしてこれなの?

4

2 に答える 2

5

デフォルト値は、定義ではなく宣言に属します。をヘッダーファイルに移動し=10ます。

Monster(int hp = 10)

実装では、デフォルト値も必要ありません。私は通常使用します:

Monster::Monster(int hp /*=10*/)

デフォルトがあることを明確にするためだけに。

于 2012-07-08T19:57:25.113 に答える
-1

コンストラクターはあいまいです。それが理由です。コンストラクターが2つある場合

Monster(){}
Monster(x=10){}

そして、Monster m();を呼び出します。

コンパイラは、あなたが最初のコンストラクタを意味するのか、2番目のコンストラクタを意味するのかをどのように知る必要がありますか?代わりに次のように定義します

class Class {
private:
    int mValue;
public:
    Class(int val) :mValue(val){}
    Class() :mValue(1){}
};
于 2012-07-08T20:02:05.767 に答える