Effektiver Einsatz von Struct,Klassen...etc...



  • Hallo Leute,

    meine Frage ist nicht zur Syntax von irgendwelchem Code, sondern zum sinnvollen Einsatz von Sachen!

    Zum Beispiel, wann ist es Sinnvoll ein Struct zu verwenden?(Beispiel)
    Eine Klasse??
    Wer hat da gute Tipps etc??

    Danke schonmal im voraus!



  • Also ich habe den Eindruck, dass sich über dieses Thema viel gestritten wird.

    Ist in gewisser Weise auch eine Stilfrage.
    Structs werden manchmal verwendet, wenn man _nur_ Datenelemente und keine Methoden hat (Bequemlichkeit, da Datenelemente bei struct standardmäßig public sind, im Gegensatz zur Klasse, wo private Standard ist => d.h. man spart sich hier also das Tippen von "public:").
    In diesem Fall möchte man womöglich dem Code-Leser bzw. Nachbearbeiter auch sagen, dass die Struktur keine besonders große Aufgabe hat (eben außer Daten zu halten).

    Ansonsten wird wohl im Regelfall "class" verwendet. Es gibt auch Leute, die ausschließlich "class" verwenden.

    Ich denke die speicher- und perfomancetechnischen Aspekte (falls nennenswerte existieren), können dir andere besser erklären :).



  • Strukturen und Klassen sind identisch, bis auf den Unterschied, den simon.phoenix schon angesprochen hatte (struct: public, class: private).
    Bsp:

    struct Adresse
    {
        std::string Strasse;
        int Nr;
        int PLZ;
        std::string Ort;
    };
    
    class Adressbuch
    {
    public:
        void Hinzufuegen(Adresse A);
        void Entfernen(Adresse A);
        std::list<Adresse> SucheEintraege(Adresse A);
        void usw();
    };
    


  • Ich verwende structs immer genau dann, wenn ich Datenelemente habe, aber keine Zugriffskontrolle (private/protected) brauche. structs sind also meistens dumme Datenhalter, können aber auch ein paar Hilfsfunktionen beinhalten. Eine einheitliche Richtlinie oder "echte" Unterschiede zwischen struct und class gibt es aber nicht.

    Für sonstige Richtlinien gibt es seit kurzem das Buch C++ Coding Style (oder so, ich glaube noch nicht auf Deutsch) und vom selben Autor die Guru of the Week-Schnipsel auf http://www.gotw.ca/. Da kann man einige Faustregeln draus lernen.



  • @Anwendungsgebiet
    struct nutzt man zB für PODs. Da in C++ struct und class das gleiche ist (bis auf das default public / private), kann man auch nicht sagen, das eine ist richtiger oder das andere ist falscher. Grundsätzlich kannst du class verwenden, wenn es sich um ein richtiges Objekt handelt, ansonsten struct. Ausnahmen bestätigen auch hier die Regel.



  • Die frage muesste also eigentlich lauten ....

    Wann verwende ich am besten eine Klasse mit gekapselten Daten (hier sollte man class verwenden), und wann eine unkontrollierte Ansammlung von PODS(hier sollte man struct nehmen)?

    Ciao ...



  • RHBaum schrieb:

    Die frage muesste also eigentlich lauten ....

    Wann verwende ich am besten eine Klasse mit gekapselten Daten (hier sollte man class verwenden), und wann eine unkontrollierte Ansammlung von PODS(hier sollte man struct nehmen)?

    Ciao ...

    Somit könnte man sagen:

    Jeder, der das Open-Closed-Prinzip beachtet, braucht keine structs 🙄. Somit dürften die meisten keine brauchen.
    Außer man will auf die schnelle was reinhacken und langfristiges Design ist egal :D.



  • simon.phoenix schrieb:

    Jeder, der das Open-Closed-Prinzip beachtet, braucht keine structs 🙄. Somit dürften die meisten keine brauchen.

    Was natürlich blödsinn ist. Weil man manchmal eben keine Klasse sondern nur eine Sammlung von Daten hat. und da sind structs (also im sinne von: alles public, keine/kaum methoden) durchaus sinnvoll.



  • Shade Of Mine schrieb:

    Was natürlich blödsinn ist. Weil man manchmal eben keine Klasse sondern nur eine Sammlung von Daten hat. und da sind structs (also im sinne von: alles public, keine/kaum methoden) durchaus sinnvoll.

    Bleibe bei meiner Meinung, dass das nicht häufig vorkommt.



  • Hallo

    man kanns auch andersrum sehen. Wenn man irgendwann mal Vererbung braucht, nimmt man class. Ansonsten reicht struct.

    bis bald
    akari



  • akari schrieb:

    man kanns auch andersrum sehen. Wenn man irgendwann mal Vererbung braucht, nimmt man class. Ansonsten reicht struct.

    Erkärst Du uns bitte auch, warum man mit structs Vererbung nicht nutzen kann? 😕



  • struct attr
    {
        std::string str;
        int i;
    };
    
    std::map< std::string, attr > attr_map;
    

    Wozu soll bzw. muß ich hier bitte anstelle einer Struktur eine Klasse nehmen? Nur der Klasse wegen?

    Es gibt ganz einfach manchmal Situationen wo ich mit einem struct etwas aussagen kann. Wie das da oben z.B. Ich will und brauche in dem Fall keine attr-Klasse. Weil ich z.B. attr_map in einer Klasse benutze, wo ich attr_map unter Kontrolle habe.



  • simon.phoenix schrieb:

    Bleibe bei meiner Meinung, dass das nicht häufig vorkommt.

    Hast du meinen Post (am Anfang) gelesen? Da steht nämlich ein Verwendungsbeispiel.



  • godlikebot schrieb:

    simon.phoenix schrieb:

    Bleibe bei meiner Meinung, dass das nicht häufig vorkommt.

    Hast du meinen Post (am Anfang) gelesen? Da steht nämlich ein Verwendungsbeispiel.

    Das struct (Adresse) könnte aber womöglich irgendwann mal irgendwelche Funktionen gebrauchen. Dann ist sein Zweck als reiner Datenhalter passé.

    Und dann habe ich letztendlich Datenelemente + Funktionen, was imho zumindest langfristig zu Open/Closed führt. Dann habe ich die Elemente als private und das struct ist sinnlos.



  • simon.phoenix schrieb:

    Bleibe bei meiner Meinung, dass das nicht häufig vorkommt.

    Da irrst du dich aber. Gerade wenn es um Template Programmierung geht, trifft man hin und wieder schon auf structs.

    akari schrieb:

    man kanns auch andersrum sehen. Wenn man irgendwann mal Vererbung braucht, nimmt man class. Ansonsten reicht struct.

    Nope. Vererbung ist doch keine Voraussetzung für OCP. 🙄



  • groovemaster schrieb:

    Da irrst du dich aber. Gerade wenn es um Template Programmierung geht, trifft man hin und wieder schon auf structs.

    ok, da hast du Recht :).


Anmelden zum Antworten