读书人

关于模板类中静态成员变量的有关问题

发布时间: 2012-09-17 12:06:51 作者: rapoo

关于模板类中静态成员变量的问题

C/C++ code
#include <iostream>#include <map>#include <functional>#include <string>#define  DEFINE_CLASS(class_name) char NameArray##class_name[]=#class_name; class class_name:public Register<class_name, NameArray##class_name>//回调函数typedef void* (*CreateFunction)(void);//工厂类class ZFactory{private:    //存储类名字和相应的创建对象函数    static std::map<std::string, CreateFunction> m_clsMap;public:    static void *getClassByName(std::string name)    {        std::map<std::string, CreateFunction>::const_iterator find;        find = m_clsMap.find(name);        if (find != m_clsMap.end())        {            return find->second();        }        else        {            return NULL;        }    }    static void RegistClass(std::string name, CreateFunction methond)    {        m_clsMap.insert(make_pair(name, methond));    }};//类注册class ZRegisterClass {public:    ZRegisterClass(std::string name, CreateFunction methond)    {        ZFactory::RegistClass(name, methond);    }};//模板类,具体的实现template <class T, const char name[]>class Register{public:    [color=#FF0000]        static const  ZRegisterClass rc;        [/color]    Register()    {        const ZRegisterClass tmp = rc;        //ZFactory::RegistClass(name, CreateInstance);    }    //返回类的实例    static void *CreateInstance()    {        return new T;    } };std::map<std::string, CreateFunction> ZFactory::m_clsMap;[color=#FF0000]template <class T, const char name[]>const  ZRegisterClass Register<T, name>::rc(name, Register<T, name>::CreateInstance);[/color]


这是网上c++反射的实现,这段代码实现在.cpp文件中
在另一个头文件中使用了extern template Register<int ,pName>导入模板类
请问一下为什么红色的静态成员变量rc不初始化?该怎样改才能使它初始化




[解决办法]
不是不初始化,而是等到 编译器实例化的时候再初始化
[解决办法]
DEFINE_CLASS(class_name) 就是用来往里面加入自己要反射的类,然后 m_clsMap里面就应该有值了,这是一种类名字的映射。
[解决办法]
把调用的代码也贴上来。

读书人网 >C++

热点推荐