【问题标题】:Dynamic Memory Allocation in C++ structsC++ 结构中的动态内存分配
【发布时间】:2013-02-27 19:38:14
【问题描述】:

我不明白在 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);

  }

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

【问题讨论】:

  • stringLength 和 stringCopy 是我自己的函数。我必须编写它们(这个程序是一个类分配),但它们的功能与它们的字符串库对应物相同。
  • ranksuit 是否不止一个字符?此外,您的运算符选择对于 C++ 来说并不是非常地道,这可能是问题的一部分。
  • 不用char*,直接使用std::strings
  • 另外,我不能使用箭头操作符。
  • 等级和花色范围大约为 3 到 7 个字符。

标签: c++ memory dynamic struct allocation


【解决方案1】:

语法为deckPtr-&gt;rankdeckPtr-&gt;suitdeckPtr-&gt;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;
};

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

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

#include <vector>

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

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

【讨论】:

  • 如果不允许他们使用箭头操作符,他们可以使用 STL 的机会有多大?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您需要deckPtr-&gt;foo 而不是deckPtr.*foo

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

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

    【讨论】:

    • 箭头运算符还不允许。她希望我们以艰苦的方式“练习”。
    • 也许你的意思是 (*deckPtr).foo?
    • @user1362548:你的意思是“弄错了”还是“从不真正学习 C++”?我不确定不使用 -&gt; 运算符会教你什么。话虽如此,指向成员的运算符.*-&gt; 运算符不同。
    • 当我尝试使用箭头时,出现“char* to char[10]”的不兼容分配错误
    • @user1362548 在哪一行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2011-11-13
    • 2021-10-15
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多