2009-09-15 25 views
18

Tôi tò mò về một kịch bản thiết lập như ví dụ sau:chéo tham khảo bao gồm tiêu đề trong C++ chương trình

Đây là mã đó sẽ được đặt trong một tập tin gọi là Header1.h:

#ifndef HEADER1_H 
#define HEADER1_H 

#include "Header2.h" 

class Class1 
{ 
Class2 class2Instance; 
}; 

#endif 

đây là mã đó sẽ được đặt trong một tập tin gọi là Header2.h:

#ifndef HEADER2_H 
#define HEADER2_H 

#include "Header1.h" 

class Class2 
{ 
Class1 class1Instance; 
}; 

#endif 

tôi nhận được thông báo lỗi khi tôi làm điều này (vì bao gồm tôi giả sử), nhưng nó cảm thấy như tôi sẽ cần phải làm điều này trong trật tự đến bao gồm từng đối tượng trong các lớp riêng biệt. Bất cứ ai có thể giúp tôi thực hiện điều này, tôi đang làm gì sai?

Trả lời

28

Vấn đề là kích thước của Class1 phụ thuộc vào Class2 và ngược lại. Vì vậy, không có cách nào để tính toán kích thước cho một trong hai. Chuyển tiếp tuyên bố một trong các lớp và thay đổi một trong các thuộc tính thành con trỏ hoặc tham chiếu:

#ifndef HEADER2_H 
#define HEADER2_H 

class Class1; 
class Class2 
{ 
Class1 *class1Instance; 
// or 
Class1 &class1Instance; 
}; 

#endif 
+0

Đây là một câu trả lời tuyệt vời nhưng nó chỉ giải quyết được một nửa vấn đề của tôi. Tôi vẫn đang đặt hai lớp này vào hai phần đầu riêng biệt. Tôi nhận được một lỗi chỉ cho các báo cáo bao gồm khi tôi nhập chúng, mà không có sự bao gồm lớp tròn. Bạn có biết làm thế nào để phá vỡ vấn đề này mà không cần đặt chúng trong cùng một tiêu đề. – banDedo

+0

Bạn nhận được lỗi nào? Mã bạn đăng không có bất kỳ vấn đề nào với chỉ thị bao gồm. –

+0

Sau đó, có lẽ bạn nên cung cấp cho chúng tôi một ví dụ sửa đổi phản ánh mã hiện tại của bạn và cũng cho chúng tôi biết chính xác những lỗi bạn đang nhận được. – TheUndeadFish

1

Những gì bạn có là tham chiếu vòng cổ điển. Đó là already been discussed đây trên Stack Overflow. Chỉ cần áp dụng câu trả lời được chấp nhận trên chuỗi đó, trong khi thay thế "struct" cho "class", và bạn vàng.

Edited cho rõ ràng

+0

Tôi tin rằng câu trả lời được chấp nhận thực hiện chính xác điều đó. Vì vậy, thay đổi từ "struct" trong câu trả lời được chấp nhận cho từ "class" và pattern là giống nhau. Vui lòng lấy lại số tiền không được bảo đảm của bạn, kthxbai – Randolpho

+0

Ở đó. 'Được rồi. – Randolpho

2

Bạn không thể có Class2 chứa một thể hiện của Class1 VÀ có Class1 chứa một thể hiện của Class2. Những gì bạn có thể làm là có mỗi lớp chứa một tham chiếu hoặc con trỏ đến và thể hiện của loại lớp khác (với các tham chiếu chuyển tiếp thích hợp). tức là


class Class2; 
class Class1 
{ 
    Class2& class2Instance; 
}; 

class Class1; 

class Class2 
{ 
    Class1& class1Instance; 
}; 
3

Hai cấu trúc vô cùng recurse vào nhau - để biết kích thước Class1 's bạn cần phải biết kích thước của Class2 đòi hỏi kích thước của Class1 vv Giải pháp cho việc này là sử dụng một con trỏ trong ít nhất một trong các trường hợp:

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 
7

file: header1.h

#ifndef HEADER1_H 
#define HEADER1_H 

class Class2; // no need to include Header2 

class Class1 
{ 
    Class2* class2Instance; 
} 

#endif 

file: header1.cpp

#include "header2.h" // do include Header2 here, otherwise you will get errors 

chuyển thể từ here

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