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

 
Koldun Zloy:

Это всё понятно. Непонятно почему SetSaveRequired() и GetSaveRequired() нестатические, но записывают в статическую переменную.

вот это мне и не понятно, поэтому и обратился за помощью,  модификаторами я редко пользуюсь, больше интуитивно, но как всегда хочется оптимальное решение

давайте в коде попробую спросить, сейчас так:

//+------------------------------------------------------------------+
interface IStrategy
{  double      Strategy();
   bool        Finalize(); };
//+------------------------------------------------------------------+
class CStrategy: public IStrategy
{
public:
   bool              GetSaveRequired() { return(CStrategy::f_save_required); CStrategy::f_save_required = false;  }
protected:
   static bool       f_save_required;
   double            ProfitStrategy;
   void              SetSaveRequired() { CStrategy::f_save_required = true;                                       }
   void              RunStrategy();
   virtual void      NextStepStrategy();
   void              EndStrategy();
};

//____________________________________________________________________
void CStrategy::RunStrategy(void)
{  ProfitStrategy = 0.0;
   SetSaveRequired();
//...........    
}
//____________________________________________________________________
void CStrategy::EndStrategy(string func)
{ //...........    
   SetSaveRequired();
}
//____________________________________________________________________
#define CLASS(NAME) class NAME : public CStrategy{\
public:\
   NAME(SSettingsForOrder &set)  { m_setting = set;}\
   ~NAME()                       { delete m_order; }\
   virtual void NextStepStrategy();}
//+------------------------------------------------------------------+
CLASS(CStrategy_XXX);
CLASS(CStrategy_YYY);
CLASS(CStrategy_ZZZ);

void CStrategy_XXX::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_YYY::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_ZZZ::NextStepStrategy(void) { SetSaveRequired();   //...........     }


public GetSaveRequired() используется в классе для управления всем этим зоопарком стратегий

при таком шаблоне  пишу только метод NextStepStrategy - только в нем изменения для ТС, все остальное одинаковое и поэтому в базовом классе  CStrategy собираю все методы и все поля - их не много 

ЗЫ: спиной чую что не айс мой код, но так точно работать будет и не наплодю дубликаты переменной f_save_required;

 
Igor Makanu:

вот это мне и не понятно, поэтому и обратился за помощью,  модификаторами я редко пользуюсь, больше интуитивно, но как всегда хочется оптимальное решение

давайте в коде попробую спросить, сейчас так:


public GetSaveRequired() используется в классе для управления всем этим зоопарком стратегий

при таком шаблоне  пишу только метод NextStepStrategy - только в нем изменения для ТС, все остальное одинаковое и поэтому в базовом классе  CStrategy собираю все методы и все поля - их не много 

ЗЫ: спиной чую что не айс мой код, но так точно работать будет и не наплодю дубликаты переменной f_save_required;

Я бы вообще убрал эти функции.

Все функции, не изменяющие структуру, сделал константными.

Все неконстантные функции должны устанавливать флаг записи.

И ещё добавил бы функцию Save( int fileHandle ). Эта функция должна записать структуру и сбросить флаг.

Для получения состояния флага можно сделать статическую функцию.

if( CStrategy::GetSaveRequired() )
{
   int fileHandle = FileOpen( ... );
   for( int i = 0; i < 10; i++ )
   {
      strategies[i].Save( fileHandle );
   }
   FileClose( fileHandle );
}
 
Koldun Zloy:

Я бы вообще убрал эти функции.

Все функции, не изменяющие структуру, сделал константными.

Все неконстантные функции должны устанавливать флаг записи.

пример бы, говорю же, с модификаторами вообще беда у меня


ЗЫ: тем более в инете вообще ужас что творится в обсуждении программирования - вот про const в прошлом месяце на хабре статья была, смысл - да не нужен этот const , вот смотрите ассемблерный код ничем не отличается что без const - компилятор все уберет (((

 
Igor Makanu:

пример бы, говорю же, с модификаторами вообще беда у меня

погуглил, почитал, что то опять пошло не так...

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z); 
 }
//+------------------------------------------------------------------+

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v 

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v 

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v 

ожидалось, что хоть раз получу Print("const");  
 
Igor Makanu:

погуглил, почитал, что то опять пошло не так...

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v 

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v 

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v 

ожидалось, что хоть раз получу Print("const");  
class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }
Это перегрузка для константного класса.
 
Vladimir Simakov:
Это перегрузка для константного класса.

хм.. точно, читал почти полчаса и хабр и форумы, но въехать не смог

Спасибо! теперь разобрался

есть еще подозрение что такой пример:

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  const void f(int v) { x = v; Print("(const) x = v ");  }

};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v 

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v 

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v 

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const


выдал такие же значения, но смысл совсем в другом? - тут тогда помощь зала нужна опять
 
Сижу сейчас на лекции по ООП. Может что путное узнаю - поделюсь ))
могу сбросить текущую лекцию. Пока, конечно же, банальные вещи.
 
Nikolai Semko:
Сижу сейчас на лекции по ООП. Может что путное узнаю - поделюсь ))
могу сбросить текущую лекцию. Пока, конечно же, банальные вещи.

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

ладно, с const в целом ситуация прояснилась, с остальными модификаторам работал, в общем нахлебался теории по самое... нужно применять, а то как студент себя чувствую )))

 
Igor Makanu:

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

ладно, с const в целом ситуация прояснилась, с остальными модификаторам работал, в общем нахлебался теории по самое... нужно применять, а то как студент себя чувствую )))

Да, у меня тоже похожая ситуация. Учиться не трудно, труднее переучиваться, ломать старые привычки. Не могу до сих от многих вредных привычек процедурного программирования отучиться. 

 
Igor Makanu:

пример бы, говорю же, с модификаторами вообще беда у меня


ЗЫ: тем более в инете вообще ужас что творится в обсуждении программирования - вот про const в прошлом месяце на хабре статья была, смысл - да не нужен этот const , вот смотрите ассемблерный код ничем не отличается что без const - компилятор все уберет (((

На константы и статики можно просто пока забить. На интерфейсы тоже. 

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

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