MQL5'te OOP hakkında sorular - sayfa 41

 
Igor Makanu :

OOP tarzı kodla savaşımın sonuçlarını gözden geçirdim - hmm... mükemmel! ))))


soru ortaya çıktı, ancak kodumda, üç kez, formun yapısı tam olarak kullanılıyor:

aramaların tümü özel yöntemlerdedir, ancak bir "jedi hilesi var mı?" CheckPointer(m_order)==POINTER_INVALID'den kaynak metinde kaçmak için

Bazı get / set hakkında soruyorum

özel bir sorun yok, ama tabiri caizse bir heves veya C ++'daki OOP teknikleri bilgisi için susuzluk henüz azalmadı

Soru "birçok harf" ise, !CheckPointer(mPtr) ve bir işlev çağrısındaysa , yapıcıdaki tüm NULL işaretçilerini başlatın ve ptr'yi silmeyi hatırlayarak kodda bununla karşılaştırın; ptr=NULL;

 
Igor Makanu :

OOP tarzı kodla savaşımın sonuçlarını gözden geçirdim - hmm... mükemmel! ))))


soru ortaya çıktı, ancak kodumda, üç kez, formun yapısı tam olarak kullanılıyor:

aramaların hepsi özel yöntemlerde, ancak bir "jedi hilesi var mı?" CheckPointer(m_order)==POINTER_INVALID'den kaynak metinde kaçmak için

Bazı get / set hakkında soruyorum

özel bir sorun yok, ama tabiri caizse bir heves veya C ++'daki OOP teknikleri bilgisi için susuzluk henüz azalmadı


Igor, şu örneğe bak, bence ne soruyorsun.

 
Vladimir Simakov :

Soru "birçok harf" ise, !CheckPointer(mPtr) vebir işlev çağrısındaysa , yapıcıdaki tüm NULL işaretçilerini başlatın ve ptr'yi silmeyi hatırlayarak kodda bununla karşılaştırın; ptr=NULL;

İşte, şeker için:

 #define DELETE(dObj) do if (dObj!= NULL ) { delete dObj; dObj= NULL ;} while ( false )
 
Igor Makanu :

özel bir sorun yok, ama tabiri caizse bir heves veya C ++'daki OOP teknikleri bilgisi için susuzluk henüz azalmadı

Sınıfın tüm alanlarının yapıcıda varsayılan değerlerle başlatılmasını şiddetle tavsiye ederim. Mesele şu ki, bunu yapmak istiyorsanız:

 void foo(){
   CClass someClass;
   someClass.DoSomething();
}

, o zaman kimse sınıfınızın alanlarını başlatmayacak ve çöp değerler olacaktır.

 
Vladimir Simakov :

İşte, şeker için:

hayır, neredeyse tanımları bıraktım, birkaç hafta önce yazdığım gibi sadece hiçbir şeyi sarmak istemiyorum - şimdilik OOP tarzında temiz kod görmek istiyorum, esnekliği ve olasılıkları takdir ediyorum

Not: Oluştururken çocukları yalnızca tanımla sardım, aynı tür başlatmayı 3 satıra yazmamak için daha sonra yöntemler eklemek daha kolay, yani. kaynak kod kodunda her seferinde bir satır

 #define CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder( __FUNCTION__ ,getDealType()==BUY ? SELL : BUY));
Roma :


Igor, şu örneğe bak, bence ne soruyorsun.

hayır, C#'daki analogdan bahsediyorum - operatör ?? ( boş birlik operatörü ), C ++ tarzında mantıkta benzer bir şey görmek istiyorum


UPD:

Vladimir Simakov :

Sınıfın tüm alanlarının yapıcıda varsayılan değerlerle başlatılmasını şiddetle tavsiye ederim. Mesele şu ki, bunu yapmak istiyorsanız:

, o zaman kimse sınıfınızın alanlarını başlatmayacak ve çöp değerler olacaktır.

Ben de tam olarak bunu yaptım, kurucu, temel sınıftaki her şeyin ve her şeyin başlatılmasıyla, soyundan gelenler temel sınıfı başlatır:

doğru başlatmayı unutmamak için bir makroya sardığım şey bu)))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public :\
   NAME(SStrategySettings & set ):CStrategy( set ){ }\
   virtual void NextStepStrategy( void ) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu :

hayır, neredeyse tanımları bıraktım, birkaç hafta önce yazdığım gibi sadece hiçbir şeyi sarmak istemiyorum - şimdilik OOP tarzında temiz kod görmek istiyorum, esnekliği ve olasılıkları takdir ediyorum

Not: Oluştururken çocukları yalnızca tanımla sardım, aynı tür başlatmayı 3 satıra yazmamak için daha sonra yöntemler eklemek daha kolay, yani. kaynak kod kodunda her seferinde bir satır

hayır, C#'daki analogdan bahsediyorum - operatör ?? (boş birlik operatörü), C++ stilinde mantıkta benzer bir şey görmek istiyorum

Önişlemciyi boşuna reddediyorsunuz. Şablonlarla birlikte bunlar en güçlü araçlardır. Operatör analogu ?? sadece yokmuş gibi görünüyor. C++ bu konuda daha serttir.
 
Vladimir Simakov :
Önişlemciyi boşuna reddediyorsunuz. Şablonlarla birlikte bunlar en güçlü araçlardır. Operatör analogu ?? sadece yokmuş gibi görünüyor. C++ bu konuda daha serttir.

Hala saf OOP stili için bir savaşım var, forumda bir varlık varken tüm OOP tekniklerini öğrenmek istiyorum;)

Önişlemci konusunda seviyemi yükselttim ama... bence bunu kötüye kullanmamalısın, en azından benim tarzım değil, her şeyi berbat edebilirim ve kesinlikle birden fazla makro değişikliği ile kodu hızlıca okuyamıyorum. , ancak hataları nasıl arayabilirim ... peki, yeniden yazmak daha kolaydır - genellikle gerekli değildir


şablonlar... peki, geliştiricilerin Güvenlik Konseyi'nde sunduklarından hiç hoşlanmadım, her şeyi inceledim, Güvenlik Konseyi'ne hangi amaçlarla dahil olduklarını söylemek zor, belki de zamanları henüz gelmedi

C++ şablonlarını MQL'ye taşıma hakkında - bu, tartışmanın gösterdiği gibi, çoğu zaman C++ şablonlarının MQL için bir "dosya" ile sonlandırılmasının gerekli olduğu zamandır - MQL'ye eziyet etmek yerine .dll'ye dönmek daha kolaydır)))

 
Igor Makanu :

Hala saf OOP stili için bir savaşım var, forumda bir varlık varken tüm OOP tekniklerini öğrenmek istiyorum;)

Önişlemci konusunda seviyemi yükselttim ama... bence bunu kötüye kullanmamalısın, en azından benim tarzım değil, her şeyi berbat edebilirim ve kesinlikle birden fazla makro değişikliği ile kodu hızlıca okuyamıyorum. , ama hatalar nasıl aranır ... peki, yeniden yazmak daha kolaydır - genellikle gerekli değildir


şablonlar... peki, geliştiricilerin Güvenlik Konseyi'nde sunduklarından hiç hoşlanmadım, her şeyi inceledim, Güvenlik Konseyi'ne hangi amaçlarla dahil olduklarını söylemek zor, belki de zamanları henüz gelmedi

C++ şablonlarını MQL'ye taşıma hakkında - bu, tartışmanın gösterdiği gibi, çoğu zaman C++ şablonlarının MQL için bir "dosya" ile sonlandırılmasının gerekli olduğu zamandır - MQL'ye eziyet etmek yerine .dll'ye dönmek daha kolaydır)))

Böylece şablonları kendiniz yazabilirsiniz.)))
 
Vladimir Simakov :
Böylece şablonları kendiniz yazabilirsiniz.)))

evet )))

sonunda yardımda gezindi, geçersiz kılmayı kaçırdı, çünkü her şey makroda, düzenlemeler, tam olarak bir kopyala-yapıştır

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public :\
   NAME(SStrategySettings & set ):CStrategy( set ){ }\
   void NextStepStrategy( void ) override {FUNC;}}

UPD:

hayır, öyle değil, nedense kendisi erişim haklarının kontrolünden çıktı, halka açık bir yönteme gerek yok!

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private :\
void NextStepStrategy( void ) override {FUNC;}\
public :\
   NAME(SStrategySettings & set ):CStrategy( set ){ }}
 
Vladimir Simakov :

İşte, şeker için:

 #define DELETE(dObj) do if (dObj!= NULL ) { delete dObj; dObj= NULL ;} while ( false )

onun yerine benden önceki gibi yazmak istedim

 if ( CheckPointer (m_order)== POINTER_INVALID )

şöyleydi:

 if (m_order== NULL )

ama MQL'de makro ikamelerini nasıl kontrol edeceğimi hatırladım

 void OnStart ()
{   int a = 0 ;
#ifdef NULL
   a = 1 ;
#endif

   Print ( "a = " ,a);
   Print ( "POINTER_INVALID = " , POINTER_INVALID );
   Print ( "NULL = " ,( int ) NULL );   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) bir = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


ve hafızam bana hizmet ediyorsa, o zaman yılın başında günlüğe NULL yazdırmak ve orada 0 almak mümkündü, şimdi bir hata veriyor

onlar. NULL'un davranışı gelecekte değişmemelidir, ancak NULL için ikame edilen şey net değil, muhtemelen bu durumu şimdi kontrol edersem, o zaman yazdığım gibi if ( CheckPointer (m_order) == POINTER_INVALID ) o zaman bu doğru koddur, tabiri caizse )))