2015-09-17 80 views
1

對於作業,我必須創建一個類的一些私人成員類。必須創建一個友元函數,它需要兩個參數:指向對象的指針和指向對象私有成員的指針。 代碼定義如下:C++ Friend函數無法訪問私有成員;錯誤2248

#include "stdafx.h" 
#include<iostream> 
#include<cstdlib> 
#include<ctime> 
using namespace std; 

class SomeClass { 
    friend int FriendFunction(bool SomeClass::*privMember, SomeClass *object); 
private: 
    bool Member1; 
    bool Member2; 
    bool Member3; 
public: 
    SomeClass() { 
     bool tmp; 

     if (rand() < 16384) 
      tmp = false; 
     else 
      tmp = true; 
     Member1 = tmp; 

     if (rand() < 16384) 
      tmp = false; 
     else 
      tmp = true; 
     Member2 = tmp; 

     if (rand() < 16384) 
      tmp = false; 
     else 
      tmp = true; 
     Member3 = tmp; 
    } 
}; 

int FriendFunction(bool SomeClass::*privMember, SomeClass *object) { 
    if (!(object->*privMember)) 
     object->*privMember = !(object->*privMember); 
    else 
     cout << "No changes made" << endl; 
    return 0; 
} 


int main() 
{ 
    srand(time(0)); 
    SomeClass *object1 = new SomeClass(); 

    FriendFunction(&SomeClass::Member1, object1); 
    FriendFunction(&SomeClass::Member2, object1); 
    FriendFunction(&SomeClass::Member3, object1); 

    return 0; 

} 

的友元函數調用不會編譯和編譯器報告C2248消息。 代碼有什麼問題? 我將不勝感激任何支持。

感謝

+0

我敢打賭,編譯器錯誤是在你實際訪問私有成員的'main'函數中。 –

+0

如果您有定義getter函數的自由(在您的任務中),那麼您可以輕鬆訪問指向您班級的私人成員的指針。然後你可以使用你的_FriendFunction_。 – sokin

回答

1

那是因爲你正試圖從main訪問私有成員:

FriendFunction(&SomeClass::Member1, object1); 

這條線是從main指私人領域&SomeClass::Member1,並且,當然,失敗。

+0

這確實是問題的原因。聲明'int main()'作爲SomeClass的朋友編譯代碼,但這當然只是證明問題出在哪裏的方法。問題仍然存在:我如何將指針傳遞給FriendFunction的私人類成員? – Marko

+0

@Marko,在你的具體情況下,我會將變量存儲在數組中,並在該數組中傳遞一個索引,而不是指向成員的指針。 – SingerOfTheFall

+0

我知道,通過索引是解決方案之一,但不幸的是,這並不能真正解決我的作業任務。該任務中定義的是bool類型的私有類成員的定義,它是一個帶有兩個參數(指向對象的指針和指向對象的私有成員的指針)的友元函數,在構造函數設置它時需要將私有成員更改爲值true假。它可以以任務需要的方式完成嗎? – Marko