2016-04-21 20 views
6

Là một tối ưu hóa, hoặc để tránh bao gồm vòng lặp, một loại có thể được khai báo phía trước, Điều này dẫn đến mã như:Chuyển tiếp tuyên bố và sử dụng trong một bước

class A; 

class B 
{ 
    A *a; 
}; 

Nếu số lượng tờ khai phía trước trở nên lớn, nó có thể chiếm nhiều không gian ở đầu tệp tiêu đề. Có cách nào để khai báo và sử dụng cùng một lúc không? Loại thích:

class B 
{ 
    extern A *a; 
}; 

Tôi chưa bao giờ thực sự nghĩ về điều này trước đây, nhưng tôi có một tiêu đề với một loạt các tờ khai phía trước và tôi muốn làm cho nó ngăn nắp (không nuôi chúng khác bao gồm tập tin) .

CHỈNH SỬA: Tôi đã thay đổi 'a' thành con trỏ, vì nó đã được chỉ ra đúng cách mà bạn chỉ có thể sử dụng chuyển tiếp khai báo trên con trỏ và tham chiếu.

Trả lời

5

gì bạn đang yêu cầu là không hoàn toàn rõ ràng nhưng, nếu tôi hiểu bạn đúng, bạn có thể chuyển tiếp tuyên bố cùng lúc như tuyên bố các biến của bạn:

class B 
{ 
    class A* a; // declaring A as class is an in-place forward declaration 
}; 

Là những gì bạn nghĩa là gì?

+1

Thú vị, tôi chưa bao giờ thấy cú pháp này được sử dụng trước đây. –

+0

Cảm ơn bạn. Đó là chính xác những gì tôi đang tìm kiếm, và, không, tôi chưa bao giờ thấy bất cứ điều gì như trước đây. Nó giúp dọn dẹp tập tin tiêu đề của tôi. –

4

Một tờ khai chuyển tiếp sẽ không cho phép bạn làm

class A; 

class B 
{ 
    A a; 
}; 

trừ A là một tham chiếu hoặc con trỏ loại, kể từ khi tuyên bố về phía trước không cung cấp thêm bất kỳ thông tin về kích thước của đối tượng (trừ khi cho enum class trong C++ 11). Vì vậy, bạn đang sử dụng con trỏ/tài liệu tham khảo? Nếu không, nó có nghĩa là bạn đang bao gồm định nghĩa của A cho chắc chắn.

Về vấn đề của bạn, không có cách nào để chuyển tiếp khai báo và sử dụng loại kể từ khi chúng tôi nói về hai thứ khác nhau. Một khai báo biến không định nghĩa một kiểu, nó định nghĩa một biến.

Một giải pháp đơn giản cho vấn đề của bạn là thu thập tất cả khai báo chuyển tiếp trong một tệp tiêu đề duy nhất và đưa nó vào dự án (hoặc trong tiêu đề được biên dịch cuối cùng của bạn). Điều này sẽ không tạo ra quá nhiều vấn đề, kể từ khi tờ khai về phía trước không phơi bày bất cứ điều gì cũng không nặng nề.

+0

Xin lỗi, lỗi lầm trong ví dụ của tôi. –

3

Không, bạn không thể làm những gì bạn muốn. This answer về các khai báo chuyển tiếp sẽ cung cấp cho bạn tất cả các chi tiết đẫm máu, nhưng tóm lại bạn cần định nghĩa đầy đủ của một loại nếu bạn muốn sử dụng nó (như bao gồm nhiều hơn hoặc ít hơn); không chỉ thực tế là nó tồn tại (như việc tuyên bố nhiều hay ít).

+0

Xin lỗi, ví dụ của tôi đã bị hỏng. –

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