MQL5'te OOP hakkında sorular - sayfa 44

 
Igor Makanu :

aynı fikirde olmamak:

Lütfen bir "atama operatörü" ve bir "kopya oluşturucu"nun ne olduğu, nasıl farklı oldukları, ne zaman ve nasıl çağrıldıkları (açık ve dolaylı olarak) hakkındaki bilginizi güncelleyin.
Kodda bir işlevden yerel bir değişkenin dönüşünü sarı renkle vurgularsınız, bunun sonucunda varsayılan kopya oluşturucu çağrılır (atama operatörüyle karıştırılmamalıdır).

"Tam veri türü" ne yazık ki tamamen açık değil ve kodunuzla kanıtlamaya çalıştığınız şey de değil ...
Tekrar ediyorum: " MQL'deki varsayılan atama operatörü void veri tipini döndürür;"

 struct A{
   int x,y;
};

void OnStart (){
   A a, b;
   Print ( typename (a = b));   // void
}
 
Koldun Zloy :

Hatalısınız.

Sadece bunu döndüren kendi operatörünüzü tanımlayın= ve farkı görün.

Bir atamanın sonucu tekrar atandığında bunu görebilirsiniz.

bir operatör = tanımlarsam, asıl amacımdan uzaklaşırım - varsayılanı aramak için ::=

çözülmemiş bir sorun gibi görünüyor.


Sergey Dzyublik :

"Tam veri türü" ne yazık ki tamamen açık değil ve kodunuzla kanıtlamaya çalıştığınız şey de değil ...

full is full - veri yapısı kaydedilecek ve yeni alanlar eklersem yapıların kopyalanmasını kontrol etmeye gerek yok

 
Igor Makanu :

bir operatör = tanımlarsam, asıl amacımdan uzaklaşırım - varsayılanı aramak için ::=

Gerçekten böyle bir göreve ihtiyacınız var mı?

b = c = a;
 
Igor Makanu :

full is full - veri yapısı kaydedilecek ve yeni alanlar eklersem yapıların kopyalanmasını kontrol etmeye gerek yok

Ardından, terminolojinize göre, varsayılan atama operatörünü çağırmak "eksik veri türü" verebilir.
2019.05.03 tarihli hata hala düzeltilmedi: https://www.mql5.com/en/forum/1111/page2451#comment_11556395

 
Koldun Zloy :

Gerçekten böyle bir göreve ihtiyacınız var mı?

tamamen teoride, gerekli - bunun operatör değil de bir tür "yeni varlık" olup olmadığını bilmek istedim =

pratik kullanım için hiç gerekli değil, sorunsuz 2 operatörde yazacağım


Sergey Dzyublik :

Ardından, terminolojinize göre, varsayılan atama operatörünü çağırmak "eksik veri türü" verebilir.
2019.05.03 tarihli hata hala düzeltilmedi: https://www.mql5.com/en/forum/1111/page2451#comment_11556395

"Terminolojim" sormaktır, şikayetim yok,

ancak varsayılan operatörü = kullanmanın anlamı, yalnızca yapıdaki alanları tanımlamanız ve dizilerin boyutları da dahil olmak üzere her şeyin kopyalanması uygundur (yalnızca boyutta bir artış olsa da - çalışma prensibi ArrayCopy() gibi)


Peki, eğer bu bir hataysa, o zaman şimdiye kadar

 

tamamen teorik bir soru.

Belki de SB'de böyle bir kurucu çağrısı gördüm:

 class A{
public :   
   A(){ Print ( __FUNCTION__ );}
};

class B{
public :   
   A a1,a2;
   B() :a1(),a2() { Print ( __FUNCTION__ ); }   
};

bu kod arasındaki fark ne olurdu:

 class A{
public :   
   A(){ Print ( __FUNCTION__ );}
};

class B{
public :   
   A a1,a2;
   B() { Print ( __FUNCTION__ ); }   
};

Çıktısını aldım, farkı görmedim, o zaman biraz daha spesifik olarak - a1 ve a2 nesnelerinin yapıcılarına zorunlu bir çağrıyı ne verir veya neden kullanabilirim?

ilk seçeneğin "kolaylığı" nedir?

 
Igor Makanu :

tamamen teorik bir soru.

Belki de SB'de böyle bir kurucu çağrısı gördüm:

bu kod arasındaki fark ne olurdu:

Çıktısını aldım, farkı görmedim, o zaman biraz daha spesifik olarak - a1 ve a2 nesnelerinin yapıcılarına zorunlu bir çağrıyı ne verir veya neden kullanabilirim?

ilk seçeneğin "kolaylığı" nedir?

yapıcıların parametreleri vardır ve bir şekilde iletilmeleri gerekir

Yani, parametre yokken fark yoktur, ancak bir yapıcı A (int arg) varsa, o zaman tamamen farklı bir patiska

 
Maxim Kuznetsov :

yapıcıların parametreleri vardır ve bir şekilde iletilmeleri gerekir

Yani, parametre yokken fark yoktur, ancak bir yapıcı A (int arg) varsa, o zaman tamamen farklı bir patiska

muhtemelen haklısın - genel olarak görevlere bağlı

Sadece ilk seçenek nedeniyle zorluklar yaşadım, B sınıfı 2 kurucu kullanmak istediğimde - her iki kurucuda da kod çoğaltması aldım - onu kaldırdım, sadece kodun ilk seçenekte olan kısmı kaldı, bu yüzden soru ortaya çıktı, nerede gördüm ve hangisi yazdı)))

 
Igor Makanu :

a1 ve a2 nesnelerinin yapıcılarının zorunlu çağrısını ne verir veya neden kullanabilirsiniz?

Sürecin doğru adı "a1 ve a2 oluşturucularının zorunlu çağrısı" değil, sınıf alanlarının başlatılmasıdır (statik olmayan).
Aşağıdaki durumlarda zorunludur:

- sınıfın sabit alanlarının kullanımı;
- sınıfın alanları için varsayılan bir kurucunun olmaması;
- bir kurucu çağrısı dışında herhangi bir başlatma yönteminde sınıf alanı nesnelerinin olmaması (örneğin, atama operatörü kaldırılmıştır);
-...

 

Ve birisi bu alan başlatmanın ne olduğunu açıklıyor:

CArray::CArray( void ) : m_step_resize( 16 ),
                       m_data_total( 0 ),
                       m_data_max( 0 ),
                       m_sort_mode(- 1 )
  {
  }

bundan daha iyi:

CArray::CArray( void )
  {
        m_step_resize= 16 ;
        m_data_total= 0 ;
        m_data_max= 0 ;
        m_sort_mode=- 1 ;
  }

Ve neyse, amaç ne?

Neden: