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

 
Ma per qualche motivo ci sono molti errori al momento della compilazione. Cosa c'è che non va?

Di che paternità possiamo parlare se non conosci le basi, non potresti nemmeno creare correttamente un campo statico di classe.

(ci sono un sacco di articoli su singleton su hubrabs, e per cosa, e come, e cosa c'è di sbagliato).

Singleton o una classe statica?
Usare il modello singleton
 
ALXIMIKS:

(ci sono un sacco di articoli su singleton su hubrabs e a cosa serve, e come, e cosa c'è di sbagliato)

Singleton o classe statica?
Usare il pattern Singleton.

Pensate che non l'abbia mai incontrato? Non ho ancora capito come funziona. Ecco come stanno le cose. Ma, a quanto pare, non ho bisogno di un singleton. Quindi mi accontento dei membri statici.

ALXIMIKS:

Come possiamo parlare di paternali se non conosci le basi, non potresti nemmeno creare correttamente un campo statico di classe.

Se sapete come fare, potete correggerlo. Ieri ho scritto secondo la documentazione. Ma ci sono anche molti errori. Come questo:

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;

Cosa c'è dopo?

 
static double       gd_Spread; 
int  Symbol_Properties::gd_Spread = 0;
non sei triste per niente?
 
Естественно, создавать несколько объектов в разных классах данных структур крайне не рекомендуется.
Dimmi di cosa si tratta. E tradurre la citazione di cui sopra più chiaramente, ahimè non capisco nulla, grazie.
 

Ho buttato via quello sbagliato. Comunque, la versione attuale è corretta qui:

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;

Immagino che ora dovrò fare riferimento ad ogni variabile statica con un nome così lungo?

Symbol_Properties::gd_Spread = 0;

O è più facile implementarlo in modo che dopo la descrizione della struttura di inizializzazione della variabile, quando viene inizializzata, il membro statico corrispondente dovrebbe essere assegnato a qualche variabile di tipo:

double Spread = Symbol_Properties::gd_Spread = 0;

E poi nel codice ci si riferisce alle corrispondenti variabili statiche con questa variabile, giusto?

 
hoz:

Sì, beh... La cosa principale è cheVadim sa :)))))

Sì, questo è il tipo di dialogo normale:

D: I miei amici mi hanno consigliato delle caramelle. È proprio quello di cui ho bisogno!

Io: (Perplesso... Cosa ha a che fare questo con le caramelle? Forse B sta andando alla festa di compleanno di un amico o vuole regalare i bambini, forse i suoi o quelli di qualcun altro? Forse si è messo in affari e ora vende caramelle. Forse era l'ultima caramella in Bielorussia e B è ora un monopolista. E se a B mancassero i dolci? Un sacco di altri pensieri mi sono passati per la testa sul tema "perché le caramelle e cosa farci". Ancora una volta, come prima con B, le mie capacità telepatiche mi hanno deluso. Non mi è venuto in mente niente).

Non un indizio.

Non si sa mai. È scortese postare i dialoghi senza il consenso di tutte le persone coinvolte nella conversazione. È meschino.
 

1. A cosa serve tutto questo?

2. Ci sono due modi per accedere ai campi statici di una classe (la struttura è una classe ad accesso pubblico per default e per ereditarietà):

(a) Attraverso lo spazio dei nomi della classe - ad esempioSymbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - il valoreSpread diventa uguale agd_Spread della classeSymbol_Properties

(double Spread = Symbol_Properties::gd_Spread =0) valore digd_Spread dallaclasse Symbol_Properties e il valoreSpread diventa uguale a 0

b) creare un oggetto di classe (per esempio,Symbol_Properties obj; ) e riferirsi ad esso come un campo abituale della classe attraverso questo oggetto

(doppio Spread = obj.gd_Spread)

(double Spread = obj.gd_Spread =0)

 
ALXIMIKS:

1. A cosa serve tutto questo?

Convenienza... Dopo tutto, se queste variabili sono usate in una singola istanza, perché dovrei creare un oggetto? Inoltre, è molto più comodo leggere il codice quando si fa riferimento a una variabile, se NOME DELLA VARIABILE.

ALXIMIKS:

2. Ci sono due modi per accedere ai campi statici della classe (la struttura è una classe con accesso pubblico di default e l'ereditarietà)

(a) attraverso lo spazio dei nomi della classe - ad esempioSymbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - il valoreSpread diventa uguale agd_Spread della classeSymbol_Properties

(double Spread = Symbol_Properties::gd_Spread =0)- il valoregd_Spread dalla classeSymbol_Properties e il valoreSpread diventa uguale a 0

Esattamente! Ecco perché ho fatto così. Inizializzo immediatamente la variabile che si riferisce alla variabile di questa struttura con zero e poi viene memorizzata in modo permanente. Il che è logico, perché queste variabili sono necessarie in una sola istanza. Ecco perché non c'è motivo di creare un oggetto diverso in questo caso. Dopo tutto, è logico... Non sei d'accordo con me?

ALXIMIKS:

b) Creare un oggetto di classe (per esempioSymbol_Properties obj; ) e riferirsi ad esso come un normale campo di classe attraverso questo oggetto

Allora le variabili non saranno statiche, e non c'è garanzia che non mantengano i loro valori durante l'esecuzione del programma.
 
Cosa c'è di sbagliato nelle VARIABILI STATICHE, o nelle costanti per esempio?
 

STATE VARIABLE non mi ha fatto piacere, perché sono usati in classi diverse. Così li ho raggruppati.

Le costanti non piacciono perché le costanti non cambiano i loro valori, mentre queste variabili dovrebbero essere in grado di cambiare i loro valori.