2011-01-16 14 views
5

Esto compila bien, aunque no quisiera intentar ejecutarlo todavía. Sin embargo ...forward declarando con información de herencia

//class base; 
//class derived; 
//class derived : public base; 

class base {}; 
class derived : public base {}; 

class other 
{ 
    public: 
     void func() {base1 = derived1;} 
     base* base1; 
     derived* derived1; 
}; 

void main() 
{ 
} 

... moviendo la clase otra por encima de la definición de base y derivados para los que no es una cosa similar que debo hacer en un programa de myne causas errores de compilación.

La solución obvia es reenviar base de declaraciones y derivadas que se muestran comentadas en la parte superior del código, sin embargo, esto causa que no se pueda convertir entre el error base * y el error * derivado. Intentar reenviar declarar incluyendo la información de herencia tampoco funciona.

Respuesta

9

Esto debería funcionar. Necesita mover otro hacia arriba

PERO declarar func a continuación. De esa forma, el func puede "ver" que deriva es de tipo base.

por ejemplo,

class base; 
class derived; 
//class derived : public base; 

class other 
{ 
    public: 
     void func(); 
     base* base1; 
     derived* derived1; 
}; 

class base {}; 
class derived : public base {}; 

void other::func() { base1 = derived1; } 
+0

Excelente. Funcionó bien, en esto y en el programa con el problema real. Espero que este sea el final del problema para siempre. – alan2here

4

No hay sintaxis para declarar prospectivas dos clases y especificando que uno hereda de la otra. Esto se debe a que la herencia puede ser compleja (múltiple y/o virtual), por lo que la asignación base1 = derived1 puede implicar cierta aritmética, y es difícil/imposible para el compilador generar esa aritmética cuando solo sabe que derived hereda de base.

Por lo tanto, para resolver su problema, puede hacer func no en línea (ver la respuesta de AbstractDissonance), o, si es absolutamente necesario que sea en línea, utiliza reinterpret_cast:

class base; 
class derived; 

class other 
{ 
    public: 
     void func() {base1 = reinterpret_cast<base*>(derived1);} 
     base* base1; 
     derived* derived1; 
}; 

Este es malo porque no se garantiza que funcione según el estándar C++, y seguramente no funcionará si usa herencia múltiple/virtual. Úselo solo si func tiene que ser lo más rápido posible (es decir, en línea), y si no necesita que su código sea portátil.

+1

Lo tendré en cuenta, pero use la otra solución por el momento. Es útil saber No me di cuenta de que reinterpret_cast podría usarse de esta manera. – alan2here