2013-04-25 11 views
8

Kod co napisałem:Jak zaimplementować dwie struktury, które mają do siebie dostęp?

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

Komunikat kompilacji:

|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) ===| 

wiem, dlaczego ten kod nie jest poprawny, ale nie wiem jak zaimplementować dwa konstrukcjom, które mogą uzyskać dostęp do siebie nawzajem. Czy istnieje jakiś elegancki sposób? Z góry dziękuję.

+0

Ponownie oznaczono to jako C++, ponieważ nie jest to C. – unwind

Odpowiedz

16

Jeśli chcesz zachować dokładnie taką samą sygnaturę swoich funkcji składowych, trzeba odłożyć definicji funkcji członka aż obie definicje klasy zostały zaobserwowane

// 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 

Można również użyć const& argumentów funkcji (lepsza wydajność, gdy są duże), ale nawet wtedy musisz odłożyć definicje funkcji, dopóki nie zobaczysz obu definicji klas.

+1

Zwracam uwagę, że istnieje coś takiego jak "const A & a". – Vyktor

+0

Jesteś jedynym, który twierdzi, że wskaźnik nie jest konieczny i testuję Twój kod, działa! Jesteś ekspertem od C++! – Sayakiss

+0

@Vyktor tnx, dodałem do tego zdanie. – TemplateRex

Powiązane problemy