如何使一个类只能访问另一个类的某些私有成员
How to make a class able to access only certain private members of another class?
假设我们有两个类:
class Base
{
private:
int x;
public:
void f();
};
class Foo
{
// some variables and methods
};
现在每个人都可以打电话给Base::f()
,但我希望只有Foo
能够这样做。
为了达到这个效果,我们可以将Base::f()
设为私有,并将Foo
声明为朋友:
class Base
{
private:
int x;
void f();
friend Foo;
};
这种方法的问题在于Foo
可以访问Base::f()
和Base::x
(甚至可以访问Base
的任何其他私人成员)。但我希望Foo
只能访问Base::f()
.
有没有办法让一个类(或函数)只向另一个类的某些私有成员授予访问权限?或者也许有人可以提出更好的方法来解决我的问题?
编辑:
我将尝试指定我需要的访问限制。首先,Base
是库中的一个接口(实际上它是一个抽象类)。用户仅使用派生自 Base
的类。 Base::f()
仅由库中的另一个类Foo
调用。对用户隐藏Base::f()
很重要,因为只有Foo
知道何时调用它。同时,Foo
不应该搞砸Base
的其他成员。
非常笨拙,但这将允许非常细粒度的访问。
class Base
{
private:
int x;
void f();
friend class Base_f_Accessor;
};
class Base_f_Accessor
{
private:
static void f(Base & b) { b.f(); }
friend class Foo;
}
class Foo
{
// some variables and methods
};
您可以创建另一个包含Base
数据的类,如下所示:
class BaseData {
protected:
int x;
};
class Base : public BaseData {
friend class Foo;
void f ();
};
现在,Foo
可以访问f
作为您想要的Base
方法,但不能x
。友谊不是交换的。通过使用 protected
,除了那些直接派生自BaseData
的x
之外,对所有人都是私有的。
更好的方法可能是使用多重继承来定义Base
,并且仅提供对Base
派生自的那些类的Foo
访问。
class With_f {
friend class Foo;
protected:
virtual void f () = 0;
};
class With_g {
protected:
virtual void g () = 0;
};
class Base : public With_f, public With_g {
int x;
void f () {}
void g () {}
};
在这里,Foo
必须有一个指向Base
的With_f
指针,但它可以访问f
方法。 Foo
无法访问g
。
没有简单、非黑客的方法来实现这一点。C++根本没有这样的访问控制粒度。您可以使用一些继承,但增加的复杂性超过了此访问限制可能具有的任何优势。此外,此方法无法扩展 - 您只能向一个友元类授予增加的权限。
也许有点麻烦,但是您可以创建嵌套类是友元的嵌套类,然后您可以为每个嵌套类添加好友。 这提供了一定程度的粒度:
#include <iostream>
class Nesting
{
friend class Foo;
class Nested1
{
friend class Nesting;
public:
Nested1() : i(3) { }
private:
int i;
} n1;
class Nested2
{
friend class Nesting;
friend class Foo;
public:
Nested2() : j(5) { }
private:
int j;
} n2;
int f() { return n1.i; }
};
class Foo
{
public:
Foo(Nesting& n1) : n(n1) { }
int getJ() { return n.n2.j + n.f(); }
private:
Nesting& n;
};
int main()
{
Nesting n;
Foo foo(n);
std::cout << foo.getJ() << "n";
}
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间