C ++结构中的动态内存分配

时间:2013-02-27 19:38:15

标签: c++ memory dynamic struct allocation

我不理解在c ++中动态分配struct成员所需的语法。基本上,我需要使用临时数组和strlen将char数组成员填充到精确的大小。这是我的结构:

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

以下是使用struct的函数:

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

  }

我收到三个编译错误:“rank”“suit”和“location”“未在此范围内声明”。我究竟做错了什么?谢谢!

3 个答案:

答案 0 :(得分:4)

语法为deckPtr->rankdeckPtr->suitdeckPtr->location = new char[...];

但是你的编码风格更像C而不是C ++。相反,如果您使用现代C ++,使用方便的RAII类(如 std::string ),您的代码将变得更加简化:只需使用std::string代替原始代码char*指针,你不必注意内存分配和内存释放:它们都由std::string和析构函数自动管理。

#include <string>

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

而不是您的自定义stringCopy()功能,您可以使用operator=的“自然”std::string重载(即destString = sourceString;)。

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

#include <vector>

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

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

答案 1 :(得分:0)

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

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

通常,在C / C ++中,只要有指向结构的指针,就要使用->运算符,而不是.foo->bar相当于(*foo).bar,但它可以避免弄乱并忘记括号。有一个原因是C有一个箭头操作符 - 它更容易和更清晰。在我不那么谦虚的意见中,施加这种任意限制的教师实际上教会学生编写错误的代码并重新发明轮子,但我没有他们的编程教学经验......

答案 2 :(得分:0)

您可能希望使用deckPtr->rankdeckPtr->suitdeckPtr->locationchar指针指定内容(或者(*deckPtr).rank等)。请注意*中的char *var不是变量名称的一部分。它只是声明变量是指向char的指针。