Array einer abstrakten Klasse



  • asc schrieb:

    // Verwendung
        // Hier zeige ich zwei Varianten, die erste wirst du als Anfänger besser
        // verstehen.
    
        // Verwendung, Variante 1: Über den Index
        for(int i=0, ende=nodes.size(); i<ende; ++i)
            nodes[i]->draw();
    
        // Verwendung, Variante 2: Über die Iteratoren
        // Ich werde hier keine komplette Iteratoreinführung schreiben, stell dir
        // einen Iterator als ein Element vor das die Position eines Containers
        // (wie std::vector) hält. Vorteil hierbei ist, das es auch mit Containern
        // funktioniert, die keinen Wahlfreien Zugriff per Index erlauben:
        for(std::vector<NodeC*>::iterator it=nodes.begin(), ende=nodes.end();
          it!=end; ++it)
            it->draw();
    
    }
    

    Wenn schon, denn schon..... 😃

    Variante 3: // prefer algorithms calls to hand-written loops (siehe: Scott Meyers, Effective STL, Item 43)

    for_each(nodes.begin(), nodes.end(), mem_fun(&Shape::draw));
    


  • jencas schrieb:

    Variante 3: // prefer algorithms calls to hand-written loops (siehe: Scott Meyers, Effective STL, Item 43)

    Das Item ist mir bekannt, nur das ich mem_fun & Co grundsätzlich nicht einsetze und boost::bind/std::tr1::bind noch nicht überall verfügbar sind.

    Zumal der OT erstmal das Konzept der Iteratoren grob verstehen sollte bevor ich ihn mit den Algorithmen plage 😉

    cu André



  • asc schrieb:

    Das Item ist mir bekannt, nur das ich mem_fun & Co grundsätzlich nicht einsetze und boost::bind/std::tr1::bind noch nicht überall verfügbar sind.

    Naja, zumindest diese Teile von Boost sind überall verfügbar wo der Entwickler einen USB-Anschluss/CD-Laufwerk/Internetanschluss zur Verfügung hat und Dateien ablegen darf.

    Dass man es in der Praxis trotzdem nicht jederzeit nutzen kann, ist mir allerdings klar 🙂



  • Hi,

    sorry habe mich schlecht ausgedruekt,meine eigentliche frage zum input operator war:
    wenn ich das hier habe

    nodes.push_back(new PolygonC());
    

    wie kann ich mit dem inputoperator auf nodes[0] zugreifen?
    ich dachte das hier funktioniert, aber tuts nich

    iss>>nodes[0];
    

    cu frank



  • frankne schrieb:

    Hi,

    sorry habe mich schlecht ausgedruekt,meine eigentliche frage zum input operator war:
    wenn ich das hier habe

    nodes.push_back(new PolygonC());
    

    wie kann ich mit dem inputoperator auf nodes[0] zugreifen?
    ich dachte das hier funktioniert, aber tuts nich

    iss>>nodes[0];
    

    cu frank

    Neee, das geht so nicht. Schau Dir mal das Beispiel hier an: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1613800.html#1613800 (im unteren Teil des Beitrags!)



  • frankne schrieb:

    nodes.push_back(new PolygonC());
        ...
        iss>>nodes[0];
    

    nodes[0] gibt, da du Zeiger hälst auch einen eben solchen zurück. Und ich nehme einfach mal an das dein Operator für Objekte, nicht für Zeiger definitert ist 😉 (Zudem würde ich diesen wenn für den Basisklassenzeiger definieren, und diesen eine virtuelle Funktion aufrufen lassen).



  • danke für die hilfe, aber bin ich etwas durch durcheinander. du meinst ich soll

    iss>>*nodes[0]
    

    verwenden und dann eine virtuelle funktion des operator>> in der basisklasse NodeC zur verfügungstellen?
    etwa so?

    class NodeC{
    	public:
    		virtual void draw()=0;
    		virtual istream& operator>>(istream& s, NodeC& p)=0;
    		virtual ~NodeC()=0;	
    };
    

    da kommt der fehler:

    NodeC.h `std::istream& NodeC::operator>>(std::istream&, NodeC&)' must take exactly one argument



  • frankne schrieb:

    nodes.push_back(new PolygonC());
    

    Bist du sicher, dass du die Objekte im Vector dynamisch speichern willst? Container nehmen dir unter anderem diese Arbeit ab. Falls Objekte anstelle von Zeigern auch reichen (weil zum Beispiel der Typ vollständig bekannt ist), empfehle ich sie dir auch. So musst du auf jeden Fall immer an delete denken.

    frankne schrieb:

    etwa so?
    [...]
    da kommt der fehler: [...]

    Ich würde den operator>> als globale Funktion deklarieren. Wenn du ihn in der Klasse deklarierst, ist das erste Argument implizit eine Instanz dieser Klasse.



  • Nexus schrieb:

    Bist du sicher, dass du die Objekte im Vector dynamisch speichern willst?

    Nach seiner Beschreibung würde ich sagen: Ja, da er explizit unterschiedliche Objekte ablegt.

    cu André



  • asc schrieb:

    Nach seiner Beschreibung würde ich sagen: Ja, da er explizit unterschiedliche Objekte ablegt.

    Stimmt, da hast du Recht. Ich dachte nicht mehr daran, dass Polymorphie im Spiel ist.



  • Nexus schrieb:

    asc schrieb:

    Nach seiner Beschreibung würde ich sagen: Ja, da er explizit unterschiedliche Objekte ablegt.

    Stimmt, da hast du Recht. Ich dachte nicht mehr daran, dass Polymorphie im Spiel ist.

    Wobei ich die Performance hintenan stelle und in Vektoren trotz allen "Overheads" lieber die shared_ptr verwende 😉

    Aber ich glaube wir sollten den OT damit erst belasten wenn er den Rest komplett verarbeitet hat...


Anmelden zum Antworten