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

 
Igor Makanu:

ну да, это более правильное решение! чтобы на один метод меньше было

В OnStart должен остаться только один new.
 
Koldun Zloy:

1. Ничего страшного в двойном вызове этой функции нет.

2. А Вас не смущает, что те кто против использования статических функций не приводят ни малейших аргументов?

Лучше не смотрите видео от кого попало, а читайте книги.

автору видео  https://youtu.be/lfdAwl3-X_c и  https://youtu.be/zME4SOCHT0I пожелаю много чего хорошего..... выбили из  колеи на всю неделю, все что не сяду делать начинаю думать, а не делать как раньше .... нельзя статики применять не ООП это!

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

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

- обьектов одного класса N штук, все наследованы от одного базового класса

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

class CStrategy: public IStrategy
{
protected:
static bool       f_save_required;
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

работает вроде как задумано

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

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

что будет если так записать:

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { f_save_required = true                   }
public:
bool              GetSaveRequired()        { return(f_save_required);                   }
 

по разному пробовал изменять тестовый скрипт, не вижу разницы, покажите кто - нибудь на этом скрипте ходя бы правильные модификаторы для поста выше: (protected / private ) и вызов M::x или просто х

//+------------------------------------------------------------------+
interface I
{  bool main();

};
//+------------------------------------------------------------------+
class M:public I
{
protected:
static int        x;
bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);}
};
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

void OnStart()
{  I *a = new A;
   I *b = new B;
   I *c = new C;
   I *m = new M;

   a.main();
   b.main();
   c.main();
   m.main();


   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+
 
Igor Makanu:

по разному пробовал изменять тестовый скрипт, не вижу разницы, покажите кто - нибудь на этом скрипте ходя бы правильные модификаторы для поста выше: (protected / private ) и вызов M::x или просто х

Внутри методов класса вызываешь x, во всех остальных местах M::x, если protected, то обращение возможно только в методах класса, в котором определено поле, тут логика общая.
 
С праздником, кстати. Очередной байт случился.
 
Vladimir Simakov:
Внутри методов класса вызываешь x, во всех остальных местах M::x, если protected, то обращение возможно только в методах класса, в котором определено поле, тут логика общая.

ну да! спросонья пример не правильный составил, вот так:

class M
{
private:
   static int        x;
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
void OnStart()
{  A *a = new A;
   B *b = new B;
   C *c = new C;
   M *m = new M;

   a.inc();



   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+

сразу получил 'M::main' - cannot access private member function tst.mq5 25 32

если запишу 

protected:   
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }

то все работает как задумано!

 
Vladimir Simakov:
С праздником, кстати. Очередной байт случился.

Спасибо, разобрался!

С праздником!

 
Igor Makanu:

автору видео  https://youtu.be/lfdAwl3-X_c и  https://youtu.be/zME4SOCHT0I пожелаю много чего хорошего..... выбили из  колеи на всю неделю, все что не сяду делать начинаю думать, а не делать как раньше .... нельзя статики применять не ООП это!

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

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

- обьектов одного класса N штук, все наследованы от одного базового класса

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

работает вроде как задумано

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

что будет если так записать:

От чего зависит, нужно ли сохранить объект в файл?

Этот признак общий для всех объектов?

 
Koldun Zloy:

От чего зависит, нужно ли сохранить объект в файл?

Этот признак общий для всех объектов?

ну вопрос конечно диалектический, тут

 - или имею 10 стратегий и писать 10 файлов при изменении состояния ТС (1 ТС = 1 структура)

 - или логичнее из класса где идет вызов ( перебор ) стратегий по тику передавать 1 хендл, чтобы они писали все в один файл

я 2-й вариант считаю логичным


получается, что при старте всех ТС нужно будет один раз записать 10 структур - состояние изменилось

затем в произвольном порядке нужно записать когда потребуется ( сработка СЛ илиТП ) - тут тоже быстрее открыть файл и  записать одним махом 10 структур, стратегии не пипсовочные, запись не каждую секунду , от минуты до часа в каждой ТС


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

 
Igor Makanu:

ну вопрос конечно диалектический, тут

 - или имею 10 стратегий и писать 10 файлов при изменении состояния ТС (1 ТС = 1 структура)

 - или логичнее из класса где идет вызов ( перебор ) стратегий по тику передавать 1 хендл, чтобы они писали все в один файл

я 2-й вариант считаю логичным


получается, что при старте всех ТС нужно будет один раз записать 10 структур - состояние изменилось

затем в произвольном порядке нужно записать когда потребуется ( сработка СЛ илиТП ) - тут тоже быстрее открыть файл и  записать одним махом 10 структур, стратегии не пипсовочные, запись не каждую секунду , от минуты до часа в каждой ТС


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

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

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