我对前方声明有一点问题。我在一个文件中有以下类
Robot.h
class Robot
{
public:
void moveForward()
private:
}
在Robot.cpp文件中实现
我有一个UserReceiver.h类,它定义了用户与机器人等交互的界面......这个类用鼠标管理摄像头,我加载一个Robot类的实例,以便可以与它进行交互
UserReceiver.h
class Robot;
class UserReceiver
{
public:
void LoadRobot(Robot* _robot) { robot = _robot; }
bool onEvent()
{
etc...
// Calling robot->moveForward() when clicking something
}
private:
Robot* robot;
}
如果需要,我可以提供完整的代码(我使用的3D引擎是Irrlicht)。我的问题是如何转发声明与Robot类相关的方法?围绕这个问题有一个好的设计模式吗?
我得到的错误是(在程序调用机器人的行 - > moveForward()):
error C2227: left of '->moveForward' must point to class/struct/union/generic type
非常感谢你的帮助
祝你好运
答案 0 :(得分:3)
您在没有完整声明的情况下使用Robot
。将onEvent
实施移至cpp
文件并在其中包含robot.h
标头,或#include
中仅robot.h
userreceiver.h
。
我推荐前者。
答案 1 :(得分:2)
有时,这种相互引用的类需要前向声明。但是,有时需要完整的定义,例如,访问类成员,或者您想知道类的大小。但在其他时候,前瞻声明就足够了。
对于Foo类,以下可以是前向声明。
定义或声明Foo*
和Foo&
,包括函数参数,返回类型,局部变量,类成员变量等。
使用Foo作为参数或返回类型声明一个函数。例如,Foo bar()
或void bar(Foo f)
。但是要调用该函数,需要定义。因为编译器需要使用函数的复制构造函数和析构函数。