Tôi nên khai báo hàm vùng tên trong tệp tiêu đề như thế nào?
namespace MON {
// extern:
t_ret func(const t_param& pValue);
// 'inline':
inline t_ret inline_func(const t_param& pValue) { ... }
} // << MON
nên tiêu đề chỉ chứa các định nghĩa chức năng như file header lớp và triển khai nên trong tập tin cpp, hoặc nên tôi ngay lập tức thực hiện các chức năng trong tập tin tiêu đề?
tùy thuộc vào việc bạn có muốn chúng (có khả năng) được inlined hoặc xuất khẩu hay không. điều này thường đi xuống để giảm thiểu sự phụ thuộc.
để mở rộng xuất khẩu hoặc nội tuyến:
bạn muốn thường xuyên ủng hộ một chức năng extern để giảm thiểu sự phụ thuộc trong C++. đây là tương đương với tách nét cao từ việc kê khai trong một phương pháp học:
file.hpp
namespace MON {
// extern:
t_ret func(const t_param& pValue);
} // << MON
file.cpp
#include "hefty_stuff.hpp"
MON::t_ret MON::func(const t_param& pValue) { ... }
tuy nhiên
, đó là vào những thời điểm quan trọng đối với định nghĩa được hiển thị trong một số trường hợp, thường cho hiệu suất hoặc khi bạn biết kích thước là quan trọng và tiêu đề không được bao gồm nhiều nơi. do đó, biến thể inline
cũng là một tùy chọn.
chức năng nội tuyến vẫn có thể được xuất và có thể được gạch dưới theo yêu cầu - tuy nhiên, bất kỳ bản sao chức năng nội tuyến nào cũng có thể được hợp nhất (cụ thể, việc triển khai là miễn phí để giả định tất cả các định nghĩa bằng nhau và bất kỳ bản sao nào của hàm không cần thiết).
với định nghĩa đã xuất, bạn có thể hạn chế chọn lọc (hoặc kiểm dịch) phụ thuộc bao gồm của bạn. nghĩa là, #include "hefty_stuff.hpp"
không cần nằm trong tiêu đề để sử dụng các chức năng trong file.hpp
.
Về cơ bản, tôi đang cố gắng để thực hiện một ứng dụng để phân tích một tập tin văn bản có chứa một số lệnh. Vì vậy, tôi đang nghĩ đến việc triển khai các phương thức trợ giúp tĩnh để xử lý xử lý văn bản.
well, static
cần tránh ở đây. C++ sử dụng quy tắc một định nghĩa. static
sẽ chỉ dẫn đến nhiều bản sao không cần thiết. Hơn nữa, một không gian tên nặc danh là C++ cách tiếp cận chức năng c của static
:
namespace {
t_ret func(const t_param& pValue) { ... }
} // << anon
lưu ý: không gian tên vô danh cũng có thể dẫn đến bản sao không cần thiết. lý do bạn sẽ sử dụng chúng như là một thay thế cho một hàm tĩnh là nếu bạn muốn hoặc cần phải đi chệch khỏi quy tắc một định nghĩa và không muốn khai báo biểu tượng trong phạm vi có thể được 'giải quyết'.
điểm cuối cùng liên quan đến tuyên bố template<>
. với các khuôn mẫu, định nghĩa phải được hiển thị khi được sử dụng, trừ khi trình biên dịch của bạn hỗ trợ các mẫu bên ngoài. đối với mẫu, bạn có thể thực hiện hiển thị định nghĩa theo nhiều cách. thông thường, mọi người sẽ chỉ khai báo định nghĩa tại chỗ hoặc thêm tiêu đề cho các định nghĩa được bao gồm ở cuối tiêu đề hoặc khi cần. với các mẫu, hàm không cần phải được khai báo inline
để tránh nhiều lỗi định nghĩa.
C++ thu hút một sự phân biệt khá rõ ràng giữa chức năng và các lớp học . Nó không rõ ràng từ câu hỏi của bạn mà một trong những bạn đang quan tâm đến việc sử dụng. – Shep
Hi Shep, Cảm ơn bạn đã bình luận. Tôi đã thêm nhiều chi tiết hơn cho câu hỏi của mình. Nó có trả lời câu hỏi của bạn không? –