我有两个类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_;
}
能力.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
功能,也不会从中受益。您必须重新考虑您的设计。