MQL5'te OOP hakkında sorular - sayfa 8

 
Igor Makanu :

silme yazmayın - her şey düzgün çalışacak, bu günah (batıl inançtan bahsediyorum))) terminali devralacak ve "48 bayt sızdırılmış bellek" günlüğünde mırıldanacak, ardından "CX türünde 2 nesne kaldı" ve "silinmemiş nesneler kaldı"

Not: Gösterge oluşturma şablonunda Deinit() yok - can sıkıcı

Neden bir işaretçi yerine bir nesne yaratmıyorsunuz? O zaman mırıldanmayacak - terminal alt sistemi onu izleyecek ve gerektiğinde öldürecek.

 
Dmitry Fedoseev :

Silmeden çalışacak, ama ne anlamı var. Ancak terminal bu sorunu üstleniyor mu? Yalnızca bellek sızıntılarını bildirir, ancak aynı nesneleri ayırmaz.

Onlara işaretçiler, terminal tarafından bilinen bir nesneye, örneğin, ArrayObj, List, vb. eklenirse, yeni tarafından oluşturulan nesneleri silmeyle ilgilenir...

 
Artyom Trishkin :

Neden bir işaretçi yerine bir nesne yaratmıyorsunuz? O zaman mırıldanmayacak - terminal alt sistemi onu izleyecek ve gerektiğinde öldürecek.

çünkü https://www.mql5.com/ru/forum/85652/page7#comment_12329866

Artyom Trishkin :

Onlara işaretçiler, terminal tarafından bilinen bir nesneye, örneğin, ArrayObj, List, vb. eklenirse, yeni tarafından oluşturulan nesneleri silmeyle ilgilenir...

kontrolsüz imha her zaman uygun değildir, ancak kontrol edilmesi gerekecek, belki yanılıyorum - nadiren CObject kullanıyorum

 

Benim görüşüme göre, bu özel ve grotesk bir şekilde basitleştirilmiş bir vaka. Kesinlikle değişmez bir nesne yaratın, böylece alanlarının değerini değiştirmek için onu çivilemeniz ve yeni bir tane doğurmanız gerekir ...

Ve birkaç nesne alanını değiştirmeniz gerekirse, diğer alanları gerekli bilgilerle birlikte mi bırakın? IMHO - bir silahla oturmak ve her hapşırmada tavşanlara ateş etmektense, nesnelerin her birinin etkileşimi ve kontrol edilebilirliği ile ilgilenmek (neyse ki kalıtım vardır) daha iyidir.

Her ne kadar, adalet içinde - bazen, çok sayıda arasında gerekli olanı aramak ve değiştirmek yerine yeni bir tane oluşturmak ve yaratmak daha hızlıdır. Eh, bu tabii ki doğrudan ona hitap etme organize değilse ...

 
Artyom Trishkin :

Benim görüşüme göre, bu özel ve grotesk bir şekilde basitleştirilmiş bir vaka. Kesinlikle değişmez bir nesne yaratın, böylece alanlarının değerini değiştirmek için onu çivilemeniz ve yeni bir tane doğurmanız gerekir ...

Ve birkaç nesne alanını değiştirmeniz gerekirse, diğer alanları gerekli bilgilerle birlikte mi bırakın? IMHO - her bir nesnenin etkileşimi ve kontrol edilebilirliği ile ilgilenmek (neyse ki kalıtım vardır), bir silahla oturup her hapşırmada tavşanlara ateş etmekten daha iyidir.

Her ne kadar, adalet içinde - bazen, çok sayıda arasında gerekli olanı aramak ve değiştirmek yerine yeni bir tane oluşturmak ve yaratmak daha hızlıdır. Eh, tabii ki, eğer doğrudan adresleme organize değilse ...

hmm, peki, geri çevirdin .... öyle, ama öyle değil)))

kullanılması gerektiği kadar uygun! - ama "ilk C++ ders kitabı"ndan alınan bu örnekler benim deneyimimde hayatım boyunca sürüklenebilir.. - kodlar sadece kısalmakla kalmadı, aynı zamanda gerçekten daha okunaklı ve yazım hataları oldu - C++ kitapları bunu çok mu öğretiyor? ;)


Artyom Trishkin :

Her ne kadar, adalet içinde - bazen, çok sayıda arasında gerekli olanı aramak ve değiştirmek yerine yeni bir tane oluşturmak ve yaratmak daha hızlıdır. Eh, tabii ki, eğer doğrudan adresleme organize değilse ...

peki, kitap temelleri hakkında ... programlamada "iyi biçim" kurallarına göre, gereklidir: bir değişken bildirdi - hemen başlat (hata ayıklama sırasında hatalar bu şekilde hariç tutulur), OOP'de bir yapıcı bunlar için hizmet eder amaçlar - bir nesne yarattı, her şeyi başlatacak kadar nazik olun

"Tüm kodu basit bir nesnenin arkasına çekerseniz", o zaman sınıfın tüm alanlarını yeniden başlatacak bir yönteme ihtiyaç duyulacaktır - neden bunu çoğaltıyorsunuz? - öldürüldü / yaratıldı = sonuç .... ama yine zevk ve din meselesi

 
Igor Makanu :

çünkü https://www.mql5.com/ru/forum/85652/page7#comment_12329866

kontrolsüz imha her zaman uygun değildir, ancak kontrol edilmesi gerekecek, belki yanılıyorum - nadiren CObject kullanıyorum

Ama sen listeleri kullanıyorsun. Ve orada - aynı şey. Pekala, liste için FreeMode() bellek yönetimi bayrağı sıfırlanmadıkça - bu durumda terminal izlemez - kullanıcı her şeyi halleder. Ancak bu durum, listenin bir kopyasıyla değiştirmek, silmek, sıralamak ve başka bir şey yapabilmek için gereklidir - sonuçta, nesnelere işaretçilerle bir liste oluşturulur ve birinin yeni bir liste kopyası oluşturursanız ve yeni liste nesnelerinde değişmeye başlayın (ve nesnelere işaretçiler var), ardından orijinal listedeki nesneler de değişecek (çünkü işaretçilerle çalışıyoruz). Burada, orijinali bırakmak ve kopyasıyla alay etmek için, kopya için bellek yönetimi bayrağını sıfırlamanız gerekir: FreeMode (yanlış) - o zaman bu kopya bağımsız bir kopya olacak ve içindeki nesnelerle güvenle çalışabilirsiniz. orijinali etkiliyor. Ve unutmayın ki, liste kopyasını terminal alt sisteminden çıkardığımıza göre, liste nesnelerini silmekten artık kendimiz sorumluyuz. Ya onu takip edebilir ve OnDeinit'te () silebilirsiniz, o zaman bu en basit durumda ve eğer kopya listesi bizim tarafımızdan önceden biliniyorsa veya her zaman yeni oluşturulan listelerin yerleştirileceği bir liste nesnesi oluşturabilirsiniz. manuel bellek yönetimi bayrağı ile önceden bilinmeyenler. Ardından terminal bu liste nesnesini takip edecek ve içine katlanmış listeleri doğru şekilde silecektir.

 
Artyom Trishkin :

Onlara işaretçiler, terminal tarafından bilinen bir nesneye, örneğin, ArrayObj, List, vb. eklenirse, yeni tarafından oluşturulan nesneleri silmeyle ilgilenir...

O zaman sızıntı hakkında hiçbir mesaj olmayacak.

 
Dmitry Fedoseev :

O zaman sızıntı hakkında hiçbir mesaj olmayacak.

Evet, olmayacak. Çünkü sızıntı olmayacak

Biz, bir yerde yeni bir nesne yarattıysak ve ona bir işaretçi aldıysak, bu nesneyi bu işaretçi ile silmeliyiz. Araçlar - işaretçinin izlenmesi gerekiyor. SB'de sunulan nesnelere yönelik işaretçi listeleri veya dizileri bunun için çok uygundur. Ancak yeni oluşturulan nesneleri izleme ve kontrol etme işini kendiniz halledebilirsiniz. Ama bana gelince, zaten sağlanmışsa neden tonlarca kod yazalım?

 
Artyom Trishkin :

o zaman verilen işaretçide bu nesneyi silmeliyiz.

Ama bana gelince, zaten sağlanmışsa neden tonlarca kod yazalım?

Hangi tonlardan bahsediyoruz? gözden kaçan her şey, her şey terminal tarafından rapor edilecek, silinecek yer de biliniyor - OnDeint() .... konuşma, bir boşlukta küresel bir at tartışmasına indirgendi mi? )))

 
Igor Makanu :

hmm, peki, geri çevirdin .... öyle, ama öyle değil)))

kullanılması gerektiği kadar uygun! - ama "ilk C++ ders kitabı"ndan alınan bu örnekler benim deneyimimde hayatım boyunca sürüklenebilir.. - kodlar sadece kısalmakla kalmadı, aynı zamanda gerçekten daha okunaklı ve yazım hataları oldu - C++ kitapları bunu çok mu öğretiyor? ;)


peki, kitap temelleri hakkında ... programlamada "iyi biçim" kurallarına göre, gereklidir: bir değişken bildirdi - hemen başlat (hata ayıklama sırasında hatalar bu şekilde hariç tutulur), OOP'de bir yapıcı bunlar için hizmet eder amaçlar - bir nesne yarattı, her şeyi başlatacak kadar nazik olun

"Tüm kodu basit bir nesnenin arkasına çekerseniz", o zaman sınıfın tüm alanlarını yeniden başlatacak bir yönteme ihtiyaç duyulacaktır - neden bunu çoğaltıyorsunuz? - öldürüldü / yaratıldı = sonuç .... ama yine zevk ve din meselesi

Bir nesnenin tamamen yeniden başlatılmasından değil, kısmi birinden bahsediyordum - birkaç alanın değiştirilmesi gerektiğinde ve kalan birkaç düzine hala gerekli bilgileri sakladığında ... Burada, "ne istersen," ancak alanları değiştirmek için yöntemlere ihtiyaç vardır. Eğer - tekrar - bir alanın olduğu basit bir nesne hakkında konuşmayın. İki veya daha fazla varsa, diğerlerini değiştirmeden bırakarak birini değiştirmek zaten gerekli olabilir.

Ama belki farklı şeylerden bahsediyoruzdur?