MQL5'te OOP hakkında sorular - sayfa 37

 
Koldun Zloy :

Bu çok açık. SetSaveRequired() ve G etSaveRequired()'in neden statik olmadığı, ancak statik bir değişkene yazıldığı açık değildir.

bu benim için net değil, bu yüzden yardım istedim, değiştiricileri nadiren kullanırım, daha sezgiseldir, ancak her zaman olduğu gibi en uygun çözümü istiyorum

kodda sormaya çalışalım, şimdi şöyle:

 //+------------------------------------------------------------------+
interface IStrategy
{   double       Strategy();
   bool         Finalize(); };
//+------------------------------------------------------------------+
class CStrategy: public IStrategy
{
public :
   bool               GetSaveRequired() { return (CStrategy::f_save_required); CStrategy::f_save_required = false ;  }
protected :
   static bool        f_save_required;
   double             ProfitStrategy;
   void                SetSaveRequired() { CStrategy::f_save_required = true ;                                       }
   void               RunStrategy();
   virtual void       NextStepStrategy();
   void               EndStrategy();
};

//____________________________________________________________________
void CStrategy::RunStrategy( void )
{  ProfitStrategy = 0.0 ;
   SetSaveRequired();
//...........    
}
//____________________________________________________________________
void CStrategy::EndStrategy( string func)
{ //...........    
   SetSaveRequired();
}
//____________________________________________________________________
#define CLASS(NAME) class NAME : public CStrategy{\
public :\
   NAME(SSettingsForOrder & set )  { m_setting = set ;}\
   ~NAME()                       { delete m_order; }\
   virtual void NextStepStrategy();}
//+------------------------------------------------------------------+
CLASS(CStrategy_XXX);
CLASS(CStrategy_YYY);
CLASS(CStrategy_ZZZ);

void CStrategy_XXX::NextStepStrategy( void ) { SetSaveRequired();    //...........     }
void CStrategy_YYY::NextStepStrategy( void ) { SetSaveRequired();    //...........     }
void CStrategy_ZZZ::NextStepStrategy( void ) { SetSaveRequired();    //...........     }


public GetSaveRequired(), tüm bu strateji hayvanat bahçesini yönetmek için sınıfta kullanılır

böyle bir şablonla, yalnızca NextStepStrategy yöntemini yazıyorum - yalnızca içindeki araç için değişiklikler var, diğer her şey aynı ve bu nedenle tüm yöntemleri ve tüm alanları CStrategy temel sınıfında topluyorum - bunların çoğu yok

Not: Kodumun ice olmadığını arkamda hissediyorum, ancak tam olarak böyle çalışacak ve f_save_required değişkeninin kopyalarını üretmeyeceğim;

 
Igor Makanu :

bu benim için net değil, bu yüzden yardım istedim, değiştiricileri nadiren kullanırım, daha sezgiseldir, ancak her zaman olduğu gibi en uygun çözümü istiyorum

kodda sormaya çalışalım, şimdi şöyle:


public GetSaveRequired(), tüm bu strateji hayvanat bahçesini yönetmek için sınıfta kullanılır

böyle bir şablonla, yalnızca NextStepStrategy yöntemini yazıyorum - yalnızca içindeki araç için değişiklikler var, diğer her şey aynı ve bu nedenle tüm yöntemleri ve tüm alanları CStrategy temel sınıfında topluyorum - bunların çoğu yok

Not: Kodumun ice olmadığını arkamda hissediyorum, ancak tam olarak böyle çalışacak ve f_save_required değişkeninin kopyalarını üretmeyeceğim;

Bu özellikleri tamamen kaldırırdım.

Yapısını değiştirmeyen tüm fonksiyonlar sabit hale getirilmiştir.

Tüm const olmayan işlevler yazma bayrağını ayarlamalıdır.

Ayrıca Save(int fileHandle) işlevini de eklerdim. Bu fonksiyon yapıyı yazmalı ve bayrağı sıfırlamalıdır.

Bayrağın durumunu almak için statik bir işlev yapabilirsiniz.

 if ( CStrategy::GetSaveRequired() )
{
   int fileHandle = FileOpen ( ... );
   for ( int i = 0 ; i < 10 ; i++ )
   {
      strategies[i].Save( fileHandle );
   }
   FileClose ( fileHandle );
}
 
Koldun Zloy :

Bu özellikleri tamamen kaldırırdım.

Yapısını değiştirmeyen tüm fonksiyonlar sabit hale getirilmiştir.

Tüm const olmayan işlevler yazma bayrağını ayarlamalıdır.

bir örnek, genel olarak değiştiricilerle ilgili sorun yaşıyorum


Not: İnternette, genel olarak, programlama tartışmasında olanların dehşeti - geçen ay Habre'de const hakkında bir makale vardı, mesele şu ki - evet, bu const gerekli değil, bakın montajcı kodu const olmadan farklı değildir - derleyici her şeyi kaldıracaktır (((

 
Igor Makanu :

bir örnek, genel olarak değiştiricilerle ilgili sorun yaşıyorum

googled, oku, yine bir şeyler ters gitti ...

 class A {
private :
   int x;
public :
   void f( int v) const { Print ( "const" );                  }
   void f( const int v) { x = v; Print ( "(const) x = v " );  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
//+------------------------------------------------------------------+
void OnStart ()
{ 
   int y       = 1 ;
   const int z = 2 ;
   a.f( 3 );
   a.f(y);
   a.f(z); 
 }
//+------------------------------------------------------------------+

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

en azından bir kere Print ( "const" );
 
Igor Makanu :

googled, oku, yine bir şeyler ters gitti ...

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

en az bir kere Print ( "const" );
 class A {
private :
   int x;
public :
   void f( int v) const { Print ( "const" );                  }
   void f( const int v) { x = v; Print ( "(const) x = v " );  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart ()
{ 
   int y       = 1 ;
   const int z = 2 ;
   a.f( 3 );
   a.f(y);
   a.f(z);
   b.f( 3 );
   b.f(y);
   b.f(z);
 }
Bu bir const sınıfı için bir aşırı yüktür.
 
Vladimir Simakov :
Bu bir const sınıfı için bir aşırı yüktür.

hmm..kesinlikle yarım saate yakın okudum ve forumları ve habrları okudum ama giremedim

Teşekkür ederim! şimdi anladım

Hala böyle bir örneğin şüphesi var:

 class A {
private :
   int x;
public :
   void f( int v) const { Print ( "const" );                  }
   const void f( int v) { x = v; Print ( "(const) x = v " );  }

};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart ()
{ 
   int y       = 1 ;
   const int z = 2 ;
   a.f( 3 );
   a.f(y);
   a.f(z);
   b.f( 3 );
   b.f(y);
   b.f(z);
 }

2019.09.13 22:04:34.295 tst (EURUSD,H1) (sabit) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (sabit) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (sabit) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const


aynı değerleri verdi, ancak anlam tamamen farklı mı? - işte o zaman salonun yardımına tekrar ihtiyaç var
 
Şu anda OOP üzerine bir derse katılıyorum. Belki değerli bir şey bulurum - paylaşırım))
Mevcut dersi sıfırlayabilirim. Tabii ki, banal şeyler.
 
Nikolai Semko :
Şu anda OOP üzerine bir derse katılıyorum. Belki değerli bir şey bulurum - paylaşırım))
Mevcut dersi sıfırlayabilirim. Tabii ki, banal şeyler.

dersin büyük olasılıkla anlamsız, ama burada Rusça, ne biliyorsun, üçüncü tur için internette dolaştın ... bu kasvetli bir şey, genel olarak durum burada forumdakiyle aynı, kaynak başına 10'dan fazla gerçek programcı yoktur ve geri kalan enikey çalışanları

tamam, genel olarak const ile durum düzeldi, değiştiricilerin geri kalanıyla çalıştım, genel olarak, teoriden en iyisine yeterince aldım ... uygulamanız gerekiyor, aksi takdirde bir öğrenci gibi hissediyorum) ))

 
Igor Makanu :

dersin büyük olasılıkla anlamsız, ama burada Rusça, ne biliyorsun, üçüncü tur için internette dolaştın ... bu kasvetli bir şey, genel olarak durum burada forumdakiyle aynı, kaynak başına 10'dan fazla gerçek programcı yoktur ve geri kalan enikey çalışanları

tamam, genel olarak const ile durum düzeldi, değiştiricilerin geri kalanıyla çalıştım, genel olarak, teoriden en iyisine yeterince aldım ... uygulamanız gerekiyor, aksi takdirde bir öğrenci gibi hissediyorum) ))

Evet benzer bir durum bende de var. Öğrenmek zor değil, yeniden öğrenmek, eski alışkanlıkları kırmak daha zor. Prosedürel programlamanın birçok kötü alışkanlığını hala öğrenemiyorum.

 
Igor Makanu :

bir örnek, genel olarak değiştiricilerle ilgili sorun yaşıyorum


Not: İnternette, genel olarak, programlama tartışmasında olanların dehşeti - geçen ay Habre'de const hakkında bir makale vardı, mesele şu ki - evet, bu const gerekli değil, bakın montajcı kodu const olmadan farklı değildir - derleyici her şeyi kaldıracaktır (((

Şimdilik sabitleri ve statiği unutabilirsiniz. Arayüzler için de.

Ancak her şey hazır olduğunda, bakın ve bir şeyi statik, bir şeyi de sabit olarak işaretleyin. Ve arayüzlerde genel olarak çekiçlemek mümkündür.