在没有朋友的情况下向私有构造函数授予访问权限
Grant access to private constructor without friends?
我正在处理一些代码,其中遇到了与此类似的情况:
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;
}
我宁愿Bar
不像Foo
那样friend
,因为除了Foo
的构造函数之外,Bar
不需要访问Foo
的任何私有方法(因此不应该有访问权限(。有没有办法只允许Bar
创建Foo
而不让他们成为朋友?
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;
}
在模仿生活时尚的代码中,班级声明一名律师将调解它愿意与选定各方分享的秘密。
如果你不想介绍另一个类,你可以缩小友谊圈,让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;
}
这并没有达到你想要的,但它使友谊更有针对性。
我想到的一种方法是有一个内部class
,使Bar
成为它的朋友,这样只有Bar
才能创建它,并且内部class
可以用作构造函数Foo
附加参数,这样只有class
的朋友才能调用它。
class Foo
{
public:
// only friends of the special key can invoke the constructor
// or any member function that includes it as a dummy parameter
class special_key {friend class Bar; special_key(){}};
// making special_key a dummy parameter makes sure only friends of
// the special key can invoke the function
Foo(special_key) {}
void f(){}
void g(){}
};
class Bar
{
public:
// only Bar functions can create the special key
Bar() { f = std::make_unique<Foo>(Foo::special_key()); }
private:
std::unique_ptr<Foo> f;
};
除了限制对特定功能的访问外,该技术还允许使用直接友谊所没有的智能指针make
函数。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- Lambda 函数,用于调用有权访问类成员的成员函数
- 使用QtCreator,如何在我有权访问ssh的远程服务器上构建我的项目?
- 默认赋值运算符有权访问基类的私有成员
- 访问接口的私有继承如何允许可访问对象访问访问私有访问实现
- 外部必须有权访问类构造函数
- 检查用户名是否有权访问窗口上的文件夹
- 获取从基类指针到具有不同类型的两个派生成员变量的访问权
- 好友有权访问好友的成员,但似乎无法更新好友的成员