- 论坛徽章:
- 0
|
这是我接受的一个代码,试图做一个对象工厂,把类名传入对象工厂,让工厂制造对象
工厂类声明
ClassFactory.h- #ifndef __CLASSFACTORY_H__
- #define __CLASSFACTORY_H__
-
- #include <string>
- #include <map>
-
- typedef void* (*FactoryMethod)(void);
- //class Registry;
-
- /*
- * 这个类是用来存储<name, create object function>对,
- * 也就是个对象工厂.
- */
- class ClassFactory
- {
- public:
- static ClassFactory forName(std::string name);
-
- public:
- void* newInstance(void);
-
- private:
- friend class Registry;
- static bool registerClass(std::string name, FactoryMethod method);
-
- private:
- static std::map<std::string, FactoryMethod> registry;
- std::string name;
-
- explicit ClassFactory(std::string n) : name(n)
- {};
- };
-
- class Registry
- {
- public:
- Registry(const char* name, FactoryMethod method)
- {
- ClassFactory::registerClass(name, method);
- };
- };
-
- /*
- * mixed template, generate new instance for every class.
- */
-
- /*
- * static member, initiliazed before enter into main()
- * call Class::registerClass by ctor of Registry
- */
- template <class T, const char name[]>
- class Registed
- {
- public:
- static void* newInstance(void)
- {
- return new T();
- };
- protected:
- Registed()
- {
- const Registry& dummy = r;
- };
- private:
- static const Registry r;
- };
- template <class T, const char name[]> const Registry
- Registed<T, name>::r = Registry(name, Registed<T, name>::newInstance); //特化
- #define REG_CLASS(CLASS) \
- char NameArray[] = #CLASS; \
- class CLASS : public Registed<CLASS, NameArray>
- #endif // __CLASS_H__
-
复制代码 ClassFactory.cpp- #include "ClassFactory.h"
- std::map<std::string, FactoryMethod> ClassFactory::registry;
- ClassFactory ClassFactory::forName(std::string name)
- {
- return ClassFactory(name);
- };
- void* ClassFactory::newInstance(void)
- {
- std::map<std::string, FactoryMethod>::const_iterator find;
- find = registry.find(name);
- if (find == registry.end())
- return NULL;
- else
- return (find->second)();
- };
- bool ClassFactory::registerClass(std::string name, FactoryMethod method)
- {
- return registry.insert(std::make_pair(name, method)).second;
- };
复制代码 希望用工厂类制造的一个示范类
User.h- #ifndef _User_H_
- #define _User_H_
- #include "cocos2d.h"
- #include "ClassFactory.h"
- USING_NS_CC;
- REG_CLASS(User)
- {
- public:
- User(){};
- void test();
- };
- #endif
复制代码 User.cpp- #include "User.h"
- void User::test(){
- CCLog("User test");
- }
复制代码 现在最古怪的问题在于,如果在任何其它地方引用了User.h,编译器就会报错
error LNK2005: "char * NameArray" (?NameArray@@3PADA) 已经在 xxxxxx.obj 中定义(xxxxx是引用User.h)的源码文件名
,根源在于ClassFactory.h里有这么一段宏- #define REG_CLASS(CLASS) \
- char NameArray[] = #CLASS; \
- class CLASS : public Registed<CLASS, NameArray>
复制代码 为什么这段宏会造成这个问题?
其次是请解释一下该头文件里这段代码到底干了什么- template <class T, const char name[]> const Registry
- Registed<T, name>::r = Registry(name, Registed<T, name>::newInstance);
复制代码 |
|