2013-05-30 6 views
6

Ich habe eine Klasse MyCloth und eine ein Objekt Instanz dieser Klasse, die ich so instanziiert:C++ Objekt Gleichheit

MyCloth** cloth1; 

Und an einer Stelle im Programm, werde ich etwas tun:

MyCloth** cloth2 = cloth1; 

Und dann zu einem späteren Zeitpunkt möchte ich überprüfen, ob cloth1 und cloth2 die gleichen sind. (Etwas wie Objektgleichheit in Java, nur hier, MyCloth ist eine sehr komplexe Klasse und ich kann keine Funktion aufbauen.)

Wie kann ich diese Gleichheitsprüfung machen? Ich überlegte, vielleicht nachzusehen, ob sie auf die gleichen Adressen zeigen. Ist das eine gute Idee? Wenn ja, wie mache ich das?

+6

Sie tun * nicht * haben ein "Objekt der Klasse' MyCloth'":

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

Mit Operator == definiert, können Sie Gleichheit vergleichen. Wenn Sie das glauben, müssen Sie * wirklich * viel über C++ nachdenken. –

+5

... Warum das ptr ptr? – IdeaHat

+1

@Kerrek SB: Ich habe nur versucht zu erklären, was ich tun möchte, ich weiß, ich kann kein Objekt der Klasse MyCloth haben, aber ich wusste nicht, wie ich es anders ausdrücken könnte, ich bin neu C++ und versuche es herauszufinden, während ich ein Projekt erstelle. – user2399378

Antwort

8

Sie können das Objekt identity testen, indem Sie die Adressen zweier Zeiger vergleichen. Sie erwähnen Java; Dies ist vergleichbar mit dem Testen, dass zwei Referenzen gleich sind.

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

Sie für das Objekt testen Gleichheit durch den Inhalt von zwei Objekten zu vergleichen. In C++ geschieht dies normalerweise durch Definieren von operator==.

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

Gegeben MyCloth * pcloth1, * pcloth2; Wie würde man den Inhalt der beiden vergleichen? Ihr Beispiel zeigt, wie es nur für Nicht-Zeiger gemacht wird. – user2813274

+0

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

+0

Wie können Sie feststellen, ob das überprüft, wo die Zeiger zeigen, oder ob die Inhalte der beiden Standorte identisch sind? – user2813274

3

Wenn Sie eine Methode definieren möchten, um einen Vergleich einer Menge von Objekten Ihrer custome-Klasse zu ordnen. Zum Beispiel:

someClass instance1; 
someClass instance2; 

können Sie tun, indem Sie die < Betreiber für diese Klasse zu überlasten.

class someClass 
{ 

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

Wenn das, was Sie tun möchten, ist zu vergleichen und sehen, ob die Objekte buchstäblich das gleiche Objekt sind, können Sie einen einfachen Zeiger Vergleich tun, um zu sehen, ob sie auf das gleiche Objekt zeigen. Ich denke deine Frage ist schlecht formuliert, ich bin mir nicht sicher, wofür du hingehst.

EDIT:

Für die zweite Methode, es ist wirklich ganz einfach. Sie benötigen Zugriff auf den Speicherort Ihres Objekts. Sie können auf viele verschiedene Arten darauf zugreifen. Hier sind ein paar:

class someClass 
{ 

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

Anmerkung: Ich weiß nicht wie die oben, wie in der Regel == Betreiber mehr in die Tiefe gehen, als nur den Vergleich Zeiger. Objekte können Objekte ähnlicher Qualität darstellen, ohne gleich zu sein, aber dies ist eine Option. Sie können dies auch tun.

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


instancePointer == instanceVariable; 

Dies ist nicht sensibel und ungültig/falsch. Wenn es je nach deinen Flags sogar kompilieren würde, hoffentlich mit Flags, die das nicht zulassen würden!

instancePointer == &instanceVariable; 

Dies ist gültig und würde zu false führen.

instancePointer == instanceVaribalePointer; 

Dies ist ebenfalls gültig und würde zu false führen.

instanceVariablePointer == &instanceVariable; 

Dies gilt auch und

in TRUE

instanceVariable == *instanceVariablePointer; 
führen würde dieser den Operator == verwenden würden wir über das Ergebnis TRUE bekommen definiert;

+0

Das OP versucht Objekt Identität oder Gleichheit zu testen, nicht zu vergleichen. Außerdem gibt das OP an "MyCloth ist eine sehr komplexe Klasse und ich kann keine isEqual-Funktion erstellen". –

+0

Die zweite Variante, die Sie beschreiben. Wie mache ich das? – user2399378

+0

@ user2399378 Wenn Sie '==' verwenden, um Zeiger zu vergleichen, prüfen Sie, ob sie genau auf denselben Speicherort zeigen. –