OOP, mql5'te şablonlar ve makrolar, incelikler ve kullanım teknikleri - sayfa 26

 

Bir sorun var mı:

" Yeni Çubuk " ve "Veri Yöneticisi" sınıflarını kullanan bir "Program" sınıfı vardır. "Yeni Çubuk" sınıfı da "Veri Yöneticisi"ni kullanır. "Data Manager" sınıfı, genel alıcıları ve ayarlayıcıları uygular.

 class CDataManager
   {
private :
     string           m_symbol;
     ENUM_TIMEFRAMES m_timeframe;
public:
    //--- Геттеры и сеттеры
   };
class CNewBar
   {
private :
    CDataManager  m_data;
   };
class СProgram
   {
private :
    CNewBar        m_newBar;
    CDataManager   m_data;
   };

Soru: Programı başlatırken "Veri Yöneticisi" sınıfının "sembol" ve "zaman çerçevesi" özelliklerini ayarlamak için "Yeni çubuk" sınıfı için hangi seçenekler var? Veri yöneticisinin alanlarına erişmek için "Yeni Çubuk" sınıfında genel alıcılara ve ayarlayıcılara sahip olmak istemiyorum . Veri yöneticisinin kendisi gizli kalmak istiyor.

Başka bir deyişle: bir program, bir veri yöneticisi kullanan birçok sınıfı kullanabilir. Ve programı başlatırken, tüm sınıfların tüm yöneticilerinin alanlarını gerekli değerlerle başlatmanız gerekir. Ancak tüm sınıflarda, veri yöneticisinin alanlarına erişmek için alıcıları çitle çevirmek istemezsiniz. Bunun gibi bir şey...

 
Alexey Kozitsyn :
Açıklamanıza göre, bu ayarları yalnızca tüm yöneticiler için değil, tüm yöneticiler için ortak olan ayrı bir varlığa ayırmak mantıklıdır.
 
TheXpert :
Açıklamanıza göre, bu ayarları yalnızca tüm yöneticiler için değil, tüm yöneticiler için ortak olan ayrı bir varlığa ayırmak mantıklıdır.

Evet, yönetici alanları için alıcıları olan bir temel sınıftan bir yöneticiye ihtiyaç duyduğunuz sınıfları devralmanız gerekiyor gibi görünüyor. Teşekkür ederim.

 
Alexey Kozitsyn :

Bir sorun var mı:

" Yeni Çubuk " ve "Veri Yöneticisi" sınıflarını kullanan bir "Program" sınıfı vardır. "Yeni Çubuk" sınıfı da "Veri Yöneticisi"ni kullanır. "Data Manager" sınıfı, genel alıcıları ve ayarlayıcıları uygular.

Soru: Programı başlatırken "Veri Yöneticisi" sınıfının "sembol" ve "zaman çerçevesi" özelliklerini ayarlamak için "Yeni çubuk" sınıfı için hangi seçenekler var? Veri yöneticisinin alanlarına erişmek için "Yeni Çubuk" sınıfında genel alıcılara ve ayarlayıcılara sahip olmak istemiyorum . Veri yöneticisinin kendisi gizli kalmak istiyor.

Başka bir deyişle: bir program, bir veri yöneticisi kullanan birçok sınıfı kullanabilir. Ve programı başlatırken, tüm sınıfların tüm yöneticilerinin alanlarını gerekli değerlerle başlatmanız gerekir. Ancak tüm sınıflarda, veri yöneticisinin alanlarına erişmek için alıcıları çitle çevirmek istemezsiniz. Bunun gibi bir şey...

 class CDataManager
   {
private :
     string           m_symbol;
     ENUM_TIMEFRAMES m_timeframe;
public :
    CDataManager():m_symbol( _Symbol ),m_timeframe( _Period ){}
    CDataManager( string symbol, ENUM_TIMEFRAMES frame):m_symbol(symbol),m_timeframe(frame){}
     //--- Геттеры и сеттеры
   };
class CNewBar
   {
private :
    CDataManager*  m_data;
     bool            cIsDelData;
public :
   CNewBar(CDataManager* data= NULL ):m_data(!data? new CDataManager:data),cIsDelData(!data){}
   CNewBar( string symbol, ENUM_TIMEFRAMES frame):m_data( new CDataManager(symbol,frame)),cIsDelData( true ){}
  ~CNewBar() { if (cIsDelData) delete m_data;}
   };
class CProgram
   {
private :
    CNewBar        m_newBar;
    CDataManager   m_data;
public :
    CProgram():m_newBar(&m_data){}
   };

Aynen öyle yapıyorum.

 
Vladimir Simakov :

Aynen öyle yapıyorum.

Örnek için teşekkürler, şimdilik biraz zor, ama genel olarak fikir açık. Soru hemen ortaya çıkıyor: tamam, eğer "bir seviye yuvalama" ise - burada açık, ama ya birkaç yuvalama seviyesi varsa?

Katma:

Ayrıca cIsDelData alanının neden açık değil? Sonuçta, yıkıcıda, POINTER_DINAMIC için m_data'yı kontrol edebilirsiniz. Yoksa yanılıyor muyum?

 

Kalıtım yaparsanız, o zaman birçok gereksiz yöntem ortaya çıkacaktır. Ve nesne özel olmalıdır. Bu nedenle, buna inanmayacaksınız, ancak bunu yapmanın en kolay yolu, veri yöneticisi kullanan tüm sınıflar için ayarlayıcılardır.

Tüm veri yöneticileri aynı parametrelerle çalışıyorsa, nesneleri çoğaltmak değil, bir işaretçiyi bir veri yöneticisine iletmek daha iyidir. Bu durumda, işaretçiyi geçmek için yalnızca bir ayarlayıcıya ihtiyaç duyulacaktır.

 
Alexey Kozitsyn :

Örnek için teşekkürler, şimdilik biraz zor, ama genel olarak fikir açık. Soru hemen ortaya çıkıyor: tamam, eğer "bir seviye yuvalama" ise - burada açık, ama ya birkaç yuvalama seviyesi varsa?

Katma:

Ayrıca cIsDelData alanının neden açık değil? Gerçekten de, yıkıcıda, POINTER_DINAMIC için m_data'yı kontrol edebilirsiniz. Yoksa yanılıyor muyum?

Yanlış. Dinamik bir nesneye bir işaretçi iletebilir ve ayy, onu güvenli bir şekilde öldürebilirsiniz.
Yatırıma gelince. Başlangıçta gerekli olduğunda, orada nesnenin bir örneğini yaratırsınız ve daha sonra yalnızca yukarıdakine benzer şekilde işaretçiler. Eğer proje tekilliği sağlıyorsa, o zaman bir singleton'u karıştırabilirsiniz, gerçi bunu mql'de hiç yapmadım, gerek yoktu, denemek zorundasın.
 
Dmitry Fedoseev :
Vladimir Simakov :

Teşekkürler, bunu düşüneceğim.

 
Vladimir Simakov :

Aynen öyle yapıyorum.

bu satır ne anlama geliyor CDataManager* m_data;

Arkadaşlar bende böyle bir şey yapmak istiyorum. bir makro var

 #define foor(a,b,v) \
for (;Funkziya(a,b,v);b++)
//я хочу доработать макрос чтобы получилось так
#define foor1(a,b,v,g) \
//за основу будет взят первый макрос
for (;Funkziya(a,b,v)&&g;b++) //эффект должен быть такой где g это дополнительное выражение которое будет дописываться в новый макрос

Sonuç olarak, foor ve foor1 olmak üzere 2 makrom olacak.

 
Seric29 :

bu satır ne anlama geliyor CDataManager* m_data;

Arkadaşlar bende böyle bir şey yapmak istiyorum. bir makro var

Sonuç olarak, foor ve foor1 olmak üzere 2 makrom olacak.

Bir nesneye işaretçi.

Alınma ama bu tür makrolarla senin için çok erken, boğulacaksın. İlk önce, bunu neden yaptığımı anlayın:

 #define foor1(a,b,v,g) \
for (;Funkziya(a,b,v)&&(g);(b)++)