2013-04-25 39 views
8

Mã những gì tôi đã viết:Làm cách nào để triển khai hai cấu trúc có thể truy cập lẫn nhau?

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

Thông điệp biên dịch:

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

tôi biết, tại sao mã số đó là không đúng, nhưng tôi không biết làm thế nào để thực hiện hai cấu trúc đó có thể truy cập lẫn nhau. Có cách nào tao nhã không? Cảm ơn trước.

+0

Tôi gắn lại thẻ này là C++, vì nó không phải là C. – unwind

Trả lời

16

Nếu bạn muốn giữ lại chữ ký chính xác cùng một chức năng thành viên, bạn phải trì hoãn việc định nghĩa các hàm thành viên cho đến khi cả hai định nghĩa lớp đã được nhìn thấy

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

Bạn cũng có thể sử dụng const& đối số chức năng (hiệu suất tốt hơn cho khi AB là lớn), nhưng thậm chí sau đó bạn phải trì hoãn các định nghĩa hàm cho đến khi cả hai định nghĩa lớp đã được nhìn thấy.

+1

Và tôi sẽ chỉ ra rằng một cái gì đó như 'const A & a' tồn tại. – Vyktor

+0

Bạn là người duy nhất tuyên bố con trỏ là không cần thiết và tôi kiểm tra mã của bạn, hoạt động! Bạn là một chuyên gia về C++! – Sayakiss

+0

@Vyktor tnx, tôi đã thêm một câu vào hiệu ứng đó. – TemplateRex