结构c++中的作用域

Scope in structs c++

本文关键字:作用域 c++ 结构      更新时间:2023-10-16

我正在使用C++制作一个用卡片填充Deck结构的程序。这是甲板的定义:

struct Deck{
char suit;
int value;
};

我的问题是,使用我的结构fillDeck的函数无法访问该结构的内容。也许我做得完全错了,但我有以下几点:

void fillDeck(Deck *deck){
for (int num  = 2; num <= 14; num++){
for(int count = 0; count < 4; count++){
if(count == 0){
suit = "clubs";
}
if(count == 1){
suit = "hearts";
}
if(count == 2){
suit = "diamonds";
}
if(count == 3){
suit = "spades";
}
}
}
}

我的主要功能如下。

int main (int argc, char *argv[]){
Deck deck;
fillDeck(&deck);
}

如果将结构成员suit更改为字符串,则主函数将工作。

#include <string>
struct Deck
{
std::string suit;
int value;
};

然后在fillDeck中访问它,如下所示:

...
deck->suit = "clubs";
...

像这样声明您的结构

struct Deck{
char* suit;
int value;
};

然后你可以这样访问它:

deck->suit

如果需要保留套装的全名,使用std::string是一个不错的选择。如果你必须使用字符的西装,那么你可以使用缩写如下:

void fillDeck(Deck *deck){
for (int num  = 2; num <= 14; num++){
for(int count = 0; count < 4; count++){
if(count == 0){
deck->suit = `C`;
}
if(count == 1){
deck->suit = `H`;
}
if(count == 2){
deck->suit = `D`;
}
if(count == 3){
deck->suit = `S`;
}
}
}
}

你可以相应地调整你的其余部分。

此外,您可能希望尝试switch case语句,而不是连续的if语句,在这种情况下可能会更好。

在查看您传递给main()内部的fillDeck(Deck*Deck)函数的内容时,我想说您可能传递了错误的Deck参数,因为现在您正在将地址传递给尚未初始化的Deck数据结构。。。

我认为你应该采取的策略是在你的主函数中定义一个Deck类型的指针,也许是像Deck*ptrDeck这样的指针,然后这个指针应该指向一个Data类型的新结构。我现在真的不太理解你的问题集,但我也认为,也许这个指针真的应该指向一个数组类型的牌组,然后它会用相应的值来容纳每一套衣服。您很可能需要使用for循环来填充数据类型的数组,以保存每个套装和值。这可以/应该在它自己的功能中完成。

然后,您可以创建另一个函数来打印Deck结构的每个初始化实例。

你的for循环可能会有类似ptrDeck[i].suit="不管是什么"。。。但话说回来,你的西装被声明为char类型,所以在我看来,也许你必须仔细考虑一下。。。

我不是专家,我花了一段时间才理解指针以及如何访问结构内部的数据。但我认识到你遇到的困难,因为它与我遇到的类似,这只是我在不明确为你写代码的情况下解决它的过程。。。

如果我对这件事的理解有偏差,请有人告诉我,得到一些反馈会很酷。。。