Pytanie jak wyżej, więcej szczegółów poniżej:Jak zapobiec niejawnym rzutowaniem podwójnym -> int?
Mam klasę Money
do czynienia z ... cóż, zgadłeś co. Jestem bardzo o nie pozwalając Money
i double
interakcję (*), więc następujący kod jest nie możliwe:
Money m1(4.50);
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
Teraz myślę o umożliwiając namnażanie Money
z int
, jak w „Ci Mają 6 kawałków ciasta za 4,50 $ za sztukę (więc idź i znajdź gdzieś taniej ciasto). "
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; }
To działa dobrze, ale... niestety, C++ robi ukryte odlewane od double
do int
, tak nagle mój pierwszy fragment kodu zostanie skompilowany. Nie chcę tego. Czy istnieje sposób, aby w takich sytuacjach zapobiec domyślnym rzutom ?
Dzięki! - Robin
(*) Powód: Mam wiele jest starszych kod, który obsługuje wszystkie rzeczy związane z kondensatorem Money
z double
, a ja nie chcę tych rodzajów mylić aż wszystko przebiega z Money
.
Edytuj: Dodano konstruktorów dla pieniędzy.
Edytuj: Dzięki, wszyscy, za twoje odpowiedzi. Prawie wszyscy byli wspaniali i pomocni. Komentarz R. Martinho Fernandesa "możesz zrobić inline const Money operator*(const Money & m, double d) = delete;
" był właściwie odpowiedzią (jak tylko przejdę na kompilator wspierający C++ 11). Kerrek SB dał dobrą alternatywę bez C++ 11, ale to, co ostatecznie wykorzystałem, to podejście "przeciążenia long
" Nicoli Musatti. Właśnie dlatego oznaczam jego odpowiedź jako "odpowiedź" (również dlatego, że wszystkie przydatne pomysły pojawiły się jako komentarze do jego odpowiedzi). Jeszcze raz dzięki!
Konstruktorzy Show Money – mloskot
Zmieniłem twój odnośnik "C" na "C++" w tekście. – xanatos
Ale, jak pomyślałem przez mloskot, może istnieć niejawna konwersja podwójna -> Pieniądze – xanatos