我收到此头文件的编译器错误:
#ifndef GAME1_H
#define GAME1_H
#include "GLGraphics.h"
#include "DrawBatch.h"
class GameComponent;
class Game1 {
private:
GLGraphics graphics;
GameComponent components;
void updateDelegates();
void Run();
};
class GameComponent {
private:
static int index;
protected:
Game1 game;
public:
GameComponent();
GameComponent(Game1 game);
void Update(int);
void Dispose();
};
class DrawableGameComponent: public GameComponent
{
private:
GLGraphics graphics;
DrawBatch drawBatch;
public:
DrawableGameComponent();
DrawableGameComponent(Game1);
void Draw();
};
#endif
Run Code Online (Sandbox Code Playgroud)
我发现问题是Game1需要GameComponent的完整定义,而GameComponent需要Game1的完整定义.我在单独的标题中有这些太麻烦了,所以这就是他们在一起的原因.如果没有完全改变其中一个类的实现,我有什么方法可以做到这一点?
谢谢!
con*_*tor 11
在这里考虑一下计算机的内存.
class B;
class A {
byte aa;
B ab;
};
class B {
byte bb;
A ba;
};
A x;
Run Code Online (Sandbox Code Playgroud)
现在编译器需要回答的问题是我应该保留多少空间x?
让我们来看看.第一个字节x是byte aa;.很容易.那是1个字节.
接下来B ab;.让我们看看那里有什么.
第一个字节x.ab是a byte bb;.x到目前为止,这是2个字节.
接下来,是一个A ba;.让我们看看那里有什么.
第一个字节x.ab.ba是a byte aa;.x到目前为止,这是3个字节.
无穷无尽等等.
有多大x?当然,答案是正确的*** OUT OF CHEESE ERROR ***.
编译器实际上并没有这样做,因为它知道它无法处理这种情况 - 因此语法首先不允许循环包含.
以下是x此示例中的内容示意图:
图表http://i56.tinypic.com/28c0oiq.png
UPDATE
显然,我忘了在这里提供一个解决方案.现在您已经了解了问题所在,解决方案应该非常简单.使用指针.无论是从使用一个指针A来B,让B包括A,因为它已经这样做,或者反之亦然,或者使用两个指针.然后,你将不会有循环包含 - 如果B不包括副本A但只是指向它的指针,那么这里修复了整个问题.