我正在编写一个小型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用于任何帮助
答案 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