没有朋友授予访问私有构造函数的权限?

for*_*818 8 c++ constructor private friend

我正在编写一些代码,在那里我遇到了类似于这个的情况:

struct Bar;

struct Foo{
    friend struct Bar;
private:
    Foo(){}
    void f(){}
    void g(){}
};

struct Bar {
   Foo* f;
   Bar()  { f = new Foo();}
   ~Bar() { delete f;}
};

int main(){
  Bar b;
}
Run Code Online (Sandbox Code Playgroud)

我宁愿Bar不作为friendFoo,因为除了Foo构造函数Bar不需要访问任何的Foo私有方法(因此不应该有访问).有没有办法只允许Bar创建Foos而不让他们成为朋友?

PS:意识到问题可能不是100%清楚.我不介意它是否是通过朋友,只是所有人Bar都可以访问所有私人方法的事实令我感到不安(这通常是这种情况friends),这就是我想要避免的.幸运的是,到目前为止,没有一个答案与这个糟糕的表述有问题.

Sto*_*ica 9

这正是律师 - 客户成语的用途:

struct Bar;

struct Foo {
    friend struct FooAttorney;
private:
    Foo(){}
    void f(){}
    void g(){}
};

class FooAttorney {
  static Foo* makeFoo() { return new Foo; }
  friend struct Bar;
};

struct Bar {
   Foo* f;
   Bar()  { f = FooAttorney::makeFoo();}
   ~Bar() { delete f;}
};

int main(){
  Bar b;
}
Run Code Online (Sandbox Code Playgroud)

在一个模仿生活方式的代码中,该类宣布了一个律师,该律师将调解它愿意与选定的一方分享的秘密.


das*_*ght 5

如果你不想引入另一个类,你可以缩小友谊圈,使其成为Bar构造函数Foo的朋友.它要求Bar定义可用Foo,并且仍然允许Bar构造函数不受限制地访问Foo私有实现:

struct Foo;

struct Bar {
   Foo* f;
   Bar();
   ~Bar();
};

struct Foo{
    friend Bar::Bar();
private:
    Foo(){}
    void f(){}
    void g(){}
};

Bar::Bar() : f(new Foo()) {
}

Bar::~Bar() {
    delete f;
}
Run Code Online (Sandbox Code Playgroud)

这并不能达到你想要的效果,但它使友谊更具针对性.