2009-05-18 43 views

Trả lời

97

Đây là điểm chung của sự nhầm lẫn đối với nhiều người (bao gồm trang Lập trình chung trên Wikipedia, một số hướng dẫn C++ và các câu trả lời khác trên trang này). Theo như C++ là có liên quan, không có điều như là một "lớp mẫu", chỉ có một "mẫu lớp". Cách đọc cụm từ đó là "mẫu cho một lớp", trái với "mẫu hàm", là "mẫu cho hàm". Một lần nữa: các lớp không xác định các mẫu, các khuôn mẫu xác định các lớp (và các hàm). Ví dụ, đây là một mẫu, đặc biệt là một lớp mẫu, nhưng nó là không một lớp:

template<typename T> class MyClassTemplate 
{ 
    ... 
}; 

Việc kê khai MyClassTemplate<int>được một lớp học, hay vẻ thông thái, một lớp học dựa trên mẫu. Không có thuộc tính đặc biệt nào của lớp dựa trên mẫu so với lớp không dựa trên mẫu. Các thuộc tính đặc biệt là của chính mẫu.

Cụm từ "lớp mẫu" nghĩa là không có gì, bởi vì từ "mẫu" không có nghĩa là tính từ khi được áp dụng cho danh từ "lớp" theo C++. Nó ngụ ý sự tồn tại của một lớp rằng (hoặc xác định) một mẫu , không phải là một khái niệm tồn tại trong C++.

Tôi hiểu sự nhầm lẫn phổ biến, vì có thể dựa trên thực tế là các từ xuất hiện theo thứ tự "lớp mẫu" trong ngôn ngữ thực tế, đó là toàn bộ câu chuyện khác.

+1

Câu trả lời đúng. – BobbyShaftoe

+0

+1. Đôi khi nó hữu ích cho bất kỳ lý do gì để phân biệt "nguồn gốc" của một lớp, trong trường hợp này bạn có thể sử dụng thuật ngữ "lớp mẫu" hợp lý - nhưng vì lý do bạn đưa ra, bạn nên xác định ý nghĩa của điều này . –

+1

@j_random_hacker - xem câu trả lời của litb dưới đây, nhưng trong ngắn hạn, thuật ngữ ưa thích cho điều đó là "chuyên môn mẫu lớp" –

7

Lớp mẫu có liên quan đến Template Method design pattern, trong khi mẫu lớp chỉ là mẫu lớp "điền vào chỗ trống".

+2

+1 cho câu trả lời ngắn gọn về các thuật ngữ của giáo dân. –

11

Sự khác biệt là thuật ngữ "lớp mẫu" không đơn giản không tồn tại trong tiêu chuẩn C++. Đó là một thuật ngữ được sử dụng chủ yếu bởi những người nghĩ rằng thuật ngữ "mẫu lớp" là khó hiểu (như các công ty Qt của Nokia và trước đây là Trolltech).

Tiêu chuẩn không có khái niệm về nó, do đó, tùy thuộc vào những người khác để tạo sự khác biệt. Một số người sử dụng nó một cách đồng nghĩa, và những người khác nói rằng thuật ngữ "lớp mẫu" đề cập đến một mẫu lớp được phân biệt rõ ràng hoặc rõ ràng, điều này sẽ làm cho nó tương đương với thuật ngữ "chuyên môn mẫu lớp". Về mặt lịch sử, nó có ý nghĩa này. Các Annotated Reference Manual định nghĩa tại trang 343

Một lớp được tạo ra từ một mẫu lớp được gọi là lớp mẫu, như là một lớp học đặc biệt được xác định với một mẫu-class-name như tên của nó

Các không phải là thiết bị đầu cuối mẫu-class-name tương đương với mẫu-thiết bị đầu cuối không được sử dụng trong tiêu chuẩn ngày nay và đi xuống template-name <arguments>.


Để giúp bạn làm quen với các điều khoản ngày hôm nay, mà quan trọng hơn là sử dụng thuật ngữ cũ đáng ngờ

// (1) defines a class template 
template<typename T> class A { }; 

// (2) defines a class template explicit specialization 
template<> class A<int> { }; 

// (3) defines a class template partial specialization 
template<typename T> class A<T*> { }; 

// (4) explicitly instantiates A<char>. 
template class A<char>; 

// (5) implicitly instantiates A<short> (because of the member declaration) 
struct D { A<short> a; }; 
  • Các ARM được gọi là lớp (2), và các lớp được tạo ra bởi (4) và (5) một lớp mẫu . Tôi không chắc liệu ARM đã biết về các chuyên môn từng phần hay chưa. Nhưng nếu vậy (3) không được gọi là một lớp mẫu, bởi vì (3) không định nghĩa một lớp, nhưng định nghĩa một khuôn mẫu.
  • Lớp cuộc gọi Chuẩn hiện tại (2) và các lớp được tạo bởi (4) và (5) các chuyên môn mẫu lớp học. Và (3) được gọi là chuyên môn từng phần, thay vì một chuyên môn rõ ràng rõ ràng. Nó cũng đôi khi gọi (3) một chuyên môn (3.2/5 - tuy nhiên với làm rõ liên kết chéo), mặc dù tôi thấy điều này không hoàn toàn rõ ràng với tôi, vì nó định nghĩa một "chuyên môn" như là một "lớp, chức năng hoặc lớp thành viên ", (3) không thỏa mãn.
+2

+1, tốt đẹp để biết các ủy ban tiêu chuẩn mình thêm vào sự nhầm lẫn này –

+3

Hehe. Vâng và một số người khác cũng vẫn đóng góp cho bộ đó. Đáng chú ý là C++ Faq lite và tài liệu Qt. Tác giả của faq lite đã nói với tôi trong thư rằng anh ta muốn đặt một mục FAQ khác giải thích rằng sử dụng từ "chuyên môn" là tốt hơn vì nó gây ít nhầm lẫn hơn (sử dụng "chuyên môn rõ ràng" cho loại chuyên môn được viết bởi người dùng, sau đó). Các anh chàng Qt nói với tôi rằng họ không muốn sử dụng thuật ngữ "mẫu lớp" .... họ tìm thấy nó quá "không tự nhiên". Quá tệ. –

+0

@ JohannesSchaub-litb: ARM được viết bởi Bjarne Stroustrup và Margaret Ellis, khoảng năm 1991 IIRC. Trích dẫn của bạn từ những mâu thuẫn của ARM [báo giá của SHH từ phiên bản thứ 4 của Bjarne TCPPL] (http://stackoverflow.com/a/39681575/464581). Vì vậy, nó là tốt mà bạn rút ra một sự phân biệt giữa cũ (trước chuẩn) và thuật ngữ hiện tại. –

0

Lớp mẫu: Lớp có định nghĩa chung hoặc lớp có tham số không được khởi tạo cho đến khi thông tin được cung cấp bởi ứng dụng khách. Nó được gọi là một biệt ngữ cho lớp templates.simply đơn giản với mẫu tiền tố và sử dụng T. Mẫu lớp: Việc xây dựng cá nhân của một lớp được chỉ định bởi một mẫu lớp gần giống như cách các đối tượng riêng lẻ được xây dựng bằng cách sử dụng một lớp. Nó được gọi là một đối tượng của lớp mẫu Tên đối tượng Ex- classname (danh sách đối số)

0

Mẫu lớp là một lớp chung cho các loại đối tượng khác nhau. Về cơ bản nó cung cấp một đặc điểm kỹ thuật để tạo ra các lớp dựa trên các tham số. Bất cứ khi nào một đối tượng mới được tạo ra một lớp mới sẽ diễn ra trong bộ nhớ cho mục đích đó. Điều này được gọi là instantiating một mẫu lớp và mỗi phiên bản instantiated của lớp được gọi là lớp mẫu.

5

Bjarne Stroustrup, tác giả của C++, nói trong cuốn sách của ông C++ Programming Language 4th edition, 23.2.1 Xác định một mẫu:

Có những người làm cho sự phân biệt ngữ nghĩa giữa các điều khoản lớp mẫumẫu lớp. Tôi không; điều đó sẽ quá tinh tế: hãy xem xét những thuật ngữ này có thể hoán đổi cho nhau. Tương tự, tôi xem xét mẫu chức năng hoán đổi cho nhau với chức năng mẫu.

+0

Được bình chọn, câu trả lời hay. –

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