Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

1

13.01.2008, 19:38

Klassenobjekte vergleichen

Hallo,
ich habe follgende Frage zum Vergleich zweier Klassenobjekte:
Wenn eine Klasse dynamische Eigenschaften enthält, dann darf man ja den Zuweisungsoperator nicht, ohne ihn vorher zu überladen, benutzen. Aber wie sieht es nun mit dem Vergleichsoperator?

Um mein Problem etwas zu veranschaulichen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyClass
{
   int* pInt;
public:
   MyClass() {
   pInt = new int;
   }
};

// Irgendwo im Programm

MyClass *Ob1 = new MyClass;

// Ob1 wurde in einen vector-container hinzugefügt

for(vector<MyClass*>::iterator it = ObArray.begin (); it != ObArray.end (); ++it)
{
     // Darf man das?

     if (*it == pGeometry)
     ...
}
To go back to the drawing board is not everyone's cup of tea! :-)

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

13.01.2008, 19:43

Ehmm...was passiert dann, wenn dus machst?

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

3

13.01.2008, 19:54

Hmm...war nicht die Antwort, die ich erhofft habe.
Ich bin mir sicher, dass der "=="-Operator überladen werden muss, wollte nur die Bestätigung haben ;)

PS: Verfüge jetzt leider nicht über die Möglichkeit dies zu prüfen.
To go back to the drawing board is not everyone's cup of tea! :-)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

13.01.2008, 19:55

jo was anderes bleibt dir eiegentlich kaum übrig^^

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

13.01.2008, 20:03

Darum habe ich ja so gefragt.
Einfach ausprobieren... :D

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

13.01.2008, 20:09

Den Zuweisungsoperator darfst du aber trotzdem verwenden.
@D13_Dreinig

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

7

13.01.2008, 20:45

Zitat von »"David_pb"«

Den Zuweisungsoperator darfst du aber trotzdem verwenden.

Ja klar, habe ich was anderes behauptet ;)
To go back to the drawing board is not everyone's cup of tea! :-)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

13.01.2008, 23:35

Re: Klassenobjekte vergleichen

Ja, nämlich das! :)

Zitat von »"Progater"«


Wenn eine Klasse dynamische Eigenschaften enthält, dann darf man ja den Zuweisungsoperator nicht, ohne ihn vorher zu überladen, benutzen.
@D13_Dreinig

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

9

14.01.2008, 06:42

Hmm, so wie du das geschrieben hast, vergleichst du zwei Zeiger miteinander. Das ist erlaubt, aber vermutlich nicht das, was du machen willst.

Sonst darfst du auch alle Objekte vergleichen, aber bei denen mit dynamisch angeforderten Zeigern drin (oder etwas allgemeiner: dynamischen Elementen), wird ohne selbst definierten Vergleich wieder nicht das gewünschte Ergebnis rauskommen.

Ein kleines Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

int *p1 = new int (5);
int *p2 = new int (5);
int *p3 = p1;

int main ()
{
  if ( p1 ==  p2)
    std::cerr << "Zeiger zeigen auf verschiedenen Speicher!" << std::endl;
  if (*p1 == *p2)
    std::cerr << "Gezeigte Elemente sind gleich." << std::endl;
  if ( p1 ==  p3)
    std::cerr << "Zeiger zeigen auch den selben Speicher." << std::endl;
  return 0;
}


Die Quintessenz: auch wenn zwei Zeiger auf verschiedenen Speicher zeigen, kann dort trotzdem ein Objekt stehen, das logisch gleich ist, und logische Gleichheit ist für den Operator == in der Regel gefragt.

Ein vergessener Operator = ist schlimm, weil der zu einem Absturz führt (es gibt Ausnahmen). Ein vergessener Operator == ist schlimm, weil er nicht Erwartungsgemäß funktioniert, und der Fehler dazu oft nur schwer zu finden ist.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

10

14.01.2008, 17:21

Zitat von »"rklaffehn"«


C-/C++-Quelltext

1
2
  if ( p1 ==  p2)
    std::cerr << "Zeiger zeigen auf verschiedenen Speicher!" << std::endl;


Ein klassischer Schuss in den Ofen :D

Werbeanzeige