为什么 Friend Function 不能访问 class 的私有成员
Why Friend Function cannot access private members of a class
class A{
public:
void printer(){
B obj;
obj.private_data = 10; // <- fails, says member inaccessible
}
}
class B{
friend void A::printer();
private:
int private_data;
}
打印机函数是否可以访问class B 的私有成员?我试图将 B 的 obj 作为 arg 传递给打印机,但它仍然失败
Class A
不知道 B
使用它。因此,将函数 printer()
的定义推迟到定义 B
之前,如果您需要 B
的实例作为 A
中的成员 var,则进行前向声明B
在 A
.
中声明一个 B*
因此,使用如下内容:
class A {
public:
void printer();
};
class B {
friend void A::printer();
private:
int private_data;
};
void A::printer() {
B obj;
obj.private_data = 10; // <- No longer fails
std::cout << obj.private_data;
}
int main() {
A a;
a.printer();
}
Why Friend Function cannot access private members of a class?
它们可以,但您可能需要将 class 的定义稍微拆分一下。
虚构文件添加:
定义A
(文件a.hpp
):
class A {
public:
void printer();
};
定义B
(文件b.hpp
):
#include "a.hpp" // B must see the definition of A to befriend a member function
class B {
friend void A::printer();
private:
int private_data;
};
定义A
的成员函数(文件a.cpp
):
void A::printer() {
B obj;
obj.private_data = 10;
}
要访问B
,您首先需要对其进行定义。因此,您可以 声明 方法 printer
并在定义 class B
.
class A {
public:
void printer();
};
class B {
private:
friend class A;
int private_data;
};
void A::printer() {
B obj;
obj.private_data = 10;
}
请注意,无论如何,您可能希望将方法从 class 定义中移出并移至单独的 .cpp
文件中。 class 中定义的方法隐式标记为 inline
,这可能不是您所期望的。
class A{
public:
void printer(){
B obj;
obj.private_data = 10; // <- fails, says member inaccessible
}
}
class B{
friend void A::printer();
private:
int private_data;
}
打印机函数是否可以访问class B 的私有成员?我试图将 B 的 obj 作为 arg 传递给打印机,但它仍然失败
Class A
不知道 B
使用它。因此,将函数 printer()
的定义推迟到定义 B
之前,如果您需要 B
的实例作为 A
中的成员 var,则进行前向声明B
在 A
.
B*
因此,使用如下内容:
class A {
public:
void printer();
};
class B {
friend void A::printer();
private:
int private_data;
};
void A::printer() {
B obj;
obj.private_data = 10; // <- No longer fails
std::cout << obj.private_data;
}
int main() {
A a;
a.printer();
}
Why Friend Function cannot access private members of a class?
它们可以,但您可能需要将 class 的定义稍微拆分一下。
虚构文件添加:
定义A
(文件a.hpp
):
class A {
public:
void printer();
};
定义B
(文件b.hpp
):
#include "a.hpp" // B must see the definition of A to befriend a member function
class B {
friend void A::printer();
private:
int private_data;
};
定义A
的成员函数(文件a.cpp
):
void A::printer() {
B obj;
obj.private_data = 10;
}
要访问B
,您首先需要对其进行定义。因此,您可以 声明 方法 printer
并在定义 class B
.
class A {
public:
void printer();
};
class B {
private:
friend class A;
int private_data;
};
void A::printer() {
B obj;
obj.private_data = 10;
}
请注意,无论如何,您可能希望将方法从 class 定义中移出并移至单独的 .cpp
文件中。 class 中定义的方法隐式标记为 inline
,这可能不是您所期望的。