[英]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.