Đây có thể không phải là câu hỏi cụ thể đối với C++ và nhiều hơn nữa để làm với lập trình hướng đối tượng. Tôi mới đến điều này và tôi nghi ngờ về thiết kế của mình. Tôi có một lớp học Trình phân tích cú pháp về cơ bản thực hiện nhiều chức năng xử lý phân tích cú pháp biểu thức, chuyển đổi từ mã nhúng sang postfix, v.v. Tôi sử dụng các hàm Phân tích cú pháp này trong chức năng chính. Tôi nhận ra rằng tôi không cần bất kỳ thành viên dữ liệu nào cho lớp này. Do đó, tôi không thực sự cần một đối tượng của lớp này. Do đó, tôi đã làm cho mọi hàm tĩnh trong lớp. Có điều gì lạ về thiết kế này không. Tôi có nên sử dụng giao diện này thay thế không? Bất kỳ đề xuất?Lớp không có thành viên dữ liệu trong C++
Trả lời
Bạn muốn trình phân tích cú pháp và bạn biết bạn muốn làm gì bạn - điều này có hiệu lực, "giao diện" của bạn.
Thực hiện hiện tại của trình phân tích cú pháp không cần bất kỳ biến thành viên nào - do đó, để triển khai giao diện, bạn không cần một lớp. Vì vậy, có, làm đi với các phương pháp tĩnh của bạn. Giống như Kevin nói, sử dụng một không gian tên với các hàm cũ đơn giản (không tĩnh) là một ý tưởng tuyệt vời.
Nếu bạn cảm thấy cần thêm một trình phân tích cú pháp mới cần duy trì trạng thái bên trong, thì bạn có thể muốn định nghĩa một giao diện trong (1) - một tệp tiêu đề có thể nhìn thấy công khai cũ với các khai báo hàm bên trong một không gian tên của sự lựa chọn của bạn là đủ.
Cảm ơn. Điều đó xóa nó lên. Thumbs up để làm rõ ý nghĩa của giao diện và giải thích làm thế nào để đối phó với trường hợp thứ 2. – user592748
Bạn được chào đón. Vui mừng được giúp đỡ. – Carl
Phương thức tĩnh không thể được gọi từ hàm tạo của đối tượng cha một cách tự động. – peterh
Lớp học không có gì ngoài chức năng tĩnh có vẻ không thể phân biệt được với không gian tên đối với tôi. Vì vậy, tại sao không chỉ sử dụng một không gian tên?
Bạn không chắc chắn tầm quan trọng của việc này, nhưng bạn không thể giả lập một không gian tên (trong các khung mocking mà tôi biết). –
Không, một lớp không có thành viên dữ liệu _can_ có một hàm tạo. – peterh
Một hàm tạo không thú vị bởi vì nó không khác gì một hàm tĩnh khác. Một destructor có thể là thú vị, nhưng một destructor thú vị có thể cần ít nhất một thành viên dữ liệu boolean để ghi lại xem lớp đã được di chuyển chưa (và do đó liệu destructor không nên làm bất cứ điều gì thú vị nó sẽ làm). –
Việc tạo các hàm tiện ích tĩnh là bình thường, vì vậy, nếu các hàm của lớp Parser của bạn không dựa vào nhau, bạn hoàn toàn có thể làm cho chúng tĩnh. Nếu họ dựa vào nhau và có thể các chức năng tương tự có thể được thực hiện theo cách khác, bạn nên cân nhắc sử dụng giao diện
Cách để quyết định câu hỏi này là cách sử dụng các chức năng?
1) Nếu tất cả các chức năng được sử dụng trong một tệp và không cần xuất ở bất kỳ đâu, thì chắc chắn sử dụng các hàm tĩnh. Tại sao? Bởi vì bạn có thể chỉ cần gõ chúng trực tiếp vào phần thân của lớp trong tệp .cpp và bạn không phải lo lắng về việc duy trì các khai báo và giữ các tham số được căn chỉnh. Bởi vì khi một lớp C++ được phân tích tất cả các mã bên trong mỗi hàm được định nghĩa bên trong thân lớp được bỏ qua và sau đó phân tích cú pháp khi tất cả các thành viên của lớp đã được khai báo, vì vậy các hàm có thể nhìn thấy nhau và đang ở trong tình trạng tên tốt hơn. cũng sẽ nội tuyến rất nhiều các hàm nhỏ hơn nếu bạn khai báo chúng trực tiếp trong lớp như thế.
2) Nếu các chức năng cần được sử dụng từ bên ngoài tệp .cpp hiện tại, hãy sử dụng các chức năng bình thường. Bởi vì sau này họ có thể được sử dụng từ bất cứ nơi nào khác và xuất khẩu chúng theo tên dễ dàng hơn.
- 1. Lớp học không có thành viên dữ liệu có dấu chân bộ nhớ trong java không?
- 2. khởi In-lớp của các thành viên dữ liệu tĩnh
- 3. Tại sao các lớp C++ được phép có các thành viên dữ liệu bằng 0?
- 4. Ẩn các thành viên dữ liệu riêng tư? (C++)
- 5. một lớp học có thể có các thành viên dữ liệu ảo không?
- 6. Tôi có nên sử dụng các thành viên dữ liệu tĩnh không? (C++)
- 7. C# struct với đối tượng là thành viên dữ liệu
- 8. Lớp C++ không có thành viên tên là
- 9. C++ 11; Có thể khởi tạo thành viên dữ liệu không tĩnh truy cập các thành viên dữ liệu khác không?
- 10. Tiếp cận dữ liệu thành viên private của lớp ngoài cùng trong lớp bên
- 11. C++ lỗi: lớp đã không có thành viên mang tên
- 12. Thành viên lớp học chung trong C#?
- 13. trình khởi tạo thành viên không đặt tên cho thành viên hoặc lớp cơ sở dữ liệu không tĩnh
- 14. C++: Khởi tạo Thứ tự của các thành viên dữ liệu lớp
- 15. Tính năng "Khởi tạo thành viên trong lớp" có được tạo thành C++ 11 không?
- 16. Truy cập các thành viên lớp C# trong IronPython
- 17. Lớp kế thừa C++ có thành viên cùng tên
- 18. Hàm const thành viên có thể trả về một con trỏ không const cho một thành viên dữ liệu không?
- 19. thành viên dữ liệu 'vec' không thể là một mẫu thành viên
- 20. C++ là destructor ảo vẫn cần thiết nếu không có thành viên dữ liệu trong nguồn gốc?
- 21. Thừa kế thành viên tĩnh trong C#
- 22. Tại sao một lớp không thể có cùng tên cho một hàm và một thành viên dữ liệu?
- 23. không tĩnh thành viên dữ liệu initializers câu hỏi
- 24. Trình biên dịch đảm bảo rằng không có trạng thái thành viên dữ liệu nào được thay đổi trong hàm thành viên const? (hoặc trong C++ hoặc java)
- 25. Thành phần dữ liệu lớp mẫu cơ sở không hiển thị trong lớp mẫu có nguồn gốc?
- 26. Điểm thành viên tham chiếu lớp cho thành viên khác trong cùng một lớp
- 27. C++: Giá trị mặc định trong thành viên lớp
- 28. Thành viên lớp học có chiếm được bộ nhớ không?
- 29. C++ 11 - khai báo thành viên dữ liệu không tĩnh là 'tự động'
- 30. Thành viên lớp học Python Khởi tạo
Nói chung, trong C++ người ta sẽ đặt các hàm không phải thành viên bên trong một không gian tên. Không cần lớp cho các hàm nhóm như thế này. – juanchopanza
Nếu bạn chỉ có một Trình phân tích cú pháp, một không gian tên sẽ làm. Nếu bạn có Parser1 và Parser2 và muốn có thể sử dụng một trong hai, thiết kế này là một cách hợp lý để làm điều đó. –
Tại sao không phải hai không gian tên khác nhau trong trường hợp đó? – user592748