2012-07-02 30 views
6

tôi đã biên soạn đoạn mã sau:loại Incomplete có tên trong tên lồng nhau specifier

class B; 

class A { 
    A(); 
    friend A B::newAObject(); 
}; 

class B { 
    friend A::A(); 
public: 
    A newAObject(); 
}; 

Điều này có vẻ lạ, nhưng ý tưởng là để có một lớp A mà chỉ có thể được tạo ra bởi một đối tượng kiểu B (ai có lẽ sẽ là một singleton).

Vấn đề là tôi đã tạo phụ thuộc vòng tròn giữa các đối tượng này. A phải được xác định trước BB phải được xác định trước A. Rõ ràng về phía trước tuyên bố B là không đủ tốt, B thực sự phải được xác định đầy đủ trước A (và ngược lại).

Làm cách nào để giải quyết vấn đề này?

Chỉnh sửa: lỗi thực tế là: Loại không đầy đủ 'B' được đặt tên trong bộ chỉ định tên lồng nhau.

Lưu ý: có một bài đăng tương tự như thế này tại đây: Error: incomplete type used in nested name specifier, nhưng nó rất nhiều templatized và điều đó gây nhầm lẫn cho tôi, do đó bài đăng này.

+1

Hơi lạ khi tạo một phương thức đơn lẻ làm bạn. Bạn có chắc chắn bạn không muốn làm cho cả lớp một người bạn? –

+0

Tôi không biết rằng điều đó là có thể. Làm thế nào là nó được thực hiện? Tôi chỉ cần viết 'lớp người bạn B' bên trong' A' và 'lớp người bạn A' bên trong' B'? – anthropomorphic

+1

Đúng vậy ... –

Trả lời

5

C++ 2003 nói rằng khi nội dung của lớp được truy cập, lớp này phải được xác định đầy đủ. Tuyên bố chuyển tiếp là không đủ. Điều này có nghĩa là các phụ thuộc vòng tròn như của bạn không được phép.

p.s. Tuyên bố cả lớp như một người bạn nên làm việc, nếu đây là tất cả những gì bạn cần.

Bằng cách này, người bạn đặc điểm kỹ thuật tạo ra tờ khai chuyển tiếp cho các lớp, nhìn vào đoạn mã sau:

void F10(C1 &p1); 

class C2 
{ 
    friend class C1; 
}; 

void F11(C1 **p1); 

trình biên dịch sẽ cung cấp cho lỗi cú pháp cho F10 vì C1 là undefined, nhưng F11 sẽ biên dịch tốt vì thông số kỹ thuật của bạn bè. Điều này nghe có vẻ lạ nhưng điều này được định nghĩa trong tiêu chuẩn và trình biên dịch theo sau này.

+0

Khai báo cả hai lớp là bạn của người khác đã làm việc cho tôi. Cảm ơn. – anthropomorphic

Các vấn đề liên quan