我的课程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
时会出现此错误?
答案 0 :(得分:0)
因为编译器在实际尝试访问该成员之前首先检查该成员是否可访问。
在第一种情况下,成员受到保护,因此无法访问,然后编译器在尝试访问其内容之前报告错误。
在第二种情况下,成员是公开的,可以访问;然后编译器尝试访问它并因为它没有完全定义而失败。
在MyView.cpp中包含定义Model
类的标题(例如#include "Model.hpp"
)以修复此错误。