PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Virtuelle Methoden und [] Operator



jancarsten
18-12-2005, 16:11
HI!

Ich versuche mich grad an einem C++ Programm bei dem ich virtuelle Methoden benutzen muss und den [] Operator überlade. Also das Programm sieht wie folgt aus:
Ich habe die Klasse BaseT. In dieser Klasse ist eine Liste und eine Virtuelle Methode(Print). Dann habe ich noch die Klassen StringT und IntT Klassen. Diese Klassen sind wiederum von der Klasse BaseT abgeleitet. In den Klassen StringT/IntT habe ich auch jeweils eine Virtuelle Methode Print(). In der main.cpp erzeuge ich erst einmal das Objekt "BaseT myCon";

Anschliesend speichere ich in dem Objekt myCon daten und zwar so:


myCon.setDataBack(IntT(1234));
myCon.setDataBack(StringT("TestString1"));
myCon.setDataBack(IntT(5678));
myCon.setDataBack(StringT("TestString2"));


So wie muss ich jetzt den Operator überladen das ich eben die Print Methode der jeweiligen vererbten Klassen StringT/IntT aufgerufen bekomme?

Vielleicht kann mir ja jemand helfen.

mfg JanCarsten

P.S. Hier das ganze Programm:

jancarsten
18-12-2005, 16:14
ups sorry hab das Programm vergessen ;)

jancarsten
18-12-2005, 17:18
Ich denke mal der Operator ist bei mir murks ;) Aber wie Überlade ich den Richtig?

locus vivendi
18-12-2005, 17:43
So wie muss ich jetzt den Operator überladen das ich eben die Print Methode der jeweiligen vererbten Klassen StringT/IntT aufgerufen bekomme?
Den hast du schon korrekt (*) überladen. Ich sehe aber noch nicht, wie das mit der "Print"-Funktion zusammenhängt - wo ist da dein Problem?

*: Ich würde evtl. noch den Parameter-Typ in ptrdiff_t ändern. Das ist nämlich der "Pseudo"-Typ für den []-Operator für eingebaute Arrays. Daran sollte man sich anlehnen wenn dem keine Gründe entgegenstehen. Außerdem würde ich mir überlegen eine Referenz auf die Objekte zurückzugeben.

jancarsten
18-12-2005, 17:49
.....überlegen eine Referenz auf die Objekte zurückzugeben.

Genau das will ich ja machen nur weiß ich noch nicht wie ich das machen soll ;)

jancarsten
18-12-2005, 17:53
Ich sehe aber noch nicht, wie das mit der "Print"-Funktion zusammenhängt - wo ist da dein Problem?

Ich möchte einfach in der Main die Print Methode aus der klasse StringT bzw. IntT benutzen und so die Daten ausgeben. So wie ich es jetzt in der Main habe, wird ja immer die Print Methode von der Klasse BaseT benutzt. Uns wurde gesagt das kann man mit virtual machen.

locus vivendi
18-12-2005, 18:34
Ich sehe aber noch nicht, wie das mit der "Print"-Funktion zusammenhängt - wo ist da dein Problem?

Ich möchte einfach in der Main die Print Methode aus der klasse StringT bzw. IntT benutzen und so die Daten ausgeben. So wie ich es jetzt in der Main habe, wird ja immer die Print Methode von der Klasse BaseT benutzt. Uns wurde gesagt das kann man mit virtual machen.
Dazu musst du auch Verweise speichern, und auch immer Verweise auf die fraglichen Objekte übergeben. Nur mit einer Änderung des []-Operators ist es also nicht getan. Ansonsten geschieht das Zurückgeben einer Referenz durch den []-Operator wie bei jeder "gewöhnlichen" Funktion.

P.S.
Referenzen kann man nicht in STL-Container speichern. Aber Pointer.

jancarsten
18-12-2005, 19:02
HI!

Oki dann werde ich wohl die Liste selbst Programmieren müssen. Das muss ich ja sowieso. Ich habe die STL Liste nur genommen um das Ganze mal schnell zu Testen ob das so funktioniert wie ich mir gedacht habe. Ich habe jetzt mal die liste rausgenommen und durch ein "*array[10]" ersetzt und siehe da es Funktioniert ^^

locus vivendi
18-12-2005, 19:15
Oki dann werde ich wohl die Liste selbst Programmieren müssen.
Warum das? std::list ist schon Okay. Bzw. vielleicht wäre sowas wie die Boost Pointer-Container-Bibliothek angebracht.

jancarsten
18-12-2005, 19:18
Sorry, habe ich wohl eben ein wenig misverständlich ausgedrückt. Sollen wir laut Aufgabenstellung so machen ;) Ich habe die STL::list nur genommen um mal schnell zu testen ob das ganze so Funktioniert wie ich es mir vorgeselt habe.

anda_skoa
19-12-2005, 14:16
Ich tippe auf slicing.

D.h. die Liste enthält Element vom Basistyp, beim Einfügen geht die zusätzliche Typinformation verloren.

Liste mit Pointern auf Basistype probieren

Ciao,
_