Vì std::string
thực sự là một typedef
của một lớp được tạo khuôn mẫu, làm thế nào tôi có thể ghi đè lên nó? Tôi muốn tạo một UTF-8 std::string
sẽ trả về độ dài chính xác, trong số những thứ khác.Thừa kế và ghi đè các hàm của chuỗi std ::?
Trả lời
KHÔNG xuất phát từ STRING
std :: string, đó là, về cơ bản toàn bộ mẫu basic_string không được thiết kế để được bắt nguồn từ đâu. Có rất nhiều bài viết về điều đó. Nó không có bất kỳ chức năng ảo nên không có gì để ghi đè lên. Điều tốt nhất bạn có thể làm là che giấu điều gì đó. Tốt nhất là sử dụng thành phần/tập hợp! Đó là, chỉ cần giữ một thành viên của chuỗi kiểu trong lớp của bạn và chuyển tiếp các cuộc gọi! Một lần nữa, chỉ để chắc chắn
KHÔNG xuất phát từ STRING
Bạn đã nhìn ICU?
Một typedef chỉ là một nhãn thuận tiện.
lớp foo: thanh công cộng {};
hoạt động tốt khi thanh là typedef của PT.
Có thể không có ý tưởng hay trong trường hợp này, nhưng ngôn ngữ hỗ trợ nó.
Nó thường được coi là một sai lầm trong C++ để lấy được từ một thùng chứa thư viện chuẩn. Tuy nhiên, chức năng bạn đang tìm kiếm đã được triển khai. Có một cái nhìn tại Glib::ustring.
Hy vọng điều này sẽ hữu ích!
Ý tưởng tốt hơn: tạo vùng chứa utf8_string tương thích STL mà không kế thừa từ chuỗi std ::.
Nếu bạn phải xác định loại chuỗi riêng của bạn, sau đó không kế thừa từ std::string
nhưng định nghĩa lớp Character Traits riêng của bạn và làm một cái gì đó giống như
typedef std::basic_string<unsigned char, utf8_traits> utf8string;
Xem thêm Herb Sutter's website.
+1 - có một lý do 'std :: string' là một' typedef', và đây là nó. –
Mặt khác, tôi sẽ không sử dụng 'basic_string' để xử lý chuỗi UTF-8. Bạn sẽ hại nhiều hơn bất cứ khi nào bạn cố gắng thao túng nó. –
@Matthieu M., phụ thuộc hoàn toàn vào cách bạn triển khai các đặc điểm của nhân vật. Tôi có thể thấy hai tùy chọn: hoặc đóng gói chúng như là UTF-8 trực tiếp và thực hiện 'state_type', hoặc gói chúng dưới dạng UTF-32 và chuyển đổi ở ranh giới. Dù bằng cách nào, đó là rất nhiều công việc, nhưng nó vẫn giữ khả năng tương thích với các thuật toán STL. –
Như đã được người khác tuyên bố: không lấy được từ std::string
, nó không được thiết kế cho việc này.
Bạn nên có một cái nhìn trên this article, trong đó cho thấy cách tạo một chuỗi chuỗi phân biệt chữ hoa chữ thường làm ví dụ. Bạn sẽ thấy rằng logic được thực hiện trong std::basic_string
độc lập với loại ký tự và việc cung cấp một số tùy chỉnh char_traits
sẽ thực hiện thủ thuật.
Thực ra tôi không khuyên bạn nên làm điều này. Tôi đã làm điều này một vài năm trước và tôi đã phải hối tiếc quyết định đó. Điều gì sẽ xảy ra là bạn sẽ phải chuyển đổi qua lại giữa loại mới này và loại chuỗi tiêu chuẩn, tất cả trên cơ sở mã của bạn. Nó không đẹp. Một bài viết tuyệt vời giải thích chi tiết được tìm thấy ở đây: http://lafstern.org/matt/col2_new.pdf. Tóm tắt: Trường hợp vô cảm không phải là về một đối tượng, đó là về cách bạn sử dụng một đối tượng. –
Viết thực thi unicode phù hợp và hoạt động bình thường trong mọi trường hợp là rất khó thực hiện. Tôi sẽ khuyên bạn nên sử dụng thư viện hoặc triển khai hiện có thay vì sử dụng thư viện của riêng bạn. Ví dụ, Windows, OSX và Qt đều có thư viện hỗ trợ UTF-16 và các chuỗi được mã hóa khác.
Chỉ cần chắc chắn bạn biết bạn đang làm gì trước tiên. Chính xác "độ dài chính xác" bạn muốn trả về từ các đối tượng chuỗi của bạn là gì? Số điểm mã?Điều đó không phải lúc nào cũng tương ứng với số ký tự mà người dùng nhận thấy.
Dù sao, hãy xem thư viện utf8-cpp để xem cách tiếp cận khác để phát sinh từ std :: string.
- 1. C++ thừa kế và chức năng ghi đè
- 2. Giá trị ghi đè kế thừa thừa kế Java
- 3. ghi đè getters/setters kế thừa
- 4. Css sẽ không ghi đè các giá trị kế thừa
- 5. ánh xạ doctrine2 ghi đè trường inversed đã thừa kế được thừa kế từ MappedSuperclass
- 6. Ghi đè màu Neo để kế thừa màu mặc định
- 7. Các thuộc tính cơ sở thừa kế và ghi đè C#
- 8. Python đa chức năng thừa kế ghi đè và ListView trong django
- 9. Ghi đè các giá trị và bộ định vị của các thuộc tính kế thừa bằng Python
- 10. Sử dụng luabind và std :: shared_ptr với thừa kế
- 11. C++: Kế thừa từ std :: map
- 12. Bạn có thể ghi đè lên một hàm tạo lớp và sử dụng được kế thừa không?
- 13. Làm cách nào tôi có thể gọi phương thức tổ tiên `Kế thừa` trong các hàm ảo bị ghi đè?
- 14. Các hàm tạo và thừa kế mặc định trong Java
- 15. C#: kế thừa các hàm tạo
- 16. Thừa kế ảo thuần túy, đa thừa kế và C4505
- 17. thoại Kế thừa từ jQuery UI và gọi phương thức ghi đè
- 18. Thừa kế Bảng đơn Rails: Cách ghi đè giá trị được ghi vào trường loại
- 19. Ngăn lớp kế thừa từ chức năng ghi đè ảo của lớp cơ sở
- 20. C++ Exceptions và thừa kế từ std :: ngoại lệ
- 21. std :: tìm trên một mảng kế thừa
- 22. Thừa kế thừa kế và thừa kế phương thức
- 23. Thừa kế hàm tạo Java?
- 24. Làm thế nào để ghi đè lên hàm trait và gọi nó từ hàm bị ghi đè?
- 25. Chuỗi ghi đè Python __hash__
- 26. F # và mô hình của thừa kế
- 27. Làm cách nào để ghi đè các hàm của lớp cha trong python?
- 28. Đánh dấu các chức năng ghi đè
- 29. Cách chính xác để thừa kế từ std :: exception
- 30. Java thừa kế vs C# thừa kế
-1. Thực tiễn tốt nhất cho nhiệm vụ này là cung cấp một đối tượng Character Traits và khởi tạo 'std :: basic_string'. Ẩn một 'std :: string' trong trường hợp này làm tăng vấn đề ký hiệu' char', vì UTF-8 là một mã hóa nhiều byte 8 bit. –
@ larsmans: Không phản đối :) Tôi đã quá bận tâm với thực tế là một người nào đó ở đâu đó có ý nghĩ lấy được từ một loại phi đa hình :) –
-1. Không thực sự trả lời câu hỏi. câu trả lời của người larsman ít nhất đưa ra một ý tưởng tốt cho một hướng đi. – leetNightshade