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不作为friend的Foo,因为除了Foo构造函数Bar不需要访问任何的Foo私有方法(因此不应该有访问).有没有办法只允许Bar创建Foos而不让他们成为朋友?
PS:意识到问题可能不是100%清楚.我不介意它是否是通过朋友,只是所有人Bar都可以访问所有私人方法的事实令我感到不安(这通常是这种情况friends),这就是我想要避免的.幸运的是,到目前为止,没有一个答案与这个糟糕的表述有问题.
这正是律师 - 客户成语的用途:
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)
在一个模仿生活方式的代码中,该类宣布了一个律师,该律师将调解它愿意与选定的一方分享的秘密.
如果你不想引入另一个类,你可以缩小友谊圈,使其成为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)
这并不能达到你想要的效果,但它使友谊更具针对性.