Функция Friend не может получить доступ к закрытой переменной-члену - PullRequest
0 голосов
/ 19 февраля 2019

У меня два класса, PlayerCharacter и Ability.Класс Ability имеет чисто виртуальную функцию, которую я объявляю от friend до PlayerCharacter.Тем не менее, я не могу получить доступ к закрытым членам в объявленной функции friend.Я что-то упускаю из виду?

Я пытался объявить дочернюю функцию, а не виртуальную, как функцию друга, но безрезультатно.

player_chracter.h:

#include "ability.h"

class PlayerCharacter : public Character {
private:
    // Friend function
    friend bool Ability::ExecuteAbility(PlayerCharacter& in_player);

    // This doesn't work either
    //friend bool Dash::ExecuteAbility(PlayerCharacter& in_player);

    // Private variable
    float top_speed_;
}

способность.ч:

//Forward declaration
class PlayerCharacter;

class Ability {
public:
    Ability();
    ~Ability();
    virtual bool ExecuteAbility(PlayerCharacter& in_player) = 0;
};
//---------------------------------------------------------
class Dash : public Ability {
public:
    Dash();
    ~Dash();
    bool ExecuteAbility(PlayerCharacter& in_player);
};

способность.cpp:

#include "ability.h"
#include "player_character.h"   //Follow through on forward declaraction

bool Dash::ExecuteAbility(PlayerCharacter& in_player) {
    float example = in_player.top_speed_;
}

ВКод выше, почему я не могу получить доступ к top_speed_ и поместить его в переменную float example?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

От cppreference :

Дружба не является переходной (друг вашего друга не ваш друг)

Дружба не передается по наследству (дети вашего другане ваши друзья)

Даже если Dash::ExecuteAbility переопределяет функцию friend из ее базового класса, она не получает от нее никакой выгоды.Вам придется пересмотреть свой дизайн.

0 голосов
/ 19 февраля 2019

Согласно [class.friend]/10, дружба не наследуется.Производный класс автоматически не становится другом класса только потому, что его родительский класс является другом этого класса.

Причина, по которой приведенное ниже также не работает, вероятно, заключается в том, что Dash не определен ранеефункция ExecuteAbility определена.

friend bool Dash::ExecuteAbility(PlayerCharacter& in_player);

Однако при правильном порядке определений она будет работать.См ДЕМО .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...