MQL5'te OOP hakkında sorular - sayfa 36

 
Igor Makanu :

Evet, bu daha iyi bir çözüm! bir yöntemin daha az olması

OnStart'ta yalnızca bir yeni kalmalıdır.
 
Koldun Zloy :

1. Bu işlevin çift çağrılmasında yanlış bir şey yoktur.

2. Statik fonksiyonların kullanımına karşı olanların en ufak bir argüman vermemeleri sizi rahatsız etmiyor mu?

Sadece kimseden video izlememek, kitap okumak daha iyidir.

video yazarı   https://youtu.be/lfdAwl3-X_c ve https://youtu.be/zME4SOCHT0I Size çok güzel şeyler diliyorum ..... bütün hafta boyunca huzursuz, oturup yapmak için oturmadığım her şey Düşünmeye başlıyorum ve eskisi gibi yapmıyorum .... statik uygulayamazsınız OOP değil!

Kodu bitirmek istiyorum, aşağıdaki soru beni rahatsız ediyor:

- Nesnelerin alanlarını kaydetmek istiyorum, çünkü alanlar hemen yapılara yerleştirildi ve tek tıklamayla FileWriteStruct() ile kaydedebilirsiniz.

- hepsi aynı temel sınıftan miras alınan aynı sınıf N parçalarının nesneleri

- videoyu izlemekten dolayı, bir şekilde her nesnenin bir dosyaya kaydedilmesi gerekip gerekmediğine dair anket yapılmamasına izin vereceği umudu vardı .... genel olarak, bu bir başarısızlık, aptalca şeyler yapmamaya karar verildi ve dosyaya yazılan statik bir değişkene bir gereklilik bayrağı atayacak bir yöntem oluşturun

 class CStrategy: public IStrategy
{
protected :
static bool        f_save_required;
void               SetSaveRequired()        { CStrategy::f_save_required = true ;                    }
public :
bool               GetSaveRequired()        { return (CStrategy::f_save_required);                   }

amaçlandığı gibi çalışıyor gibi görünüyor

Sorun şu ki, bunu şöyle yazarsanız ne olacak:

 class CStrategy: public IStrategy
{
private :
static bool        f_save_required;
protected :
void               SetSaveRequired()        { CStrategy::f_save_required = true ;                    }
public :
bool               GetSaveRequired()        { return (CStrategy::f_save_required);                   }

Böyle yazarsanız ne olur:

 class CStrategy: public IStrategy
{
private :
static bool        f_save_required;
protected :
void               SetSaveRequired()         { f_save_required = true                    }
public :
bool               GetSaveRequired()        { return (f_save_required);                    }
 

Test komut dosyasını farklı şekillerde değiştirmeye çalıştım, bir fark görmüyorum, bu komut dosyasındaki birine yukarıdaki yazı için doğru değiştiricileri yürüdüğünü göster: (protected / private ) ve M:: x veya sadece x'i çağırarak

 //+------------------------------------------------------------------+
interface I
{   bool main();

};
//+------------------------------------------------------------------+
class M: public I
{
protected :
static int         x;
bool               main()   { x++;   Print ( __FUNCTION__ , " = " ,x); return (x> 0 ); }
public :
                     M()      { Print ( __FUNCTION__ );}
                    ~M()      { Print ( __FUNCTION__ );}
};
//+------------------------------------------------------------------+

static int M::x= 0 ;
//+------------------------------------------------------------------+
class A: public M
{
public :
                     A()      { Print ( __FUNCTION__ );}
                    ~A()      { Print ( __FUNCTION__ );} };
//+------------------------------------------------------------------+
class B: public M
{
public :
                     B()      { Print ( __FUNCTION__ );}
                    ~B()      { Print ( __FUNCTION__ );} };
//+------------------------------------------------------------------+
class C: public M
{
public :
                     C()      { Print ( __FUNCTION__ );}
                    ~C()      { Print ( __FUNCTION__ );} };
//+------------------------------------------------------------------+

void OnStart ()
{  I *a = new A;
   I *b = new B;
   I *c = new C;
   I *m = new M;

   a.main();
   b.main();
   c.main();
   m.main();


   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+
 
Igor Makanu :

Test komut dosyasını farklı şekillerde değiştirmeye çalıştım, bir fark görmüyorum, bu komut dosyasındaki birine yukarıdaki yazı için doğru değiştiricileri yürüdüğünü göster: (protected / private ) ve M:: x veya sadece x'i çağırarak

x çağırdığınız sınıf metotları içinde, diğer tüm yerlerde M::x, eğer korumalı ise, o zaman çağrı sadece alanın tanımlı olduğu sınıfın metotlarında mümkündür, mantık burada ortaktır.
 
Bu arada iyi bayramlar. Bir bayt daha oldu.
 
Vladimir Simakov :
x çağırdığınız sınıf metotları içinde, diğer tüm yerlerde M::x, eğer korumalı ise, o zaman çağrı sadece alanın tanımlı olduğu sınıfın metotlarında mümkündür, mantık burada ortaktır.

iyi evet! uyanırken, örnek doğru değildi, şöyle:

 class M
{
private :
   static int         x;
   bool               main()   { x++;   Print ( __FUNCTION__ , " = " ,x); return (x> 0 ); }
public :
                     M()      { Print ( __FUNCTION__ );}
                    ~M()      { Print ( __FUNCTION__ );} };
//+------------------------------------------------------------------+

static int M::x= 0 ;
//+------------------------------------------------------------------+
class A: public M
{
public :
                     A()      { Print ( __FUNCTION__ );}
                    ~A()      { Print ( __FUNCTION__ );}
   void                 inc()     {main();} };
//+------------------------------------------------------------------+
class B: public M
{
public :
                     B()      { Print ( __FUNCTION__ );}
                    ~B()      { Print ( __FUNCTION__ );}
   void                 inc()     {main();} };
//+------------------------------------------------------------------+
class C: public M
{
public :
                     C()      { Print ( __FUNCTION__ );}
                    ~C()      { Print ( __FUNCTION__ );}
   void                 inc()     {main();} };
//+------------------------------------------------------------------+
void OnStart ()
{  A *a = new A;
   B *b = new B;
   C *c = new C;
   M *m = new M;

   a.inc();



   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+

hemen 'M::main' aldı - özel üye işlevine erişilemiyor tst.mq5 25 32

eğer yazarsam

 protected :   
   bool               main()   { x++;   Print ( __FUNCTION__ , " = " ,x); return (x> 0 ); }

o zaman her şey amaçlandığı gibi çalışır!

 
Vladimir Simakov :
Bu arada iyi bayramlar. Bir bayt daha oldu.

Teşekkürler, anladım!

İyi tatiller!

 
Igor Makanu :

video yazarı   https://youtu.be/lfdAwl3-X_c ve https://youtu.be/zME4SOCHT0I Size çok güzel şeyler diliyorum ..... bütün hafta boyunca huzursuz, oturup yapmak için oturmadığım her şey Düşünmeye başlıyorum ve eskisi gibi yapmıyorum .... statik uygulayamazsınız OOP değil!

Kodu bitirmek istiyorum, aşağıdaki soru beni rahatsız ediyor:

- Nesnelerin alanlarını kaydetmek istiyorum, çünkü alanlar hemen yapılara yerleştirildi ve tek tıklamayla FileWriteStruct() ile kaydedebilirsiniz.

- hepsi aynı temel sınıftan miras alınan aynı sınıf N parçalarının nesneleri

- videoyu izlemekten dolayı, bir şekilde her nesnenin bir dosyaya kaydedilmesi gerekip gerekmediğine dair anket yapılmamasına izin vereceği umudu vardı .... genel olarak, bu bir başarısızlık, aptalca şeyler yapmamaya karar verildi ve dosyaya yazılan statik bir değişkene bir gereklilik bayrağı atayacak bir yöntem oluşturun

amaçlandığı gibi çalışıyor gibi görünüyor

Sorun şu ki, bunu şöyle yazarsanız ne olacak:

şöyle yazarsan ne olur

Bir nesnenin bir dosyaya kaydedilmesi gerekip gerekmediğini ne belirler?

Bu özellik tüm nesneler için ortak mıdır?

 
Koldun Zloy :

Bir nesnenin bir dosyaya kaydedilmesi gerekip gerekmediğini ne belirler?

Bu özellik tüm nesneler için ortak mıdır?

Eh, elbette, soru diyalektik, burada

- veya 10 stratejiye sahip olun ve aracın durumu değiştiğinde 10 dosya yazın (1 araç = 1 yapı)

- veya stratejinin çağrıldığı (numaralandırma) sınıftan 1 tutamacı kene ile aktarmak daha mantıklıdır, böylece her şeyi tek bir dosyaya yazarlar

bence 2. seçenek mantıklı


tüm araçların başlangıcında, bir kez 10 yapı yazmanın gerekli olacağı ortaya çıktı - durum değişti

daha sonra, rastgele sırayla, gerektiğinde yazmanız gerekir (SL veya TP tetikleme) - burada ayrıca bir dosyayı açmak ve 10 yapıyı tek seferde yazmak daha hızlıdır, stratejiler keskin değildir, kayıt her saniye değildir, her araçta bir dakikadan bir saate kadar


Şimdiye kadar, statik bir değişken tanımlayarak, ona get - set, protected set, public get aracılığıyla erişim sağladım - ayrıca çağrıdan sonra statik değişkeni false olarak sıfırlar

 
Igor Makanu :

Eh, elbette, soru diyalektik, burada

- veya 10 stratejiye sahip olun ve aracın durumu değiştiğinde 10 dosya yazın (1 araç = 1 yapı)

- veya stratejinin çağrıldığı (numaralandırma) sınıftan 1 tutamacı kene ile aktarmak daha mantıklıdır, böylece her şeyi tek bir dosyaya yazarlar

bence 2. seçenek mantıklı


tüm araçların başlangıcında, bir kez 10 yapı yazmanın gerekli olacağı ortaya çıktı - durum değişti

daha sonra, rastgele sırayla, gerektiğinde yazmanız gerekir (SL veya TP tetikleme) - burada ayrıca bir dosyayı açmak ve 10 yapıyı tek seferde yazmak daha hızlıdır, stratejiler keskin değildir, kayıt her saniye değildir, her araçta bir dakikadan bir saate kadar


Şimdiye kadar, statik bir değişken tanımlayarak, ona get - set, protected set, public get aracılığıyla erişim sağladım - ayrıca çağrıdan sonra statik değişkeni false olarak sıfırlar

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

Neden: