2011-09-28 72 views
6

Tôi đã đọc một cuốn sách cấu trúc dữ liệu cũ hơn và nó nói rằng khi bạn đang làm lập trình lớp mẫu, bạn nên bao gồm .cpp ở cuối tệp .h.Bao gồm .cpp ở cuối tập tin tiêu đề mẫu

Theo tôi biết bạn phải thực hiện đầy đủ chức năng trong tệp .h của bạn cho bất kỳ chức năng thành viên lớp mẫu nào - đó là cách trình biên dịch mẫu hoạt động.

Các chức năng duy nhất tôi được dạy có thể được đưa vào tệp triển khai cho lớp mẫu là các chức năng chuyên môn mẫu, ví dụ: template<> Class<Type>::function_name().

Tại sao cuốn sách này đề xuất bao gồm tệp .cpp ở cuối .h? đây có phải chỉ là cách tách các triển khai thành các tệp khác nhau trong khi bắt chúng biên dịch với tiêu đề không? và nếu vậy, bạn sẽ đặt chuyên môn thực sự ở đâu - tôi đoán họ không thể đi vào .cpp kèm theo tiêu đề.

Trả lời

9

Rất có thể tác giả thích khai báo và định nghĩa trong các tệp khác nhau, tôi có thể đoán điều này là vì nó giúp dễ dàng chuyển giữa các khai báo và định nghĩa.

Nhưng có phần mở rộng tệp "cpp" hơi khó hiểu. Thông thường những tập tin này được gọi là "ipp" cho "Inline C++".

+2

Tôi chưa bao giờ thấy trong các tập tin này có tên là 'ipp' –

+0

@JohnDibling: Tất cả đều được tăng cường. Các câu hỏi về điều đó thậm chí còn được nêu ra ở đây trên SO trước đây. –

+0

xem http://stackoverflow.com/questions/543507/in-the-c-boost-libraries-why-is-there-a-ipp-extension-on-some-header-files –

3

Đây có lẽ là cách nói cũ, và tôi nghĩ phân tích của bạn về việc tách biệt việc triển khai và khai báo là chính xác. Quay lại khi cuốn sách cụ thể này được viết, tác giả có thể nghĩ về tệp cpp dưới dạng tệp nơi định nghĩa cư trú và tệp h dưới dạng tệp mà các khai báo cư trú. Đưa các chuyên môn thực sự rõ ràng vào các tập tin cũ sẽ, tự nhiên, gây chết người (hoặc ít nhất là vô ích) để các mối liên kết vì các định nghĩa lặp đi lặp lại. Ngày nay, tôi muốn tránh đặt tên cho tệp định nghĩa .cpp.

0

Theo như tôi biết bạn phải làm việc triển khai chức năng đầy đủ trong tập tin .h của bạn cho bất kỳ chức năng thành viên lớp mẫu - đó là do cách mẫu công trình biên dịch.

Có thể cuốn sách cho rằng bạn có đầy đủ chức năng triển khai trong tệp .cpp của mình.

Nếu chuyên môn đầy đủ nằm trong tệp cpp, chúng không được đưa vào tệp tiêu đề. Nhiều khả năng nó sẽ không biên dịch nếu bạn làm như vậy. Bởi vì trình biên dịch sẽ thấy nhiều định nghĩa của cùng một hàm như tệp tiêu đề thường sẽ được bao gồm trong nhiều tệp nguồn.

0

Nếu bạn muốn sử dụng mẫu, toàn bộ định nghĩa mẫu phải được hiển thị trong TU để tạo mẫu. Vì vậy, bạn có thể chỉ cần đặt các định nghĩa đầy đủ vào tệp tiêu đề. Nếu bạn thực sự muốn giữ cho các định nghĩa lớp và các cơ quan chức năng thành viên của lớp riêng biệt, thì bạn có thể bị cám dỗ đặt các định nghĩa chức năng đó vào một tệp riêng biệt. Tuy nhiên, quy tắc trên vẫn được áp dụng, vì vậy bạn sẽ phải bao gồm tệp riêng biệt cùng với tiêu đề để mọi người có thể sử dụng mẫu.

Đó là vấn đề về hương vị. Nếu các thành phần chức năng thành viên ngắn, bạn cũng có thể định nghĩa chúng nội tuyến. Cũng nên nhớ rằng các hàm được định nghĩa bên trong định nghĩa lớp được khai báo hoàn toàn inline, trong khi bạn phải xác định rõ ràng rằng nếu bạn viết các phần tử riêng biệt.

Mẫu chuyên biệt một phần vẫn là mẫu, vì vậy các quy tắc tương tự sẽ được áp dụng.

Mẫu lớp đầy chuyên ngành chỉ là một lớp thông thường, vì vậy bạn đối xử là như vậy:

// FooInt.hpp 
template <typename> class Foo; 
template <> class Foo<int> 
{ 
    // your class here 
}; 

Một điều bạn có thể đã có trong tâm trí là "rõ ràng mẫu instantiation", a la template class Foo<int>;. Đó là một cái gì đó khác; để lại một bình luận nếu bạn quan tâm đến việc sử dụng nó.

1

Trước tiên, không có quy tắc nào bạn phải triển khai các mẫu trong tệp .h (hoặc .hpp hoặc .hh) của mình; trên thực tế, đối với bất cứ điều gì nhưng các mẫu đơn giản nhất, tôi sẽ khuyên bạn không nên làm như vậy. Bạn thực hiện phải bao gồm việc triển khai, bất kể tệp nào. Tác giả của có thể đã lưu ý đến việc triển khai tệp trong một tệp .cpp và bao gồm điều đó. Tuy nhiên, tôi khuyên bạn nên tìm một tên khác, vì hầu hết mọi người (và một số IDE) sẽ giả sử rằng bạn nên biên dịch tất cả các tệp .cpp. Một quy ước phổ biến là .cc.hh là các tiện ích mở rộng thông thường cho các nguồn và tiêu đề là .tcc để thực hiện mẫu ; trong một thế giới Windows (nơi .cpp gần như là phổ biến), Tôi muốn giới thiệu một cái gì đó như .tpp.

Lưu ý rằng triển khai sớm nhất các mẫu yêu cầu triển khai để ở trong một số .cpp. Các triển khai này không yêu cầu (hoặc cho phép) nó được bao gồm, tuy nhiên; trình biên dịch tìm kiếm các .cpp (hoặc .cc) tương ứng với file .hpp (hoặc .hh), trong đó định nghĩa lớp mẫu hoặc khai báo hàm xuất hiện, và tạo ra một tập tin nguồn giả trong đó bao gồm nó (và bất cứ điều gì khác mà là cần thiết).

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