解除引用前向声明的类的对象

时间:2016-04-09 13:54:51

标签: c++ forward-declaration

我的课程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:错误:无效使用不完整类型' class Model'        presenter->模型 - > PrintName();   ModelListener.hpp:错误:'类Model'的前向声明。

为什么我在public而不是protected时会出现此错误?

1 个答案:

答案 0 :(得分:0)

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

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

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

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