2013-04-25 3 views
8

код, что я написал:Как реализовать две структуры, которые могут обращаться друг к другу?

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

Сообщение компиляции:

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

Я знаю, почему этот код не является правильным, но я не знаю, как реализовать два структур, которые могут доступ друг к другу. Есть ли элегантный способ? Заранее спасибо.

+0

Я перемаркировал это как C++, так как это не C. – unwind

ответ

16

Если вы хотите сохранить ту же самую подпись ваших функций-членов, вы должны отложить определение функций членов, пока оба определения класса не были замечены

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

Вы также можете использовать const& аргументы функции (более высокая производительность, когда A и B являются большими), но даже тогда вы должны отложить определения функций до тех пор, пока не будут обнаружены оба определения классов.

+1

И я бы просто отметил, что существует нечто вроде 'const A & a'. – Vyktor

+0

Вы единственный, кто утверждает, что указатель не нужен, и я проверяю ваш код, работает! Вы специалист по C++! – Sayakiss

+0

@Vyktor tnx, я добавил предложение на этот счет. – TemplateRex

Смежные вопросы