簡體   English   中英

C ++ Singleton模板類繼承

[英]C++ Singleton template class inheritance

我有一個抽象的Singleton類。 我的目標是任何子類只需要實現init()函數和NOTHING ELSE。 這是我做的:

template <typename T>
class Singleton
{
    public: 

        Singleton()
        {
            init();
        }

        static T& instance()
        {
            static T instance;
            return instance;
        }

    protected:
        virtual void init() = 0;   
};

class SubSingleton : public Singleton<SubSingleton>
{
    protected: 
        void init()
        {
            cout << "Init SubSingleton" << endl;
        }
};

這將無法編譯,因為init()受到保護,無法從公共靜態函數調用。 這個問題有兩個解決方案。 首先我們可以將init()函數設為public,但我不想公開公開這個函數。 所以這只留下第二個解決方案,更改子類如下:

class SubSingleton : public Singleton<SubSingleton>
{
    friend class Singleton<SubSingleton>;

    protected:

        void init()
        {
            cout << "Init SubSingleton" << endl;
        }
};

這很好用,但我不想要友元聲明,因為其他程序員可能會擴展我的代碼,可能不知道應該添加它。

沒有朋友聲明,還有其他方法可以實現嗎? 也許Andrei Alexandrescu的一切?

編輯:現在在構造函數中調用init函數而不是instance()函數。

EDIT2:由於技術原因和兼容性,我需要一個init()函數,不能只在構造函數中進行初始化。

用於轉換的解決方案可行,但如果我從構造函數中調用init(),則轉換不再起作用。 有什么建議?

問題是您不打算使用虛擬功能。 我現在沒有多態行動了。 為什么? 因為你在直接派生對象上調用init()。 使用init()函數是虛擬的是在基類引用或基類指針上調用init(),如下所示。 然后調用從基類范圍發生,因為instance()方法是基類方法,從中調用受保護的方法是完全正常的。

    static T& instance()
    {
        static T myInstance;
        Singleton<T>& t = myInstance;  // Just define a dummy reference here.
        t.init();
        return myInstance;
    }

你根本不需要這個init()的東西。 這只會產生問題。

template <typename T>
class Singleton
{
    public: 
        static T& instance()
        {
            static T instance;
            return instance;
        }
};

class SubSingleton : public Singleton<SubSingleton>
{
    public: 
        SubSingleton()
        {
            cout << "Init SubSingleton" << endl;
        }
};

這樣你不僅可以刪除不必要的東西 - 而且每次有人調用instanse()時你也會阻止調用init()......

看來你混合了兩種類型的polimorphysms:

1)如果你想“靜態地”調用SubSingleton::init() ,即使用CRTP,你不需要在基類中定義它 - 但是你真的必須讓它可以被基類訪問。

2)但是如果將init()定義為virtual,則使用動態polimorphism,並且不需要使init() public:

static T& instance() 
{ 
  static T instance; 
  static_cast<Singleton<T> &>(instance).init(); 
  return instance; 
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM