在Weapon.h中,当我尝试将一个类'Entity *'作为参数时,它在编译时会显示“语法错误:标识符'实体'”。另外,当我滚动文本'target'时,Visual C ++ Express 2010为我提供了文本“* target”。 Entity类很好,我很确定它包含正确。
(我不会发布Player.h,因为它是不必要的 - 请参阅Library.h - 但它有一个标题保护并包含Entity.h)
Library.h:
#ifndef _LIBRARY_
#define _LIBRARY_
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdarg>
#include <vector>
#include <ctime>
#include <cmath>
#include <cstdlib>
#include <map>
#include <exception>
#include <sstream>
//file includes
#include "Globals.h"
#include "Player.h"
#include "Exception.h"
#include "Weapon.h"
#include "Armour.h"
#include "Consumable.h"
//prototypes that require "Library.h"
bool Poglathon(std::vector<std::string>& text,Player *player);
bool PoglathonTown(std::vector<std::string>& text,Player *player);
std::map<std::string,Weapon*> init_weapons(void);
std::map<std::string,Armour*> init_armour(void);
std::map<std::string,Consumable*> init_consumables(void);
#endif //__LIBRARY__
Weapon.h:
#ifndef _WEAPON_H_
#define _WEAPON_H_
#include "Shopable.h"
class Weapon : public Shopable{
private:
int Damage;
public:
Weapon(int c,int d,std::string n) : Shopable(c,n),Damage(d){}
std::string getDesc() const{
return getName()+"\t"+tostring(Damage)+"\t"+tostring(Cost);
}
int getDamage() const{return Damage;}
int DamageTarget(Entity* target){
int DamageDealt = 0;
//do damage algorithm things here
return DamageDealt;
}
};
#endif
Shopable.h:
#ifndef _SHOPABLE_H_
#define _SHOPABLE_H_
#include "Library.h"
class Shopable{
protected:
std::string Name;
int Cost;
std::string Description;
public:
Shopable(int c, std::string n):Cost(c),Name(n){}
std::string getName() const{return Name;}
int getCost() const {return Cost;}
virtual std::string getDesc() const = 0;
};
#endif
Entity.h:
#ifndef _ENTITY_
#define _ENTITY_
#include "Library.h"
#include "Weapon.h"
#include "Armour.h"
#include "Consumable.h"
class Entity{
public:
void printStats() const;
void heal(double health);
std::string name;
protected:
//player stats
double str; //strength
double wis; //wisdom
double ref; //reflex
double hp; //health points
double maxHp; //maximum health points
double i; //initiative
double inte; //intelligence
double c; //courage
int gold; //gold
int xp; //experience
int ap; //armour points
int wd; //weapon damage
int lvl; //level
int sp; //skill points
Weapon* weapon;//weapon
Armour* cArmour;//current armour
};
#endif
答案 0 :(得分:5)
在C ++中,必须在引用它们之前声明类。你是#include
在Entity.h中的Weapon.h,但是那时,编译器不知道class Entity
的存在。
您需要更改声明内容的顺序,或者在class Weapon
上方添加前向声明“。它可以简单地说是:
class Entity;
告诉编译器存在Entity
这样的名称。但是,除了声明Entity *
和Entity &
的变量之外,它没有告诉它任何它有什么成员,所以你实际上无法对它做任何事情,并传递它们。
答案 1 :(得分:1)
#include <entity.h>
或仅在标题
中转发声明class Entity;
这使得编译速度更快(您仍然需要将其包含在实现中)。
答案 2 :(得分:1)
您的标题彼此包含,因为您的类互相引用。 (但是你的编译器不会因为你的包含守卫而遭受堆栈溢出 - 这是一件好事!)
你应该按层次排列你的头文件,即'top'中的文件没有#include任何内容和'下面'的文件,其中包括一些顶层文件,等等。但是在任何时候都不应该有'循环'。
为了打破代码中的循环,任何相互引用的类都应该转发声明任何相互依赖关系,并且只引用依赖项名称而不是它们的成员。
e.g。
Entity.h
class Weapon;
class Entity{
...
Weapon* weapon;
};
Weapon.h
class Entity;
class Weapon{
...
int DamageTarget(Entity* target);
};
注意Weapon.h如何仅引用Entity*
。
您需要在Weapon.cpp中定义int Weapon::DamageTarget(Entity* target)
答案 3 :(得分:0)
Weapon.h不包含Entity.h,或者递归包含它的任何东西。因此,它不了解班级Entity
。