2016-03-23 20 views
1

:Çoklu seviye dostluğu

class B { 
    int x; 
    int y; 
}; 

class A { 
    friend class Other; 
    friend class A; 
    int a; 
    B* b; 
public: 
    A(){ b = new B();} 
}; 

struct Other { 
    A a; 
    void foo() { 
     std::cout << a.b->x; // error 
    } 
}; 

int main() { 
    Other oth; 
    oth.foo(); 
} 

belirtilen satır başarısız: Diğer sınıf üyesine sınıf üyesinden bahsederken neden dostluk çalışmıyor

t.cpp:22:19: error: 'x' is a private member of 'B' 
std::cout << a.b->x; 
       ^
t.cpp:7:5: note: implicitly declared private here 
int x; 

?

+2

Eh, 'Diğer' 'B sınıfı' bir' '' '' '' '' '' '' '' '' '' '' '' '' '• '' özel 'B :: x' erişilemez. –

+0

Bir cevap sizin için işe yaradıysa, [kabul edildiği gibi işaretleyin] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Eğer kimse yapmadıysa, açıklama veya düzeltme talep eden bir yorum ekleyin (gerekirse). – Nacho

cevap

2

Bu çizgi:

std::cout << a.b->x; 

sınıfın içinde A özel bir üyesini (b) ve B (x) özel bir üyesini erişen içerdiğini, bu gibi friends tanımını düzeltmek gerektiğini söyledi Other. A, Other erişim yetkilerini verirken, B bu nedenle hata vermedi. Bunu çalışmak istiyorsanız, eklemek gerekir:

class B { 
    friend class Other; 
}; 

Yan notu, bu deklarasyon anlamsızdır:

class A { 
    friend class A; 
}; 

A sınıfı zaten kendi özel üyelerine erişimi vardır . Yani kendi arkadaşını aramak gereksiz.

0

bu deneyin:

class B{ 
friend class Other; 
int x; 
int y; 
}; 
+1

Yalnızca kod yanıtları işe yaramıyor. Bunu söylemelisin * Neden * OP bunu denemelidir. OP ne yaptığında, ne yaptınız? – Barry

2

bu friend s garip kullanımı olmasına rağmen, bunu öğrenme amaçlı olduğunu varsayalım.

class B{ 
    friend class Other; // Because you access private member x from Other::foo() 
    int x; 
    int y; 
}; 

class A{ 
    friend class Other; // Because you access private member b from Other::foo() 
    int a; 
    B* b; 
public: 
    A(){ b = new B();} 
}; 

struct Other{ 
    A a; 
    void foo(){ 
     // Access A's private member b 
     // Access B's private member x 
     std::cout << a.b->x; 
    } 
}; 
İlgili konular