Durchreichen von Attributen bei Composition
-
Hallo,
ich stehe vor etwa folgendem Problem:
Von 2 Templates wurden 2 Klassen A und B vererbt. Das TemplateB verwaltet dabei die Objekte des TemplatesA. In A wurden zusätzlich zu TemplateA Funktionen implementiert, in B zusätzliche Funktionen zu TemplateB. Das gleiche gilt für C und D, welche sich gegenüber A und B in den Membervariablen und –funktionen unterscheiden.
Die Klasse E enthält jeweils ein Objekt der Klassen B und D und verwaltet diese. Zudem enthält sie Werte (z.B. Dichte, etc.) die für B und D gelten.Ich möchte nun einen Wert von E an A durchreichen. Leider habe ich nirgends gelesen, wie das „Upcasten“ im Falle von Composition möglich ist. Hier habe ich schematisch meinen Versuch abgebildet: Ich habe die class E als friend class von class A definiert und versucht in der Funktion setWertA() auf die Werte der class E mittels der Funktion getWertE() zuzugreifen.
Allerdings tauchen beim Kompilieren folgende Fehlermeldungen auf:
error: ’A’ was not declared in this scope
error: template argument 1 is invalid
error: ISO C++ forbids declaration of ‘A’ with no typeWie könnte ich den wertE an die class A durchreichen?
Vielen Dank!
[cpp] class TemplateA; class TemplateB; class A : public TemplateA { private: bool wertA; friend classE; public: void setWertA(E& data) { if (data.getWertE() >= 10) { wertA = true; } else { wertA = false; } } } class B : public TemplateB { ...; } class C : public TemplateA { …; } class D : public TemplateB { ...; } class E { private: int wertE; public: B memClassB; D memClassD; const int& getWertE() const { return wertE; } } main { ...; } [/cpp]
-
Ich glaube du denkst da viel zu kompliziert. Du brauchst bloß mal deine Abhängigkeiten richtig zu ordnen:
class TemplateA{}; class TemplateB{}; class B : public TemplateB { }; class C : public TemplateA { }; class D : public TemplateB { }; class E { private: int wertE; public: B memClassB; D memClassD; const int& getWertE() const { return wertE; } }; class A : public TemplateA { private: bool wertA; public: void setWertA(E& data) { if (data.getWertE() >= 10) { wertA = true; } else { wertA = false; } } };
-
Danke für die rasche Antwort!
Ich hätte noch zwei Fragen:
Sind beide Funktionen f() und g() möglich, d.h. kann ich sowohl auf die private als auch die public Variablen zugreifen?
[cpp] class A { private: int prWert; public: int puWert; } class B { private: int Wert; public: A a; void f() { Wert = a.prWert ; } void g() { Wert = a.puWert ; } } [/cpp]Macht es einen Unterschied ob ich A als friend class in private oder public definiere? Welche der Funktionen v() bis y() sind gültig?
[cpp] class A { private: int Wert; void v() { Wert = B::prWert ; } void w() { Wert = B::puWert ; } void x() { Wert = C::prWert ; } void y() { Wert = C::puWert ; } } class B { private: int prWert; friend class A; public: int puWert; } class C { private: int prWert; public: friend class A; int puWert; } [/cpp]Vielen Dank!
-
rickie schrieb:
Sind beide Funktionen f() und g() möglich, d.h. kann ich sowohl auf die private als auch die public Variablen zugreifen?
Selbstverständlich kannst du nicht auf private Elemente zugreifen. Private ist ja gerade dazu da, um das zu verhindern.
Macht es einen Unterschied ob ich A als friend class in private oder public definiere? Welche der Funktionen v() bis y() sind gültig?
Friend funktioniert genau andersrum wie du denkst. Daher sind nur w() und y() gültig. Damit v oder z funktionieren müsste die Klasse A die Klassen B bzw. C als friend haben.
-
Danke für die Klarstellungen!