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

 
hoz :

şöyle yaptım:

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

Oldukça basit bir Myers Singleton'ı MQL4++'a aktarma girişimi, örneğin şöyle görünebilir:

 #property strict

/******************************************************************************/
class Symbol_Properties {
private :
   // Реализация технической части singleton'а
   /******************************************************************************/
public : // Вечно в этом MQL4++ что-то не работает: 'Symbol_Properties::Symbol_Prope…' - cannot call private member function
  Symbol_Properties() {};
private : // Восстанавливаем private
  Symbol_Properties( const Symbol_Properties &p);
   void operator =( const Symbol_Properties &);

public :
   static Symbol_Properties *singleton() {
     static Symbol_Properties sp;
     return GetPointer (sp);
  }

   // Пользовательская часть singleton'а
   /******************************************************************************/
   datetime     gdt_Quote;           // Время поступления последней котировки
   double       gda_Price [ 2 ];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   double       gd_Spread;           // Размер спреда в пунктах
   double       gd_Swap;             // Своп
   double       gd_Comission;         // Комиссия
   double       gd_Pt;               // Величина одного пункта
   int          gi_Digits;           // Количество знаков в цене после запятой
   int          gi_StopLevel;         // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   int          gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};

/******************************************************************************/
void change() {
  Symbol_Properties *p = Symbol_Properties::singleton(); // Получение singleton'а

  p.gdt_Quote = TimeCurrent ();
  p.gda_Price[ 0 ] = Bid;
  p.gda_Price[ 1 ] = Ask;
}

/******************************************************************************/
void OnStart () {
  Symbol_Properties *p = Symbol_Properties::singleton(); // Получение singleton'а

   Print ( "gdt_Quote = " , p.gdt_Quote, ", Price = " , p.gda_Price[ 0 ], "/" , p.gda_Price[ 1 ]);
  change();
   Print ( "gdt_Quote = " , p.gdt_Quote, ", Price = " , p.gda_Price[ 0 ], "/" , p.gda_Price[ 1 ]);
}

Yürütme sonucu:

 01 : 24 : 57 Script 3 EURUSDm,H1: loaded successfully
01 : 24 : 57 3 EURUSDm,H1: initialized
01 : 24 : 57 3 EURUSDm,H1: gdt_Quote = 1970.01 . 01 00 : 00 : 00 , Price = 0.0 / 0.0
01 : 24 : 57 3 EURUSDm,H1: gdt_Quote = 2014.09 . 03 21 : 24 : 57 , Price = 1.31461 / 1.3148
01 : 24 : 57 3 EURUSDm,H1: uninit reason 0
01 : 24 : 57 Script 3 EURUSDm,H1: removed

Statik singleton() yönteminde, Symbol_Properties türünde statik bir değişken oluşturulur, ancak derleme sırasında, yöntem statik olmasına rağmen özel üyeler de dahil olmak üzere tüm üyelere erişime sahip olduğundan, bir Geçersiz varsayılan kurucu çağrı erişim hatası verilir. Bu nedenle, MQL4++ uygulamasındaki bir hata nedeniyle, bu yapıcının halka açık olarak yerleştirilmesi gerekiyordu. Düzeltirlerse, artık yapılmasına gerek kalmayacak.

Yürütmenin sonucu, change() çağrısından sonra verilerin değiştiğini gösterir. Bu dolaylı olarak, kendi içindeki change() işlevinin OnStart()'ta alınan aynı nesnenin adresini aldığını gösterir.

Şimdi, MQL4++'daki bir hata nedeniyle, bu bir Singleton değildir, çünkü varsayılan kurucunun public olması nedeniyle bu tür birçok nesne oluşturulabilir. Hata düzeltilirse ve varsayılan kurucu özel bölüme yerleştirildikten sonra, Myers' Singleton'ın MQL4++ içinde tam teşekküllü bir uygulaması haline gelecektir.

 
ALXIMIKS :

2 günlük ıstırabın statik ve sınıfta farklı davrandığını anlamadın mı???

yol boyunca, yapılar C'den alındı ve kalıtım açısından sadece biraz pompalandı,

sallanan sınıflar, dolu.

Bu nedenle, yapılarda statik bir değişken için yer ayırmak gerekli değildir.

ve sınıflarda aksi takdirde yer ayırtmak gerekir:

Bu doğru değil, bu harika MQL4++ derleyicisi farklı davranıyor. Davranış "hizalanmış" olduğundan, yalnızca nesnenin bir örneğini oluşturmanız gerekir:

 #property strict

/******************************************************************************/
struct A {
   static int x;
};

/******************************************************************************/
void OnStart () {
  A y;
}

Bazı nedenlerden dolayı, bu derlenmiyor (birinci ve üçüncü uyarılar ve burada ikincisi tam teşekküllü bir hatadır):

 struct has no members, size assigned to 1 byte
unresolved static variable 'A::x'
variable 'y' not used

Öyleyse yapılarda "statik bir değişken için yer" ayırmak gerekli midir?

Ve terminalin / derleyicinin bir sonraki sürümünde - aynı olacak mı (sürüm değiştirirken önceden yazılmış her şeyi düzeltmek için acele etmemek için)?

 
TheXpert :

Kapsüllemeyi unutmuşum. Ve silebilirsiniz. Ancak burada sabit işaretçiler yoktur) Ve genel olarak, singleton en iyi model değildir.

Bazı şablonlara sahip olmak iyidir. Dersler için, belki de sadece bir rüya.



Eh, o en kötüsü ya da en iyisi, yargılamayacağım.

Tartışmanın katılımcılarına hatırlatmama izin verin, yukarıda tekrar tekrar bahsedilen BELLEK YÖNETİMİ MODLARI - Otomatik, Dinamik, Statik, Tabanlı - OOP ne kadar güçlü olursa olsun şablonlara uygulanamaz.

 
Так обязательно ли резервировать в структурах "место под static-переменную"?
"Evet", sadece yapabileceğinizi ve "hayır" yapabileceğinizi fark etti, ancak yapmamalısınız.
 
simpleton :


Şimdi, MQL4++'daki bir hata nedeniyle, bu bir Singleton değildir, çünkü varsayılan kurucunun public olması nedeniyle bu tür birçok nesne oluşturulabilir. Hata düzeltilirse ve varsayılan kurucu özel bölüme yerleştirildikten sonra, Myers' Singleton'ın MQL4++ içinde tam teşekküllü bir uygulaması haline gelecektir.


Teşekkürler, burada bir işaretçi alabileceğinizi bilmiyordum.

Kodla bir şey yaptın, daha basit olabilir, ne yazık ki şablon yok.

kodu yapıştıramıyorum

sınıf Singleton{

özel:

sınıf BazıSınıf{

halka açık:

int a;

};

Tekton(){}

~Singleton(){}

halka açık:

statik SomeClass* Örnek(){

statik SomeClass a();

GetPointer(a) döndür;

}

};

OnStart() geçersiz

{

SomeClass* some_ptr = Singleton::Instance();

bazı_ptr.a = 5;

Uyarı(some_ptr.a);

}

 
ALXIMIKS :


Teşekkürler, burada bir işaretçi alabileceğinizi bilmiyordum.

Kodla bir şey yaptın, daha basit olabilir, ne yazık ki şablon yok.

kodu yapıştıramıyorum

sınıf Singleton{

özel:

sınıf BazıSınıf{

halka açık:

int a;

};

Tekton(){}

~Singleton(){}

halka açık:

statik SomeClass* Örnek(){

statik SomeClass a();

GetPointer(a) döndür;

}

};

OnStart() geçersiz

{

SomeClass* some_ptr = Singleton::Instance();

bazı_ptr.a = 5;

Uyarı(some_ptr.a);

}

İşte C++ için Myers kodu:

 class Singleton
{
private :
    Singleton() {}
    Singleton( const Singleton&);
    Singleton& operator =( Singleton& );
public :
     static Singleton& getInstance() {
         static Singleton  instance;
         return instance;
    }
};

Ve işte, MQL4++'a çevrilmiş ve örnekte sınıfın teknik parçası olan aynı kod:

 class Symbol_Properties {
private :
   // Реализация технической части singleton'а
   /******************************************************************************/
public : // Вечно в этом MQL4++ что-то не работает: 'Symbol_Properties::Symbol_Prope…' - cannot call private member function
  Symbol_Properties() {};
private : // Восстанавливаем private
  Symbol_Properties( const Symbol_Properties &p);
   void operator =( const Symbol_Properties &);

public :
   static Symbol_Properties *singleton() {
     static Symbol_Properties sp;
     return GetPointer (sp);
  }

Buradaki "bilgelik" nerede?

Örneğiniz MQL4++ derleyicisinin hatalarından yararlanıyor, özellikle OnStart()'ta SomeClass türünün kullanılması yasa dışıdır, çünkü bu Singleton sınıfının iç içe geçmiş bir türü ve "yetişkin" derleyici hatayı anında algılar:

try.cpp:33:9: error: unknown type name 'SomeClass'
        SomeClass* some_ptr = Singleton::Instance();
        ^

Ancak, bu çok temel bir nokta değildir, çünkü iç içe tip doğru bir şekilde belirtilebilir. Çok daha temel olarak, SomeClass türü Singleton sınıfının özel bölümünde bildirilir ve bu nedenle SomeClass'ın OnStart () içinde kullanımı artık temelde yasa dışıdır, "yetişkin" derleyici hemen bildirir:

 try .cpp: 33 : 20 : error: 'SomeClass' is a private member of 'Singleton'
        Singleton::SomeClass* some_ptr = Singleton::Instance();
                   ^

Uygulamanız, MQL4++ derleyicisi erişim denetimi ile orjiyi düzeltmezse çalışacaktır.

 

1. Maers, Maers değil, fark nedir ... ayy, asıl şey kodun çalışması ve ihtiyaç duyduğu şeyi ve hatasız yapmasıdır MQL 'de ++ 'da değil.

2. Kodunuz doğru olanı yapıyor mu? Hayır, nokta. Servis masasına neden bu kadar çok sızlanma olduğunu yazın, herkes zaten her şeyi anladı, kim istedi ve yapabilirdi.

3. Örneğim, MQL'de hataları (C++ ile ilgili olarak) atlamanın bir yolunu gösterdi, eğer bir şeyden hoşlanmıyorsanız, 1. ve 2. noktalara bakın.

4. Özel bir sınıfa işaretçi oluşturma ile ilgili olarak - evet, bu bir MQL bobble'ıdır, ancak türü kendi kendine belirleyecek bir otomatik yoktur, bu nedenle böyle çalışması iyi olur. \

(Not: Otomatik hesapta fazla ileri gitmiş olabilirim, kontrol etmeniz gerekiyor)

5. MQL'de bir nesne elde etmek için bir işaretçinin referansını kaldırmanın bir yolunu bulamadım, bu yüzden özel kopya oluşturucu ve atama operatörünün gereksiz olduğunu düşünüyorum.

onları kullanmaya çalışın, bir yolunu görmekten memnun olacağım))

 
ALXIMIKS :

1. Maers, Maers değil, fark nedir ... ayy, asıl şey kodun çalışması ve ihtiyaç duyduğu şeyi ve hatasız yapmasıdır MQL 'de ++ 'da değil.

2. Kodunuz doğru olanı yapıyor mu? Hayır, nokta. Servis masasına neden bu kadar çok sızlanma olduğunu yazın, herkes zaten her şeyi anladı, kim istedi ve yapabilirdi.

3. Örneğim, MQL'de hataları (C++ ile ilgili olarak) atlamanın bir yolunu gösterdi, eğer bir şeyden hoşlanmıyorsanız, 1. ve 2. noktalara bakın.

4. Özel bir sınıfa işaretçi oluşturma ile ilgili olarak - evet, bu bir MQL bobble'ıdır, ancak türü kendi kendine belirleyecek bir otomatik yoktur, bu nedenle böyle çalışması iyi olur. \

(Not: Otomatik hesapta fazla ileri gitmiş olabilirim, kontrol etmeniz gerekiyor)

5. MQL'de bir nesne elde etmek için bir işaretçinin referansını kaldırmanın bir yolunu bulamadım, bu yüzden özel kopya oluşturucu ve atama operatörünün gereksiz olduğunu düşünüyorum.

onları kullanmaya çalışın, bir yolunu görmekten memnun olacağım))

1. Şimdi - yapar, ancak gerekli olanı DEĞİLDİR (açıklamalar aşağıdadır).

2. Düzeltmezlerse, yapmazlar. Ve uygulanması pek olası değildir.

3. Bu, hataları atlamanın bir yolu değil, onların sömürülmesidir.

4. Burada olmayan çok şey var.

5. Bu versiyonda, böyle şeyler mümkün olabilir, özellikle, kopya kurucunun sentezlenmediği gözümün önünden geçti gibi görünüyor, ancak bu, gelecekteki versiyonlarda sentezlenmeye başlamayacağını garanti etmiyor. Onların beyanı için genel giderler, bence, ihmal edilebilir.

Şimdi, kodunuzun neden yalnızca önceki mesajda bahsettiğim olası sorunlara sahip olmadığının, aynı zamanda neden prensipte bir singleton olmadığının ve neden olmayacağının açıklamaları, dahası, erişim ile orjiyi düzeltip düzeltmediğine bakılmaksızın:

 #property strict

class Singleton{
private :
         class SomeClass{
         public :
             int a;
         };
        Singleton(){}
        ~Singleton(){}   
public :
         static SomeClass* Instance(){
                         static SomeClass a;
                         return GetPointer (a);
                }
        };
         int i;

void OnStart ()
{       
        SomeClass* some_ptr = Singleton::Instance();
        SomeClass obj1;
        SomeClass obj2;

        obj1.a = 3 ;
        obj2.a = 7 ;

        some_ptr.a = 5 ;
         Print ( "some_ptr.a = " , some_ptr.a);          
         Print ( "obj1.a = " , obj1.a);          
         Print ( "obj2.a = " , obj2.a);          
}

Bu kod oldukça başarılı bir şekilde yürütülüyor:

 10 : 09 : 27 Script 3 EURUSDm,H1: loaded successfully
10 : 09 : 27 3 EURUSDm,H1: initialized
10 : 09 : 27 3 EURUSDm,H1: some_ptr.a = 5
10 : 09 : 27 3 EURUSDm,H1: obj1.a = 3
10 : 09 : 27 3 EURUSDm,H1: obj2.a = 7
10 : 09 : 27 3 EURUSDm,H1: uninit reason 0
10 : 09 : 27 Script 3 EURUSDm,H1: removed

Kaç tane singleton oluşturmayı başardığınızı görün ve bunlar AYNI ANDA var mı?

Erişime sahip seks partisi düzeltilirse, bu anlamda kodunuz için herhangi bir şey değişir mi?

Kodumda değişecek mi?

Bir düşünceyi ne kadar kategorik olarak ifade ederseniz, o kadar doğru olacağını düşünüyor musunuz?

 

evet, ilginiz için teşekkürler, haklısınız, bu versiyonda da singleton değil.

Örtük yapıcılar ve operatörler ile ilgili olarak - onları açık hale getirin ve kullanmaya çalışın, bana öyle geliyor ki, bir nesneye işaretçiyi yeniden adlandırmak imkansız olduğu için işe yaramayacak gibi görünüyor.

Neden çalışmıyor, 'ptr' - korumalı üye işlevi çağrılamıyor :

 class smart_ptr{
            Singleton* ptr;
       public :        
            smart_ptr(Singleton* val): ptr(val){}          
            smart_ptr(): ptr( NULL ){} 
            ~smart_ptr(){ delete ptr;}
      };
 
ALXIMIKS :

evet, ilginiz için teşekkürler, haklısınız, bu versiyonda da singleton değil.

Örtük yapıcılar ve operatörler ile ilgili olarak - onları açık hale getirin ve kullanmaya çalışın, bana öyle geliyor ki, bir nesneye işaretçiyi yeniden adlandırmak imkansız olduğu için işe yaramayacak gibi görünüyor.

Neden çalışmıyor, 'ptr' - korumalı üye işlevi çağrılamıyor :

Öyle görünmüyor, ama yine de bir sürü söve var. Sadece birkaçının bunu fark etmesi üzücü. Tartışmaya girmek istemiyorum, ama aslında fark çok büyük. C++'daki yapılara uygulanan bazı şeyler MKL4'te çalışmaz. Ama hiçbir şey söylemeyeceğim ... yoksa şu gibi sorular sormaya başlayacaklar:

"Neden buna ihtiyacım var".

Evet, en azından o zaman, bitmemiş bir ders kitabına giremezsiniz, ancak MKL4'te C ++ 'da neyin işe yaradığını yazın ve burada çalışıp çalışmadığını düşünmeyin. Bu aşamada başka bir şeye ihtiyacım yok...

Neden: