非静态成员引用必须相对于特定对象?

时间:2016-04-20 16:31:55

标签: c++

我有这个简单的代码,其中两个内部类相互依赖。我不能在functionB()内调用对象的functionC(),虽然你可以看到我创建了一个指向ClassB对象的指针,甚至实例化了该对象但我仍然得到了我的错误需要从一个对象调用该函数。我想知道我到底做错了什么?

#include <iostream>
class ClassA
{
public:
    ClassA() { object = new ClassB(); };
    ~ClassA();
    void functionA() {  };
private:
    class ClassB
    {
    public:
        void functionB() { std::cout << "Function B"; };
    };
    class ClassC
    {
    public:
        void functionC() {
            std::cout << "Fuction C";
            object->functionB();
        }; //Error here
    };
    ClassB* object;
    ClassC* object1;
};

2 个答案:

答案 0 :(得分:4)

C ++根本不捕获其“父”实例,例如Java确实如此。在嵌套的ClassB和ClassC中,您需要对ClassA的显式反向引用:

class ClassA {
public:
    ClassA() : object(new ClassB(*this)) {}
    ~ClassA() { delete this->object; }
private:
    class ClassB {
        classA &parent;
    public:
        ClassB(classA &parent) : parent(parent) {}
    };
    ClassB *object;
};

但为什么要在这里动态分配ClassB?这更易于阅读和理解,并且不易出错:

class ClassA {
public:
    ClassA() : object(*this) {}
    ~ClassA() {}
private:
    class ClassB {
        classA &parent;
    public:
        ClassB(classA &parent) : parent(parent) {}
    };
    ClassB object;
};

答案 1 :(得分:3)

我会说,错误文本具有误导性。但实质上它意味着无法从子对象访问父对象,除非在子成员中专门捕获父对象。

对于指针的错误管理,代码存在很大问题(参见规则5),但由于我认为这只是为了说明,我不会专注于它。