Ist es möglich, ein Singleton-Muster in MQL4 zu implementieren. - Seite 2

 
Aber aus irgendeinem Grund treten bei der Kompilierung eine Menge Fehler auf. Was ist los?

Über welche Paternas können wir reden, wenn du die Grundlagen nicht kennst, du könntest nicht einmal ein statisches Klassenfeld korrekt erstellen.

(es gibt eine Menge Artikel über Singleton auf Hobber, wozu es dient, wie man es einsetzt und was daran falsch ist).

Singleton oder eine statische Klasse?
Verwendung des Singleton-Musters
 
ALXIMIKS:

(es gibt viele Artikel auf der Hubra über Singleton und wofür es ist, und wie, und was falsch ist mit ihm)

Singleton oder statische Klasse?
Singleton-Muster verwenden.

Glauben Sie, dass ich das noch nicht erlebt habe? Ich habe noch nicht ganz herausgefunden, wie das funktioniert. Die Sache ist die. Aber wie sich herausstellt, brauche ich kein Singleton. Ich werde mich also mit statischen Mitgliedern begnügen.

ALXIMIKS:

Wie können wir über Paternalien sprechen, wenn Sie die Grundlagen nicht kennen, Sie könnten nicht einmal ein statisches Klassenfeld korrekt erstellen.

Wenn Sie wissen, wie, können Sie es korrigieren. Gestern habe ich gemäß der Dokumentation geschrieben. Aber es gibt auch eine Menge Fehler. Zum Beispiel so:

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;

Was kommt als Nächstes?

 
static double       gd_Spread; 
int  Symbol_Properties::gd_Spread = 0;
nicht traurig über irgendetwas?
 
Естественно, создавать несколько объектов в разных классах данных структур крайне не рекомендуется.
Sagen Sie mir, was es damit auf sich hat. Und übersetzen Sie das obige Zitat etwas deutlicher, ich verstehe leider nichts, danke.
 

Ich habe den falschen abgeworfen. Auf jeden Fall ist die aktuelle Version hier korrekt:

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;

Ich schätze, dass ich jetzt jede statische Variable mit einem so langen Namen bezeichnen muss?

Symbol_Properties::gd_Spread = 0;

Oder ist es einfacher, es so zu implementieren, dass nach der Beschreibung der Variableninitialisierungsstruktur, wenn sie initialisiert wird, das entsprechende statische Mitglied einer Variablen vom Typ zugewiesen werden sollte:

double Spread = Symbol_Properties::gd_Spread = 0;

Und im Code wird dann über diese Variable auf die entsprechenden statischen Variablen verwiesen, richtig?

 
hoz:

Ja, nun... Die Hauptsache ist, dassVadim Bescheid weiß :)))))

Ja, das ist die normale Art von Dialog:

F: Meine Freunde haben mir ein paar Süßigkeiten empfohlen. Das ist genau das, was ich brauche!

Ich: (Verblüfft... Was hat das mit Süßigkeiten zu tun? Vielleicht geht B zu einer Geburtstagsfeier eines Freundes oder möchte die Kinder einladen, vielleicht seine eigenen oder die von jemand anderem? Vielleicht hat er sich selbstständig gemacht und verkauft jetzt Süßigkeiten. Vielleicht war es die letzte Süßigkeit in Weißrussland, und B ist jetzt ein Monopolist. Was ist, wenn B Süßigkeiten vermisst? Viele andere Gedanken gingen mir zum Thema "Warum Süßigkeiten und was man damit machen kann" durch den Kopf. Wie schon bei B versagten meine telepathischen Fähigkeiten wieder einmal. Es fiel mir nichts ein).

Keinen Schimmer.

Für den Fall der Fälle. Es ist unhöflich, Dialoge ohne die Zustimmung aller an dem Gespräch Beteiligten zu veröffentlichen. Das ist bösartig.
 

1. Wozu ist das alles gut?

2. Es gibt zwei Möglichkeiten, auf die statischen Felder einer Klasse zuzugreifen (die Struktur ist standardmäßig und durch Vererbung eine Klasse mit öffentlichem Zugriff):

(a) Über den Klassennamensraum - z. B.Symbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - derSpread-Wert wird gleichgd_Spread aus der KlasseSymbol_Properties

(double Spread = Symbol_Properties::gd_Spread =0) Wert vongd_Spread aus derKlasse Symbol_Properties undSpread-Wert wird gleich 0

b) ein Objekt der Klasse (z. B.Symbol_Properties obj; ) erstellen und über dieses Objekt auf ein gewöhnliches Feld der Klasse verweisen

(double Spread = obj.gd_Spread)

(double Spread = obj.gd_Spread =0)

 
ALXIMIKS:

1. Wozu ist das alles gut?

Die Bequemlichkeit... Denn wenn diese Variablen nur in einer einzigen Instanz verwendet werden, warum sollte ich dann ein Objekt erstellen? Außerdem ist es viel bequemer , Code zu lesen, wenn auf eine Variable verwiesen wird, wenn VARIABLE.VARIABLE NAME.

ALXIMIKS:

2. Es gibt zwei Möglichkeiten, auf die statischen Felder einer Klasse zuzugreifen (Struktur ist eine Klasse mit standardmäßig öffentlichem Zugriff und Vererbung)

(a) über den Klassennamensraum - z. B.Symbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - derSpread-Wert wird gleichgd_Spread aus der KlasseSymbol_Properties

(double Spread = Symbol_Properties::gd_Spread =0)- dergd_Spread-Wert aus der KlasseSymbol_Properties und derSpread-Wert wird gleich 0

Ganz genau! Deshalb habe ich es auf diese Weise gemacht. Ich initialisiere die Variable, die sich auf die Variable dieser Struktur bezieht, sofort mit Null und dann wird sie dauerhaft im Speicher abgelegt. Das ist logisch, denn diese Variablen werden nur in einem einzigen Fall benötigt. Deshalb gibt es in diesem Fall keinen Grund, ein anderes Objekt zu erstellen. Schließlich ist es ja logisch... Stimmen Sie mir da nicht zu?

ALXIMIKS:

b) Erstellen Sie ein Klassenobjekt (z. B.Symbol_Properties obj; ) und verweisen Sie über dieses Objekt auf das Feld als normales Klassenfeld.

Dann sind die Variablen nicht statisch, und es gibt keine Garantie, dass sie ihre Werte während des Programmlaufs nicht beibehalten.
 
Was ist falsch an STATISCHEN VARIABELN oder Konstanten zum Beispiel?
 

STATE VARIABLE hat mir nicht gefallen, weil sie in verschiedenen Klassen verwendet werden. Also habe ich sie in Gruppen zusammengefasst.

Konstanten sind nicht beliebt, weil Konstanten ihre Werte nicht ändern, während diese Variablen ihre Werte ändern können sollten.