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);

  }

我收到三个编译错误:“等级”“套装”和“位置”“未在此范围内声明”。我究竟做错了什么?谢谢!

4

3 回答 3

4

语法是deckPtr->rank, deckPtr->suit, deckPtr->location = new char[...];.

但是你的编码风格更像 C 而不是 C++。相反,如果您使用现代 C++和方便的RAIIstd::string,例如析构函数。std::stringchar*std::string

#include <string>

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

而不是您的自定义stringCopy()函数,您可以只使用(即)的“自然”operator=重载。std::stringdestString = sourceString;

要构建 52 张卡片的数组,只需使用std::vector

#include <vector>

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

同样,内存分配由自动管理std::vector(并且,与原始 C 数组不同,您可以vector使用它的方法查询它自己的元素计数size())。

于 2013-02-27T19:48:53.277 回答
0

您可能想要使用deckPtr->rank,deckPtr->suitdeckPtr->locationchar指针分配一些东西(或者(*deckPtr).rank等)。请注意,*inchar *var不是变量名称的一部分。它只是声明该变量是指向char.

于 2013-02-27T19:49:28.373 回答
0

你需要deckPtr->foo而不是deckPtr.*foo

您的问题是取消引用运算符正在运行foo,而不是运行deckPtr,这对 C++ 编译器没有意义,因此它使用指向成员运算符的指针。该运算符用于对对象执行成员函数指针,与访问成员完全不同。很有可能在介绍级的 c++ 类中(就像您在其中一样)您永远不必担心使用或理解该运算符。

通常,在 C/C++ 中,只要您有指向结构的指针,您就想使用->运算符,而不是.. foo->bar相当于(*foo).bar,但它可以防止你搞砸并忘记括号。C 有一个箭头操作符是有原因的——它更容易、更清晰。在我不那么谦虚的观点中,施加如此武断限制的老师实际上是在教学生编写糟糕的代码并重新发明轮子,但我没有他们教编程的经验……

于 2013-02-27T19:40:12.090 回答