类作为参数错误(Classes as parameters error)

2019-10-29 16:41发布

在Weapon.h,当我尝试,并采取一个类的实体*'作为一个参数,它说:“语法错误:标识符‘实体’”当我编译。 此外,当我翻身文本“目标”时,Visual C ++快讯2010年给我的文字“*目标”。 实体类是很好,我敢肯定它是正确包括在内。

(我不会发布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

Answer 1:

你的头包括对方,因为你的类相互引用。 (但你的编译器不苦于计算器的,因为你有人员 - 这是一件好事!)

你应该分层安排你的头文件,即有在“顶”文件#包括哪些没有和文件“下面”,其中包括一些顶级的人等上下来的层次。 但是,在任何时候,应该有“循环”。

为了打破你的循环在你的代码,引用对方的任何类应该转发声明任何相互依存关系,只指相关性名称,而不是他们的成员。

Entity.h

class Weapon;
class Entity{
    ...
    Weapon* weapon;
};

Weapon.h

class Entity;
class Weapon{
    ...
    int DamageTarget(Entity* target);
};

注意Weapon.h如何仅指Entity*

您需要定义int Weapon::DamageTarget(Entity* target)在Weapon.cpp



Answer 2:

在C ++中,它们被引用之前的类必须申报。 您#include -ing Weapon.h在Entity.h,但在这一点上,编译器不知道存在class Entity

你要么需要改变哪些东西声明的顺序,或添加一个向前声明 “上面” class Weapon 。 它可以简单地是:

class Entity;

这告诉编译器,有这样一个名字为Entity 。 然而,它并没有告诉它什么会员有什么 ,所以你不能真正用它做任何事情,比声明的变量的其他Entity *Entity & ,并通过他们周围。



Answer 3:

#include <entity.h>

或在标题中只能向前声明

class Entity;

这使得编译快一点(你还需要包括它在实施中使用)。



Answer 4:

Weapon.h不#包括Entity.h,或任何递归包含它。 因此,它不知道有关类的Entity



文章来源: Classes as parameters error