1

重複の可能性:
空の括弧のセットを使用して引数なしでコンストラクターを呼び出すとエラーになるのはなぜですか?
オブジェクトの作成とメンバー関数の呼び出し

最近、コンストラクターについて少し学びましたが、今日はコンストラクターパラメーターのデフォルト値を設定するのに問題があります。

hppファイルのコンストラクター宣言は次のようになります。

class PlayingCard {
public:
    PlayingCard(int value = 0, int suit = 0); //default values supplied

cppファイルの定義は次のようになります。

PlayingCard::PlayingCard(int value, int suit) :  _faceValue(value), _suit(suit)
{}

_faceValueそして_suitPlayingCardのプライベートメンバーです)私がこのようにこれをテストするために行くとき:

PlayingCard card1();
PlayingCard card2(7, 1);

cout << "suit int value: " << card1.getSuit() <<
        " face value: " << card1.getFaceValue() << endl;
cout << "suit int value: " << card2.getSuit() <<
        " face value: " << card2.getFaceValue() << endl;

card1に関連するコードをコメントアウトすると、card2は正常に機能します。そうしないと、エラーが発生します。 クラス以外のタイプの「PlayingCard()」である「card1」のメンバー「getSuit」のリクエスト。

これは、引数なしのコンストラクターの使用を認識しないことを意味する必要がありますか?私は何が間違っているのですか?

4

2 に答える 2

5
PlayingCard card1();

オブジェクトを宣言するのではなく、関数を宣言します。これは、パラメーターを受け取らず、型のオブジェクトを返す
という名前の関数を宣言します。 card1PlayingCard

オブジェクトを宣言するには、次のようにする必要があります。

PlayingCard card1;

これは、C++ではMostVexingParseとして知られています。
今日は2回目です。厄介なパースの日だそうです!

于 2012-01-17T11:32:57.237 に答える
1
PlayingCard card1();

これは、戻り型がPlayingCardで、引数がゼロの署名カード1の関数プロトタイプとして扱うことができるため、あいまいさが生じます。card1の後の()を削除して参照してください。

于 2012-01-17T11:36:43.963 に答える