汎用クラスライブラリ - バグ、説明、質問、使用上の特徴、提案 - ページ 25

 
Andrey Pogoreltsev:

ただ、組み込み型にしか使えないのに、なぜコレクションを作り、コドベースに入れるのか)?

組み込み構造にも向いていない。

 
Andrey Pogoreltsev:

教えてください、何か理解できていないかもしれませんが、このタイプの構造を使おうとすると。

エラーが発生するのですが。

'Option' - オブジェクトは参照渡しのみ ICollection.mqh 14 18

で、次にエラーがいっぱい...。

これは動作しませんが、テンプレートテンプレートを通じて行う必要があり、私もこの問題に取り組んで、ここでテスト例では、それが正常に動作しているようだ

class CData - リストに格納したい構造体.

CDataBase - リストそのもの

#property strict
#include <Arrays\List.mqh>

//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
   datetime          t;
  };
//+------------------------------------------------------------------+
template<typename TDB>class CDataBase
  {
private:
   CList            *mlist;
   TDB              *TDBptr;
public:
   void CDataBase()           { mlist=new CList;                                       }
   void ~CDataBase(void)      { delete mlist;                                          }
   int ArraySize(void)        { return(mlist.Total());                                 }
   TDB *operator[](int index) { return(mlist.GetNodeAtIndex(index));                   }
   void  AddValue (TDB &value){ TDBptr = new TDB; TDBptr  = value; mlist.Add(TDBptr);  }
   string TypeName()          { return(typename(TDB));                                 }
   };
//+------------------------------------------------------------------+
// проверка, запишем  распринтуем значения
void OnStart()
  {

   CDataBase<CData>*data=new CDataBase<CData>;
   CData *my=new CData;

   int i;
   Print("1------------------------------------");
   for(i=0; i<10; i++)
     {
      my.x=i;
      my.y= i*2;
      data.AddValue(my);
      Print(i," : ",data[i].x," , ",data[i].y," / ",my.x," ,",my.y);
     }
   Print("2------------------------------------");
   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete my;
   delete data;
  }
//+------------------------------------------------------------------+

OnStart()では、リストを作成し、そこに値を書き込んでから読み込んでいます。 2回チェックしましたが、最初のどこかで、リストに書き込むときにローカル 変数の可視性が失われたため、書き込みはすべてOKでしたが、読み込むときにヌルポインタが発生してエラーになりました。

 
Igor Makanu:

そのように動作しません、あなたはテンプレートテンプレートを使用する必要があります、私はあまりにもこの問題を扱っていた、私はテスト例を作成し、それはすべて正しく動作しているようです。

class CData - リストに格納したい構造体.

CDataBase - リストそのもの

OnStart () で、リストを作成し、そこに値を書き込んでから、それを読み取る。 私はそれを2回チェックします。なぜなら、まず、リストに書き込むときに、ローカル 変数のどこかの可視性を失ったからです。私はすべて大丈夫でしたが、読み取るときに、ヌルポインタとエラーが発生しました

CDataはまだクラスであり、構造体ではないので、あなたのコードは動作します。クラスと構造体のジェネレータを一度に使おうとすると、特にdelete演算子で問題が発生します。私は、この「ジェネリック」を使った自分の実験を通して、それを確信しました。重要なのは、この「汎用」ライブラリには削除オペレータが全くなく、このような「コレクション」に新しいクラスを追加すると、プログラムを終了した後、多くのオブジェクトが失われることになる、ということです。つまり、もともとこのジェネリックは、プリミティブ型のためだけに書かれたものであることが明らかだ。

 
Vasiliy Sokolov:

CDataは構造体ではなくクラスなので、このコードでうまくいきます。クラスと構造体に対して同時にジェネリックを使おうとすると、特にdelete演算子で問題が発生します。私は、この「ジェネリック」を使った自分の実験を通して、それを確信しました。重要なのは、この「汎用」ライブラリには削除オペレータが全くなく、このような「コレクション」に新しいクラスを追加すると、プログラムを終了した後に多くのオブジェクトが失われることです。つまり、もともとこのジェネリックは、プリミティブ型に対してのみ書かれていたことがわかる。

私はMQLで構造体を使うのをやめました。構造体には何の利点もありませんが、構造体で作業していると常にバグが発生し、時間を無駄にします。構造体に関する質問で古い管理者の投稿を読みましたが、彼らは基本的に構造体の代わりにクラスを使えと言います。

SZZ:構造体を使わなくなった時に見つけたものhttps://www.mql5.com/ru/forum/6343/page866#comment_7541747

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2018.05.23
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Andrey Pogoreltsev:

なぜ、コレクションを作り、組み込み型にしか使えないのに、コドベースに入れるのか)?

標準装備されている利便性。それゆえ、引っ張る必要はなく、どのユーザーも持っているのです。

私は、あるKBリブでこれを長く使っています。

 
Igor Makanu:

そのように動作しません、あなたはテンプレートテンプレートを使用する必要があります、私はあまりにもこの問題を扱っていた、私はテスト例を作成し、それはすべて正しく動作しているようです。

class CData - リストに格納したい構造体.

CDataBase - リストそのもの

OnStart()で - リストを作成し、それに値を書き込み、その後、私はそれをチェックする2回、最初のどこかで私はリストに書き込むときにローカル 変数の可視性を失ったので - 私はすべて大丈夫を書くために使用されますが、私が読んだとき、私はヌルポインターが読み込まれ、エラーが発生しました。

まず、リスト上でアロケーターを実装し、そこにポインターを格納しています。だけでなく、破壊するときに漏れがある)。

次に、代入演算子ではなく、コピーコンストラクタを正しく使用する必要がありました。しかし、これはすべてIMHOです)

そして最も重要なことは、開発者はジェネリックを最終化し、内部にアロケータを作り、カスタムオブジェクトをサポートすればいいということです。C++はすでに彼らのためにすべてを発明しました)そして、私たちは自転車を発明する必要はありません。

 
Andrey Pogoreltsev:

まず、リスト上でアロケーターを実装し、そこにポインターを格納していますね。それだけでなく、破壊に関するリークもある)

どのようにして漏れを発見したのですか?

SZZ:テスト例です。MQLでリストをどう扱うかを考えなければならなかったので、テストを作りました。

 
Andrey Pogoreltsev:

そして最も重要なことは、開発者はジェネリックスを完成させ、内部にアロケーターを作り、カスタムオブジェクトをサポートすればよいということです。C++はすでに彼らのためにすべてを発明しました)そして、私たちは自転車を発明する必要はありません。

そんな簡単なことなら書いてしまえ。

 
Igor Makanu:

どのように漏れを発見したのですか?

ZS: これはテスト例で、MQLでリストをどう扱うかを考えなければならなかったので、テストを作りました。

AddValueではnewでオブジェクトのコピーを作成しますが、デストラクタでそれらを解放せず、ポインタリストをクリアするだけです。

 
TheXpert:

は、そんな簡単なことなら書く。

時間と必要性があれば、書きます。また、一般的な例として、1つのベアリングモデルしか必要としない場合、自社でベアリング工場を設立するのは良い考えとは言えません)