Tôi tiếp tục bối rối về quyết định thiết kế này rất nhiều khi tôi viết chương trình, nhưng tôi không chắc chắn 100% khi tôi làm chức năng thành viên một lớp, khi để nó như một hàm bình thường trong đó các tệp nguồn khác có thể gọi hàm khi khai báo hàm được hiển thị trong một tệp tiêu đề. Liệu truy cập mong muốn vào các biến thành viên của một lớp có liên quan đến quyết định hầu hết thời gian không?Chức năng thành viên C++ so với chức năng miễn phí
Trả lời
Giao diện Nguyên tắc bởi Herb Sutter
Đối với một lớp X, tất cả các chức năng, bao gồm cả chức năng miễn phí, mà cả
(a) "đề cập đến" X, và
(b) đều được "cung cấp với" X
là logic một phần của X, bởi vì họ là một phần của giao diện của X.
Đối với trong cuộc thảo luận sâu đọc Namespaces and the Interface Principle bởi Herb Sutter.
EDIT
Trên thực tế, nếu bạn muốn hiểu C++ đi và đọc mọi thứ gì Herb Sutter đã viết :)
Cảm ơn câu trả lời của bạn. Liên kết khá mô tả. – stanigator
(+1). Tôi cũng thích cái này của Scott Meyers: http://www.ddj.com/cpp/184401197. Các bài báo của Scott và Herb rất bổ ích cho nhau, tôi nghĩ vậy. –
Tôi đang bối rối. Bài viết được liên kết là về các không gian tên, nhưng câu hỏi không hỏi về các không gian tên. Nó hỏi khi nào có "chức năng tự do" so với "chức năng thành viên". –
Nếu có gì cần phải truy cập các biến thành viên hoặc một số khía cạnh của một thể hiện của đối tượng, sau đó nó nên được thực hiện một phương pháp.
Nếu nó liên quan chặt chẽ đến lớp, nhưng không cần truy cập bất kỳ thông tin cụ thể nào, thì nó phải được tạo thành hàm chia sẻ (hoặc hàm lớp hoặc hàm tĩnh phụ thuộc vào ngôn ngữ lập trình bạn đang xử lý).
Thậm chí nếu nó chỉ là một chức năng chung, rất có thể là bạn sẽ có nhiều hơn một trong số chúng và chúng có thể được tổng hợp/tổ chức theo một số khái niệm. Sau đó, bạn có thể tạo một lớp đại diện cho khái niệm đó và làm cho chúng được chia sẻ các chức năng.
Với phần trên, tôi không bao giờ thấy bất kỳ lý do nào để tạo các hàm độc lập nữa.
C++ không có khái niệm về phương pháp. –
phương thức == chức năng thành viên – PSkocik
Tôi sử dụng các lớp khi tôi cần duy trì trạng thái. Nếu một hàm không cần quyền truy cập vào thông tin trạng thái được duy trì, thì tôi thích một hàm miễn phí hơn vì nó làm cho việc thử nghiệm và sử dụng lại mã dễ dàng hơn.
Nếu tôi có một loạt chức năng liên quan nhưng không cần phải duy trì trạng thái, thì tôi thích đặt các chức năng miễn phí vào không gian tên.
- 1. chức năng thành viên ẩn chức năng miễn phí
- 2. Chức năng thành viên tĩnh
- 3. C - Thiết kế miễn phí của riêng bạn() chức năng
- 4. QtConcurrent với chức năng thành viên
- 5. gọi std :: async chức năng thành viên
- 6. Delphi 2010 Chức năng rộng so với chức năng chuỗi
- 7. chức năng dụ Javascript so với chức năng nguyên mẫu
- 8. Sự khác biệt giữa việc sử dụng realloc vs miễn phí - chức năng> chức năng malloc
- 9. Move thế hệ chức năng thành viên
- 10. Mẫu: chức năng mẫu không hoạt động tốt với chức năng thành viên mẫu của lớp
- 11. std :: chức năng với các chức năng thành viên không tĩnh
- 12. Trở * này trong chức năng thành viên
- 13. decltype cho các chức năng thành viên
- 14. Chức năng gọi thành viên của số
- 15. Chức năng thành viên liên tục
- 16. Mẫu chức năng thành viên C++ Mẫu variadic
- 17. Chức năng thành viên gọi trong chính C++
- 18. C++: Gọi chức năng thành viên qua con trỏ
- 19. C++ Gọi con trỏ tới chức năng thành viên
- 20. C++ chức năng thành viên truy cập biến tĩnh riêng?
- 21. chức năng alloca trong C
- 22. Khi nào tôi nên sử dụng các chức năng không phải là thành viên không phải thành viên đối với các chức năng của thành viên?
- 23. C++ chức năng cục bộ tĩnh so với chức năng toàn cầu
- 24. C chức năng so với phương pháp Objective-C?
- 25. F # Chức năng so với giá trị
- 26. Chức năng MATLAB trong C++
- 27. Gọi chức năng ảo thuần túy từ chức năng thành viên lớp cơ sở trừu tượng?
- 28. Chức năng so với phương pháp tĩnh
- 29. Gọi đến chức năng template thành viên không biên dịch
- 30. Chức năng thành viên không có tính chất là gì?
Cũng xin lưu ý rằng "phương pháp" là thuật ngữ chung hướng đối tượng. C++ không có "phương thức", chỉ là "hàm". Tiêu chuẩn C++ không bao giờ sử dụng thuật ngữ "phương thức". Thay vào đó, thích sử dụng "chức năng thành viên" hoặc "chức năng miễn phí". –
Nhận xét của Brian thực sự phải là câu trả lời. Đó là điều mà hầu hết mọi người đến đây đang tìm kiếm ... câu hỏi này thậm chí không đề cập đến phương pháp. –
Đồng ý. Có lẽ nên thay đổi tiêu đề của câu hỏi, nó thực sự là gây hiểu nhầm. – Ben