[英]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.