C++类内部修改数组成员触发编译报错如何解决
报错原因
- C类的定义体仅允许放置成员变量、成员函数的声明,或是C11及以后支持的默认成员初始化语句,不能直接放置执行类的赋值操作。你写的
structure[0] = 1;属于赋值执行语句,放在类定义里时,编译器会将其识别为新成员的声明语句,因此要求你补充类型说明符,触发第一个报错。 - 该语句中你使用了已经声明过的成员名
structure,编译器判定你重复定义同名成员,触发第二个报错。 - 函数体(例如main函数)属于执行上下文,允许放置赋值语句,所以相同代码写在main里不会报错。
另外补充一个你代码里的隐藏问题:cout<< n.structure;默认输出的是数组的首地址,不是数组元素值,要输出对应元素需要补充下标索引。
解决方法
方法1:在构造函数中完成成员初始化
这是最通用的成员初始化方案,兼容所有C++标准:
#include <iostream> using namespace std; class net{ public: bool isConv = false; public: int structure[2]; // 类的默认构造函数 net() { structure[0] = 1; structure[1] = 0; // 可根据需求调整其他元素的初始化逻辑 } }; int main() { net n; cout<< n.structure[0]; return 0; }
方法2:使用C++11及以上支持的默认成员初始化
如果你的编译器支持C++11及更高标准,可以直接在成员声明时完成数组初始化:
#include <iostream> using namespace std; class net{ public: bool isConv = false; public: int structure[2] = {1, 0}; // 声明时直接初始化数组元素 }; int main() { net n; cout<< n.structure[0]; return 0; }
方法3:在创建对象后赋值
如果你不需要所有类实例的structure[0]都默认是1,可以在实例化对象后在函数中单独赋值:
#include <iostream> using namespace std; class net{ public: bool isConv = false; public: int structure[2]; }; int main() { net n; n.structure[0] = 1; // 实例化后单独赋值 cout<< n.structure[0]; return 0; }
内容的提问来源于stack exchange,提问作者Lorenzo Nalini
相关产品推荐
相关产品推荐

