[英]Friend function cannot access private member variable
我有两个类, PlayerCharacter
和Ability
。 Ability
类具有一个纯虚函数,我将其声明为PlayerCharacter
的friend
。 但是,我似乎无法访问该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.