Verschachtelte Klassen, bzw. Klassen uebergeben
-
Hi,
ich habe fuer mein Program eine selbstgeschriebene Log-Klasse, die beim Aufruf der Funktion
log(string txt)etwas in eine Log-Datei schreibt und das gleiche auf dem Display ausgibt, wenn Option v gesetzt ist.Ausserdem habe ich eine Optionen-Klasse, die fuer mich die Kommandozeilenargumente parst ueberprueft und auswertet. Diese Klasse soll auch die Optionen setzen.
Dabei soll diese Klasse auf Log zugreifen koennen. Gleichzeitig muss Log aber wissen, wie die Logdatei heisst. Das steht in der Optionenklasse.Und dann gibt es noch die Haupt-Klasse, in der mein eigentlicher Code steht. Diese Haupt-Klasse braucht die Optionen aus der Optionen-Klasse und die
log()Funktion mit dem richtigen Dateinamen aus der Log-Klasse.Wie macht man sowas am geschicktesten?
------
Meine Idee war:
in der main die opt Klasse erstellen, die erstellt intern die Log-klasse, und das Paket dann an Haupt weiterzugeben. Da koennte man dann log = opt.log setzen... Irgendwie klappt das nur nicht. Der Compiler protestiert bei:... Optionen opt(argc,argv); Haupt hase(opt); ...Irgendwelche Vorschlaege wie das besser geht?
Oder wie mache ich ein member-Objekt, dass innerhalb der ganzen Klasse verfuegbar ist, aber nicht im Konstruktor initialisiert wird? Oder kann man Objekte ueberschreiben?Danke!
-
maxi_muster schrieb:
Wie macht man sowas am geschicktesten?
Die Optionen-Klasse sollte dafür zuständig sein, die Kommandozeilen-Argumente zu parsen und die dadurch gesetzten Optionen über irgendwelche Getter zur Verfügung stellen. Sie sollte nicht eine Instanz der Log-Klasse beinhalten. Die hat da drin einfach nichts zu suchen.
Ob dein Optionsobjekt dann dem Logklassen-Objekt sagt, wie die Datei zu heißen hat, oder ob dein Hauptprogramm den Dateinamen vom Optionsobjekt abfragt und ans Logobjekt weitergibt, ist Geschmackssache, ich würds aber eher so machen, dass die Optionsklasse mit der Logklasse nichts zu tun hat.
Irgendwie klappt das nur nicht. Der Compiler protestiert bei:
"Irgendwie" ist hier völlig fehl am Platz. Der Compiler protestiert meist sehr spezifisch, und aus der Fehlermeldung kann man meistens ziemlich gut erkennen was ihm nicht schmeckt. Wenn du also nicht selbst sehen kannst, wo das Problem ist, solltest du uns die Fehlermeldung nicht vorenhalten (Siehe auch Link in meiner Signatur).
Oder wie mache ich ein member-Objekt, dass innerhalb der ganzen Klasse verfuegbar ist, aber nicht im Konstruktor initialisiert wird?
Memberobjekte werden immer initialisiert. Evtl. könntest du mit Referenzen oder Zeigern arbeiten.
Oder kann man Objekte ueberschreiben?
Nein. Man kann ihnen höchstens einen neuen Wert zuweisen.
-
Sry, ich find das aber schon schwierig. Ich habe versucht
Codebeispiele auf das Wesentliche
zu reduzieren. Dabei habe ich die Namen der Klassen hier anders genannt. Und dann dachte ich dass die Compiler-Nachricht nicht relevant sei. Ausserdem habe ich versucht
nach dem, was ich erreichen moechte und nicht danach womit ich es erreichen moeche
zu fragen. Das wurde dann wohl etwas "wurstig" - ich bin halt gerade noch dabei c++ zu lernen und weiss nicht genau wo, und nach welchen Begriffen ich eigentlich suchen soll.
Aber hier noch mal meine Frage anders formuliert:
Der folgende Code funktioniert[*]:class ABC { int zahl; public: ABC(int zahl_strich); }; ABC::ABC(int zahl_strich) { zahl = zahl_strich; } int main() { ABC objekt(3); return 0; }Warum funktioniert der folgende Code nicht?
class DEF { [...] }; class ABC { DEF zahl; public: ABC(DEF zahl_strich); }; ABC::ABC(DEF zahl_strich) { zahl = zahl_strich; } int main() { DEF anderes_objekt(); ABC objekt(anderes_objekt); return 0; }Was ist der Standardweg "so ein Problem" zu loesen? (Ich hoffe "So ein Problem" ist aus den Codebeispielen oben ersichtlich)
[*] ich habe den Code nicht getestet, aber ich glaube er wuerde funktionieren

-
maxi_muster schrieb:
...
Warum funktioniert der folgende Code nicht?
... int main() { DEF anderes_objekt(); // HIER ABC objekt(anderes_objekt); return 0; }...
weil du in der mit "HIER" markierten Zeile kein Objekt der Klasse DEF instanziierst, sondern eine Funktion anderes_objekt() mit Rückgabetyp DEF deklarierst.
richtig wäre:
... int main() { DEF anderes_objekt; ABC objekt(anderes_objekt); return 0; }Die Klammern verwendet man nur, wenn dem Konstruktor Werte übergeben werden sollen, was bei DEF wohl nicht der Fall ist