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
Zitat von »"David_pb"«
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.
Zitat von »""«
Hmm, so wie du das geschrieben hast, vergleichst du zwei Zeiger miteinander. Das ist erlaubt, aber vermutlich nicht das, was du machen willst.
C-/C++-Quelltext |
|
1 2 |
if ( p1 == p3) std::cerr << "Zeiger zeigen auch den selben Speicher." << std::endl; |
Zitat von »"grek40"«
In diesem Fall wär es überhaupt nicht relevant, ob ein == operator für die Klasse definiert ist, der würde eh erst greifen, wenn Klassenobjekte verglichen werden, die Pointern sind total unabhängig davon.
Zitat von »"Progater"«
...
// Darf man das?
if (*it == pGeometry)
...
}
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include <iostream> #include <vector> class MyClass { public: int* pInt; public: MyClass(int i); ~MyClass(); bool operator == (const MyClass& rhs); }; MyClass::MyClass(int i) { pInt = new int; *pInt = i; } MyClass::~MyClass() { delete pInt; } bool MyClass::operator ==(const MyClass &rhs) { return(*pInt == *rhs.pInt); } int main() { std::vector<MyClass*> myClassArray; MyClass* pMyClass = new MyClass(500); myClassArray.push_back(pMyClass); for(std::vector<MyClass*>::iterator it = myClassArray.begin (); it != myClassArray.end (); ++it) { if (*it == pMyClass); // Hier wird überprüft, ob beide Zeiger auf dieselbe Adresse zeigen if (**it == *pMyClass); // Hier wird überprüft, ob pInt denselben Wert hat. Es wird auf den überladenen "=="-Operator zugegriffen } delete pMyClass; myClassArray.clear(); return 0; } |
Zitat von »"Progater"«
Übrigens, in diesem Fall muss der "=="-Operator überladen werden
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
class MyClass { private: int* pInt; // Um das Konzept der Kapselung einzuhalten, sollte der Zeiger privat sein public: explicit MyClass(int i); // Implizites Casten verbieten. ~MyClass(); bool operator == (const MyClass& rhs) const; // Die Funktion sollte konstant sein }; MyClass::MyClass(int i) : pInt( new ( std::nothrow ) int ) { // Das hier könnte eine Ausnahme werfen, was relativ schlecht im Konstruktor ist. Also lieber // eine bessere Alternative und lieber in der Initialisierungsliste // pInt = new int; if ( pInt ) *pInt = i; } MyClass::~MyClass() { delete pInt; } bool MyClass::operator ==(const MyClass &rhs) const // Auch die Definition sollte natürlich konstant sein { // Additional prüfen ob einer der beiden Zeiger null ist weil... if ( pInt == 0 || rhs.pInt == 0 ) return pInt == rhs.pInt; return (*pInt == *rhs.pInt); //... dereferenzieren von Nullpointern nicht gern gesehen wird! :) } |
Zitat
die Speicherreservierung in der Initialisierungsliste sehe ich wirklich zum ersten mal :oops:
Zitat von »"Progater"«
Danke für die Nachbearbeitung
Ich kenne mich natürlich mit const-correctness und privaten Attributen aus und hab' dieses Beispiel ohne lange zu zögern vorgeführt, um es besser zu vereinschaulichen, was ich gemeint habe. Wenn einer mit der Rechtsschreibung mängelt, zieht ihn ja auch keiner zur Rechenschaft
Aber das mit dem expliziten Construktor habe ich schon lange vergessen und die Speicherreservierung in der Initialisierungsliste sehe ich wirklich zum ersten mal :oops:
Zitat von »"p0llux"«
Es tut nicht gut, wenn man Zeiger vergleicht. Außerdem soll man in STL Containern nur Objekte einlagern, welche ohne Seiteneffekte kopierbar sind. Zeiger sind das nicht!
Werbeanzeige