我不明白在 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”“未在此范围内声明”。我究竟做错了什么?谢谢!
最佳答案
语法是deckPtr->rank
, deckPtr->suit
, deckPtr->location = new char[...];
.
但是您的编码风格更像 C 而不是 C++。相反,如果您使用现代 C++,以及方便的 RAII 类,如 std::string
,您的代码将变得简化:只需使用 std::string
而不是原始 char*
指针,您不必关注内存分配和内存释放:它全部由 std::自动管理字符串
和析构函数。
#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()
方法)。
关于c++ - C++ 结构中的动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120852/