2013-08-28 26 views
0

我剛開始學習C++中的朋友函數,這是我用於概念探索的程序。如何在C++中爲朋友功能提供保護

#include<iostream> 

using namespace std; 

class one 
{ 
private: 
    int age; 
public: 
    one() 
    { 
     age=1; 
    } 
    void setData(int num) 
    { 
     age=num; 
    } 
friend int returnOne(one a); 
}; 
int returnOne(one a) 
{ 
    return a.age; 
} 


class two 
{ 
private: 
    int roll; 
public: 
    two() 
    { 
     roll=0; 
    } 
    void setData(int num) 
    { 
     roll=num; 
    } 
friend int returnTwo(two b); 
}; 

int returnTwo(two b) 
{ 
    return b.roll; 
} 


int main() 
{ 
    one a; 
    two b; 
    a.setData(10); 
    b.setData(12); 
    cout<<returnOne(a)<<endl<<returnTwo(b)<<endl; 
} 

現在我很擔心,one類和two的安全性受到威脅像現在任何人都可以使用這些全局定義友元函數訪問類one的和階級two的私有成員。 如何爲這些朋友功能提供保護或限制其使用?

+3

您不應該將private/protected/public視爲安全概念。製作私密或受保護的內容並不能保護它免受惡意用戶的侵害,這只是一個設計問題,可以使編寫更好的代碼變得更容易。 – Wilbert

回答

2

friend船是相互的。除非在類定義中聲明該函數爲朋友,否則函數不可能成爲朋友,所以這是一個選擇。如果你做到了,你必須忍受它。創建一個功能好友,然後嘗試阻止它訪問類內部是沒有意義的,因爲這正是關鍵字friend的目的。

不要誤用或誤解友誼。友誼用於表示兩個實體之間有意的強耦合。如果兩個實體之間存在特殊關係,以至於需要訪問其他私人或受保護的成員,但您不希望每個人都可以通過使用公共訪問說明符訪問,那麼您應該使用友誼。

+0

在這兩個實體中,一個實體將是其數據成員我正在訪問使用friend函數的類,但是另一個實體可以是任何人,因爲每個人都可以調用該函數。所以,**你不希望每個人都有權訪問通過使用公共訪問說明符,你應該使用友誼。**是真實的? –

+0

@InsaneCoder訪問被限制在朋友函數的代碼中,你決定做什麼(儘管我已經看到人們做了很糟糕的事情,比如聲明一個朋友作爲一個後門被其他人實現。不要讓任何人告訴你這是個好主意。) – juanchopanza

0

聲明一個類中的朋友函數擴展了類public接口。你基本上是用更多的功能擴展類(以緊密耦合這些功能爲代價)。

所以你不能阻止人們使用這些函數,就像你不能阻止人們在你的類上使用公共成員方法(他們都是公共接口的一部分)一樣。

但是,你可以重新設計你的朋友功能,所以他們不公開實施細節。
爲什麼不爲您的類定義operator<<而不是訪問特定成員的函數(假設您只是爲了流式傳輸提供了這些函數(如果不是那麼這個點就是靜音))。

std::ostream& operator<<(std::ostream& s,two const& b) 
{ 
    return s << b.roll; 
}