首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

利用GP创建的工厂类为什么无法编译?该怎么解决

2012-02-19 
利用GP创建的工厂类为什么无法编译?//GenericFactory.h//----------------------------#pragmaonce#define

利用GP创建的工厂类为什么无法编译?
//   GenericFactory.h  
//----------------------------
#pragma   once

#define   VT(t,c)   CreatorMap_t::value_type((t),(c))

template   <class   T>
class   GenericFactory
{
public:

        typedef   T*   (*Creator_t)();       //   pointer   to   constructor

        typedef   std::map <std::string,   Creator_t>   CreatorMap_t;
       
        //////////////////////////////////////////////////////////////////////
        bool   Register(   const   char*   pszTypeName,   Creator_t   creator   )
        {
                std::string   typeName   =   std::string(   pszTypeName   );
                return   m_creatorList.insert(   VT(typeName,   creator)   ).second;
        }
       
        /////////////////////////////////////////////////////////////////////
        T*   Create(   const   char*   pszTypeName   )
        {
                CreatorMap_t::iterator   iter   =   m_creatorList.find(std::string(pszTypeName));
                if   (   iter   !=   m_creatorList.end()   )
                {
                        Creator_t   creator   =   (*iter).second;
                        return   creator();
                }

                return   0;
        }
        /////////////////////////////////////////////////////////////////////
        void   Remove(   const   char*   pszTypeName   )
        {
                CreatorMap_t::iterator   iter   =   m_creatorList.find(std::string(pszTypeName));
                if   (   iter   )
                        m_creatorList.erase(iter);
        }
        /////////////////////////////////////////////////////////////////////
        void   DeleteObject(   void*   pObject   )
        {
                delete   pObject;
        }
        /////////////////////////////////////////////////////////////////////
        static   GenericFactory <T> &   Instance()
        {
                return   s_genFactory;
        }
        /////////////////////////////////////////////////////////////////////



private:
        GenericFactory();
        ~GenericFactory();
       
        CreatorMap_t   m_creatorList;
        static   GenericFactory <T>   s_genFactory;     //   模板类难道不能用自己的静态类吗?

};
//------------------------

//   test.cpp
//------------------------------
class   CRocket
{
public:
        CRocket():_str( "I 'm   a   due-rocket   made   in   china! "){}
        ~CRocket(){}
       
        void   Message()
        {
                MessageBoxA(   NULL,   _str.c_str(),   "CRocket ",   MB_OK   );  
        }

        CRocket&   operator=(std::string   str){   _str   =   str;   return   *this;   }
        CRocket&   operator=(char*   psz){   _str   =   std::string(psz);   return   *this;   }

private:
        std::string   _str;
};

typedef   GenericFactory <CRocket>   RocketFactory;

CRocket*   CreateRocket()
{
        return   new   CRocket;
}

int   WINAPI   WinMain(   HINSTANCE   hInst,   HINSTANCE   hPrevInst,   LPSTR   lpCmd,   int   iShowMode   )
{
      RocketFactory::Instance().Register( "Rocket ",   CreateRocket);
      CRocket*   rocket   =   RocketFactory::Instance().Create( "Rocket ");
      (*rocket).Message();
      RocketFactory::Instance().DeleteObject(rocket);
      return   0;
}
//------------------------------

[解决办法]
编译器都告诉你了, 你的GenericFactory <class CRocket> ::s_genFactory只有声明没有定义, 还到处找啥找 ....
[解决办法]
构造函数加个{}
GenericFactory(){};
还没有解决看下
http://www.w3sky.com/2/2622.html
[解决办法]
在外面要加定义.
static GenericFactory <T> *s_genFactory;还有这里,改成指针.

热点排行