std::vector



  • #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class a
    {
        public:
        virtual void dothat(a& x)
        {
            cout << " basis " << endl;
        }
    };
    class b: public a
    {
        public:
    
        void dothat(a& x)
        {
            cout << " basis " << endl;
        }
        void dothat( b& x)
        {
            cout << "abgeleitet" << endl;
        }
    };
    
    int main()
    {
        std::vector<a*> v;
        v.push_back(new a);
        v.push_back(new b);
        v[0]->dothat((*v[0]));
        v[0]->dothat((*v[1]));
        v[1]->dothat((*v[0]));
        v[1]->dothat((*v[1]));
    
        return 0;
    }
    

    was ich eigentlich möchte ist dass die im vector enthaltenen b´s beim aufruf ein anderes b erkennen und "abgeleitet" ausgeben;
    da der vector aber vom typ a* ist scheint dass nicht zu funktionieren, wuie ikann man es dennoch zum laufen bringen? 👍

    //Codetags repariert



  • gasst schrieb:

    was ich eigentlich möchte ist dass die im vector enthaltenen b´s beim aufruf ein anderes b erkennen und "abgeleitet" ausgeben;
    da der vector aber vom typ a* ist scheint dass nicht zu funktionieren, wuie ikann man es dennoch zum laufen bringen? 👍

    Es gibt mehrere Lösungsansätze, wobei es dann abhängig von der eigentlichen Aufgabenstellung ist, was wirklich passieren soll.

    1. Verwendung von RTTI, typeid und dynamic_cast; Wobei ich das eigentlich vermeide.
    2. Änderung der Schnittstelle...

    class a
    {
        protected:
            virtual void dothat_()
            {
                cout << " basis " << endl;
            }
    
        public:
            void dothat(a& x)
            {
                // Ich nehme mal an das die Funktion von x abhängen soll...
                x.dothat_();
            }
    };
    
    class b: public a
    {
        protected:
            virtual void dothat_()
            {
                cout << "abgeleitet" << endl;
            }
    };
    

    Es gibt sicherlich noch weitere Lösungen.

    cu André



  • es soll sich um eine kollisionsroutine handeln,
    ein alienshooter , marines gegen aliens,
    basisklasse : objekt
    abgeleitet : alien
    marine
    wand
    rakete
    bisher hatte ich es so:
    jedes element soll überprüfen ob es bei seiner nächsten bewegung mit einem anderen kollidieren würde, falls ja soll es richtung ändern;
    war gedacht um zu verhindern dass meine aliens gegen oder in wände laufen;
    das problem :
    sie weichen jetz auch raketen aus und um gekehrt, und meine wände bleiben auch nur stehen weil sie keine geschwindigkeit haben 🙂

    was ich nun möchte ist eine funktion die anhand des objekts mit dem es kollidieren würde weiß was es zu tun hat;
    zB alien... ist das objeckt eine wand -> weiche aus
    ist das objekt eine rakete -> laufe weiter
    diese funktion überprüft ob im nächsten schritt eine kollision stattfinden würde, neben der gibt es eine funktion die aufgetretene kollisionen managt,
    zB rakete kollidiert mit alien - > zerstört beide

    im mom befinden sich sowohl meine aliens als auch meine anderen objekte in einem vector <objekt* >



  • Gib ihnen doch einfach einen Typ mit, der in der Basisklasse definiert ist. Das setzt du dann im jeweiligen Konstruktor. So kannst du dann entscheiden was zu tun ist.

    enum ObjectType{
      OT_NONE = -1,
      OT_MARINE,
      OT_ALIEN,
      OT_ROCKET,
      OT_LAST
    };
    
    class Base{
      ObjectType mType;
    };
    

    Oder aber:

    class Base{
      virtual void collideWith(Base *b) = 0;
      virtual void collideWithAlien(Base *b) = 0;
      virtual void collideWithRocket(Base *b) = 0;
    };
    
    class Alien{
      virtual void collideWith(Base *b){
        b->collideWithAlien(b);
      }
    };
    

    Nicht wirklich schick, da Base so jedesmal um eine Funktion erweitert werden müsste, wenn eine Unterklasse hinzukommt, funzt aber. 😉



  • google mal nach "multiple dispatch", das ist genau das worum es hier geht: Polymorphes Verhalten in Abhängigkeit von mehr als einem dynamischen Typ.
    Gleich vorweg: das ist kein leichtes Thema, man kanns brute-force lösen, was aber fehleranfällig und tipp-aufwändig sein kann. Es gibt auch Möglichkeiten für elegantere Lösungen, die dafür recht kompliziert sein können.
    In Alexandrescu's Modern C++ Design gibts ein ganzes Kapitel zum Thema mit verschiedenen Lösungsansätzen...



  • hat jemand einen guten literaturtipp?

    ich bräuchte mal n buch dass sich im leicht fortsgeschrittenen bereich bewegt;
    alle bücher die ich bisher hab, fangen mit "was ist c++" an und die anderen mit themen wie netzwetrkprogrammierung womit ich noch total überfordet bin

    ausserdem falls einer erfahrung hat, wie schwer ist es seinen programmierschatz ausgängig von c++ auf c# noch zu erweitern ?



  • gasst schrieb:

    hat jemand einen guten literaturtipp?

    ich bräuchte mal n buch dass sich im leicht fortsgeschrittenen bereich bewegt;
    alle bücher die ich bisher hab, fangen mit "was ist c++" an und die anderen mit themen wie netzwetrkprogrammierung womit ich noch total überfordet bin

    pumuckl hat da ja schon was genannt. Und im FAQ findest du da auch einiges, aber ich würde mal sagen, dass dir Effektiv C++ von Scott Meyers zusagen könnte.


Anmelden zum Antworten