class Outer {
class Inner {
public:
Inner() {}
void func() ;
};
private:
static const char* const MYCONST;
int var;
};
void Outer::Inner::func() {
var = 1;
}
const char* const Outer::MYCONST = "myconst";
当我使用类Outer :: Inner'编译时,这个错误输出没有名为`var'
的成员答案 0 :(得分:106)
内部类是其定义的类的朋友。
所以,是的;类型为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();
}
答案 1 :(得分:25)
内部类可以访问外部类的所有成员,但它没有对父类实例的隐式引用(与Java的一些奇怪之处不同)。因此,如果将对外部类的引用传递给内部类,它可以引用外部类实例中的任何内容。
答案 2 :(得分:6)
Outer part 的任何内容都应该可以访问所有Outer的公共或私人成员。
编辑:你的编译器是正确的,var不是Inner的成员。但是如果你有一个引用或指向Outer实例的指针,它就可以访问它。
答案 3 :(得分:1)
var不是内部类的成员。
要访问var,应使用指向外部类实例的指针或引用。例如如果内部类是外部的朋友,则pOuter-&gt; var将起作用,如果严格遵循C ++标准,则var是public。
有些编译器将内部类视为外部的朋友,但有些可能不是。见this document for IBM compiler:
“嵌套类在另一个类的范围内声明。嵌套类的名称是其封闭类的本地。除非使用显式指针,引用或对象名称,否则嵌套类中的声明只能使用可见构造,包括封闭类和全局变量中的类型名称,静态成员和枚举器。
嵌套类的成员函数遵循常规访问规则,并且对其封闭类的成员没有特殊的访问权限。封闭类的成员函数对嵌套类的成员没有特殊访问权。“
答案 4 :(得分:1)
首先,您正在尝试在C ++不允许的类之外访问非静态成员var
。
马克的答案是正确的。
任何属于Outer的内容都应有权访问Outer的所有公共或私人成员。
因此,您可以做两件事,要么将var
声明为static
,要么使用外部类实例的引用来访问“ var”(因为friend class or function也需要引用访问私有数据)。
静态变量
如果您不希望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();
}
Output- 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);
}
Output- var:1
编辑-外部链接是指向我的博客的链接。