klasse in klasse und vererbung
-
hallo,
ich habe folgendes problem: ich möchte bestehenden, nicht sehr objektorientierten code in oo-code mit einer guten klassenhierarchie umwandeln. nun gehört zu diesem code folgende klasse:class greatDataStructure : public GUIkram { public: class data1 { /* ... */ }; class data2 { /* ... */ }; /* .... */ };
die klassen data1 und data2 sollen an die klasse greatDataStructure gebunden sein, insofern passt es wohl ganz gut, dass sie da drinnen definiert worden sind. nun will ich aber eine eigene dataStructure klasse als base basteln, von der dann abgeerbet werden soll, so dass der selbst entwickelte code unabhängig von jedeweder GUIkram ist. die data1, data2 klassen sind ihrerseits wieder abhängig von spezifischen sachen auf der implementierungsebene. ich möchte gerne, dass in der neuen dataStructure schon feststeht, dass sie data1base und data2base braucht und dass beide auch an dataStructure gebunden sind. wenn ich das richtig verstanden habe, kann ich aber in einer abgeleiteten klasse eine innere klasse nicht erweitern oder ? also dass ich dort dann data1base bzw data2base weitere spezifischere elemente hinzufüge. gibt es eine andere möglichkeit, ohne, dass ich aus data1base / data2base eigenständige klassen machen muss, von denen dataStructure dann zb ein objekt erhält ?
vielen dank schon mal im voraus.
gruss,
flashy
-
öh, ich weiss nicht ob ich dich richtig verstehe, aber hilft dir das Beispiel?
class foo { public: class bar { public: virtual ~bar(); virtual void tu_was(); }; }; class foo2 { public: class bar2 : public foo::bar { public: void tu_was(); }; };
-
kingruedi schrieb:
öh, ich weiss nicht ob ich dich richtig verstehe, aber hilft dir das Beispiel?
class foo { public: class bar { public: virtual ~bar(); virtual void tu_was(); }; }; class foo2 { public: class bar2 : public bar { public: void tu_was(); }; };
Meinst du da nicht vielleicht:
class bar2 : public foo::bar{
-
Ist es eigentlich nicht ein wenig doof, eine innere Klasse zu definieren, ich meine abgesehen von der Unübersichtlichkeit sieht es für mich häßlich aus.
(kann mich natürlich irren, lasse mich gerne belehren)
-
@***
ups, war natürlich ein Fehler. Hab ich mal korrigiert
-
vielen dank für eure antworten, so ähnlich habe ich mir das auch gedacht, allerdings ist es halt doof, eine klasse in einer klasse zu bauen. daher wüsste ich gerne, ob ich die inneren klassen abhängig machen kann von der äußeren. dass also ihre benutzung auf die äußere klasse beschränkt ist. kann man sowas mit namespaces erreichen ?
-
Als ein Beispiel dafür fiele mir Referenzzählung ein....
class String { public: String(const char *initValue = ""); String(const String& rhs); ~String(); int getRef(){return value->refCount;}; private: struct StringValue{ int refCount; char *data; StringValue(const char* initValue); ~StringValue(); }; StringValue *value; };
Aus Scott Meyers "More effective C++".....
Hier wird zwar das Schlüsselwort "struct" verwendet, kommt aber im Grunde auf das gleiche hinaus...
-
flashy schrieb:
vielen dank für eure antworten, so ähnlich habe ich mir das auch gedacht, allerdings ist es halt doof, eine klasse in einer klasse zu bauen. daher wüsste ich gerne, ob ich die inneren klassen abhängig machen kann von der äußeren. dass also ihre benutzung auf die äußere klasse beschränkt ist. kann man sowas mit namespaces erreichen ?
Damit eine Klasse so definieren, dass Ihre Benutzung auf konkreter Ebene beschränkt ist, nützt es sich entweder einen anonymen Namensraum zu verwenden oder innere Klasse in der protected/private Section äusserer Klasse zu definieren
-
alles klar. hat mir schon sehr weitergeholfen. vielen dank !
flashy