从嵌套类的函数访问父级的非静态成员

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 的错误消息。也许它正在通过xA 的成员变量这一事实进行一些启发式评估。

在您的情况下,xA 的成员变量,它不是B 的父类。 B 只是A 中的一个嵌套类。 B 的实例可以访问A 实例的x 成员。如果没有A 的实例,则无法从A::B::func2(int a) 访问x

从您的代码中不清楚您的用例是什么。看来您只是在探索 C++。

更新

回应来自某处

如果没有B 的实例,您不能从A::func1 调用B::func2BA 的嵌套类,但 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 的回答的评论中提到了它。

以上是关于从嵌套类的函数访问父级的非静态成员的主要内容,如果未能解决你的问题,请参考以下文章

MFC中静态成员函数调用其他类的非静态变量

关于类中静态成员函数和静态成员变量的知识点

关于C++静态成员函数访问非静态成员变量的问题

Java的静态成员类

C++ - 如何从同一个类的静态函数访问一个类的私有成员?

静态内部类