1

C++ で構造体のメンバーを動的に割り当てるために必要な構文がわかりません。基本的に、一時配列と strlen を使用して、char 配列メンバーを正確なサイズで埋める必要があります。ここに私の構造体があります:

struct card
   {
   char *rank;
   char *suit;
   char color;
   bool dealt;
   char *location;
   };

構造体を使用する関数は次のとおりです。

bool importCard(card *deckPtr, char *deckName);

52 枚のカードの配列を作成し、それへのポインターを割り当てて、最初のパラメーターとして関数に渡しました。(deckPtr) カード情報を構造体データ メンバーに読み込む関数のループです。

for(index=0;index<52;index++,deckPtr++)
  {

  fin >> *temp;
  charCount=stringLength(temp);
  deckPtr.*rank = new char[charCount+1];
  stringCopy(*temp, deckPtr.*rank);

  fin >> *temp;
  charCount=stringLength(temp);
  deckPtr.*suit = new char[charCount+1];
  stringCopy(*temp, deckPtr.*suit);

  if(deckPtr.*suit==('d')||deckPtr.*suit==('h'))
     {
     (*deckPtr).color='r';
     }
  else
     {
     (*deckPtr).color='b';
     }

  (*deckPtr).dealt=false;

  deckPtr.*location = new char[11];
  stringCopy(unshPtr, deckPtr.*location);

  }

「ランク」、「スーツ」、「ロケーション」が「このスコープで宣言されていません」という 3 つのコンパイル エラーが発生します。私は何を間違っていますか?ありがとう!

4

3 に答える 3

4

構文はdeckPtr->rank、、、deckPtr->suitですdeckPtr->location = new char[...];

しかし、あなたのコーディング スタイルは C++ というよりも C に似ています。代わりに、 のような便利な RAII クラスを使用して最新の C++ を使用するとstd::string、コードがはるかに簡素化されstd::stringます。生のポインタの代わりに使用するだけchar*で、メモリの割り当てとメモリの解放に注意を払う必要はありませんstd::string。デストラクタ。

#include <string>

struct card
{
   std::string rank;
   std::string suit;
   char color;
   bool dealt;
   std::string location;
};

カスタム関数の代わりに、「自然な」オーバーロード for (ie ) をstringCopy()使用できます。operator=std::stringdestString = sourceString;

52 枚のカードの配列を作成するには、次のようにしますstd::vector

#include <vector>

std::vector<card> cards(52);

ここでも、メモリ割り当ては によって自動的に管理されます(また、生の C 配列とは異なり、そのメソッドを使用して、独自の要素数をstd::vector照会できます)。vectorsize()

于 2013-02-27T19:48:53.277 に答える
0

deckPtr->foo代わりに必要ですdeckPtr.*foo

あなたの問題は、逆参照演算子が onfooではなく onで動作していることです。これは C++ コンパイラには意味がないdeckPtrため、代わりにメンバー operator へのポインターを使用します。この演算子は、オブジェクトのメンバー関数ポインターを実行するために使用されます。これは、メンバーへのアクセスとはまったく異なります。入門レベルの C++ クラス (あなたがいるように見える) では、その演算子の使用や理解について心配する必要がない可能性が高いです。

一般に、C/C++ では、構造体へのポインターがあるときはいつでも->、 ではなく演算子を使用します.foo->barは と同等(*foo).barですが、混乱したり括弧を忘れたりするのを防ぎます。C にアロー演算子があったのには理由があります。その方が簡単でわかりやすいからです。私のあまり謙虚な意見ではありませんが、そのような恣意的な制限を課す教師は、実際には学生に悪いコードを書いて車輪を再発明するように教えていますが、プログラミングを教えた経験はありません...

于 2013-02-27T19:40:12.090 に答える
0

おそらく、 、 、および を使用して、ポインターに何かを割り当てたいと思うでしょうdeckPtr->rank(deckPtr->suit代わりに、deckPtr->locationなど)。inは変数名の一部ではないことに注意してください。変数が へのポインタであることを示しているだけです。char(*deckPtr).rank*char *varchar

于 2013-02-27T19:49:28.373 に答える