使用未定义的'Player'和'player'使用未定义的'Player'错误

use of undefined 'Player' and 'player' uses undefined 'Player' errors

本文关键字:Player 未定义 错误 player      更新时间:2023-10-16
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();
}