Struct oder Class?
-
Ich bin in ner Debatte mit nem Freund mit dem ich zusammen kleinere Projekte programmiere und wir können uns einfach nicht einig werden und in unseren Lehr-Büchern steht auch nix brauchbares.
Wann benutzt man class und wann structs? Wie sieht das im Bezug auf das Kapseln von einzelnen Programmteilen aus, sollte man da anders vorgehen?
Ich wüsste dazu gerne eure Meinung, will mir keinen schlechten Stil angewöhnen den ich später nicht wieder los werden.Wo ist der Unterschied? Was sollte man besser benutzen?
struct Dorf { bool enemy; string name; int slowest; int x; int y; } class Dorf { //private: public: bool enemy; string name; int slowest; int x; int y; Dorf(bool gg):name(""), slowest(-1), x(666), y(666), enemy(gg) { }; Dorf(bool gg, int l_e, int xx, int yy, string n):name(n), slowest(l_e), x(xx), y(yy), enemy(gg) {}; };
-
Der einzige Unterschied zwischen struct und class ist, dass bei struct die Default-Sichtbarkeit public ist und bei class ist sie private.
Von daher ist es völlig irrelevant, was man verwendet.
Viele Leute verwenden struct tendenziell eher für
a) Klassen ohne Memberfunktionen, die reine Datensammlungen sind
b) kleine, fast triviale Klassen
-
Ich habe noch nicht Studiert, lerne aber in der Schule Software Entwicklung (Technisches Gymnasium).
Dort habe ich es auch so gelernt, dass struct eher für kleine Datenansammlungen, die du "packen" möchtest verwendet wird.
Da man bei der Software Entwicklung z.B. Klassendiagrmme macht und beim Objektorientierten Programmieren von Klassen gesprochen wird,
würde ich bei einem Projekt eher auf Klassen zurückgreifen. Wenn man sich Java anschaut, fällt auf, dort wird auch alles in Klassen gemacht. Ich denke mal man kann
alles auch mit struct lösen, weiß aber nicht wie es dort mit Vererbung aussieht.
aber für den "richtige" Programmierstil scheinen mir Klassen die bessere Wahl zu sein (Jedenfalls ab einer gewissen Projektgröße).
Aber wo und ob es große Unterschiede gibt /siehe Vorposter) kann ich dir nicht sagen. Subjektiv würde ich eben eher zu Klassen raten.Viele Grüße,
Samuirai
-
Samuirai schrieb:
Ich habe noch nicht Studiert, lerne aber in der Schule Software Entwicklung (Technisches Gymnasium).
Dort habe ich es auch so gelernt, dass struct eher für kleine Datenansammlungen, die du "packen" möchtest verwendet wird.
Da man bei der Software Entwicklung z.B. Klassendiagrmme macht und beim Objektorientierten Programmieren von Klassen gesprochen wird,
würde ich bei einem Projekt eher auf Klassen zurückgreifen. Wenn man sich Java anschaut, fällt auf, dort wird auch alles in Klassen gemacht. Ich denke mal man kann
alles auch mit struct lösen, weiß aber nicht wie es dort mit Vererbung aussieht.
aber für den "richtige" Programmierstil scheinen mir Klassen die bessere Wahl zu sein (Jedenfalls ab einer gewissen Projektgröße).
Aber wo und ob es große Unterschiede gibt /siehe Vorposter) kann ich dir nicht sagen. Subjektiv würde ich eben eher zu Klassen raten.Viele Grüße,
Samuiraidas hat nix mit richtigem Programmierstil zu tun. Es ist VÖLLIG egal ob struct oder class. Beide können das gleiche.
-
sirchillalot schrieb:
das hat nix mit richtigem Programmierstil zu tun. Es ist VÖLLIG egal ob struct oder class. Beide können das gleiche.
Wenn man nur die reinen Schlüsselwörter anschaut, prinzipiell ja. Aber was deren übliche Verwendung angeht, wie sie SeppJ beschrieben hat, spielt es sehr wohl eine Rolle. Im Allgemeinen sollte Kapselung (nach dieser Einteilung
class
) bevorzugt werden.
-
Nexus schrieb:
sirchillalot schrieb:
das hat nix mit richtigem Programmierstil zu tun. Es ist VÖLLIG egal ob struct oder class. Beide können das gleiche.
Wenn man nur die reinen Schlüsselwörter anschaut, prinzipiell ja. Aber was deren übliche Verwendung angeht, wie sie SeppJ beschrieben hat, spielt es sehr wohl eine Rolle. Im Allgemeinen sollte Kapselung (nach dieser Einteilung
class
) bevorzugt werden.Klingt nach Zirkelschluss.
-
struct
a) Klassen ohne Memberfunktionen, die reine Datensammlungen sindDas habe ich anfangs auch gemacht. Später habe ich struct gar nicht mehr benutzt
-
struct ist eh nur ein C Überbleibsel.
-
non~fricky schrieb:
struct ist eh nur ein C Überbleibsel.
ich nutz es aber häufiger als class ;o)
erspart mir das public am anfang und in der vererbungsliste ;o)bb
-
Jud4s schrieb:
Ich bin in ner Debatte mit nem Freund mit dem ich zusammen kleinere Projekte programmiere und wir können uns einfach nicht einig werden und in unseren Lehr-Büchern steht auch nix brauchbares.
Kommt darauf an wie ihr Programmieren wollt.
Die struktorierte Programmierung (keine Klassen) ist eigentlich eher die Domäne von C. C++ wiederum ist eine Multiparadigmensprache, in der die objektorientierte Programmierung eine Teilrolle einnimmt. Wobei wie schon gesagt unter C++ das Schlüsselwort struct und class mit Ausnahme der Standardsichtbarkeit (public bzw. private) identisch sind.
Ich verwende das Schlüsselwort struct in der Regel nur wenn ich kleine Datenstrukturen übergeben oder in einen Container ablegen will, sowie teilweise in der Templateprogrammierung (aber dies führt hier zuweit). Normalerweise greife ich aber auf Klassen und objektorientierte Programmierung zurück.
Wobei ich weitergehe und sage das für mich zu der OOP auch Datenkapselung gehört, ich mache Membervariablen grundsätzlich in Klassen private, und biete falls benötigt Methoden an um darauf zurück zu greifen (Ob nun durch klassische Getter/Setter oder über Methoden die den Status mehrerer Elemente betreffen).
-
Am besten so:
struct Dorf { bool enemy; string name; int slowest; int x; int y; explicit Dorf(bool enemy, int slowest = -1, int x = 666, int y = 666, string const &name = "") : enemy(enemy), name(name), slowest(slowest), x(x), y(y) { } };
-
non~fricky schrieb:
struct ist eh nur ein C Überbleibsel.:)
Und braucht man deswegen nicht mehr? Ich verwende struct weiterhin sehr gerne, wenn es nur um die Zusammenfassung einfacher Daten geht. class ist eine Erweiterung von struct mit vielen nützlichen zusätzlichen Möglichkeiten. Nur nicht immer braucht man das und ist aufwendiger. Für mich bleibt ANSI-C weierhin aktuell, auch wenn ich meist C++ einsetze. C++ wäre niemals erfolgreich einzuführen gewesen, wenn es nicht voll auch den Standard von ANSI-C unterstützt hätte!
-
berniebutt schrieb:
non~fricky schrieb:
struct ist eh nur ein C Überbleibsel.:)
Und braucht man deswegen nicht mehr? Ich verwende struct weiterhin sehr gerne, wenn es nur um die Zusammenfassung einfacher Daten geht. class ist eine Erweiterung von struct mit vielen nützlichen zusätzlichen Möglichkeiten. Nur nicht immer braucht man das und ist aufwendiger. Für mich bleibt ANSI-C weierhin aktuell, auch wenn ich meist C++ einsetze. C++ wäre niemals erfolgreich einzuführen gewesen, wenn es nicht voll auch den Standard von ANSI-C unterstützt hätte!
welche sollten das denn sein?
-
sirchillalot schrieb:
welche sollten das denn sein?
Es ist nicht die Aufgabe in diesem Forum classes und OOP zu erklären. Wenn du da keine Vorteile siehst, lasse es einfach sein oder lerne hinzu!
-
berniebutt schrieb:
sirchillalot schrieb:
welche sollten das denn sein?
Es ist nicht die Aufgabe in diesem Forum classes und OOP zu erklären. Wenn du da keine Vorteile siehst, lasse es einfach sein oder lerne hinzu!
Struct ist auch OOP!!!
struct ort { private : int a; int b; ... };
wo ist nun der unterschied zu
class ort { int a; int b; }
-
sirchillalot schrieb:
Struct ist auch OOP!!!
Eine Datenstruktur ist kein OOP. Dazu gehören noch ein paar Dinge mehr...
Ich finde dazu die Erklärung aus der wikipedia garnicht so schlecht:
wikipedia schrieb:
Die Grundidee dabei ist, Daten und Funktionen, welche auf diese Daten angewandt werden können, möglichst eng in einem sogenannten Objekt zusammenzufassen und nach außen hin zu kapseln, so dass Methoden fremder Objekte diese Daten nicht versehentlich manipulieren können.
Im Idealfall sollte ein Objekt also nach außen hin nur eine Schnittstelle bereit stellen, und nicht ein nach außen offenes Scheunentor.
-
asc schrieb:
sirchillalot schrieb:
Struct ist auch OOP!!!
Eine Datenstruktur ist kein OOP. Dazu gehören noch ein paar Dinge mehr...
Ich finde dazu die Erklärung aus der wikipedia garnicht so schlecht:
wikipedia schrieb:
Die Grundidee dabei ist, Daten und Funktionen, welche auf diese Daten angewandt werden können, möglichst eng in einem sogenannten Objekt zusammenzufassen und nach außen hin zu kapseln, so dass Methoden fremder Objekte diese Daten nicht versehentlich manipulieren können.
Im Idealfall sollte ein Objekt also nach außen hin nur eine Schnittstelle bereit stellen, und nicht ein nach außen offenes Scheunentor.
Aber ich kann doch auch in einem Struct alles Private machen und hab so wieder ein saubere OOP konzept?!
-
sirchillalot schrieb:
Aber ich kann doch auch in einem Struct alles Private machen und hab so wieder ein saubere OOP konzept?!
Ich habe absichtlich nicht das Wort "struct" verwendet sondern "Datenstruktur". Und nein, wenn man in einer "Datenstruktur" alles privat macht, hat man kein sauberes OOP-Konzept (Da dann die Möglichkeit der Funktionszugriffe fehlen).
-
asc schrieb:
sirchillalot schrieb:
Aber ich kann doch auch in einem Struct alles Private machen und hab so wieder ein saubere OOP konzept?!
Ich habe absichtlich nicht das Wort "struct" verwendet sondern "Datenstruktur". Und nein, wenn man in einer "Datenstruktur" alles privat macht, hat man kein sauberes OOP-Konzept (Da dann die Möglichkeit der Funktionszugriffe fehlen).
Ok klar Datenstruktur ist was anderes.
Aber wenn ich jetzt von Structs ausgehe, die können dann doch auch Methoden haben.
Allg. handhabe ich es aber auch das ich Strukts als reine Datenstrukturen nutze.
-
@asc,
berniebutt hat aber vonstruct
geredet und nicht von Datenstrukturen.@berniebutt,
Hast du dich womöglich verschrieben und Datenstrukturen gemeint? Dennstruct
hat keine Nachteile gegenüberclass
. Alles wasclass
kann, kann auchstruct
in C++. Die zwei sind grundsätzlich völlig identisch, ausser dass haltclass
per Standardprivate
ist undstruct
per Standardpublic
. C++ macht keine weitere Unterscheidung.Ich persönlich verwende allerdings auch im allgemeinen
class
für Klassen undstruct
für Daten- und Hilfsstrukturen. Aber ich habe schon Leute erlebt, welche nurstruct
verwendet haben oder auch umgekehrt. Die Verwendung von beiden und in der Bedeutung umgekehrt (class
als Datenstruktur,struct
als Klasse) habe ich allerdings noch nie gehört
Daher denke ich schon, dass man es auch ein wenig als Stil bezeichnen kann, was man nun verwendet.Grüssli