![](/img/trans.png)
[英]How to properly overload operator= when trying to swap variadic templated classes?
[英]How to compare private variables of two classes when trying to overload operator==?
我正在嘗試重新創建字符串類,並且在比較兩個類相互比較時遇到了麻煩,就好像它們是字符串一樣。 這是我在頭文件中的內容:
class Mystring {
public:
// ...
private:
// this variable stores the memory address of the text
char* ptr_buffer
// ...
};
在源文件中,我有thsi代碼:
bool operator== (const Mystring& a, const Mystring& b) {
return a.ptr_buffer == b.ptr_buffer;
}
但出於某種原因,當我嘗試比較main.cpp中的兩個Mystring類時,它說它無法訪問私有變量ptr_buffer
。 我以為它可以訪問它? 我如何比較這兩個我唯一關心比較的東西是隱藏的?
從C ++語言的角度來看,在全局范圍內引入的重載運算符就像全局范圍內的任何其他函數一樣(除了它自定義其中一個內置運算符的工作方式)。 正如常規的舊自由函數無法訪問類的private
字段一樣,自由函數重載運算符也無法訪問它為運算符重載的類的private
字段。
有充分的理由這樣做。 例如,自定義類通常使用一個參數作為ostream
引用而另一個作為自定義類型來重載operator <<
。 如果這個自定義重載可以訪問ostream
類型的字段,那將是非常糟糕的!
您在類的實現文件中定義operator ==
這一事實也無關緊要。 C ++沒有類的“實現文件”的概念,即使通常是類的實現方式。 在這方面,它將所有源文件視為相同。
要解決此問題,您可以聲明您的operator ==
函數是該類的friend
:
class MyString {
public:
...
friend bool operator== (const MyString& lhs, const MyString& rhs);
}
...
bool operator== (const MyString& lhs, const MyString& rhs) {
// You were given explicit authorization to access private fields,
// so go right ahead!
}
但是,您是否確定您的operator ==
的實現是正確的? 您正在比較存儲在MyString
對象中的指針,而不是它們指向的字符串的內容。 如果你在內存中有兩個相同字符串文字的不同副本,你可以有兩個在邏輯上相等的MyString
(它們代表相同的字符串),但它們不相等。
實際上,您可能想問一個單獨的問題: 您是否可以僅使用MyString
類型的公共接口來實現operator==
? 在一個好的字符串類型中,答案應該是“是”,因為你應該能夠按順序訪問字符並查看長度。 從效率的角度來看,這不太理想,但是看看界面是否良好是一個很好的測試。 所以你可能想嘗試實現這個函數, 而不使用私有字段只是為了確保你可以,然后考慮使operator ==
成為friend
的好處,以及從性能角度來看這是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.