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

 
Vladimir Simakov:
例えば0.15など、ロットがない前提で考えています。少なくとも私は聞いたことがありません。もしそうなら、変えます。

ありえないとは思いますが、いつも完璧な解答を求めますよね ))))

OK、最大の問題ではないのですが、自分で問題を作ってしまいました......。完璧なOOPが欲しかったが、不必要な呼び出しがなく、すべてが最適だった

クラスのインスタンスを5つ作りたいのですが、クラスのフィールドは一度だけ初期化する必要があります - これらは端末環境を含んでおり、プログラムの実行中に変わることはありません。

string         Language;

static string Language; - と宣言すると、unresolved static variable 'A::Language' というエラーが発生します。

以下はその一例です。

//+------------------------------------------------------------------+
class A
  {
public:
   string         Language;
                     A() { Print(__FUNCTION__); Language = TerminalInfoString(TERMINAL_LANGUAGE); }

  };
//+------------------------------------------------------------------+
class B:public A
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

このフォームで文字列Languageを5回初期化する - これは間違っており、静的な修飾子で コンパイルされません

と、Language変数を5つも用意する必要はないのです- Bクラスでクラスのインスタンスを宣言してみた - 同じこと 5 言語変数が持つ

2019.08.29 12:44:58.384 tst__ EURUSD,M15:初期化されました。

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

 
Igor Makanu:

ありえないとは思いますが、いつも完璧な解答を求めますよね ))))

OK、最大の問題ではないのですが、自分で問題を作ってしまいました......。完璧なOOPが欲しかったが、不必要な呼び出しがなく、すべてが最適だった

クラスのインスタンスを5つ作りたいのですが、クラスのフィールドを一回だけ初期化する必要があります - これには端末環境が含まれており、プログラムの実行中に変わることはありません。

static string Language; - と宣言すると、unresolved static variable 'A::Language' というエラーが発生します。

以下はその一例です。

このフォームで文字列Languageを5回初期化する - 正しくありませんし、静的修飾子で コンパイルされません

2019.08.29 12:44:58.384 tst__ EURUSD,M15:初期化されました。

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

class Test
  {
private:
   static const string Language;
public:
                     Test(void){}
                    ~Test(void){}
  };
static const string Test::Language=::TerminalInfoString(TERMINAL_LANGUAGE);
 
Andrey Barinov:

なるほど、そういう手もあるのか

しかし、すべてを1つのクラスにまとめたい。私の例では、クラスBがあり、Bのインスタンスが5つ欲しい。しかし、Languageを 5回も初期化したくないので、各インスタンスにLanguage変数を持ち たくない。

余分なLanguageを取り除くにはどうしたらよいですか?

 
Igor Makanu:

なるほど、そういう手もあるのか

しかし、すべてを1つのクラスにまとめたい。私の例では、クラスBがあり、Bのインスタンスが5つ欲しい。しかし、 Languageを 5回も初期化 したくないので、各インスタンスにLanguage 変数を持ち たくない。

余分なLanguageを取り除くにはどうしたらいいですか?

継承する。こうすることで、一度だけ初期化されることになります。

 
Igor Makanu:

ありえないとは思いますが、いつも完璧な解答を求めますよね ))))

まあ、一番の問題ではないのですが、自分で問題を作ってしまったので......。完璧なOOPが欲しかったが、不必要な呼び出しがなく、すべてが最適だった

クラスのインスタンスを5つ作りたいのですが、クラスのフィールドは一度だけ初期化する必要があります - これらは端末環境を含んでおり、プログラムの実行中に変わることはありません。

static string Language; - と宣言すると、unresolved static variable 'A::Language' というエラーが発生します。

以下はその一例です。

このフォームで文字列Languageを5回初期化する - これは間違っており、静的な修飾子で コンパイルされません

と、Language変数を5つも用意する必要はないのです- Bクラスでクラスのインスタンスを宣言してみた - 同じこと 5 言語変数が持つ

2019.08.29 12:44:58.384 tst__ EURUSD,M15:初期化されました。

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

今、携帯電話からです。夕方になったら思い出して、解き方を教えてあげるよ。
 
Andrey Barinov:

継承する。本形態では、一度だけ初期化されます。

私のための作品

//+------------------------------------------------------------------+
string MyTerminalInfoString()
  {
   Print(__FUNCTION__);
   return("ru");
  }
//+------------------------------------------------------------------+
class CLang
  {
protected:
   static const string Language;
public:
                     CLang(void) {Print(__FUNCTION__);}
                    ~CLang(void) {}
  };
//+------------------------------------------------------------------+
static const string CLang::Language=MyTerminalInfoString();
//+------------------------------------------------------------------+
class B:public CLang
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

2019.08.29 13:24:19.690 tst__ EURUSD,M15:初期化されました。

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: MyTerminalInfoString


少なくとも myTerminalInfoString() が一度だけ呼ばれる。


だから、なんとなくシングルトンを手に入れた

ありがとうございました。

 
Vladimir Simakov:
今、携帯電話からです。夕方になったら思い出して、解き方を教えてあげるよ。

面倒でなければOKです。

また、Singletonのテーマは私にとってかなり新しいもので、創造の余地があります。

 
Igor Makanu:

面倒でなければOKです。

また、Singletonのテーマは私にとってかなり新しいもので、創造の余地があります。

では、シングルトンがいいのか、それともオブジェクト用の一般的なフィールドがいいのか?
 
Vladimir Simakov:
では、オブジェクトの共通フィールドは必要なのでしょうか?

とは言い難いのですが ))))

言葉にしてみます。

- コンストラクタで初期化されるクラスが欲しいのですが、このクラスはメソッドを持ちません。

- クラスのインスタンスの配列を使用します - 少なくとも5つ

- いちいち端末環境を呼び出さないと注文が開けないのは困る。 そこで、SYMBOL_VOLUME_MAX、Symbol、SYMBOL_VOLUME_MIN、SYMBOL_VOLUME_STEPの桁数を定数値としてクラスで使用したい。

- 変数を最適に使いたい、つまり前の段落の定数と重複しないようにしたい。


それは私がそれをすべて見る方法についてですが、一般的に、問題は今、クラス自体の正しい構造に低減され、それはすでに継承する必要が判明したとして、そのSYMBOL_VOLUME_MAX 、シンボル、 SYMBOL_VOLUME_MIN...です。を1つ持っていると、やはりエラー出力でつまずくと思うので、私のPrintLastError.mqhhttps://www.mql5.com/ru/code/24829# から以下のようなものを使用する予定です。

 
静的 変数は、たとえ継承がなくても、すべてのインスタンスで同じになります。