Şablon parametreli derleyici hatası = void* - sayfa 7

 
Alexey Navoykov :

Ve bunu yapardım:

Bu tarzı rahatsız edici buluyorum. Onlar. her şeyi "keçeli kalemlere" indirgiyoruz.

 
fxsaber :

Peki hala uyarılara ihtiyacınız var mı? Ne tür bir çifte standart: her iki yerde de davranış net, ancak parantez içinde uyarılara karşısınız, ama burada - İÇİN?

Ayrıca ince hatalar yapmamak için bir uyarıya ihtiyacınız var. Dolayısıyla zorluk subjektif bir değerlendirmedir. Burada parantez ile hata yapmazsınız, ancak burada yapabilirsiniz. Ve benim için tam tersi.

Peki hangimiz uyarı vermek için kuralları uyarlamalıyız?

Konuyu gerçekten anlamış gibi görünmüyorsun. Dinamik döküm her zaman yalnızca AÇIK bir işlem olmalıdır. Herhangi bir normal dilde, hatta C++, hatta C#, hatta Java, hatta başka bir OOP dilinde bile, bu tür kodlar sizin için derlenmeyecektir. Bu, güvenilir OOP'nin temelidir. Ama burada, nedense unuttular. Parantezlerle karşılaştırmanın burada hiç uygun olacağını düşünmedim.

 
Alexey Navoykov :

güvenilir OOP'nin temellerinin temeli.

Temel, özgünlüktür.

 
Ilya Malev :

Kodun amacını referans olarak görmüyorum (standart kitaplıkları kullanmama rağmen). Bir nesneyi bir diziye yerleştirmek onun bir kopyasını oluşturmayı içeriyorsa, atama yöntemi veya kopya oluşturucu bu sınıfta açıkça bildirilmeli ve tanımlanmalıdır, aksi takdirde hiçbir sarmalayıcı yine de yardımcı olmaz. Bir dizideki bir nesneye yalnızca bir başvuru koymanız gerekiyorsa, sarmalayıcı gerekmez (neden birdenbire?)

Böyle bir dizi ne için? Sonuçta, bu neredeyse artı vektörünün bir benzeridir, vektör<int>, vektör<sınıf_adı>, vektör<sınıf_adı*> ile olduğu gibi çalışmalıdır. µl kullanarak bir sarmalayıcı olmadan uygulayabilirseniz - aferin (yapabileceğinizi sanmıyorum). Diziyi yineleme ve yıkıcıları ( _data[i].~Destr() ) çağırma şansınız yok, kısmi uzmanlaşma yok, SFINAE hilesi yok. Ve böyle bir sarmalayıcı, örneğin vector<int> ile çalışma yeteneğini bozmadan öbek üzerindeki nesnelere yönelik işaretçiler için uygun bir dizi yapmayı mümkün kılar.

vector<unique_ptr<my_class>> v1;

vector<my_class> v2;

vector<int> v3;

Not: Ne diyebilirim ki, vector<class_name*> artılarda bile (vektörün ömrünün sonunda yıkıcıları çağırmak) beklendiği gibi çalışmayacak, orada da bir sarmalayıcıya ihtiyaç var.
 
pavlick_ :

Not: Ne diyebilirim ki, vector<class_name*> artılarda bile (vektörün ömrünün sonunda yıkıcıları çağırmak) beklendiği gibi çalışmayacak, orada da bir sarmalayıcıya ihtiyaç var.

Her şey yolunda? )

 template < typename T>
void del(T par){ printf ( "%s не удаляем" , typename (T));}

template < typename T>
void del(T *par){ printf ( "%s удаляем" , typename (T)); delete par;}

class A{ public : void ~A( void ){ printf ( "удаляем %i" ,& this );}};

void OnStart ()
 {
   int var1;
  A *var2= new A;
  del(var1);
  del(var2);
 }

not Benzetme yoluyla, void yerine bir fonksiyon herhangi bir şey döndürebilir ve SFINAE'ye gerek yoktur.

 
Evet, olacak. Ancak sarmalayıcıya hala ihtiyaç vardır: sonuçta, evrensel bir diziye ihtiyacımız vardır, bu da bazen içinde silinmesi gereken ve bazen olmaması gereken işaretçiler olduğu anlamına gelir (peki, aptal bir işaretçi kümesi, başka bir şey aramanın sonucudur) sıralamak).
 
pavlick_ :

Artı tarafta, boşluğu* kaldırmak UB'dir.

Bu arada, daha önce düşünmemiştim bile, bahşiş için teşekkürler. Bu durumda silme işleminin free() ile benzer olduğu ortaya çıktı. İyi ki bu yasaklanmalı. Sonuçta, silme özellikle nesneler için konumlandırılmıştır ve burada bellek, kuralları atlayarak basitçe serbest bırakılır.

Şimdi bunu MQL'de de dikkate alacağım. Yıkıcılar buraya çağrılsa da eğer kodu C++ 'a taşırsanız başınız belaya girebilir.

 
pavlick_ :
Evet, olacak. Ancak sarmalayıcıya hala ihtiyaç vardır: evrensel bir diziye ihtiyacımız var, bu da bazen içinde silinmesi gereken ve bazen olmaması gereken işaretçiler olduğu anlamına gelir (peki, aptal bir işaretçi kümesi, başka bir dizide bir şey aramanın sonucudur).

Pekala, hiç kimse bir dizi oluştururken ek bir seçenek iletmeyi yasaklamıyor - öğeleri silindiğinde veya silindiğinde silmeniz ve varsayılan olarak (zevkinize göre) açıp kapatmanız gerekir. Sonuçta, silmeniz gerekip gerekmediğini tahmin edemezsiniz.))

not Bu arada, işaretçiyi diziye yerleştirmeden önce bir "sarmalayıcı" içine sardığınızdan, diziyi silerken temel nesnesini silmeniz gerekip gerekmediği sorusu hiçbir şekilde netleşmeyecektir))
 
fxsaber :

Ekle. parantezler, dil önceliklerinin etkisini tamamen ortadan kaldırdı. Her şey kesinlikle netleşir. Bu sayede, bir sonraki yapıdan sonra bu yerde hiçbir şeyin kırılmayacağı% 100 güvenilirlik ortaya çıkıyor.

Bunu göz önünde bulundurarak özetleyeyim:


A100
geliştiriciler
fxsaber
parantez
sadece vazgeçilmez oldukları yerde ihtiyaç duyulur
belki de daha önce MQL4'ün farklı olduğu yerlerde de ihtiyaç duyulmaktadır.
her yerde gerekli
gereksiz uyarılar
Gerekli değil
yalnızca MQL4'te farklı olduğu durumlarda gereklidir
her yerde gerekli
öncelikler
gerekli
gerekli
prensipte gerekli değildir (çünkü parantezlerle değiştirilirler)

Yanlış ifade ettiysem - lütfen beni düzeltin - parantez ile ilgili uyarıların gerekli olduğu kavramımı kısaca ve açık bir şekilde belirttim

 
Ilya Malev :

Pekala, hiç kimse bir dizi oluştururken ek bir seçenek iletmeyi yasaklamıyor - öğeleri silindiğinde veya silindiğinde silmeniz ve varsayılan olarak (zevkinize göre) açıp kapatmanız gerekir. Sonuçta, silmeniz gerekip gerekmediğini tahmin edemezsiniz.))

Genel olarak, evet, yapabilirsiniz.

not Bu arada, işaretçiyi diziye yerleştirmeden önce bir "sarmalayıcı" içine sardığınızdan, diziyi silerken temel nesnesini silmeniz gerekip gerekmediği sorusu hiçbir şekilde netleşmeyecektir))


Bir sarmalayıcı olmadan, o zaman bir sarmalayıcı ile silinmez, silinir, her şey çok nettir.

Not: ama yapsaydım, bunu standart artı kitaplığına (isimler, davranış vb.) mümkün olduğunca benzer yapardım, bu yüzden benim için başka seçenek yok. Her şey zaten yazılmışken neden başka bir belirtim üretelim?