記事"オブジェクト指向プログラミング"についてのディスカッション - ページ 3

 

1) ここにエラーがあると思いました:

セクション: コンストラクタにパラメータを渡す

「Init()関数はセクション セクションに確保されています。 セクションに確保されます。"

可能です:

Init() 関数は public セクションに確保 されている。

2) 「オブジェクト配列」セクションの「クラスインスタンス(オブジェクト)で配列を作成する」機能の使用例を教えてください。残念ながら「何に使うのか」がわかりません。

3) 「カプセル化(private、protected、public)の詳細」の項で、ベースクラス->クラスの子孫について一応触れています。おそらく、このデータ(クラス Class:public CBase)はセクションの最初に説明されるべきでしょう。

4)は見つけられませんでした:Fig.6.余分な」関数(赤矢印)の可視性は、クラスがロードされるポインタのタイプによって決定される。この例は付録のOOP_sDefaultVirtual_1.mq5にあります。

5) ライブラリとは何かを明確に示すものは見つかりませんでした。インクルード・ファイルと似ていますが、インクルード・ファイルはソースとして保存され、ライブラリーはコンパイルされたDLLとして保存されるのでしょうか?

記事をありがとうございました!特に、資料の一貫したプレゼンテーションに満足しています。

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) ここにエラーがあると思いました:

セクション: コンストラクタにパラメータを渡す

「Init()関数はセクション セクションに確保されています。 セクションに確保されます。"

可能です:

Init() 関数は public セクションに確保 されている。

2) 「オブジェクト配列」セクションの「クラスインスタンス(オブジェクト)で配列を作成する」機能の使用例を教えてください。残念ながら「何に使うのか」がわかりません。

3) 「カプセル化(private、protected、public)の詳細」の項で、ベースクラス->クラスの子孫について一応触れています。おそらく、このデータ(クラス Class:public CBase)はセクションの最初に説明されるべきでしょう。

4)は見つけられませんでした:Fig.6.余分な」関数(赤矢印)の可視性は、クラスがロードされるポインタのタイプによって決定される。この例は付録のOOP_sDefaultVirtual_1.mq5にあります。

5) ライブラリとは何かを明確に示すものは見つかりませんでした。インクルード・ファイルと似ていますが、インクルード・ファイルはソースとして保存され、ライブラリーはコンパイルされたDLLとして保存されるのでしょうか?

記事をありがとうございました!特に、資料の一貫したプレゼンテーションに満足しています。

1.はい。

2.オブジェクトの配列」のセクションに例がありますが、実際にはセクション全体が説明付きの例です。

3.プログラム操作のロジックを変更するためにOOPを使用する」のセクションで考慮されています。

4.この例はファイルの付録の中にあります。という言葉は、そのファイルにセクションヘッダで示されたセクションの例が含まれていることを意味する。これは、例題が記事の中で書かれていることすべてを複製しているという意味ではありません。これらの例は全く存在しないかもしれない。しかし、例はそこにあり、あなたはそれを基礎として、実験することができる。記事は一次的なものであり、例は二次的なものである。

5.Уже давно указано:http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

削除済み  
ありがとう。
削除済み  

非常に興味深い記事で、有能な「わかりやすい」言葉で書かれている。

著者に感謝する。

 
ありがとう。この記事はとても役に立ったよ。私はEAをOOPに移行していて、クラスの配列について特別な問題を抱えていました。動的ポインタについては、明確かつ完璧に説明されています。本当にありがとう。
 
とてもよく書かれた記事だ!著者のおかげでようやく気づいたよ。
 

この記事からコピーした2つのコード例があります。 どちらもクラスへのポインターの配列を作成し、終了時にそれらを削除します。 しかし、1つはメモリ・リークを伴って終了し、もう1つはメモリ・リークを伴わずに終了します。唯一の違いは、2番目の例ではデストラクタ内の'Alert'がコメントアウトされていることです。唯一の違いは、2番目の例では、デストラクタ内の'Alert'がコメントアウトされていることです。 デストラクタ内の'Alert'が削除されると、メモリー・リークが発生します。 これは非常に奇妙です。 どなたか説明できますか? 助けてください、これには頭がおかしくなりそうです。

この記事のコード例の最後には、私が書いた極めて単純なコード例も載せていますが、そこにもメモリー・リークがあります。 もう一度言いますが、なぜでしょうか? この最後のコード例には複雑なところは何もありません.. .。


このコードはメモリー・リークなしで動作する:

class CName
  {
private:
   int               m_arg; // インスタンスの変数
public:
                     CName(int aArg)
     { // コンストラクタ
      m_arg=aArg;
      //Alert("コンストラクタ "+IntegerToString(m_arg));
     }
                    ~CName()
     { // デストラクタ
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // 配列

void OnInit()
  {
// クラスの10個のインスタンスをロードするための配列を準備する。
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // インスタンスをロードする
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // 最後に、すべてのインスタンスをメモリからアンロードする。
      delete(cname[i]);
     }
}

エキスパート・ログからのメッセージ。メモリー・リークはない:

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 2

EN 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 デストラクタ 9

このコードはメモリ・リークを伴って終了する!唯一の違いは、デストラクタの'Alert'をコメントアウトしていることだ。

class CName
     {
private:
   int               m_arg; // インスタンスの変数
public:
                     CName(int aArg)
     { // コンストラクタ
      m_arg=aArg;
      //Alert("コンストラクタ "+IntegerToString(m_arg));
     }
                    ~CName()
     { // デストラクタ
      //Alert("デストラクタ "+IntegerToString(m_arg));
     }
  };
//---

CName *cname[]; // 配列

void OnInit()
  {
// クラスの10個のインスタンスをロードするための配列を準備する。
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // インスタンスをロードする
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // 最後に、すべてのインスタンスをメモリからアンロードする。
      delete(cname[i]);
     }
}

エキスパート・ログからのメッセージ、リークしたメモリーに注意:

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 未削除のオブジェクトが 10 個残っている。

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 CName 型のオブジェクトが 10 個残っています。

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 バイトのリークメモリ

最後の 例は、私のコードです。非常に単純ですが、メモリ・リークで終了します。

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

エキスパート・ログからのメッセージ、リークしたメモリーに注意:

MR 0 tester (EURUSD,M1) 14:07:23 Last Error- 0現在時刻: 2013.02.06 23:07:23

FL 1 tester (EURUSD,M1) 14:07:23 10 undeleted objects left

KN 1 tester (EURUSD,M1) 14:07:23 10 objects of type CCandleStick left

JS 1 tester (EURUSD,M1) 14:07:23 160 バイトのメモリがリークした。



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

つの例がある...

つのバランサーをチェックした。3つとも同じ。すべて正常。どれも漏れはない。これらの例では、配列があり、配列の各要素にインスタンスがあり、終了時にすべてのオブジェクトを削除しています。オブジェクトは自分自身のコピーを作成しないので、同じものを削除しないわけにはいかない。もしオブジェクトが自分自身のコピーを作成したら、削除が困難になり、何かを見逃すことが非常に簡単になります。本当に漏れているバリアントを表示する。

コードを挿入 するにはSRCボタンを使ってください(ファイルを添付するのがよいでしょう)。

英語ですみません:)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
OOPは現代的なプログラム言語だが、それを理解しコードを書くには多くの時間と労力が必要だ。良い記事をありがとう
 
Integer:

3つすべてのバランタをチェックした。3つとも同じだ。すべて正常。どれもリークはない。これらの例では、配列があり、配列の各要素にインスタンスがあり、終了時にすべてのオブジェクトを削除しています。オブジェクトは自分自身のコピーを作成しないので、同じものを削除しないわけにはいかない。もしオブジェクトが自分自身のコピーを作成したら、削除が困難になり、何かを見逃すことが非常に簡単になります。本当に漏れているバリアントを表示する。

コードを挿入 するにはSRCボタンを使ってください(ファイルを添付するのがよいでしょう)。

英語ですみません:)

返信に時間を割いていただき、ありがとうございます。私はこのフォーラムにあまり詳しくないので、おそらく削除された別のコメントでした。 しかし、私は古いバージョンのMetaTraderで古いコンピュータ上ですべての3つの例を実行しようとしました。 古いバージョンでは、3つすべてが正常に動作するように見えました。 それはエキスパートログの「メモリリーク」エラーを生成しませんでした、私はそれがビルド560だったと思う?新しいビルドの後、同じメモリリーク問題が発生しました。 古いビルドでは、メモリリーク問題は機能ではなかったため、報告されなかった可能性がありますか? どのビルドを使用していますか? また、ありがとうございます。