2013-06-24 24 views
5

Trong C++, bạn có được phép tách định nghĩa các lớp được định nghĩa trong cùng một tệp tiêu đề trên nhiều tệp nguồn không? Ví dụ nếu tôi có một tệp định nghĩa các lớp Quad2 và Quad3, tôi có thể định nghĩa lớp Quad2 trong một tệp có tên Quad2.cpp và Quad 3 trong một tệp có tên là Quad3.cpp nhưng vẫn có cả hai tệp trong cùng một tệp tiêu đề Quad.h?Việc phân tách định nghĩa các lớp được định nghĩa trong cùng một tiêu đề trên nhiều tệp nguồn có hợp pháp không?

Điều này có được coi là bất hợp pháp không?

+2

Có vẻ như bạn đang triển khai các lớp khác nhau trên các tệp, không chia tách một lớp. –

+0

Đúng, tôi đoán một cách phân biệt tốt hơn sẽ là bạn được phép tách định nghĩa các lớp được định nghĩa trong cùng một tiêu đề thành nhiều tệp nguồn. Cảm ơn, vì nhận xét tôi sẽ cập nhật câu hỏi. – teddy

Trả lời

5

Có, bạn có thể triển khai các lớp khác nhau từ cùng một tệp tiêu đề trong các tệp triển khai khác nhau.

Tệp tiêu đề không gì khác ngoài nội dung văn bản được đưa vào nguồn tại thời điểm biên dịch. Trình biên dịch thích hợp hoàn toàn không có khái niệm về một tiêu đề. Tiêu đề được giải quyết trong bộ tiền xử lý, trước khi trình biên dịch nhìn thấy bất cứ điều gì.

Do đó, không có bất kỳ yêu cầu nào về các tệp mà định nghĩa và triển khai của lớp. Các chỉ tiêu về những gì thuộc về các tệp tiêu đề và những gì thuộc về các tệp triển khai có mọi thứ cần làm với thực hành tốt nhất và không có gì để làm với các quy tắc được thực thi bởi trình biên dịch. Tức là, bạn đặt các định nghĩa lớp vào các tiêu đề bởi vì điều đó giúp chúng dễ dàng đưa vào cả việc triển khai lớp đó và bất kỳ mã nào muốn sử dụng lớp đó.

1

Điều đó hoàn toàn hợp lệ. Bạn có thể distrubute định nghĩa chức năng của bạn wildly trên các tập tin nguồn khác nhau. Trình liên kết sẽ đặt mọi thứ lại với nhau và khiếu nại, nếu nó không tìm thấy định nghĩa.

Hãy nhớ: Viết #include <some_header.h> giống như sao chép nội dung hoàn chỉnh của tiêu đề vào tệp nguồn ở địa điểm đó. Nếu bạn bao gồm Quad2.hQuad3.h trong cả hai tệp nguồn Quad2.cppQuad3.cpp thì điều này sẽ có tác dụng chính xác giống như bạn đã đặt cả hai tiêu đề vào một tệp Quad.h và bao gồm thay vào đó trong các tệp cpp. Việc sử dụng các cặp tệp tiêu đề và triển khai chỉ là vấn đề của quy ước (và đó là một quy tắc tốt).

1

Chỉ cần thử và xem cho chính mình! Nhưng không, nó không phải là bất hợp pháp. Một cách tiếp cận mà sẽ gây nhầm lẫn cho mọi người một chút (IMHO) sẽ có Quad2.h và .cpp, Quad3.h và .cpp và bao gồm cả Quad2.h và Quad3.h trong Quad.h để thuận tiện.

Không có gì buộc bạn phải làm, nhưng cố gắng giữ mẫu X.h liên kết với X.cpp, đó là thực tế phổ biến.

2

Có, hoàn toàn hợp pháp. Trong thực tế, bạn có thể có Quad2A.cpp và Quad2B.cpp nếu bạn muốn chia mã thành một tệp nhỏ hơn (tất nhiên, nó có thể không có lợi ích gì để làm điều này). Tuy nhiên,

Một hạn chế với việc tách các nguồn là bạn làm cho trình biên dịch trở nên khó hơn đối với các hàm nội tuyến nhỏ [hoặc chỉ được sử dụng một lần]. Hầu hết các trình biên dịch sẽ chỉ có các hàm nội tuyến trong cùng một đơn vị biên dịch. Vì vậy, nếu Quad3.cpp đang sử dụng một cái gì đó từ Quad2.cpp, sau đó nó có thể là nó có thể được inlined nếu họ đang ở trong cùng một tập tin, nhưng sẽ không được nếu họ đang ở trong các tập tin riêng biệt. Tuy nhiên, điều này không thực sự là yếu tố quyết định cho thiết kế của bạn - chỉ đề cập đến nó như là một trong những tác dụng phụ của "cho phép chia nhỏ điều này".

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