Как заполнить массив объектами (не указателями на объекты) ?

 

Добрый день.

Подскажите, как заполнить массив объектами:

class Test
{
public:
    int a;
    double b[];
public:
    Test():a(1){}
    Test(int &aQty);
};

Test::Test(int &aQty):a(aQty)
{
   ArrayResize(b,aQty);
}

Test mArray[];

void OnStart()
  {
   int Qty = 5;
   ArrayResize(mArray,Qty);
   for (int i=0; i<Qty; i++)
      mArray[i] = Test(Qty);
  }

Код вылетает с ошибками:

'Test' - invalid cast operation    TestClass.mq5    34    19
'Test' - parameter passed as reference, variable expected    TestClass.mq5    34    19
'operator=' - object required    TestClass.mq5    34    17

 

Если верить доке, массив при создании заполняется объектами, созданными конструктором_по_умолчанию.

А конструктор по умолчанию создаётся автоматически, если не объявлен ни один конструктор.
 
JRandomTrader:

Если верить доке, массив при создании заполняется объектами, созданными конструктором_по_умолчанию.

А конструктор по умолчанию создаётся автоматически, если не объявлен ни один конструктор.

Как тогда заполнить массив объектами, которые созданны другим конструктором?

Ну, кроме очевидного:

Test vTest(Qty);
   for (int i=0; i<Qty; i++)
      mArray[i] = vTest;

Допустим, у меня параметры конструктора в цикле меняются, и мне объекты нужно создавать именно в цикле...

 
AsterBus:

Как тогда заполнить массив объектами, которые созданны другим конструктором?

Ну, кроме очевидного:

Допустим, у меня параметры конструктора в цикле меняются, и мне объекты нужно создавать именно в цикле...

Вы хотите определять тип объекта в цикле и создавать массивы объектов этих типов? 

 

Массив заполняется объектами при вызове строки "ArrayResize(mArray, Qty);". Дальше нужно только объекты как-то проинициализировать. Например:

#property strict

class Test
{
public:
    int    a;
    double b[];

public:
    Test() : a(0) {}

    void Init(int q)
    {
        a = q;
        ArrayResize(b, q);
    }
};

Test mArray[];

void OnStart()
{
    int Qty = 5;
    ArrayResize(mArray, Qty);
    for (int i = 0; i < Qty; i++)
        mArray[i].Init(Qty);

    for (int i = 0; i < Qty; i++)
        PrintFormat("mArray[%d].a=%d, mArray[%d].ArraySize(b)=%d", 
                    i, mArray[i].a, i, ArraySize(mArray[i].b));
}
 

Объекты сами создаются и удаляется при вызове ArrayResize():

class Test
{
public:
    double b[];
public:
    Test(){
      Print("constr");
    }
    ~Test(){
      Print("destr");
    }
};

Test mArray[];

void OnStart(){
   int Qty = 5;
   ArrayResize(mArray,3);
   ArrayResize(mArray,0);
   ArrayResize(mArray,5);
}

И по завершению работу удаляются.

 
AsterBus:

Добрый день.

Подскажите, как заполнить массив объектами:

Код вылетает с ошибками:

'Test' - invalid cast operation    TestClass.mq5    34    19
'Test' - parameter passed as reference, variable expected    TestClass.mq5    34    19
'operator=' - object required    TestClass.mq5    34    17

class Test
{
public:
    int a;
    double b[];
    
public:
    Test() : a(1){}
    Test( int& aQty );
    Test( const Test& other );
    
    void operator=( const Test& other );
};

Test::Test( int& aQty ) : a( aQty )
{
   ArrayResize( b, aQty );
}

Test::Test( const Test& other ) : a( other.a )
{
   ArrayCopy( b, other.b );
}

void Test::operator=( const Test& other )
{
   if( &other != &this ){
      a = other.a;
      ArrayCopy( b, other.b );
   }
}


Test mArray[];


void OnStart()
{
   int Qty = 5;
   ArrayResize( mArray, Qty );
   for( int i = 0; i < Qty; i++ ){
      Test test( Qty );
      mArray[i] = test;
   }
}
 

Понятно!

Спасибо большое!