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