MQL5におけるOOPに関する質問 - ページ 7

 
Dmitry Fedoseev:

オブジェクトの数があらかじめ分かっていて、プログラムの実行中も一定であれば、newは必要ない。それ以外の場合は、新品が必要です。

いいえ、以下は私の例ですhttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

コンストラクタにパラメータを渡しておけば、ユーザが設定を変更したときに OnDeinit() でクラスを終了させ、OnInit() で新しいパラメータを指定してクラスを作成できるため便利です。

;)

 
Igor Makanu:

no, 以下は私の例ですhttps://www.mql5.com/ru/forum/160683/page861#comment_11840254

コンストラクタにパラメータを渡すと便利で、ユーザーが設定を変更した場合は、OnDeinit()でクラスを終了させ、OnInit()で新しいパラメータを指定してクラスを作成する方が速いです。

;)

パラメータは、new なしでコンストラクタに渡すこともできます。

 
Dmitry Fedoseev:

パラメータは、new なしでコンストラクタに渡すことができます。

では、クラスフィールド(ユーザーが変更したEA設定)はどのように変更するのでしょうか?- もう1つメソッドを書いていただけますか?最後のページでポインタのための変数が1つ 増える」ことを争っているのかと思いました。"そして、ここに全てのメソッドがある!

;)

 
Igor Makanu:

そして、クラスフィールド(ユーザーが変更したEA設定)をどのように変更するのでしょうか?- 別のメソッドを書くのでしょうか?最後のページでポインターの変数を1つ 増やせ」と争っていたような気がしましたが。「と悩んでいたら、こんな方法があったんですね。

;)

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を使うことはありません。

新品を使わないのは迷信?)))

イモトは、便利なら使わなきゃ損!- あなたのサンプルは、newを使用して2クリックで書き換えられ、すべてが正しく動作し、ユーザーが設定を変更した場合の状況を処理することができます。

#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クリックで書き換えられ、すべてが正しく動作し、ユーザーが設定を変更した場合の状況を処理することができます。

迷信ではなく、歴史的に見ても、事情があっての怠慢です。Deinit()の中でdeleteを書いてやる必要があります。しかし、Deinit()関数は、デフォルトではテンプレートにありませんでした。今見ると、EAテンプレートにはDeinit()がありますが、以前はありませんでした。

 
Dmitry Fedoseev:

迷信ではなく、歴史的に見ても、事情があっての怠慢です。deleteを書き、Deinit()の中で行うべきでしょう。しかし、Deinit()関数は、デフォルトではテンプレートに存在しませんでした。今見ていますが、EAテンプレートにDeinit()がありますが、以前はありませんでした。

削除を書き込まないでください - すべてが正しく動作します、この罪(私は迷信を意味する) ) 。) がターミナルを占拠し、ログに「48バイトのリークメモリ」「2つのタイプCXのオブジェクトが残っている」「削除されていないオブジェクトが残っている」とつぶやきます。

HH:インジケータ・ テンプレートにDeinit()がない - これは迷惑だ

 
Igor Makanu:

削除を書き込まないでください - すべてが正しく動作します、この罪(私は迷信を意味する))。) がターミナルを引き継ぎ、ログに "48 bytes of leaked memory"、次に "2 objects of type CX left" と "undeleted objects left" とつぶやくでしょう。

SZY:インジケータを作成 するテンプレートにDeinit()がない - それは歪む

削除しなくても動作はしますが、使い物になりません。しかし、この問題は端末が解決してくれるのでしょうか?メモリリークを報告するだけで、同じオブジェクトをデバッグすることはない。