Hatalar, hatalar, sorular - sayfa 2359

 
A100 :

Özellikle sizin için dikkate alınarak yeniden kontrol edildi

sorun değil

Hangi derleyiciniz var?

VS 2010'da sahibim:

ikili '=' : 'A' türünde bir sağ işleneni alan operatör bulunamadı (veya kabul edilebilir bir dönüştürme yok)

ps Sadece "hesaba katma"nın ne anlama geldiğini gerçekten anlamıyorum? Temel bir sınıfın türetilmiş bir sınıfa örtük olarak kopyalanmasının kabul edilebilirliği ile ilgiliydi.

 

Visual Studio'da örneğim de çalışıyor. Açık kopya operatörünü kastettim ve kodla açıkladım.

Her ihtimale karşı yazdım ki sinir yasaklansa müstehcen aynı anda yanlışlıkla yasaklanmasın.

 
A100 :

Visual Studio'da örneğim de çalışıyor. Açık kopya operatörünü kastettim ve kodla açıkladım.

Açık bir operatörden söz edilmedi. Sizin "dar düşünme" dediğiniz bu durumda örtük bir operatörün kabul edilemezliğinden bahsetmiştim ama öyle değil.

Kopyalamak istiyorsanız, o zaman C++'da önce açıkça istenen türe b'yi kullanmalısınız. Böyle bir kopyalama için nesne kapsülleme ihlalidir. Bu nedenle, herhangi bir örtüklükten söz edilmemelidir.

 
A100 :

Açık kopya operatörünü kastettim ve kodla açıkladım.

Bu arada, eğer A sınıfı aynı zamanda bir X sınıfından miras alınmışsa, o zaman B sınıfınız X tarafından hiçbir şekilde kopya korumalı değildir (MQL'den bahsediyoruz). TÜM ebeveyn sınıfları için operatörler yazmanız gerekecek.
 
A100 :

Derleyicinin onları (kod bağlamında) açık ve örtük olanlara ayırdığından şüpheliyim. Aksi takdirde düzeltmesi kolay olurdu.

Sonuç olarak, örtük bir operatörün her zaman nesnenin türüyle eşleşmesidir. Onlar. B türünde bir nesne ise, const B& türünde örtük bir işleci vardır. A tipi kabul edilmez. Ama bu C++'da.
 

Bu arada, operatör tipi ile her şey yolunda gibi görünüyor

İlk olarak, B:: operatörünü arar, eğer orada değilse, o zaman zaten A:: içinde arar, eğer orada da değilse, o zaman görevini tamamlamış kabul eder ve hiçbir şey yapmaz (işaretçi sonunda bozuldu) :)

 
Ilya Malev :

orada da değilse, görevini yaptığını kabul eder ve hiçbir şey yapmaz (işaretçi sonunda kırılsa da) :)

Neden hiçbir şey yapmıyor? Yapmaması gereken örtük (otomatik) operatör=(const A&) ile kopyalar.

Evet ve sonunda B'den sonra bu yıldız işaretini kaldırıyorsunuz, gözü yoruyor) Bu bug ile her şey çoktan anlaşılmış oldu.

 
Alexey Navoykov :

Evet ve sonunda B'den sonra bu yıldız işaretini kaldırıyorsunuz, gözü yoruyor) Bu bug ile her şey çoktan anlaşılmış oldu.

Şahsen, yıldızsız nesne değişkenleri gözüme zarar verdi)) Kötü hatalardan biri *a yerine A a=new A yazmak ve uzun süre ne olduğunu anlamamak) Aksine, her şeyin doğru çalıştığını gösterdim tavsiyenize uyarsanız ve özel bir operasyon ilan ederseniz =&. Ve bu durumda, editör hemen bir hata verecektir. Bundan sonra hep böyle yapacağım :)

 
Tutarsızlıkları aramak için birkaç saat harcadım. Bunu buldum
 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{
   const double Koef =   0.25 ;
   const int iDelta = 32 ;
   const double point = 0.00001 ;
  
   const double high = 1.06736 ;
   const double low = 1.06676 ;
  
   const double Avg = (high + low) * 0.5 ;  
   const double Size = (high - low) * Koef * 0.5 ;  
  
  PRINT( DoubleToString (Avg - Size - point * iDelta, 5 ));   // DoubleToString(Avg-Size-point*iDelta,5) = 1.06666
  PRINT( DoubleToString (Avg - (Size + point * iDelta), 5 )); // DoubleToString(Avg-(Size+point*iDelta),5) = 1.06667
} 


Double'nin özelliklerini biliyorum, ancak toplama sırasını değiştirirseniz (nispeten çok farklı sayılar hariç), sonuç farklı olacak şekilde değil! Lütfen aptala açıkla, çünkü burada neler oluyor?

Kaynakta sadece en alttaki iki satıra bakmanız gerekiyor.

 

Geliştiriciler için hata.

Komut dosyası derlenmiyor, nedenini belirleyin))). Lütfen ekteki dosyayı kullanın.


Aynı dosya:


Dosyalar:
Test1.mq5  9 kb