首页 > 解决方案 > 朋友声明的对面

问题描述

假设我们有一个具有私有构造函数的类,通过friend我们可以允许某些特定的类仍然创建该类的对象:

class Foo
{
 friend class Bar;
private:
  Foo();
};

class Bar
{
  Bar()
  {
    //create a Foo object
  }
};

现在,如果我想要相反的friendFoo看起来像这样:

class Foo
{
 //enemy/foe??? class Bar; (if only)
public:
  Foo();
};

然后没有方法Bar可以访问Foo构造函数/创建对象,Foo但其他类可以(因为它是public)。

class Bar
{
  Bar()
  {
    Foo foo; //compiler error
  }
};

这样的构造可能吗,还是我坚持保持Foo私密并为所有课程添加朋友?

标签: c++c++17friend

解决方案


这种事情是不存在的,而且是极其没有意义的。想象一下,你有这样的情况:

class Foo
{
  enemy class Bar;

public:
  Foo() {}
};

class Bar
{
  void evil() { Foo{}; }
};

没有什么能阻止实现者Bar这样做:

class Bar
{
  void evil() { do_evil(*this); }
};

void do_evil(Bar &self)
{
  Foo{};
}

do_evil不是Bar(它是一个全局函数)的成员,所以它不是敌人。因此,可以轻松规避这种不友好。


推荐阅读