内部类是在其中定义的类的朋友.
所以,是的; 类型的对象Outer::Inner
可以访问成员变量var
类型的对象的Outer
.
但与Java不同,类型Outer::Inner
对象与父类对象之间没有相关性.您必须手动创建父子关系.
#include#include class Outer { class Inner { public: Inner(Outer& x): parent(x) {} void func() { std::string a = "myconst1"; std::cout << parent.var << std::endl; if (a == MYCONST) { std::cout << "string same" << std::endl; } else { std::cout << "string not same" << std::endl; } } private: Outer& parent; }; public: Outer() :i(*this) ,var(4) {} Outer(Outer& other) :i(other) ,var(22) {} void func() { i.func(); } private: static const char* const MYCONST; Inner i; int var; }; const char* const Outer::MYCONST = "myconst"; int main() { Outer o1; Outer o2(o1); o1.func(); o2.func(); }
C + 11标准现在符合以上描述. (19认同)
从技术上讲,在当前的C++标准中,嵌套类没有对其封闭类的特殊访问权限.见标准的第11.8.1节.但是,另见这个标准缺陷:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45 (11认同)
@Loki Astari:我读了最后一句"你必须手动创建父子关系"并解释后面的代码片段,作为如何正确执行__rectly_的示例! (3认同)
MSN.. 28
内部类可以访问外部类的所有成员,但它没有对父类实例的隐式引用(与Java的一些奇怪之处不同).因此,如果将对外部类的引用传递给内部类,它可以引用外部类实例中的任何内容.
内部类是在其中定义的类的朋友.
所以,是的; 类型的对象Outer::Inner
可以访问成员变量var
类型的对象的Outer
.
但与Java不同,类型Outer::Inner
对象与父类对象之间没有相关性.您必须手动创建父子关系.
#include#include class Outer { class Inner { public: Inner(Outer& x): parent(x) {} void func() { std::string a = "myconst1"; std::cout << parent.var << std::endl; if (a == MYCONST) { std::cout << "string same" << std::endl; } else { std::cout << "string not same" << std::endl; } } private: Outer& parent; }; public: Outer() :i(*this) ,var(4) {} Outer(Outer& other) :i(other) ,var(22) {} void func() { i.func(); } private: static const char* const MYCONST; Inner i; int var; }; const char* const Outer::MYCONST = "myconst"; int main() { Outer o1; Outer o2(o1); o1.func(); o2.func(); }
内部类可以访问外部类的所有成员,但它没有对父类实例的隐式引用(与Java的一些奇怪之处不同).因此,如果将对外部类的引用传递给内部类,它可以引用外部类实例中的任何内容.
任何属于 Outer的东西都应该可以访问所有Outer的公共或私人成员.
编辑:你的编译器是正确的,var不是Inner的成员.但是如果你有一个引用或指向Outer实例的指针,它就可以访问它.