selbes Objekt in mehreren Klassen nutzen
-
sW00p schrieb:
...
A() : i(1) {}
...(Ich weiß nicht genau, was Du daran nicht verstehst, deswegen rate ich mal:)
Einfache Initialisierungen ("i(1)") kannst Du in der sog. "Initialisierungsliste" (*) durchführen; Vorteil: Member (hier i) werden nur einmal initialisiert und bisweilen (bei Referenzen) geht es gar nicht anders.(*) gekennzeichnet mit einem ":" VOR dem Funktionsrumpf, also vor dem ersten "{".
d.h. das wäre dasselbe wie:
class A{
public:
int i;
A(){ i=1;};
}????
/Edit/
ich hab die Methode mit dem Pointer jetzt mal ausprobiert und bekomme da nur folgenden fehler:
syntax error : missing ';' before identifier 'settings'mein code ist dieser hier:
class CSsaDlg: public CDialog{
CSettings* settings;
public:
CSsaDlg(CSettings* set) settings(set);
}genauso habe ich mal versucht an dem standard konstruktor rumzupfuschen:
class CSsaDlg : public CDialog
{
// Construction
CSettings* settings;
public:
CSsaDlg(CWnd* pParent = NULL,CSettings* set) settings(set);
}kommt aber genau dasselbe.
greetz
-
sW00p schrieb:
...
d.h. das wäre dasselbe wie:class A{
public:
int i;
A(){ i=1;};
}
[/cpp]Nicht ganz !
A(){ i=1;};wird intern zu
A() : i() { // i wird erstmal "default-konstruiert" .. i=1; // ... und dann zugewiesen };sW00p schrieb:
...
CSsaDlg(CSettings* set) settings(set); ... CSsaDlg(CWnd* pParent = NULL,CSettings* set) settings(set);Du hast auch nicht genau hingesehen beim Abtippen: Die Initialisierungsliste
- wird mit einem Doppelpunkt eingeleitet und
- ist Teil der Implementierung des Konstruktors; Deswegen müssen mindestens leere "{}" folgen und wenn man die Implementierung getrennt wird (z.B. in ein cpp-File ausgelagert), gehört sie auch dahin.
=>
CSsaDlg(CSettings* set) : settings(set) {} ... CSsaDlg(CWnd* pParent = NULL,CSettings* set) : settings(set) {}
BTW1: In C++ ist es üblicher, statt "NULL" direkt eine "0" zu nehmen....
BTW2: Nach Default-Parametern ("pParent = NULL") darf kein "verpflichtender" mehr kommen (woher soll der Compiler sonst die Zuordnung hinbekommen ?). Also: Entweder auch für "set" einen Defaultwert angeben oder Parameter vertauschen oder Deafultwert für pParent weglassen.Gruß,
Simon2.
-
Simon2 schrieb:
sW00p schrieb:
...
d.h. das wäre dasselbe wie:class A{
public:
int i;
A(){ i=1;};
}
[/cpp]Nicht ganz !
A(){ i=1;};wird intern zu
A() : i() { // i wird erstmal "default-konstruiert" .. i=1; // ... und dann zugewiesen };sW00p schrieb:
...
CSsaDlg(CSettings* set) settings(set); ... CSsaDlg(CWnd* pParent = NULL,CSettings* set) settings(set);Du hast auch nicht genau hingesehen beim Abtippen: Die Initialisierungsliste
- wird mit einem Doppelpunkt eingeleitet und
- ist Teil der Implementierung des Konstruktors; Deswegen müssen mindestens leere "{}" folgen und wenn man die Implementierung getrennt wird (z.B. in ein cpp-File ausgelagert), gehört sie auch dahin.
verdammt du ahst recht ^^ weggeschaut, ignoriert, gekniffen *fg
=>
CSsaDlg(CSettings* set) : settings(set) {} ... CSsaDlg(CWnd* pParent = NULL,CSettings* set) : settings(set) {}
BTW1: In C++ ist es üblicher, statt "NULL" direkt eine "0" zu nehmen....
BTW2: Nach Default-Parametern ("pParent = NULL") darf kein "verpflichtender" mehr kommen (woher soll der Compiler sonst die Zuordnung hinbekommen ?). Also: Entweder auch für "set" einen Defaultwert angeben oder Parameter vertauschen oder Deafultwert für pParent weglassen.Gruß,
Simon2.
werde ich mal ausprobieren ob das mit dem vertauschen funzt.
zu btw1:
der konstruktor wurde vom visual c++ erstellt, daher NULL und nich 0, aber danke für den hinweis
zu btw2:
kann ich denn den default wert für pParent einfach weglassen, wenn doch vc in extra erzeugt hat?/EDIT/
oh was mit da grad auffält was ich vergessen ahtte hinzuschreiben ist:
das mitCSsaDlg(CSettings* set) settings(set);
...
CSsaDlg(CWnd* pParent = NULL,CSettings* set) settings(set);bezog sich hierauf:
class C { // hält einen Pointer auf ein A
A* meinA;
public:
C(A* a) meinA(a) {}
void incA() {++a->i; }
};und da ist ja auch kein : zu sehen.
greetz
/EDIT2/
so ich glaub jetzt hab ich kapiert wie du das meinst.geht auch mit dem : ^^
ich glaub wir ham blos ein wenig aneinander vorbeigeredet, ich versuch das hier nochmal zu verdeutlichen. Wir sind aber nahe an der Lösung ^^class CSettings { public: CSettings(); . . private: . . . }; class CSsaDlg : public CDialog { public: CSsaDlg(CSettings* settings,CWnd* pParent = NULL) . . private: . . . protected: . . . }; class CSettings_general : public CDialog { public: CSettings_general(CSettings* set,CWnd* pParent = NULL); . . private: . . . protected: . . . };jetzt brauche ich in den klassen CSsaDlg und CSettings_general dasselbe objekt von CSettings.später kommen noch weitere klassen dazu, die auch wieder genau desselbe objekt von CSettings haben sollen.sprich CSettings ist global einmal vorhanden.
eine main hab ich nicht, da GUI.
ich hoffe nun ist deutlich geworden was ich brauche *gg
manchmal drück ich mich ein wenig unverständlich aus ^^greetz