OnTick() не работает в экземпляре класса? - страница 2

 
fxsaber:

Наследуйтесь от BASE, тогда методы OnTick в классах будут вызываться автоматически.

если нужно собрать вместе скажем OnTick, OnChartEvent, OnBookEvent, OnTimer, будет проблема.

Решаемо конечно, но костыльно.

 
TheXpert:

если нужно собрать вместе скажем OnTick, OnChartEvent, OnBookEvent, OnTimer, будет проблема.

Решаемо конечно, но костыльно.

Не понял, в чем костыльность. Собирается все вместо ровно таким же образом.

 
fxsaber:

универсальный код имхо, можно добавить к каждому классу A,B методы setSetting(.....)  для инициализации в OnInit() если требуются настройки и потом пиши себе каждый класс, что будешь по тику обрабатывать

 
fxsaber:

Собирается все вместо ровно таким же образом.

покажете?
 
Igor Makanu:

универсальный код имхо, можно добавить к каждому классу A,B методы setSetting(.....)  для инициализации в OnInit() если требуются настройки и потом пиши себе каждый класс, что будешь по тику обрабатывать

пишите OnInit-методы.

 
Сколько людей - столько и мнений. Мне, например, в контексте mql, не нравится шарповский подход к наследованию всего и вся от базового класса. По мне, так ближе концепция плюсовой std.
 
TheXpert:
покажете?
class BASE
{  
private:
  static BASE* Objects[];
  
public:
  BASE()
  {
    BASE::Objects[::ArrayResize(BASE::Objects, ::ArraySize(BASE::Objects) + 1) - 1] = &this;
  }
  
  ~BASE()
  {
    const int Size = ::ArraySize(BASE::Objects);
    
    for (int i = Size - 1; i >= 0; i--)
      if (BASE::Objects[i] == &this)
      {
        for (int j = i; j < Size - 1; j++)
          BASE::Objects[j] = BASE::Objects[j + 1];
          
        ::ArrayResize(BASE::Objects, Size - 1);
        
        break;
      }
  } 
    
  virtual void OnInit() {};
  virtual void OnTick() {};
  virtual void OnDeinit( const int ) {};
  
  static void AllInit()
  {
    for (int i = ::ArraySize(BASE::Objects) - 1; i >= 0; i--)
      BASE::Objects[i].OnInit();
  }
  
  static void AllTick()
  {
    for (int i = ::ArraySize(BASE::Objects) - 1; i >= 0; i--)
      BASE::Objects[i].OnTick();
  }
  
  static void AllDeinit( const int Reason )
  {
    for (int i = ::ArraySize(BASE::Objects) - 1; i >= 0; i--)
      BASE::Objects[i].OnDeinit(Reason);
  }  
};

static BASE* BASE::Objects[];

void OnInit()
{
  BASE::AllInit();
}

void OnTick()
{
  BASE::AllTick();
}

void OnDeinit( const int Reason )
{
  BASE::AllDeinit(Reason);
}

// Забыли про то, что выше. Пишем только то, что ниже.

class A : BASE
{
  virtual void OnInit() { Print(__FUNCSIG__); }
  virtual void OnTick() { Print(__FUNCSIG__); }
  virtual void OnDeinit( const int ) { Print(__FUNCSIG__); }
};

class B : BASE
{
  virtual void OnInit() { Print(__FUNCSIG__); }
  virtual void OnTick() { Print(__FUNCSIG__); }
  virtual void OnDeinit( const int ) { Print(__FUNCSIG__); }
};

A a;
B b[2];
 
fxsaber:

пишите OnInit-методы.

ну да! 

не обычный подход, но мне понравилась идея

заменить бы ArraySize(BASE::Objects) - 1  на статик переменную, чтобы чуть ускорить, вообще супер!

 
fxsaber:
это тоже костыль - подписка на одно событие означает подписку на все.
 
TheXpert:
это тоже костыль - подписка на одно событие означает подписку на все.

Не понял. Можете написать только нужные события

class C : BASE
{
  virtual void OnTick() { Print(__FUNCSIG__); }
};
Причина обращения: