Задача по ООП

 

Класс сам себя загружает. Если не принимать меры, зависнет. Поэтому сделана переменная 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? Так, что бы на каждую независимую конструкцию выполнялся свой отсчет.  

 

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

Моя версия:

//+------------------------------------------------------------------+
//| 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;
  }
//+------------------------------------------------------------------+
 
Dennis Kirichenko:

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

Моя версия:

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