4

我有一个关于前向声明的小问题。我在一个文件中有以下课程

机器人.h

class Robot
{
public:
   void moveForward()
private:
}

在 Robot.cpp 文件中实现

我有一个 UserReceiver.h 类,它定义了用户与机器人等交互的接口......这个类用鼠标管理相机,我加载了 Robot 类的一个实例,以便可以与之交互

用户接收器.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

非常感谢你的帮助

此致

4

2 回答 2

5

您在Robot没有完整声明的情况下使用。要么将onEvent实现移动到一个cpp文件中并在其中包含标题robot.h,要么只是#include在.robot.huserreceiver.h

我推荐前者。

于 2013-04-19T10:04:30.203 回答
2

有时,此类相互引用的类需要前向声明。但是,有时需要完整的定义,例如访问类成员,或者您想知道类的大小。但在其他时候,前向声明就足够了。

对于 Foo 类,以下可以是前向声明。

  • 定义或声明Foo*Foo&,包括函数参数、返回类型、局部变量、类成员变量等。

  • 声明一个使用 Foo 作为参数或返回类型的函数。例如,Foo bar()void bar(Foo f)。但是要调用该函数,需要定义。因为编译器需要用到函数的拷贝构造函数和析构函数。

于 2013-04-19T10:23:55.967 回答