C++如何在main函数等外部位置修改结构体中的成员变量
问题核心原因
你现在的核心错误是混淆了结构体类型和结构体实例的概念:
- 你定义的
struct boardPos只是一个类型模板,本身不占用实际内存存储成员变量,只有你声明了这个类型的实例对象之后,才会生成有实际存储空间的成员可以操作。 - 你当前用
boardPos::Pos1这种写法只有Pos1是结构体的静态成员时才合法,而你代码里的成员都是非静态的普通成员,必须通过实例对象访问。
修复后的可运行代码
#include <iostream> #include <string> int userResponse; // 定义棋盘状态结构体 struct boardPos { bool Pos1 = 0; bool Pos2 = 0; bool Pos3 = 0; bool Pos4 = 0; bool Pos5 = 0; bool Pos6 = 0; bool Pos7 = 0; bool Pos8 = 0; bool Pos9 = 0; }; // 声明结构体实例,分配实际存储空间 boardPos gameBoard; // 修改棋盘状态 void boolChange() { if (userResponse == 1) { gameBoard.Pos1 = 1; } if (userResponse == 2) { gameBoard.Pos2 = 1; } if (userResponse == 3) { gameBoard.Pos3 = 1; } if (userResponse == 4) { gameBoard.Pos4 = 1; } // 你可以补全剩下5个位置的判断逻辑 } int main() { std::string posBoard = "\n 1 | 2 | 3\n-----------\n 4 | 5 | 6\n-----------\n 7 | 8 | 9\n"; std::cout << posBoard; std::cout << "Enter Position Number\n"; std::cin >> userResponse; // 调用状态修改函数,你原来的代码漏了这一步调用 boolChange(); // 测试是否修改成功,不需要可以直接删掉 std::cout << "当前位置" << userResponse << "的状态为:" << (gameBoard.Pos1 ? "已占用" : "未占用") << std::endl; return 0; }
优化建议
你可以用数组替代9个单独的Pos变量,大幅简化代码:
struct boardPos { bool pos[9] = {0}; // 下标0对应位置1,下标8对应位置9 }; // boolChange可以直接简化为几行,不用写9个if判断 void boolChange() { if(userResponse >=1 && userResponse <=9) { gameBoard.pos[userResponse - 1] = 1; } }
内容的提问来源于stack exchange,提问作者stapler
相关产品推荐
相关产品推荐

