【问题标题】:Dereferencing object of forward declared class取消引用前向声明类的对象
【发布时间】:2016-04-09 13:54:50
【问题描述】:

我有类Presenter,它继承自ModelListener

class Model;

class ModelListener
{
public:
    ModelListener() : model(0) {}

    virtual ~ModelListener() {}

    void bind(Model* m) { model = m; }

protected:
    Model * model;
};

另外,我有一个实例Presenter presenter。当我调用presenter->model->PrintName() 时,它当然不会编译,因为model 受到presenter 的保护。但是,如果我再像这样将Model * model 更改为公开

class Model;

class ModelListener
{
public:
    ModelListener() : model(0) {}

    virtual ~ModelListener() {}

    void bind(Model* m) { model = m; }

//protected:
    Model * model;
};

我明白了:

MyView.cpp:错误:不完整类型“类模型”的无效使用 演示者->模型->打印名称(); ModelListener.hpp:错误:“模型类”的前向声明。

为什么我在转到 public 时收到此错误,而不是在 protected 时收到此错误?

【问题讨论】:

    标签: c++ forward-declaration


    【解决方案1】:

    因为编译器在实际尝试访问之前首先检查该成员是否可访问。

    在第一种情况下,成员受到保护,因此不可访问,然后编译器在尝试访问其内容之前报告错误。

    在第二种情况下,成员是公开的,因此可以访问;然后编译器尝试访问它并失败,因为它定义不完整。

    在 MyView.cpp 中包含定义 Model 类的标头(例如 #include "Model.hpp")以修复此错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2016-03-18
      • 1970-01-01
      • 2011-05-08
      • 2014-12-01
      • 1970-01-01
      相关资源
      最近更新 更多