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

 
sergeev:

Was ist das?

Das ist es, worum Sie gebeten haben. Eine Instanz einer Klasse... mit einem externen Modifikator. Absurd, natürlich. Aber...

Das haben Sie gesagt. Aber ich hielt es nicht für notwendig.

sergeev:

Aber wäre es nicht eine gute Idee, eine Instanz einer Struktur extern zu machen?

Ich verstehe nicht, was Externes überhaupt damit zu tun hat? Ich muss einige Daten nicht für die gemeinsame Nutzung "herstellen", damit sie in andere Klassen aufgenommen werden können. Und diese Variablen dürfen ihren Wert während der Programmausführung nicht verlieren, d.h. sie müssen statisch sein. Du erzählst mir etwas über Externe. Und wozu?

 
hoz:

Das ist es, worum Sie gebeten haben. Eine Klasseninstanz... mit einem externen Modifikator. Absurd, natürlich. Aber...

Wurde es überhaupt kompiliert?


Ich muss keine Daten "machen", die ich weitergeben möchte,
wie Sie es brauchen?
 
sergeev:

Wurde es überhaupt kompiliert?

Ich habe es nicht überprüft. Denn das, was notwendig ist, wurde noch nicht umgesetzt.

sergeev:

Was brauchen Sie?

Ich werde wiederholen, was ich brauche... Es gibt eine Struktur, deren Mitglieder ihre Werte während der Ausführung des Programms speichern müssen, aber wenn auf eine Methode einer beliebigen Klasse, die diese Struktur verwendet, zugegriffen wird, können die Mitglieder geändert werden. Ich verstehe, dass sie statisch sein müssen. Diese Mitglieder sollten sich in einer einzigen Instanz befinden. Die Mitglieder dieser Struktur werden von vielen Klassen und vom Expert Advisor selbst verwendet.

Das war früher einmal 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;       // Уровень заморозки ордеров в пунктах
};

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

In diesem Fall ist es jedoch unpraktisch, auf solche Variablen zu verweisen, da der "Name" lang ist. D.h:

Symbol_Properties::gd_Pt = 0;

Wie kann man das umsetzen?

 
hoz:

Lassen Sie mich wiederholen, was ich brauche... Es gibt eine Struktur, deren Mitglieder ihre Werte während der Programmausführung speichern müssen, aber wenn auf eine Methode einer beliebigen Klasse, die diese Struktur verwendet, zugegriffen wird, können die Mitglieder geändert werden. Ich verstehe, dass sie statisch sein müssen. Diese Mitglieder sollten sich in einer einzigen Instanz befinden. Die Mitglieder dieser Struktur werden von vielen Klassen und vom Expert Advisor selbst verwendet.

Was ist das Problem, wenn man sich auf eine einzige erstellte Variable bezieht?

 

Und verweisen auf sie durch STRUCTURE NAME.MEMBER NAME?

Aber gibt es eine Garantie, dass diese Variable ihren aktuellen Wert zur Laufzeit nicht verliert?

 
hoz:

Und verweisen auf sie durch STRUCTURE NAME.MEMBER NAME ?

Variablenname.Mitgliedsname.


Aber gibt es eine Garantie, dass diese Variable ihren aktuellen Wert während der Programmausführung nicht verliert?

z. B. HQ?

Verfügen Sie über eine Multithreading-Ausführung in EA?

Was meinen Sie damit, dass es verloren geht? Warum sollte das, was Sie da schreiben, verloren gehen?

 
в чем проблема обращаться к единственной созданной переменной?

Jeder hat das Recht, in einer Welt der eigenen Illusionen zu leben,

aberes ist ungewöhnlich schwierig, die Welt deshoz-Benutzerszu zerstören

weil man nicht in seinen Kopf eindringen und herausfinden kann, was er sich vorstellt.

"wird seinen aktuellen Wert nicht verlieren" - Sie glauben, dass Variablen geschaffen werden, um ihre Werte zu verlieren?

Was in Wirklichkeit:

Variablen habeneinen Umfang, eine Speicherdauer und eine Verknüpfung.

Lernen Sie, was das ist: Welche Variable hat welchen Umfang, wann ist sie sichtbar, wann wird sie erstellt, wann wird sie zerstört und wohin und wann kann sie übergeben werden.

Kurze Angaben zur Speicherdauer:
statisch (Variable, die außerhalb aller Funktionen oder mit statischem Spezifizierer deklariert wird) - Todeszeitpunkt = Beendigung der Programmexistenz

automatisch (eine innerhalb einer Funktion deklarierte Variable) - Todeszeitpunkt = Verlassen der Funktion, in der sie erstellt wurde

dynamisch (Variable wird mit dem Schlüsselwort new erstellt) - Todeszeitpunkt = Verwendung des Schlüsselworts delete

 
sergeev:

Haben Sie Multithreading in Ihrem EA?

Was meinen Sie damit, dass es verloren gehen wird? Was Sie dort platziert haben, wird dort sein, warum sollte es verloren gehen?


Öffnet die Dokumentation hier und sieht das:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;

Wenn Klassen- oder Strukturvariablen ihre Werte während der Programmausführung nicht verlieren, warum werden sie dann hier als statisch deklariert?

Sie sind im öffentlichen Bereich, man kann sagen, wie in der Struktur...

 
hoz:

Öffnet die Dokumentation hier und sieht das:

Wenn Klassen- oder Strukturvariablen ihre Werte zur Laufzeit nicht verlieren, warum werden sie dann hier als statisch deklariert?

Sie sind im öffentlichen Bereich, man kann sagen, wie in der Struktur...


Dann... Lesen Sie den zweiten Satz in dem Link, den Sie erhalten haben.

Ein static in einer Klasse hat eine etwas andere Bedeutung als ein static in einer Funktion.

 
hoz:

Wenn Klassen- oder Strukturvariablen ihre Werte zur Laufzeit nicht verlieren, warum werden sie dann hier als statisch deklariert?

Sie sind im öffentlichen Teil, man könnte sagen, in der Struktur...


Sie sind entweder begriffsstutzig oder begriffsstutzig, entschuldigen Sie, dass ich so unverblümt bin, aber es steht schwarz auf weiß geschrieben:

Wir haben zum Beispiel eineCParser-Klasse, die für das Parsen von Texten gedacht ist, und wirmüssendie Gesamtzahl der verarbeiteten Wörter und Zeichenzählen.Es genügt, die erforderlichenKlassenmitgliederalsstatischzu deklarierenund sie globalzu initialisieren.Dannwerdenalle Instanzen der Klassegemeinsame Wort- und Zeichenzähler bei der Arbeitverwenden.

Wo immer ein Verweis auf:

Klassen- oder Strukturvariablen verlieren ihre Werte zur Laufzeit

Es besagt, dass wir unter Wahrung der OOP-Prinzipien und ohne globale Variablen zu erstellen, die Anzahl einiger Wörter mit Hilfe eines statischen Klassenmitglieds zählen können,

es(statisches Klassenmitglied) wird als einzelne Instanz erstellt und hängt nicht davon ab, wie viele Objekte einer bestimmten Klasse erstellt werden.