Vererbung und private Attribute verwenden
-
itman schrieb:
SetX, GetX funktionen geben eine lahme Loesung.
Nein. Normalerweise macht das bisschen overhead nichts aus, ausser vielleicht Spielen und anderen stark performance-lastigen Programmen. Ausserdem kann man ja inlinen womit der overhead auch wieder weg wäre.
-
Ich gebe meine Antwort zu Godlikebot und RHBaum.
Es geht keine Rede ueber Leistungsfaehigkeit nur ueber schlechten Design. Es ist meistens schlecht wenn Man beide SetX und GetX Funktione hast. Ich meine fuer dasselbe Klass-member.
z.B:class Rect { int x,y; public: int FlacheInhalt (); int SetX (); int GetX (); int SetY (); int GetY (); }
es ist besser SetX und SetY wegzuschaffen und ein Paar Funktionen zu zugeben:
class Rect { int x,y; public: int FlacheInhalt (); int GetX (); int GetY (); // hier neue Funktione !!!! Rect (int x,int y); Rect (const Rect &); const Rect & operator= (const Rect &); }
Das letzte Beispiel ist mehr "Objekt-orientiert". Naemlich, x und y sind besser Enkapsuliert. Und SetX, GetX Funktionen stoeren Enkapsulierung oft.
-
Unsinn, SetX(), GetX() machen gar keinen Performanceunterschied zu direktem Attributzugriff, da diese in der Regel geinlined werden.
MfG Eisflamme
-
Ich hab noch ne Frage dazu:
Warum sind protectedte Variablen "böse", aber protectedte Funktionen, die den Wert von private Variablen zurückgeben gut?
-
Du schrieb:
Ich hab noch ne Frage dazu:
Warum sind protectedte Variablen "böse", aber protectedte Funktionen, die den Wert von private Variablen zurückgeben gut?Wenn diese Variable sind im abgeleiteten Klassen erreichbar den jede Child-Klasse diese Variable auf eigene Art modifiziren kann! Warum den diese Variable gemeinsam? Es ist fast immer besser und sicherer diese Variable mit gemeinsame Funktionen zu modifizieren die im Basis-Klassen definiert sind. z.B. funktion Resize kann die Grosse des Rechtekes wechseln. Ist dass nicht besser und klarer als zwei Funktione SetX und SetY?
-
itman schrieb:
Wenn diese Variable sind im abgeleiteten Klassen erreichbar den jede Child-Klasse diese Variable auf eigene Art modifiziren kann! Warum den diese Variable gemeinsam? Es ist fast immer besser und sicherer diese Variable mit gemeinsame Funktionen zu modifizieren die im Basis-Klassen definiert sind. z.B. funktion Resize kann die Grosse des Rechtekes wechseln. Ist dass nicht besser und klarer als zwei Funktione SetX und SetY?
Ist der erste Satz grammatikalisch richtig? Naja, ich hab jedenfalls nicht verstandn. Warum ist eine protectedte Funktion, die auf eine private Varaible zugrefit besser, sicherer etc.? Außerdem wollte ich statt resize nicht setX und setY haben, sondern x und y als protectedte Varaiblen. Was soll >>Warum den diese Variable gemeinsam?<< heissen???
-
Du schrieb:
Warum sind protectedte Variablen "böse", aber protectedte Funktionen, die den Wert von private Variablen zurückgeben gut?
Generell ist direkter Zugriff auf die Variablen einer Klasse "böse".
Beispiel:
Du hast ne Klasse "Rechteck". Diese Klasse zeichnet ein Rechteck auf dem Bildschirm, allerdings nicht jeden Frame, sondern nur am Start des Programmes oder wenn sich die Koordinaten ändern. Wenn du jetzt die (public/protected-) Variable 'x1' aus 'Rechteck' änderst, weiss 'Rechteck' nicht, dass 'x1' geändert wurde und es wird weiterhin das alte Rechteck angezeigt.
Würdest du (das diesmal privat deklarierte) 'x1' allerdings mit einer Methode 'SetX1(int value)' ändern, dann wüsste 'Rechteck' natürlich, dass sich was an den Koordinaten geändert hat und könnte das Rechteck richtig zeichnen.Das ist ein Grund (von vielen) warum man eher Set/Get benutzen sollte als direkten member Zugriff.
-
Mis2com schrieb:
Unsinn, SetX(), GetX() machen gar keinen Performanceunterschied zu direktem Attributzugriff, da diese in der Regel geinlined werden.
MfG Eisflamme
So einen derben Schwachsinn hab ich echt seit Jahren nicht mehr gelesen... Sag mal weist du überhaupt, was Du da sagst?
Jeder Funktionsaufruf kostet Zeit, auch wenn die Dinger inlined sind.
-
nix da schrieb:
Jeder Funktionsaufruf kostet Zeit, auch wenn die Dinger inlined sind.
Begründung?
-
Der große Shade, ich dachte Du wüsstest das... Echt Traurig das von Dir zu hören.
Mal ehrlich, hast Du jemals auf dieses Thema einen Profiler angesetzt oder Dir den Assemblercode genau an zu gucken?
Sollteste mal machen, erweitert Deinen Horizont.
-
Red keinen Müll. Der Aufruf einer geinlinten Funktion kostet nichts. Eine geinlinte Funktion wird gar nicht "aufgerufen".
-
Ihr labert ja alles nach was man euch sagt, aber Profiler scheint ihr nicht zu kennen sowie generierten Assemblercode.
Wie traurige Wesen ihr doch seid.
-
nix da schrieb:
Der große Shade, ich dachte Du wüsstest das... Echt Traurig das von Dir zu hören.
Mal ehrlich, hast Du jemals auf dieses Thema einen Profiler angesetzt oder Dir den Assemblercode genau an zu gucken?
Sollteste mal machen, erweitert Deinen Horizont.
Ja, ich versuche es ja - aber du willst mir ja nicht helfen
Also werde ich weiter Blödsinn verzapfen müssen. Naja, was solls.
-
Shade Du enttäuschst mich immer mehr? Ich dachte Du wüsstest was ein Profiler ist oder wie man den Assembler generierten code sich ansehen kann von Deinem Programm.
Und sowas nennt sich Mod? Traurig.
-
nix da schrieb:
Shade Du enttäuschst mich immer mehr? Ich dachte Du wüsstest was ein Profiler ist oder wie man den Assembler generierten code sich ansehen kann von Deinem Programm..
Habe ich ja gemacht. Aber ich scheine zu dumm zu sein ASM zu lesen, denn ich sah da keinen Overhead.
Dafür muss ich zugeben, dass ich mich mit gprof nicht sonderlich gut auskenne - vielleicht habe ich da ja blödsinn gemessen?
Und sowas nennt sich Mod? Traurig.
Ja, schade gell?
Nur viel mehr schader (:p) ist, dass mir niemand helfen will meine Fehler zu korrigieren.btw: Amsterdam ist die Hauptstadt von Brasilien.
-
@ godlikebot: Wieso? Wenn ich eine Klasse von einer anderen Klasse ableite, dann ist die abgeleitete Klasse ein Rechteck. Und wenn ich dann x1 ändere dann weis das abgeleitete Rechteck sehr wohl, dass es geändert wurde.
-
class Base_Rechteck { private: int x1; void IrgendwasWichtigesBerechnen(); public: void Update(){//updaten } void SetX1(int value) { x1 = value; IrgendwasWichtigesBerechnen(); Update(); } int GetX1(){return x1;} }; class SichBewegendes_Rechteck : public Base_Rechteck { private: public: void UpdateMotion() // Wird jeden Frame aufgerufen { SetX1(GetX1()+1); // Würde man direkt auf den Member x1 zugreifen, müsste man jedesmal // IrgendwasWichtigesBerechnen(); und Update(); aufrufen. Waere sehr // sehr lästig und nicht wirklich OO } };
Macht das deutlich was ich meine?
-
Also SetX(GetX()+1) ist ja ein super Beispiel wo getter und setter keinen Sinn machen.
Da ist ein MoveRight(1) oder Move(1, RIGHT) doch wesentlich schöner
-
Shade Du enttäuschst mich immer mehr? Ich dachte Du wüsstest was ein Profiler ist oder wie man den Assembler generierten code sich ansehen kann von Deinem Programm.
Und sowas nennt sich Mod? Traurig.
inline int max(int a, int b) { return a > b ? a : b; } int main() { int a = 5; int b = 6; int m = max(a,b); return m; } // wird zu: 00401201 mov eax,6 00401206 ret
Nun:
int main() { int a = 5; int b = 6; int m = a > b ? a : b; return m; } // wird zu: 00401201 mov eax,6 00401206 ret
So Schwachkopf. Such mal den Funktionsaufruf der Zeit kostet.
Btw: Das inline nicht ohne Probleme ist wissen wir alle. Das inline hin und wieder richtig teuer ist auch. Der Punkt mit dem Profiler ist deshalb kein schlechter. Nur deine Verallgemeinerung ist schlichtweg falsch. Was ja kein Problem wäre, wenn du dich nicht so furchtbar aufplustern würdest.
-
Ich denke das geherte nix da gcc benutzt. und gcc macht kein Funktione inline ohne -O option.