0

こんにちは、私は C++ プログラムに取り組んでおり、作成したクラスからいくつかのサンプル オブジェクトを作成することから始めています。オブジェクトを作成していますが、何らかの理由でドット演算子がオブジェクトで機能しません

これはオブジェクト呼び出しです

Card testcard(Suit hearts, Value six);

これがコンストラクタです

Card::Card(Suit suit, Value facevalue)
{
Card::suit=suit;
Card::faceValue=facevalue;
};

ただし、オブジェクトが実際には存在しないかのように、ドット演算子は機能していません

私はプログラムの大部分を別々の部分で制御しているので、カードクラスが配置されているヘッダーファイルの多くのインスタンスがあります。それが問題の一部であるかどうかはわかりません

4

4 に答える 4

4

インスタンス メソッド内から、ドットを使用してインスタンスにアクセスすることはできません。

this->代わりに試してください:

Card::Card(Suit suit, Value facevalue)
{
    this->suit=suit;
    this->faceValue=facevalue;
};

または、初期化子リストを使用できます。

Card::Card(Suit suit, Value facevalue) : suit(suit), faceValue(facevalue)
    { }
于 2012-09-19T03:56:10.270 に答える
3

クラスが次のようになっていると仮定します。

class Card {
public:
    Card (Suit argSuit, Value argFaceValue);

private:
    Suit   m_Suit;
    Value  m_FaceValue;
};

コンストラクタは次のようになります。クラスのメンバーは、クラスから作成されたオブジェクトで使用できるため、それらにアクセスするために特別なことをする必要はありません。クラスのメンバーはスコープ内にあり、表示されます。関数の引数リストがクラス/オブジェクトメンバーとは異なるシンボルまたは名前を使用していることを確認する必要があります。

Card::Card(Suit argSuit, Value argFaceValue)
{
    m_Suit = argSuit;
    m_FaceValue = argFaceValue;
}
于 2012-09-19T04:06:15.977 に答える
2

これはオブジェクト呼び出しです

Card testcard(Suit hearts, Value six);

いいえ、それは関数宣言です。当然、関数の名前にメンバー アクセス演算子 ( .) を使用しても機能しません。関数には、メンバーを持たない独自の型があります。

自動変数を宣言する (新しいオブジェクト インスタンスを作成する) 場合は、パラメーターの型を繰り返さないでください。言うだけ:

Card testcard(hearts, six);
于 2012-09-19T04:11:27.353 に答える
1

命名規則のいくつかが混乱を引き起こしていると思います。上で指摘したように、コンストラクターに渡されるスーツフェイスバリューの引数でコンテキストの問題に直面しています。つまり、コンストラクター メソッドのコンテキストでは、スーツは実際には、クラス Card のメンバー変数であるスーツよりも、引数として渡されるスーツを意味します。人々は通常、この混乱を避けるのに役立つ命名規則を使用します。たとえば、スーツが m_suit になるように、クラスの各データ メンバーの前にm_を配置します。好きなものを使用できますが、そうすると、他のコードの誰かが m_suit がデータ メンバーであることがすぐにわかります。

もう 1 つのポイントは、コンストラクターのコードが実行される前に、クラスのデータ メンバーを初期化できることです。これは「初期化リスト」と呼ばれ、次のように行われます (上記の命名規則に変更したと仮定します)。

Card::Card (Suit suit, Value facevalue)
 : m_suit (suit), m_facevalue (facevalue)
{
    // no code needs to go here
}

効率的な理由から、この習慣を身につけることをお勧めします。さらに、thisポインターをコンストラクターで使用することは、一般的には良い考えではありません。違法ではありませんが、トラブルに巻き込まれる可能性があります。

ドット演算子が機能しない限り、ドット演算子を使用している場所が正確に質問から明確ではありませんでした。上記の::構文を参照している場合、それは実際には演算子ではなく、クラスを逆参照していることを示す C++ 構文の一部です。suitおよびfacevalueデータ メンバーをstaticとして宣言した場合、この構文は機能しますが、それはやりたいことではありません。

複数のヘッダー ファイルで Card クラスを宣言しているとのことですが、これも悪いことです。

于 2012-09-19T04:22:42.677 に答える