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

时间:2014-07-01 17:07:18

标签: c++ nested-class access-modifiers

我试图在论坛中窥探一个类似的问题,这可能会帮助我取得成功。

我的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函数调用了该函数,是不是应该链接到该对象并让我访问该非静态成员?

3 个答案:

答案 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的错误消息。也许它是根据xA的成员变量这一事实进行一些启发式评估。

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

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

<强>更新

回应从某个地方

如果没有B::func2的实例,则无法从A::func1致电BBA的嵌套类,但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.
}