C++外围类能否访问嵌套类成员?如何调用嵌套类printnumber函数
外围类与嵌套类的访问规则说明
1. 外围类能否访问嵌套类的成员函数
- 嵌套类是定义在外围类作用域内的独立类型,不属于外围类的实例成员,外围类的实例不会默认携带嵌套类的实例对象。
- 外围类对嵌套类的成员没有特殊访问权限,需要遵循普通类的访问规则:
- 若要调用嵌套类的非静态成员函数,必须先创建嵌套类的实例,才能访问其公有成员
- 若要调用嵌套类的静态成员函数,可以直接通过
外围类名::嵌套类名::静态函数名的方式访问,无需创建实例
- 补充:C++11及之后标准规定嵌套类默认是外围类的友元,因此你代码中嵌套类的printnumber访问外围类私有成员x的写法是合法的。
2. 正确调用printnumber的实现方式
printnumber是enclose::nested1类的非静态公有成员函数,调用需要先创建嵌套类的实例,再传入enclose类实例作为参数,修正后的main函数如下:
int main() { enclose example; // 第一步:创建嵌套类nested1的实例 enclose::nested1 nested_instance; // 第二步:用嵌套类实例调用成员函数,传入enclose实例作为参数 nested_instance.printnumber(example); return 0; }
如果你希望直接通过enclose实例调用printnumber,可以在外围类中封装一层调用接口,修改enclose类的定义即可:
class enclose { private: int x; public: enclose(void) { x = 10; }; ~enclose(void) { }; class nested1 { public: void printnumber(enclose p); }; // 新增公有封装接口 void printnumber() { nested1 ins; ins.printnumber(*this); } };
修改后你原本写的example.printnumber();就可以正常运行,输出结果为the number is 10。
内容的提问来源于stack exchange,提问作者kubo
相关产品推荐
相关产品推荐

