错误C2079,定义类的顺序是什么

Kal*_*pso 4 c++ c2079

我收到此头文件的编译器错误:

#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

让我们来看看.第一个字节xbyte 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

显然,我忘了在这里提供一个解决方案.现在您已经了解了问题所在,解决方案应该非常简单.使用指针.无论是从使用一个指针AB,让B包括A,因为它已经这样做,或者反之亦然,或者使用两个指针.然后,你将不会有循环包含 - 如果B不包括副本A但只是指向它的指针,那么这里修复了整个问题.