为什么类声明排序对于原型仍然很重要



我正在努力解决我的代码中的"字段"播放器"类型不完整"错误。我的类"game_session"包含一个"播放器",我在同一个头文件中声明它们,如下所示:

#ifndef HEADER_H
#define HEADER_H
#include <iostream>
#include <vector>
using std::vector;
class Player;
class GameSession;
class GameSession{
 private:
  ...
  Player player;
 public:
  GameSession();
  ~GameSession();
  ...
};
class Player {
 public:
  Player( int maxdim );
  ~Player();
  ...
};  

上面的代码无法编译,因为游戏会话找不到玩家类的声明。当我切换两个类时,它起作用了,如下所示:

#ifndef HEADER_H
#define HEADER_H
#include <iostream>
#include <vector>
using std::vector;
class Player {
 public:
  Player( int maxdim );
  ~Player();
  ...
};
class GameSession{
 private:
  ...
  Player player;
 public:
  GameSession();
  ~GameSession();
  ...
};

我不再需要原型。我的问题是为什么原型没有防止缺少有序声明的错误?另外,当有许多类和依赖项时,将来如何避免这种情况?

丹科

(对于那些想知道的人,我在类实现中使用了初始值设定项列表来处理 Player 没有默认构造函数的事实)

要完全声明GameSession编译器需要计算出其所有成员的大小。所以既然有Player成员,就需要完整的Player声明。

如果该player成员是指针或引用,则编译器不需要完全声明Player因为编译器已经知道指针或引用的大小,而不管类的类型是点或引用。

据我所知,在使用作为类实例的成员时,没有任何神奇的方法可以解决具有完整声明的要求。因此,您必须选择您喜欢的技术和相应的要求。

最新更新