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üvoidveri tipini döndürür;"
struct A{
int x,y;
};
voidOnStart (){
A a, b;
Print ( typename (a = b)); // void
}
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)
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?
Çı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
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ı)))
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); -...
MQL5.com web sitesine giriş yapmak için çerezlerin kullanımına izin vermelisiniz.
Lütfen tarayıcınızda gerekli ayarı etkinleştirin, aksi takdirde giriş yapamazsınız.
Hesabınıza giriş yaptınız. İki faktörlü kimlik doğrulama devre dışı bırakıldı. Yeniden kurup yeni bir QR kodu tarayın veya iki faktörlü kimlik doğrulama devre dışıyken devam edin.
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;"
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.
"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
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ı?
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
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
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:
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?
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
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ı)))
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:
Ve birisi bu alan başlatmanın ne olduğunu açıklıyor:
bundan daha iyi:
Ve neyse, amaç ne?