草庐IT

Singleton

全部标签

c++ - 静态对象的this指针

如果我在静态对象中获取this并将其存储在Singleton对象的vector中,我可以假设指针在程序的整个生命周期内都指向该对象吗? 最佳答案 一般来说,您不能这样假设,因为在不同翻译单元中静态对象的创建顺序是未指定的。在这种情况下它会起作用,因为只有一个翻译单元:#include#includeclassA{A()=default;A(intx):test(x){}A*constget_this(void){returnthis;}staticAstaticA;public:staticA*constget_static_thi

c++ - 是否可以确保仅在 'static initialization' 步骤期间调用函数

我想知道是否有可能确保一个函数只在程序的静态初始化步骤中被调用?举个例子,假设我有一些包含std::map对象并公开了insert和at方法的单例类它的。我想确保从中读取数据(at方法)是线程安全的,据我所知,这需要确保没有任何内容正在修改数据(即使用insert方法)。映射旨在仅在静态初始化期间填充,此时我假设只有一个线程。有什么方法可以确保在main()开始后,不会有被误导的用户调用insert吗?示例代码#include#includeclassSingleton{private:std::mapm_map;public:staticSingleton&instance(){st

c++ - 静态库中的单例类

假设我在静态库中有一个单例类S,它可以与其他动态库D1D2D3链接,因此据我了解,类S在每个D1、D2和D3中都有一个单独的实例,即使它不是单例(如全局)也是如此有什么办法可以防止类S的多个拷贝吗?我不能将单例S放在另一个动态库中。Executable/|\\D1D2D3D4|||SSS编辑:单例S在单独的静态库中,与D1D2D3...分别链接。单例分配在堆中,只有指针是静态的statics::instance(){staticsmart_ptrptr=NULL;if(ptr==NULL)ptr=newS;returnptr;}编辑2:我做了一个简单的测试用例来检查一下这是一个示例ma

c++ - GenericFactory 作为单例

我读了文章AbstractFactory,TemplateStyle吉姆·希斯洛普(JimHyslop)和赫伯·萨特(HerbSutter)。这个工厂是作为单例实现的。他们提供了一种使用RegisterInFactory助手类自动注册类的简单方法。现在我已经多次读到应该避免单例,有些人甚至认为它们是反模式,并且只有少数情况下它们很有用。这是其中之一吗?或者是否有一种替代方法可以提供如此简单的自动注册类的方法? 最佳答案 对于此类主题,没有适用于所有问题的答案。有人说单例作为访问服务的方式应该避免。它的使用类似于全局变量的使用。这样您

c++ - 使用 boost::singleton_pool 时处理 std::string/std::vector 成员变量

我正在编写一个性能关键型应用程序,我在其中创建了大量类似类型的对象来下订单。我正在使用boost::singleton_pool用于分配内存。最后我的类看起来像这样。classMyOrder{std::vectorv1_;std::vectorv2_;std::strings1_;std::strings2_;public:MyOrder(conststd::string&s1,conststd::string&s2):s1_(s1),s2_(s2){}~MyOrder(){}staticvoid*operatornew(size_tsize);staticvoidoperatorde

c++ - 这个单例实现有问题吗?

我通常习惯于以这种方式实现单例模式,因为它非常简单:classMyClass{public:MyClass*GetInstance(){staticMyClassinstance;return&instance;}private://Disallowcopyconstruction,copyassignment,andexternal//defaultconstruction.};这似乎比创建静态实例指针、在源文件中对其进行初始化,以及在带有守卫的实例函数中使用动态内存分配要容易得多。是否有我没有看到的缺点?它对我来说看起来是线程安全的,因为我认为第一个到达第一行的线程会导致实例化——

c++ - C++ 类的全局实例

正如标题所说。我将如何创建一个全局可用的类的实例(例如,我有一个用于打印的仿函数,我想拥有它的一个全局实例(尽管有可能创建更多实例))。 最佳答案 竭尽全力使用通常的模式制作单例对象并不能解决问题的第二部分-如果需要,可以制作更多。单例“模式”非常严格,只不过是另一个名称的全局变量。//myclass.hclassMyClass{public:MyClass();voidfoo();//...};externMyClassg_MyClassInstance;//myclass.cppMyClassg_MyClassInstance;

c++ - 我会因单例过度而感到过度杀伤力吗?

我是C++的新手,正在编写一个跨平台(桌面/移动)2D游戏引擎...我的问题是,我是否以适当的方式使用单例,如果没有,是否有替代方法?基本上,我的引擎中有一些组件是围绕单例对象构建的。例子:VBOManager(单人)这个“管理器”基本上负责分配,当然,“管理”用于存储纹理映射和顶点坐标的vbo。我通过此对象控制“读/写”,因此我可以缓存其他对象写入vbo的数据并返回指针(避免存储重复的数据,例如具有相同映射和顶点坐标的500个Sprite)。TextureManager(Singleton,自我解释)GLUtils(单人)我几乎用它来统一通用的GL调用,这些调用根据当前平台(例如GL

c++ - C++中的单例和抽象基类

最近我收到有关实现单例但涉及抽象基类的问题。假设我们有这样的类层次结构:classIFoo{...};//it'sABCclassFoo:publicIFoo{...};我们有如下定义的单例类:templateclassSingleton{public:staticT*Instance(){if(m_instance==NULL){m_instance=newT();}returnm_instance;}private:staticT*m_instance;};所以如果我想像下面这样使用:IFoo::Instance()->foo();我该怎么办?如果我这样做:classIFoo:pu

dll 中的 C++ 模板单例

在dllA中我有一个模板单例:templateclassSingleton{public:staticT&instance(){staticT_instance;return_instance;}private://Allconstructorsarehere};在DllB中,我定义了一个类Logger。DllC、D和E使用Logger,它的访问方式如下:Singleton::instance();问题是每个dll实例化自己的拷贝Singleton.而不是使用相同的单例实例。我知道这个问题的解决方案是使用外部模板。即dllC、D和E必须包含externtemplateclassSing