Kleine Frage
-
Ich habe jetzt den Kompilkierfehlerbehoben, habe aber noch folgende Probleme:
1. Die Ausgabe sagt mir 2x destroyable (obwohl sie einmal undestroyable sagen sollte) 2. Wie kann ich m.map_ auf secondID_ zugreifen? #include <iostream> class Tile { public: int firstID_; public: virtual void print(void) = 0; }; class udTile : public Tile { public: void print(void) { std::wcout << L"destroyable tile\n"; } }; class dTile : public Tile { public: int secondID_; public: void print(void) { std::wcout << L"destroyable tile\n"; } }; class Map { public: Tile** map_; }; int main(void) { Map m; m.map_ = new Tile*[10]; m.map_[0] = new dTile; m.map_[1] = new udTile; m.map_[0]->print(); m.map_[1]->print(); // delte!!!! std::wcin.get(); return 0; }
-
BigF schrieb:
1. Warum funktioniert der Code hier nicht:
Entweder du machst die print()-Methode in der Basisklasse abstrakt ("virtual void print()[u]=0;") oder du spendierst ihr einen Funktionsrumpf - über alles andere wird sich der Linker beschweren.
2. Wie kann ich bei auf das secondElement der dTile zugreifen?
m.map_[0] --> is ja dTileWie du richtig erkannst hast, mußt du das casten:
if(dynamic_cast<dTile*>(n.map_[0])) wcout<<dynamic_cast<dTile*>(n.map_[0])->secondID_;(wenn du dir sicher bist, kannst du die if()-Abfrage auch weglassen)
-
Nun stellt sich aber für mich die Frage, warum der mir
destroyable
destroyableausgibt
normalerweise sollte er mir ja:
destroyable
undestroyableausgeben
-
CStoll schrieb:
if(dynamic_cast<dTile*>(n.map_[0])) wcout<<dynamic_cast<dTile*>(n.map_[0])->secondID_;(wenn du dir sicher bist, kannst du die if()-Abfrage auch weglassen)
...und meines wissens gleich das schnellere static_cast verwenden (aber sei dir sicher mein junger Padawan!)
-
Sry, fehler von der Firma....
Ich aheb mich im String veraschrieben, aber Danke für die schnelle Hilfe!
-
BigF schrieb:
Nun stellt sich aber für mich die Frage, warum der mir
destroyable
destroyableausgibt
normalerweise sollte er mir ja:
destroyable
undestroyableausgeben
1. denken
2. posten->beide klassen, die du abgeleitet hast, geben destroyable aus. so einfach.
-
Aber mal noch eine andere Frage: wie sollte ich das alles richtig delten?
muss man dafür verschachtelte Schleifen verwenden?
-
doppelpost
-
#include <iostream> class Tile { public: int firstID_; public: virtual void print(void); }; class udTile : public Tile { public: void print(void) { std::wcout << L"destroyable tile\n"; } }; class dTile : public Tile { public: int secondID_; public: void print(void) { std::wcout << L"destroyable tile\n"; } }; class Map { public: Tile** map_; }; int main(void) { Map m; m.map_ = new Tile*[10]; //alle zeiger für spätere überprüfung auf 0 setzen for(i=0; i<10; i++) { m.map_[i] = 0; } m.map_[0] = new dTile; m.map_[1] = new udTile; m.map_[0].print(); m.map_[1].print(); // delte!!!! for(i=0; i<10; i++) { if(m.map_[i]) //wurde was initialisiert? delete m.map_[i]; } std::wcin.get(); return 0; }
-
BigF schrieb:
Aber mal noch eine andere Frage: wie sollte ich das alles richtig delten?
Kurz: Alles, was du mit new angelegt hast, solltest du mit delete wieder freigeben:
delete n.map_[1]; delete n.map_[0]; delete[] n.map_;(aber noch besser solltest du der Klasse Map einen Destruktor mitgeben, der sie aufräumt (und einen Elementzähler, damit sie weiß, wieviele Elemente sie beseitigen muß)).
PS: Und noch besser ist es, du nimmst statt Eigenentwicklungen einen std::vector<> (in der Boost-Bibliothek gibt es afaik auch Pointer-Vektoren).