È possibile implementare un modello singleton in MQL4. - pagina 5

 
sergeev:

Cos'è questo?

Questo è quello che hai chiesto. Un'istanza di una classe... con un modificatore extern. Assurdo, naturalmente. Ma...

Questo è quello che hai detto tu. Ma non l'ho trovato necessario.

sergeev:

Ma non sarebbe una buona idea rendere esterna un'istanza di una struttura?

Non capisco cosa c'entri l'esterno? Non ho bisogno di "fare" alcuni dati per essere condivisi, quindi possono essere inclusi in qualsiasi altra classe. E queste variabili non devono perdere i loro valori durante l'esecuzione del programma, cioè devono essere statiche. Mi stai parlando di extern. Per quale motivo?

 
hoz:

Questo è quello che avete chiesto. Un'istanza di classe... con un modificatore extern. Assurdo, naturalmente. Ma...

ha compilato?


Non ho bisogno di "fare" dei dati da condividere,
come hai bisogno?
 
sergeev:

ha compilato?

Non ho controllato. Poiché ciò che è necessario non è ancora stato implementato.

sergeev:

Di cosa avete bisogno?

Ripeterò quello che mi serve... C'è una struttura i cui membri devono salvare i loro valori durante l'esecuzione del programma, ma quando si accede a qualsiasi metodo di qualsiasi classe che usa questa struttura, i membri possono essere modificati. Capisco che devono essere statici. Questi membri dovrebbero essere in una singola istanza. I membri di questa struttura saranno utilizzati da molte classi e dallo stesso Expert Advisor.

Una volta era così:

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;

Ma, in questo caso, è scomodo riferirsi a tali variabili, perché il "nome" è lungo. Cioè

Symbol_Properties::gd_Pt = 0;

Come implementare questo?

 
hoz:

Lasciatemi ripetere quello che mi serve... C'è una struttura i cui membri devono salvare i loro valori durante l'esecuzione del programma, ma quando si accede a qualsiasi metodo di qualsiasi classe che usa questa struttura, i membri possono essere modificati. Capisco che devono essere statici. Questi membri dovrebbero essere in una singola istanza. I membri di questa struttura saranno utilizzati da molte classi e dallo stesso Expert Advisor.

qual è il problema di fare riferimento a una singola variabile creata?

 

E fare riferimento a loro per NOME STRUTTURA.NOME MEMBRO?

Ma c'è una garanzia che questa variabile non perda il suo valore attuale in fase di esecuzione?

 
hoz:

E fare riferimento a loro per NOME STRUTTURA.NOME MEMBRO ?

nome della variabile.nome del membro.


Ma c'è una garanzia che questa variabile non perda il suo valore attuale durante l'esecuzione del programma?

per esempio, HQ?

avete l'esecuzione multi-threaded in EA?

Cosa vuol dire che si perderà? Quello che scrivi lì, perché dovrebbe perdersi?

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

Ognuno ha il diritto di vivere in un mondo di proprie illusioni,

ma distruggere il mondo dell'utentehoz èinsolitamente difficile

perché non puoi entrare nella sua testa e capire cosa sta immaginando.

"non perderà il suo valore attuale" - Pensate che le variabili siano create per perdere i loro valori?

Che in realtà:

Le variabili hannouno scopo, una durata di memorizzazione e un collegamento.

Impara cos'è: quale variabile ha quale ambito, quando è visibile, quando viene creata, quando viene distrutta e dove e quando può essere passata.

Brevemente sulla durata di conservazione:
static (variabile dichiarata fuori da tutte le funzioni o con lo specificatore static) - tempo di morte = fine dell'esistenza del programma

automatico (una variabile dichiarata all'interno di una funzione) - momento della morte = uscita dalla funzione in cui è stata creata

dinamico (variabile creata usando la parola chiave new) - tempo di morte = uso della parola chiave delete

 
sergeev:

avete il multithreading nell'EA?

Cosa vuol dire che si perderà? Quello che hai messo lì sarà lì, perché dovrebbe essere perso?


Apre la documentazione qui e vede che:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
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;

Se le variabili di classe o di struttura non perdono i loro valori durante l'esecuzione del programma, perché sono dichiarate come statiche qui?

Sono nella sezione pubblica, si può dire che come in struttura...

 
hoz:

Apre la documentazione qui e vede che:

Se le variabili di classe o di struttura non perdono i loro valori a runtime, perché sono dichiarate come statiche qui?

Sono nella sezione pubblica, si può dire che come in struttura...


Poi... Leggete la seconda frase del link che vi è stato dato.

Una statica in una classe ha un significato leggermente diverso da una statica in una funzione.

 
hoz:

Se le variabili di classe o di struttura non perdono i loro valori in fase di esecuzione, perché sono dichiarate statiche qui?

Sono nella sezione pubblica, si potrebbe dire come nella struttura...


O siete ottusi o non siete in grado di capire, scusate la franchezza, ma è scritto nero su bianco:

Per esempio, abbiamo una classeCParser, progettata per analizzare testi, e abbiamobisogno di contareil numero totale di parole e caratteri processati.È sufficiente dichiararestatici imembri della classe richiestie inizializzarli globalmente.Poi tutte le istanze della classeuseranno contatori di parole e caratteri comuni quando lavorano.

Dove mai c'è un riferimento a:

Le variabili di classe o di struttura perdono i loro valori in fase di esecuzione

Dice che preservando i principi OOP e non creando variabili globali, possiamo contare il numero di alcune parole con l'aiuto di un membro statico della classe,

(membro statico della classe) viene creato come una singola istanza e non dipende da quanti oggetti di una data classe vengono creati.

Motivazione: