Вопросы по ООП в MQL5 - страница 41

 
Igor Makanu:

просмотрел результаты своей битвы с кодом в стиле ООП - хм... превосходно! ))))


вопрос появился, а вот у меня в коде ну раза три точно используется конструкция вида:

 вызовы все в privat методах, но есть ли "джедайский прием ?" чтобы уйти в тексте исходника от CheckPointer(m_order)==POINTER_INVALID  

я про некие гет / сет спрашиваю

проблем особых нет, но так сказать прихоть, ну или пока еще не утихла жажда познания приемов ООП в С++  

Если вопрос в "много букв", то !CheckPointer(mPtr), а если в вызове функции, то в конструкторе инициализируете все указатели NULL и в коде сравниваете с ним, не забывая при delete ptr; ptr=NULL;

 
Igor Makanu:

просмотрел результаты своей битвы с кодом в стиле ООП - хм... превосходно! ))))


вопрос появился, а вот у меня в коде ну раза три точно используется конструкция вида:

 вызовы все в privat методах, но есть ли "джедайский прием ?" чтобы уйти в тексте исходника от CheckPointer(m_order)==POINTER_INVALID  

я про некие гет / сет спрашиваю

проблем особых нет, но так сказать прихоть, ну или пока еще не утихла жажда познания приемов ООП в С++  


Игорь, посмотрите этот пример, по моему то что вы спрашиваете.

 
Vladimir Simakov:

Если вопрос в "много букв", то !CheckPointer(mPtr), а если в вызове функции, то в конструкторе инициализируете все указатели NULL и в коде сравниваете с ним, не забывая при delete ptr; ptr=NULL;

Ну и вот это, для сахара:

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

проблем особых нет, но так сказать прихоть, ну или пока еще не утихла жажда познания приемов ООП в С++  

Крайне рекомендую все поля класса инициализировать в конструкторе значениями по умолчанию. Смысл в том, что если вы захотите сделать так:

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

,то поля вашего класса никто инициализировать не будет и там будут мусорные значения.

 
Vladimir Simakov:

Ну и вот это, для сахара:

нет, от defin-ов почти ушел, просто оборачивать не хочу ничего, как писал пару недель назад - пока хочу чистый код в стиле ООП посмотреть, оцениваю гибкость и возможности

ЗЫ: в define  только обернул потомков при создании, чтобы не писать однотипную инициализацию на 3 строки, так проще потом добавлять методы, т.е. в исходном коде коде по одной строке пока

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

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


Игорь, посмотрите этот пример, по моему то что вы спрашиваете.

нет, я про аналог в C#  - оператор ?? ( оператор null-объединения ), что то похожее по логике хочу посмотреть в стиле С++


UPD:

Vladimir Simakov:

Крайне рекомендую все поля класса инициализировать в конструкторе значениями по умолчанию. Смысл в том, что если вы захотите сделать так:

,то поля вашего класса никто инициализировать не будет и там будут мусорные значения.

так и сделал, конструктор с инициализацией всего и вся в базовом классе, потомки инициализируют базовый класс:

именно это и в макрос обернул, чтобы не забыть правильно проинициализировать )))

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

нет, от defin-ов почти ушел, просто оборачивать не хочу ничего, как писал пару недель назад - пока хочу чистый код в стиле ООП посмотреть, оцениваю гибкость и возможности

ЗЫ: в define  только обернул потомков при создании, чтобы не писать однотипную инициализацию на 3 строки, так проще потом добавлять методы, т.е. в исходном коде коде по одной строке пока

нет, я про аналог в C#  - оператор ?? ( оператор null-объединения ), что то похожее по логике хочу посмотреть в стиле С++

От препроцессора зря отказываешься. Наряду с шаблонами - это сильнейшие инструменты. Аналога оператора ?? похоже просто не существует. С++ в этом плане хардкорнее.
 
Vladimir Simakov:
От препроцессора зря отказываешься. Наряду с шаблонами - это сильнейшие инструменты. Аналога оператора ?? похоже просто не существует. С++ в этом плане хардкорнее.

у меня пока битва за чистый стиль ООП, хочу приемы ООП все познать, пока актив на форуме есть ;)

по препроцессору поднял свой уровень, но ... по моему не стоит злоупотреблять, по крайней мере не мой стиль, могу накосячить, а код со множественными макроподстановками точно не смогу прочитать быстро, а как искать баги... ну проще заново переписать - в общем пока не нужно


шаблоны... ну то что предлагают разработчики в СБ, совсем не понравилось, все пересмотрел, сложно сказать для каких целей их в СБ включили, возможно время их еще не пришло

про портирование шаблонов С++ в MQL - это время, как показало обсуждение, что в большинстве своем шаблоны С++ требуют доработки "напильником" для MQL - тут проще вернуться в .dll и не мучить MQL )))

 
Igor Makanu:

у меня пока битва за чистый стиль ООП, хочу приемы ООП все познать, пока актив на форуме есть ;)

по препроцессору поднял свой уровень, но ... по моему не стоит злоупотреблять, по крайней мере не мой стиль, могу накосячить, а код со множественными макроподстановками точно не смогу прочитать быстро, а как искать баги... ну проще заново переписать - в общем пока не нужно


шаблоны... ну то что предлагают разработчики в СБ, совсем не понравилось, все пересмотрел, сложно сказать для каких целей их в СБ включили, возможно время их еще не пришло

про портирование шаблонов С++ в MQL - это время, как показало обсуждение, что в большинстве своем шаблоны С++ требуют доработки "напильником" для MQL - тут проще вернуться в .dll и не мучить MQL )))

Так шаблоны можно и самому писать.)))
 
Vladimir Simakov:
Так шаблоны можно и самому писать.)))

угу )))

долистал окончательно хелп, пропустил override , благо все в макросе, правок, ну ровно в один копипаст

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

 UPD:

нет, не так, сам зачем то вылез за контроль  прав доступа, нет необходимости в public методе!

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

Ну и вот это, для сахара:

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

хотел написать как было раньше у меня вместо 

if( CheckPointer(m_order)==POINTER_INVALID )

 было так:

if(m_order==NULL)

но вспомнил как проверить макроподстановки в MQL

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) a = 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


и если мне не изменяет память, то в начале года можно было распринтовать  NULL в лог и получить там 0 , сейчас ошибку выдает

т.е. поведение NULL  как бы не должно измениться в дальнейшем, но что там подставляется вместо NULL  не понятно, наверное если эту ситуацию сейчас проверил, то как написал  if( CheckPointer(m_order)==POINTER_INVALID ) то это так сказать правильной код )))

Причина обращения: