C++ - "private"单身人士?

C++ - a "private" singleton?

本文关键字:private C++ 单身      更新时间:2023-10-16

在C++中,我通常会通过以下方式实现单例:

class singleton
{
public:
static singleton& get_instance();
private:
singleton(){};
singleton(singleton const&);
singleton operator=(singleton const&);
}

目前,我正在构建一个依赖于有限状态机的大型库,并且出于代码清洁的目的,我不想将指向它的指针传递给几乎每个类实例。因此,我决定将其包装在一个单例中。

但是,存在一个问题:不应允许库的最终用户访问此单一实例。公开它可能会允许用户破坏库的内部功能。

现在,我可以将get_instance设为私有,并将相关的内部类声明为朋友,但这将允许违反库代码本身中的单例原则,因为从其角度来看,实例化将不再受到限制。有没有聪明的方法可以满足拥有只能从代码库的一部分访问的单例的要求?

我有一个解决方案,但我不确定它是否是最好的解决方案,甚至不适合您。

许多问题可以通过一个额外的层来解决,这就是我在这里提出的:你可以使用一个不透明的指针(又名 pimpl 习语(来指你的单例,所以这个额外的层是单例的公共接口,是单例的唯一朋友,因此可以做违规,但它是一个简单的类与单例一起工作。

不透明指针复制所有公共函数,这些函数由作为不透明指针的好友的库类调用。这些函数只是通过 get_access(( 调用转发到单例。

这样,没有用户代码可以访问不透明指针或单例,库类使用不透明指针,即使它们是不透明指针的好友,它们也不能使用 that 来访问单例,不透明指针可能违反单例原则,但实际上,它是一个与单例密切合作的小类。

对于库类来说,它看起来像是不能使用单例,而是使用一个类,它们都可以单独实例化并在其上调用函数。