【问题标题】:A nonstatic member reference must be relative to a specific object?非静态成员引用必须相对于特定对象?
【发布时间】:2016-08-13 11:50:25
【问题描述】:

我有这个简单的代码,其中两个内部类相互依赖。我不能在functionC() 中调用对象的functionB() 虽然如您所见,我已经创建了一个指向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;
};

【问题讨论】:

  • 你得到了什么确切的错误信息?
  • 非静态成员引用必须相对于特定对象

标签: c++


【解决方案1】:

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;
};

【讨论】:

  • 非常感谢。那解决了它。我猜这就是我从 java 开始得到的。
  • 呵呵,Java 在幕后做了很多隐含的魔法。 C++ 往往更加明确。我猜哪个更好是口味问题。
  • 我先是没有指针,然后当我得到错误时,我决定改成指针,认为它会起作用。
【解决方案2】:

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

代码中有一个很大的问题是指针管理不正确(见规则5),但由于我认为这只是为了说明,所以我不再关注它。

【讨论】:

  • 确实这个错误有点误导。谢谢你的帮助。
  • 和你说的完全一样,只是为了说明。
猜你喜欢
  • 2021-05-30
  • 2015-06-01
  • 2018-03-26
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
相关资源
最近更新 更多