类定义中访问结构体成员报"does not name a type error"错误原因咨询
为什么类内直接写
pout.a = 5会报错? 这个错误的核心原因很简单:类的定义块是用来声明成员的地方,不能直接写执行性的赋值语句。
具体拆解
- 你写的
int c = 8;没问题,这是C++11之后支持的「非静态成员就地初始化」,本质是把初始化和成员声明绑定在一起,属于合法的类声明语法。 - 但
pout.a = 5;是一条独立的执行语句,类定义阶段只是在描述这个类有哪些成员、成员是什么类型,此时根本没有创建任何ABC对象,pout这个成员还没分配实际内存,自然没法对它的子成员赋值。
正确的初始化方式
要给pout.a设初始值,有几种合法的写法:
1. 就地初始化(C++11及以上)
直接在声明pout的时候用聚合初始化:
class ABC { public: int c = 8; n1 pout = {5}; // 直接初始化pout的a成员为5 };
2. 在构造函数里赋值
通过类的构造函数来完成赋值,这是最传统的方式:
class ABC { public: int c = 8; n1 pout; // 构造函数:创建对象时自动执行 ABC() { pout.a = 5; } };
3. 用构造函数初始化列表(更高效)
这种方式是直接初始化成员,比构造函数里的赋值更高效:
class ABC { public: int c = 8; n1 pout; ABC() : pout{5} {} // 初始化列表中完成pout的初始化 };
至于你说创建ABC对象后访问pout.a正常,那是因为此时对象已经被实例化,pout成员有了实际的内存空间,这时的赋值是运行时的合法操作,比如:
int main() { ABC obj; obj.pout.a = 10; // 完全没问题,因为obj已经存在 return 0; }
内容的提问来源于stack exchange,提问作者gadepalli abhilash
相关产品推荐
相关产品推荐

