"Nesne işaretleyicilerini MQL5'te Kullanma" makalesi için tartışma - sayfa 4

 
tol64:
Bir güvenlik açığı mı buldunuz? )
Evet. Bu şekilde doğrudan döküm yapmak çok kötü. Artılarda özellikle bu amaç için dynamic_cast vardır, burada tamamen doğru bir şekilde döküm yapamazsınız ve potansiyel bir örtük ve ciddi hata kaynağıdır. Ve ciddiyet açısından güvenli olmayan işaretçiler ve referanslardan çok daha iyi değildir.
 
denkir:

Polimorfizm kullanmak daha iyi olmaz mı?

Yaklaşık olarak:

Mesele şu ki, CChartObjectRectLabel, CChartObjectButton ve CChartObjectEdit mirasçı sınıflarının erişilmesi gereken kendi benzersiz yöntemleri vardır. Ve standart kütüphanedeki CChartObject temel sınıfı aynı sanal metotlara sahip değildir.

 

Yukarıdaki örneğimde...

yöntemlerine nasıl erişilir?


...bu şekilde ortaya çıkıyor:

//--- objects[0]. // CChartObjectEdit sınıfının yöntemlerine nasıl erişilir ?
// 1.
   Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor());
//--- 2.
   CChartObjectEdit *e=(CChartObjectEdit *)objects[0];
   Print("e.BackColor(): ",e.BackColor());
   
//--- objects[1]. // CChartObjectButton sınıfının yöntemlerine nasıl erişilir ?
// 1.
   Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State());
//--- 2.
   CChartObjectButton *b=(CChartObjectButton *)objects[1];
   Print("b.State(): ",b.State());
   
//--- objects[2]. // CChartObjectRectLabel sınıfının yöntemlerine nasıl erişilir ?
// 1.
   Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor());
//--- 2.
   CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2];
   Print("r.BackColor(): ",r.BackColor());
 
TheXpert:
Evet. Bu şekilde doğrudan döküm yapmak alışılmışın dışındadır. Artılarda özellikle bu amaç için dynamic_cast vardır, burada tamamen doğru bir şekilde döküm yapamazsınız ve potansiyel bir örtük ve ciddi hata kaynağıdır. Ve ciddiyetle, güvenli olmayan işaretçilerden ve referanslardan çok daha iyi değildir.

Evet, burada forumda bir soru sormadan önce, internette C++'ın dynamic_cast operatörüne ( dinamik veri tanımlama mekanizması) sahip olduğunu buldum.

Şimdi yukarıdaki bağlantıya bakıyorum:

// Dinamik veri tipi tanımlama mekanizması sadece polimorfik olanlar için kullanılabilir 
// sınıflar (yani en az bir sanal üye işlev içeren sınıflar)

Yani bu zorunlu bir koşul mu? Ve eğer temel sınıfta sanal metotlar yoksa, dynamic_cast çalışmayacak mı?

Not: >> Burada dynamic_cast hakkında daha fazla şey okuyorum (MSDN).

 
TheXpert:
Kahretsin, ve bundan sonra dil güvenliğinden mi bahsediyorsun?

Muhtemelen C/C++'da olduğu gibi her şeye serbestçe döküm yapabileceğinizi düşünüyorsunuz.

Öyle değil ve güvenlikle ilgili yanlış bir şey yok.

 
Renat:

Muhtemelen C/C++'da olduğu gibi herhangi bir şeye serbestçe döküm yapabileceğinizi düşünüyorsunuz.

Öyle değil ve güvenlikle ilgili yanlış bir şey yok.

Tesadüfen bu hatayı aldım, bu da sözlerinizi doğruluyor gibi görünüyor. )

2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5)   incorrect casting of pointers in 'Test1.mqh' (931,13)
 
Renat:

Öyle değildir ve güvenlikle ilgili yanlış bir şey yoktur.

Hayır, normalde derleme zamanı dynamic_cast kontrolü yapamazsınız.
 
TheXpert:
Hayır, dynamic_cast'i derleme zamanında kontrol etmek mümkün değildir.

Yukarıdaki yorum çalışma zamanında cast kontrolünün sonucunu göstermektedir.

Çok katıdır, RTTI mekanizması üzerinde çalışır, çünkü hayalet durumunda kimin kim olduğunu tam olarak biliriz.

 
Renat:

Yukarıdaki yorum, rantime'daki döküm kontrolünün sonucunu göstermektedir.

Oops.... kafam karıştı. Bunun bir derleyici olduğunu düşünmüştüm. Sonra geri aldım.
 
Eğitim polimorfizmi anlamamı kolaylaştırdı. Teşekkürler