2010-03-17 17 views
5

per qualche ragione sto pensando di implementare l'interfaccia all'interno di una qualche funzione (metodo) come classe locale.Implementare la classe astratta come classe locale? pro e contro

consideri seguente:

class A{ 
public: 

    virtual void MethodToOverride() = 0; 

}; 

A * GetPtrToAImplementation(){ 

    class B : public A { 
    public: 
     B(){} 
     ~B(){} 

     void MethodToOverride() { 
      //do something 
     } 
    }; 

    return static_cast<A *>(new B()); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    A * aInst = GetPtrToAImplementation(); 

    aInst->MethodToOverride(); 

    delete aInst; 
    return 0; 
} 

le ragioni per cui lo sto facendo sono:

  1. sono pigro per implementare classe (B) in file separati
  2. MethodToOverride pochi delegati chiamano ad altra classe
  3. Classe B non dovrebbe essere visibile ad altri utenti
  4. nessuna necessità di preoccuparsi ab Eliminazione di unInst poiché i puntatori intelligenti vengono utilizzati nell'implementazione reale

Quindi la mia domanda è se sto facendo bene?

Grazie in anticipo!

+0

Perché non puoi semplicemente definire 'B' completamente (non locale) nel file di implementazione per' A'? –

+1

Solo un nitpick, ma A dovrebbe avere un distruttore virtuale – jpalecek

+0

A è solo un'interfaccia - dichiarata in un file di intestazione. Inoltre, B non può essere visibile all'esterno dell'unità di traduzione in cui è definita GetPtrToAImplementation. – sinek

risposta

5
  1. Si potrebbe definire B nello spazio dei nomi senza nome del file di implementazione in cui si implementa GetPtrToAImplementation().

  2. A dovrebbe avere un operatore virtuale.

  3. Secondo lo standard C++ corrente, non è possibile utilizzare le classi locali come argomenti del modello. (Il che significa che non puoi usarli con l'STL, per esempio.)

+0

@sbi: sembra che sia tempo per me di riposarmi dato che non ricordo gli spazi dei nomi senza nome :) p.s. grazie per le informazioni che non possono essere utilizzate come argomenti del modello poiché non lo sapevo! – sinek

Problemi correlati