正在取消引用前向声明类的对象
Dereferencing object of forward declared class
我有一个类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"
)以修复此错误。
相关文章:
- Arduino C++在构造函数中用参数声明对象数组
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 如何在 if 语句中声明对象并在任何我想的地方使用它?
- 如何使用unique_ptr和make_unique正确声明对象数组
- 声明对象时,如何在C 中修复C2065错误
- 声明对象而不调用默认构造函数
- 一旦对象设置为 null,用于声明对象的堆大小的变量就设置为 null?
- 我可以使用名称而不是类型来声明对象文字吗?
- 在制作(Qt等)GUI时声明对象
- 在基本的GUI编程中,在哪里声明对象和方法
- 同时使用模板和参数声明对象
- "Undefined reference to"使用双模板类声明对象时出错
- 在头文件 C++ 中声明对象
- 在其类中声明对象
- C 可以通过使用要求其为某个类别的对象来声明对象
- 声明对象
- (C++)如何基于条件声明对象类成员
- 使用变量声明对象的名称
- C++ OOP 体系结构:决定是从基类声明对象还是继承基类
- 在声明对象之前在全局函数中使用类的成员函数