2016-05-31 42 views
0

我有類好友功能和受保護的數據

class ScoreBoard: public die 
{ //..// 
    protected: 
    bool mSetValue[6]; 
    public: 
//...// 
     friend void ValueSet(); 
}; 

,我想用友誼去mSetValue訪問。 所以我在ScoreBoard.cpp做的是:我predifine一個函數,(void ValueSet();),然後把它定義是這樣的:

void ValueSet() 
{ char lPick; 
std::cin >> lPick; 
if (lPick == 1) mSetValue[0] = true; } 

但調試器說:

「mSetValue」在此範圍內未聲明。

所以,我的問題是 - 如何正確設置好友情,所以ValueSet可以訪問mSetValue數組?

+4

你需要一個*對象*訪問它的成員來完成。 – StoryTeller

+1

在一個不相關的記錄上:記分牌與死亡相似的方式是什麼? – molbdnilo

+0

爲什麼它應該類似?來自die類的記分板繼承可以訪問它的公共方法。 –

回答

1

成員變量存在於實例(對象)中。它們也被稱爲「實例變量」。如果沒有這個類的實例,那麼就沒有實例變量。

mSetValueScoreBoard的成員變量。因此ScoreBoard::mSetValue實例僅在ScoreBoard的實例中存在。

如何正確設置好友情,讓ValueSet可以訪問mSetValue數組?

在函數void ValueSet()中,您沒有任何ScoreBoard的實例。無法訪問ScoreBoard::mSetValue - 不管其訪問說明符或友誼 - 因爲它不存在。你需要的是一個ScoreBoard的實例。

我用這個函數的記分牌類裏面,所以我不能在它裏面創建記分牌的任何實例

沒有什麼能阻止你的ScoreBoard成員函數中創建的ScoreBoard一個實例。儘管在ScoreBoard的成員函數中,您已經可以訪問由this指向的實例,因此可能不需要創建新實例。你應該做什麼取決於你的意圖。

鑑於您的評論,我懷疑成員函數會更適合您,而不是免費函數。

爲簡單起見,我使用通用術語「成員變量」來指代非靜態成員變量。靜態成員變量是不同的。它們也被稱爲類變量。

+0

好吧,但我在ScoreBoard類中使用了這個函數,所以我不能在裏面創建任何ScoreBoard實例。我雖然是靜態變量(因爲它們是「不朽的」),但這個想法也不起作用。有沒有什麼辦法我可以把它放在函數內,或者我必須在主函數中使用ValueSet函數? –

+0

@PawełMotyka查看編輯答案。我懷疑一個成員函數會更適合你,而不是一個自由函數。 – user2079303

1

朋友功能不是類的成員。所以在你的情況下,如果你想在ValueSet中使用mSetValue,那麼你必須通過該類的實例或「對象」提供對mSetValue的一些訪問。這可以通過聲明你ValueSet()功能

friend void ValueSet(ScoreBoard &sb); 

而且你定義

void ValueSet(ScoreBoard &sb) 
{ 
    char lPick; 
    std::cin >> lPick; 
    if (lPick == 1) 
     sb.mSetValue[0] = true; 
}