MQL5'te OOP hakkında sorular - sayfa 14

 
TheXpert :

ayrıca moderatörlerin vesayeti altında

Vesayetten kim bahseder ki ... ama iki ekkanutlu bir karakter ...

 
TheXpert :

ayrıca moderatörlerin vesayeti altında

Evet, mesajımı kendim sildim.
 
Vladimir Simakov :
Evet, mesajımı kendim sildim.

Bir fonksiyonda new aracılığıyla bir nesne oluşturulduğunda durum buydu. Ve başlangıçta, mevcut bir nesneye bir işaretçi iletme ihtiyacı hakkında bir konuşma vardı. Ve böylece, şu şekilde geçirilebilir:

void f(CObj * nesne){}

 
Dmitry Fedoseev :

Ve fonksiyonda bir nesne yaratmak için fonksiyona bir işaretçi iletmeniz gerekiyorsa, şu şekilde çalışır:

 class CObj{
   public :
   int f(){
       return ( 33 );
   }
};

CObj * obj;

void OnStart (){
  z(obj);
   delete (obj);
}

void z(CObj & o){
   o = new CObj();
}
Bu aslında OOP hakkında bilmek istediğiniz, ancak sormaya korktuğunuz her şey)))

Bu kod terminalimi atıyor. En iyi ihtimalle hata ayıklamada kritik bir hataya neden olur (animasyon için resme tıklayın):


Derleyicinin böyle bir yapıyı atlaması garip.

 
Çocuklar, özellikle birdenbire kendi aralarında tartışmayı bırakın.
Dmitry ilk örneği bir hatayla verdi ve bunda yanlış olan ne?
Dim, evet hatasız derleniyor fakat scripti çalıştırdığınızda hata oluşuyor.

Vladimir düzeltti ve bir işaretçi ekledi, kod doğru çalıştı.
Başka ne yapar? Şimdi en havalı biberin kim olduğunu sıralamak için? ))))
Arkadaşlar, birbirinize saygılı olun, kibirle şahsileşmeyin ve hakaret etmeyin.

Dmitry'den ilk örnek
 class CObj{
   public :
   int f(){
       return ( 33 );
   }
};

CObj * obj;


void OnStart (){
  z(obj);
   delete (obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
Vladimir'in düzeltmesi
 void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
Doğrulama için yöntemin sonucunun bir çıktısı ile düzeltmem
Bu örnek işe yaradı, başka neye ihtiyacınız var?
Kimin daha havalı olduğunu ya da olmadığını sıralamayı bırakın, herkesin yazım hataları ve hataları var.
 class CObj
{
   public :
   int f(){ return ( 33 );}
};

void z(CObj* &o)
{
   o = new CObj();
   Print (o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart ()
{      
  z(obj);
   delete (obj);
}
Bu anlaşmazlıkların girişi, bence, bir derleyici hatası ortaya çıkardı.
Derleyici neden Dmitry'nin ilk örneğindeki hatasız derlemeyi atlıyor?
 
Vasiliy Sokolov :

Bu kod terminalimi atıyor. En iyi ihtimalle hata ayıklamada kritik bir hataya neden olur:

Derleyicinin böyle bir yapıyı atlaması garip.

Derleyici için burada her şey geçerlidir.

Programın veri bölümündeki bir nesneye işaretçi oluşturuldu; derleme sırasında 0x0 başlatıldı.

İşlemci için gerekli talimatlar kod bölümünde oluşturulur.

Yürütme sırasında, z(...) işlevinin adresindeki komutlar yığına gönderilir.

Ve orada hareket rdx [0x0]

Ve sıfır bellek adresine erişim yasaktır. Bir boş göstericinin başvurusunun kaldırılması çağrılır.

 
Vladimir Simakov :
Derleyici için burada her şey geçerlidir.

Hangi derleyici için?

 
Vasiliy Sokolov :

Bu kod terminalimi atıyor. En iyi ihtimalle hata ayıklamada kritik bir hataya neden olur (animasyon için resme tıklayın):


Derleyicinin böyle bir yapıyı atlaması garip.

Ve benim için derliyor, düzgün çalışıyor, ancak çalışma tamamlandıktan sonra bir bellek sızıntısı hakkında bir mesaj gösteriyor (silme çalışmıyor).

 
Igor Makanu :

Şimdi ona kötü şeyler öğretiyorsun, o zaman çözmesi iyi olur)))

 #define private protected

fxsaber kodlarıyla oturmanıza şaşmamalı. Bana göre bu bir başyapıt.

 

Yanlış bilgilendirme için özür dilerim, daha önce bir alt sınıfta Create() metodunu çağırmanın imkansız olduğunu yazmıştım.

Şimdi kontrol ettim, mümkün. Ancak özel üye m_button'a erişim mümkün değildi. Onlar. örneğin, düğmenin durumunu kontrol etmek imkansızdı: basıldı / bırakıldı.

Igor'un ipucuyla artık mümkün.

 #define private protected
#include <Controls\Button.mqh>

class CMyButton : public CButton
{ 
   public : 
              CMyButton( void ){}; 
             ~CMyButton( void ){}; 
             
         bool     isPrevState;         // состояние кнопки на предыд.тике, true - была нажата     
         void     setButton();         // создаем кнопку
}; 

void CMyButton::setButton( void )
{
   // метод Create() вызывается
   Create( 0 , "setBtn" , 0 , 50 , 300 , 150 , 325 );
   Text( "setBtn" );
   
   m_button.State();     // работает когда включаем #define private protected
}