Hatalar, hatalar, sorular - sayfa 1891

 
Renat Fatkhullin :

Kesinlikle.

Doğru? Çünkü dynamic_cast en çok aşağıdan yukarıya, ebeveynden çocuğa yayın yapmak için gereklidir.

Ayrıca, MQL'de aşağıdan yukarıya doğru mükemmel bir şekilde yol almaması gerektiğinde bile:

 class A
{
public :
   virtual void f()
   {
       Print ( "1" );
   }
};

class B: public A
{
public :
   virtual void f()
   {
       Print ( "2" );
   }
};

void OnStart ()
{
   A* ptr1 = new B();
   ptr1.f();
   A* ptr2 = new A();
   ptr2.f();
   
   B* casted = dynamic_cast <B*>(ptr1);
   casted.f();
   
   B* casted1 = dynamic_cast <B*>(ptr2);
   casted1.f(); // здесь должна быть ошибка потому что casted1 должен быть null
   delete ptr1;
   delete ptr2;
}

вывод:
2017.05.13 18:30:14.864    t ETHUSD,M5: 2
2017.05.13 18:30:14.865    t ETHUSD,M5: 1
2017.05.13 18:30:14.866    t ETHUSD,M5: 2
2017.05.13 18:30:14.867    t ETHUSD,M5: 2


Renat Fatkhullin'in fotoğrafı.

MQL5 kodunun tartışılan parçasına bir göz atın.

Evet, çalışmamalı ve nedeni yukarıda zaten açıklandı, ama hiç de değil çünkü aşağıdan yukarıya döküm imkansız.

 
Konstantin :
işaretçiyi yukarıdan aşağıya doğru atarsak, yani. ebeveyne, bundan sonra işaretçiyi başka bir kapsamda iş parçacığına geçireceğiz, sonra alt alanlar orada mevcut olacak mı?

Evet, sorunuzu gösteren bir örnek:

 class CLASS1
  {
public :
   int                i;
  };
class CLASS2 : public CLASS1
  {
  };
void OnStart ()
  {
   CLASS1 _object;
   CLASS2 *_ptr= dynamic_cast <CLASS2 *>(&_object);

   if (!_ptr)
       Print ( "CLASS1 -> CLASS2 failed, null" );

   CLASS2 *my= new CLASS2;
   CLASS1 *my_ptr=my;
   CLASS2 *my_ptr2= dynamic_cast <CLASS2 *>(my_ptr);

   if (my_ptr2)
     {
       Print ( "CLASS2 -> CLASS1 -> CLASS2 ok" );
      my_ptr2.i= 1 ;
     }
   Print ( "Value: " ,my.i);
  }
ve çıktı:
 2017.05 . 13 18 : 34 : 50.341 cast (EURUSD,H1)        CLASS1 -> CLASS2 failed, null
2017.05 . 13 18 : 35 : 18.933 cast (EURUSD,H1)        CLASS2 -> CLASS1 -> CLASS2 ok
2017.05 . 13 18 : 35 : 20.110 cast (EURUSD,H1)        Value: 1

İlk olarak, çözülmemiş dökümü aşağıdan yukarıya doğru kontrol edip NULL alıyoruz. Pekala.

Sonra bir CLASS2 nesnesi yaratırız, ona üst sınıfa bir referans atarız (burada dinamiklerde ortamın CLASS2 nesnesinin yerel türünün meta bilgisinde saklandığını bildiğini anlamak önemlidir). Daha sonra (sadece sorunuz) CLASS1 bağlantısından CLASS2'ye dinamik olarak (orijinal nesnenin meta bilgisine dayalı olarak dönüştürme hakkını kontrol ederek) yayınlıyoruz.

Döküm sonucunu kontrol ediyoruz ve i = 1 değişkenine yazıyoruz. Son olarak, başlangıçta oluşturulan nesneye atıfta bulunarak i değerini gösteriyoruz.

Her şey doğru ve spesifikasyona göre çalışıyor (C++'ın kendi spesifikasyonuna dynamic_cast dahil).

 
Комбинатор :

Doğru? Çünkü dynamic_cast, çoğunlukla yalnızca aşağıdan yukarıya, ebeveynden çocuğa yayın yapmak için gereklidir.

Ayrıca, MQL'de aşağıdan yukarıya doğru mükemmel bir şekilde yol almaması gerektiğinde bile:

Aynen öyle:

En son yapılara güncellemeyi unutmayın. Şimdi, bu konudaki gibi fermuarlar şeklinde son zamanlarda yayınlanan 1598'de test ediyorum.

 
Renat Fatkhullin :

En son yapılara güncellemeyi unutmayın.

Evet, eski yapı.

Renat Fatkhullin'in fotoğrafı.

Doğru, aşağıdan yukarıya verilemez, sadece yukarıdan aşağıya. Bu güvenlik içindir.

Bunu ovacaksınız, yanıltıcıdır ve dynamic_cast'in işleyişiyle doğrudan çelişir.
 
Комбинатор :

Evet, eski yapı.

Bunu ovacaksınız, yanıltıcıdır ve dynamic_cast'in işleyişiyle doğrudan çelişir.

Yükseltilmiş alın dökümü örneğinin bir parçası olarak SINIF1 -> SINIF2 her şeyi doğru söylemiş. Çoğu durumda insanların kafalarında bu rol oynar.

Ayrıca, dynamic_cast güvenlik kontrolünün altında yatan şey tam olarak "aşağıdan yukarıya yayınlanamaz, yalnızca yukarıdan aşağıya yayınlanır".

Ne yaptığını bilenler, dinamik dökümün özünü anlıyor.

 
Renat Fatkhullin :

En son yapılara güncellemeyi unutmayın. Şimdi, bu konudaki gibi fermuarlar şeklinde son zamanlarda yayınlanan 1598'de test ediyorum.

Derleyici ve yürütücü hangi exe dosyasında oturur?

Şimdi MEb1599, MT4b1080'de. Lütfen metaeditor.exe ve terminal.exe'nin ne yaptığını açıklayın.

 
fxsaber :

Derleyici ve yürütücü hangi exe dosyasında oturur?

Şimdi MEb1599, MT4b1080'de. Lütfen metaeditor.exe ve terminal.exe'nin ne yaptığını açıklayın.

Her iki platform için derleyici aynıdır. metaeditor.exe'de var
 
Renat Fatkhullin :
Her iki platform için derleyici aynıdır. metaeditor.exe'de var
Ve terminal.exe'de aynı dynamic_cast'i kontrol eden uygulayıcı?
 
fxsaber :
Ve terminal.exe'de aynı dynamic_cast'i kontrol eden uygulayıcı?
Kesinlikle
 
Renat Fatkhullin :
Böyle bir soru daha

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2017.05.11 13:26

EX5 neden böyle bir kod
 void OnStart () {}

5 KB ağırlığında mı?