使用未定义的'Player'和'player'使用未定义的'Player'错误
use of undefined 'Player' and 'player' uses undefined 'Player' errors
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
。
我做错了什么?
未定义表示编译器找不到播放器的定义。如果切换顺序,则会出现未定义骨架的错误。你应该考虑有一个角色类。
#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...nnPlayer Health: " << player.getHealth() << std::endl << "Skeleton Health: " << skeleton.getHealth() << std::endl;
player.attack(skeleton);
std::cout << "After attack...nnPlayer 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...nnPlayer Health: " << player.getHealth() << std::endl << "Skeleton Health: " << skeleton.getHealth() << std::endl;
return 0;
}
我建议将类定义/声明与实现部分分开。 连同前向声明(或在此之前尚未定义的类类型之前的简单class
-token),这应该会有所帮助。
请注意,您提供的代码不完整(例如,它缺少方法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();
}
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 具有外部"c"和程序集的未定义函数
- 此增量后语句是否会导致未定义的行为?
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 使用未定义的'Player'和'player'使用未定义的'Player'错误
- 错误:未定义对'player()'的引用