"Nesne Yönelimli Programlamanın Temelleri" makalesi için tartışma - sayfa 3

 

1) burada bir hata olduğunu düşündüm:

Bölüm: Yapıcıya parametre geçirme

"Init() işlevi, aşağıdaki bölümde ayrılmıştır özel sınıfın yeniden başlatılabilmesini sağlamak için bölüm."

mümkün:

Init() fonksiyonu kamu bölümünü sınıfı yeniden başlatma imkanı sağlamak için kullanınız.

2) "ObjectArray" bölümü için "create an array with class instances (objects)" özelliğinin kullanımınabir örnek veriniz. Ne yazık ki, "bunun ne için kullanıldığını" anlayamıyorum.

3) "Kapsülleme (private, protected, public) hakkında daha fazla bilgi" bölümünde, temel sınıf->sınıf soyundan geçerken bahsediliyor. Belki de bu veri(class Class: public CBase) bölümün başında açıklanmalıydı, çünkü ben bunu sonradan fark ettim.

4) bulamadım:Şekil 6. "Ekstra" fonksiyonun (kırmızı ok) görünürlüğü, sınıfın yüklendiği işaretçi türüne göre belirlenir. Bu örnek ekte OOP_sDefaultVirtual_1.mq5 dosyasında bulunabilir.

5) Bir kütüphanenin ne olduğuna dair net bir gösterge bulamadım. Görünüşe göre, fonksiyonların sınıf(lar)ını saklamanın bir yolu mu? Yani include dosyasına benzer şekilde, sadece include dosyası kaynak olarak ve kütüphane derlenmiş bir dll olarak mı saklanıyor?

Makale için çok teşekkür ederim! Özellikle materyalin tutarlı bir şekilde sunulmasından memnun kaldım.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) burada bir hata olduğunu düşündüm:

Bölüm: Yapıcıya parametre geçirme

"Init() işlevi, aşağıdaki bölümde ayrılmıştır özel sınıfın yeniden başlatılabilmesini sağlamak için bölüm."

mümkün:

Init() fonksiyonu kamu bölümünü sınıfı yeniden başlatma imkanı sağlamak için kullanınız.

2) "ObjectArray" bölümü için "create an array with class instances (objects)" özelliğinin kullanımınabir örnek veriniz. Ne yazık ki, "bunun ne için kullanıldığını" anlayamıyorum.

3) "Kapsülleme (private, protected, public) hakkında daha fazla bilgi" bölümünde, temel sınıf->sınıf soyundan geçerken bahsediliyor. Belki de bu veri(class Class: public CBase) bölümün başında açıklanmalıydı, çünkü ben bunu sonradan fark ettim.

4) bulamadım:Şekil 6. "Ekstra" fonksiyonun (kırmızı ok) görünürlüğü, sınıfın yüklendiği işaretçi türüne göre belirlenir. Bu örnek ekte OOP_sDefaultVirtual_1.mq5 dosyasında bulunabilir.

5) Bir kütüphanenin ne olduğuna dair net bir gösterge bulamadım. Görünüşe göre, fonksiyonların sınıf(lar)ını saklamanın bir yolu mu? Yani include dosyasına benzer, sadece include dosyası kaynak olarak ve kütüphane derlenmiş bir dll olarak mı saklanıyor?

Makale için çok teşekkür ederim! Özellikle materyalin tutarlı bir şekilde sunulmasından memnun kaldım.

1. Evet.

2. "Array of objects" bölümünde bir örnek var, aslında tüm bölüm açıklamalı bir örnek.

3. "Programın çalışma mantığını değiştirmek için OOP kullanımı" bölümünde ele alınmıştır.

4. "Bu örnek dosyanın ekinde yer almaktadır..." ifadesi, dosyanın bölüm başlığı ile belirtilen bölüm için bir örnek içerdiği anlamına gelir. Bu, örneklerin makalede yazılan her şeyi tekrarladığı anlamına gelmez. Bu örnekler hiç olmayabilir, her şey makalede yazılmıştır. Ancak örnekler oradadır, onları temel alabilir ve deneyebilirsiniz. Makale birincil, örnekler ikincildir.

5. Уже давно указано: http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

[Silindi]  
Teşekkürler. Güzel makale.
[Silindi]  

Yetkin bir "erişilebilir" dille yazılmış çok ilginç bir makale.

Yazara teşekkür ederim.

 
Sağ ol dostum. Bu makale bana çok yardımcı oldu. EA'mı OOP'ye geçiriyordum ve sınıf dizileriyle ilgili özel bir sorun yaşıyordum. Dinamik işaretçiler açık ve mükemmel bir şekilde açıklanmış. Tekrar teşekkürler.
 
Çok iyi yazılmış bir makale! Yazar sayesinde nihayet fark ettim.
 

Bu makaleden kopyaladığım iki kod örneğim var. Her ikisi de bir sınıfa işaretçi dizisi oluşturuyor ve çıkışta bunları siliyor. Ancak, biri bellek sızıntısı ile çıkarken diğeri bellek sızıntısı olmadan çıkıyor. Tek fark 2. örnekte yıkıcıdaki 'Alert' yorumlanmış. Yıkıcıdaki alert kaldırıldığında bellek sızıntısı oluyor. Bu çok garip. Biri açıklayabilir mi??? Lütfen yardım edin, bu beni ÇILDIRTIYOR.

Bu makaledeki kod örneklerinin sonuna, yazdığım ve bellek sızıntısı olan son derece basit bir kod örneği ekledim. Yine, neden???? Bu son kod örneğinde karmaşık hiçbir şey yok. ..


Bu kod bellek sızıntısı olmadan çalışıyor:

class CName
  {
private:
   int               m_arg; // Örnek için değişken
public:
                     CName(int aArg)
     { // Kurucu
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Yıkıcı
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // Dizi

void OnInit()
  {
// Sınıfın on örneğini yüklemek için dizi hazırlayın
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Örnekleri yükle
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // Sonunda tüm örnekleri bellekten kaldırın
      delete(cname[i]);
     }
}

Uzman günlüğünden alınan mesajlar, sızan bellek olmadığına dikkat edin:

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Yıkıcı 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Yıkıcı 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 2

TR 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Yıkıcı 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Yıkıcı 9

Bu kod bir bellek sızıntısı ile çıkar!!!! Neden????????? Tek fark yıkıcıdaki 'Alert' ifadesinin yorumlanması...

class CName
     {
private:
   int               m_arg; // Örnek için değişken
public:
                     CName(int aArg)
     { // Kurucu
      m_arg=aArg;
      //Alert("Constructor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Yıkıcı
      //Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---

CName *cname[]; // Dizi

void OnInit()
  {
// Sınıfın on örneğini yüklemek için dizi hazırlayın
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Örnekleri yükle
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // Sonunda tüm örnekleri bellekten kaldırın
      delete(cname[i]);
     }
}

Uzman günlüğünden mesajlar, sızan belleğe dikkat edin:

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 10 silinmemiş nesne kaldı

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 CName türünde 10 nesne kaldı

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 bayt sızan bellek

Son örnek, benim kodum, çok basit ama bellek sızıntısı ile çıkıyor....

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| Uzman başlatma işlevi|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
//| Uzman başlangıçtan kaldırma işlevi|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

Uzman günlüğünden mesajlar, sızan belleğe dikkat edin:

MR 0 tester (EURUSD,M1) 14:07:23 Son Hata- 0 Geçerli zaman: 2013.02.06 23:07:23

FL 1 tester (EURUSD,M1) 14:07:23 10 silinmemiş nesne kaldı

KN 1 tester (EURUSD,M1) 14:07:23 CCandleStick türünde 10 nesne kaldı

JS 1 tester (EURUSD,M1) 14:07:23 160 bayt sızan bellek



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

İki örneğim var...

Üç varyantı da kontrol ettim. Üçü de aynı. Hepsi normal. Hiçbiri sızıntı vermiyor. Bu örneklerde, bu olamaz - dizimiz var, dizinin her elemanında örnek var, bittiğinde tüm nesneleri siliyoruz. Nesneler kendilerinin kopyalarını oluşturmazlar, aynı şeyi silmeyi kaçıramazsınız. Eğer nesne kendi kopyasını yaratırsa, o zaman silme konusunda zorluklar yaşayabiliriz, bir şeyi kaçırmak çok kolaydır. Gerçekten sızıntı olan varyantları gösterin.

Kod eklemek için SRC düğmesini kullanın (daha iyisi - dosya ekleyin).

İngilizcem için özür dilerim :)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
OOP modern bir program dilidir, ancak onu anlamak ve kod yazmak için çok zamana ve şımartmaya ihtiyacımız var. İyi makale için teşekkürler
 
Integer:

Üç varyantı da kontrol ettim. Üçü de aynı. Hepsi normal. Hiçbiri sızıntı vermiyor. Bu örneklerde, bu olamaz - dizimiz var, dizinin her elemanında örnek var, bitirdiğimizde tüm nesneleri siliyoruz. Nesneler kendilerinin kopyalarını oluşturmazlar, aynı şeyi silmeyi kaçıramazsınız. Eğer nesne kendi kopyasını yaratırsa, o zaman silme konusunda zorluklar yaşayabiliriz, bir şeyi kaçırmak çok kolaydır. Gerçekten sızıntı olan varyantları gösterin.

Kod eklemek için SRC düğmesini kullanın (daha iyisi - dosya ekleyin).

İngilizcem için özür dilerim :)

Cevap vermeye zaman ayırdığınız için çok teşekkürler. Takip eden sorumu gördüğünüzden emin değilim. Bu foruma çok aşina olmadığım için muhtemelen silinen ayrı bir yorumdaydı. Ancak, üç örneği de MetaTrader'ın eski bir sürümüne sahip eski bir bilgisayarda çalıştırmayı denedim. Eski sürümde 3'ü de iyi çalışıyor gibiydi. Uzman günlüğü 'bellek sızıntısı' hatası oluşturmadı, sanırım 560?Hatırlamıyorum ve 560'ı yeni 756 yapısına yükselttim. Yeni yapıdan sonra aynı bellek sızıntısı sorunlarını yaşıyorum. Eski yapının bir özellik olmadığı için bellek sızıntısı sorunlarını bildirmemiş olması mümkün mü? Hangi yapıyı kullanıyorsunuz? Tekrar teşekkürler.