Pregunta como arriba, más detalles debajo:¿Cómo evito que un lanzamiento implícito doble -> int?
Tengo una clase Money
para ocuparse de ... bueno, usted adivinó qué. Estoy muy estricta de no permitir Money
y double
para interactuar (*), por lo que el siguiente código es no posible:
Money m1(4.50);
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
Ahora estoy pensando que permite la multiplicación de Money
con int
, como en "usted tiene 6 pedazos de pastel por $ 4.50 cada uno (así que ve y encuentra un pastel más barato en alguna parte) ".
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; }
que funciona bien, pero ... por desgracia, C++ hace conversiones implícitas de double
a int
, tan de repente mi primer fragmento de código se compilará. No quiero eso. ¿Hay alguna manera de evitar moldes implícitos en esta situación?
Gracias! - Robin
(*) Motivo: Tengo mucho de la de código heredado que se encarga de todas las cosas Money
-relacionado con double
, y yo no quiero ese tipo confundido hasta que todo correr con Money
.
Editar: Constructores agregados para Money.
Edit: Gracias, a todos, por sus respuestas. Casi todos fueron geniales y serviciales. El comentario de R. Martinho Fernandes "usted puede hacer inline const Money operator*(const Money & m, double d) = delete;
" fue en realidad la respuesta (tan pronto como cambie a un compilador compatible con C++ 11). Kerrek SB dio una buena alternativa sin C++ 11, pero lo que terminé usando es en realidad el enfoque de "sobrecarga long
" de Nicola Musatti. Es por eso que estoy marcando su respuesta como "la respuesta" (también porque todas las ideas útiles surgieron como comentarios a su respuesta). ¡Gracias otra véz!
Mostrar constructores de dinero – mloskot
He cambiado su referencia de 'C' a' C++ 'en el texto. – xanatos
Pero, como lo pensó mloskot, podría haber una conversión implícita doble -> Dinero – xanatos