解析c++问题

Parsing issue c++

本文关键字:问题 c++ 解析      更新时间:2023-10-16

我试图从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;
}

事情是当我试图编译它说解析问题如下:

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

获得了一个看起来几乎相同的敌人类,在其攻击函数中出现了相同的解析问题。

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

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

My 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。这往往表现为找不到其中一个类型。

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

hero.h:

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

hero.cpp:

#include "hero.h"
#include "enemy.h"
void Hero::Attack(Enemy& e) { ... }

enemy.h:

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

enemy.cpp:

#include "enemy.h"
#include "hero.h"
void Enemy::Attack(Hero& e) { ... }

一般来说,你想要尽可能多的前向声明来减少头文件的依赖,这可能会导致编译时间的快速增加。一个小小的改动意味着要重建一半的工程。

我看到你在使用"include守卫":

#ifndef __ConsoleGame__Hero__
#define __ConsoleGame__Hero__

很容易犯复制粘贴错误,忘记在另一个文件中更改它们。确保你的符号(ConsoleGame__Hero)在你所有的类包含文件中是不同的。

你有一个循环包含-你包括enemy.hhero.h彼此-包括它只在一个地方

使用

#pragma once

而不是定义…

并创建一个common.h头文件,其中包含:)

你是交叉包括,这是不好的

在c++中,

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

不会做你期望的事。应该是

void Hero::Attack(Enemy *ene){
    ene->loseHealth(dmg);
}

或者更好,如另一个答案所建议的:

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

因为在第一个版本中,有一个ene的副本,所以敌人永远不会失去生命值,只是它的副本。那么你就不需要把这些文件包含在彼此的文件中了,你可以做前向声明:

class Enemy;