Скачать MetaTrader 5

Задача по ООП

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сделал скриншот в MetaTrader? Поделись им с друзьями!
Dmitry Fedoseev
42923
Dmitry Fedoseev 2016.10.01 02:46 

Класс сам себя загружает. Если не принимать меры, зависнет. Поэтому сделана переменная n.

int n=0;

class CA{
   private:
      CA * m_c;
      static int m_n;
   public:
      void CA(){
         Alert(n+" "+m_n);
         if(n>=3){
            return;
         }      
         n++;
         m_n++;
         m_c = new CA();      
      }
      void ~CA(){
         delete m_c;
      }
};

int CA::m_n=0;

void OnStart(){
   Alert("===");
   CA c;
   CA c2;
}

При выполнении скрипта открывается алерт: 0 0, 1 1, 2 2, 3 3 - это в результате выполнения строки CA c;

В результате выполнения строки CA c2 получаем сразу 3 3, а надо бы так же: 0 0, 1 1, 2 2, 3 3 - три уровня загрузить. Это естественно и  понятно почему.

Статическая переменная m_n идентична переменной n, эффект тот же.

Конечно перед строкой CA c2 можно обнулить n, но это не интересное решение. 

Как бы так сделать, что бы избавиться от переменой n? Так, что бы на каждую независимую конструкцию выполнялся свой отсчет.  

Dennis Kirichenko
11331
Dennis Kirichenko 2016.10.01 06:24  

Интересная задачка :-)

Моя версия:

//+------------------------------------------------------------------+
//| Testing class                                                    |
//+------------------------------------------------------------------+
class CA
  {
private:
   CA               *m_c;
   static int        m_n;
   //---
public:
   //--- конструктор
   void CA()
     {
      PrintFormat("%d --- %d",m_n,m_n);
      if(m_n>=3)
        {
         m_n=0;
         return;
        }
      m_n++;
      m_c=new CA();
     }
   //---  деструктор
   void ~CA()
     {
      if(CheckPointer(m_c)==POINTER_DYNAMIC)
         delete m_c;
     }
  };

int CA::m_n=0;
//+------------------------------------------------------------------+
//| Start                                                            |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("===");
   CA c1;
   Print("===");
   CA c2;
  }
//+------------------------------------------------------------------+
Dmitry Fedoseev
42923
Dmitry Fedoseev 2016.10.01 07:25  
Dennis Kirichenko:

Интересная задачка :-)

Моя версия:

Засчитывается!
Dmitry Fedoseev
42923
Dmitry Fedoseev 2016.10.01 09:40  
Тут получилось выйти из положения. А если все-таки нужна своя переменная для каждой группы? Есть ли способ? Кроме как объявлять переменную и передавать ее по ссылке.
Ilyas
1205
Ilyas 2016.10.03 13:43  
//+------------------------------------------------------------------+
//| Testing class                                                    |
//+------------------------------------------------------------------+
class CA
  {
private:
   CA               *m_c;
   int               m_n;
   //---
public:
   //--- конструктор
   void CA(int n=0):m_n(n)
     {
      PrintFormat("%d --- %d",m_n,m_n);
      if(n<3)
         m_c=new CA(n+1);
     }
   //---  деструктор
   void ~CA()
     {
      if(CheckPointer(m_c)==POINTER_DYNAMIC)
         delete m_c;
     }
  };
//+------------------------------------------------------------------+
//| Start                                                            |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("===");
   CA c1;
   Print("===");
   CA c2;
   Print("===");
   CA c[2];
  }
//+------------------------------------------------------------------+
Dmitry Fedoseev
42923
Dmitry Fedoseev 2016.10.03 13:50  
Ilyas:
Хороший способ. Спасибо
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий