Hatalar, hatalar, sorular - sayfa 2357
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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.
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.
2) kopya oluşturucu, kullanıcı tarafından bildirilmediği takdirde derleyici tarafından oluşturulur.
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
Bunu düzeltmek için seçenekler var mı?
Yardım için şimdiden teşekkürler.
Çünkü =, ==, !=, !, && ve || operatörleri solda bir işaretçi ve sağda "nesne" türünde olduğunda.
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ı.
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
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.
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:
Sonuç: A::A()
ve daha fazlası değil!
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