Frage zur Objektorientierten Programmierung
-
du fragst also, wie du auf die privaten Daten der Klasse A in B zugreifen kannst?
-
Dier Situation so wie du sie schilderst ist ganz gewiss ganz Standardverfahren. Es scheint als würde zwischen den Beiden Klassen und ihren Instanzen ein ganz besonderes Verhältnis bestehen, wahrscheinlich aufgrund der konkreten Aufgabe.
Generell finde ich die Idee nicht gut und nicht richtig, wenns wirklich so funktioniert wie du sagst. Aber obs in diesem speziellen Fall doch die richtige Lösung ist kann man nur beurteilen wenn man genau was in deiner "Vorlage" genau abgeht.
Du kannst dir mit C++ fast jede beliebig "schmutzige" Lösung zusammenbauen. Ob das wirklich sinnvoll ist muss man von Fall zu Fall neu entscheiden.mfg JJ
-
Sorry, ich hab mich verlesen. (Passiert einem Angänger halt noch ...)
Wenn Klasse B instanziert wird, dann übernimmt der Konstruktor von Klasse B
ein Objekt der Klasse A.
Mit diesem Objekt wird dann im Konstruktor der Klasse B auf die Funktion
GetName() der Klasse A zugegriffen die wiederum dann halt den vorher gesetzten Namen zurückgibt, dessen Deklaration in Klasse A als private erfolgte.
Das dürfte aber schon eine saubere Lösung sein, oder ?
-
Jo
-
Bitte 1 Frage noch:
In dieser Libary ist auch folgendes Konstrukt zu finden:
ObjectKlasseA.UrlaubsPlanung.Add("SommerUrlaub","start","ende") usw.
Was passiert hier ?
ObjectKlasseA ist die Instanz der Klasse A, aber woher kommt jetzt UrlaubsPlanung her? Ist das eine andere Klasse oder das Objekt einer anderen Klasse - wo wurde diese Objekt dann erzeugt ?
Die Funktion Add ist vermutlich dann eine Memberfunktion der ??Klasse URlaubsplanung ??
Wieso wird dieser Weg gewählt, denn wenn z.B. Klasse URlaubsplanung von Klasse A abgeleitet wäre, dann könnte das Objekt ObjectKlasseA doch direkt auf die Funktion Add zugreifen ?Gruß, Grisu1
-
Vermutlich, ist Urlaubsplanung ein ganz normales Member von ObjektKlasseA. Urlaubsplanung ist selbst wiederum ein Objekt. Zu seinen Methoden gehört Add() und vermutlich auch ein Remove() oder Delete(). Urlaubsplanung ist wahrscheinlich eine sogenannte Container-Klasse. In ihr werden vermulich Objekte vom Typ Urlaubsplan "verwaltet". Es gibt keine Vererbungsbeziehungen zwischen den Klassen ObjektKlasseA, Urlaubsplanung und Urlaubsplan.
Objektorientierung heisst nicht, das zwangsläufig Alles und Jedes von irgendwoher abgeleitet sein muss.mfg JJ
-
Vielen Dank !
-
Hi
ich weiß nicht ob das das ist was du suchst aber es gibt eine möglichkeit das zu tun
was du da machen willst.Hier ein Bsp:
class ObjectB; // forward decl. class ObjectA { int m_private_integer_variable; friend class ObjectB; public: ObjectA(){} ~ObjectA(){} }; class ObjectB { int m_integer_variable; public: ObjectB(){} ~ObjectB(){} void GreifAufObjectAInstanzZu(const ObjectA& instanz_von_object_a) { m_integer_variable = instanz_von_object_a.m_integer_variable; } };
Das ist nur ein Beispiel wie man das machen kann und auch nicht besonders schön
aber ich hoffe du verstehst jetzt wie man das macht.MfG eViLiSSiMo
-
Ja, Superklasse - Danke !
Jetzt hat sich bei mir wegen des letzten Beitrags von John Doe noch eine Frage
aufgetan:
Wie kann ein Objekt(das ja auf einer eigenen Klasse basiert) ein Member einer
anderen Klasse sein, bzw. wie muss ich das definieren.Wenn ich das so mache, dann krieg ich einen Fehler:
ClassB { public: void TestFunktionClassB(){AfxMessageBox("OK");}; }; ClassA { private: ClassB clssB; }; int main .... { ClassA clssA; clssA.clssB.TestFunktion(); . . .
-
Fast richtig,
ClassA { public: ClassB clssB; };
Allerdings würde man das in der Praxis eigentlich nicht so machen. Üblicherweise sind alle Member-Variablen private und damit nicht direkt zugreifbar. Zum Zugriff auf die Member-Variablen verwendet man Funktionen durch die dann der Zugriff reglementiert wird.
mfg JJ
-
Dann wäre dies doch eine saubere Möglichkeit:
//im Header ClassA
private: ClassB m_clssB;//Im Konstruktor von KlasseA
ClassB clssB = new ClassB();
m_clssB = clssB ;//Funktion in der ClassA
ClassB ClassA::GetAttachObject()
{
return m_clssB;
}Gruß, Grisu1
-
Wieder fast richtig,
ClassB& ClassA::GetAttachObject() { return m_clssB; }
Du gibst ein Kopie der Member-Variablen zurück, das ist wahrscheinlich nicht das was du beabsichtigst. Du musst als Returntype eine Referenz auf ClassB liefern.
mfg JJ
-
OK, habs kapiert und geb jetzt auch ruh.
Vielen Dank, hat mir wirklich weitergeholfen.Viele Grüße, Grisu1