Ist ein CArray aus structs, welches ein union hat, bedenklich



  • Warum machst nicht einfach ne Struktur die einfach "id" und "lbl" enthält.



  • ............. schrieb:

    Ich denke das wissen die Leute aus dem C++ Unterforum besser.

    stimmt zwar, heißt aber nicht, dass wir das hier nicht wissen^^

    Dein Prob wird sein, dass das CString-Objekt 2 mal freigegeben wird. Unions mit Objekten sind meist auch nicht so wirklich sinnvoll.



  • Ich glaube, das Problem ist eher die Kombination aus union und C++-Klasse - der Compiler weiß einfach nicht, ob er beim Zerstören deiner Konstruktion den Destruktor von foo_lbl oder bar_lbl aufrufen soll (im zweiten Quelltext verwendet er beide).



  • @Pellaeon:

    Das ist nur gekürzter Pseude-Code. Im richtigen Code haben die structs des unions eine unterschiedliche Anzahl an membern.

    Aber ich glaube ich weiss jetzt woran es liegt. Und zwar am CString. Wenn ich CHAR* benutze passiert es nämlich auch nicht. Denn normaleweise beschwert sich ja der Compiler, wenn mam folgendes macht:

    union Bla 
    {
      CString str;
      int i;
    };
    

    Der Fehler lautet dann, dass ein union-member keinen Kopierkonstruktor haben darf.
    Deswegen denke ich, dass mein Versuch eine üble Umgehung dieses Compilerfehlers ist.



  • Dieser Thread wurde von Moderator/in estartu_de aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Was soll jemand im C++-Forum über CString und CArray wissen. 😕



  • @CStoll:

    damit bestätigt sich meine Vermutung. Danke.

    Jetzt denke ich auch, dass dieser Beitrag eher ins C++-Forum gehört, denn mit std::vector und std::string passiert das gleiche.



  • Redhead schrieb:

    Was soll jemand im C++-Forum über CString und CArray wissen. 😕

    Wo die Klassen herkommen ist doch egal, das Kernproblem geht um Unions



  • rat_suchender schrieb:

    Hallo,

    ist folgender Code falsch:

    struct Foo
    {
      BOOL is_foo;
      union
      {
        struct // if (is_foo)
        {
          int foo_id;
          CString foo_lbl;
        };
        struct // if (!is_foo)
        {
          int bar_id;
          CString bar_lbl;
        };
      };
    };
    
    CArray<Blubb, Blubb> arr; // liegt auf dem stack
    

    Ja, ist er.

    Nested Classes in einer anonymen Union sind nicht erlaubt (Standard: 9.5 Cl. 2).

    Und dann noch das eigentliche (9.5 Cl. 1)
    An object of a class with a nontrivial constructor (12.1), a nontrivial copy constructor (12.8), a nontrivial destructor (12.4), or a nontrivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an array of such objects.

    Nontrivial bedeutet dabei: selbst implementiert (und damit nicht compiler-generiert) - oder eines in der Klasse enthaltenen Objekte hat einen nicht-trivialen XXX (alle 4 Varianten einsetzen).



  • Pellaeon schrieb:

    Redhead schrieb:

    Was soll jemand im C++-Forum über CString und CArray wissen. 😕

    Wo die Klassen herkommen ist doch egal, das Kernproblem geht um Unions

    So sehe ich das auch. 🙂


Anmelden zum Antworten