Frage zu Verebung .
-
1. wieso ist das eine boolische funktion wenn sie immer true zurück gibt?!
2. Wenn sie GetMennschaft heißt erwarte ich nich das ich true zurück kriege sondern eine Mannschafft.
3. Wozu zählst du da k hoch?
-
zeig uns mal bitte den Output auf der Console, wenn vbLiga::ErzeugeSpielplan() aufgerufen wird.
Dann noch die Antworten für die durhaus berechtigten Fragen meines Vorposters, und danach solltest du dir mal unbedingt das C++-Buch deiner Wahl schnappen und dich über den Sinn und die Verwendung von Referenzen informieren. Hier einen pointer auf den Mannschaftsvector zu übergeben ist eher C-Stil, zudem prüfst du nichtmal ob er NULL ist in GetMannschaft() (Die Überprüfung ist bei Referenzen nicht notwendig).
-
4. Was bedeutet bitte das "vb" vor dem Klassenname? Und warum ein "p" vor den Vectornamen?
Ich kenne durchaus noch Menschen die, die ungarische Notation hochhalten, aber selbst damit ist mir das Präfix unklar - Und vermutlich wäre ein sprechender Namensraum verständlicher. Und auch das "p" vor den Vektornamen ist weder UN noch imho sinnvoll (der vector selber ist ja kein Zeiger, sondern enthält nur solche).
5. Mir ist der Sinn dieser Hierarchie unklar.
Liga ist eine Engine? mhhh... Das bezweifel ich doch mal.
Zudem - wenn ich deine Basisklasse richtig verstehe - machst du hier sehr viele Daten und Codeduplikationen. Ich bezweifel das dies ein sinnvolles Design ist, hatte es aber imho schon in einen deiner Vorthreads erwähnt.Öffentliche Vererbung sollte möglichst nur verwendet werden, wenn man wirklich guten Gewissens sagen kann das "ist ein" erfüllt ist. Ansonsten ist Komposition "enthält ein" oder "verwendet ein" (Sprich: Statt von Engine abzuleiten, die Engine als Membervariable [Je nach Verwendung: Wert, Referenz oder Zeiger] halten) wartbarer.
2. Die Gestaltung folgender Methode halte auch ich für wenig intuitiv:
bool GetMannschaft(int id, vector<vbMannschaft*> *mannschaft);a. Erwarte ich durch den Namen das EINE Mannschaft zurückgegeben wird.
b. Einen vector für Mannschaften (so lese ich den Vektor) in der Einzahl zu benennen halte ich für ungünstig.
c. Ist ein Fehlschlag von GetMannschaft ein Fehler, oder nur "eine Statusinformation", im letzen Fall mag eine bool-Rückgabe okay sein, in ersteren erwarte ich unter C++ eher eine exception und keine Rückgabe.
-
Hallo erst mla vielen dank für die vielen antworten. also das "vb" vor den klassen steht einfach für volleyball.
Die kritik mit dem bol ist berechtigt. allerdings füllt die funktion einen vector mit mannschaften. es gibt auch eine weitere fnktion die nur einen zeieger auf eine mannshcaft zurückgibt . das möchte ich hier nicht wweiter erklären. da es nicht zum problem gehört.
Ganz allgemein. ICh habe eine klasse A und eine klasse B. B ist von A abgeleitet.
A enthhällt eine funktion, die von b aufgerufen werden darf (public). In dieser Funktion wird auf private varibalen von A zugegriffen. Darf der Aufruf der asu B heraus erfolgte das auch. Denn genau das ist mein Problem. Ich bekomme vom Compiler keinen Fehler bezüglich eines falsches ZUgriffs. Jedoch ist die Ausgabe der Werte unterschiedlich. ICh hoffe ich habe das Problem diesmla etwas besser beschrieben.Also es ist ja nicht ganz sauber mit der Verebung. Da ja eine Liga nun wirklich keine Engine ist. Aber wie hätte ich den Zugriff auf so eine Funktion gewährleisten können. Wäre friend eien Alternative.
Dankeschön
-
Kann es sein, dass du sowas hast?
class Base { public: int get_foo() { return 1; } }; class Derived : public Base { public: int get_foo() { return 0; } int do_x() { return get_foo(); } };Hier ist der Rückgabewert von
do_x()0. Wenn du die Basisfunktion in diesem Beispiel aufrufen möchtest, müsstest du es so schreiben:int do_x() { return Base::get_foo(); }Wenn es nicht das Problem ist, dann hast du uns immer noch nicht genügend, bzw. nicht die richtigen Informationen gegeben.
Grüssli
-
dercooleauswandere schrieb:
Also es ist ja nicht ganz sauber mit der Verebung. Da ja eine Liga nun wirklich keine Engine ist. Aber wie hätte ich den Zugriff auf so eine Funktion gewährleisten können. Wäre friend eien Alternative.
Wieso machst Du die Engine nicht einfach zu einem Member von Liga?
class vbLiga { public: //... private: //... vbEngine engine; //... };
-
dercooleauswandere schrieb:
...
Eine allgemeine Bitte: Lies dir vor dem Abschicken eines Posts deinen Text nochmal durch - manches davon ist sehr unverständlich. Ich mache selbst genügend Fehler, aber meist ist mein Post dennoch verständlich.
dercooleauswandere schrieb:
Hallo erst mla vielen dank für die vielen antworten. also das "vb" vor den klassen steht einfach für volleyball.
Wäre folgendes nicht besser lesbar (dazu weiter unten noch etwas mehr):
namespace Volleyball { class Liga{/*...*/}; class Mannschaft{/*...*/}; }dercooleauswandere schrieb:
Die kritik mit dem bol ist berechtigt. allerdings füllt die funktion einen vector mit mannschaften.
Dann ist der Name falsch gewählt - Hier gilt das gleiche wie mit dem Namensraum:
Man liest ein Programm weitaus häufiger, als das man es schreibt. Aussagekräftige Namen erleichtern das Verständnis (=> dadurch häufig auch weniger Fehler) und damit die Wartung.
Im Idealfall kann ein Code fast wie ein Buch lesbar sein, und sogar von Menschen gelesen werden die keine oder nur Minimale Programmierkenntnisse haben.
Zudem (Auch wenn volkard anderer Meinung sein wird) würde ich Code im ersten Moment nicht ausschließlich auf Performance optimieren, sondern auf Verständlichkeit. Sprich: Ich gebe einen vector auch als Rückgabewert, nicht als Rückgabeparameter zurück, wenn die Funktion eine Liste zurückgeben soll. Fehler (ich glaube persönlich wenn eine Id keinen Treffer liefert das dies durchaus ein Fehler darstellt, und nicht ein Status) gebe ich als Exception zurück.
Bei mir sähe die Schnittstelle wohl wie folgt aus (Wenn ich auch den Namen Engine noch ersetzen, deutsch und englisch ungern mische, und ggf. die Engine-Klasse auch splitten würde):
Mannschaft Engine::GetMannschaft(int id); // Mannschaft mit der entsprechenden Id std::vector<Mannschaft> Engine::GetMannschaften(); // Alle Mannschaftencu André
-
Guten Morgen. Ich muss euch erst einmal ein Kompliment machen. Soviele Antworten - das hätte ich nicht gedacht.
Okay zurück zu meinem Problem. Ich habe mir überlegt, die Verebung zu Ändern :
Die Klasse vbLiga ist natürlich keine Engine. Aber si hat ja eine Engine.So im ersten Schritt werde ich die Engine initialisieren. Dabei werden alle Mannschaften, SPielen Ligen, und Ansetzungen erzeugt. Und jede dieser Klassen hat eine eine Refernz auf die Engine. Meine Frage nun wie bekomme ich einen Refernz von einer klasse auf sich selbst. Geht das über den this Zeiger ?
Vielen Dank
-
dercooleauswandere schrieb:
Die Klasse vbLiga ist natürlich keine Engine. Aber si hat ja eine Engine.
So im ersten Schritt werde ich die Engine initialisieren. Dabei werden alle Mannschaften, SPielen Ligen, und Ansetzungen erzeugt. Und jede dieser Klassen hat eine eine Refernz auf die Engine. Meine Frage nun wie bekomme ich einen Refernz von einer klasse auf sich selbst. Geht das über den this Zeiger ?
Vielen Dank
So wie du es darstellst hat eine Liga nichtmal eine Engine, sondern die Engine erzeugt mehrere Ligen - die Liga würde dann bestenfalls eine Referenz auf eine Engine haben, wenn das überhaupt nötig ist. Wenn bei der initialisierung einer Engine alle Ligen erzeugt werden, jede Liga aber wiedrum von einer Engine erbt, dann hast du noch während der Initialisierung der ertsen Engine eine exponentielle Explosion von Objekten, weil jede Liga die erzeugt wird ihre Basis-engine erzeugt, die wiederum X neue Ligen erzeugt....
Du solltest dir wirklich einmal ganz genau überlegen, wer was ist, wer was hat, und wer etwas benutzt. (Vererbung, Member, Referenzen) Das Schema "jeder kennt jeden" schafft zu große Abhängigkeiten und macht aus deinem Design einen dicken, nicht lösbaren Klumpen der recht schnell im Chaos endet.
-
ich habe ein ähnliches problem:
ich hab ne klasse menu und die soll bei erstellung eine objekt der klasse Clickbox machen also im constructor aber ich iwie klappt das nicht so ganz
-
MenuMain() //Constructor { Button Click(); } ~MenuMain() //Destructor { } void Update() { int temp; //PA_Put16bitPixel(0, 200, 60, PA_RGB(0, 31, 0)); //PA_Put16bitPixel(1, 200, 60, PA_RGB(0, 31, 0)); //PA_Put16bitPixel(1, Stylus.X, Stylus.Y, PA_RGB(0, 0, 0)); //Box(1,10,10,200,150,0,0,0); temp = Click.Update(); }
-
error: '((MenuMain*)this)->MenuMain::Click' does not have class type
-
UdoN schrieb:
MenuMain() //Constructor { Button Click(); }Was soll der Funktionsprototyp im Konstruktor?
Button Click(); // Funktionsprototyp Button Click; // Variablendeklaration mit StandardkonstruktoraufrufUnd selbst wenn du letzteres meintest: Du würdest eine LOKALE Variable erzeugen, die nur im Konstruktor gültig ist... Der Name ist auch bescheiden gewählt, für mich ist "Click" eine Aktion, kein Objekt.
Du willst wohl eher eine Membervariable:
// Im Header class MenuMain { private: Button clickButton; // Membervariable - Objektweit gültig //... }cu André