Was ist Eleganter??



  • BorisDieKlinge schrieb:

    Base enthält basisparameter welche ich in manchen fällen ob A oder B travestieren möchte!

    du ziehst deinen variablen frauenkleider an?



  • ja entwickle ein Modesoftware für Travesiten 😃



  • (D)Evil schrieb:

    //...
    class System
    {
    	const std::size_t	m_countB; //konstant, aber nicht zur Compilezeit bekannt
    	const std::size_t	m_countA; //dito
    	base**				m_data[m_countB + m_countA]; //Ein Array von Zeigern auf Zeiger mit einer nicht zur Compilezeit bekannten Größe
    //...
    };
    

    ... du brauchst keinen std::vector in dem Fall ...

    Das stimmt, allerdings wolltest du wohl ein Array erzeugen, dass zur Laufzeit mit new erzeugt wird, oder? 😃

    //...
    class System
    {
        private:
             const size_t m_countB;
             const size_t m_countA;
             base **m_data;
        public:
             System(size_t a, size_t b) : m_countB(b), m_countA(a)
             {
                  m_data = new base*[a+b];
                  for(size_t i = 0; i < a; ++i)
                  {
                      m_data[i] = new A();
                  }
                  for(size_t i = a; i < a+b; ++i)
                  {
                      m_data[i+a] = new A();
                  }
             }
             ~System()
             {
                  for(size_t i = 0; i < m_countA + m_countB; ++i)
                  {
                       delete m_data[i];
                  }
                  delete[] m_data;
             }
    };
    

    Felix



  • Anfang: fragwürdiger Code mit std::vector<>.
    Status Quo: noch fragwürdigerer Code mit viel new und delete.
    Grosser Fortschritt.



  • ne, die anzahl der element bleibt constant...! ist also egal ob ich ein eigenes Array oder std:arry oder std:vector anlege....! grüße


  • Mod

    Ich verstehe überhaupt nicht, was das Ganze soll.



  • BorisDieKlinge schrieb:

    ne, die anzahl der element bleibt constant...! ist also egal ob ich ein eigenes Array oder std:arry oder std:vector anlege....! grüße

    Nicht wenn du es dynamisch anlegst.



  • es ist so, habe eine System, welche zwei unterschiedliche Modultypen, welche Basis Parameter enthalten! Die anzahl der modul Typen A und B werden beim start des Progammes fest definiert!

    Der Vorteil liegt darin das ich die gleiche Schleife /Iteratoren travesieren kann umd die basis parameter zu lesen!

    Und zur not kann ich zwei iteratoren anlegen, welche einmal die B teil und A teil des vector iterieren können!



  • aber muss dein System zeug wissen, mit was es da zu tun hat? gerade das ist ja der sinn von polymorphie.

    struct Base
    {
      virtual void foo() = 0;
    };
    
    struct A : public Base
    {
      void foo(){ cout << "A" << endl; }
      void bar(){ cout << "bar" << endl; }
    };
    
    struct B : public Base
    {
      void foo(){ cout << "B" << endl; }
    };
    
    struct System
    {
      vector<Base*> vec;
      Base* get(int index){ return vec[index]; }
      void doStuff()
      {
          for(vector<Base*>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
            (*iter)->foo();
      }
    };
    
    int main()
    {
        System s;
        s.vec.push_back(new A);
        s.vec.push_back(new B);
        s.doStuff();
        A* a = dynamic_cast<A*>(s.get(0));
        a->bar();
    }
    

    für aufrufende methoden mag es wichtig sein zu wissen, was fürn typ im vector steckt. dafür muss man sich halt den index merken o.ä. aber für System ists unwichtig.



  • ja die A und B sind nicht abwechseln gestaffelt, sonder ein feste anzahl A Module dann eine feste Anzahl B module!

    Um ein down-cast komm ich nicht drum rum, da ich bei bestimmten funktionen die erweiteren parameter von A bzw. B nutzen wille nicht nur die basis parameter!



  • thordk schrieb:

    aber muss dein System zeug wissen, mit was es da zu tun hat?...

    Manchmal schon.
    Ich würde anders herum sagen: WENN Dein System nicht unbedingt wissen muss, welcher Typ konkret vorliegt, DANN ist (Laufzeit-)Polymorphie das erste Mittel der Wahl. 😉

    Im konkreten Fall scheinen aber die Typen A und B nur unwesentlich miteinander verknüpft zu sein, so dass eine getrennte Handhabung sinnvoller ist.

    struct Schule {
       vector<Schueler> schueler;
       vector<Raum> raeume;
    };
    

    ... würde man ja auch nicht per Polymorphie in denselben vector pressen. 😃

    Gruß,

    Simon2.


Anmelden zum Antworten