Singleton modelini MQL4'te uygulamak mümkün mü? - sayfa 2

 
Ancak bazı nedenlerden dolayı derleme sırasında çok fazla hata var. Sorun nedir?

Ne tür kalıplardan bahsedebiliriz ki temelleri bilmiyorsanız, statik bir sınıf alanını bile doğru oluşturamazsınız.

(Habré'de singleton hakkında çok sayıda makale var ve neden, nasıl ve neyin yanlış olduğu)

Singleton (Singleton) veya statik bir sınıf?
Singleton desenini kullanma
 
ALXIMIKS :

(Habré'de singleton hakkında çok sayıda makale var ve neden, nasıl ve neyin yanlış olduğu)

Singleton (Singleton) veya statik bir sınıf?
Singleton desenini kullanma

Görmedim mi sanıyorsun? Nasıl çalıştığını pek anlamadım. İşte sorun bu. Ama yol boyunca bir singleton'a ihtiyacım yok. Bu yüzden statik üyelerle yöneteceğim.

ALXIMIKS :

Ne tür kalıplardan bahsedebiliriz ki temelleri bilmiyorsanız, statik bir sınıf alanını bile doğru oluşturamazsınız.

Nasıl olduğunu biliyorsan, düzeltirsin. Dün belgelere göre yazdım. Ama aynı zamanda birçok hata. Bunun gibi:

 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 ;

Sıradaki ne?

 
static double        gd_Spread; 
 int Symbol_Properties::gd_Spread = 0 ;
hiçbir şeye üzülmedin mi?
 
Естественно, создавать несколько объектов в разных классах данных структур крайне не рекомендуется.
Söyle bana, tüm bunları neden yapıyorsun? Ve yukarıdaki alıntıyı daha açık bir şekilde tercüme edin, ne yazık ki hiçbir şey anlamadım, teşekkür ederim.
 

Ben atmadım. Genel olarak, mevcut sürüm burada doğrudur:

 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 ;

Anladığım kadarıyla, şimdi her statik değişkene bu kadar uzun bir adla erişmem gerekiyor?

Symbol_Properties::gd_Spread = 0 ;

Yoksa bu şeyi, değişken başlatma yapısını tanımladıktan sonra, gerçekleştiğinde ilgili statik üyeyi belirli bir tür değişkenine atayacak şekilde uygulamak daha mı kolay:

 double Spread = Symbol_Properties::gd_Spread = 0 ;

Ve sonra verilen değişkene karşılık gelen statik değişkenlere atıfta bulunmak için kodda, değil mi?

 
hoz :

Şey, evet, .. Asıl mesele Vadim'in farkında olması :)))))

Evet, normal diyalog şöyle:

S: Buradaki arkadaşlarım bana şeker tavsiye etti. İhtiyacım olan şey bu!

Ben: (Kaybediyor... Şekerin bununla ne ilgisi var? Belki V bir arkadaşına DR'ye gidiyor ya da çocukları tedavi etmek istiyor, belki kendi ya da başkaları? Belki işe girdi ve şimdi şeker satıyor ?Belki bunlar Belarus'taki son şekerlerdi ve şimdi V tekelcisiydi?Ya B tatlıları özlüyorsa?... "Neden tatlılar ve onlarla ne yapmalı" konusunda kafamda birçok düşünce belirdi. B ile iletişim, telepatik yeteneklerim başarısız oldu. Kafadan hiçbir şey gelmedi.)

Bilmemek.

Her ihtimale karşı. Sohbete katılan herkesin rızası olmadan diyaloglar düzenlemek uygunsuzdur. Bu kabalıktır.
 

1. Bütün bunlar ne için?

2. Bir sınıfın statik alanlarına erişmenin iki yolu vardır (bir yapı, varsayılan olarak ve devralındığında genel erişime sahip bir sınıftır):

a) sınıf ad alanı aracılığıyla - örneğin Symbol_Properties::gd_Spread

( double Spread = Symbol_Properties::gd_Spread) - Spread değeri Symbol_Properties sınıfından gd_Spread değerine eşit olur

(double Spread = Symbol_Properties::gd_Spread = 0 ) Symbol_Properties sınıfından gd_Spread değeri ve Spread değeri 0 olur

b) bir sınıf nesnesi oluşturun (örneğin , Symbol_Properties obj; ) ve bu nesne aracılığıyla ona normal bir sınıf alanı gibi erişin

(çift Yayılma = obj.gd_Spread)

( çift Yayılım = obj.gd_Spread = 0)

 
ALXIMIKS :

1. Bütün bunlar ne için?

Kolaylık ... Sonuçta, bu değişkenler tek bir örnekte kullanılıyorsa, neden bir nesne oluşturmalıyım? Ayrıca bir değişkenden bahsederken OBJECT NAME.VARIABLE NAME ise kodu okumak çok daha uygundur.

ALXIMIKS :

2. Bir sınıfın statik alanlarına erişmenin iki yolu vardır (bir yapı, varsayılan olarak ve devralındığında genel erişime sahip bir sınıftır):

a) sınıf ad alanı aracılığıyla - örneğin Symbol_Properties::gd_Spread

( double Spread = Symbol_Properties::gd_Spread) - Spread değeri Symbol_Properties sınıfından gd_Spread değerine eşit olur

(double Spread = Symbol_Properties::gd_Spread = 0 ) Symbol_Properties sınıfından gd_Spread değeri ve Spread değeri 0 olur

Bu kadar! Bu yüzden yaptım. Bu yapının değişkenine atıfta bulunan değişkeni hemen sıfırla başlatıyorum ve daha sonra kalıcı olarak hafızada saklanıyor. Hangisi mantıklı, çünkü bu değişkenler tek bir örnekte gereklidir. Bu nedenle, bu durumda farklı bir nesne oluşturmak için hiçbir neden yoktur. Sonuçta, mantıklı .. Bana katılmıyor musun?

ALXIMIKS :

b) bir sınıf nesnesi oluşturun (örneğin , Symbol_Properties obj; ) ve bu nesne aracılığıyla ona normal bir sınıf alanı gibi erişin

O zaman değişkenler statik olmayacak ve program çalışırken değerlerini korumayacaklarının garantisi yok.
 
ve SADECE STATİK DEĞİŞKENLER sizi memnun etmedi mi??? iyi veya sabitler örneğin???
 

BASİT STATİK DEĞİŞKENLER memnun etmedi çünkü çeşitli sınıflarda kullanılırlar. Bu yüzden onları bir şekilde gruplandırdım.

Ve sabitler memnun etmedi. sabitler değerlerini değiştirmezler ve bu değişkenler değerlerini değiştirebilmelidir.