2011-01-16 19 views
5

Questo compila bene, anche se io non vorrei provare a eseguirlo appena ancora. Tuttavia ...avanti dichiarando informazioni eredità

//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() 
{ 
} 

... spostando la classe altra al di sopra della definizione di base e derivati ​​per i quali esiste una cosa simile che devo fare in un programma di myne cause errori di compilazione.

La soluzione ovvia è di inoltrare declare base e derivato mostrato commentato nella parte superiore del codice, tuttavia ciò causa un errore di conversione tra errore base * e derivato *. Il tentativo di inoltrare dichiarare comprese le informazioni eredità dosn't funziona neanche.

risposta

9

Questo dovrebbe funzionare. È necessario spostare altri fino

MA dichiarare func di seguito. In questo modo func è in grado di "vedere" quello derivato è di tipo base.

esempio,

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

eccellente. Ha funzionato bene, in questo e nel programma con il vero problema. Spero che questa sarà la fine del problema per sempre. – alan2here

4

Non c'è sintassi per forward-dichiarare due classi e specificando che si eredita dall'altro. Ciò è dovuto al fatto che l'ereditarietà può essere complessa (multipla e/o virtuale), pertanto l'assegnazione potrebbe comportare alcune operazioni aritmetiche ed è difficile/impossibile per il compilatore generare quell'aritmetica quando sa solo che derived eredita da base.

Così, per risolvere il problema, è possibile effettuare func non in linea (vedere la risposta da AbstractDissonance), oppure, se è assolutamente necessario che sia in linea, utilizzare reinterpret_cast:

class base; 
class derived; 

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

Questo è male perché non è garantito il funzionamento dallo standard C++, e quasi certamente non funzionerà se si utilizza l'ereditarietà multipla/virtuale. Utilizzare questo solo se func deve essere il più veloce possibile (ad esempio in linea) e se non è necessario che il codice sia portatile.

+1

Io tenere questo in mente, ma uso l'altra soluzione, per ora. È utile sapere. Non mi rendevo conto che reinterpret_cast poteva essere usato in questo modo. – alan2here