正在取消引用前向声明类的对象

Dereferencing object of forward declared class

本文关键字:声明 对象 取消 引用      更新时间:2023-10-16

我有一个类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"演示者->模型->打印名称();ModelListener.hp:错误:"class Model"的正向声明。

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

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

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

在第二种情况下,成员是公共的,因此可以访问;然后编译器试图访问它,但由于它的定义不完整而失败。

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