Hatalar, hatalar, sorular - sayfa 1890

 

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

C ++ ile karşılaştırmak imkansızdır - oradaki herhangi bir şeye her şey getirilebilir.

 
Комбинатор :
C++'da bu, yalnızca temel sınıfın işaretçisi bir çocuğu işaret ediyorsa mümkündür.

Bununla ne demek istediğini anlamadım, ama bu kod:

 class CLASS1
{
public :
   int i;  
};

class CLASS2 : public CLASS1 {};

int main () {
  CLASS1 _object;
  CLASS2 *_ptr = (CLASS2*)&_object;  
  _ptr->i = 1 ;

   return 0 ;
}

C++'da yukarıda yazdığım gibi çalışır. Ve işte aynı kod (MQL sözdizimi göz önüne alındığında):

 class CLASS1
{
public :
   int i;  
};

class CLASS2 : public CLASS1 {};

int OnInit () {
  CLASS1 _object;
  CLASS2 *_ptr = dynamic_cast <CLASS2 *>(&_object);
  
  _ptr.i = 1 ;

   return 0 ;
}
artık çalışmıyor çünkü _ptr NULL alır
Bu nedenle, soru ortaya çıkıyor, bu bir MQL hatası mı ve düzeltilecek mi yoksa her şey böyle mi kalacak?
 
Renat Fatkhullin :

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

C ++ ile karşılaştırmak imkansızdır - oradaki herhangi bir şeye her şey getirilebilir.


şimdi anladım açıklama için teşekkürler :)
 
Konstantin :

Bununla ne demek istediğini anlamadım, ama bu kod:

Peki, anlamaya çalış. İlk olarak, dinamik_cast'in artılarla çalışmasını sağlayın. Kendi başınıza anlayın - çok daha iyi olacak.
 
Renat Fatkhullin :

Doğru, aşağıdan yukarıya verilemez, sadece yukarıdan aşağıya.

Temel sınıftan torunlara kadar sonuç almak imkansız mı?
 
Комбинатор :
Temel sınıftan torunlara kadar sonuç almak imkansız mı?

Evet, gerçekten inşa edilmiş bir çocuğun tabanda yatmaması durumunda.

 
Renat Fatkhullin :

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

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ı?
 
Renat Fatkhullin :

Evet.

Renat, dynamic_cast'in ne olduğunu biliyor musun?
 
Комбинатор :
Renat, dynamic_cast'in ne olduğunu biliyor musun?

Kesinlikle.

MQL5 kodunun tartışılan parçasına bir göz atın. Temel bir örnek oluşturulur ve ardından kahramanca, güvenlik sistemini ihlal ederek, oyuncu kadrosu aracılığıyla bir soyundan gelene dönüşmeye çalışır. Eh, elbette bir serseri.

 

Doğrudan belgelerde aynı örnek dikkate alınır ve açıklanır. Çalışma zamanında dinamik yayın, yalnızca güvenlik ve doğrulama denetimlerini geçtikten sonra tetiklenir. Her MQL5 nesnesi, çalışma zamanında izinleri kontrol etmek için tüm meta bilgilere sahiptir. Boş C++ değil.


dynamic_cast operatörüyle dinamik tip döküm

Sadece sınıf işaretçilerine uygulanabilen dynamic_cast operatörünü kullanarak dinamik tip döküm olasılığı vardır. Bu durumda, program yürütülürken türlerin doğruluğu kontrol edilir. Bu, dynamic_cast operatörünü kullanırken, derleyicinin, döküm için kullanılan veri türünü kontrol etmediği anlamına gelir. Bir işaretçi, nesnenin gerçek türü olmayan bir veri türüne dönüştürülüyorsa, sonuç NULL olur.

dynamic_cast <type-id> ( ifade )

Köşeli parantez içindeki type-id parametresi , önceden tanımlanmış bir sınıf tipine işaretçi olmalıdır. İşlenen türü ifadesi (C++'dan farklı olarak) void dışında herhangi bir şey olabilir.

Misal:

sınıf CBar { };
sınıf CFoo : genel CBar { };
 
geçersiz   Açılışta ()
{
CBar çubuğu;
//--- *bar işaretçi türünün *foo işaretçisine dinamik olarak aktarılmasına izin verilir
CFoo *foo = dynamic_cast <CFoo *>(&bar); // kritik çalışma zamanı hatası oluşmayacak
    yazdır (foo); // foo=NULL
//--- Bar türündeki bir nesnenin referansını açıkça Foo türündeki bir nesneye dönüştürmeye çalışmak yasaktır
foo=(CFoo*)&bar; // kritik bir çalışma zamanı hatası oluşacak
    yazdır (foo); // bu satır yürütülmeyecek
}