Câu hỏi như trên, chi tiết hơn bên dưới:Làm thế nào để ngăn chặn một diễn viên tiềm ẩn đôi -> int?
Tôi có một lớp học Money
để giải quyết ... tốt, bạn đã đoán được điều gì. Tôi rất nghiêm ngặt về việc không cho phép Money
và double
để tương tác (*), do đó đoạn mã sau là không thể:
Money m1(4.50);
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
Bây giờ tôi đang suy nghĩ về việc cho phép nhân của Money
với int
, như trong "bạn có 6 miếng bánh với giá $ 4,50 mỗi cái (nên đi tìm bánh rẻ hơn ở đâu đó). "
class Money
{
Money();
Money(const Money & other);
explicit Money(double d);
...
Money & operator*=(int i);
...
}
inline const Money operator*(const Money & m, int i) { return Money(m) *= i; }
inline const Money operator*(int i, const Money & m) { return Money(m) *= i; }
đó làm việc tốt, nhưng ... không may, C++ không phôi ngầm từ double
để int
, vì vậy đột nhiên đoạn mã đầu tiên của tôi sẽ biên dịch. Tôi không muốn điều đó. Có cách nào để ngăn chặn các phôi tiềm ẩn trong trường hợp này không?
Cảm ơn! - Robin
(*) Lý do: Tôi có nhiều mã di sản xử lý tất cả các công cụ có liên quan Money
có liên quan double
và tôi không muốn các loại đó nhầm lẫn cho đến khi mọi thứ chạy với Money
.
Chỉnh sửa: Thêm hàm tạo cho tiền.
Chỉnh sửa: Cảm ơn mọi người, về câu trả lời của bạn. Hầu như tất cả chúng đều tuyệt vời và hữu ích. R. Martinho Fernandes 'bình luận' bạn có thể làm inline const Money operator*(const Money & m, double d) = delete;
"thực sự là câu trả lời (ngay khi tôi chuyển sang trình biên dịch hỗ trợ C++ 11). Kerrek SB đã đưa ra một lựa chọn không thay thế C++ 11, nhưng những gì tôi đã kết thúc với việc sử dụng thực sự là phương pháp "quá tải long
" của Nicola Musatti. Đó là lý do tại sao tôi đang gắn cờ câu trả lời của anh ấy là "câu trả lời" (cũng bởi vì tất cả các ý tưởng hữu ích đều được đưa ra làm bình luận cho câu trả lời của anh). Một lần nữa cám ơn!
Hiển thị các nhà xây dựng tiền – mloskot
Tôi đã thay đổi tham chiếu của bạn về 'C' thành' C++' trong văn bản. – xanatos
Nhưng, theo suy nghĩ của mloskot, có thể có một chuyển đổi ngầm ẩn đôi -> Tiền – xanatos