2017-02-09 36 views
2

我有一個代表特殊數字的類。操作員作爲朋友重載函數?

class SecretInteger 
{ 
private: 
    unsigned int *data; 
    size_t length; 

public: 
    SecretInteger operator+(const SecretInteger other) const; 
} 

我不能讓我的代碼的任何其他部分可以訪問data變量。但是,我的operator+函數必須能夠看到它。通常在這種情況下,我知道使用關鍵字friend是唯一的方法。然而,當我寫:

friend SecretInteger operator+(const SecretInteger other); 

它聲稱,operator+不能被聲明爲朋友,即使我以前寫過friend std::ostream& operator<<(std::ostream& stream, const SecretInteger val);,它工作正常。

我必須提供給我什麼選擇?如果我有一個像

const *unsigned int getData() const;的公共方法,我認爲即使如此,它實際上並沒有把這些變量返回const吧?我真的不希望有一個getData()方法,而是剛剛宣佈,有機會爲friend的功能。

+0

你聲明'運營商+'作爲一個成員函數,因此它可以訪問'data',不是嗎? – songyuanyao

+0

~~它不能訪問'other'的數據,這使得我不可能執行算術~~ – Hatefiend

+0

邊注:即使你堅持了過載的成員函數,沒有理由被接受的說法值。當然'const SecretInteger&other'就是你想要的。 – ShadowRanger

回答

3

您不聲明成員函數爲friend,friend是爲非內部函數提供訪問權限,並且operator+的一個操作數超載是成員函數。

在任何情況下,如果你正確地實現二進制運算符,您應該不需要給了友誼可言。執行+=作爲成員函數(不需要friend,一個類本身總是「朋友」),然後根據+=實現非成員+運算符,該運算符使用+=訪問內部函數以避免整個問題的友誼。

超載can be found here,應該有很大的幫助的基本規則。

+0

Wait ....爲什麼我的程序可以訪問'other'的內部?在Java中,情況並非如此。這裏發生了什麼?在我的'operator +'中,我可以訪問'this'和'other'的私有成員'data'。爲什麼? – Hatefiend

+0

哦,所以如果你在'A'中有'class A'和ANY函數來接受類型爲'A'的參數,它將有私人訪問該變量的權限? – Hatefiend

+1

@Hatefiend:[Java也爲您提供訪問](http://stackoverflow.com/a/29068196/364696)。 'private'意思是「只能被這個類訪問」,所以任何'SecretInteger'都可以訪問任何'Secretinteger'的'private's,它本身或者不同的實例。'private'僅用於接口目的,它不是防火牆實例相互之間的安全功能。 – ShadowRanger