Tôi đang xây dựng một thư viện bằng C++ (chủ yếu là để giải trí) mà tôi đã làm việc được một thời gian (nhiều năm, haha, đó chỉ là một sở thích)
Gần đây tôi đã chuyển một số điều cơ bản (đọc, phụ thuộc vào thư viện) sang thư viện khác. Thật không may, thư viện hoàn toàn không quan tâm đến "tính đúng đắn". Tôi hơi mắc chứng OCD và tôi muốn thử thách bản thân làm mọi thứ "đúng cách™", vì vậy tôi muốn làm cho thư viện của mình trở nên chính xác. Tôi đã bắt đầu việc này một vài lần và một số phần thì như vậy; tôi biết tốt hơn là nên bắt đầu sửa lỗi ngay từ đầu nhưng điều đó không thực sự phù hợp hoặc không đáng để tranh luận. Tôi thực sự muốn thử lại một cách nghiêm túc, nhưng một thư viện khác ngăn cản tôi làm điều đó.
Bạn có thể hỏi, chuyện gì đang xảy ra vậy?
Chà, nếu tôi đang gọi một phương thức rõ ràng là const (mà không thực sự thay đổi bất cứ điều gì) và phương thức của tôi cũng là một ứng cử viên cho const-ing (từ mới), thì tôi không có cách nào đảm bảo rằng phương thức của tôi là const-ness Cho đến khi một phương pháp khác cũng là một hằng số.
Ví dụ:
// Thư viện bên thứ ba xấu
cấu trúc Foo
{
khoảng trống nên_be_const() {}
};
//Thư viện của tôi
thanh cấu trúc
{
Foo my_foo;
void nên_be_const() const
{
my_foo. Should_be_const(); // LỖI! Không phải là hàm const!
}
};
Điều này chỉ rõ ràng đối với tôi dựa trên bằng chứng thực nghiệm cũng như nghiên cứu và hiểu biết của tôi về tính bất biến. Tuy nhiên, đây có thể là một cách hiểu sai, vì vậy tôi sẵn sàng chấp nhận (và hy vọng về?) lỗi cũng như các biểu hiện khác của nó (mặc dù điều này sẽ làm lung lay nền tảng hiểu biết của tôi về hằng số haha)
Người nghèo phải làm gì nếu anh ta (hoặc cô ấy) muốn viết một thư viện thích hợp nhưng các phần phụ thuộc không được viết theo cách đó?
Tôi hy vọng đây là một câu hỏi thích hợp cho SO. Vui lòng (và tôi chắc chắn bạn sẽ làm vậy) cho tôi biết nếu điều đó không đúng hoặc nếu có trang StackExchange nào tốt hơn để đăng nó lên.
Tái bút Tôi đã tìm thấy nó câu hỏi SO này , nhưng tôi hy vọng chủ đề/giải pháp có thể được xây dựng chi tiết hơn.
Câu hỏi khác mà bạn đề cập đưa ra ý tưởng hay về vấn đề, nhưng tôi không đồng ý với câu trả lời này. Các giao diện trong thư viện con của bạn sẽ được chia thành bốn tình huống.
- Một cái gì đó không phải là const thì không thể mong đợi được.
- Những thứ được khai báo chính xác là const
một cái gì đó về mặt logic phải là một hằng số, và
3a. được thực hiện nhưng không được tuyên bố như vậy
3b. Đó không phải là cách nó hoạt động
Trường hợp 1 rất đơn giản - nếu bạn muốn giá trị của mình là const, thì bạn cần sao chép dữ liệu đầu vào trước khi gọi giao diện. Các tác nhân chỉ có lỗi và cuối cùng sẽ gây ra sự cố hoặc các lỗi khác. Trường hợp 2 không thành vấn đề. Vậy trường hợp 3 là
Thật không may, thực tế là trường hợp 3a và 3b nên được xử lý giống như trường hợp 1 vì chúng không thể phân biệt được. Việc triển khai có thể khác nhau tùy theo nền tảng hoặc phiên bản. Vì vậy, bạn nên tạo một bản sao rồi gọi giao diện. Lưu ý tôi đã nói "nên". Trên thực tế, hầu hết chúng ta sử dụng const_cast để gọi một giao diện mà chúng ta nghĩ là mình hiểu được (chẳng hạn như strcmp). Nó trở thành sự đánh giá về mức độ tự tin của chúng ta trong việc đạt được nó. Cá nhân tôi sẽ không lo lắng về strcmp. Khá nhiều thứ ở cấp độ cao hơn có thể sử dụng thứ gì đó như strtok, thứ này sẽ làm hỏng mọi thứ.
Tôi là một lập trình viên xuất sắc, rất giỏi!