[问题] 建构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