SORU
24 AĞUSTOS 2010, Salı


Neden C dostluk devralınan izin vermiyor?

Neden dostluk en azından isteğe bağlı olarak C kalıt değil mi ? Geçişlilik ve deneyimlerin yaşanabileceğini belli nedenlerden dolayı yasak olması (bu sadece basit SSS alıntı cevap doğru diyorum), ama virtual friend class Foo; bulmaca çizgisinde bir şey olmaması beni anlıyorum. Herkes bu kararın arkasında tarihsel geçmişini biliyor mu? Dostluk gerçekten sadece sınırlı o zamandan beri birkaç belirsiz saygın bir kullanır kendini gösterdi kesmek oldu?

Açıklama için Edit:Aşağıdaki senaryoyu bahsediyorumdeğilBir çocuk B ve çocuklar hem de B veya maruz kaldığı yerlerde. Ayrıca isteğe bağlı olarak arkadaş fonksiyonlar, vb geçersiz kılar giriş yapabilmen hayal edebiliyorum.

class A {
  int x;
  friend class B;
};

class B {
  // OK as per friend declaration above.
  void foo(A& a, int n) { a.x = n; }
};

class D : public B { /* can't get in A w/o 'friend class D' declaration. */ };

Cevap kabul:Loki states, etkisini simüle az ya da çok olmasıyla temel sınıflar proxy fonksiyonları korunmuş yaparak olabilir gibi, çok sıkıgereksınıf veya sanal bir yöntem hiyerarşiyi bir dostluk verilmesi için. Demirbaş vekiller arkadaş Bankası'ndaki etkili olur) ihtiyacı sevmem, ama bu tercih daha çoğu zaman yanlış olacağını dile mekanizması üzerinde görüldü sanırım. Muhtemelen almanın zamanı geldi sanırım ve okumak Stroupstrup, bu tip soruların daha iyi bir fikir almak tavsiye için yeterince insan gördüm The Design and Evolution of C ,...

CEVAP
25 AĞUSTOS 2010, ÇARŞAMBA


Foo ve arkadaş Bar (böylece bir güven ilişkisi var) yazmış olabilirim çünkü.

Ama Bar türetilen sınıfları yazıp insanlara güveniyor muyum.
Gerçekten değil. Dostluk miras olmamalıdır.

Bir sınıf iç gösteriminde herhangi bir değişiklik temsil bağımlı olan her şey için bir değişiklik gerektirecektir. Böylece, bir sınıfın tüm üyeleri ve sınıf arkadaşları da değiştirilmesi gerekecektir.

Bu nedenle eğer Foo iç temsil değiştirilirse o zaman Bar da dostluk sıkıca Bar da bağlar, çünkü foo () değiştirilmesi gerekir. Eğer dostluk kalıtsal olsaydı o zaman tüm sınıf Bar elde Foo sıkıca bağlı olmalı ve eğer değilse, bu iç temsil değişirse değişiklik gerektirir böylece. Ama türetilen türler (ne de Ben de. hatta farklı firmalar tarafından geliştirilmiş olabilir vs.) hakkında bir bilgim yok. Böylece bunu yaparken kod tabanı tüm sınıf Bar türetilen değiştirmek olamazdı gibi değişiklikleri tanıtmak gibi Foo değiştirmek mümkün olacaktır.

Böylece eğer dostluk miras kaldı eğer yanlışlıkla bir sınıf değiştirme yeteneği üzerinde bir kısıtlama tanıtma. Bu temelde işlemek ortak bir API kavramı usless olarak istenmeyen bir durumdur.

Not: Bar alt Bar. kullanarak Foo erişebilirsiniz sadece Barda yöntemi korumalı olun. Sonra Barın alt üst sınıf ile çağırarak bir Foo erişir.

İstediğin bu mu?

class A
{
    int x;
    friend class B;
};

class B
{
    protected:
       // Now children of B can access foo
       void foo(A& a, int n) { a.x = n; }
};

class D : public B
{
    public:
        foo(A& a, int n)
        {
            B::foo(a, n   5);
        }
};

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Friday NightFort

    Friday Night

    15 EYLÜL 2011
  • Mr. H

    Mr. H

    1 Temmuz 2012
  • Vsauce

    Vsauce

    30 Temmuz 2007