结构 C++ 中的作用域
Scope in structs c++
我正在使用 C++ 制作一个用卡片填充 Deck 结构的程序。这是 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);
}
像这样声明你的结构
struct Deck{
char* suit;
int value;
};
然后你可以这样访问它:
deck->suit
如果您将结构成员 suit
更改为字符串,您的主函数将起作用。
#include <string>
struct Deck
{
std::string suit;
int value;
};
然后像这样在 fillDeck
中访问它:
...
deck->suit = "clubs";
...
如果您需要保留花色的全名,使用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 循环来填充所说的数据类型数组,以保存每个花色和值。这 can/should 在它自己的功能中完成。
然后您可以创建另一个函数来打印 Deck 结构的每个初始化实例。
你的 for 循环可能会有类似 ptrDeck[i].suit = "whatever it is" 的东西......但是你又把你的西装声明为 char 类型所以在我看来你可能必须考虑这一点...
我不是专家,我花了一段时间才理解指针以及如何访问结构内部的数据。但我认识到你遇到的困难,因为它与我遇到的困难相似,这只是我在没有明确为你编写代码的情况下解决它的过程......
如果我对此的理解有误,请告诉我,如果能得到一些反馈会很酷...
我正在使用 C++ 制作一个用卡片填充 Deck 结构的程序。这是 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);
}
像这样声明你的结构
struct Deck{
char* suit;
int value;
};
然后你可以这样访问它:
deck->suit
如果您将结构成员 suit
更改为字符串,您的主函数将起作用。
#include <string>
struct Deck
{
std::string suit;
int value;
};
然后像这样在 fillDeck
中访问它:
...
deck->suit = "clubs";
...
如果您需要保留花色的全名,使用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 循环来填充所说的数据类型数组,以保存每个花色和值。这 can/should 在它自己的功能中完成。
然后您可以创建另一个函数来打印 Deck 结构的每个初始化实例。
你的 for 循环可能会有类似 ptrDeck[i].suit = "whatever it is" 的东西......但是你又把你的西装声明为 char 类型所以在我看来你可能必须考虑这一点...
我不是专家,我花了一段时间才理解指针以及如何访问结构内部的数据。但我认识到你遇到的困难,因为它与我遇到的困难相似,这只是我在没有明确为你编写代码的情况下解决它的过程......
如果我对此的理解有误,请告诉我,如果能得到一些反馈会很酷...