как передать массив в класс - страница 2

 
double Price[]={0.1,0.2,0.3,0.4,0.5};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   CC Hi(Price);
   Print (Hi.Max());
   Print (Hi.Min());
//---
   CC hi;
   Print (hi.Max(Price));
   Print (hi.Min(Price));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CC
  {
private:
   double            arr[];

public:
   CC()                    { };
   CC(double &src_array[]) { ArrayCopy( arr, src_array ); };
//---
   double Max(double &src_array[])
     {return  src_array[ArrayMaximum(src_array)];}
   double Max()
     {return  arr[ArrayMaximum(src)];}
//---
   double Min(double &src_array[])
     {return  src_array[ArrayMinimum(src_array)];}
   double Min()
     {return  arr[ArrayMinimum(arr)];}
  };
//+------------------------------------------------------------------+

Можно сразу оба варианта прописать и работать как больше удобно.

 

А как завернуть массив в объект и работать через указатель ? 

Может в моем примере это и не надо. Приведите пример где это может потребоваться? 

 
Dmitiry Ananiev:

Так массива в классе нет. 
Я в ООП не силен потому и спрашиваю. 

В моем понимании если в класс передается ссылка на массив ТО почему нужно копировать в класс массива (что достаточно затратно) , если по идее можно взять указатель и получить этот же массив но уже в классе? 

Надеюсь я понятно выразился. 

потому что исходный массив может поменяться снаружи. Вам же ссылку отдали ? вот она вещь одноразовая.

там может была таймсерия - и физически между вызовами память перевыделена, бары добавлены и прочая-прочая.

(ссылка в MQL не эквивалентна ссылке в С++ или не дай бог в C#, это не передача по имени, синониму - считайте её одноразовым указателем С)

 

К сожалению, указателей на массивы нет, и меня это весьма раздражает.

Особенно глупо получать массивы в индикаторе, и на каждом тике их копировать себе.

Слава Богу, хоть есть указатели на объекты, и массив можно обернуть в объект.

 
Georgiy Merts:

К сожалению, указателей на массивы нет, и меня это весьма раздражает.

Особенно глупо получать массивы в индикаторе, и на каждом тике их копировать себе.

Слава Богу, хоть есть указатели на объекты, и массив можно обернуть в объект.

а как обернуть массив в объект и как эт о можно использовать. Можно пример ? 

 
Dmitiry Ananiev:

а как обернуть массив в объект и как эт о можно использовать. Можно пример ? 

Пример - в Стандартной Библиотеке объекты массивов, скажем, CArrayInt

Объявляешь его, и дальше - все действия производятся с этим объектом, а когда надо передавать массив в функцию, но не хочется его копировать - передаешь адрес объекта, и дальше используешь его. Копирования не происходит.

 
Georgiy Merts:

Пример - в Стандартной Библиотеке объекты массивов, скажем, CArrayInt

Объявляешь его, и дальше - все действия производятся с этим объектом, а когда надо передавать массив в функцию, но не хочется его копировать - передаешь адрес объекта, и дальше используешь его. Копирования не происходит.

Ну так и в процедурном виде это так. Видно что эта обертка бессмысслена, лишь потеря времени и лишний код.
 
Dmitiry Ananiev:

Поискал по всему форуму так и не нашел примера как передать массив в класс. 

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

Польза есть только как некое обобщение-обертка уже готовых функций, хотя и это решимо на процедурном уровне..

 
Andrei:
Ну так и в процедурном виде это так. Видно что эта обертка бессмысслена, лишь потеря времени и лишний код.

Да ну ???

Попробуй возможность не копировать массив, а передавать адрес - дорого стоит.  Вот, в индикаторах ты получаешь массивы "в процедурном стиле". И без копирования - не обойдешься.

Как раз классы - вполне себе предназначены для передачи из них и в них данных.

В частности, я уже не раз показывал, как у меня организован доступ к истории или к позиции - ты получаешь виртуальный интерфейс, в котором одни функции. Внутренняя реализация - полностью скрыта. Именно инкапсуляция ООП это и позволяет. А полиморфизм - позволяет без больших затрат иметь переносимый код. Просто определяется интерфейс взаимодействия, и дальше - и "клиент" и "сервер" просто взаимодействуют, исходя из этого интерфейса, не посвящая друг друга во внутреннюю реализацию. Без ООП такую инкапсуляцию сделать не выйдет.

 
Georgiy Merts:

Попробуй возможность не копировать массив, а передавать адрес - дорого стоит.  Вот, в индикаторах ты получаешь массивы "в процедурном стиле". И без копирования - не обойдешься.

Как раз классы - вполне себе предназначены для передачи из них и в них данных.

Действительно, хорошее замечание. Нельзя все написать в процедурном стиле. Например, передать любое количество массивов в функцию в процедурном стиле не получится.

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