2009-03-24 32 views
5

Giả sử tôi muốn một cái gì đó thuộc loại này, trong một file .cpp nguồn:C++ - 2 lớp 1 tập tin

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 

Liệu có cách nào để làm điều này mà không cần tách nó thành hai tập tin riêng biệt, và không nhận một lỗi biên dịch (lỗi cú pháp trên doSomething(B *b))

+0

nhớ, rõ ràng :-) Hoặc bất cứ trả lời bạn thích nhất. –

+0

@Yuval, chấp nhận người đó là người đầu tiên trả lời câu hỏi của bạn. –

+0

@Yuval - chấp nhận câu trả lời đầu tiên trả lời câu hỏi của bạn một cách chính xác và hữu ích. –

Trả lời

22

đặt ở dòng đầu tiên:

class B; 
+0

Bạn là người đầu tiên, cảm ơn! :) –

4

phía trước tuyên bố một lớp trước khác với

class B; 
or 
class A; 

Nhưng bạn vẫn sẽ không thể thực hiện

void doSomething(B *b) 

chỉ sử dụng tờ khai chuyển tiếp của B. Vì vậy, bạn cần phải đặt định nghĩa của doSomething bên dưới lớp đầy đủ Tờ khai

12

Nếu tôi nhớ tốt, bạn có thể 'trước khi khai báo' lớp học của bạn B.

class B; // predeclaration of class B 

class A 
{ 
    public: 
     void doSomething(B* b); 
} 

class B 
{ 
    public 
     void doSomething(A* a) {} 
} 

public void A::doSomething(B* b) {} 

Sau đó, lớp học của bạn 'A' biết rằng một lớp 'B' sẽ exis ts, mặc dù nó chưa được xác định.

Tuyên bố chuyển tiếp thực sự là thuật ngữ chính xác, như được Evan Teran đề cập trong các nhận xét.

+1

câu trả lời hay, vì vậy bạn nhận được +1.Nhưng để tham khảo cụm từ này là "tuyên bố chuyển tiếp" –

3

Có. Bạn cần một lời tuyên bố về phía trước:

class B; // add this line before A's declaration 

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 
1

Bạn có thể thử một bản tuyên bố về phía trước như

class B; 
class A { 
    void Method(B*); 
}; 
class B{ 
}; 

nhưng bạn sẽ chỉ có thể khai báo các biến con trỏ và tham chiếu cho B sau đó. Nếu bạn muốn nhiều hơn (giống như một phương thức mà tham chiếu biến B *), bạn có thể cung cấp một khai báo chỉ và định nghĩa các phương thức sau trong cùng một tệp - tại thời điểm mà cả hai khai báo lớp đã có sẵn.

1

Bạn cần để chuyển tiếp tuyên bố B.

class B; 

class A 
{ 
public:   
    void doSomething(B *b) {} 
}; 

class B 
{  
public:   
    void doSomething(A *a) {} 
}; 

(Và BTW, bạn không cần dấu chấm phẩy sau khi chức năng thành viên dấu ngoặc nhọn. :))

3

The C++ FAQ Lite câu trả lời câu hỏi này và khác. Tôi nghiêm túc xem xét việc đọc điều đó kết thúc, hoặc nhận được cuốn sách và làm như vậy.

+1

+1 để nói điều gì đó khác biệt so với cụm từ –

0

Thêm một lời tuyên bố của B trước A:

class B; 

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 
Các vấn đề liên quan