繁体   English   中英

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

[英]Friend function cannot access private member variable

我有两个类, PlayerCharacterAbility Ability类具有一个纯虚函数,我将其声明为PlayerCharacterfriend 但是,我似乎无法访问该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_;
}

skill.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);
};

skill.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);

但是,按照正确的定义顺序 ,它将起作用。 参见DEMO

来自cppreference

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

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

即使Dash::ExecuteAbility从其基类覆盖了一个friend函数,也不能从中受益。 您将不得不重新考虑您的设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM