簡體   English   中英

深度繼承的C ++模板單例基類

[英]C++ template singleton base class for deep level inheritance

所以我有一個簡單的單例模板基類(出於問題目的而減少了):

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

現在,我想要一個“單例的基類”:

class Base : public Singleton<Base> {
public:
    void print() { std::cout << &instance() << std::endl; }
}

我現在想要的是從這個基類派生子類,它們是他們自己的單例:

class A : public Base {
    // ...
}

class B : public Base {
    // ...
}

當然如果我這樣做

A::instance().print();
B::instance().print();

在這兩種情況下,我都會得到相同的地址。 有沒有辦法做到這一點?

如果您想知道這是為了什么:我想編程一個ResourceManager基類,該基類由ImageManager類,“ AudioManager”類等繼承。並且我希望它們不要共享實際上相同的實例,但仍然每個管理員只有一個實例...

您必須將Base用作模板,然后將其傳遞給Singleton ,然后從Base<A>繼承。 或者,如果您希望Base是Singleton A / B是Singleton,則除了Base之外,它們還必須繼承自Singleton<A>Singleton<B>

但是親愛的上帝,伙計,辛格爾頓一家人對你和你的孩子們有一百代的詛咒。 你為什么要自己做呢?

我的建議是使Base成為非單例類,然后使實例化Base類的A類和B類單例。 這為您提供了靈活性,並遵循了面向對象的原則,即優先於繼承而不是繼承http://www.artima.com/lejava/articles/designprinciples4.html

由於Singleton上需要靜態成員,因此您不能直接從Singleton類繼承。 在這種情況下以及其他大多數情況下,構圖都能為您提供更好的服務。

當基類必須從其子類中獲取某些東西時,我看到的最佳解決方案是使用Child作為Base的參數,如下所示:

template< bool val, class TrueT, class FlaseT >
struct If {
    typedef TrueT type;
};
template< class TrueT, class FalseT >
struct If< false, TrueT, FalseT > {
    typedef FalseT type;
};
template< class DerivedT = void >
class Base {
public:
    typedef typename If<std::is_same<DerivedT, void>::value,
        Base<DerivedT>, DerivedT>::type this_type;
    static this_type& instance() {
        this_type me;
        return me;
    }

public:
    void test() {}
};
class A : public Base<A> {
public:
    void print() {}
};
class B : public Base<B> {
public:
    void print() {}
};
Base<>::instance().test();
B::instance().print();
A::instance().print();

暫無
暫無

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

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