加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中,如何初始化在Singleton模板中声明的私有类的静态成员?

发布时间:2020-12-16 09:30:21 所属栏目:百科 来源:网络整理
导读:好吧,我应该简单地说我想创建一个我可以继承的基础Singleton类,以及我希望通过模板实现的方式. 为了避免内存泄漏,我不直接使用指向实例的指针,而是使用将处理删除指针的私有类. 这是我的实际代码(不工作): template typename T class Singleton{private: cl
好吧,我应该简单地说我想创建一个我可以继承的基础Singleton类,以及我希望通过模板实现的方式.

为了避免内存泄漏,我不直接使用指向实例的指针,而是使用将处理删除指针的私有类.

这是我的实际代码(不工作):

template <typename T> class Singleton
{
private:
    class PointerInstance
    {
    private:
        T* instance;
    public:
        PointerInstance() : instance(0) {}
        ~PointerInstance() { delete instance; } // no memory leak !
        T* Get()
        {
            if ( !instance ) {
                instance = new T();
            }
            return instance;
        }
    };
    static PointerInstance PInstance;
public:
    static T* pGetInstance(void)
    {
        return PInstance.pGet();
    };
protected:
    Singleton(void){};
    ~Singleton(void){};
};

这是典型的派生类声明应该是这样的:

class Child : public Singleton<Child>
{
    friend class Singleton<Child>;
    Child();
    // etc...
};

基本上缺少的是我作为Singleton的每个T类的PInstance实例.

我的问题是:有没有办法一劳永逸地在包含上面代码的Singleton.h中使用一些通用代码行,或者除了为每个代码添加一些特定的代码行之外别无选择衍生类?

(Bonus:有没有更好的方法在C中做一个Singleton类?)

解决方法

这是一种编写CRTP Singleton而没有内存泄漏的简单方法:

template <class T>
class Singleton
{
  friend class T;
private:
  Singleton() {};
  ~Singleton() {};
  Singleton(const Singleton&); // not implemented
  const Singleton& operator=(const Singleton&); // not implemented

public:
  static T* pGetInstance()
  {
    static T theInstance;
    return &theInstance;
  }
};

用法与问题中的相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读