为什么类声明排序对于原型仍然很重要
Why class declaration ordering still matters with prototyping?
我正在努力解决我的代码中的"字段"播放器"类型不完整"错误。我的类"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
因为编译器已经知道指针或引用的大小,而不管类的类型是点或引用。
据我所知,在使用作为类实例的成员时,没有任何神奇的方法可以解决具有完整声明的要求。因此,您必须选择您喜欢的技术和相应的要求。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 函数向量_指针有不同的原型,我可以构建一个吗
- 声明原型时如何在主代码块中调用函数
- C++:在原型中声明"auto"函数返回类型仍然会导致在扣除错误之前使用"auto&quo
- 函数在类中声明时应该有一个原型
- 将数组传递到函数会在函数原型声明中出现错误
- 您只是调用前方声明和原型声明“声明”
- 在头文件中的函数原型中获取指针数组:函数声明为 void
- 为什么类声明排序对于原型仍然很重要
- 一个声明中多个函数的原型
- 编译器声明调用没有匹配的函数,即使原型中有一个
- C++对象创建或函数原型声明
- C++在头文件中声明函数原型时出错
- 应该在哪里声明函数原型
- 为什么模板类的显式方法专门化可以在类内部没有原型声明的情况下工作
- 为什么即使没有任何类声明也需要原型
- 内联函数原型vs正则声明vs原型
- 如何声明带有void *指针的c++原型,以便它可以接受任何指针类型
- 链表声明与原型不兼容
- C++:在匿名命名空间中声明函数原型的正确方法是什么