我在这个头文件中遇到一个编译器错误:
#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
我看到的问题是Game1需要GameComponent的完整定义,而GameComponent需要Game1的完整定义。我很难将它们放在单独的标题中,这就是为什么它们放在一起的原因。有没有什么方法可以在不完全改变其中一个类的实现的情况下做到这一点?
谢谢!
发布于 2010-09-26 12:20:54
在这里考虑一下计算机的内存。
class B;
class A {
byte aa;
B ab;
};
class B {
byte bb;
A ba;
};
A x;
现在编译器需要回答的问题是,我应该为x
__保留多少空间?
让我们看看。x
的第一个字节是byte aa;
。很简单。这是1个字节。
接下来是B ab;
。让我们看看里面有什么。
x.ab
的第一个字节是一个byte bb;
。到目前为止,对于x
,这是2个字节。
接下来,是一个A ba;
。让我们看看里面有什么。
x.ab.ba
的第一个字节是一个byte aa;
。到目前为止,x
已经有3个字节了。
以此类推,直到无限。
x
有多大?正确的答案当然是*** OUT OF CHEESE ERROR ***
。
编译器实际上并不这样做,因为它知道它不能处理这种情况-所以语法从一开始就不允许循环包含。
下面是本例中x
内容的示意图:
更新
显然,我忘了在这里包含一个解决方案。现在您了解了问题所在,解决方案应该非常简单。使用指针。或者使用一个从A
指向B
的指针,并让B
像它已经做的那样包含A
,反之亦然,或者使用两个指针。然后,您将不会有循环包含-如果B
不包含A
的副本,而只包含一个指向它的指针,那么这里的整个问题就解决了。
发布于 2010-09-26 12:12:13
要做你正在尝试的事情,你需要有一个指向你的类的指针,而不是让它成为一个成员。
例如:
class A;
class B;
class A {
B b;
};
class B {
A a;
};
这是不可行的。它造成了一个环形结构。A的构造函数将调用B的构造函数,B的构造函数将无限调用A的构造函数,依此类推。
相反,请尝试:
class A;
class B;
class A {
B *b;
};
class B {
A *a;
};
不过,我还是要提个醒。如果你是这样设置的,那么你的设计很有可能是有缺陷的。你应该重新考虑如何解决你的问题。
发布于 2010-09-26 12:57:55
冒着脱离主题的风险:您可以在C#中这样做,但是除非嵌套的成员都是按需加载的,否则当您第一次实例化这两个成员中的任何一个时,您都会立即崩溃。
https://stackoverflow.com/questions/3796555
复制相似问题