MQL5'te OOP hakkında sorular - sayfa 82

 
Igor Makanu :

int bu özel kurucuyu çağırmak için herhangi bir sayı olmasına rağmen, neyin başlatılacağının bir anlamı yoktur.

ve 0.0, yazım hatası olmaması için seçildi - herhangi bir sayı, yani. 0.0. yazmak ve yazmak 123'ten daha zordur

(çift)0

ama öyle değil, aynı zamanda doğru))) ancak şimdi kod normal görünüyordu, hala anormal görünmenin bir yolu var))
 
Alexandr Andreev :

(çift)0

Numara

Sadece 0.0 yazıyorum - başka bir rakam beklenmiyor - yapıcıda bir değişken bile yok

genel olarak, ne kadar moda - yazarın tarzı, belki de en iyisi değil

 
Alexandr Andreev :

nokta x değil) ancak resepsiyonda çiftin yanı sıra bir şamandıra olabileceği gerçeği, sadece 0.0'ı belirtin Ayrıca güvenilir değil

0.0, derleyici için açık bir çifttir, kayan nokta 0.f olacaktır
 
Vladimir Simakov :
0.0, derleyici için açık bir çifttir, kayan nokta 0.f olacaktır

telafi etmek)

 

"50 kişilik sorular" bölümü açıkken, ben de kastlar konusuna kendim gireyim.

- Hata toleransı veya fazlalık olmaması açısından kodu iyileştirmenin yolları nelerdir?

- CheckPointer() !=POINTER_INVALID öğesini kontrol etmem gerekiyor mu? Yoksa kesinlikle gerekli değil mi? Sebebini açıkla.

- Const olmayan yöntemlerin çağrılabilmesi için const olmayana döküm. Const olmayanı doğrudan Karşılaştırma yönteminde çağırmak mümkün müdür? onlar. sarı ile vurgulananlardan kurtulun yapı?

 #include <ChartObjects\ChartObjectsShapes.mqh>

class CChartObjectRectangleX : public CChartObjectRectangle
  {
public :

   void CChartObjectRectangleX(){};      
   virtual int        Compare( const CObject *node, const int mode= 0 ) const 
   {
   CChartObjectRectangleX *n= NULL ;
   const CChartObjectRectangleX*nc= dynamic_cast < const CChartObjectRectangleX*>(node);
   if (nc!= NULL )
   n=(CChartObjectRectangleX *) nc;
   if (n!= NULL ) {
     if (mode== 0 ) return CompareDate(n); 
     if (mode== 1 ) return CompareValue(n); } return 0 ;    }
 
   virtual int        CompareDate( CChartObjectRectangleX *node) const { 
   // if (node!= NULL ) 
       return ( this .Time( 1 )-node.Time( 1 )); return 0 ;    }
     virtual int        CompareValue( CChartObjectRectangleX *node) const { 
   // if (node!= NULL ) 
       return (( this .Price( 1 )-node.Price( 1 ))* 10 / Point ()); return 0 ;    }
};
 
Aleksey Mavrin :

"50 kişilik sorular" bölümü açıkken, ben de kastlar konusuna kendim gireyim.

- Hata toleransı veya fazlalık olmaması açısından kodu iyileştirmenin yolları nelerdir?

- CheckPointer()!=POINTER_INVALID denetimi gerekli mi? Yoksa kesinlikle gerekli değil mi? Sebebini açıkla.

- Const olmayan yöntemlerin çağrılabilmesi için const olmayana döküm. Const olmayanı doğrudan Karşılaştırma yönteminde çağırmak mümkün müdür? onlar. sarı ile vurgulananlardan kurtulun yapı?

 class CChartObjectRectangleX : public CChartObjectRectangle
  {
public :
   virtual int        Compare( const CObject *node, const int mode= 0 ) const
   {
   const CChartObjectRectangleX *n= dynamic_cast < const CChartObjectRectangleX*>(node);
   return !n? 0 : mode== 0 ?CompareDate(n):CompareValue(n);}
   
   virtual int CompareDate( const CChartObjectRectangleX *node) const { return !node? 0 : int (Time( 1 )-node.Time( 1 ));}
   virtual int CompareValue( const CChartObjectRectangleX *node) const { return !node? 0 :( int ) MathRound (((Price( 1 )-node.Price( 1 ))* 10 / Point ()));}
};

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ı).

!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. 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.

 
Aleksey Mavrin :

"50 kişilik sorular" bölümü açıkken, ben de kastlar konusuna kendim gireyim.

- Hata toleransı veya fazlalık olmaması açısından kodu iyileştirmenin yolları nelerdir?

- CheckPointer()!=POINTER_INVALID denetimi gerekli mi? Yoksa kesinlikle gerekli değil mi? Sebebini açıkla.

- Const olmayan yöntemlerin çağrılabilmesi için const olmayana döküm. Const olmayanı doğrudan Karşılaştırma yönteminde çağırmak mümkün müdür? onlar. sarı ile vurgulananlardan kurtulun yapı?

Teoride, const gövdesi olan ve olmayan bir işlevin iki yöntemini yazmak - hafifçe söylemek gerekirse - buna değmez)))

Ancak iki yöntemle karşılaşma olasılığınız sıfıra yakındır.... const bu kodda gözden kaçabilir. çünkü CChartObjectRectangle:: Price'ın var olma olasılığı - vücutta consts olmadan - Bence pek olası değil.

Peki, bu fonksiyonun dışarıdan çağrılmasını etkilemez. Onlar. const yalnızca dahili işlevlerle çalışır ve kimsenin nesnenin belleğine bir şey yazmamasını sağlar (değişkenin değerini değiştirmez). Onlar. Set(a)'yı consts ile çağıramazsınız... Genellikle, bir tür karışıklık durumunda, bu fonksiyonun hiçbir şeyin üzerine yazmadığından emin olmak için, bu const'ları hızlı bir şekilde düzenleyebilirsiniz (bu muhtemelen benim yanılgım olsa da).

Daha sonra bir şeyi kontrol etmenin daha kolay olması için const'ın her yere itilmesi gerektiğine inanılıyor))) böylece.


CheckPointer()!=POINTER_INVALID denetimi gerekli mi?

Ve neden olmasın.... make one bool Check(<template> &T) { retun CheckPointer(T)!=POINTER_INVALID } teoride, derleyici tüm bunları en basit forma optimize etmelidir. (nc!= NULL ) gibi bir şey ve sonunda olsun. Ve evet, daha güzel görünecek.

Bu daha hızlı olan operadan

 int a[ 1000 ];
for ( int i= 0 ; i< ArraySize (a); i++)....
или
for ( int i= ArraySize (a); i>= 0 ; i--)....
дак вот разницы не должно быть вообще


Valla ben pek değişmedim

 template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  {
   #define ME CChartObjectRectangleX
public :
   void ME(){};      
   virtual int        Compare( const CObject *node, const int mode= 0 ) const 
   {
   const ME*nc= dynamic_cast < const ME*>(node);
   return Check(nc)?mode== 0 ?CompareDate(nc):CompareValue(nc): 0 ;
   } 
   virtual int        CompareDate( const ME *node) const             { return ( this .Time( 1 )-node.Time( 1 ));}
   virtual int        CompareValue( const ME *node) const            { return (( this .Price( 1 )-node.Price( 1 ))* 10 / Point ()); }
 #undef ME
};

Bu tam kodunuz.

 
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.

Uzun zamandır açık bir sekmem vardı


mde kampanya bir inşaat teknik okulunda 4 yıllık eğitim bana bilgi katmadı (açıklama okuryazarlığı çöpte geride kalıyor)

 

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.

 #include <ChartObjects\ChartObjectsShapes.mqh>

template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define ME CChartObjectRectangleX
public : 
   void ME(){};      
   virtual int        Compare(CObject *node, int mode= 0 ) 
   {
   ME*nc= dynamic_cast <ME*>(node);
   return Check(nc)?mode== 0 ?CompareDate(nc):CompareValue(nc): 0 ;
   } 
   virtual int        CompareDate(ME *node)             { return ( this .Time( 1 )-node.Time( 1 ));}
   virtual int        CompareValue(ME *node)            { return (( this .Price( 1 )-node.Price( 1 ))* 10 / Point ()); }
 #undef ME
};
 

Aynı varyant, aynı kod

 template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define ME CChartObjectRectangleX
public : 
   void ME(){};      
   virtual int        Compare(CObject *node, int mode= 0 )      { return Check(node)?mode== 0 ?CompareDate(node):CompareValue(node): 0 ;} 
   virtual int        CompareDate(CObject *node)             { return (  Time( 1 )- dynamic_cast <ME*>(node).Time( 1 ));}
   virtual int        CompareValue(CObject *node)            { return ((Price( 1 )- dynamic_cast <ME*>(node).Price( 1 ))* 10 / Point ()); }
 #undef ME
};


O consts ile birlikte

 template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define ME CChartObjectRectangleX
public : 
   void ME(){};      
   virtual int        Compare(CObject const *node, int const mode= 0 )   const { return Check(node)?mode== 0 ?CompareDate(node):CompareValue(node): 0 ;} 
   virtual int        CompareDate(CObject const *node)                 const { return (  Time( 1 )- dynamic_cast < const ME*>(node).Time( 1 ));}
   virtual int        CompareValue(CObject const *node)               const { return ((Price( 1 )- dynamic_cast < const ME*>(node).Price( 1 ))* 10 / Point ()); }
 #undef ME
};