Operatorüberladung
-
Hi,
ich würde gerne Operatoren überladen um schlussendlich folgendes zu ermöglichen:
Values vals; vals[0] = new ValueObject("myValue"); std::cout << vals[0]->getValue() << std::endl;Ich habe auch schon fast alles geschafft. Aber es scheitert daran so etwas zu machen:
vals[0] = new ValueObject("...);Den Indexoperator habe ich bereits überladen. Nun müsste ich vermutlich noch den Zuweisungsoperator überladen, aber das scheint in Verbindung mit dem Indexoperator sehr schwierig zu sein. Ist das überhaupt möglich? Wenn ja, wie mache ich das?
Danke :xmas2:
-
Dazu müsste man wissen, welchen Typ der Indexoperator [] zurückgibt. Eigentlich sollte dieser nämlich einen öffentlichen Zuweisungsoperator besitzen.
Was geht denn überhaupt nicht? Gewöhn dir immer gleich an, die Fehlermeldung anzugeben.
-
Nexus schrieb:
Dazu müsste man wissen, welchen Typ der Indexoperator [] zurückgibt. Eigentlich sollte dieser nämlich einen öffentlichen Zuweisungsoperator besitzen.
Was geht denn überhaupt nicht? Gewöhn dir immer gleich an, die Fehlermeldung anzugeben.
Der Indexoperator gibt ein
ValueObject *zurück und ist in der Klasse deklariert worden. Ist das falsch? Muss er da raus? Das Problem ist nämlich, wenn ich versuche einen Zuweisungsoperator zu deklarieren, dann wird dieser nie aufgerufen. Außer ich rufe ihn explizit auf:vals[0].operator=(ValueObject("blub"));
-
Muhhh schrieb:
Der Indexoperator [...] ist in der Klasse deklariert worden. Ist das falsch? Muss er da raus?
Nein, das ist schon okay so. Der
operator[]muss in der Klasse deklariert sein.Muhhh schrieb:
Das Problem ist nämlich, wenn ich versuche einen Zuweisungsoperator zu deklarieren, dann wird dieser nie aufgerufen.
Du weist ja einen Zeiger zu. Für skalare Datentypen kannst du keine Operatoren überladen. Du musst also nichts tun, der Zeiger wird automatisch zugewiesen.
Was geht denn eigentlich nicht?
-
der op[] gibt nen zeiger zurück? wäre nicht toll. besser, er gibt ne referenz auf nen zeiger zurück.
-
Es gibt einfach nur folgendes Problem:
Ich müsste sowas machen:
`delete vals[0];
vals[0] = new Object("blub...");`
Ich dachte mir ich könnte die Klasse so entwefen das sie dies automatisch erledigt. Allerdings scheint das nicht so zu klappen...
-
Muhhh schrieb:
Ich dachte mir ich könnte die Klasse so entwefen das sie dies automatisch erledigt. Allerdings scheint das nicht so zu klappen...
ich befürchte, ich habe mal sowas ähnliches gesehen:
struct Proxy { ValueObject* data; operator ValueObject*() { return data; } Proxy operator=(ValueObject* nd) { delete data; data=nd; } }; Proxy Value::operator[](size_t index) { return Proxy(data[index]); }
-
Muhhh schrieb:
Ich dachte mir ich könnte die Klasse so entwefen das sie dies automatisch erledigt. Allerdings scheint das nicht so zu klappen...
Du kannst der Klasse auch Memberfunktionen hinzufügen, die das für dich automatisch erledigen.
-
Nexus schrieb:
Muhhh schrieb:
Ich dachte mir ich könnte die Klasse so entwefen das sie dies automatisch erledigt. Allerdings scheint das nicht so zu klappen...
Du kannst der Klasse auch Memberfunktionen hinzufügen, die das für dich automatisch erledigen.
ich habe nun die zwei Memberfunktionen
getAt(unsigned int pos)undsetAt(unsigned int pos, NewValue)geschrieben. So ist es glaube besser verständlich und sauberer, oder?
-
#include <vector> using std::vector; class Values { public: ValueObject *&operator [] (unsigned pos) { if (pos >= vec.size()) vec.resize(pos + 1); return vec[pos]; } priavte: vector<ValueObject *> vec; };