MQL5'te OOP hakkında sorular - sayfa 43

 
Igor Makanu :

Not: Mesajlarınızda neredeyse her zaman rasyonel bir tahıl vardır, ancak malzemenin sunumu, sanki tamamen iyi niyetlerle değil, elbette sizin işinizdir, ancak IMHO, yardım etmek istiyorsanız - isterseniz yardım edin zeki olmak, peki, çoğu zaman ortaya çıkıyor

Sunum sizi düşündürüyor ... kod hakkında düşünmeye başladıklarını kendileri yazdılar, ancak bir gaf kodlamadan önce

 
A100 :

Sunum sizi düşündürüyor ... kod hakkında düşünmeye başladıklarını kendileri yazdılar, ancak bir gaf kodlamadan önce

hmm... iyi tyap gaf hiç yazmadı! - bu bir gerçek!

Not: Konu periyodik olarak bilgisizlikten veya kendi başına malzeme bulamamasından değil, fikri ilgimi çeken bir varlığın varlığından kaynaklanmaktadır ;)

ZYZY: iletişimin sonucu - Değiştiricileri neden kullanmam gerektiğini, neden get/set gerekli olduğunu oldukça fazla düşündüm - geliştirme aşamasında zaman kazandırır, derleyicinin yardımının ustaca kullanılmasıyla, yazılı kodun test edilmesi hemen başarılı oldular - burada konunun değeri kimdi gerçekten gözlerini açtılar, bir kez daha teşekkür ederim!

 
Koldun Zloy :

İşte bir örnek:

Neden bir arayüze ihtiyacınız olduğu kodunuzdan net değil, ben de onu attım.

Tabii ki, görevinizi tam olarak bilmiyorum, ancak% 99,99 olasılıkla buna gerek yok.

Fenalık...

 
Igor Makanu :

hmm... iyi tyap gaf hiç yazmadı! - bu bir gerçek!

Not: Konu periyodik olarak bilgisizlikten veya kendi başına malzeme bulamamasından değil, fikri ilgimi çeken bir varlığın varlığından kaynaklanmaktadır ;)

ZYZY: iletişimin sonucu - Değiştiricileri neden kullanmam gerektiğini, neden get/set gerekli olduğunu oldukça fazla düşündüm - geliştirme aşamasında zaman kazandırır, derleyicinin yardımının ustaca kullanılmasıyla, yazılı kodun test edilmesi hemen başarılı oldular - burada konunun değeri kimdi gerçekten gözlerini açtılar, bir kez daha teşekkür ederim!

Bir şeyler öğrenmiş olman harika. Ancak Stroustrup'un C++'ını okursanız çok daha fazlasını elde edebilirsiniz.

Habré ile ilgili makaleler ve çeşitli videolar, okumamanız veya izlememeniz için daha iyidir. Orada yazan herkes. Sadece kafanızı karıştırırlar.

 

Bir sorun var mı.


Düğmelerin bulunduğu bir panel vardır, her bir düğmeye basılarak bazı işlevler gerçekleştirilir. Düğmelerden birine basıldığında çağrılan işlevler, buna Exit1 diyelim , ayrı bir CExit1 sınıfına taşınmalıdır.

Ancak bu işlevler, bazı genel değişkenleri ve diğer nesnelerin yöntemlerini kullanır.

Büyük projelerde yer almadım. Uzmanların görüşlerini bilmek istedim, nasıl doğru yapılır?

Sıklıkla, mq4 dosyası derlenirse, tüm sınıflar ve içerme dosyaları hatasız olarak çekilecek ve EA olması gerektiği gibi çalışacak şekilde programlarım. Ancak sınıf ayrı olarak derlenirse, bazı harici değişkenler ve işlevler tarafından görülmediği için uyarılar vardır.

Aslında bir soru. Sınıfın kendisinin hatasız bir şekilde derlenmesi gerekli mi, yani EA global değişkenlerinin tüm kullanılmış kopyalarını, nesnelere referansları vb. zaten içeriyor mu? Evet ise, bunu yapmak için en iyi zaman ne zaman? Etkileşen çok sayıda nesne varsa, daha az karışıklık olması için bunları nasıl düzenleyebilirim? Büyürlerse programlarınız için planlar oluşturuyor musunuz?

Nesnelerinizle nasıl yazdığınızı ve uyguladığınızı paylaşın.

 
Vasiliy Pushkaryov :

Bir sorun var mı.


Düğmelerin bulunduğu bir panel vardır, her bir düğmeye basılarak bazı işlevler gerçekleştirilir. Butonlardan birine tıklandığında çağrılan fonksiyonlar, buna Exit1 diyelim , ayrı bir CExit1 sınıfına taşınmalıdır.

Ancak bu işlevler, bazı genel değişkenleri ve diğer nesnelerin yöntemlerini kullanır.

Büyük projelerde yer almadım. Uzmanların görüşlerini bilmek istedim, nasıl doğru yapılır?

Sıklıkla, mq4 dosyası derlenirse, tüm sınıflar ve içerme dosyaları hatasız olarak çekilecek ve EA olması gerektiği gibi çalışacak şekilde programlarım. Ancak sınıf ayrı olarak derlenirse, bazı harici değişkenler ve işlevler tarafından görülmediği için uyarılar vardır.

Aslında bir soru. Sınıfın kendisinin hatasız bir şekilde derlenmesi gerekli mi, yani EA global değişkenlerinin tüm kullanılmış kopyalarını, nesnelere referansları vb. zaten içeriyor mu? Evet ise, bunu yapmak için en iyi zaman ne zaman? Etkileşen çok sayıda nesne varsa, daha az karışıklık olması için bunları nasıl düzenleyebilirim? Büyürlerse programlarınız için planlar oluşturuyor musunuz?

Nesnelerinizle nasıl yazdığınızı ve uyguladığınızı paylaşın.

Platformun doğasında bulunanlar dışındaki küresel değişkenler ve durumlar kötü kötüdür. Ve tüm varlıklar (sınıf grupları) izole edilmeli ve protokole (Arayüz olan) ve başka hiçbir şeye uygun olarak birbirleriyle iletişim kurmalıdır.

Elbette bu ideal :-) Gerçek hayatta kararı siz veriyorsunuz ve kendinizi destekliyorsunuz çünkü projenizi, fikrinizi ve çalışma tarzınızı sizden başka kimse bilmiyor.

 
struct A
{
   int x,y;
};

//+------------------------------------------------------------------+
void OnStart ()
{
   A a,b,c;
   a.x = 1 ;
   a.y = 2 ;
   b = a;
   c = a;
   //b = c = a;  // 'operator=' - parameter passed as reference, variable expected
}

1. Neden derlenmiyor?

2. Operatör='yi tanımlayan ve içinde yerel kopyalama operatörünü kullanan bir hack var mı? .... yani aramanın bir yolu ::=

 
Igor Makanu :

1. Neden derlenmiyor?
2. operatörü= tanımlamak ve içinde yerel kopyalama operatörünü kullanmak için bir hack var mı? .... yani aramanın bir yolu ::=

1) MQL'deki varsayılan atama operatörü, geçersiz veri tipini döndürür;
2) şöyle bir şey yapabilirsiniz:

 struct A{
   int x,y;
   
   A(){}
   A( const A &a){
       this .x = a.x;
       this .y = a.y;
   }
   A operator =( const A &a){
       this .x = a.x;
       this .y = a.y;
       return a;
   }
};

void OnStart (){
   A a,b,c;
   a.x = 1 ;
   a.y = 2 ;
   b = a;
   c = a;
   b = c = a;  
}
 
Sergey Dzyublik :

1) MQL'deki varsayılan atama operatörü, geçersiz veri tipini döndürür;

aynı fikirde olmamak:

 struct A
{
   int x[];
};
//+------------------------------------------------------------------+
A myfunc( const int size)
{
   A result;
   ArrayResize (result.x, size);
   for ( int i = 0 ; i < size; i++) result.x[i] = i + 1 ;
   return (result);
}
//+------------------------------------------------------------------+
void OnStart ()
{
   A a;
   a = myfunc( 5 );
   A b;
   b = a;             // скопировали
   b.x[ 0 ] = 99 ;       // изменили 1-й элемент, чтобы убедиться, что это копия а, а не ссылка как в C#
   ArrayPrint (a.x);
   ArrayPrint (b.x);
}
//+------------------------------------------------------------------+

2020.04.18 18:54:03.855 tst (EURUSD,H1) 1 2 3 4 5

2020.04.18 18:54:03.855 tst (EURUSD,H1) 99 2 3 4 5


Açıkça varsayılan atama operatörü, tam veri türünü döndürür ve bir kopya oluşturur veya ne tür bir boşluktan bahsediyoruz?


2. örnek iyi, ancak varsayılan kopyalama operatörünü kullanarak dizi yapılarında kopyalama yeteneğini korumak istiyorum - Kontrol ettim, genel olarak dinamik dizilerle oldukça iyi çalışıyor, birkaç nüans var, ancak soru şu hala farklı

 
Igor Makanu :

Açıkça varsayılan atama operatörü, tam veri türünü döndürür ve bir kopya oluşturur veya ne tür bir boşluktan bahsediyoruz?

Hatalısınız.

Sadece bunu döndüren kendi operatörünüzü tanımlayın= ve farkı görün.

Bir atamanın sonucu tekrar atandığında bunu görebilirsiniz.

 struct A
{
   int x;
   int y;
   
   A operator =( const A& a )
   {
      x = a.x;
      y = a.y;
      
       return this ;
   }
};

void OnStart ()
{
   A a,b,c;
   a.x = 1 ;
   a.y = 2 ;
   b = a;
   c = a;
   b = c = a;
}