2010-07-12 24 views
7

Ad alanı içinde bir sınıf var ve bu sınıf özel bir işlev içeriyor. Ve küresel bir işlev var. Bu küresel fonksiyonun, sınıfımın içinde yer alan arkadaşın arkadaşı olmasını istiyorum. Ama bunu bir arkadaş olarak yaptığımda, derleyici, işlevin global olmadığını ve bu ad alanının içinde olduğunu düşünür. Yani, özel işlev işlevine global işlevle erişmeye çalışırsam, bu işe yaramıyor, oysa bu ad alanında kendisiyle aynı ada sahip bir işlev tanımlarsam çalışır. Aşağıda görebileceğiniz kod var.Sınıf bir ad alanı altındaysa, arkadaş işlevi özel işlev erişemiyor

#include <iostream> 
#include <conio.h> 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA(); 
     friend void fun(); 
    }; 

    void CA::funCA() 
    { 
     std::cout<<"CA::funCA"<<std::endl; 
    } 

    void fun() 
    { 
     Nayan::CA::funCA(); 
    } 

} 

void fun() 
{ 
    //Nayan::CA::funCA(); //Can't access private member 
} 


int main() 
{ 
    Nayan::fun(); 
    _getch(); 
    return 0; 
} 

Ben de) ( arkadaş geçersiz :: eğlenceli arkadaş yapmaya çalıştı; Ve ayrıca yardımcı olmaz.

cevap

17

Global kapsam operatörünü :: kullanmanız gerekir.

void fun(); 

namespace Nayan 
{ 
    class CA 
    { 
    private: 
     static void funCA(); 
     friend void fun(); 
     friend void ::fun(); 
    }; 

    void CA::funCA() 
    { 
     std::cout<<"CA::funCA"<<std::endl; 
    } 

    void fun() 
    { 
     Nayan::CA::funCA(); 
    } 

} 


void fun() 
{ 
    Nayan::CA::funCA(); //Can access private member 
} 
+0

Nail ad alanının dışında funil() 'in neyi ifade etmesinin amaçlandığına inanıyorum. –

+1

@Vitor Py: Biliyorum ama farkı açıkça göstermek zarar vermez. Her arkadaş farklı bir şey ifade eder. –

4

Eğlence() işlevi genel ad alanında. Bir prototip:

İlgili konular