2013-05-30 96 views
6

我有一個類MyCloth和類,我實例化這樣的一個一個對象實例:C++對象平等

MyCloth** cloth1; 

而且在程序中的一個點,我會做這樣的事情:

MyCloth** cloth2 = cloth1; 

然後在稍後的某個時間點,我想查看cloth1cloth2是否相同。 (類似於Java中的對象相等,只有在這裏,MyCloth是一個非常複雜的類,我不能構建isEqual函數。)

我該如何做這種相等性檢查?我在想也許檢查他們是否指向相同的地址。這是一個好主意嗎?如果是這樣,我該怎麼做?

+6

你做*不*有一個 「類的對象'MyCloth'」。如果你相信,你*真的*必須重新思考很多關於C++的知識。 –

+5

...爲什麼ptr ptr? – IdeaHat

+1

@ Kerrek SB:我只是想解釋我想做什麼,我知道我不能有MyCloth班的對象,但我不知道該怎麼做,我是新來的C++並試圖在創建項目時弄清楚它。 – user2399378

回答

8

通過比較兩個指針所保存的地址,可以測試對象標識。你提到Java;這與測試兩個引用是相同的相似。

MyCloth* pcloth1 = ... 
MyCloth* pcloth2 = ... 
if (pcloth1 == pcloth2) { 
    // Then both point at the same object. 
} 

您可以通過比較兩個對象的內容測試對象平等。在C++中,這通常通過定義operator==來完成。

class MyCloth { 
    friend bool operator== (MyCloth & lhs, MyCloth & rhs); 
    ... 
}; 

bool operator== (MyCloth & lhs, MyCloth & rhs) 
{ 
    return ... 
} 

隨着==操作符定義的,你可以比較平等:

MyCloth cloth1 = ... 
MyCloth cloth2 = ... 
if (cloth1 == cloth2) { 
    // Then the two objects are considered to have equal values. 
} 
+0

鑑於MyCloth * pcloth1,* pcloth2;如何比較兩者的內容?你的例子展示瞭如何爲非指針做到這一點。 – user2813274

+0

@ user2813274 - 'if(* pcloth1 == * pcloth2)...' –

+0

如何判斷是否檢查指針指向的位置,或者兩個位置的內容是否相同? – user2813274

3

如果您想要定義一個方法,通過該方法可以對您的custome類的一組對象進行比較。例如:

someClass instance1; 
someClass instance2; 

您可以通過重載此類的<運算符來完成此操作。

class someClass 
{ 

    bool operator<(someClass& other) const 
    { 
     //implement your ordering logic here 
    } 
}; 

如果你想要做的是比較,看看對象是字面上相同的對象是什麼,你可以做一個簡單的指針比較,看看他們是否指向同一個對象。我想你的問題措辭不好,我不確定你要去哪。

編輯:

對於第二種方法,它真的很容易。你需要訪問你的對象的內存位置。您可以通過許多不同的方式訪問它。這裏有幾個:

class someClass 
{ 

    bool operator==(someClass& other) const 
    { 
     if(this == &other) return true; //This is the pointer for 
     else return false; 
    } 
}; 

注:我不喜歡上面的,因爲通常==操作符去更深入的不僅僅是比較指針。對象可以表示具有相似質量的對象而不是相同的,但這是一個選項。 YOu也可以做到這一點。

someClass *instancePointer = new someClass(); 
someClass instanceVariable; 
someClass *instanceVariablePointer = &instanceVariable; 


instancePointer == instanceVariable; 

這是非感性的,無效/錯誤。如果它甚至會編譯,根據你的標誌,希望你使用的標誌不會允許這個!

instancePointer == &instanceVariable; 

這是有效的,會導致錯誤。

instancePointer == instanceVaribalePointer; 

這也是有效的,會導致錯誤。

instanceVariablePointer == &instanceVariable; 

這也是有效的,並會導致TRUE

instanceVariable == *instanceVariablePointer; 

這將使用上面定義得到的TRUE結果的==操作符;

+0

OP正在嘗試測試對象標識或等同性,而不是比較。另外,OP指定「MyCloth是一個非常複雜的類,我不能構建isEqual函數」。 –

+0

您描述的第二個變體。我怎麼做? – user2399378

+0

@ user2399378使用'=='比較指針將檢查它們是否指向完全相同的內存位置。 –