2009-06-02 36 views
7

Tôi đang cập nhật một số mã và trong khi tôi đang làm việc trong tiêu đề, tôi đã xem qua dòng sau.Một định nghĩa lớp dòng?

. 
. 
. 
class HereIsMyClass; 
. 
. 
. 

Vậy đó. Nó chỉ là một dòng trước một định dạng khác, lớp dài hơn. HereIsMyClass thực sự là một lớp khác ở đâu đó, nhưng tôi không hiểu tại sao dòng này được viết ở đây. Nó làm gì?

Trả lời

27

Dòng này trong C++ là khai báo chuyển tiếp. Nó nói rằng tại một số điểm trong tương lai một lớp học có tên HereIsMyClass có thể sẽ tồn tại. Nó cho phép bạn sử dụng một lớp trong một khai báo trước khi nó được xác định hoàn toàn.

Thật hữu ích cho cả việc chia nhỏ các lớp phụ thuộc theo vòng tròn và quản lý tệp tiêu đề.

Ví dụ

class HereIsMyClass; 

class Foo { 
    void Bar(HereIsMyClass* p1) ... 
}; 

class HereIsMyClass { 
    void Function(Foo f1); 
} 
3

Đây là những gì được gọi là một predeclaration. Có khả năng có một lớp học defintion sau dòng này có sử dụng HereIsMyClass, khi tuyên bố thực sự của HereIsMyClass là tiếp tục xuống trong tập tin, hoặc trong #include bao gồm tiếp tục xuống trong tập tin.

Nếu bạn không có dòng đó, có thể tệp sẽ không biên dịch.

+2

Tôi đã rất ngạc nhiên: Tôi nghĩ rằng nó được gọi là "tuyên bố chuyển tiếp" nhưng google hiển thị khoảng 10 lần truy cập nhiều hơn cho tiền tố! – xtofl

+1

Tôi cũng đã gọi nó là "tuyên bố chuyển tiếp". Google cho thấy khoảng 6500 lượt truy cập chỉ để dự đoán trước với một khách hàng Đức, và không ai trong số các hit đầu tiên có một cái gì đó để làm với lập trình. – OregonGhost

+0

Thực sự, tôi đã quên thuật ngữ "tuyên bố chuyển tiếp" và thay vào đó sử dụng các quy tắc tiếng Anh chuẩn để viết tiền tố. Hãy suy nghĩ về nó: bạn tuyên bố một cái gì đó trước khi bạn tuyên bố nó ở một nơi khác. Hai thuật ngữ về cơ bản có thể hoán đổi cho nhau. Nếu ai đó có thể tìm thấy tên của kỹ thuật này được mã hóa trong một cuốn sách ở đâu đó (tôi không thể tìm thấy tờ khai thừa hoặc tiền tố trong chỉ mục của K & R), nó sẽ được mát mẻ để lưu ý rằng ở đây. –

4

Nó được gọi là "tuyên bố chuyển tiếp". Điều này cho trình biên dịch biết rằng 'HereIsMyClass' là tên của một lớp (so với tên của một biến, một hàm, hoặc một cái gì đó khác). Lớp học sẽ phải được định nghĩa sau để nó được sử dụng.

Điều này rất hữu ích khi bạn có các lớp học cần tham khảo lẫn nhau.

Here's một mô tả.

1

Đây được gọi là "tuyên bố chuyển tiếp", về cơ bản là lời hứa xác định lớp này sau. Việc khai báo chuyển tiếp cho phép bạn khai báo con trỏ tới HereIsMyClass mà không cần phải bao gồm tệp tiêu đề cho nó, nhưng không phải là đối tượng thực sự của nó, vì kích thước của đối tượng HereIsMyClass vẫn chưa được biết đến với trình biên dịch.


class HereIsMyClass; 

class Foo 
{ 
private: 
    HereIsMyClass *pointer; // works 
    HereIsMYClass object; // compiler error! 
}; 

Tuyên bố về phía trước không bao gồm định nghĩa đầy đủ (tệp tiêu đề) bất cứ khi nào bạn thực sự sử dụng nó, i. e. truy cập các thành viên của nó.

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