Answers:
内部类是它所定义的类的朋友。
所以,是的;类型的对象Outer::Inner
可以访问成员变量var
类型的对象的Outer
。
但是与Java不同,类型Outer::Inner
的对象和父类的对象之间没有关联。您必须手动建立父子关系。
#include <string>
#include <iostream>
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();
}
var不是内部类的成员。
要访问var,应使用指向外部类实例的指针或引用。例如,如果内部类是外部的朋友,则pOuter-> var将起作用,或者,如果严格遵循C ++标准,则var是公共的。
有些编译器将内部类视为外部类的朋友,但有些可能不会。请参阅此文档以了解IBM编译器:
“一个嵌套类在另一个类的范围内声明。一个嵌套类的名称是其所在类的本地名称。除非使用显式指针,引用或对象名,否则嵌套类中的声明只能使用可见的构造,包括类型名称,静态成员和来自封闭类和全局变量的枚举数。
嵌套类的成员函数遵循常规的访问规则,并且对其封闭类的成员没有特殊的访问特权。封闭类的成员函数对嵌套类的成员没有特殊的访问权限。”
friend
或public
。过去,谁在乎IBM是否错了/过时了?此答案在发布前三年已经过时了。
首先,您正在尝试访问var
C ++不允许的类之外的非静态成员。
马克的答案是正确的。
属于Outer的任何内容均应有权访问Outer的所有公共或私人成员。
因此,您可以做两件事,要么声明var
为as ,要么static
使用外部类实例的引用来访问“ var”(因为朋友类或函数也需要引用来访问私有数据)。
静态变量
更改var
为static
如果不想var
与该类的实例相关联。
#include <iostream>
class Outer {
private:
static const char* const MYCONST;
static int var;
public:
class Inner {
public:
Inner() {
Outer::var = 1;
}
void func() ;
};
};
int Outer::var = 0;
void Outer::Inner::func() {
std::cout << "var: "<< Outer::var;
}
int main() {
Outer outer;
Outer::Inner inner;
inner.func();
}
输出-var:1
非静态变量
对象的引用必须访问任何非静态成员变量。
#include <iostream>
class Outer {
private:
static const char* const MYCONST;
int var;
public:
class Inner {
public:
Inner(Outer &outer) {
outer.var = 1;
}
void func(const Outer &outer) ;
};
};
void Outer::Inner::func(const Outer &outer) {
std::cout << "var: "<< outer.var;
}
int main() {
Outer outer;
Outer::Inner inner(outer);
inner.func(outer);
}
输出-var:1
编辑-外部链接是指向我的博客的链接。