2009-08-23 28 views
5

Tôi có thực sự cần ba tuyên bố, ví dụ như thế nàyForward-tuyên bố mẫu con trỏ

class A; 
template<class _T> class B; 
typedef B<A> C; 

để chuyển tiếp-khai báo một con trỏ của mẫu kiểu C, như vậy:

C* c = 0; 

Tôi đã hy vọng có thể che giấu các lớp học AB trong bản khai báo trước của tôi, rằng thậm chí có thể?

+0

Và phương pháp 2 dòng của litb hơi đơn giản hơn một chút. – rlbond

+0

@rlbond, được chuyển đến câu trả lời và xóa mã số đáng sợ 2 dòng –

Trả lời

8

Mặc dù không giống hệt nhau, bạn có thể làm điều này thay vì:

class C; 
C* c = 0; 

và sau đó, trong file thực hiện, sau khi các tập tin tiêu đề cho " A" và 'B' đã được bao gồm, xác định 'C' như thế này:

class C : public B<A> {}; 

sử dụng thừa kế thay vì một typedef nên làm việc nếu bạn chỉ cần sử dụng constructor mặc định của B < một >.

+0

EDIT: Bạn không cần phải chuyển tiếp khai báo "A" và "B" trong tệp triển khai. Tệp tiêu đề phải được bao gồm. – Ropez

+0

Không phải những gì tôi có trong tâm trí, nhưng là một gợi ý tuyệt vời. Cảm ơn! –

+0

Một giải pháp thực sự hữu ích và thông minh, cảm ơn bạn, @Ropez! – Steed

1

Tôi thực sự không hiểu câu hỏi của bạn, nhưng mã như thế này:

template<class _T> class B; 

là bất hợp pháp. C++ đặt tên bắt đầu bằng dấu gạch dưới và một chữ cái hoa cho trình biên dịch thực hiện thư viện & - bạn không được phép sử dụng chúng trong mã của riêng bạn.

+0

nhờ trợ giúp này cho tôi –

3

Có bạn cần. Lưu ý rằng cả ba dòng đều làm những việc khác nhau. Đầu tiên khai báo một lớp. Thứ hai tuyên bố một mẫu, và thứ ba tuyên bố một typedef-name. Trong việc khai báo typedef-name, bạn có thể sử dụng một kiểu specifier được định nghĩa như "class A" để đặt tên cho class mà không có tên của nó trong phạm vi (với một số cạm bẫy khó chịu) - nhưng bạn không thể sụp đổ việc khai báo mẫu với khai báo typedef.

Tôi sẽ không lo lắng về ba dòng. Nếu đó là cần thiết, tôi sẽ chỉ cần viết chúng ra :)

+0

Tôi đã hy vọng rằng, vì tôi chỉ sử dụng nó cho một con trỏ riêng nên sẽ có cách tốt để chỉ đặt trước không gian cần thiết mà không cần tiết lộ chi tiết cơ bản. –

+0

Ý của bạn là gì? Bạn có thể viết mã vào câu hỏi bạn muốn nó trông như thế nào và nó trông như thế nào bây giờ? Tôi nghĩ chúng ta có thể hiểu rõ hơn về nó –

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