Как изменить элемент массива через оператор "квадратная скобка". - страница 2

 
Georgiy Merts #:

С помощью "const" выкрутился.

Это не при чем. Перегрузка оператора за счет разных типов входных параметров.

 
fxsaber #:

Это не при чем. Перегрузка оператора за счет разных типов входных параметров.

Да, я  и это тоже имел ввиду. Я упустил из виду такую возможность, был "недостаточно хитёр".

Ещё раз спасибо. Это именно то, что надо. 

 

И вот так вот:

a[(uint)i]=x;
x=a[(int)i];

будете этим пользоваться? А чем это лучше по сравнению с вызовом метода класса с круглыми скобками?

 
Dmitry Fedoseev #:

И вот так вот:

будете этим пользоваться? А чем это лучше по сравнению с вызовом метода класса с круглыми скобками?

Переносимость кода. 

Хочется, чтобы нативные классы вектора и матрицы в MT5 - нормально работали нативно, а в МТ4 безо всяких изменений кода - везде подставлялись самописные аналоги. 

И если для МТ5 в классе вектора используются квадратные скобки, чтобы можно было в MT4 просто заменить объявление вектора на мой класс CDBLVector, и все бы заработало - и получение значений по "квадратной скобке" и установка значений внутри вектора тоже по "квадратной скобке".

Решение "в одном случае индекс знаковый, а в другом беззнаковый" - вполне себе разумно.

 
 A* operator [][]( const int iPos, const int iPos2)

А что будет если две скобки дать?      ))

 
BillionerClub #:

А что будет если две скобки дать?      ))

разработчик языка матюкнётся фантазиям пользователей :-)

 
BillionerClub #:

А что будет если две скобки дать?      ))

Я понимаю так. 

Во-первых, компилятору может не понравиться синтаксис, и передавать параметры придётся иначе. 

Во-вторых, если речь идёт о классе, предложенном fxsaber'om, то надо глядеть, что передаётся в скобках. В зависимости от типа передаваемого значения (знаковое или беззнаковое) первая скобка вернёт либо double, либо указатель на класс. В первом случае - компилятор возмутится, у типа double нет оператора "квадратная скобка". Во втором случае - у класса будет вызван оператор "квадратная скобка", и в зависимости от типа переданного значения будет возвращёно либо double, либо указатель на объект. 

Ты предложил оба знаковых параметра. А значит, в обоих случаях будет возвращено double. 

В результате - компилятор будет недоволен.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как изменить элемент массива через оператор "квадратная скобка".

fxsaber, 2023.03.12 10:34

class A
{
private:
  int Pos;

public:
  double Array[5];
  
  A* operator []( const int iPos )
  {
    this.Pos = iPos;
    
    return(&this);
  }  
  
  void operator =( const double Value )
  {
    this.Array[this.Pos] = Value;
  }
};

void OnStart()
{
  A a;
  
  for (int i = 0; i < 5; i++)
    a[i][i][i][i][i] = i; // OK.
    
  ArrayPrint(a.Array);
}
 
fxsaber #:

Две квадратные скобки - это 2 размерности (в частности, для матрицы), так что там потребуется 2 индекса перекрывать, а не так как сейчас - все перезаписывается в одну ячейку. Для многомерных массивов может потребовать больше.

 
Stanislav Korotky #:

Две квадратные скобки - это 2 размерности (в частности, для матрицы), так что там потребуется 2 индекса перекрывать, а не так как сейчас - все перезаписывается в одну ячейку. Для многомерных массивов может потребовать больше.

Вы меня иначе трактовали. Своим примером показал отсутствие ошибки компиляции в такой конструкции. Чтобы не было иллюзиий от подобного синтаксиса.

Причина обращения: