Klassen, structs, unions



  • Hallo zusammen,
    ich habe ein paar Fragen bezüglich Klassen, Structs und Unions.

    1.) Man könnte ja eine Klasse definieren und dann einfach den Namen "class" durch "struct" ersetzen. Ich weiß, dass beim struct
    alle Elemente standartgemäß als öffentlich deklariert werden, um die Schnittstelle zu C zu wahren. Doch wo würden andere Unterschiede liegen.
    Kennt ein struct sowas wie Vererbung und Polymorphie oder liegen hier die Privilegien einer Klasse?

    2.) Wenn ich zwei Objekte einer Klasse anlege, dann wird nicht zweimal der gleiche Maschinencode angelegt (so wie ich eigentlich
    erwartet habe). Ich kann mir das aber nicht so ganz vorstellen, da die beiden Objekte ja eigentlich unabhängig voneinander sind. Teilen die Objekte
    sich den Code oder wie läuft das?

    Vielen Dank für eure Hilfe
    lg, freakC++



  • 1. Nein. struct hat den gleichen Umfang an Möglichkeiten, wie class. Neben dem standardmässigen public gibt es auch noch die standardmässige public Vererbung, welche bei Klassen (wenn nichts angegeben) private ist.

    2. Ich verstehe nicht ganz, was du da meinst.. Am Ende im Speicher sind Objekte lediglich ein paar Stellen nebeneinandern, wo die Daten liegen. Die Memberfunktionen sind grundsätzlich gleich, wie in C, ausser, dass du da keinen Zeiger auf das Objekt mitgeben musst. (explizit).



    1. Das hat man schneller ausprobiert als einen Post hierher geschrieben.
      struct IST EINE class, nur mit default-public sollte doch eigentlich alles sagen.

    2. Die Member liegen in separaten Speicherstellen, Methoden existieren pro Klasse nur einmal (wäre ja Verschwendung, für jedes Objekt auch die Methoden eigens im RAM abzulegen...)



  • ok, vielen Dank schonmal.

    Also gibt es eigentlich keinen großen Unterschied zwischen struct und class (außer bei der default Sichtbarkeit)?

    Vielen Dank
    lg, freakC++



  • freakC++ schrieb:

    ok, vielen Dank schonmal.

    Also gibt es eigentlich keinen großen Unterschied zwischen struct und class (außer bei der default Sichtbarkeit)?

    Vielen Dank
    lg, freakC++

    Nein.



  • drakon schrieb:

    freakC++ schrieb:

    ok, vielen Dank schonmal.

    Also gibt es eigentlich keinen großen Unterschied zwischen struct und class (außer bei der default Sichtbarkeit)?

    Vielen Dank
    lg, freakC++

    Nein.

    2 (zugegeben ziemlich kleine) würden mir noch einfallen ;P
    bei der forward-deklaration kann man nicht beides mischen

    struct foo;
    
    /*...*/
    
    class foo{ /*...*/ }; //fail...
    

    bei templates kann man class schreiben aber nicht struct .
    mehr sollte es aber nicht geben!?

    bb



  • unskilled schrieb:

    2 (zugegeben ziemlich kleine) würden mir noch einfallen ;P
    bei der forward-deklaration kann man nicht beides mischen

    struct foo;
    
    /*...*/
    
    class foo{ /*...*/ }; //fail...
    

    Sicher? - Mit Visual Studio geht das. Könnte sein, dass das ein Feature von Visual Studio ist, obwohl ich das normalerweise abgeschalten habe.. *nachschau*..Ja, sogar, wenn Spracherweiterungen aus sind, bekomme ich lediglich eine Warning. Bin jetzt aber zu Müde, um das noch im Standard nachzuschlagen. 😉 - Aber ich hatte sowieso auch im Kopf, dass das mischen sogar erlaubt ist.

    OK. Das class bei den templates hat so ziemlich eine andere semantische Bedeutung.

    Ich glaube ich hatte mal etwas von wegen alignmend oder padding gesehen, was bei struct und class anderst gehandhabt wird. Weiss aber nicht mehr genau, was es war.. Auf jeden Fall nicht von grosser Bedeutung.



  • Streng genommen sind in C++ sowohl union als auch class und struct Klassentypen. Hier meine Meinung, was ungefähr wie einzusetzen ist:

    • In C++ kommt union kaum zur Geltung, da es nur mit PODs funktioniert, nicht gerade sehr typsicher ist und die Funktionalität eher selten gebraucht wird. In vielen Fällen existieren bessere Alternativen (ich meine jetzt nicht nur boost::variant ).
    • class handhaben eigentlich alle C++-Programmierer als das, was man üblicherweise unter Klassen versteht (z.B. Kapselung, Konstruktoren/Destruktoren, Methoden, Vererbung, Polymorphie).
    • struct wird meist als reines Datenbündel eingesetzt, also ähnlich wie in C. Ich selbst füge immer Konstruktoren hinzu, um eine Initialisierung sicherzustellen. Andere typisch objektorientierte Features setze ich bei struct s hingegen nicht ein.


  • Das halte ich so ähnlich.



  • drakon schrieb:

    unskilled schrieb:

    2 (zugegeben ziemlich kleine) würden mir noch einfallen ;P
    bei der forward-deklaration kann man nicht beides mischen

    struct foo;
    
    /*...*/
    
    class foo{ /*...*/ }; //fail...
    

    Sicher?

    Bis gerade eben schon xD
    Aber jz beim Testen hab ich auch nur noch die Warning - hab ich mich wohl wirklich geirrt, weil ich auf anhieb jz nix gefunden habe, wo steht, dass das nen problem geben würde...
    vll hab ich ja morgen mal lange weile - dann guck ich mal im standard, ob ich iwas dazu find^^

    bb



  • Hey,
    vielen Dank noch für die späte Hilfe. Ich persönlich habe noch nie mit unions gearbeitet und werde wahrscheinlich erstmal weiterhin mit struct und class herumtwerkeln.

    Bis bald!
    lg, freakC++



  • Zugegeben. Ich habe bist jetzt union ausserhalb von Tests noch nie ernsthaft gebraucht..


Anmelden zum Antworten