class 的友元函数,只能由特定的 class 使用
A friend function of a class that can only be used by a specific class
我有三个不同的 classes A
、B
和 C
。我可以创建一个函数 f
,它可以访问 A
的私有成员并且 f
只能由 B
调用(而不是由 C
调用)吗?
我正在寻找让 class B
成为 class A
朋友的替代方法。
当然可以。使有问题的友元函数将 class 与 private
构造函数作为参数,其中 B
是唯一的 friend
。示例:
#include <iostream>
class A;
class B;
template <typename T>
class Arg {
friend T; // only T can make Arg<T>
};
void foo(A& a, Arg<B> ); // only B can make a Arg<B>
// so foo is only callable by B
class B {
public:
void bar(A& a) { // public for demonstration purposes
foo(a, Arg<B>{}); // but this can just as easily be private
}
};
class A {
friend void foo(A&, Arg<B>); // foo can access A's internals
int x;
public:
void print() { std::cout << x << '\n'; }
};
void foo(A& a, Arg<B> ) { a.x = 42; }
int main() {
A a;
B b;
b.bar(a);
a.print();
}
foo
是 A
的 friend
,只能由 B
使用。
如果你完全限定好友功能,那么是的,你可以限制。像这样的东西应该允许 B 而不是 C。
class A
{
private:
int a;
int b;
friend int B::accessInternalsViaFriend();
}
class B
{
.
.
.
public:
int accessInternalsViaFriend();
};
我有三个不同的 classes A
、B
和 C
。我可以创建一个函数 f
,它可以访问 A
的私有成员并且 f
只能由 B
调用(而不是由 C
调用)吗?
我正在寻找让 class B
成为 class A
朋友的替代方法。
当然可以。使有问题的友元函数将 class 与 private
构造函数作为参数,其中 B
是唯一的 friend
。示例:
#include <iostream>
class A;
class B;
template <typename T>
class Arg {
friend T; // only T can make Arg<T>
};
void foo(A& a, Arg<B> ); // only B can make a Arg<B>
// so foo is only callable by B
class B {
public:
void bar(A& a) { // public for demonstration purposes
foo(a, Arg<B>{}); // but this can just as easily be private
}
};
class A {
friend void foo(A&, Arg<B>); // foo can access A's internals
int x;
public:
void print() { std::cout << x << '\n'; }
};
void foo(A& a, Arg<B> ) { a.x = 42; }
int main() {
A a;
B b;
b.bar(a);
a.print();
}
foo
是 A
的 friend
,只能由 B
使用。
如果你完全限定好友功能,那么是的,你可以限制。像这样的东西应该允许 B 而不是 C。
class A
{
private:
int a;
int b;
friend int B::accessInternalsViaFriend();
}
class B
{
.
.
.
public:
int accessInternalsViaFriend();
};