2013-04-25 7 views
8

Il codice di quello che ho scritto:Come implementare due strutture che possono accedere l'un l'altro?

struct A; 
    struct B; 
    struct A 
    { 
     int v; 
     int f(B b) 
     { 
      return b.v; 
     } 
    }; 

    struct B 
    { 
     int v; 
     int f(A a) 
     { 
      return a.v; 
     } 
    }; 

Il messaggio di compilazione:

|In member function 'int A::f(B)':| 
11|error: 'b' has incomplete type| 
7|error: forward declaration of 'struct B'| 
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===| 

so, perché che il codice non è corretto, ma non so come implementare due le strutture che possono accedere l'un l'altro. C'è un modo elegante? Grazie in anticipo.

+0

Ho re-taggato questo come C++, poiché non è C. – unwind

risposta

16

Se si desidera mantenere la stessa firma delle tue funzioni membro, si deve rinviare la definizione delle funzioni membro fino a quando entrambe le definizioni di classe sono stati visti

// forward declarations 
    struct A; 
    struct B; 

    struct A 
    { 
     int v; 
     int f(B b); // works thanks to forward declaration 
    }; 

    struct B 
    { 
     int v; 
     int f(A a); 
    }; 

    int A::f(B b) { return b.v; } // full class definition of B has been seen 
    int B::f(A a) { return a.v; } // full class definition of A has been seen 

Si potrebbe anche usare const& argomenti della funzione (prestazioni migliori per quando A e B sono grandi), ma anche in questo caso è necessario posticipare le definizioni delle funzioni fino a quando non vengono visualizzate entrambe le definizioni di classe.

+1

E vorrei solo sottolineare che qualcosa come 'const A & a' esiste. – Vyktor

+0

Sei l'unico che sostiene che il puntatore non è necessario e che collaudo il tuo codice, funziona! Sei un esperto di C++! – Sayakiss

+0

@Vyktor tnx, ho aggiunto una frase in tal senso. – TemplateRex

Problemi correlati