2012-08-15 67 views
5

Tôi biết rằng các câu hỏi tương tự về điều này đã được hỏi trước nhưng sau khi thực hiện nghiên cứu của tôi, tôi vẫn có câu hỏi về tiêu đề vòng tròn bao gồm.Tiêu đề hình tròn C++ bao gồm

//FooA.h 
#ifndef H_FOOA 
#define H_FOOA 

#include "foob.h" 

class FooA{ 
    public: 
     FooB *fooB; 
}; 


//FooB.h 
#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 

Bây giờ nếu tôi có hai phụ thuộc vòng tròn, đây là cách mà tôi đã thấy mọi người trên stackoverflow gặp vấn đề. Vấn đề duy nhất của tôi với điều này là trong main.cpp của tôi, tôi phải bao gồm fooa.h đầu tiên và sau đó foob.h

//main.cpp the right way 
#include "fooa.h" 
#include "foob.h" 

//main.cpp that will surely get a compile error 
#include "foob.h" 
#include "fooa.h" 

Bây giờ câu hỏi của tôi là "Có cách nào để chuyển tiếp tuyên bố các lớp này trong một cách mà sẽ cho phép tôi không quan tâm đến thứ tự mà tôi bao gồm các tập tin tiêu đề trong main.cpp của tôi? "

+0

Như câu trả lời đã chỉ ra, bạn có thể sử dụng một bản tuyên bố về phía trước trong cả hai tập tin. Nếu tình huống phức tạp hơn, bạn có thể '#include 'fooa.h'' từ 'foob.h', nó sẽ đảm bảo thứ tự bao gồm bạn muốn. –

+0

Không có thông tư nào trong phần bao gồm trong mã ví dụ. Nếu bạn thêm tất cả mọi thứ của endif còn thiếu thì tốt. Bạn đang gặp phải lỗi biên dịch nào? –

Trả lời

7

Có cách nào để chuyển tiếp khai báo các lớp này theo cách sẽ cho phép tôi không quan tâm đến thứ tự mà tôi đưa vào tệp tiêu đề trong main.cpp của mình không?

kể từ khi bạn đang đối phó với con trỏ đơn giản thôi, bạn có thể sử dụng một tờ khai chuyển tiếp ở đây trong cả hai trường hợp:

FooA.h

#ifndef H_FOOA 
#define H_FOOA 

// #include "foob.h" << not needed! 
class FooB;  // << substitute with a forward declaration of FooB 

class FooA{ 
    public: 
     FooB *fooB; 
}; 
#endif 

FooB.h

#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 
#endif 
+0

@ user1600812 chính xác và chính có thể bao gồm các tệp cần thiết - sử dụng ví dụ này, thứ tự sẽ không quan trọng. – justin

+0

Tôi đoán tôi quên đề cập đến điều đó trong mã cụ thể của tôi. fooa.h forward tự tuyên bố vì có một vài con trỏ tự giới thiệu trong mã của tôi. Trong trường hợp cụ thể của tôi, tôi không nghĩ rằng bạn có thể làm điều đó theo cách của bạn bởi vì tôi sẽ được chuyển tiếp tuyên bố một lớp hai lần. Tuy nhiên trong ví dụ tôi đã thực hiện ở trên giải pháp của bạn hoạt động.Cảm ơn bạn. – user1600812

+0

@ user1600812 C++ cho phép nhiều khai báo chuyển tiếp (ví dụ: trong các tệp riêng biệt). – justin

2

Bạn không phải quan tâm đến đơn đặt hàng vì fooa.h bao gồm foob.hfoob.h có tuyên bố chuyển tiếp cho FooA. Mọi thứ đều đúng trong mã của bạn.

+1

Modulo thiếu # endif, không có vấn đề gì với mã như được đăng. Không có tính tròn nào, khiến tôi nghi ngờ rằng có điều gì đó thiếu. –

1

Vì cả hai lớp đơn giản chứa một con trỏ, bạn không cần bao gồm tiêu đề khác. Một tờ khai chuyển tiếp sẽ làm.

Bất kỳ mã nào thực sự sử dụng lớp khác sẽ cần tiêu đề, nhưng phải nằm trong tệp cpp.

1

Sử dụng tuyên bố chuyển tiếp trong cả hai tệp tiêu đề.

Bạn có biết bạn có thể khai báo trên cùng một dòng không?

Trong "FooB.h"

class FooB{ 
    public: 
     class FooA *fooA; 
}; 

Trong "FooA.h"

class FooA { 
    public: 
     class FooB *fooB; 
}; 
+0

sẽ không tạo ra các tham chiếu chuyển tiếp tới FooB :: FooA và FooA :: FooB tương ứng? –

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