2011-04-16 17 views
5

Intentando crear una clase de tipo de controlador donde, debajo, Base es el controlador al que se le pasa un tipo en la creación de instancias. El tipo, el 2 en este caso, se usa para construir el objeto derivado correcto.Creación de objetos derivados de la clase base

Mi compilador está arrojando un error de sintaxis de Declaración en la línea "Clase Base".

Mi objetivo final es ser capaz de hacer esto:

Base *B; 

    B = new Base(2); 
    if(B) 
    { 
     B->DoStuff(); 
     B->DoMoreStuff(); 
     delete B; 
    } 

Aquí está mi código que no se compilará ...

class Base 
{ 
public: 

    Base(int h); 
    virtual ~Base(); 

private: 
    int hType; 
    Base *hHandle; 
}; 


class Derived1 : public Base 
{ 
public: 
    Derived1(); 
    virtual ~Derived1(); 

}; 

class Derived2 : public Base 
{ 
public: 
    Derived2(); 
    virtual ~Derived2(); 

}; 

Base::Base(int h) 
{ 
    hType = h; 

    switch(h) 
    { 
     case 1: 
      hHandle = new Derived1; 
     break; 

     case 2: 
      hHandle = new Derived2; 
     break; 

    } 
} 


Derived1::Derived1():Base(1) 
{ 
    printf("\nDerived1 Initialized\n\n"); 
} 

Derived2::Derived2():Base(2) 
{ 
    printf("\nDerived2 Initialized\n\n"); 
} 

A continuación se actualiza para mostrar el código fuente completo de la . Creo que ahora entiendo por qué no compilará. Como se señala más adelante, tengo un bucle sin fin de llamadas a 'nuevo'

#include <stdio.h> 

class Base 
{ 
public: 

    Base(); 
    Base(int h); 
    Create (int h); 
    virtual ~Base(); 

private: 
    int hType; 
    Base *hHandle; 
}; 


class Derived1 : public Base 
{ 
public: 
    Derived1(); 
    virtual ~Derived1(); 

}; 

class Derived2 : public Base 
{ 
public: 
    Derived2(); 
    virtual ~Derived2(); 

}; 

Base::Base() 
{ 

} 

Base::Base(int h) 
{ 
    Create(h); 
} 

Base::Create(int h) 
{ 
    hType = h; 

    switch(h) 
    { 
     case 1: 
      hHandle = new Derived1; 
     break; 

     case 2: 
      hHandle = new Derived2; 
     break; 

    } 
} 

Derived1::Derived1() 
{ 
    printf("\nDerived1 Initialized\n\n"); 
} 

Derived2::Derived2() 
{ 
    printf("\nDerived2 Initialized\n\n"); 
} 
+0

¿Cuál es el texto del error? Si se refiere a la primera línea del fragmento de código, eso * no * se ve * incorrecto. – ssube

+2

¿Qué hay del tiempo de ejecución? Cuando creas una Base (1), el constructor crea una nueva Derivada, que llama a su clase base, Base (1), que crea una nueva Derivada, que llama a su clase base ... –

+0

@Eric: usa cualquiera de los 'std' :: unique_ptr', 'boost :: scoped_ptr' o' std :: auto_ptr' (siendo este último el peor). Tiene una pérdida de memoria en su muestra de juguete:/ –

Respuesta

2

Parece que estamos tratando de hacer un class factory.

Recomiendo que tenga un método estático en Base que devuelva Derived1 o Derived2.

class Base 
{ 
public: 
    static Base* Create(int); 
    virtual void DoStuff() = 0; 
} 

class Derived1 : public Base 
{ 
    Derived1() 
    { 
     printf("\nDerived1 Initialized\n\n"); 
    } 

    virtual void DoStuff() 
    { 
    } 
} 

class Derived2 : public Base 
{ 
    Derived2() 
    { 
     printf("\nDerived2 Initialized\n\n"); 
    } 

    virtual void DoStuff() 
    { 
    } 
} 

Base* Base::Create(int n) 
{ 
    if (n==1) 
     return new Derived1(); 
    else if (n==2) 
     return new Derived2(); 
    else 
     return nullptr; 
} 

void main() 
{ 
    Base* B = Base::Create(2); 
    if(B) 
    { 
     B->DoStuff(); 
     delete B; 
    } 
} 
+0

esto es interesante, puedo leer/entender esto, pero todavía estoy rascándome por qué mi código no compilará? Esto finalmente no responde mi pregunta. No quiero que la persona que llama tenga que conocer los detalles de Base :: Create. Quiero que la persona que llama simplemente llame a la nueva Base (escriba) si eso es posible. – Eric

+0

Primero, su código está tratando de llamar a funciones que no ha declarado, tendría que hacer métodos proxy que llamen a sus contrapartes en hHandle. En segundo lugar, y más notablemente no será capturado por el compilador, la creación de Derived1 llamará al constructor de Base para crear otra instancia de Derived1 en un bucle sin fin. –

+0

Ignora la primera parte de ese último comentario ... Si la clase Base tiene un error de sintaxis, es probable que se deba a que falta un punto y coma encima, posiblemente en un archivo de inclusión. No veo nada malo con esa línea. ¿Puede privide el error completo del compilador? –

Cuestiones relacionadas