使一个结构指向另一个结构
Have One Struct Point To Another
我在创建两个结构时遇到问题,一个叫Bag,另一个叫Card。这就是我目前所拥有的:
struct Card
{
char suit;
int value;
};
struct BagNode
{
Card* Card;
BagNode* next;
};
void fillWithCards(BagNode *&head, BagNode *&tail, BagNode *&temp)
{
char suits [] = {'s', 'h', 'd', 'c'};
int val [] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
for (int x = 0; x < 4 ; x++)
{
for (int y =1 ; y <= 13 ; y++)
{
BagNode *now = new BagNode;
now -> Card -> suit = suits [x];
now -> Card -> value = val [y];
if (*&head == NULL && *&tail == NULL && *&temp == NULL)
{
head = now;
tail = now;
temp = now;
}
else if (*&tail != NULL && *&temp != NULL)
{
tail -> next = now;
temp -> next = now;
tail = now;
temp = now;
}
else
{
tail -> next = NULL;
}
}
}
}
问题是,当我编译并运行程序时,它会崩溃。我感觉问题与Card* Card;
有关
是的,我知道我可以把卡上的所有东西都放在那里,即*next
,我不需要BagNode
。然而,在询问我的教授时,他说我们需要两个结构,一个用于Bag
,另一个用于Card
。
BagNode *now = new BagNode;
这在动态范围中构造了BagNode
的一个新实例。此类没有构造函数。该类的任何成员都没有默认构造函数。因此,这个类的一个新实例是完全未初始化的。紧接着:
now -> Card -> suit = suits [x];
now -> Card -> value = val [y];
由于该类的新实例完全未初始化,因此尝试取消引用其完全未初始化的Card
成员、指针,从而导致未定义的行为、未初始化的指针取消引用和明显的崩溃。
所示代码中可能存在其他问题,但由于没有提供最小、完整和可验证的示例,因此无法对其进行最终分析。唯一可以发表的其他评论:
if (*&head == NULL && *&tail == NULL && *&temp == NULL)
*&
部分完全没有实现任何有用的功能。这在逻辑上等同于:
if (head == NULL && tail == NULL && temp == NULL)
当然,这一点可读性和清晰度要高得多。
在用operator->
取消引用Card*
指针之前,您没有初始化now->Card
以指向有效的Card
实例。now->Card
是未初始化的指针,因此Card->
正在访问无效内存。
您也没有初始化now->next
。对于尚未插入列表的新节点,应该将其初始化为NULL,因为后面还没有节点。
我建议将Card* Card;
更改为Card card;
,然后使用operator.
而不是operator->
来访问Card
字段:
struct BagNode
{
Card card; // <-- no '*' !
BagNode* next;
};
...
BagNode *now = new BagNode;
now->Card.suit = suits [x];
now->Card.value = val [y];
now->next = NULL; // <-- don't forget this!
话虽如此,您的代码的其余部分没有意义。这不是一个好的链表插入,使用temp
参数会使它更加混乱。temp
应该代表什么?如果head/tail
为NULL,但temp
不为NULL,则代码将崩溃。temp
不属于这种代码。
您也超出了val[]
数组的范围。数组是0索引的,而不是1索引的。val[]
有13个元素,因此有效索引是0-12,而不是1-13。
试试类似的东西:
struct Card
{
char suit;
int value;
};
struct Bag
{
Card card;
Bag* next;
};
void fillWithCards(Bag* &head, Bag* &tail)
{
const char suits[] = {'s', 'h', 'd', 'c'};
const int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
for (int x = 0; x < 4 ; x++)
{
for (int y = 0; y < 13; y++)
{
Bag *b = new Bag;
b->card.suit = suits[x];
b->card.value = val[y];
b->next = NULL;
if (!head)
head = b;
if (tail)
tail->next = b;
tail = b;
}
}
}
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 从另一个 cpp 文件更改结构内、映射键内的变量
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 如何将数据从一个结构链接到另一个结构
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- std::transform 将一个结构数组复制到另一个结构数组
- C++将结构复制到另一个程序的资源
- 结构新手,我对如何从 void 函数中返回值并将其放入另一个函数感到困惑
- 可以访问一个类中的播放器结构,但不能访问另一个类中的播放器结构
- 如何在另一个结构中初始化结构数组?
- 在另一个结构中声明内部结构会导致错误:结构使用无效
- 通过 C++ 中的另一个结构成员访问结构
- 难以从另一个结构中的函数返回结构
- 有没有办法将一个对象注入到另一个对象的结构中?
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 将一个结构的值复制到另一个结构
- 结构C++可以用 0 初始化,但不能用另一个 int 初始化
- 如何将矢量结构从一个标头文件传递到另一个标头文件中的类
- 是否可以定义一个在外部"C"块中继承另一个结构的结构?