Hatalar, hatalar, sorular - sayfa 2357

 
Ilya Malev :

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 A::f() öğesini çağırmaya çalışırken "statik olmayan bir yöntemi çağırıyor" derleme hatası veriyor)

1) Bunun her durumda düzelteceğimiz açık bir hata olduğunu yazdım.

2) kopya oluşturucu, kullanıcı tarafından bildirilmediği takdirde derleyici tarafından oluşturulur.

3) soru tamamen açık değil.
Tartışma bağlamında:
Bir işaretçiye erişim yoksa, bir işaretçiyi "başvurudan çıkarmanın" nasıl doğru olduğunu uzun süre tartışmak mümkün mü?
Referans kaldırma işlemi (tutamaçtan gerçek bir işaretçi alma) "dahili" (kullanıcı tanımlı değil) ve pahalı (yokluğuna kıyasla) koddur.
İşaretçi erişimi yoksa neden başvurudan vazgeçilsin?
Olduğu gibi kaldığı sürece, işaretçi erişimi yoksa, referans kaldırma işlemi optimize edici tarafından kaldırılır.

 
Ilya Malev :

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.

Sıcakla yumuşaklığı karıştırıyorsunuz.

Çağrı devirtualization, nesnedeki alanların varlığı veya yokluğu ile ilgisi olmayan ayrı bir optimizasyon yöntemidir.

 
Ilyas :

2) kopya oluşturucu, kullanıcı tarafından bildirilmediği takdirde derleyici tarafından oluşturulur.

Solda bir B nesnesi var, neden A::A(A&) yapıcısı bunun için çağrıldı (veya oluşturuldu)? Bu, OOP ilkelerine aykırıdır.
 
Alexey Navoykov :
Solda B nesnesi var, neden A::A() yapıcısı bunun için çağrılıyor?

Çünkü operatörler =, ==, !=, !, && ve || solda bir işaretçi ve sağda "nesne" türünde olduğunda. Aynı zamanda, bu operatörler işaretçilere aşırı yüklenemez.

Bu nedenle, plz geliştiricileri, bu hatayı düzelttiğinizde, yukarıdaki operatörleri dinamik nesneler için aşırı yüklenebilir hale getirin

 
Metatrader 4 uygulaması çalışmayı durdurdu, başlangıçta yaklaşık bir saniye çalışıyor, ardından sol üst köşede (Al/Sat) tek tıklamayla bir ticaret penceresi beliriyor ve ardından uygulama kapanıyor.
Bunu düzeltmek için seçenekler var mı?
Yardım için şimdiden teşekkürler.
 
Ilya Malev :

Çünkü =, ==, !=, !, && ve || operatörleri solda bir işaretçi ve sağda "nesne" türünde olduğunda.

Evet, işaretçi nerede. Sana zaten burada cevap verdim. Burada işaretçi olmadan çalışır.
 
Alexey Navoykov :
Solda bir B nesnesi var, neden A::A(A&) yapıcısı bunun için çağrıldı (veya oluşturuldu)? Bu, OOP ilkelerine aykırıdır.

Size tamamen katılıyorum ve bunun düzeltilecek bir hata olduğunu zaten yazdım.

Bu durumda, derleyici nesne yapımında yapılamayan uygun bir kalıtım aşırı yüklemesi aldı.

 
İlyas :

Bir işaretçiye erişim yoksa, bir işaretçiyi "başvurudan çıkarmanın" nasıl doğru olduğunu uzun süre tartışmak mümkün mü?

Referans kaldırma işlemi (tutamaçtan gerçek bir işaretçi alma) "dahili" (kullanıcı tanımlı değil) ve pahalı (yokluğuna kıyasla) koddur.
İşaretçi erişimi yoksa neden başvuruyu kaldıralım?

Sanal yöntemler listesi, verinin kendisinden daha az önemli olmayan bir nesne hakkında bir bilgi parçası olduğundan ve sanal yöntemlere erişim, işaretçi erişimidir. Örneğin, örneğimde yazarsam

  A* aa=a;
  B* b1=a;   
   b1=aa;
  b1.f();

Sonra tekrar B::f() alacağım, ancak burada A* nesnesinin B* işaretçisine, A'dan "kopyalanan" ve A* referansında bulunan açık bir atama var. Bu zaten "yanlış" kopya oluşturucuyu çağırmaktan daha derin bir durumdur. Nesnenin sanal yöntemi olmasa bile, ona erişirken işaretçinin geçerliliğini kontrol etmek yine de gerekli olacaktır.

 
Alexey Navoykov :
Solda bir B nesnesi var, neden A::A(A&) yapıcısı bunun için çağrıldı (veya oluşturuldu) ? Bu, OOP ilkelerine aykırıdır.

Hiç denen bir şey olduğundan emin misin? x32'de kontrol ettim:

 class A {
public :
        A()           { Print ( __FUNCSIG__ ); }
        A( const A& ) { Print ( __FUNCSIG__ ); }
} a;
class B : public A {
public :
        B()           { Print ( __FUNCSIG__ ); }
        B( const B& ) { Print ( __FUNCSIG__ ); }
} *b = a;
void OnStart () {}

Sonuç: A::A()
ve daha fazlası değil!

 
A100 :

Hiç denen bir şey olduğundan emin misin? x32'de kontrol ettim:

Sonuç: A::A()
ve daha fazlası değil!

Bu yüzden, noktalamak için jeneratör / optimize edicinin dökümlerini kontrol etmeye gittim ve