OOP. Başvuru soruları - sayfa 11

 
Interesting :

Okuyabilmek güzel... :)

Ayrıca kötü bir yaklaşım değil, anladığım kadarıyla bu yaklaşımların her ikisi de yalnızca bir parametreyi (farklı türlerde de olsa) aktarmak/okumak için tasarlanmıştır.

Ancak çok sayıda parametre varsa ve hepsini temel sınıfa sığdıramıyorsanız ne kadar ilginç olur?

Anladığım kadarıyla, ayrıca geçmekte olduğumuz parametrenin indeksini de girin (sınıfta da, indekse göre yığılmış parametrelerle bir dizi oluşturabilirsiniz)?

aynı şeyi anlamadım...

Örneğimde bir dizin var, ancak açıkça sayısal değil, bir numaralandırma....

 

Unut gitsin, buna değmez.

 

Interesting :

Yedelkin :

Genel olarak https://www.mql5.com/ru/forum/3566/page6#comment_58280 sorunun tartışılmasının ardından Yönetim Kurulu'na talep gönderdim.

1. Bilmiyorum, bilmiyorum.

Bana öyle geliyor ki, geliştiriciler güvenlik uğruna işlevsellikten ödün vererek belirli adımlar atmayacaklar (bir yandan bu doğru).

Bildiriyorum.

Talep şöyleydi:
...

Öneririm:

1. Şekiller[10] dizisinin CShape'den türetilen sınıf örnekleriyle nasıl doğru şekilde doldurulacağını belirtmek için El Kitabının "Polimorfizm" bölümünü netleştirin (bir örnek verin).

2. Satırın yazımını kontrol edin:

CShape[ 10 ] shapes;                       // массив объектов CShape

3. Sınıfları bildirirken, beyan edilen sınıfın adından hemen sonra kaşlı ayraç koymanın gerekli olup olmadığını açıklayın:

sınıf CShape{};

sınıf CCircle{} : genel CShape

sınıf CSquare{} : genel CShape

Cevap:

Raşid Umarov 2011.04.11 15:17

Yardımın yazıldığı sırada, bazı noktalar dokümantasyon için henüz net değildi. Bu anı düzelteceğiz ve doğru kodu ekleyeceğiz. Mesajın için teşekkürler.

Yardıma genişletilmiş bir açıklama eklenecek, işte ondan bir alıntı:

Programda farklı türde nesneler (CCircle ve CSquare) kullandığımız, ancak aynı CShape temel türünden miras aldığımız varsayılmaktadır. Polimorfizm, CShape temel türünde bir dizi nesne oluşturmamıza izin verir, ancak bu diziyi bildirirken nesnelerin kendileri hala bilinmiyor ve türleri tanımsız.

Dizinin her bir elemanında ne tür bir nesnenin bulunacağına ilişkin karar, doğrudan programın yürütülmesi sırasında verilecektir. Bu, ilgili sınıfların nesnelerinin dinamik olarak oluşturulmasını ve dolayısıyla nesnelerin kendileri yerine nesne işaretçilerini kullanma ihtiyacını ifade eder.

Nesnelerin dinamik olarak oluşturulması için yeni operatör kullanılır, bu tür her bir nesne, silme operatörü kullanılarak bağımsız ve açıkça silinmelidir. Bu nedenle, CShape türünde bir işaretçi dizisi bildireceğiz ve her bir öğesi için komut dosyası örneğinde gösterildiği gibi gerekli türde ( yeni Sınıf_adı) bir nesne oluşturacağız:

 //+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart ()

  {

//--- объявим массив указателей объектов базового типа 

   CShape *shapes[ 5 ];   // массив указателей на объекты CShape



//--- здесь заполняем массив производными объектами

//--- объявим указатель на объект типа CCircle

   CCircle *circle= new CCircle();

//--- задаем свойства объекта по указателю circle

   circle.SetRadius( 2.5 );

//--- поместим в shapes[0] значение указателя

   shapes[ 0 ]=circle;



//--- создаем еще один объект CCircle и запишем его указатель в shapes[1]

   circle= new CCircle();

   shapes[ 1 ]=circle;

   circle.SetRadius( 5 );



//--- тут мы намеренно "забыли" задать значение для shapes[2]

//circle=new CCircle();

//circle.SetRadius(10);

//shapes[2]=circle;



//--- для неиспользуемого элемента установим значение NULL

   shapes[ 2 ]= NULL ;



//--- создаем объект CSquare и запишем его указатель в shapes[3]

   CSquare *square= new CSquare();

   square.SetSide( 5 );

   shapes[ 3 ]=square;



//--- создаем объект CSquare и запишем его указатель в shapes[4]

   square= new CSquare();

   square.SetSide( 10 );

   shapes[ 4 ]=square;



//--- массив указателей есть, получим его размер

   int total= ArraySize (shapes);

//--- пройдем в цикле по всем указателям в массиве 

   for ( int i= 0 ; i< 5 ;i++)

     {

       //--- если по указанному индексу указатель является валидным

       if ( CheckPointer (shapes[i])!= POINTER_INVALID )

        {

         //--- выведем в лог тип и площадь фигуры

         PrintFormat ( "Объект типа %d имеет площадь %G" ,

               shapes[i].GetType(),

               shapes[i].GetArea());

        }

       //--- если указатель имеет тип POINTER_INVALID

       else

        {

         //--- сообщим об ошибке

         PrintFormat ( "Объект shapes[%d] не инициализирован! Его указатель %s" ,

                     i, EnumToString ( CheckPointer (shapes[i])));

        }

     }



//--- мы должны самостоятельно уничтожить все созданные динамические объекты

   for ( int i= 0 ;i<total;i++)

     {

       //--- удалять можно только объекты, чей указатель имеет тип POINTER_DYNAMIC

       if ( CheckPointer (shapes[i])== POINTER_DYNAMIC )

        {

         //--- сообщим об удалении

         PrintFormat ( "Удаляем shapes[%d]" ,i);

         //--- уничтожим объект по его указателю

         delete shapes[i];

        }

     }

  }


Bir nesne silme operatörü tarafından yok edildiğinde, işaretçisinin tipinin kontrol edilmesi gerektiğini unutmayın. Sil kullanılarak yalnızca POINTER_DYNAMIC işaretçisi olan nesneler silinebilir, farklı türdeki işaretçiler için bir hata alınacaktır.

Bence bu örnek, bir dizi işaretçi oluşturma fikrini tamamen ortaya koyuyor.
Raşit Umarov 2011.04.11 10:31

Mesaj için teşekkürler, #2 ve #3 düzeltildi. Yardımın yeni sürümlerinde olacak



 

Soru. Standart kitaplık aşağıdaki satırları kullanır

 void CTrade::Request( MqlTradeRequest & request) const
  {...}

Referans diyor ki: " const belirteci, yapıların ve sınıfların üyeleri için geçerli değildir." Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

Yedelkin :

..................

Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?

Ah evet, ben de merak ediyordum. "Oyunun kurallarının" tamamen farkında olarak, dili anlamlı bir şekilde kullanmak istiyorum.
 
Yedelkin :

Soru. Standart kitaplık aşağıdaki satırları kullanır

Referans diyor ki: " const belirteci, yapıların ve sınıfların üyeleri için geçerli değildir." Bir sınıf yönteminde yukarıdaki const kullanımı ne anlama gelir ve bunun gibi durumlarda kullanmanın kuralları nelerdir?

Bir yapının/sınıfın üyesi bir şeydir, ancak bir yöntem başka bir şeydir.

const olarak bildirilen bir yöntem, sınıfının durumunu/üyelerini değiştirmediği anlamına gelir. Yani, böyle bir yöntem çağrıldıktan sonra sınıfın iç durumu değişmeden kalır. Ayrıca derleyiciye sınıf üyelerini değiştirme girişimlerini kontrol etmesini söylemek için kullanılır.

 
Renat :

Bir yapının/sınıfın üyesi bir şeydir, ancak bir yöntem başka bir şeydir.

const olarak bildirilen bir yöntem, sınıfının durumunu/üyelerini değiştirmediği anlamına gelir. Yani, böyle bir yöntem çağrıldıktan sonra sınıfın iç durumu değişmeden kalır. Ayrıca derleyiciye sınıf üyelerini değiştirme girişimlerini kontrol etmesini söylemek için kullanılır.

Vay. Teşekkür ederim! Ve kafamı kırdım.

 
TheXpert :
Bu arada, konuşma geldiğinden beri mantıklı bir soru - geçici bir talimat yok ve beklenmiyor mu?

Ve nasıl uygulanabilir? , çünkü akışlar birbirleriyle etkileşmezler,

Şimdi, veriler iş parçacıkları arasında serbestçe aktarılabilseydi, evet, böyle bir talimata ihtiyaç olurdu.

 
Akor, yazdım ve yanlış bir şey yazdığımı düşündüm :) şimdi ne olduğunu anladım. Tabii ki uçucu değil -- değişken :))
 
class COracleTemplate
  {
private :
public :
   string             filename;
                     COracleTemplate(){Init();};
                    ~COracleTemplate(){DeInit();};
   virtual void       Init(){filename= this .Name(); Print ( "loadSettings from " ,filename);};
   virtual void       DeInit(){ Print ( "saveSettings to " ,filename);};
   virtual string     Name(){ return ( "Prpototype" );};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CCO2: public COracleTemplate
  {
   virtual string     Name(){ return ( "CO2" );};
  };
class CH2O: public COracleTemplate
  {
   virtual string     Name(){ return ( "H2O" );};
  };
COracleTemplate* CO2,*H2O;
void OnStart ()
  {
   CO2= new CCO2;
   Print (CO2.Name(), " filename=" ,CO2.filename);
   delete CO2;
   
   H2O= new CH2O;
   Print (H2O.Name(), " filename=" ,H2O.filename);
   delete H2O;
   
  }

Tünaydın.

Bir soru

yukarıdaki koda göre

neyi yanlış yaptım yoksa MT5'te temelde ulaşılamaz mı?

(Açık olduğunu düşündüğüm gibi) - dosya adı değişkenlerinde yeniden tanımlanmış adlar almak istiyorum ...

Neden: