解析c++问题
Parsing issue c++
我试图从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.h
和hero.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;
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题