首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误C2079,定义类的顺序

错误C2079,定义类的顺序
EN

Stack Overflow用户
提问于 2010-09-26 12:06:36
回答 3查看 6.1K关注 0票数 3

我在这个头文件中遇到一个编译器错误:

代码语言:javascript
运行
复制
#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的完整定义。我很难将它们放在单独的标题中,这就是为什么它们放在一起的原因。有没有什么方法可以在不完全改变其中一个类的实现的情况下做到这一点?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-26 12:20:54

在这里考虑一下计算机的内存。

代码语言:javascript
运行
复制
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的副本,而只包含一个指向它的指针,那么这里的整个问题就解决了。

票数 11
EN

Stack Overflow用户

发布于 2010-09-26 12:12:13

要做你正在尝试的事情,你需要有一个指向你的类的指针,而不是让它成为一个成员。

例如:

代码语言:javascript
运行
复制
class A;
class B;
class A {
   B b;
};

class B {
   A a;
};

这是不可行的。它造成了一个环形结构。A的构造函数将调用B的构造函数,B的构造函数将无限调用A的构造函数,依此类推。

相反,请尝试:

代码语言:javascript
运行
复制
class A;
class B;
class A {
   B *b;
};

class B {
   A *a;
};

不过,我还是要提个醒。如果你是这样设置的,那么你的设计很有可能是有缺陷的。你应该重新考虑如何解决你的问题。

票数 4
EN

Stack Overflow用户

发布于 2010-09-26 12:57:55

冒着脱离主题的风险:您可以在C#中这样做,但是除非嵌套的成员都是按需加载的,否则当您第一次实例化这两个成员中的任何一个时,您都会立即崩溃。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3796555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档