c++ - 为什么类声明顺序仍然对原型(prototype)设计很重要?

标签 c++ class header dependencies

我的代码一直在努力解决“字段“玩家”的类型不完整”错误。我的类“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();
  ...
};  

上面的代码无法编译,因为 GameSession 找不到 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();
  ...
};

我不再需要原型(prototype)。我的问题是,为什么原型(prototype)设计不能防止由于缺少有序声明而导致的错误?另外,当类和依赖项很多时,将来如何避免这种情况?

蛋壳

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

最佳答案

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

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

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

关于c++ - 为什么类声明顺序仍然对原型(prototype)设计很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29998118/

相关文章:

c++ - 使用 Windows 注册表查找下一个 "Daylight Saving Time"

c# - 寻找一种方法来隐藏类的基类

c++ - 来自另一个类的 Qt C++ GUI 调用

C++ 将类型映射到它的头文件

PHPExcel 为文件格式设置特定的标题

c# - C++ 套接字 select() 函数返回 0 有很多连接

c++ - 从包含 C++ 中的类名的字符串动态创建类的实例

c++ - 非套接字上的套接字操作,zmq 选项

C++ RTTI 继承导致类大小增加

多重定义的 C 链接错误