解析问题c ++

McB*_*man 1 c++ oop

我试图从java转换为c ++,当我想创建一个如下所示的对象时,我遇到了这个问题:

Hero.cpp文件:

#include "Hero.h"
#include <iostream>
#include <string>
#include "Enemy.h"

using namespace std;

Hero::Hero()
{
    level = 1;
    exp = 0;
    life = 100*level;
    dmg = 10*level;
}

void Hero::Attack(Enemy ene){
    ene.loseHealth(dmg);
}

void Hero::Heal(){
    life += 50;
}

void Hero::loseHealth(int x){
    life -= x;
}

void Hero::receiveExp(){
    exp += 10;
    cout<<"Your hero is now level: "<< getLevel() << endl;

}

int Hero::getLevel(){
    if(exp >= 10 && exp <= 19){
        level = 2;
    }else if(exp >= 20 && exp <= 29){
        level = 3;
    }else if(exp >= 30 && exp <= 39){
        level = 4;
    }else if(exp >= 40){
        level = 5;
    }else{
        level = 1;
    }
    return level;
}
//Get all information about the hero
void Hero::printStatus(){
    cout<<"Your level: " << level<<endl;
    cout<<"Current exp: " << exp<<endl;
    cout<<"Amount of HP: " << life << endl;
    cout<<"DMG: " << dmg << endl;
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试编译时,将解析问题解释为:

void Hero::Attack(Enemy ene){
        ene.loseHealth(dmg);
    }
Run Code Online (Sandbox Code Playgroud)

也有一个Enemy类,几乎看起来与它的Attack功能相同的Parsing问题一样.

我正在使用XCode5.它说:"未知的类型名称'Enemy'"到这个:

void Attack(Enemy ene);
Run Code Online (Sandbox Code Playgroud)

Hero.h文件:

#ifndef __ConsoleGame__Hero__
#define __ConsoleGame__Hero__

#include <iostream>
#include "Enemy.h"
#include <cstdlib>

class Hero{
public:
    Hero();
    void Attack(Enemy ene);
    void Heal();
    void loseHealth(int x);
    void receiveExp();
    int getLevel();
    void printStatus();

private:
    int life;
    int dmg;
    int exp;
    int level;

};

#endif /* defined(__ConsoleGame__Hero__) */
Run Code Online (Sandbox Code Playgroud)

我的Enemy.h文件:

#ifndef __ConsoleGame__Enemy__
#define __ConsoleGame__Enemy__

#include <iostream>
#include "Hero.h"
#include <cstdlib>

class Enemy
{
public:
    Enemy();
    void Attack(Hero h);
    void Heal();
    void loseHealth(int x);
    void setDmg(int x);
    int getHealth();

private:
    int life;
    int dmg;
    int level;

};

#endif /* defined(__ConsoleGame__Enemy__) */
Run Code Online (Sandbox Code Playgroud)

我的Enemy.cpp文件:

#include "Enemy.h"
#include "Hero.h"
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

Enemy::Enemy()
{
    life = 50 * (rand()% 6);
    dmg = 5 * (rand()%6);
    level = rand()% 6;
}

//Attack
void Enemy::Attack(Hero h){
    h.loseHealth(dmg);
}

//Lose health
void Enemy::loseHealth(int x){
    life -= x;
}

//Heal
void Enemy::Heal(){
    life+= 10;
}

//Amount of hp
int Enemy::getHealth(){
    return life;
}

//Set dmg
void Enemy::setDmg(int x){
    dmg = x;
}
Run Code Online (Sandbox Code Playgroud)

dut*_*utt 6

你在这里有圆形包含,hero.h包括enemy.h和enemy.h,包括hero.h. 这往往表现为无法找到的类型之一.

解决这个问题的常用方法是转发声明类,只接受引用而不是对象.

hero.h:

 class Enemy;
 class Hero {
     void Attack(Enemy& e);
 };
Run Code Online (Sandbox Code Playgroud)

hero.cpp:

#include "hero.h"
#include "enemy.h"

void Hero::Attack(Enemy& e) { ... }
Run Code Online (Sandbox Code Playgroud)

enemy.h:

 class Hero;
 class Enemy {
     void Attack(Hero& e);
 };
Run Code Online (Sandbox Code Playgroud)

enemy.cpp:

#include "enemy.h"
#include "hero.h"

void Enemy::Attack(Hero& e) { ... }
Run Code Online (Sandbox Code Playgroud)

通常,您希望尽可能地转发声明以减少标头依赖性,这可能导致快速增加编译时间.一个小的修改意味着重建项目的一半.