MQL5'te OOP hakkında sorular - sayfa 3

 

Tüm düğmeler aynı anda yalnızca bir satırla çalışıyorsa, satıra atıfta bulunmak için düğme sınıfında statik bir değişken oluşturun. Ancak bu mantıklı değil, çünkü düğme sınıfının olanaklarını sınırlandırıyor - iki satır paralel olarak çalışmak için iki çift düğme oluşturmak mümkün olmayacak.

Ve sorunun doğru çözümü temeldir - bir işlev yazın, işleve satıra bir bağlantı iletilir ve işlevde bu bağlantı gerekli düğme nesnelerine iletilir. OOP'de mucize aramaya gerek yok.

Peki, ya da iki düğme oluşturan bir sınıf yazın.

 
Dmitry Fedoseev :

Tüm düğmeler aynı anda yalnızca bir satırla çalışıyorsa, satıra atıfta bulunmak için düğme sınıfında statik bir değişken oluşturun. Ancak bu mantıklı değil, çünkü düğme sınıfının olanaklarını sınırlıyor - iki satır paralel olarak çalışmak için iki çift düğme oluşturmak mümkün olmayacak.

Evet, dört çift düğmem ve dört satırım var, bu yüzden statik değişkeni bir seçenek olarak da attım.

Ve sorunun doğru çözümü temeldir - bir işlev yazın, işleve satıra bir bağlantı iletilir ve işlevde bu bağlantı gerekli düğme nesnelerine iletilir. OOP'de mucize aramaya gerek yok.

Peki, ya da iki düğme oluşturan bir sınıf yazın.

Ve OOP'nin mucizelerine inandım).

Bu seçenekler için teşekkürler, hangisinin bana en uygun olduğunu düşüneceğim.

 
Vasiliy Pushkaryov :

Sorunu çözmeye yardımcı olun. İki düğme ve bir satır var. Bir tuşa basıldığında satırı düzenleme modunda görüntüler, bırakıldığında satırı siler. İkinci düğmeye basıldığında düzeltir, bırakıldığında düzenleme moduna geri döner. Her düğme , "Çizgi" nesnesinin rengini ve diğer bazı özelliklerini değiştirebilir. "Line" nesnesi global düzeyde ayarlanır. Düğmeleri oluşturduktan hemen sonra, "Düğme" nesnelerinin içindeki referans değişkenini değiştirirken, tüm değişiklikler global "Satır" nesnesinde saklanacak şekilde her düğmeye "Çizgi" nesnesine bir referans iletmek mümkün müdür.

Aşağıda, bir düğmeyi tıklamak yerine basitleştirilmiş bir komut dosyası çizdim - "Çizgi" nesnesinin sayacını artıran ekleme () işlevi. "Line" nesnesini referans yoluyla bir fonksiyon argümanı olarak iletmenin mümkün olduğunu anlıyorum, ancak sadece çalışan versiyonda, bu tür birkaç fonksiyon var, bu yüzden bağlantıyı en baştan bir kez iletmek istiyorum. Onlar. Bunu, Btn1.addition() veya Btn2.addition() çağrıldığında, gLine.count sayacını artıracak şekilde yapmanın bir yolu var mı?

Bu şimdi bana ne oluyor:


belki gerekli?

 //+------------------------------------------------------------------+
class CLine
  {
public :
   int                count;
                     CLine( void ){count= 0 ;};
                    ~CLine( void ){};
  };
//+------------------------------------------------------------------+
class CMyButton
  {
private :
public :
   CLine            *m_Line;
                     CMyButton( void ):m_Line( NULL ){};
                    ~CMyButton( void ){};

   void bind(CLine *aLine) {m_Line=aLine;}
   void addition() { if ( CheckPointer (m_Line)== POINTER_DYNAMIC ){++m_Line.count;}}
  };


CMyButton  Btn1;
CMyButton  Btn2;

CLine *gLine;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   gLine = new CLine;
   Btn1.bind( GetPointer (gLine));
   Btn2.bind( GetPointer (gLine));
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   Print ( "Line.count=" , gLine.count);
   Btn1.addition();
   Print ( "Line.count=" , gLine.count, "  Btn1.m_Line.count=" , Btn1.m_Line.count);
   Btn2.addition();
   Print ( "Line.count=" , gLine.count, "  Btn2.m_Line.count=" , Btn2.m_Line.count);
   Btn1.addition();
   Print ( "Line.count=" , gLine.count, "  Btn1.m_Line.count=" , Btn1.m_Line.count);
   Btn2.addition();
   Print ( "Line.count=" , gLine.count, "  Btn2.m_Line.count=" , Btn2.m_Line.count);
  }
//+------------------------------------------------------------------+

2019.07.04 00:44:30.464 1 (EURUSD,H1) Satır.sayısı=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Satır.sayısı=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

 
Igor Makanu :

belki gerekli?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Satır.sayısı=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Satır.sayısı=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

Evet, Igor, en çok bu, çok teşekkür ederim.

İşaretçiler konusunda hala biraz "yüzüyorum", bu nedenle çözümünüz hem mevcut görevde hem de işaretçilerin nasıl kullanılabileceğini daha iyi anlamamda bana çok yardımcı olacak.

Cevap verdiğiniz için teşekkürler.

 
Igor Makanu :

belki gerekli?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Satır.sayısı=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Satır.sayısı=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

Ve eğer gLine'ı bir işaretçi ilan ettiyseniz, neden GetPointer'ı (gLine) kullanıyorsunuz ? )))

Evet ve bir CLine nesnesi oluşturmak, şunu bildirirken bile kendini gösterir:

CLine* gLine=yeni CLine;

Bir düğmeyi bir çizgiyle ilişkilendirmek, düğme başlatma aşamasında da kendini gösterir.

...
                CMyButton( CLine* line ):m_Line(!CheckPointer(line)?NULL:line){};
...
CLine* gLine=new CLine;
CMyButton  Btn1(gLine);
 
Vladimir Simakov :

Ve eğer gLine'ı bir işaretçi ilan ettiyseniz, neden GetPointer'ı (gLine) kullanıyorsunuz ? )))

Evet ve bir CLine nesnesi oluşturmak, şunu bildirirken bile kendini gösterir:

CLine* gLine=yeni CLine;

Bir düğmeyi bir çizgiyle ilişkilendirmek, düğme başlatma aşamasında da kendini gösterir.

geceydi, karanlık bir mesele - neden böyle yazdım ... aslında hiç uyudum, telefonda Skype'ı uyandırdım, bu yüzden forumdan geçerek koştum)))

ama cidden, örneğim eğitici, gerçekten kontrol etmedim, görünüşe göre bilinçaltı bir seviyede reasürans aldım, bir MQL pointer'ın ne tür bir varlık olduğunu tam olarak anlamıyorum, kesinlikle C++'daki pointerlar gibi çalışmıyor

Çözmeye çalıştım, ancak işaretçilerin işlev parametresi olarak nasıl çalıştığını kazanamadım işaretçilerin nasıl kullanılabileceğini daha iyi anlamamda bana çok yardımcı olacak.

Cevap verdiğiniz için teşekkürler.

lütfen! MQL işaretçileri ile, burada sadece pratik yardımcı olacaktır, @Vladimir Simakov'un yazdığı gibi davranışları tuhaftır.Görevin büyük olasılıkla en iyi parametreli bir kurucu yazarak çözülür - bunu genellikle soyutlamalar açısından mı yapıyorum? - bu doğru değil, ancak kullanışlı ve her zaman doğru çalışıyor - ve derleyici işaretçiyi bağlamayı unutmanıza izin vermeyecek, kontrol ediyorum

if(CheckPointer(m_Line)==POINTER_DYNAMIC)

bu kontrol hariç tutulabilir, çünkü Herhangi biri için yapıcıyı aradığınızda, işaretçiyi kaydedin

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2019.05.22
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Vay canına, görevin iki nesnenin aynı anda işaretçiyi çizgiye kadar beklemesini beklemek olmadığı ortaya çıktı. Ve genel olarak - işaretçinin ne aktarılacağı konusunda. Kim düşünebilirdi.

Bir işaretçiyi bir yere iletebilmek için, new üzerinden bir nesne yaratmaya hiç gerek yoktur. Ancak işaretçinin geçtiği sınıfta bir işaretçi değişkeni (yıldız * ile) olmalıdır.

 
Igor Makanu :

geceydi, karanlık bir mesele - neden böyle yazdım ... aslında hiç uyudum, telefonda Skype'ı uyandırdım, bu yüzden forumdan geçerek koştum)))

ama cidden, örneğim eğitici, gerçekten kontrol etmedim, görünüşe göre bilinçaltı bir seviyede reasürans aldım, bir MQL pointer'ın ne tür bir varlık olduğunu tam olarak anlamıyorum, kesinlikle C++'daki pointerlar gibi çalışmıyor

Çözmeye çalıştım, ancak işaretçilerin işlev parametresi olarak nasıl çalıştığını kazanamadım https://www.mql5.com/ru/forum/1111/page2470#comment_11796309 - Oradaki işleve bir işaretçi iletiyorum, ancak gerçeklik, işaretçinin yeni bir kopyasını oluşturuyorum

Not: MQL işaretçilerinin kapsamlarını çözemiyorum, ayrıca https://www.mql5.com/ru/forum/1111/page2488#comment_12154218 sordum .... Hangi durumlarda olduğunu çözemiyorum işaretçinin yerel bir kapsam görünürlüğü var ve küresel olan nerede... genel olarak, bilimsel yöntemi kullanarak MQL işaretçileriyle çalışıyorum (((

İlk durumda, her şey basittir. Aslında yığında yeni bir dinamik nesne yaratıyorsunuz ve hepsi bu. ...(CObj* &jbj,...) fonksiyonuna geçmek gerekir.

Ve ikinci durumda ihtiyacınız olan:

 void   AddValue (T &value)  { Tptr  = value; mlist.Add(Tptr);       }
 
Vladimir Simakov :

İlk durumda, her şey basittir. Aslında yığında yeni bir dinamik nesne yaratıyorsunuz ve hepsi bu. ...(CObj* &jbj,...) fonksiyonuna geçmek gerekir.

Ve ikinci durumda ihtiyacınız olan:

Akşam kontrol edeceğim, yardımda gerçekten kullanmayla ilgili hiçbir bilgi yok, muhtemelen haklısın

Teşekkür ederim!

 
Ayrıca bir işaretçiyi referans olarak değil - & olmadan iletebilirsiniz.
Neden: