開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
g++ 4.7.1 with C++11
問題(Question):
程式的目的是想要在建構許多類別"之前"就會做一些固定的事情,假設為印出 show,
因此使用 static member data 達到這個目的:
template<class T>
struct ShowClass
{
ShowClass() { std::cout << "show" << std::endl; }
};
struct Test
{
private:
static ShowClass<Test> our_show;
};
ShowClass<Test> Test::our_show;
因為這種的類別會有很多個,每個都要加 static member data 與初始化很麻煩,
於是想額外定義新的類別,並且繼承自它:
template <typename T>
struct AutoShow
{
AutoShow() { &our_show; }
protected:
static ShowClass<T> our_show;
};
template <typename T>
ShowClass<T> AutoShow<T>::our_show;
所以原本的 Test 就會變成
struct TestOK : public AutoShow<TestOK>
{
public:
TestOK() {}
};
成功在 main 開始做事情之前就會印出 show,
但是,如果把 constructor 拿掉讓它是預設值產生的話,就沒辦法印出,
struct TestFail : public AutoShow<TestFail>
{
};
TestFail 沒辦法印出 show。
請問這是什麼原因導致會有這種現象?
必須手動替每個類別加上 constructor 才行嗎?
程式碼(Code):(請善用置底文網頁, 記得排版)
http://ideone.com/VSRNbz
為了清楚辨認出印出 show 的類別,
範例使用 template_to_string 與巨集 DEFINE_TYPE,
將 template type 轉成 string 並印出。
執行結果:
Test show
TestOK show
預期結果:
Test show
TestOK show
TestFail show
補充說明
在 main 建構出 TestFail 的話是會印出 show,
但是我想要的效果是不必建構出 TestFail 實體就能印出 show。