class Skeleton {
public:
void attack(Player player) {
if (canAttackSkeleton()) {
player.setHealth(player.getHealth() - _attackDamage); //C2027 and C2228 for setHealth() and getHealth()
return;
}
}
void getAttacked(Player player) {
_health -= player.getAttackDamage(); //C2027 and C2228 for getAttackDamage()
}
private:
float _attackDamage = 100.0f;
};
class Player{
public:
void attack(Skeleton skeleton) {
if (canAttackPlayer()) {
skeleton.setHealth(skeleton.getHealth() - _attackDamage);
return;
}
}
void getAttacked(Skeleton skeleton) {
_health -= skeleton.getAttackDamage();
}
private:
float _attackDamage = 100.0f;
};
这是我的代码加上主要功能
基本上我得到“use of undefined 'Player'
”,错误代码为C2027
。此外,对于.setHealth
,.getHealth
和.getAttackDamage
,我收到错误代码为must have class/struct/union
的错误“C2228
”。
我做错了什么?
答案 0 :(得分:1)
未定义意味着编译器无法找到Player的定义。如果切换顺序,则会出现未定义的Skeleton错误。你应该考虑使用角色类。
#include<iostream>
class Character {
public:
Character() : health(100), attackDamage(10) {}
virtual void attack(Character& other) {
other.getAttacked(*this);
}
virtual void getAttacked(Character& other) {
this->health -= other.getAttackDamage();
}
virtual int getHealth() const { return health; }
virtual void setHealth(int Health) { health = Health; }
virtual int getAttackDamage() const { return attackDamage; }
virtual void setAttackDamage(int AttackDamage) { attackDamage = AttackDamage; }
protected:
int health;
int attackDamage;
};
class Player : public Character {
};
class Skeleton : public Character {
};
int main(int argc, char* argv[]) {
Player player;
Skeleton skeleton;
std::cout << "Before attack...\n\nPlayer Health: " << player.getHealth() << std::endl << "Skeleton Health: " << skeleton.getHealth() << std::endl;
player.attack(skeleton);
std::cout << "After attack...\n\nPlayer Health: " << player.getHealth() << std::endl << "Skeleton Health: " << skeleton.getHealth() << std::endl;
player.setAttackDamage(50);
std::cout << "Updated player attack to 50" << std::endl;
player.attack(skeleton);
std::cout << "After second attack with 50 attack damage...\n\nPlayer Health: " << player.getHealth() << std::endl << "Skeleton Health: " << skeleton.getHealth() << std::endl;
return 0;
}
答案 1 :(得分:0)
我建议将类定义/声明与实现部分分开。连同一个前向声明(或一个简单的class
- 令牌之前尚未定义的类类型)这应该有所帮助。
请注意,您提供的代码不完整(例如,它缺少方法canAttackSkeleton
等等)。因此,此片段无法编译。但是,OP中提到的编译器错误应该可以解决。
关于代码本身,似乎有一些改进/重构的空间(例如,通过引用调用而不是按注释建议的值调用)。但是,这实际上不是你的问题,所以我不在这里添加任何评论。
代码如下所示:
// header file (.h):
class Skeleton {
public:
void attack(class Player player);
void getAttacked(class Player player);
private:
float _attackDamage = 100.0f;
};
class Player {
public:
void attack(Skeleton skeleton);
void getAttacked(Skeleton skeleton);
private:
float _attackDamage = 100.0f;
};
// implementation file (.cpp):
void Skeleton::attack(Player player) {
if (canAttackSkeleton()) {
player.setHealth(player.getHealth() - _attackDamage); //C2027 and C2228 for setHealth() and getHealth()
return;
}
}
void Skeleton::getAttacked(Player player) {
_health -= player.getAttackDamage(); //C2027 and C2228 for getAttackDamage()
}
void Player::attack(Skeleton skeleton) {
if (canAttackPlayer()) {
skeleton.setHealth(skeleton.getHealth() - _attackDamage);
return;
}
}
void Player::getAttacked(Skeleton skeleton) {
_health -= skeleton.getAttackDamage();
}