Вопросы по ООП в MQL5 - страница 7

 
Dmitry Fedoseev:

Если заранее известно количество объектов и оно неизменно в процессе работы программы, то и не нужен нью. Во всех остальных случаях - new.

не угадали, вот мой пример https://www.mql5.com/ru/forum/160683/page861#comment_11840254

где в конструктор удобно передавать параметры и если юзер изменил настройки то быстрее в OnDeinit() убить класс и потом в OnInit() создать с новыми параметрами

;)

 
Igor Makanu:

не угадали, вот мой пример https://www.mql5.com/ru/forum/160683/page861#comment_11840254

где в конструктор удобно передавать параметры и если юзер изменил настройки то быстрее в OnDeinit() убить класс и потом в OnInit() создать с новыми параметрами

;)

Параметры в конструктор можно и без new передавать. 

 
Dmitry Fedoseev:

Параметры в конструктор можно и без new передавать. 

и? а изменять поля класса как будете (юзер изменил настройки EA)? - еще один метод напишете? Вы вроде на прошлой странице за еще " одна переменная для указателя." боролись, а тут целый метод!

;)

 
Igor Makanu:

и? а изменять поля класса как будете (юзер изменил настройки EA)? - еще один метод напишете? Вы вроде на прошлой странице за еще " одна переменная для указателя." боролись, а тут целый метод!

;)

input int a1=1;
input int a2=2;

class CX{
   public:
   void CX(int a,int b){
   
   }
};

CX cx(a1,a2);
 
Dmitry Fedoseev:

не прокатит ;)

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
input int a1=1;
input int a2=2;
//+------------------------------------------------------------------+
class CX
  {
public:
   int a1,a2;
   void CX(int a,int b) {a1=a;a2=b; }
  };
CX cx(a1,a2);  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
void OnTick()
  {
      Comment("cx.a1 = ",cx.a1,"\ncx.a2 = ",cx.a2);
  }
//+------------------------------------------------------------------+

измените настройки советника

 
Igor Makanu:

не прокатит ;)

измените настройки советника

Крутая засада. 

Тем не менее, предпочту добавить метод для изменения параметров, но не использовать new только из-за параметров.
 
Dmitry Fedoseev:

Крутая засада. 

Тем не менее, предпочту добавить метод для изменения параметров, но не использовать new только из-за параметров.

не использовать new - суеверие? )))

имхо, если удобно, то нужно юзать! - Ваш пример в 2 клика перепишется с использованием new и все будет корректно работать и обрабатывать ситуацию изменения настроек юзером

#property strict
input int a1=1;
input int a2=2;
//+------------------------------------------------------------------+
class CX
  {
public:
   int a1,a2;
   void CX(int a,int b) {a1=a;a2=b; }
  };
CX *cx;
//+------------------------------------------------------------------+
int OnInit()
  {
   cx = new CX(a1,a2);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  delete cx;
  }
//+------------------------------------------------------------------+
void OnTick()
  {
      Comment("cx.a1 = ",cx.a1,"\ncx.a2 = ",cx.a2);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

не использовать new - суеверие? )))

имхо, если удобно, то нужно юзать! - Ваш пример в 2 клика перепишется с использованием new и все будет корректно работать и обрабатывать ситуацию изменения настроек юзером

Не суеверие, просто лень, исторически сложившаяся, всвязи с обстоятельствами. Надо же писать delete, и делать это в Deinit(). А вот функции Deinit() по умолчанию не было в шаблоне. Вот сейчас сморю - в шаблоне эксперта есть Deinit(), но раньше не было.

 
Dmitry Fedoseev:

Не суеверие, просто лень, исторически сложившаяся, всвязи с обстоятельствами. Надо же писать delete, и делать это в Deinit(). А вот функции Deinit() по умолчанию не было в шаблоне. Вот сейчас сморю - в шаблоне эксперта есть Deinit(), но раньше не было.

не пишите delete - все будет корректно работать, этот грех (я про суеверие )) ) на себя возьмет терминал, и будет  бормотать в логе "48 bytes of leaked memory" то "2 objects of type CX left" и "undeleted objects left"

ЗЫ: в шаблоне создания индикатора нет Deinit() - это напрягает

 
Igor Makanu:

не пишите delete - все будет корректно работать, этот грех (я про суеверие )) ) на себя возьмет терминал, и будет  бормотать в логе "48 bytes of leaked memory" то "2 objects of type CX left" и "undeleted objects left"

ЗЫ: в шаблоне создания индикатора нет Deinit() - это напрягает

Работать будет без delete, а толку. А вот берет ли терминал на себя эту проблему? Он только сообщает об утечки памяти, но не уделяет же объекты.

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