Hatalar, hatalar, sorular - sayfa 2356

 
A100 :

C++'da: A::f()

Bu kod ne gösteriyor?

((A*)&b).f();
 
fxsaber :

Bu kod ne gösteriyor?

Aynısı.

 
Ilya Malev :

Aynısı.

MQL olarak (C++'a dönüştürülmesi şartıyla). Ama kendin kontrol edebilirsin
 
A100 :
MQL olarak (C++'a dönüştürülmesi şartıyla). Ama kendin kontrol edebilirsin

Kontrol:


 
Ilya Malev :

Kontrol:

Bir şeyi kontrol ettiğinizi sanmıyorum.

B*b1=a;

MQL'deki böyle bir kayıt, a - nesnesinin b1 işaretçisinde bulunan nesneye kopyalanması anlamına gelir. Genel olarak elbette derlenmemeliydi.

Bir yığındaki nesnelere ve işaretçilere müdahale etmemek için, işaretçiler için p önekini kullanmak daha iyidir.

 
Ilya Malev :

Kontrol:

Lütfen bu hatalı davranış üzerine bahse girmeyin.

2 sorun var(?):

  1. B *b1=a - açık bir hata, derleyici bu yapıyı kopya operatörüne yapılan bir çağrı olarak algılar A::A(const A &)

  2. İlk durumda, optimize edici A::A(const A &) öğesinin boş olduğunu, üye olmadığını - "işaretçi" ile erişim olmadığını belirledi (aslında, kopyalama operatörünü çağıracak kod kalmamıştı, her şey kesildi)
    sanal B::f() aşırı yüklenmemiştir, bu nedenle sanal bir çağrı yerine basitti, B::f()'de üyelere adresleme yok, bu nedenle "işaretçi" ile erişim de kesildi

    İkinci durumda, A::f() bir sanal çağrı girişimidir, "işaretçi" ile erişim vardır, ancak a1 nesnesi yoktur çünkü A *a1=b için ayrıca boş kopya oluşturucu A::A(const A &) için bir çağrı yapıldı
 
Ilyas :

Lütfen bu hatalı davranış üzerine bahse girmeyin.

2 sorun var(?):

Umarım bu hatalı davranışı düzeltirsiniz? ( derleme hatası yapın) Çünkü yanlışlıkla böyle bir hata yapabilirsiniz ve derleyici hiçbir şekilde tepki vermez.

 
Alexey Navoykov :

Umarım bu hatalı davranışı düzeltirsiniz? Çünkü yanlışlıkla böyle bir hata yapmak mümkündür ve derleyici hiçbir şekilde tepki vermez.

Evet, düzelteceğiz.

Öncelik düşük olarak ayarlanmıştır, çünkü çalışma kodu sadece boş sınıflar için elde edilir

 
Ilyas :

Lütfen bu hatalı davranış üzerine bahse girmeyin.

2 sorun var(?):

  1. B *b1=a - açık bir hata, derleyici bu yapıyı kopya operatörüne yapılan bir çağrı olarak algılar A::A(const A &)

  2. İlk durumda, optimize edici A::A(const A &) öğesinin boş olduğunu, üye olmadığını - "işaretçi" ile erişim olmadığını belirledi (aslında, kopyalama operatörünü çağıracak kod kalmamıştı, her şey kesildi)
    sanal B::f() aşırı yüklenmemiştir, bu nedenle sanal bir çağrı yerine basitti, B::f()'de üyelere adresleme yok, bu nedenle "işaretçi" ile erişim de kesildi

    İkinci durumda, A::f() bir sanal çağrı girişimidir, "işaretçi" ile erişim vardır, ancak a1 nesnesi yoktur çünkü A *a1=b için ayrıca boş kopya oluşturucu A::A(const A &) için bir çağrı vardı

Ayrıntılı cevap için teşekkürler, ancak mantığı biraz anlamadım.

1) Derleyici neden B* b1=a yapısını kopya operatörü A:: A(const A&), için bir çağrı olarak algılıyor (ve B:: B(const A&) çağrısı olarak değil, çünkü B sınıfı operatörün solunda =)

2) Derleyici neden bir "kopya oluşturucu eksik" uyarısı vermedi?

3) Neden var olmayan nesnelerde yöntemleri "basit" olarak çağırmaya izin veriliyor (doğrudan B::f() öğesini çağırmaya çalışırken "statik olmayan bir yöntemi çağırıyor" derleme hatası veriyor)

4) Peki, derleyici neden genellikle sanal bir yönteme "basit" bir çağrıya izin veriyor? Bence sanallık hiçbir şekilde nesnedeki verinin varlığına veya yokluğuna bağlı olmamalıdır.

 
Ilya Malev :

1) Derleyici neden B* b1=a yapısını kopya operatörü A:: A(const A&), için bir çağrı olarak algılıyor (ve B:: B(const A&) çağrısı olarak değil, çünkü B sınıfı operatörün solunda =)

Oldukça doğru. Derleyicinin aşağıdaki gibi şeylere serbestçe izin vermesi başka bir MQL hatasıdır: B b = a; Bu, kapsülleme ilkelerinin ihlalidir. C++'da bu doğal olarak derlenmez, açık bir döküm gereklidir. Ve MQL'nin eski yapılarında bunu yapmak da imkansızdı.

Neden: