Kleine Frage



  • Ncoheinmal eine kleine Berichtigung:

    1. Warum funktioniert der Code hier nicht:
    2. Wie kann ich bei auf das secondElement der dTile zugreifen?
    m.map_[0] --> is ja dTile

    Fehlermeldung:

    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void __thiscall Tile::print(void)" (?print@Tile@@UAEXXZ)".
    

    --> Soweit ich weiß, muss man den ganzen Spaß dann casten?

    #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];

    m.map_[0] = new dTile;
    m.map_[1] = new udTile;

    m.map_[0]->print();
    m.map_[1]->print();

    // delte!!!!

    std::wcin.get();
    return 0;
    }



  • 1.) Was genau geht nicht? Kompilerfehler? Wird nichts ausgegeben?
    2.) Warum haben deine Membervariabeln alle underscores("_") am Ende des Bezeichners?

    grz



  • Du must Tile::print noch deklarieren:

    class Tile
    {
    public:
    int firstID_;
    
    public:
    virtual void print(void)
    //here comes da boom
    {}
    //feddisch ;)
    
    };
    

    /EDIT: ok so war das gemeint ->erledigt



  • 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 dTile

    Wie 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
    destroyable

    ausgibt

    normalerweise sollte er mir ja:

    destroyable
    undestroyable

    ausgeben



  • 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
    destroyable

    ausgibt

    normalerweise sollte er mir ja:

    destroyable
    undestroyable

    ausgeben

    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).


Anmelden zum Antworten