PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] 建構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
工廠方法?
繼續閱讀
[問題] 存進圖片檔是否要把值轉成char型態
unixxxx
[問題] (已解決)有關於codeblocks編譯的小問題
kerkerhaha
[問題] base class傳給derived class function
Arton0306
[問題] WINDOWS FORM 該用C++寫還是C#寫?
HwangTW
[分享] Boost Release schedule changes..
saxontai
[問題] (已解決) FTP的GetFtpConnection等待過久
srxrrr
Re: [問題] Private method 該不該確認參數正確性?
PkmX
[分享] c++ primer 4/e p.635 修正
fwfly
[問題] 請教linux c 用WSD印表機輸出的指令碼??
aqua2012
[問題] __attribute__ in Visual Studio
briankoko
Links
booklink
Contact Us: admin [ a t ] ucptt.com