Iniezione di membri e funzioni in C ++ in più classi

4

Ho un problema in cui una varietà di classi in C ++ vorranno alcune funzionalità che non sono né una relazione "ha una" né una "è una". Il problema è che ci sono alcuni membri con funzioni associate che hanno a che fare con la gestione dei puntatori giocatore che alcuni menu e oggetti di gioco dovranno avere. Potrei copiare la funzionalità su tutti loro, ma preferirei iniettare la funzionalità come consiglio, in modo che la funzionalità sia condivisa. Le classi che richiedono la funzionalità non condividono un super nell'albero della classe.

Normalmente potrei usare qualcosa di simile all'orientamento dell'aspetto, creando un Aspetto che abbia tutte le funzionalità desiderate e aggiungendolo a tutte le classi come consiglio, ma a causa della base di codice C ++ in azienda non posso farlo.

C'è una buona soluzione "plain C ++" a questo che sto trascurando? (c ++ 11 permesso) In questo momento spero di usare le interfacce per fare qualcosa di simile.

modifica: sperimenterò ogni soluzione, magari facendo ulteriori domande e individuerò la soluzione migliore nei prossimi giorni. voglio dare questa considerazione approfondita per l'uso futuro.

    
posta calben 18.06.2015 - 16:44
fonte

2 risposte

2

Tutte le funzionalità sono conosciute al momento della compilazione? Se è così, La metaprogrammazione del modello potrebbe funzionare. Guarda un esempio reale qui , ma qualcosa di simile ---

template<class T> ExtraFunctionality {
  //do something with instances of class T
}

template<class T> OtherExtraFunctionality {
  //do something else with instances of class T
}

template< template<class> class Extras = ExtraFunctionality >
class Menu: public AbstractMenu, Extras<Menu> {
  typedef Extras<Menu> Ext;  //for convenience - not required
  //do something with what you inherited from Extras.
}

template< template<class> class Extras = ExtraFunctionality >
class GameObject: public AbstractGameObject, Extras<GameObject> {
  //same deal
}

ora puoi istanziare

Menu<> menu;

per Menu con ExtraFunctionality o

Menu<OtherExtraFunctionality>

se vuoi qualcosa di diverso.

Questo è un esempio di CRTP menzionato da @Deduplicator.

    
risposta data 18.06.2015 - 18:13
fonte
2

Puoi provare a utilizzare std :: function per passare i puntatori di funzione in giro, o semplicemente raw puntatori di funzione se non (ho usato quest'ultimo per le tabelle di ricerca delle routine per chiamare in base a qualche input di dati)

    
risposta data 18.06.2015 - 17:46
fonte

Leggi altre domande sui tag