从嵌套类的函数访问父级的非静态成员
Posted
技术标签:
【中文标题】从嵌套类的函数访问父级的非静态成员【英文标题】:Accessing a non static member of parent from a nested class's function 【发布时间】:2014-08-22 08:10:18 【问题描述】:我尝试在论坛中窥探类似的问题,但没有成功。
我的 C++ 程序中有一个嵌套类。我正在尝试从嵌套类中的函数访问父类的变量,但遇到以下错误
ERROR: A non static member reference must be relative to a specific object
我尝试访问的变量是受保护的,嵌套类是公共的(函数也是如此)
以下是描述(或尝试)场景的代码 sn-p
头文件
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 的函数,那不应该链接到那个对象并让我访问那个非静态成员吗?
【问题讨论】:
没有A::func2
,所以我不确定你期望int b = func2(a)
会打电话给我。
【参考方案1】:
C++ internal 类与 Java 嵌套类不同。另一个里面没有对象。它们只是命名空间是另一个类的类,例如 Java 静态内部类。
您无权访问成员 x
,因为它属于 A
,这是一个完全不相关的类,与 B
没有任何关系(继承、复合等)。
【讨论】:
有道理。谢谢你。我的目标是能够在 A 的函数中访问 C 类的受保护成员。但是由于我不想扩展 A(虽然没有理由这样做。只是觉得有必要避免它),所以我创建了一个嵌套类B 扩展 C 假设它将达到相同的目的。显然不是。有没有更好的方法来解决这个问题,或者我应该把它吸起来并扩展 A 类? 充其量,这缺少许多重要的细微差别。从 C++11 开始,至少在此之前 3 年,嵌套类 do 可以隐式friend
访问封闭类的 all 成员 - 只要它们对父实例有一些reference。这就是 OP 的错误明确指出的,只需告诉编译器 which A
寻找 x
。【参考方案2】:
您将继承与嵌套类混淆了。给定类A
的嵌套类B
只是A
类命名空间中的一个类。 B
类型的对象和 A
类型的对象不一定相互关联,也不会自动共享成员函数/对象。
【讨论】:
您将子类化与嵌套类混淆了。子类化是继承的同义词。例如,请参阅此问题(以及许多其他问题)中的用法:***.com/questions/5309414/… 但从 C++11 开始,B
确实自动获得对 A
的所有成员的访问权限,只要它具有对实例的引用。跨度>
【参考方案3】:
当行
int c = x.getValue(a);
已编译,编译器必须对x
执行名称查找。它可以是函数变量,可以是B
的成员变量,可以是B
继承的类之一的成员变量,也可以是全局变量等。不知道为什么选择仅打印关于 A non static ember reference
的错误消息。也许它正在通过x
是A
的成员变量这一事实进行一些启发式评估。
在您的情况下,x
是A
的成员变量,它不是B
的父类。 B
只是A
中的一个嵌套类。 B
的实例可以访问A
实例的x
成员。如果没有A
的实例,则无法从A::B::func2(int a)
访问x
。
从您的代码中不清楚您的用例是什么。看来您只是在探索 C++。
更新
回应来自某处
如果没有B
的实例,您不能从A::func1
调用B::func2
。 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.
【讨论】:
是的。我只是在探索 C++,并没有介绍用例。我正在尝试这个想法,这让我想知道为什么会发生这样的错误。我现在了解嵌套类与其父级之间缺乏直接关系。谢谢。 同意 - 同意修改。我忽略了一些东西。现在在代码中更正它。附带说明一下,如果您对用例感兴趣,至于我为什么这样做,我已经在 Manu343726 的回答的评论中提到了它。以上是关于从嵌套类的函数访问父级的非静态成员的主要内容,如果未能解决你的问题,请参考以下文章