不完整的字段类型c ++

时间:2014-03-18 12:02:32

标签: c++ header-files

我正在编写一个小型c ++游戏,但我对c ++很陌生,因为通常我会在java中编写东西。所以我不确定问题出在哪里。

页眉文件:

#include <string>
class Game;
class SpeedRatio;

class Monster
{
  private:
    ...
    SpeedRatio speed_ratio_; // LINE 36
    ...
public:

    Monster();

    //--------------------------------------------------------------------------
    // Init Constructor
    // @param name the monsters name.
    // @param attack_damage the monsters attack damage.
    // @param life the monsters life.
    // @param attribute the monsters attribute.
    // @param speed_ratio the speed ratio.
    // @param game the game object.
    //
    Monster(std::string name, unsigned int attack_damage, unsigned int life,
            unsigned int attribute, SpeedRatio speed_ratio, Game &game);

}

CPP-File:

#include "Monster.h"
#include "Game.h"
#include "SpeedRatio.h"

//------------------------------------------------------------------------------
Monster::Monster()
{
}
//------------------------------------------------------------------------------
Monster::Monster(std::string name, unsigned int attack_damage,
                 unsigned int life, unsigned int attribute,
                 SpeedRatio speed_ratio, Game &game) : name_(name),
                 attack_damage_(attack_damage), life_(life),
                 attribute_(attribute), speed_ratio_(speed_ratio), // LINE 39
                 game_(&game)
{

}

SpeedRatio.h

class SpeedRatio
{
  private:
    unsigned int events_;
    unsigned int ticks_;

  public:

    SpeedRatio();

    //--------------------------------------------------------------------------
    // Init Constructor
    // @param events the events.
    // @param ticks the ticks.
    SpeedRatio(unsigned int events, unsigned int ticks);
}

现在我收到2条错误消息:

Description Resource    Path    Location    Type
field 'speed_ratio_' has incomplete type    Monster.h   /ass1   line 36 C/C++ Problem 
Description Resource Path Location Type class 'Monster' does not have any field named 'speed_ratio_' Monster.cpp /ass1 line 39 C/C++ Problem

认为我(希望)我的前瞻性声明是正确的。 我用注释标记了这些行,thx用于任何帮助

2 个答案:

答案 0 :(得分:4)

您需要在头文件中完整定义SpeedRatio类,因为您使用的是完整对象而不是引用或指针。编译器需要知道对象大小才能生成代码。

前向声明(class SpeedRatio;)只引入一个类型的名称或声明它但不定义它,这就是编译器说该类型不完整的原因。

修复可能是将相应的include从.cpp移动到.h或改为使用引用或指针(smart_ptr或unique_ptr)。

答案 1 :(得分:0)

您只声明了SpeedRatio类

class SpeedRatio;

但未定义。所以这种类型是不完整的:编译器不知道这种类型的对象的大小。因此编译器无法在Monster类的定义中定义数据成员speed_ratio_。

class Monster
{
  private:
    ...
    SpeedRatio speed_ratio_; 

您应在标题SpeedRatio.h

中添加标题Monster.h