簡體   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