Скачать MetaTrader 5

Задача по ООП

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitry Fedoseev
47058
Dmitry Fedoseev  

Класс сам себя загружает. Если не принимать меры, зависнет. Поэтому сделана переменная 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
11312
Dennis Kirichenko  

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

Моя версия:

//+------------------------------------------------------------------+
//| 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
47058
Dmitry Fedoseev  
Dennis Kirichenko:

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

Моя версия:

Засчитывается!
Dmitry Fedoseev
47058
Dmitry Fedoseev  
Тут получилось выйти из положения. А если все-таки нужна своя переменная для каждой группы? Есть ли способ? Кроме как объявлять переменную и передавать ее по ссылке.
Ilyas
1215
Ilyas  
//+------------------------------------------------------------------+
//| 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
47058
Dmitry Fedoseev  
Ilyas:
Хороший способ. Спасибо
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий