gpt4 book ai didi

C++ - 一个 "private"单例?

转载 作者:行者123 更新时间:2023-12-02 10:32:21 25 4
gpt4 key购买 nike

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

class singleton
{
public:
static singleton& get_instance();

private:
singleton(){};
singleton(singleton const&);
singleton operator=(singleton const&);
}

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

然而有一个问题:图书馆的最终用户不应该被允许访问这个单例。暴露它可能允许用户破坏库的内部功能。

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

最佳答案

我有一个解决方案,但我不确定它是否是最好的解决方案,甚至对你来说是否可行。

许多问题可以通过一个额外的层来解决,这就是我在这里提出的:你可以使用 opaque pointer (又名 pimpl idiom)到你的单例,所以这个额外的层是单例的公共(public)接口(interface),是单例的唯一 friend ,因此可以违反,但它是一个与单例一起工作的简单类。

opaque 指针复制所有公共(public)函数,这些函数由 opaque 指针的 friend 库类调用。这些函数只是通过 get_access() 调用转发给单例。

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

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

关于C++ - 一个 "private"单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61796073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com