MQL5'te OOP hakkında sorular - sayfa 83

 

Mdyaya ... const'ta olduğu gibi, insanlar her şeyi çalıştırıyor (((

const belirteci ile yöntemleri anlamak için

 class CTest{
   int i;
public :
   CTest( int _i):i(_i){}
   int Get() const { return i;}
   int Get()   { return 2 *i;}
};

void OnStart ()
  {
   const CTest a( 5 );
   CTest b( 8 );
   Print (a.Get()); //5
   Print (b.Get()); //16
  }

Şimdi yap

   //int Get() const {return i;}

ve ardından tam tersi:

 //   int Get()   {return 2*i;}

)))

 
Alexandr Andreev :

Aynı varyant, aynı kod


O consts ile birlikte

giriş olduğundan emin misin

Compare(CObject const *node, int const mode= 0 )

her zaman ver

CChartObjectRectangleX*

kontrol etmeden yazmak

 return (  Time( 1 )- dynamic_cast < const ME*>(node).Time( 1 ) );

?

 
Alexandr Andreev :

const olmadan değişken çünkü temel sınıfın giriş parametrelerine bir referansı yoktur, bu stil çok yetkin olmasa da doğru şekilde çalışacaktır.

O yüzden uymuyor. Karşılaştır'da imza değiştirilemez. QuickSort yöntemiyle SB'ye dahil edilen normal sıralamanın çalışması esas olarak bu amaç içindir.

İmzayı değiştirin, Wirth'in yeniden tanımlanması olmayacak. işlevler, ancak bir aşırı yük ve temel sınıf CObject yöntemi çağrılır, burada return 0;

Eh, tabi ki kaplara sararak (dekorasyon yaparak) çözülüyor ama neden bu ekstra hareketler ya da daha sonra SB kullanmıyor, her şeyi sıfırdan yazıyorsunuz.

 
Vladimir Simakov :

Sizinkiyle bire bir gibi görünüyor, sadece daha küçük harfler. Bu yüzden kimin daha çok sevdiği bir zevk meselesi, ancak fazladan değişkeni kaldırdım (büyük olasılıkla, derleyici onu optimizasyonun bir parçası olarak kaldıracaktı).

Benim !düğümle ilgili. Kesin olarak, CheckPointer(node)==POINTER_INVALID ile değiştirilmelidir, ancak bu bir ek yük, bir işlev çağrısıdır. Satır içi olsa bile, en azından durum bayrağını referans alıyor ve kontrol ediyor. Karşılaştırma yöntemleri yalnızca sizin tarafınızdan yazılmış bir kitaplık veya belirli bir program ise, geçersiz bir işaretçi göndermemek için !node kullanmak ve kodu takip etmek daha iyidir. İşaretçileri takip edemeyecek kadar tembelseniz veya bu küçük olmayanlar için bir kitaplıksa, yalnızca CheckPointer(node)==POINTER_INVALID.

Vurguladığınız const belirtecini kaldırırsanız, bu yöntemleri bir const nesnesinden çağıramazsınız.

UPD: vurgulanan kontrol, çağrılan yöntemlerde olduğu için kaldırılabilir.

Vladimir, bu durumda CheckPointer gereksiz. dynamic_cast, dahil olmak üzere herhangi bir başarısız yayın için NULL döndürür. işaretçi bozuksa. Yanlışsa düzeltin. Uzun süre test edildi, 5 saniye test edildi)

CheckPointer çalışma mekanizması nedir (basit bir deyişle, düşük seviyeli terimlerle güçlü değildir) - bilgi almak mümkün değilse, ne tür bir nesne, dinamik veya statik, işaretçiye bakar, ardından POINTER_INVALID. Bu durumda, dinamik nesne silinirse, diğer durumları bilmiyorum ya da işaretçiye çöp atıyorlar, ancak bulunacak boşluklar yoksa derleyici bunu kontrol etmelidir.

ve dynamic_cast aynı şeyi yapar, ayrıca bu işaretçinin gerekli türe, yani. bu türden bir işaretçi mi yoksa bir alt sınıf mı?

İşaretçi bozulursa, dynamic_cast hiçbir şeyi belirleyemez ve NULL döndürür.

Bu yüzden CheckPointer kullanmadım. Her ne kadar genellikle her yerde bu kontrolü günahtan uygulasam da. Yine de düşmeyen bir yazılımda hata bulmak biraz daha kolay gibi görünüyor)

const olmayan - teorik olarak GetRatingByAnyFormula() { m_rating01=Formula01(); gibi bir yönteminiz olabilir. dönüş m_rating01;}

sıralamada hemen kullanılmazsa sakıncalıdır, yani. her durumda, önce derecelendirmeyi düşünün ve ardından buna göre sıralamayı arayın. Ya da daha önce de belirtildiği gibi, SB'nizi sıfırdan yazın)

 
Aleksey Mavrin :

O yüzden uymuyor. Karşılaştır'da imza değiştirilemez. QuickSort yöntemiyle SB'ye dahil edilen normal sıralamanın çalışması esas olarak bu amaç içindir.

İmzayı değiştirin, Wirth'in yeniden tanımlanması olmayacak. işlevler, ancak bir aşırı yük ve temel sınıf CObject yöntemi çağrılır, burada return 0;

Eh, tabi ki kaplara sararak (dekorasyon yaparak) çözülüyor ama neden bu ekstra hareketler ya da daha sonra SB kullanmıyor, her şeyi sıfırdan yazıyorsunuz.

En doğru yol µl üzerine yazmamaktır.

 
Aleksey Mavrin :

Vladimir, bu durumda CheckPointer gereksiz. dynamic_cast, dahil olmak üzere herhangi bir başarısız yayın için NULL döndürür. işaretçi bozuksa. Yanlışsa düzeltin. Uzun süre test edildi, 5 saniye test edildi)

CheckPointer çalışma mekanizması nedir (basit bir deyişle, düşük seviyeli terimlerle güçlü değildir) - bilgi almak mümkün değilse, ne tür bir nesne, dinamik veya statik, işaretçiye bakar, ardından POINTER_INVALID. Bu durumda, dinamik nesne silinirse, diğer durumları bilmiyorum ya da işaretçiye çöp atıyorlar, ancak bulunacak boşluklar yoksa derleyici bunu kontrol etmelidir.

ve dynamic_cast aynı şeyi yapar, ayrıca bu işaretçinin gerekli türe, yani. bu türden bir işaretçi mi yoksa bir alt sınıf mı?

İşaretçi bozulursa, dynamic_cast hiçbir şeyi belirleyemez ve NULL döndürür.

Bu yüzden CheckPointer kullanmadım. Her ne kadar genellikle her yerde bu kontrolü günahtan uygulasam da. Yine de düşmeyen bir yazılımda hata bulmak biraz daha kolay gibi görünüyor)

const olmayan - teorik olarak GetRatingByAnyFormula() { m_rating01=Formula01(); gibi bir yönteminiz olabilir. dönüş m_rating01;}

sıralamada hemen kullanılmazsa sakıncalıdır, yani. her durumda, önce derecelendirmeyi düşünün ve ardından buna göre sıralamayı arayın. Ya da daha önce de belirtildiği gibi, SB'nizi sıfırdan yazın)

  1. Karşılaştırma metotları public olarak tanımlanır, yani herhangi bir nedojun, ona spesifikasyonda nasıl söylerseniz söyleyin, orada kesinlikle geçersiz bir tanımlayıcı dolduracaktır (haydi maça maça diyelim). Tabii ki, bu bir kütüphane değilse, ancak kendiniz için, o zaman gerekli değildir.
  2. CheckPointer'ın nasıl çalıştığını bilmiyorum, en fazla ... seçenek var, ancak her durumda bunlar işlemci döngüleri ve bellek erişimi (kolayca sanal olabilir).
  3. const belirteci ile yöntemler hakkında. Bir kitaplık yazarsanız, nesnenin sabit olması gerekebileceğini her zaman aklınızda bulundurmalısınız, bu nedenle, nesnenin durumunu istendiği gibi değiştirmeyen yöntemlerde. Şimdilik, kendim için, kendim bununla özellikle uğraşmıyorum.
  4. Kendi SB'nizi yazın, muhtemelen bu doğru karardır. İşte ödeme / işçilik maliyetleri oranındaki ilginç beklentiler henüz görünmüyor, bu da hiçbir şeyin gündeme gelmeyeceği anlamına geliyor, yani sadece kendi ihtiyaçlarımız için)
 
Vladimir Simakov :

!düğüm hakkında. Kesin olarak, CheckPointer(node)==POINTER_INVALID ile değiştirilmelidir, ancak bu bir ek yük, bir işlev çağrısıdır.

Sorun tepede olmayacak, çünkü bozuk işaretçi programın mantığını değiştirecektir. Onlar. sorunu ortaya çıkarmak yerine daha da derine ineceksiniz.

CheckPointer yalnızca hata ayıklama amacıyla veya zayıf bir işaretçi uygulaması olarak kullanılmalıdır.

 
Vladimir Simakov :
  1. Karşılaştırma metotları public olarak tanımlanır, yani herhangi bir nedojun, ona spesifikasyonda nasıl söylerseniz söyleyin, orada kesinlikle geçersiz bir tanımlayıcı dolduracaktır (haydi maça maça diyelim). Tabii ki, bu bir kütüphane değilse, ancak kendiniz için, o zaman gerekli değildir.
  2. CheckPointer'ın nasıl çalıştığını bilmiyorum, en fazla ... seçenek var, ancak her durumda bunlar işlemci döngüleri ve bellek erişimi (kolayca sanal olabilir).
  3. const belirteci ile yöntemler hakkında. Bir kitaplık yazarsanız, nesnenin sabit olması gerekebileceğini her zaman aklınızda bulundurmalısınız, bu nedenle, nesnenin durumunu istendiği gibi değiştirmeyen yöntemlerde. Şimdilik, kendim için, kendim bununla özellikle uğraşmıyorum.
  4. Kendi SB'nizi yazın, muhtemelen bu doğru karardır. İşte ödeme / işçilik maliyetleri oranındaki ilginç beklentiler henüz görünmüyor, bu da hiçbir şeyin gündeme gelmeyeceği anlamına geliyor, yani sadece kendi ihtiyaçlarımız için)

1. Tartışmıyorum ama CheckPointer GEREKLİ DEĞİLDİR (genç olmayanlar için bile), tk. dynamic_cast , herhangi bir NULL işaretçisi döndüremez, yalnızca NULL.

2. Hatta ilginç, ancak dinamik bir nesneyi öldürmenin yanı sıra geçersiz bir işaretçiyi nasıl alabileceğinize veya çalışma sürecinde doğrudan hafızayı “kirletebileceğinize” dair bir örnek hemen düşünemiyorum.

Sanırım hala bu tür yöntemler var, ancak hepsi büyük olasılıkla derleyici denetimlerini atlama düzleminde yatıyor.

3.4 Katılıyorum

not

Görünüşe göre 1. hakkında yanılmışım. Test aksini söylüyor. Yani görünüyordu)

 void OnStart ()
  {
      CChartObjectRectangle *base = new CChartObjectRectangle();
      CChartObjectRectangleX *rect = new CChartObjectRectangleX();
       CChartObjectRectangle * dbase  ;
       const CChartObjectRectangleX *drect  ;
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL ," check? ",!dbase, " broken? ", EnumToString ( CheckPointer (dbase) ));
      dbase= dynamic_cast < CChartObjectRectangle *>  (base);
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL , " check? ",!dbase," broken? ", EnumToString ( CheckPointer (dbase) ));
       delete base;
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL ," check? ",!dbase, " broken? ", EnumToString ( CheckPointer (dbase) ));
      dbase= dynamic_cast < CChartObjectRectangle *>  (base);   
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL ," check? ",!dbase, " broken? ", EnumToString ( CheckPointer (dbase) ));   
  }
 
sınıfın genel bölümünde statik bir dizi bildirmek ve onu yapıcıda başlatmak mümkün müdür? (aşağıdaki gibi) (veya sadece eleman eleman mı?)
 bool Mass[ 5 ] = { false , true , false , true , true };
 
Pavel Verveyko :
sınıfın genel bölümünde statik bir dizi bildirmek ve onu yapıcıda başlatmak mümkün müdür? (aşağıdaki gibi) (veya sadece eleman eleman mı?)

Yerel bir diziyi başlatabilir ve ilgili alan dizisine bir ArrayCopy gerçekleştirebilirsiniz:

 class A{
public :
   bool Mass[ 5 ];
   A(){
       bool mass_init[ 5 ] = { false , true , false , true , true };
       ArrayCopy (Mass, mass_init);
   }
};