Невозможно получить доступ к закрытым переменным внутри статических функций - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь сделать небольшую мини-игру, в которой class Hero взаимодействует с class Enemy переменными, используя 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, так как она предварительно компилирует сборку

1 Ответ

3 голосов
/ 06 марта 2019

Здесь есть две основные проблемы.

Во-первых, при определении 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);
...