【问题标题】:Unable to access private variables inside of static functions无法访问静态函数内部的私有变量
【发布时间】:2019-03-06 03:54:36
【问题描述】:

我正在尝试制作一个小型迷你游戏,其中 class Hero 使用 class Enemyvariables 与 friend 交互,但代码无法编译并给我前向声明错误

#include <iostream>

class Enemy;

class Hero
{
    friend class Enemy;
private:
    static int hp, power;
public:
    Hero *h1;
    Hero ()
    {
        hp = 50;
        power = 10; 
    }
    static void attackEnemy (Enemy *e1, Hero *h1);
};

static void Hero::attackEnemy(Enemy *e1, Hero *h1)
{
    e1->hp -= h1->power;
}

class Enemy
{
    friend class Hero;
private:
    static int hp, power;
public:
    Enemy ()
    {
        hp = 15;
        power = 10;
    }
    void attackHero ();
};

int main ()
{
    Enemy *e1 = new Enemy ();
    Hero *h1 = new Hero ();

    h1->attackEnemy(Enemy *e1, Hero *h1);

    return 0;
}

我被告知 static 函数和变量能够防止此错误,因为它们是 global,因为它预编译了构建

【问题讨论】:

    标签: c++ class oop static friend


    【解决方案1】:

    这里有两个主要问题。

    首先,在定义Hero::attackEnemy 时,static 限定符在这里无效。该成员已经在类定义中声明为static,所以这里也不需要应用它。

    其次,在Hero::attachEnemy被定义的时候,Enemy类还没有被定义。您需要将Hero::attachEnemy 的定义移动到 class Enemy 的定义之后。

    class Enemy;
    
    class Hero {
        ...
    };
    
    class Enemy {
        ...
    };
    
    void Hero::attackEnemy(Enemy *e1, Hero *h1)
    {
        e1->hp -= h1->power;
    }
    

    另外,这不是一个有效的函数/方法调用:

    h1->attackEnemy(Enemy *e1, Hero *h1);
    

    你想要:

    h1->attackEnemy(e1, h1);
    

    【讨论】:

    • 只是一个小而重要的更正,...该成员已被声明为静态(未定义为您写的)
    • @dsp_user 谢谢。已编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    相关资源
    最近更新 更多