朋友功能无法访问私有成员变量



我有两个类PlayerCharacterAbilityAbility类具有纯虚拟函数,我将其声明为friendPlayerCharacter。但是,我似乎无法访问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_;
}

能力.h:

//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);
};

CAMBICE.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变量?

根据 [class.friend]/10,友谊不是继承的。派生的课程不会仅仅因为其父班是该类的朋友而自动成为班级的朋友。

以下原因也不起作用的原因可能是因为在定义函数ExecuteAbility之前未定义Dash

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

但是,使用定义的正确顺序,它将起作用。请参阅演示。

来自cppreference:

友谊不是传递的(您朋友的朋友不是您的朋友)

友谊没有继承(您朋友的孩子不是您的朋友)

即使Dash::ExecuteAbility从其基类覆盖了friend功能,也不会从中受益。您必须重新考虑您的设计。

最新更新