Yukarıdaki gibi bir soru, aşağıdaki gibi daha fazla ayrıntı:Bir örtük yayınlamayı nasıl önleyebilirim -> int?
Anlamak için bir sınıfım var Money
... iyi, ne olduğunu tahmin ettiniz. Aşağıdaki kod mümkün değildir bu yüzden, (*) etkileşim Money
ve double
izin vermeyerek hakkında çok sıkı duyuyorum: Şimdi "örneğinde olduğu gibi, int
ile Money
çoğalmasını sağlayan hakkında düşündüklerim
Money m1(4.50);
double d = 1.5;
Money m2 = m1 * d; // <-- compiler error
her biri 4,50 $ için 6 dilim kek var (yani gidip bir yere daha ucuz bir kek bul.)
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; }
çalışıyor
, ama ... maalesef C++ kadar aniden benim ilk kod parçacığı derleyip double
den int
için örtülü yayınları yapar. Bunu istemiyorum. Bu durumda örtük yayınları önlemek için herhangi bir yolu var mı?
Teşekkürler! - Robin
(*) Nedeni: Ben çok 'double
tüm Money
lı malzeme işleme eski kod var ve ben Money
çalıştırmak herşeyi kadar karıştı o tür istemiyoruz.
Düzenleme: Para için ek kurucular.
Düzenleme: Herkes, yanıtlarınız için teşekkürler. Hemen hemen hepsi harika ve yardımseverdi. R. Martinho Fernandes'in yorumu "inline const Money operator*(const Money & m, double d) = delete;
yapabilirsin" cevabı aslında oldu (C++ 11 destekli derleyiciye geçtiğimde). Kerrek SB, iyi bir C++ 11 alternatifi vermedi, fakat benim kullandığım şey, aslında Nicola Musatti'nin "aşırı yük long
" yaklaşımı. Bu yüzden cevabını "cevap" olarak işaretliyorum (ayrıca tüm yararlı fikirlerin cevabına yorum getirdiği için). Yine teşekkürler!
Para yapıcılarını göster – mloskot
Metindeki "C" ile "C++" arasındaki başvurunuzu değiştirdim. – xanatos
Ancak, mloskot tarafından düşünülürse, örtük bir dönüşüm çift olabilir -> Para – xanatos