读书人

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

发布时间: 2012-02-19 19:43:38 作者: rapoo

利用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;还有这里,改成指针.

读书人网 >C++

热点推荐