2016-03-26 4 views
0

Wie lautet die Syntax zum Aufrufen einer Methode in einem besitzenden Objekt aus einem eigenen Objekt in C++?Wie rufe ich eine Methode in einem besitzenden Objekt in C++ auf?

Übergeordnete Klasse:

class Parent 
{ 
private: 
    Child child; 

public: 
    Parent() 
    { 
     addChild(child); 
    } 

    void MethodToBeCalled(int someArgument) 
    { 

    } 
}; 

Kinderklasse:

class Child 
{ 
private: 
    void myVoid() 
    { 
     //Call parent method somehow 
    } 

public: 
    Child() 
    { 

    } 
}; 

Ich versuchte, meine Frage so einfach und allgemein wie möglich zu machen (von Nutzen wie möglich, so viele zu sein). Lass es mich wissen, wenn ich es noch klarer machen kann.

Vielen Dank!

+0

Sie müssen einen Verweis auf "Parent" in der Klasse "Child" kennen, um dies zu tun. –

+0

@ πάνταῥεῖ ja, danke! aber ich verstehe nicht, wie diese Syntax in meinem Beispiel aussehen würde? – Daggepagge

+0

Es gibt keine "Eltern-Kind" -Beziehung zwischen Ihren Objekten in dem von Ihnen dargestellten Codebeispiel. Dies macht den Titel der Frage sehr irreführend. Es gibt eine "aggregate-member" ("container-contained") -Beziehung. Diese Beziehung impliziert jedoch im Allgemeinen keinen Zugang vom Container zum Container. Dafür gibt es spezielle Hacks (wie das bekannte Makro "container_of"), aber sie sind nur eingeschränkt anwendbar. – AnT

Antwort

1

In Ihrem Fall können Sie nicht, denn Child und Parent haben nichts gemeinsam, außer dass sie beide erben Component. Child muss ein Parent Objekt haben, um MethodToBeCalled() aufrufen zu können.

+0

Ich habe gehört, dass es möglich sein sollte, indem Sie einen Verweis auf den Eltern im Konstruktor von Childs senden. Aber ich verstehe nicht, wie diese Syntax aussehen würde? – Daggepagge

+1

Erstellen Sie ein "Parent" -Objekt in Ihrer Klasse, dann können Sie dem Konstruktor "Child (Parent & Parent)" ein Argument hinzufügen. Dann können Sie das übergeordnete Objekt von Ihrer Klasse auf dieses übergeordnete Element setzen (z. B. this -> parent = parent; '). Nachdem Sie 'MethodToBeCalled()' 'wie diese' parent.MethodToBeCalled (0); ' – Rakete1111

+0

Vielen Dank! Dieser Kommentar kommt mir am nächsten. – Daggepagge

3

Hier ist ein Beispiel. Ich hatte den Code ein wenig zu ändern, um es kompilieren zu erhalten:

class Component {}; 

class Parent; 

class Child : public Component 
{ 
private: 
    inline void myVoid(); 
    Parent &parent_ref; 

public: 
    Child(Parent &pr) : parent_ref{pr} {} 
}; 

class Parent : public Component { 
private: 
    Child child; 

public: 
    Parent() : child{*this} 
    { 
     // addChildComponent(child); 
    } 

    void MethodToBeCalled(int someArgument) 
    { 

    } 
}; 

inline void Child::myVoid() 
{ 
    parent_ref.MethodToBeCalled(1); 
} 
2

Wenn Sie sicher sind, dass Ihr Child Objekt ist Mitglied subobject von Parent Klasse (wie in Ihrem Beispiel), können Sie den container_of Trick verwenden (siehe Understanding container_of macro in the Linux kernel)

class Child 
{ 
private: 
    void myVoid(); 
}; 

class Parent 
{ 
public: 
    Child child; 

    void MethodToBeCalled(int someArgument) 
    { 
    } 
}; 

void Child::myVoid() 
{ 
    container_of(this, Parent, child)->MethodToBeCalled(42); 
} 

Offensichtlich Tricks wie diese sofort die Benutzerfreundlichkeit Ihrer Child Klasse beschränken, immer ein Mitglied der Parent Klasse zu sein (zumindest, wenn Sie beabsichtigen, auf sie myVoid() Methode aufrufen).

Eine viel bessere Idee wäre, nur einen Verweis auf das übergeordnete Objekt zum untergeordneten Objekt zu übergeben.

Verwandte Themen