2014-07-23 10 views
7

Mi chiedo se sia possibile inoltrare automaticamente una chiamata di metodo a un oggetto incorporato, senza ereditarietà. Ad esempio:C++ Chiamate di metodo per incorporare l'oggetto senza ereditarietà

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

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

int main() 
{ 
    container object; 

    object.container_method(); // Local method call 
    object.embed_method();  // 'Forward' call, obviously doesn't work 
} 

Potrebbe essere molto utile quando l'ereditarietà da una classe di base non è possibile/non consigliata. Attualmente, l'unica scelta possibile è di riscrivere manualmente i metodi di classe embed nella classe container e quindi chiamare i metodi embed da container. Anche se il processo può essere copiato, è ancora fastidioso e sembra essere una cattiva soluzione.

+0

È possibile che 'container' si comporti come un puntatore intelligente e sovraccarichi gli operatori applicabili (->, *) –

+0

http://stackoverflow.com/a/13885092/1147772 potrebbe essere d'aiuto. Anche l'ereditarietà privata è fuori discussione? – Drax

+0

@Drax si, anche fuori questione. – Pl4nk

risposta

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

la firma dovrebbe essere 'embed & GetObj()' o 'embed GetObj()' – clcto

+0

@Samer Solution funziona ma non è "user-friendly" (così triste che l'operatore '. Overloading 'è vietato ...) – Pl4nk

+0

E' possibile sovraccaricare 'operator()' della classe genitore per ottenere qualcosa come 'object(). 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.

Non sto condonare il design, è molto povera incapsulamento.

Problemi correlati