2013-07-17 15 views
5

ebeveyn sınıfın özel üyeleri erişebilir ve ben (sorunsuz derler: http://ideone.com/hRiV5B): Bu pasajı içinde beni şaşırttı şey fark bir süre memberspace deyim ile etrafında oynuyordumMemberspaces Ben <a href="http://accu.org/index.php/journals/1527">this article</a> okuyordum

class HugeClass 
{ 
    public: 
     struct memberspace 
     { 
      int f() const { return parent.f; } 

      private: 
       friend HugeClass; 
       explicit memberspace(HugeClass & parent) 
       : parent(parent) {} 
       HugeClass & parent; 
     } memberspace; 

     HugeClass() : memberspace(*this), f(42) {} 

    private: 
     int f; 
}; 

Bu bağlamda HugeClass::f erişiminin f özel olduğu için bir derleyici hatası oluşmasına izin verilmez.

HugeClass yüzden HugeClassmemberspace özel yapıcısı çağırabilir, memberspace bir friend, ama neden açıkça memberspaceHugeClass bir friend bildirmek olmadan tersi çalışır?

+0

memberspace HugeClass'ın bir parçası olarak kabul edilir ve bu nedenle tam erişime sahiptir. –

cevap

6

C++ dilinde dil kurallarına göre 11.

Yuvalanmış bir sınıf bir üyedir ve başka herhangi bir üye ile aynı erişim haklarına sahiptir. Örnek:

class E { 
    int x; 
    class B { }; 
    class I { 
    B b; // OK: E::I can access E::B 
    void f(E* p, int i) 
    { 
     p->x = i; // OK: E::I can access E::x 
    } 
    }; 
}; 

Ve C++ 03'te iç içe geçmiş bir sınıfın

üyeleri kapsayan sınıfının üyelerine özel erişim hakkına sahiptir, ne de sınıflara oldu veya bir kapalı sınıfa arkadaşlık veren işlevleri; her zamanki erişim kuralları (madde 11) 'a uygun olacaktır.

Bu nedenle, C++ 11 örneğinden C++ 03 derleyicilerle çalışmaz.

+4

Bu durumun yalnızca resmi olarak 2011'den beri geçerli olduğunu unutmayın. Eski standartlar, bazı popüler derleyiciler birçok kişi için yeni kurallara uymakla birlikte, “iç içe geçmiş bir sınıfın üyeleri bir kapsayıcı sınıfın üyelerine özel erişim hakkına sahip değildir” dedi. yıl. –

+0

@MikeSeymour teşekkürler. C++ 03 standardını okumak için de neden – ForEveR

+1

cevabını göndermeden önce bu çok ilginç. Bu konuda daha fazla bilgi ararken, dil hatası raporunu buldum: http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45 Bu belgeden aslında geçerli olduğunu düşünüyorum C++ 03'te (yalnızca C++ 11 değil), çünkü orijinal davranış bir dil hatası olarak kabul edildi – nijansen

1

memberspace, HugeClass ürününün bir parçasıdır ve aynı sınıftaki diğer kullanıcılarla aynı erişima sahiptir.