MQL4でシングルトンパターンを実装することは可能ですか? - ページ 2

 
しかし、なぜかコンパイル時にエラーが多発する。どうしたんですか?

基本的なこともわからず、静的なクラスフィールドも正しく作れず、何のパータンを語れるのでしょう。

(hobberにはsingletonに関する記事がたくさんあり、何のためにあるのか、どうすればいいのか、何が問題なのかが書かれています)。

シングルトンかスタティッククラスか?
シングルトンパターンの使用
 
ALXIMIKS:

(Hubraにはシングルトンに関する記事がたくさんあり、何のため、どのように、何が問題なのかが書かれています)

シングルトンかスタティッククラスか?
Singletonパターンを使用する。

私が遭遇していないとでも思っているのでしょうか。その仕組みはまだよく分かっていないんです。ここからが本題です。しかし、結論から言うと、シングルトンは必要ないんです。だから、スタティック・メンバーでやりくりする。

ALXIMIKS

基本的なこともわからず、静的なクラスフィールドも正しく作れず、よく父系を語れるものだ。

方法を知っている場合は、修正することができます。昨日はドキュメントにしたがって書きました。でも、エラーも多いんですよ。こんな感じ。

struct Symbol_Properties
{
   static datetime    gdt_Quote;           // Время поступления последней котировки
   static double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   static double      gd_Spread;           // Размер спреда в пунктах
   static double      gd_Swap;             // Своп
   static double      gd_Comission;        // Комиссия
   static double      gd_Pt;               // Величина одного пункта
   static int         gi_Digits;           // Количество знаков в цене после запятой
   static int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   static int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};
int Symbol_Properties::gdt_Quote = 0;
int Symbol_Properties::gda_Price = 0;
int Symbol_Properties::gd_Spread = 0;
int Symbol_Properties::gd_Swap = 0;
int Symbol_Properties::gd_Comission = 0;
int Symbol_Properties::gd_Pt = 0;
int Symbol_Properties::gi_Digits = 0;
int Symbol_Properties::gi_StopLevel = 0;
int Symbol_Properties::gi_FreezLevel = 0;

次はどうする?

 
static double       gd_Spread; 
int  Symbol_Properties::gd_Spread = 0;
何も悲しくない?
 
Естественно, создавать несколько объектов в разных классах данных структур крайне не рекомендуется.
これはどういうことなのか、教えてください。そして、上記の引用文をもっと分かりやすく訳してください、残念ながら私は何も理解していません、ありがとうございました。
 

間違えて投げ捨ててしまった。とにかく、現在のバージョンはここが正しいのです。

struct Symbol_Properties
{
   static datetime    gdt_Quote;           // Время поступления последней котировки
   static double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   static double      gd_Spread;           // Размер спреда в пунктах
   static double      gd_Swap;             // Своп
   static double      gd_Comission;        // Комиссия
   static double      gd_Pt;               // Величина одного пункта
   static int         gi_Digits;           // Количество знаков в цене после запятой
   static int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   static int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};

datetime   Symbol_Properties::gdt_Quote = 0;
double     Symbol_Properties::gda_Price [2] = {0.0, 0.0};
double     Symbol_Properties::gd_Spread = 0;
double     Symbol_Properties::gd_Swap = 0;
double     Symbol_Properties::gd_Comission = 0;
double     Symbol_Properties::gd_Pt = 0;
int        Symbol_Properties::gi_Digits = 0;
int        Symbol_Properties::gi_StopLevel = 0;
int        Symbol_Properties::gi_FreezLevel = 0;

これで、各スタティック変数をこのような長い名前で参照しなければならなくなったのでは?

Symbol_Properties::gd_Spread = 0;

それとも、変数の初期化 構造を記述した後、初期化する 際に、対応する静的メンバを何らかの型の変数に代入するように実装するのが簡単でしょうか?

double Spread = Symbol_Properties::gd_Spread = 0;

そして、コードの中で、この変数を使って、対応するスタティック変数を参照しますよね?

 
hoz:

ええ、まあ...要はVadimが知って いるということです :))))))。

ええ、それが普通の台詞なんです。

Q:友達にお菓子を勧められました。まさに私が求めていたものです

私:(困惑・・・。お菓子と何の関係があるのですか?Bは友達の誕生日会に行くとか、自分の子供か誰かの子供をもてなしたいとか?もしかしたら、商売を始めて、今はお菓子を売っているのかもしれませんね。もしかしたら、ベラルーシでは最後のお菓子で、Bが独占しているのかもしれませんね。Bがお菓子を逃したらどうする?他にも「なぜお菓子なのか、どうすればいいのか」というテーマで、いろいろな考えが頭の中を駆け巡りました。Bの時と同じように、またしても私のテレパシー能力では無理だった。何も思い浮かばなかった)。

手がかりがない。

念のため。対談の関係者全員の同意なく、対談を掲載するのは失礼にあたります。意地悪なんです。
 

1.これは何のためにあるのでしょうか?

2.クラスの静的フィールドにアクセスする方法は2つあります(構造体はデフォルトと継承でパブリックアクセスクラスとなります)。

(a) クラスの名前空間を通して - 例:Symbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) -Spreadの値はSymbol_Properties クラスのgd_Spreadと等しく なります。

(double Spread = Symbol_Properties::gd_Spread =0)Symbol_Properties クラスのgd_Spread の値でSpread の値が 0 となる。

b)クラスのオブジェクト(例えば、Symbol_Properties obj;)を作成し、このオブジェクトを通して、クラスの通常のフィールドとして参照する。

(double スプレッド = obj.gd_Spread)

(double スプレッド = obj.gd_Spread =0)

 
ALXIMIKS:

1.何のために?

利便性...結局のところ、これらの変数が単一のインスタンスで使用されるのであれば、なぜオブジェクトを作成する必要があるのでしょうか?それに、変数を参照するときに、VARIABLE.VARIABLE NAMEがあれば、コードを読むときに 便利です。

ALXIMIKS:

2.クラスの静的フィールドにアクセスする方法は2つあります(構造体はデフォルトでパブリックアクセスが可能なクラスであり、継承されます)。

(a) クラスの名前空間を介して - 例:Symbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) -Spreadの値はSymbol_Properties クラスのgd_Spreadと等しく なります。

(double Spread = Symbol_Properties::gd_Spread =0)-Symbol_Properties クラスのgd_Spread値とSpread値が 0 に等しくなるようにします。

そのとおりです。だから、そういうふうにしたんです。この構造体の変数を参照する変数をすぐにゼロで初期化し、メモリに永久保存しているのです。これらの変数は1つのインスタンスで必要とされるため、論理的なものです。だから、この場合、別のオブジェクトを作る必要はないのです。結局のところ、論理的に...賛同していただけないのですか?

ALXIMIKS:

b) クラスオブジェクトを作成し(例えばSymbol_Properties obj;)、 このオブジェクトを通して通常のクラスフィールドとして参照する。

そうすると、変数は静的ではなく、プログラムの実行に伴ってその値が保持されないという保証はない。
 
STATIC VARIABLEや、例えば定数では何がいけないのでしょうか?
 

STATE VARIABLEは、異なるクラスで使用されているため、私は気に入りませんでした。だから、なんとなくグルーピングしてみたんです。

定数は値が変化しないので好まれないが、これらの変数は値を変化させることができるはずである。