Có hai kịch bản có thể ở đây:
Chức năng biết/hy vọng rằng obj
đã có mặt trên bản đồ, và bạn đang sử dụng []
cho thuận tiện.
Bạn đang sử dụng []
để có đầy đủ tiềm năng, nghĩa là bạn mong đợi thêm obj
vào bản đồ nếu chưa có.
Trong trường hợp 2, bạn gặp lỗi trong chữ ký getColor
. Vì nó có khả năng có thể vượt qua obj
đến một nơi mà nó sẽ được lưu trữ như A*
, nó là sai cho nó để chấp nhận một chỉ const A*
. Lưu ý rằng ngay cả khi một hàm không sửa đổi một đối tượng chính nó nhưng chuyển nó vào một nơi nào đó mà nó có thể được sửa đổi, nó có hiệu quả sửa đổi nó gián tiếp và do đó nên lấy nó như là không const
.
Trong trường hợp 1, nó phụ thuộc vào phiên bản C++ của bạn. C++ 14 đã giới thiệu một hàm template overload of find
và các chức năng thành viên có liên quan là std::map
, mất bất kỳ thứ gì có thể so sánh với Key
thay vì chỉ Key
. Do đó bạn có thể thay đổi chức năng như thế này:
void getColor(A const * obj){
doubel d = map.find(obj)->second;
// do something
}
Lưu ý rằng để làm việc này, bạn cũng cần phải thay đổi loại của bản đồ sử dụng một so sánh trong suốt: std::map<A*,double, std::less<>> map;
(như đầu tiên chỉ ra bởi @Leon's answer).
Nếu bạn đang mắc kẹt với C++ 11 hoặc cũ hơn, bạn đã hết may mắn và bạn sẽ phải sống với const_cast
. Lưu ý rằng với một chú thích thích hợp, const_cast
là hoàn toàn an toàn và được chấp nhận trong trường hợp này (chưa kể đến cách duy nhất để tiếp tục mà không thay đổi loại map
). Một lần nữa, bạn nên sử dụng find
hoặc có lẽ at
thay vì []
, vì bạn không muốn chèn vào bản đồ.
Ngoài sự tò mò: Tại sao bạn không muốn tạo khóa? –
Tại sao bạn không muốn tạo khóa là 'const A *'? – Gonmator
liên quan: http://stackoverflow.com/a/17639764/4181011 –