c++ - 解析问题c++

标签 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;
}

问题是当我尝试编译时它说 Parsing issue to following:

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

还有一个 Enemy 类,它看起来几乎一样,但在其 Attack 函数中存在相同的解析问题。

我正在使用 XCode5。 它说:“未知类型名称‘敌人’” 到这个:

void Attack(Enemy ene);

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__) */

我的 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__) */

我的 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;
}

最佳答案

这里是循环包含,hero.h 包含 enemy.h 和 enemy.h 包含 hero.h。这往往会显示为无法找到其中一种类型。

解决这个问题的通常方法是前向声明类并且只采用引用而不是对象。

英雄.h:

 class Enemy;
 class Hero {
     void Attack(Enemy& e);
 };

英雄.cpp:

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

void Hero::Attack(Enemy& e) { ... }

敌人.h:

 class Hero;
 class Enemy {
     void Attack(Hero& e);
 };

敌人.cpp:

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

void Enemy::Attack(Hero& e) { ... }

一般来说,您希望尽可能多地前向声明以减少 header 依赖性,这会导致编译时间快速增加。一个小的修改意味着重建一半的项目。

关于c++ - 解析问题c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22569192/

相关文章:

c++ - 只为一个对象创建一个类

c++ - 为什么不会创建此对象? C++

c++ - 模板流运算符重载错误: invalid reference initialisation to do with differences between basic_istream and basic_ifstream

c++ - CUDA纹理对象问题

c++ - 如何运行需要提升并等待的子进程?

php - 方法语法 "public function direct(){}"在 PHP 中如何工作?

用于处理不同类型事件的 Java 设计模式?

c++ - 来自 C 的 Lua 中的 OOP

c++ - 将 ls 输出转换为整数

oop - 面向对象的编程和事务