1

还有一个问题,跟我来!...无论如何,我有 2 个带有私有构造函数和静态函数的类来返回该类的实例。一切都很好,我有一个 main.cpp 文件,通过执行以下操作,我设法获取了我的 gameState 对象指针:

gameState *state = gameState::Instance();

但是现在我好像有问题。为方便起见,我希望 gameState 实例和 actionHandler 实例都保留指向彼此的指针副本。所以我尝试在彼此的头文件中包含:

gameState *state;

actionHandler *handler;

然而,这似乎不起作用......我得到“错误C2143:语法错误:缺少';' 在这两行的'*'”错误之前......如果某个类有一个私有构造函数,你不能在标题中定义某个类的变量吗?或者问题是别的什么?或者可能是因为指向实例的指针存储为静态成员?

编辑:谢谢大家!令人惊讶的是,我在过去几天获得的 C++ 知识量……太棒了!

4

3 回答 3

6

看起来您需要将相反类的前向声明添加到每个类的头文件中。例如:

class actionHandler;

class gameState
{
private:
    actionHandler *handler;

    ...
};

和:

class gameState;

class actionHandler
{
private:
    gameState *state;

    ...
};
于 2009-11-30T02:36:03.763 回答
4

这不是因为私有构造函数。

这是因为你有一个循环依赖。所以当你尝试编译A类时,你需要编译B类,而B类需要编译A类,以此类推。

尝试前向声明。

在定义gameState的头文件中

class actionHandler;
于 2009-11-30T02:35:42.747 回答
2

这个问题与私有构造函数无关。在给定的翻译单元(.cpp 文件和所有包含的 .h 文件)中,C++ 编译器在声明类之前无法识别类的标识符。当两个类包含相互引用的成员时,这会产生问题。该解决方案称为“前向声明”,它只是类名,但没有正文。在您的情况下,它可能看起来像这样:

== gameState.h ==

...
// Note no #include for "actionHandler.h" (but there would be in gameState.cpp)

class actionHandler;

class gameState
{
  actionHandler *handler;
  ...
};
...

== actionHandler.h ==

...
#include "gameState.h"

// No forward declaration needed.

class actionHandler
{
  gameState* state;
  ...
};
...
于 2009-11-30T02:41:03.330 回答