C+ statt C++
-
Jester schrieb:
naja, weiter oben habe ich einen (meiner Ansicht nach guten)
Grund genannt, die beiden nicht zu mischen.weil du nicht genau liest!
Niemand würde
struct string;
schreiben, denn string ist eine 'echte' Klasse.
Aber zBstruct NoInherit {}; struct DoInherit { virtual void foo()=0; };
Hier wäre es bei NoInherit egal ob ich class oder struct schreibe, aber bei DoInherit gibt es keine private Member. Wozu also class?
Ich nehme struct eigentlich immer wenn es keine privaten Member gibt. Was soll daran schlechter Stil sein? Solange ich es immer so mache, gibt es auch keine zweideutigkeiten oder verwirrende Situationen.
-
Shade Of Mine schrieb:
Ich nehme struct eigentlich immer wenn es keine privaten Member gibt. Was soll daran schlechter Stil sein? Solange ich es immer so mache, gibt es auch keine zweideutigkeiten oder verwirrende Situationen.
es ist schlechter stil, weil stucts nicht dafür gemacht wurden. natürlich ist konsistenz im code auch wichtig, aber allgemeine notationen sind wichtiger. wieso sollte man an ein auto flügel bauen, wenn's nicht schon flugzeuge gibt? wo ist denn da das problem, für 'echte' klassen (und das ist nunmal alles, was über die funktionalität eines structs (im c-sinn) hinausgeht) auch class zu benutzen? klingt doch logisch, oder ?
-
Die Diskussion um struct und class ist kindisch.
Hier noch mal ein konkretes Beispiel für "virtual":
#include <iostream> using namespace std; class Person { public: /*virtual*/ void geldueberweisung(float geld){ cout << geld << " an Person " << endl; }; }; class Mitarbeiter : public Person { public: void geldueberweisung(float geld){ cout << geld << " an Mitarbeiter " << endl; }; }; class Kunde : public Person { public: void geldueberweisung(float geld){ cout << geld << " an Kunde " << endl; }; }; class Lieferant : public Person { public: void geldueberweisung(float geld){ cout << geld << " an Lieferant " << endl;}; }; void zahlung(Person * x, float Summe) { x->geldueberweisung(Summe); } int main() { Lieferant a; Kunde b; Mitarbeiter c,d; zahlung( &a, 500 ); zahlung( &b, 300 ); zahlung( &c, 250 ); zahlung( &d, 170 ); }
-
Ich sehe das genauso wie der komische kautz - warum in alles in der Welt benutzt man das Schlüsselwort "struct", wenn man eine Klasse (engl.: class) meint? Kann ich nicht nachvollziehen.
Das Argument mit der Ersparnis einiger Zeichen ist irrelevant, wir (damit meine ich die Programmierergemeinde) haben uns schließlich doch inzwischen darauf geeinigt, daß Lesbarkeit vor Kürze geht. Tippfaulheit ist niemals ein Argument für eine Schreibung, sonst können wir die Variablen gleich wieder a,b,c,d nennen - ist doch kürzer.
Und genau da kommt meine Abneigung gegen structs mit "Klassenverhalten" - es verletzt die Erwartungskonformität des Lesers. Auch wenn struct und class austauschbar sind, so assoziiert man struct eher mit POD und class mit Klassen. 98% der C++-Programmierer wissen wahrscheinlich nicht mal, daß es diese Gemeinsamkeit gibt. Warum in alles in der Welt soll man also hier zusätzliche Verwirrung beim Leser erzeugen? Der einzige bewirkte Effekt ist, daß man damit zeigt den Standard besser zu kennen als andere Code-Leser.
-
Marc++us schrieb:
Und genau da kommt meine Abneigung gegen structs mit "Klassenverhalten" - es verletzt die Erwartungskonformität des Lesers. Auch wenn struct und class austauschbar sind, so assoziiert man struct eher mit POD und class mit Klassen.
meine structs haben kein Klassenverhalten im eigentlichen Sinne - denn man kann sie allesamt nicht instanziieren, bzw. sind es leere Klassen.
Ich habe schon oft gesehen dass Leute struct für functoren verwenden - weil sie eben keine Klassen darstellen. Und ein interface ist IMHO auch keine Klasse - dies drücke ich durch struct aus.
vielleicht wäre ein #define interface struct passender
Sobald man es wie eine Klasse verwendet, also intanziiert, Methoden aufruft,... ist es auch bei mir eine class.
Nur wo liegt euer Problem? Solange es konsistent verwendet wird kann man ja auch Ungarische Notation verwenden
Ich meine damit: wenn der Stil logisch aufgebaut ist und konsequent durchgezogen wird, spricht doch nichts dagegen, oder?
-
@Shade: Inwiefern lese ich nicht genau?
Ansonsten denke ich wir sind uns da einig, Du nimmst das Schlüsselwort je nachdem welches Verhalten Du modellierst. Ehrlich gesagt hatte ich solche Interface-Klassen nicht bedacht, da würde ich wirklich sagen es handelt sich um eine Geschmacksfrage, wobei das mit dem #define interface struct keine schlechte Idee ist.
Aber kingruedi sagt er nimmt das je nachdem ob er erst was privates oder was öffentliches deklariert struct oder class. Und das ist meiner Meinung nach ein sehr schlechtes Kriterium.MfG Jester
-
@shade:
ich geb's auf.
-
es ist schlechter stil, weil stucts nicht dafür gemacht wurden. natürlich ist konsistenz im code auch wichtig, aber allgemeine notationen sind wichtiger. wieso sollte man an ein auto flügel bauen, wenn's nicht schon flugzeuge gibt? wo ist denn da das problem, für 'echte' klassen (und das ist nunmal alles, was über die funktionalität eines structs (im c-sinn) hinausgeht) auch class zu benutzen? klingt doch logisch, oder ?
Tut mir leid, aber die Aussage ist nur wirklich DÄMLICH!. Ein Auto ist nicht zum fliegen gemacht. Das erkennst du z.B. daran, dass es keine Flügel oder sonstige Vorrichtungen zum Fliegen besitzt. struct besitzt aber Methoden, Kon- und Destruktoren, etc. Die wurden natürlich alle Ausversehen eingebaut. So ein kleiner Fehler kann doch jedem mal passieren.
-
Die wurden nicht 'aus Versehen' eingebaut. Man hat die C-Structs weiterentwickelt und irgendwann festgestellt, dass sich hieraus eine völlig neue Funktionalität ergeben hat und ihr dann auch einen neuen Namen gegeben.
Also nutzt auch den neuen Namen.
Das das struct alles kann, liegt nur daran, weil man eben diese structs weiterentwickelt hat.
-
Optimizer schrieb:
Die wurden nicht 'aus Versehen' eingebaut. Man hat die C-Structs weiterentwickelt und irgendwann festgestellt, dass sich hieraus eine völlig neue Funktionalität ergeben hat und ihr dann auch einen neuen Namen gegeben.
Also nutzt auch den neuen Namen.
Das das struct alles kann, liegt nur daran, weil man eben diese structs weiterentwickelt hat.*lol*
und da sind sich ja mal alle Gurus einig...ne, mal im ernst: ich habe sowas noch nie von irgendeinem Guru gehört/gelesen. Und ich glaube in Effective STL habe ich functoren als struct gesehen (bin mir jetzt aber nicht sicher)
Also Leute: bevor ihr sagt: "Das ist halt so", schaut mal nach was die Gurus dazu, wenn diese das auch so sehen -> OK, wenn nicht, dann ist es eben nicht so.
wo ist hier bitte der Unterschied:
class foo { public: void operator()(int i) { /*bla*/ }; }; struct foo { void operator()(int i) { /*bla*/ }; };
es ist beides klar. Und ich habe gute Punkte genannt wo ich struct statt class verwende - da ist bei mir alles fein säuberlich aufgeteilt - es gibt keine missverständnisse.
ich will nicht behaupten mein stil sei besser als immer class zu schreiben, aber mein Stil ist klar. Und deshalb ist er nicht schlechter als immer class zu schreiben.
btw: class gibt es nur, weil sich class besser anhört als struct.
Es ist also ein marketing gag - mehr nicht.warum regt ihr euch so auf? bringt argumente warum es schlecht sein sollte einen functor der keine eigenen Member besitzt als struct zu deklarieren und wir können weiter reden.
btw: "das macht man nicht" zieht erst, wenn ihr Meyers, Sutter, Stroustrup, etc. zitiert.
-
Shade, ich weiß gar nicht, was es da zu lachen gibt. Für meinen Geschmack hat Marc++us gute Gründe gebracht. Und nur weil Du Deinen Idolen hörig bist, müssen wir nicht alle die gleiche Meinung vertreten. Du solltest andere Meinungen zulassen, ohne sie mit einem abfälligen *lol* nichtig zu machen.
Meine Meinung.
-
@Marc++us
Auch wenn struct und class austauschbar sind, so assoziiert man struct eher mit POD und class mit Klassen.
da gab es doch den Witz mit "Alle Programmierer neigen zu Verallgemeinerungen"
98% der C++-Programmierer wissen wahrscheinlich nicht mal, daß es diese Gemeinsamkeit gibt. Warum in alles in der Welt soll man also hier zusätzliche Verwirrung beim Leser erzeugen?
wenn die Person aber nur 1/5 Verstand hat, wird sie spätestens beim 2. Blick merken, dass dieses Verhalten möglich ist und das ist insofern ein minimal-Problem.
Es kennen auch viele C++ Programmierer keine Template-Spezialisierung oder Namespaces, soll ich das jetzt auch nicht benutzen? Wobei diese Konzepte IMHO komplizierter sind.
-
-King- schrieb:
Shade, ich weiß gar nicht, was es da zu lachen gibt. Für meinen Geschmack hat Marc++us gute Gründe gebracht.
struct wird mit POD assoziiert?
Naja...struct Test { std::string s; };
ist also verboten?
sehr interessant... hier muss ich alsoclass Test { public: std::string s; };
schreiben...
Naja, die semantik von class Test und struct Test ist doch die selbe.
Warum muss ich einmal class und einmal struct verwenden - wenn diese 'Struktur' lediglich Daten beinhalten soll.Siehst du, ich nehme hier struct um zu zeigen, dies ist keine Klasse.
Ich nehme für interfaces ebenfalls struct um zu zeigen, dies ist keine Klasse.
Erklär mal, welche Regel du hast!
POD == struct
alles andere == class
?
Ok, damit kann ich leben.warum kannst du aber nicht mit meinem Stil leben? Ist er so abwegig?
Und nur weil Du Deinen Idolen hörig bist, müssen wir nicht alle die gleiche Meinung vertreten. Du solltest andere Meinungen zulassen, ohne sie mit einem abfälligen *lol* nichtig zu machen.
Ich glaube ich bin im falschen Film...
Ich sage ja die ganze Zeit: Jeder so wie er will.
Ich bringe Argumente warum ich der Meinung bin, dass mein Stil nicht schlechter ist als eurer.
Ich lasse euch ja euren Stil und sage nicht
selbst Stroustrup verwendet struct (siehe seine HP)Ich finde es in Ordnung wenn ihr einen anderen Stil habt - Ihr wollt mir ja nicht meinen Stil lassen - weil er "abartig" ist.
Dass Sutter, Meyers, Dewhurst, Stroustrup,... struct genauso verwenden wie ich, scheint ja nciht zu zählen.
Mal im ernst: wenn ich die Wahl habe auf so ziemlich alle Gurus zu hören, oder auf euch - dann muss ich mich leider für die Gurus entscheiden. Vorallem dann, wenn sie genauso denken wie ich selber.
Nennt mir also einen Grund warum mein Stil (und der von Meyers, Sutter, Stroustrup,...) schlechter ist als eurer.
Und mir nicht vorwerfen dass ich keine anderen meinungen zu lassen und mir schon garnicht vorwerfen, dass es hier allgemeine Notationen gibt.
Wenn es allgemeine Notationen gibt, dann zeigt mir woher ihr sie habt. Woher ich meinen Stil habe, habe ich belegt. Und die "Gurus denen ich hörig bin" sind ja wohl mal n Argument - habt ihr ein besseres?
-
Shade Of Mine schrieb:
struct wird mit POD assoziiert?
Naja...Ja und nein. Davon habe ich nun gar nichts gesagt. Und so, wie das hier abgeht, werde ich auch in Zukunft von meiner Meinung nicht richtig was los. Ich finde es nur schade, daß die Meinung aller anderen nichtig gemacht wird von jemandem, der keine eigene Meinung hat und sich auf seine Idole berufen muß. Ich werde hier auch nichts weiter erklären. Punkt.
EOT (für mich).
-
-King- schrieb:
Shade Of Mine schrieb:
struct wird mit POD assoziiert?
Naja...Ja und nein.
ist
struct T { string s; };
ein POD?
Ist es OK T als struct zu deklarieren oder muss hier ein class hin?
Was ist deine Meinung?Davon habe ich nun gar nichts gesagt.
Du nicht, aber Marc++us.
Und wenn ich den Satz "Für meinen Geschmack hat Marc++us gute Gründe gebracht" richtig deute, findest du Marc++us Gründe berechtigt und denkst ähnlich wie er.
Insofern dachte ich, dass ich mit dir ebenfalls über diese Argumente reden kann.Sorry, das muss ich wohl falsch verstanden haben. Kannst du mich bitte aufklären?
Und so, wie das hier abgeht, werde ich auch in Zukunft von meiner Meinung nicht richtig was los.
Das ist schade. Denn wenn ich nicht von Meyers, Sutter & Co lernen darf und von dir auch nicht - wie soll ich dann je programmieren lernen?
Ich finde es nur schade, daß die Meinung aller anderen nichtig gemacht wird von jemandem, der keine eigene Meinung hat
Oh, meinst du etwa mich? Da muss ich mich wohl irgendwo etwas unklar ausgedrückt haben. Aber das können wir ja leicht klären.
Darf ich hierzu mich selber zitieren?Was soll daran schlechter Stil sein?
Anmerkung: Ich sprach von meinem Stil und fragte, warum er denn nun schlechter sei. Ich gab keine Wertung ab, was ich von dem anderen Stil (struct==POD) halte.
Nur wo liegt euer Problem? Solange es konsistent verwendet wird kann man ja auch Ungarische Notation verwenden Ich meine damit: wenn der Stil logisch aufgebaut ist und konsequent durchgezogen wird, spricht doch nichts dagegen, oder?
Anmerkung: Ich habe wieder keine Wertung über den anderen Stil abgegeben. Auch habe ich nicht schlecht davon gesprochen, oder abwertende Bemerkungen gemacht.
es ist beides klar. [Anmerkung: struct oder class bei einem functor] Und ich habe gute Punkte genannt wo ich struct statt class verwende - da ist bei mir alles fein säuberlich aufgeteilt - es gibt keine missverständnisse.
ich will nicht behaupten mein stil sei besser als immer class zu schreiben, aber mein Stil ist klar. Und deshalb ist er nicht schlechter als immer class zu schreiben.
Anmerkung: wieder habe ich meinen eigenen Stil verteidigt, und kein schlechtes Wort über struct==POD verloren.
Erklär mal, welche Regel du hast!
POD == struct
alles andere == class
?
Ok, damit kann ich leben.Anmerkung: man beachte das 'OK, damit kann ich leben.'
So, ich habe jetzt alle meine (auf dieses Thema bezogenen) Posts zitiert. Ich kann keine unklarheit entdecken - und auch kann ich (in meiner beschränktheit) nicht sehen, wo ich eine andere Meinung nicht zulies. Oh, doch. Eine Meinung konnte ich nicht akzeptieren, und zwar "wer stucts wie klassen benutzt ist pervers !". Es tut mir leid, aber ich lasse mich nicht gerne als pervers bezeichnen. Deshalb kann ich diese Meinung nicht akzeptieren. Es tut mir leid
und sich auf seine Idole berufen muß.
Ich lese nunmal Bücher von Sutter, Meyers, Stroustrup,... und leider keine von dir
da ist es doch natürlich, dass ich mich an denen ihren Stil anlehne, oder? Ich übernehme keine Sachen grundlos in meinen Stil - alles hat Gründe warum ich es so mache. Ich bin halt noch ein Anfänger... Vielleicht wenn ich einmal so gut bin wie du, dann werde ich meinen Stil vielleicht grundlegend ändern. Aber bis dahin bleibe ich bei meinem Stil - da ich es einfach nicht besser weiss.
Ich werde hier auch nichts weiter erklären.
Schade, ich hatte gehofft von dir lernen zu können wie man es richtig macht
Naja, dann muss ich wohl doch weiter Bücher von Stroustrup, Sutter und Meyers lesen, anstatt mich von dir erleuchten zu lassen
-
Meine Meinung zählt zwar ebenfalls nichts, aber mein Stil bezüglich struct und class sieht genauso aus, wie der von Shade.
ist
C/C++ Code:
struct T
{
string s;
};C/C++ Code:
............ein POD?
Eigentlich nicht, aber bei mir fallen pure Datanhalter und echte PODs in die selbe Kategorie.
-
Ich habs für mich so formuliert: Was ohne private/protected/public auskommt, wird ein struct. Dass sie Elementfunktionen haben kommt aber durchaus mal vor, obwohl es meistens ein Zeichen dafür ist, dass bald Klassen aus ihnen werden.
-
I versteh gar nicht die ganze Aufregung, wer es für jeden eindeutig haben will der kommentiert einfach.
Eigentlich stört es mich ganz und gar nicht ob ich nun struct sehe oder class. Die Declaration folgt ja sowieso und da braucht man meist nur einen schnellen Blick auf die Anzahl der () zu werfen um heraus zu finden was gemeint ist. Man ist ja kein Kompiler der nur das Schlüsselwort sieht, einen Namem und dann eine { oder ein ; sondern man hat ja auch Menschenverstand. Und falls die Declaration mal nicht folgt so ist man sowieso nur mit einem Pointer konfrontiert.
98% der C++-Programmierer wissen wahrscheinlich nicht mal, daß es diese Gemeinsamkeit gibt.
Naja 98% für die Info, dass struct das gleiche ist als class{public: ist meiner Ansicht doch ein wenig viel. 50% wären der Realität woll näher.
So um die 75% würde ich folgende Infos schätzen:
1)class A{}; class A a; //anstatt A a;
int a(5); //anstatt int a=5;
oder auch noch dass dies nicht geht:
struct A{ /*operator folgt somit ist es wahrscheinlich eine class die mit den public: Membern begint*/ friend A&operator=(A&,A&); };
Aber für 98% da glaub ich nicht, dass man was findet.
:xmas1:
-
Shade Of Mine schrieb:
"wer stucts wie klassen benutzt ist pervers !". Es tut mir leid, aber ich lasse mich nicht gerne als pervers bezeichnen. Deshalb kann ich diese Meinung nicht akzeptieren. Es tut mir leid
tut mir leid, wenn du dich persönlich angegriffen fühlst, so war es bestimmt nicht gemeint. ich wollte nur meinen standpunkt deutlich ausdrücken und habe mich da wohl etwas in der wortwahl vergriffen.
sry, aber dennoch ändert das nichts an meiner meinung.
-
Optimizer schrieb:
häh?
Leute, offenbar ist vielen von euch nicht bewusst, dass structs und Klassen (deshalb hab ich es auch so provokant geschrieben) das selbe sind.
Sie werden auch genau so wie Klassen benutzt. Der einzige mir bekannte Unterschied ist der, den MaSTaH erwähnt hat.Sorry hatte die Strukturen aus C im Kopf...