使用未定义的'播放器'和'播放器'使用未定义的'播放器'错误

时间:2016-12-30 22:53:04

标签: c++ class

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”。

我做错了什么?

2 个答案:

答案 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();
}