我试图在论坛中窥探一个类似的问题,这可能会帮助我取得成功。
我的C ++程序中有一个嵌套类。我试图从嵌套类中的函数访问父类的变量,但我面临以下错误
ERROR: A non static member reference must be relative to a specific object
我尝试访问的变量受到保护,嵌套类是公共的(它的功能也是如此)
以下是描述(或努力)方案的代码段
标题文件
class A
{
protected:
D x;
public:
int func1(int a);
class B : protected C
{
int func2(int a);
}
}
CPP档案
int A::func1(int a)
{
x = 5;
B z;
int b = z.func2(a);
}
int A::B::func2(int a)
{
int c = x.getValue(a); /* ERROR: A non static member reference
must be relative to a specific object */
}
从某个地方
A anObject;
anObject.func1(7);
如果重要的话,getValue()是一个公共函数。 由于我通过一个对象调用了A函数,并且通过该B函数调用了该函数,是不是应该链接到该对象并让我访问该非静态成员?
答案 0 :(得分:7)
C ++ 内部类与Java嵌套类不同。另一个内部没有任何对象。它们只是名称空间是另一个类的类,比如Java静态内部类。
您无法访问成员x
,因为它属于A
,这是一个完全不相关的类,它与B
没有任何关系(继承,复合等)。
答案 1 :(得分:1)
您将继承与嵌套类混淆。给定类B
的嵌套类A
只是A
类命名空间中的一个类。类型为B
的对象和类型为A
的对象,不一定相互关联,也不会自动共享成员函数/对象。
答案 2 :(得分:1)
当行
int c = x.getValue(a);
编译,编译器必须对x
执行名称查找。它可以是一个函数变量,它可以是B
的成员变量,它可以是B
继承的其中一个类的成员变量,它可以是全局变量等。确定为什么它选择仅打印有关A non static ember reference
的错误消息。也许它是根据x
是A
的成员变量这一事实进行一些启发式评估。
在您的情况下,x
是A
的成员变量,它不是B
的父类。 B
只是A
中的嵌套类。 B
的实例可以访问x
实例的A
成员。如果没有A
的实例,则x
无法访问A::B::func2(int a)
。
从您的代码中不清楚您的用例是什么。看来你只是在探索C ++。
<强>更新强>
回应从某个地方
如果没有B::func2
的实例,则无法从A::func1
致电B
。 B
是A
的嵌套类,但A
的实例不会自动拥有B
的实例。如果你添加
B b;
作为A
中的成员变量,您可以使用:
int A::func1(int a)
{
x = 5;
int c = b.func2(a);
return 0; // Make sure to return something sensible.
}