[英]Why class declaration ordering still matters with prototyping?
我在代码中遇到“字段“ player”类型不完整”错误,我的类“ game_session”包含一个“ player”,我在同一个头文件中声明了它们,如下所示:
#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();
...
};
我不再需要原型。 我的问题是,为什么原型制作不能避免由于缺少有序声明而导致的错误? 另外,如果类和依赖项很多,将来如何避免这种情况?
丹科
(对于那些想知道的人,我在类实现中使用了一个初始化列表来处理Player没有默认构造函数的事实)
要完全声明GameSession
,编译器需要弄清楚其所有成员的大小。 因此,由于有一个Player
成员,因此需要Player
的完整声明。
如果该player
成员是指针或引用,则编译器将不需要完整声明Player
因为无论点是或引用类的类型是什么,编译器都已经知道指针或引用的大小。
据我所知,在使用作为类实例的成员时,没有任何神奇的方法可以解决具有完整声明的要求。 因此,您必须选择自己喜欢的技术和相应要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.