2010-03-17 18 views
5

por alguna razón, estoy pensando en implementar la interfaz dentro de alguna función (método) como clase local.¿Implementar clase abstracta como una clase local? pros y contras

Considere lo siguiente:

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; 
} 

las razones por las que estoy haciendo esto son:

  1. soy perezoso para implementar la clase (B) en archivos separados
  2. MethodToOverride sólo llaman a los delegados a otra clase
  3. La clase B no debería estar visible para otros usuarios
  4. sin necesidad de preocuparse ab eliminando unInst ya que los punteros inteligentes se utilizan en la implementación real

Así que mi pregunta es si lo estoy haciendo bien?

¡Gracias de antemano!

+0

¿Por qué no puede simplemente definir 'B' completamente (no local) en el archivo de implementación para' A'? –

+1

Solo un pequeño detalle, pero A debería tener un destructor virtual – jpalecek

+0

A es solo una interfaz, declarada en un archivo de encabezado. Además, B no puede ser visible fuera de la unidad de traducción donde se define GetPtrToAImplementation. – sinek

Respuesta

5
  1. Se podría definir B en el espacio de nombres sin nombre del archivo de aplicación donde se implementa GetPtrToAImplementation().

  2. A debe tener un dtor virtual.

  3. Según el estándar actual de C++, no puede usar clases locales como argumentos de plantilla. (Lo que significa que no puede usarlos con el STL, por ejemplo)

+0

@sbi: parece que es hora de que descarte, ya que no recuerdo los espacios de nombre sin nombre :) p.s. ¡Gracias por la información de que no pueden usarse como argumentos de plantilla ya que no lo sabía! – sinek

Cuestiones relacionadas