2014-07-23 7 views
7

Ich frage mich, ob es möglich ist, einen Methodenaufruf an ein eingebettetes Objekt ohne Vererbung automatisch weiterzuleiten. Zum Beispiel:C++ Weiterleiten von Methodenaufrufen zum Einbetten von Objekten ohne Vererbung

Es könnte sehr nützlich sein, wenn das Erben von einer Basisklasse nicht möglich ist/nicht empfohlen. Derzeit ist die einzige Wahl, die ich habe, manuell embed Klassenmethoden in container Klasse umschreiben, und rufen Sie dann embed Methoden von container. Auch wenn der Prozess gescriptet werden kann, ist es immer noch ärgerlich und es scheint eine schlechte Lösung zu sein.

+0

Sie könnten "Container" sich wie ein intelligenter Zeiger verhalten und anwendbare Operatoren überladen (->, *) –

+0

http://stackoverflow.com/a/13885092/1147772 könnte helfen. Kommt private Vererbung auch in Frage? – Drax

+0

@Drax ja, auch außer Frage. – Pl4nk

Antwort

0
class embed 
{ 
public: 
    void embed_method(){return}; 
}; 

class container 
{ 
public: 
    void container_method(){return;} 
    embed GetObj(){return obj;} 

private: 
    embed obj; 
}; 

int main() 
{ 
    container object; 

    object.container_method(); // Local method call 
    object.GetObj().embed_method();  
} 
+1

Die Signatur sollte 'embed & GetObj()' oder 'embed GetObj()' – clcto

+0

@Samer Solution funktioniert, ist aber nicht "benutzerfreundlich" (so traurig, dass Überladung '.' Operator ist verboten ...) – Pl4nk

+0

Es ist möglich den Operator() 'der Elternklasse zu überladen, um so etwas wie' object() zu erhalten. embed_method() – paceholder

0
#include <utility> 

class Embed { 
public: 
    void embedMethod() { } 
}; 

class Container { 
private: 
    Embed embed; 
public: 
    void containerMethod() {} 

    template<typename ...Args, typename R> 
    R forward(R (Embed::* function)(Args...), Args &&...args) { 
    return (embed.*function)(std::forward<Args>(args)...); 
    } 
}; 

int main() { 
    Container c; 
    c.containerMethod(); 
    c.forward(&Embed::embedMethod); 
} 

Live demo.

ich das Design nicht bin Billigen, ist es sehr schlecht Verkapselung.

Verwandte Themen