MQL5'te OOP hakkında sorular - sayfa 19

 
Vladimir Simakov :
Çok fazla olmayacağına dair bir varsayımım var, örneğin 0.15. En azından ben duymadım. Aniden ne zaman olduğunu görürsem, yeniden yapacağım.

evet, bunun olası olmadığı açık, ancak her zaman olduğu gibi mükemmel çözümü istiyorum)))

tamam, en büyük sorun bu değil, sorunu kendim için yarattım... İdeal bir OOP istedim ama fazladan arama olmasın ve her şey optimal olsun diye

şimdi sınıfın 5 örneğine sahip olmak istiyorum, ancak sınıf alanlarını bir kez başlatmam gerekiyor - programın yürütülmesi sırasında değişmeyecek bir terminal ortamları var, bir örnek çizdim, ancak tek bir tane elde edemiyorum statik veya kalıtım yoluyla başlatma

 string          Language;

statik dizeyi bildirirsem Dil; - o zaman çözülmemiş statik değişken 'A::Language' hatası olacak

işte bir örnek:

 //+------------------------------------------------------------------+
class A
  {
public :
   string          Language;
                     A() { Print ( __FUNCTION__ ); Language = TerminalInfoString ( TERMINAL_LANGUAGE ); }

  };
//+------------------------------------------------------------------+
class B: public A
  {
public :
                     B() { Print ( __FUNCTION__ ,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[ 5 ];
//+------------------------------------------------------------------+
int OnInit ()
  {
   for ( int i= 0 ; i< 5 ; i++)
      arrB[i] = new B;
   return ( INIT_SUCCEEDED );
  }

bu formda Language dizesini en fazla 5 kez başlatacağım - bu doğru değil ve statik değiştiricilerle derlenmiyor

ve Dil değişkeninin 5 kopyasına sahip olmanız gerekmez !!! - B sınıfındaki sınıfın bir örneğini bildirmeye çalıştım - Aynı 5 değişkene sahibim Dil

2019.08.29 12:44:58.384 tst__ EURUSD,M15: başlatıldı

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit neden 3

 
Igor Makanu :

evet, bunun olası olmadığı açık, ancak her zaman olduğu gibi mükemmel çözümü istiyorum)))

tamam, en büyük sorun bu değil, sorunu kendim için yarattım... İdeal bir OOP istedim ama fazladan arama olmasın ve her şey optimal olsun diye

şimdi sınıfın 5 örneğine sahip olmak istiyorum, ancak sınıf alanlarını bir kez başlatmam gerekiyor - programın yürütülmesi sırasında değişmeyecek bir terminal ortamları var, bir örnek çizdim, ancak tek bir tane elde edemiyorum statik veya kalıtım yoluyla başlatma

statik dizeyi bildirirsem Dil; - o zaman çözülmemiş statik değişken 'A::Language' hatası olacak

işte bir örnek:

bu formda Language dizesini en fazla 5 kez başlatacağım - bu doğru değil ve statik değiştiricilerle derlenmiyor

2019.08.29 12:44:58.384 tst__ EURUSD,M15: başlatıldı

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit neden 3

 class Test
  {
private :
   static const string Language;
public :
                     Test( void ){}
                    ~Test( void ){}
  };
static const string Test::Language=:: TerminalInfoString ( TERMINAL_LANGUAGE );
 
Andrey Barinov :

Tamam, bu bir seçenek.

ama tüm bunları tek bir sınıfa sarmak istiyorum - örneğimde B sınıfı ve 5 B örneği istiyorum, ancak Dili 5 kez başlatmak istemiyorum ve buna göre bir Dil değişkenine sahip olmak istemiyorum her durumda

ve gereksiz Dil kurtulmak için nasıl?

 
Igor Makanu :

Tamam, bu bir seçenek.

ama tüm bunları tek bir sınıfa sarmak istiyorum - örneğimde B sınıfı ve 5 B örneği istiyorum, ancak Dili 5 kez başlatmak istemiyorum ve buna göre bir Dil değişkenine sahip olmak istemiyorum her durumda

ve gereksiz Dil kurtulmak için nasıl?

Miras al. Bu formda, yalnızca bir kez başlatılacaktır.

 
Igor Makanu :

evet, bunun olası olmadığı açık, ancak her zaman olduğu gibi mükemmel çözümü istiyorum)))

tamam, en büyük sorun bu değil, sorunu kendim için yarattım... İdeal bir OOP istedim ama fazladan arama olmasın ve her şey optimal olsun diye

şimdi sınıfın 5 örneğine sahip olmak istiyorum, ancak sınıf alanlarını bir kez başlatmam gerekiyor - programın yürütülmesi sırasında değişmeyecek bir terminal ortamları var, bir örnek çizdim, ancak tek bir tane elde edemiyorum statik veya kalıtım yoluyla başlatma

statik dizeyi bildirirsem Dil; - o zaman çözülmemiş statik değişken 'A::Language' hatası olacak

işte bir örnek:

bu formda Language dizesini en fazla 5 kez başlatacağım - bu doğru değil ve statik değiştiricilerle derlenmiyor

ve Dil değişkeninin 5 kopyasına sahip olmanıza gerek yok !!! - B sınıfındaki sınıfın bir örneğini bildirmeye çalıştım - Aynı 5 değişkene sahibim Dil

2019.08.29 12:44:58.384 tst__ EURUSD,M15: başlatıldı

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::B

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit neden 3

Şimdi telefondan. Akşam bana hatırlat, sana nasıl çözeceğini göstereceğim.
 
Andrey Barinov :

Miras al. Bu formda, yalnızca bir kez başlatılacaktır.

Benim için çalışıyor

 //+------------------------------------------------------------------+
string MyTerminalInfoString()
  {
   Print ( __FUNCTION__ );
   return ( "ru" );
  }
//+------------------------------------------------------------------+
class CLang
  {
protected :
   static const string Language;
public :
                     CLang( void ) { Print ( __FUNCTION__ );}
                    ~CLang( void ) {}
  };
//+------------------------------------------------------------------+
static const string CLang::Language=MyTerminalInfoString();
//+------------------------------------------------------------------+
class B: public CLang
  {
public :
                     B() { Print ( __FUNCTION__ ,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[ 5 ];
//+------------------------------------------------------------------+
int OnInit ()
  {
   for ( int i= 0 ; i< 5 ; i++)
      arrB[i] = new B;
   return ( INIT_SUCCEEDED );
  }

2019.08.29 13:24:19.690 tst__ EURUSD,M15: başlatıldı

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: MyTerminalInfoString


en azından MyTerminalInfoString()'i ara, bir kez görüyorum


genel olarak, belirli bir Singleton ortaya çıkmış gibi görünüyor

Teşekkür ederim!

 
Vladimir Simakov :
Şimdi telefondan. Akşam bana hatırlat, sana nasıl çözeceğini göstereceğim.

tamam sakıncası yoksa

ve Singleton teması benim için oldukça yeni, yaratıcılığa yer var - örnekler

 
Igor Makanu :

tamam sakıncası yoksa

ve Singleton teması benim için oldukça yeni, yaratıcılığa yer var - örnekler

Yani bir singleton'a mı yoksa nesneler için ortak bir alana mı ihtiyacınız var?
 
Vladimir Simakov :
Yani bir singleton'a mı yoksa nesneler için ortak bir alana mı ihtiyacınız var?

ne istediğimi söylemek zor

kelimelerle deneyeceğim:

- Yapıcı tarafından başlatılan bir sınıf istiyorum ve bu sınıfın yöntemleri olmayacak, sınıfın görevi bir sipariş açmak ve ardından senaryoya göre siparişleri birkaç kez daha kapatmak ve / veya yeniden açmak, senaryo tür numaralandırmadır

- Bu sınıfın bir dizi örneğini kullanacağım - en az 5 parça

- sipariş açmak için her seferinde terminal ortamını çağırmak istemiyorum bu yüzden SYMBOL_VOLUME_MAX , Symbol, SYMBOL_VOLUME_MIN ve SYMBOL_VOLUME_STEP içindeki karakter sayısının sınıfta sabit değerlere sahip olmasını istiyorum

- Değişkenlerin optimal kullanımını istiyorum, yani. Önceki paragraftaki sabitleri çoğaltmak istemiyorum


ben her şeyi böyle görüyorum, ancak genel olarak, şimdi görev sınıfın kendisinin doğru yapısına indirgendi, ortaya çıktığı gibi, zaten miras almam gerekiyor, böylece SYMBOL_VOLUME_MAX , Symbol, SYMBOL_VOLUME_MIN ... bir tane var kopyala, yine de hata çıktısına rastlayacağımı düşünüyorum, bunu PrintLastError.mqh https://www.mql5.com/en/code/24829# adresindeki gibi kullanacağım

 
Statik değişken , kalıtım olmadan bile tüm örnekler için bir olacaktır.