Objekt typ rausfinden über die basis klasse!!



  • MFK schrieb:

    Meist ist aber die Tatsache, dass du das überhaupt herausfinden musst (oder glaubst, das zu müssen), ein Indiz für ein schlechtes Design.

    kannst du das begründen?



  • Pasuchal sagen, das es falsch ist, ist falsch. 😉 Vielleicht hat es einen Grund, das er vergleichen will?

    Andererseits sollte man ihn erstmal fragen, WARUM er vergleichen will? Dann kommt vielleicht ans Tageslicht, ob er ein falsches Design hat und die Sache falsch angeht.



  • net schrieb:

    MFK schrieb:

    Meist ist aber die Tatsache, dass du das überhaupt herausfinden musst (oder glaubst, das zu müssen), ein Indiz für ein schlechtes Design.

    kannst du das begründen?

    Weil es in C++ fricklig ist (instanceof gibt's ja nicht), ergo schlechtes Design 😃 😉



  • naja ... in dem Array sind die B objekte und C objekte immer im wechsel drin...

    über den Index kann ich natürlich rausfinden ob es ein B oder C objekt ist

    ist dient nur zu sicherheit um ein fehler anzuziegen falls das array druch irgend ein grund falsc strukturiert wird, um im vorfeld den fehler abzufangen!

    es gibt imm unvorhersehbare problem welcher den speicehrbereih des array manipulieren könnten...

    kurz gesagt, die B objekte sind immer ungerade indizies und C gerade, und will trozdme nochmal checken ob es auch wirklich der typ ist...



  • GPC schrieb:

    net schrieb:

    MFK schrieb:

    Meist ist aber die Tatsache, dass du das überhaupt herausfinden musst (oder glaubst, das zu müssen), ein Indiz für ein schlechtes Design.

    kannst du das begründen?

    Weil es in C++ fricklig ist (instanceof gibt's ja nicht), ergo schlechtes Design 😃 😉

    aha, und wenn einer in C objektorientiert codet ist das auch schlechtes design? 😉
    na denn...



  • Artchi schrieb:

    Pasuchal sagen, das es falsch ist, ist falsch. 😉

    Genau. Deswegen sagte ich "meist" und "Indiz" 😉

    BorisDieKlinge schrieb:

    naja ... in dem Array sind die B objekte und C objekte immer im wechsel drin...

    Du hast aber hoffentlich nicht B und C nur deswegen von A abgeleitet, damit du sie gemeinsam in dieses Array packen kannst, oder?



  • MFK schrieb:

    Du hast aber hoffentlich nicht B und C nur deswegen von A abgeleitet, damit du sie gemeinsam in dieses Array packen kannst, oder?

    mal angenommen, man möchte das aber unbedingt so haben (alles objekte in einem array, liste, etc.). gibt es denn eine andere möglichkeit als vererbung?
    alles als void* zu speichern ist ja noch blöder...



  • ja ein meinem fall will ich zwei verscheidne typen in einem array speichern!!



  • BorisDieKlinge ist ein Frickler der allerübelsten Sorte.



  • net schrieb:

    MFK schrieb:

    Du hast aber hoffentlich nicht B und C nur deswegen von A abgeleitet, damit du sie gemeinsam in dieses Array packen kannst, oder?

    mal angenommen, man möchte das aber unbedingt so haben (alles objekte in einem array, liste, etc.). gibt es denn eine andere möglichkeit als vererbung?
    alles als void* zu speichern ist ja noch blöder...

    Man kann sich mal eben was zusammenhacken:

    struct AorB {
       enum {typeA, typeB} type;
    
       AorB (A const & a)
          : type (typeA)
          , b (0)
       {
          new (memory) A (a);
          this->a = reinterpret_cast<A*>(memory);
       }
    
       AorB (B const & b)
          : type (typeB)
          , a (0)
       {
          new (memory) B (b);
          this->b = reinterpret_cast<B*>(memory);
       }
    
       ~AorB ()
       {
          if (type == typeA)
             a->~A();
          else
             b->~B();
       }
    
       AorB & operator = (A const & a);
       AorB & operator = (B const & B);
    
       AorB (AorB cosnt &); 
       AorB & operator = (AorB cosnt &); 
    private:
       char memory [sizeof(A)>sizeof(B)?sizeof(A):sizeof(B)];
       A * a;
       B * b;
    };
    

    oder man nimmt boost::any oder die beste Möglichkeit: boost::variant.



  • Helium schrieb:

    Man kann sich mal eben was zusammenhacken:

    hehe, lustiger trick mit diesem 'placement new' usw. 😉
    hast du dir das mal eben selbst ausgedacht oder wird sowas allgemein in c++ so gemacht?
    naja, ist wohl umständlich zu erweitern, wenn noch 'ne dritte oder vierte klasse dazu soll...

    Helium schrieb:

    oder man nimmt boost::any oder die beste Möglichkeit: boost::variant.

    ich will ja nicht wissen, wie *das* gehackt ist 😃



  • net schrieb:

    hast du dir das mal eben selbst ausgedacht oder wird sowas allgemein in c++ so gemacht?

    Ich hatte mir irgendwann mal überlegt, wie man genau das hier besprochene Problem lösen könnte. Erst hatte ich 'ne union, aber die funktioniert ja nur mit primitiven Typen, und dann ist mir eben das eingefallen. Natürlich hatte ich mir das als Template gebaut, statt mit den konkreten Typen A und B.
    (Da gabs noch kein boost::variant.)

    Aber allgemein würde ich vorschlagen einfach boost::variant zu verwenden.



  • Helium schrieb:

    Aber allgemein würde ich vorschlagen einfach boost::variant zu verwenden.

    oder diese eingebauten features 'dynamic_cast' und 'typeid' ...



  • net schrieb:

    Helium schrieb:

    Aber allgemein würde ich vorschlagen einfach boost::variant zu verwenden.

    oder diese eingebauten features 'dynamic_cast' und 'typeid' ...

    Du solltest dir erstmal anschauen was boost::variant ist. Zu boost::any würde deine Aussage bedingt passen, aber zu boost::variant nicht.

    boost::any ist nicht gehackt, es ist sehr sauber und typsicher implementiert.

    Edit:

    Zu empfehlen ist folgendes Buch

    Beyond the C++ Standard Library | ISBN: 0321133544



  • was ist ein Frickler ??? ->KennerDerKlinge



  • ein Frickler ist jemand der frickelt. Frickeln bedeutet zurechtbasteln.


Anmelden zum Antworten