[問題] 建構template繼承類別內的static變數

作者: ukjhsa (仙人掌)   2015-01-30 16:12:23
開發平台(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。
作者: PkmX (阿貓)   2015-01-30 17:57:00
你的例子clang跑會segfault猜應該是因為你的TestFail根本沒用到 所以連default ctor都沒有幫你產生如果你在main中宣告一個TestFail 就會出現TestFail show了
作者: ukjhsa (仙人掌)   2015-01-30 20:55:00
怪了在OSX下clang沒問題 但在ubuntu下clang就segfault似乎是 TestOK 出問題,但是找不到問題在哪裡..請問是否有其他方法可以不必在main宣告就能show的方法?
作者: Fenikso (薪水小偷)   2015-01-30 23:37:00
segfault的原因我猜是你的static variable比cout早建構用到還沒好的cout 就炸了雖然不知道你想用ctor做什麼事情 總之不建議這樣用ref: http://goo.gl/9KltnA
作者: ukjhsa (仙人掌)   2015-01-31 00:29:00
感謝樓上,沒有 cout 的話確實就不會 segfault 了原本打算是想用個map存類別名字與其實體指標("A",A*)然後就可以用不同的類別名字 拿到實體所以每個類別都要註冊其名字到map裡面要在main事先寫非常多行這種註冊的程式碼雖然可以在使用A的時候讓他ctor去註冊,但這也要在main宣告所有會用到的類別 讓他們產生的時候再註冊想讓main乾淨點於是想利用static變數 不過忽略了建構順序不只cout還沒建構好, 連map也可能還沒建構好
作者: loveme00835 (髮箍)   2015-01-31 00:45:00
之前有幹過類似的事 "init_priority"
作者: ukjhsa (仙人掌)   2015-01-31 00:48:00
因為會動態的從文字檔讀入名字A,B,...所以要先通通註冊好
作者: loveme00835 (髮箍)   2015-01-31 00:51:00
那我覺得用 static local 好些
作者: shadow0326 (非議)   2015-01-31 02:18:00
工廠方法?

Links booklink

Contact Us: admin [ a t ] ucptt.com