OOP. Başvuru soruları - sayfa 7

 
equivalent23 :

Kesinlikle:

Sorunun, CShape'den türetilen sınıf örnekleriyle shape [10] dizisinin nasıl doğru bir şekilde doldurulacağı olduğunu fark ettim. Nedense önerdiğim çözüm çalışmıyor. Düşünelim.
 
Yedelkin :
Sorunun, CShape'den türetilen sınıf örnekleriyle shape[10] dizisinin nasıl doğru bir şekilde doldurulacağı olduğunu fark ettim. Nedense önerdiğim çözüm çalışmıyor. Düşünelim.

Dizi, sınıfın kendi türünden değil, sınıflara yönelik işaretçi türünden olmalıdır.

Ardından yeni operatör kullanılabilir.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL :

Dizi, sınıfın kendi türünden değil, sınıflara yönelik işaretçi türünden olmalıdır.

Ardından yeni operatörü kullanabilirsiniz.

Bir örnek alabilir miyim?

Sadece verdiğim örnek belgelerden alınmış ve nasıl çalışması gerektiği açık değil...

 
Yedelkin :
Sorunun, CShape'den türetilen sınıf örnekleriyle shape[10] dizisinin nasıl doğru bir şekilde doldurulacağı olduğunu fark ettim. Nedense önerim işe yaramıyor. Düşünelim.

Düşün, düşünme, 100 ruble para değil.

Örnek %100 hatalıdır ve böyle bir uygulama ya düşünülmemiştir ya da sonuna kadar tamamlanmamıştır.

Deneylerimin sonuçlarını kodda vermeyeceğim, mevcut sonuçları vereceğim ve şu şekilde:

1. Nesneleri sınıf olarak değil, yapı olarak tanımlarsanız, bir diziye kolayca sığarlar. Sadece bu durumda, sanallığın kaldırılması gerekecektir ve yalnızca dizinin sahip olduğu nesne türlerinin (bu durumda, temel sınıf) işlevselliği ile çalışmak mümkün hale gelir;

2. Her ikisini de işaretçi olarak tanımlayabilirsiniz, ardından bir dizi de oluşturabilirsiniz.Ama burada bile sorunlar var:

a) işaretçilerin temizliği yoksa, bir bellek sızıntısı görülür;

b) torunların işlevselliği ile normal şekilde çalışmak da imkansızdır.

not

Bunun yerine, temel sınıfta bildirilen işlevsellik kullanılabilirken, alt sınıflarda da görünür, ancak alt sınıflarda görünen her şey mevcut değildir.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL :

Dizi, sınıfın kendi türünden değil, sınıflara yönelik işaretçi türünden olmalıdır.

Ardından yeni operatör kullanılabilir.

Evet, işaretçilerin kullanımı hakkında bu yönde de düşündüm. AMA o zaman belgelerdeki koşullar karşılanmaz:

" Bir kare (sınıf CSquare) için alan kenarlar cinsinden hesaplanır, bir daire için (sınıf CCircle ) alan yarıçap cinsinden ifade edilir ve bu böyle devam eder. bu dizinin herhangi bir elemanı.

... Bir karenin ve bir dairenin alanının hesaplanması, m_radius ve m_square_side üyelerinin karşılık gelen değerlerini gerektirdiğinden, ilgili sınıfın bildirimine SetRadius ve SetSide() fonksiyonlarını ekledik. Şimdi Shape türünde bir dizi tanımlayabilir ve onu türetilmiş sınıf nesneleriyle doldurabiliriz ..."

 
AlexSTAL :

Dizi, sınıfın kendi türünden değil, sınıflara yönelik işaretçi türünden olmalıdır.

Ardından yeni operatör kullanılabilir.

İyi çalışmayacak. Dizi oluşacak olmasına rağmen.

Yedelkin :

... Bir karenin ve bir dairenin alanının hesaplanması, m_radius ve m_square_side üyelerinin karşılık gelen değerlerini gerektirdiğinden, ilgili sınıfın bildirimine SetRadius ve SetSide() fonksiyonlarını ekledik. Artık Shape türünde bir dizi tanımlayabilir ve onu türetilmiş sınıf nesneleriyle doldurabiliriz..."

İşin püf noktası, dizi temel sınıfın türüne sahipse, alt öğelerin işlevlerine erişemezsiniz. onlar. SetRadius() ve SetSide() artık mevcut değil.

Yani şu ana kadar üç seçenek görüyorum:

1. dizi homojen olmalıdır (mümkünse);

2. MQL5 için OOP'nin felsefesi ve mimarisinden bir şey anlamıyorum;

3. Geliştiriciler ya çalışmayan bir örneği yeniden kontrol eder ya da soruyu tamamlamaz.>

 
Interesting :
İyi çalışmayacak. Dizi oluşacak olmasına rağmen.
Normal çalışmayacak ne demek?
 
Interesting :

Bunun yerine, temel sınıfta bildirilen işlevsellik kullanılabilir, ancak alt sınıflarda görünür, ancak soyundan gelenlerin kendisinde görünen her şey mevcut değildir .

Vay be, tam olarak karşılaştığım şey buydu.

ilginç :

Örnek %100 hatalı...

El Kitabının yazarlarının bu konudaki cevabına ihtiyaç olduğu ortaya çıktı.

 
Interesting :
İyi çalışmayacak. Dizi oluşacak olmasına rağmen.

İşin püf noktası, dizi temel sınıfın türüne sahipse, alt öğelerin işlevlerine erişemezsiniz. onlar. SetRadius() ve SetSide() artık mevcut değil.

Şimdiye kadar üç seçenek görüyorum:

1. dizi homojen olmalıdır (mümkünse);

2. MQL5 için OOP'nin felsefesi ve mimarisinden bir şey anlamıyorum;

3. Geliştiriciler ya çalışmayan bir örneği yeniden kontrol eder ya da soruyu tamamlamaz.>

Yapmak:

 class CBase
  {
public :
   void m_radius() { Print ( "CBase" );}
  };

class CTest : public CBase
  {
public :
   void m_radius() { Print ( "CTest" );}
  };

CBase* Base;

void OnStart ()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

sanallaştırma ile çok daha kolay hale getirilebilir:

 class CBase
  {
public :
   virtual void m_radius() { Print ( "CBase" );}
  };

class CTest : public CBase
  {
public :
   virtual void m_radius() { Print ( "CTest" );}
  };

CBase* Base;

void OnStart ()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL :
Normal çalışmayacak ne demek?

1. Torunların işlevselliği mevcut değil. Kim ve nasıl bilmiyorum ama Dizi'den SetRadius() ve SetSide()'a şahsen erişemedim.Belki sorunu bir otojenle çözmenin bir yolu vardır, ama ben onsuz istiyorum.

2. Belki işaretçilerle bu şekilde çalışmıyorum, ama ya sürekli bir sızıntı alıyorum ya da ana işin devam ettiği blokta işaretçilere vurmam gerekiyor.