Forum: PC-Programmierung [C++] überlanden von operator==()


von Steffan (Gast)


Lesenswert?

Ich möchte mir eine Art intelligenter Pointer schreiben.

Wenn ich für eine Klasse den Operator == überlade, kann ich in einer 
If-Abfrage ja
1
if ( myPointer == 0 )
schreiben.

Wenn ich jetzt aber nur
1
if ( myPointer )
schreibe, wird dann implizit operator==(0) aufgerufen?


Das soll also das Äquivalent zur Prüfung auf einen NULL-Pointer werden.

von Εrnst B. (ernst)


Lesenswert?

nein, dann wird der "operator bool()" aufgerufen, der ist aber wohl auch 
trivial zu überladen.

von Steffan (Gast)


Lesenswert?

ok, danke, ja der lässt sich natürlich auch leicht überladen.

von Bartli (Gast)


Lesenswert?

> Ich möchte mir eine Art intelligenter Pointer schreiben.

Was soll der den können, rein aus Interesse?

von Andreas K. (a-k)


Lesenswert?

Beispielsweise automatische Freigabe über reference count.

von Bartli (Gast)


Lesenswert?

Naja, was man beispielsweise mit einem Smartpointer machen kann, ist 
mir auch klar, aber wenn ich jetzt einen refcounted Pointer will, 
schreib ich den nicht unbedingt selber, sondern schau mir mal 
boost::shared_ptr bzw. tr1::shared_ptr an. Dann seh ich auch, dass die 
Tücke im Detail steckt.

Deshalb meine Frage: was soll das Dingens können, was verfügbare 
Smartpointer nicht können?

von Steffan (Gast)


Lesenswert?

Ich glaub, so einen Pointer denn ich benutzen will gibt es noch nicht ;)

Das ganze is Teil eines Spiels. Der Pointer soll auf eine Einheit auf 
einem bestimmten Kartenfeld zeigen. Über ++ und -- kann man dann nach 
bestimmten Kriterien über alle Einheiten auf dem Kartenfeld iterieren, 
da auf einem Feld mehreres existieren kann. z. B. ein Flugzeug, ein 
Fahrzeug und eine Straße.

von Εrnst B. (ernst)


Lesenswert?

Ah. So ein Konstrukt nennt man dann üblicherweise "Iterator", und nicht 
Pointer.

also in etwa sowas soll nachher gehen?
1
for (SpielfeldTyp::const_iterator it=meinSpielfeld.begin(); it != meinSpielfeld.end(); ++it) {
2
  it->do_something().
3
}
4
std::sort(meinSpielfeld.begin(),meinSpielfeld.end());
5
std::copy(meinSpielfeld.begin(),meinSpielfeld.end(),std::back_inserter(meinVector));
usw?

von Bartli (Gast)


Lesenswert?

Ja, halt sozusagen mit Filter.
Btw: Aus Sicht der stl-Algorithmen sind Pointer und Iteratoren dasselbe.

von Chris (Gast)


Lesenswert?

> nein, dann wird der "operator bool()" aufgerufen, der ist aber wohl auch
> trivial zu überladen.

Schön wär es, wenn C++ so einfach wäre. :-)

In dem Fall if(x) wird x in einen bool-Kontext konvertiert. Das kann 
mittels operator bool geschehen, muss es aber nicht. Es stellt sich 
sogar heraus, dass operator bool() zu überladen meistens keine so gute 
Idee ist, weil man das Objekt x dann in jedem Kontext implizit in einen 
bool konvertieren kann. Sowas wird dann zum Beispiel möglich:
int i = x;

Zuerst wird x implizit nach bool konvertiert, was dann implizit als int 
gedeutet wird. Dass das hier Blödsinn ist, ist dem C++-Compiler egal.

Die übliche, einfache Methode ist daher anstelle operator bool den 
operator void* zu überladen. Anstelle false gibt dieser operator 0 
zurück und anstelle true zum Beispiel den this-Zeiger. Dann funktioniert 
if(x) immer noch wie gewünscht, aber int i = x nicht mehr.

Damit geht man wenigstens den häufigsten Fallen aus dem Weg. Die 
void*-Methode hat allerdings immer noch (zum Teil recht subtile) 
Nachteile, weswegen kompliziertere Methoden existieren, wie zum Beispiel 
operator Foo* zu überladen, wobei Foo ein "versteckter" Typ ist (etwa 
eine innere Klasse im private-Teil der äußeren).

von Steffan (Gast)


Lesenswert?

Ich hab mittlerweile die Klasse implementiert. Mir is aufgefallen, dass 
es auch ohne Implementierung des Operators bool nicht zu einer undefined 
referenz kommt.

Ich hab zwar kein operator void* definiert, aber dafür operator 
cVehicle*, um den Iterator wieder in einen normalen Pointer casten zu 
können. Offenbar reicht dieser Operator aus, um die IF-Abfragen wie 
gewünscht verwenden zu können. Wie von Chris beschrieben, scheint dann 
zuerst implizit nach cVehicle* gecastet und der Pointer dann ganz normal 
als bool interpretiert zu werden.

Find ich jetzt persönlich etwas abenteuerlich, wie der Compiler sich 
hier was zurecht sucht, was passen könnte, aber solange die casts 
vernünftig definiert sind, sollte es ja keine Probleme geben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.