MQL5'te OOP hakkında sorular - sayfa 74

 
Vladimir Simakov :

Evet, burada işaretçiler yok) Sınıf için bir tutamaç var, ancak onunla çalışmak bir işaretçi ile çalışmaya benzer, ancak bu, her şeyin ortak bittiği yerdir.

iki gün iki gece meraklı zihnim ve oyunbaz ellerim peşimdeydi.

Kapsam dışında dinamik olarak oluşturulmuş bir nesneyi silmeye çalıştım - bir fonksiyonda yazarak, yine de çözüme ulaştım:

 class CTest
{
public :
   ~CTest() { Print ( __FUNCTION__ ); }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
}

onu bu şekilde siliyor, ama hemen tahmin et .... ve yardımda veya Güvenlik Konseyi'nde işaretçileri geçmek için benzer işlev imzaları bulamadım


başka bir soru:

Ancak, bir işlevin yürütülmesinin sonucu olarak bir işaretçiyi referans olarak bir nesneye nasıl döndürebilirim?

onlar. Böyle bir şey yapmak istiyorum:

CTest ret_CTest()
{
   CTest *result = new CTest;
   return (result);
}


CTest *'i sorunsuz bir şekilde döndürebilirsiniz, ancak ret_CTest() yazdığım gibi - hata veriyor

 
Igor Makanu :

iki gün iki gece meraklı zihnim ve oyunbaz ellerim peşimdeydi.

Kapsam dışında dinamik olarak oluşturulmuş bir nesneyi silmeye çalıştım - bir fonksiyonda yazarak, yine de çözüme ulaştım:

onu bu şekilde siliyor, ama hemen tahmin et .... ve yardımda veya Güvenlik Konseyi'nde işaretçileri geçmek için benzer işlev imzaları bulamadım

kapsam dışı ne demek? işleve geçtiniz, orada görünür)

ps void deleteCTest(CTest* & t) bu olmadan & aynı şekilde çalışmalı mı çalışmamalı mı?

Oluşturulduğu alanın dışını ve hatta muhtemelen otomatik olarak silmek için ... şşş ... hiç kimse duymazken ... Desen Fabrikası ... daha hızlı oku ve sil ...

 

Igor Makanu :


Ancak, bir işlevin yürütülmesinin sonucu olarak bir işaretçiyi referans olarak bir nesneye nasıl döndürebilirim?

CTest *'i sorunsuz bir şekilde döndürebilirsiniz, ancak ret_CTest() yazdığım gibi - hata veriyor
koşer istersen
CTest& Foo();
, o zaman kader değil, ama öyleyse:
CTest Foo();

, o zaman sınıfın bir kopya oluşturucusu olmalıdır.

CTest(CTest &other)...
 
Aleksey Mavrin :

ps void deleteCTest(CTest* & t) bu olmadan & aynı şekilde çalışmalı mı çalışmamalı mı?

bak çok şey öğreneceksin ;)

MQL'deki işaretçilerin çok bilgilendirici bir şey olduğunu tekrar yazıyorum)))


Vladimir Simakov :
Koşer istiyorsanız, o zaman henüz kader değil, ama öyleyse:

, o zaman sınıfın bir kopya oluşturucusu olmalıdır.

tekrar düşünmek gerek

GetPointer() ile bazı hileler yapılabileceğine dair bir şüphe var ... ama gerçek değil .... burada "uzay ve zamanda bu sıçramalar" - MQL'de bir işaretçi ve örtük referans kaldırma yoluyla - bu beyin yıkamadır! !! ((((

 
Igor Makanu :

bak çok şey öğreneceksin ;)

MQL'deki işaretçilerin çok bilgilendirici bir şey olduğunu tekrar yazıyorum)))

Silinir, ancak _test'in yeni değeri bu şekilde atanamaz. Bu arada MQL'nin bununla hiçbir ilgisi yok)))

 
Igor Makanu :

bak çok şey öğreneceksin ;)

MQL'deki işaretçilerin çok bilgilendirici bir şey olduğunu tekrar yazıyorum)))


tekrar düşünmek gerek

GetPointer() ile bazı hileler yapılabileceğine dair bir şüphe var ... ama gerçek değil .... "bu sıçramalar uzay ve zamanda" - MQL'de bir işaretçi ve örtük referans kaldırma yoluyla - bu beyin yıkamadır !! ! ((((

Evet, burada her şey yolunda))) Sadece keskinliği kapatın, bir ipucu bile yok)))

 
Igor Makanu :

bak çok şey öğreneceksin ;)

MQL'deki işaretçilerin çok bilgilendirici bir şey olduğunu tekrar yazıyorum)))

Kontrol ettim. Mükemmel bir şekilde ve & olmadan silindi ;)

Ve baskının görünmemesi gerçeği, bunu MT4 ve MT5'te deneyin ve karşılaştırın)

 class CTest
{
public :
   CTest() { Print ( __FUNCTION__ ); }
   ~CTest() { Print ( __FUNCTION__ ); }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   CTest* _test = new CTest();
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* t)
{
   delete t;
}
 
Aleksey Mavrin :

Kontrol ettim. Mükemmel bir şekilde ve & olmadan silindi ;)

Ve baskının görünmemesi gerçeği, bunu MT4 ve MT5'te deneyin ve karşılaştırın)

tam bir örnek vermedim bugün karşılaştım

bu yüzden & olmadan çalışmaz

 class CTest
{
public :
   ~CTest() { Print ( __FUNCTION__ ); }
};
//+------------------------------------------------------------------+
void OnStart ()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
   delete _test;
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* & t)
{
   delete t;
   t = new CTest;
}
//+------------------------------------------------------------------+

Vladimir Simakov :

Evet, burada her şey yolunda))) Sadece keskinliği kapatın, bir ipucu bile yok)))


evet, Sharp'ı aramıyorum, hala MQL ile anlıyorum, anlamıyorum - soruyorum

 
Igor Makanu :

tam bir örnek vermedim bugün karşılaştım

bu & olmadan çalışmaz

Doğal olarak. İşaretçiyi değere göre ileteceksiniz ve bu nedenle işaretçinin bir kopyası oluşturulacaktır. Bu sayede nesneyi öldüreceksiniz ve işlevde oluşturulan işaretçi için yeni bir nesne yaratacaksınız. Bu c++, hoş geldiniz
 
Igor Makanu :

tam bir örnek vermedim bugün karşılaştım

bu yüzden & olmadan çalışmaz



Benim düşünceme göre, bu bağlantılarla ilgili değil, yalnızca işlev argümanının işlev çalıştıktan sonra değerini korumasını istiyorsanız, işaretçi tarafından iletilmesi gerektiği gerçeğiyle ilgilidir. aynısı, örneğin, bağlantı olmayan bir dosyanın veya göstergenin tutamacı ile olur.

Ve görünüşe göre, uzun zamandır belli belirsiz hatırlamama rağmen, C++ standarda göre her zaman böyle olmuştur.