OOP. Başvuru soruları - sayfa 12

 
GreyCardinal :

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

Init()'in doğru çalışması için nesne oluşturulduktan sonra çağrılması gerekir.

Ya da değil?

VMT'nin yalnızca yapıcının son kodunda başlatıldığını düşünüyorum, bu nedenle yapıcıda bir yöntem çağrılırken, oluşturulan nesnenin türü değil, değişken türünün yöntemi çağrılacak.

Bunun gibi bir şey.

En azından bu işe yarar:

 void OnStart ()
  {
   CO2= new CCO2;
   CO2.Init();
   Print (CO2.Name(), " filename=" ,CO2.filename);
   delete CO2;
   
   H2O= new CH2O;
   H2O.Init();
   Print (H2O.Name(), " filename=" ,H2O.filename);
   delete H2O;
  }

MetaQuotes'a : Doğru anlarsam, yapıcılarda sanal işlevlerin çağrılmasını tamamen yasaklamak daha iyidir. Sırayla.

Ya da onları çalıştır. Ne şüphem var.

 

Parametrik kurucularla yeni tanıştım. Ama öyle görünüyor ki örnekte

 //+------------------------------------------------------------------+
//| класс для хранения фамилии и имени персонажа                     |
//+------------------------------------------------------------------+
class CPerson
  {
   string             m_first_name;     // имя 
   string             m_second_name;     // фамилия
public :
   //--- пустой конструктор по умолчанию
                     CPerson() { Print ( __FUNCTION__ );};
   //--- параметрический конструктор
                     CPerson( string full_name);
   //--- конструктор со списком инициализации
                     CPerson( string surname, string name): m_second_name(surname, m_first_name(name)) {};
   void PrintName(){ PrintFormat ( "Name=%s Surname=%s" ,m_first_name,m_second_name);};
  };
parantezler vurgulanan satıra yanlış yerleştirilmiş.
 
Yedelkin :

Parametrik kurucularla yeni tanıştım. Ama öyle görünüyor ki örnekte

parantezler vurgulanan satıra yanlış yerleştirilmiş.
Teşekkürler, düzelteceğiz.
 

Teknik mesaj (yapıcılar da dahil olmak üzere, başlatma konusunda küçük bir tartışmanın başlangıcı). Yeni başlayanların ağır baskısı altında kaybolmamak için taşındı: https://www.mql5.com/ru/forum/58/page31#comment_66890

Изучаем и пишем вместе на MQL5
Изучаем и пишем вместе на MQL5
  • www.mql5.com
2) вывод всей возможной информации по инструментам, ордерам и др.
 

Başlatma hakkında soru. Genel bir kural olarak, dize değişkenleri ve karmaşık nesneler "varsayılan olarak" otomatik olarak başlatılır . Aynı zamanda bilgisayarın belirli bir miktar işlem gücü boşa harcanır (buna amatörce terimler için kusura bakmayın "bilgisayar saatleri" diyorum).

Artık değişkenleri kullanıcı tanımlı değerlerle başlatmanıza izin veren başlatma listeleri var. Otomatik başlatma ve özel bir değerle başlatma arasında başlatma hızında herhangi bir fark var mı? Başka bir deyişle, başlatma listeleri (ve kullanıcı tanımlı değerler) kullanıldığında, otomatik başlatmaya kıyasla "bilgisayar döngülerinin" sayısı artıyor mu?

 
Yedelkin : Başka bir deyişle, başlatma listeleri (ve kullanıcı tanımlı değerler) kullanıldığında "bilgisayar döngülerinin" sayısı otomatik başlatmaya kıyasla artıyor mu?
Peki ya birkaç döngü kurtarırsak, bu önemli bir kazanç sağlar mı? Ayrıca, başlatma bir kez gerçekleştirilir ve değerlerin daha sonra atanması gerekir.
 
Valmars :
Peki ya birkaç döngü kurtarırsak, bu önemli bir kazanç sağlar mı? Ayrıca, başlatma bir kez gerçekleştirilir ve değerlerin daha sonra atanması gerekir.
Cevap konuya değil. Şahsen benim için soru önemli çünkü tekniği anlamak istiyorum. Her vuruş önemlidir. Aksi halde soru sorulmazdı. Kurallara bakılmaksızın su ısıtıcılarını perçinlemeyi biliyoruz.
 
Yedelkin :
Şahsen benim için soru önemli çünkü tekniği anlamak istiyorum.

Doğru yaklaşım, her şey böyle olurdu. Başlatma listeleri, parametrik oluşturucuların tanıtılmasının bir sonucudur.

İki örneğe bakalım:

 class A
{
private :
   // конструктор по умолчанию недоступен
   A(){}
public :
   A( const double & value )
      : m_Value( value )
   {}
private :
   double m_Value;
}

class B
{
public :
   B()
   // т.к. коструктор А не имеет конструктора по умолчанию, единственный способ
   // использования класса -- инициализация в списке инициализации.
   // по-другому просто не должно скомпилиться
      : A( 0 )
   {
   }

private :
   A m_Value;
}

Hepsi yorumlarda var.

Örnek 2:

 class A
{
public :
   A()
   {
      Init( 0 );
   }
   
   A( const double & value )
   {
      Init( value );
   }
   
   void Init( double value )
   {
       // очень тяжелая функция
   }
};

class B
{
public :
   // вариант1, правильный
   B( const double & value )
      : m_Value( value )
   {
   }

/*
   // вариант2, неправильный
   B(const double& value)
   {
      m_Value.Init(value);
   }
*/

private :
   A m_Value;
};
Yani seçenek 1'de Init'e 1 çağrımız var, seçenek 2'de 2 çağrımız var. Dan beri "tip" işlevi çok ağırdır, ayrıca vardır.
 

TheXpert , çok teşekkür ederim! Bunu halledeceğim.

Sözlerinizden dolaylı olarak " string , dinamik dizi ve karmaşık nesne " türündeki bir değişkenin otomatik olarak başlatılması ile aynı değişkenin kullanıcı tarafından başlatılması arasında hız farkı olmadığını anladım.

 
Yedelkin :

Sözlerinizden dolaylı olarak " string , dinamik dizi ve karmaşık nesne " türündeki bir değişkenin otomatik olarak başlatılması ile aynı değişkenin kullanıcı tarafından başlatılması arasında hız farkı olmadığını anladım.

Bir örnekle göster ki tutarsızlık olmasın, sonra cevaplayayım.
Neden: