繁体   English   中英

为什么类声明顺序仍然与原型相关?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM