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

11

14.01.2008, 19:18

Re: Klassenobjekte vergleichen

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.

Upps, hab' mich verschrieben :oops:
Es sollte natürlich heißen, dass man es besser nicht tun sollte ;)

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.

Doch, wie ich mit dem vector-container angedeutet habe, will ich lediglich zwei Zeiger vergleichen, ob sie identisch sind oder besser gesagt, ob die beiden Zeiger auf dieselbe Adresse zeigen. Deswegen ist/war für mich nur follgendes von Interesse:

C-/C++-Quelltext

1
2
if ( p1 ==  p3)
    std::cerr << "Zeiger zeigen auch den selben Speicher." << std::endl; 

Trotzdem Danke für all die Antworten ;)
To go back to the drawing board is not everyone's cup of tea! :-)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

12

14.01.2008, 19:47

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.

Das gilt übrigens sowohl für den == als auch für den = operator!

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

13

14.01.2008, 21:12

@grek40: ich sollte so früh nix mehr an Quelltext produzieren :) Aber ich glaube, es ist trotzdem klar geworden, was ich meine... :idea:
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

14

15.01.2008, 11:41

Nur mal so am Rande:

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!

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

15

16.01.2008, 19:54

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.


Genau das wollte ich auch hören! Hab' jetzt einen Extrakurs über Pointern gemacht und versteh' jetzt etwas mehr :D
Ich dachte eigentlich, dass man das aus dem Code rauslesen kann, was ich meine:

Zitat von »"Progater"«


...
// Darf man das?
if (*it == pGeometry)
...
}


Hier wird geprüft, ob die beiden Zeiger auf dieselbe Adresse zeigen und nicht, ob *pGeometry denselben Wert hat --> also es geht ;)

Nochmal ganz deutlich:

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;
}

Übrigens, in diesem Fall muss der "=="-Operator überladen werden ;)
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

16

17.01.2008, 13:21

Zitat von »"Progater"«


Übrigens, in diesem Fall muss der "=="-Operator überladen werden ;)


Genau so ist es! Übrigens noch ein paar Tips zu deinem Code (habs mal Kommentiert)!

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! :)

}
@D13_Dreinig

Progater

Treue Seele

  • »Progater« ist der Autor dieses Themas

Beiträge: 119

Wohnort: BW

  • Private Nachricht senden

17

17.01.2008, 18:43

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 :D
Aber das mit dem expliziten Construktor habe ich schon lange vergessen und die Speicherreservierung in der Initialisierungsliste sehe ich wirklich zum ersten mal :oops:
To go back to the drawing board is not everyone's cup of tea! :-)

18

17.01.2008, 19:04

Zitat

die Speicherreservierung in der Initialisierungsliste sehe ich wirklich zum ersten mal :oops:

Naja einfach konsequente Umsetzung der Initialisierungsliste ;) Aber nuja sie dich mal etwas im Forum um ... sollte mitlerweile schon von mehreren Leuten in ihrem Code genutzt werden ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

19

17.01.2008, 21:36

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 :D
Aber das mit dem expliziten Construktor habe ich schon lange vergessen und die Speicherreservierung in der Initialisierungsliste sehe ich wirklich zum ersten mal :oops:


Ich wollte es nur nochmal gesagt haben, vielleicht auch als Denkanstoß für andere, die deinen Code durchlesen.
Immerhin hast du die Initialisierungsliste kennen gelernt und eine neue Version von new. Ist doch schonmal etwas! ;)
@D13_Dreinig

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

20

17.01.2008, 22:16

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!

Beides ist falsch...
Man sollte vielleicht darauf verzichten zu prüfen, ob ein Zeiger größer/kleiner als der andere ist (i.A. ist das nicht deterministisch), aber auf Gleichheit zu prüfen ist kein Problem. Und Zeiger sind auch problemlos kopierbar. Sind schließlich nur 32Bit an Information.

@David_pb
Also ich weiß ja nicht, ob es so sinnvoll ist, einen alternativen Codepfad nur für den Fall zu erstellen, dass 4 Bytes nicht allokiert werden können. Und Exceptions aus dem Ctor zu schmeißen ist auch nichts sonderlich schlimmes...
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Werbeanzeige