【发布时间】:2018-10-19 12:52:58
【问题描述】:
假设我们有一个具有私有构造函数的类,通过friend 我们可以允许某些特定的类仍然创建该类的对象:
class Foo
{
friend class Bar;
private:
Foo();
};
class Bar
{
Bar()
{
//create a Foo object
}
};
现在如果我想要 friend 的反面,Foo 看起来像这样:
class Foo
{
//enemy/foe??? class Bar; (if only)
public:
Foo();
};
然后Bar 的任何方法都无法访问Foo 构造函数/创建Foo 的对象,但其他类可以(因为它是public)。
class Bar
{
Bar()
{
Foo foo; //compiler error
}
};
这样的结构是否可行,还是我坚持将Foo 保持私密并为所有课程添加朋友?
【问题讨论】:
-
很遗憾没有。原因是一个人必须与他们的朋友保持亲密关系,而他们的敌人则更接近。 ;)
-
你为什么想要那个?听起来你的设计有问题。
friend应谨慎使用;如果您必须将它用于“所有课程”,那么您做错了。 -
@SebastianRedl 这就是为什么我不想采取
friend的所有方法,但Bar方法,重新阅读问题。Bar不应该能够访问Foo,这在现实世界的例子中要复杂得多,但我有充分的理由。现在,Foo的构造函数是公开的,没有使用friend。 -
“我有充分的理由这样做。” - 我非常好奇。
-
@SebastianRedl
Bar包含微控制器的事务逻辑,Foo允许通过旧版 API 访问该控制器的某些部分。互换使用可能会导致问题。运行时检查已经到位,所以即使它意外发生,它本身也不会导致问题,但我宁愿添加一个编译时错误来解释为什么不允许这样做。