MQL5中的OOP问题 - 页 7

 
Dmitry Fedoseev:

如果事先知道对象的数量,并且在程序运行期间是恒定的,那么就不需要新建。在所有其他情况下,你需要新的。

不,这是我的例子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);
  }
//+------------------------------------------------------------------+

改变EA设置

 
Igor Makanu:

不可能;)

改变EA设置

很酷的伏击。

然而,我更希望增加一个改变参数的方法,但不要因为参数而使用new。
 
Dmitry Fedoseev:

很酷的伏击。

尽管如此,我还是倾向于添加一个改变参数的方法,但不要因为参数就使用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:

不使用新的就是迷信?)))

我认为,如果它是方便的,你必须使用它!- 你的例子将在2次点击中使用new重写,一切都将正确工作,并处理用户改变设置的情况。

不是迷信,只是懒惰,在历史上,由于环境的原因。你必须写删除,并在Deinit()中进行。但默认情况下,模板中没有Deinit()函数。现在我看了看--EA模板有Deinit(),但以前是没有的。

 
Dmitry Fedoseev:

不是迷信,只是懒惰,在历史上,由于环境的原因。我们应该写删除,并在Deinit()中进行。但默认情况下,模板中没有Deinit()函数。我现在正在寻找--在EA模板中有Deinit(),但以前是没有的。

不要写删除--一切都会正常工作,这种罪恶(我指的是迷信) ))将接管终端,并在日志中嘀咕 "48字节的泄漏内存"、"剩下2个CX类型的对象 "和 "剩下未删除的对象"。

HH:在指标 模板中,没有Deinit()--这很烦人。

 
Igor Makanu:

不要写删除 - 一切都会正常工作,这种罪过(我是说迷信))。)将接管终端,并在其日志中嘀咕 "48字节的泄漏内存",然后 "剩下2个CX类型的对象 "和 "剩下未删除的对象"

不删除也可以,但没有用处。但是,终端是否照顾到了这个问题?它只报告了内存泄漏,但它并没有奉献给同样的对象。