命名空间内类的全局get函数访问私有成员问题求助
无法访问命名空间内类的私有成员(友元函数失效问题)
我无法访问命名空间Punoljetna_osoba下类Osoba的私有成员starost。尝试通过全局函数getCijena访问该成员,虽已在类中声明其为友元,但仍无法正常访问,相关代码如下:
#include <iostream> #include <algorithm> #include <vector> #include <functional> #include <string> #include <ctime> #include <iomanip> #include <memory.h> #define cahr char //anti-disleksija #define enld endl //anti-disleksija using namespace std; // int getCijena(Osoba& a); ---> tryed prototype namespace Punoljetna_osoba { class Osoba { int starost; public: string ime, Prezime; friend int ::getCijena(Osoba& a); void setStarost(int a); }; } using namespace Punoljetna_osoba; int getCijena(Osoba& a) { return a.starost; } void Osoba::setStarost(int a) { if (18 <= a && 100 >= a) starost = a; else cout << "niste punoljetni ili ste vec umrli"; } int main() { Osoba a; a.setStarost(50); //cout << getCijena(a); }
问题原因
核心问题在于全局友元函数的声明时机与参数类型的作用域不匹配:当Punoljetna_osoba::Osoba类中声明::getCijena为友元时,全局作用域中还不存在该函数的有效原型——此时Osoba仅在命名空间内部可见,全局作用域无法识别参数中的Osoba类型,导致友元声明无法正确关联到后续定义的全局函数。
修正方案
在命名空间定义之前,前置声明命名空间内的Osoba类,并提前声明全局函数getCijena的原型,明确参数类型:
#include <iostream> #include <algorithm> #include <vector> #include <functional> #include <string> #include <ctime> #include <iomanip> #include <memory.h> #define cahr char //anti-disleksija #define enld endl //anti-disleksija using namespace std; // 前置声明命名空间与类,让全局作用域识别该类型 namespace Punoljetna_osoba { class Osoba; } // 提前声明全局函数原型,明确参数类型 int getCijena(Punoljetna_osoba::Osoba& a); namespace Punoljetna_osoba { class Osoba { int starost; public: string ime, Prezime; friend int ::getCijena(Osoba& a); void setStarost(int a); }; } using namespace Punoljetna_osoba; int getCijena(Osoba& a) { return a.starost; } void Osoba::setStarost(int a) { if (18 <= a && 100 >= a) starost = a; else cout << "niste punoljetni ili ste vec umrli"; } int main() { Osoba a; a.setStarost(50); cout << getCijena(a); // 现在可正常访问私有成员 }
原理说明
- 前置声明
Punoljetna_osoba::Osoba,让全局作用域知晓该类型的存在,避免参数类型未定义的问题; - 提前声明全局函数原型,确保
Osoba类中的友元声明能正确关联到后续定义的全局函数; - 友元声明中的
::getCijena明确指定作用域为全局,避免与命名空间内的同名函数混淆。
内容的提问来源于stack exchange,提问作者Hrco69
相关产品推荐
相关产品推荐

