如何修复工厂模式以消除这些编译错误?

时间:2010-11-25 06:10:23

标签: c++ design-patterns factory

我的目标是创建一个系统,其中我可以在运行时提供类的字符串名称,并让它依次返回该类的实例。 在搜索stackoverflow时,我遇到了一个似乎完全正在尝试完成的示例,尽管我目前无法正确编译。以下内容基于该代码:

//LevelObject.h    
#pragma once

#include <map>
#include <string>

class LevelObject
{
    protected:
        int ID;

    public:
        template<class T> static LevelObject* createT(void)
        {
            return new T(0);
        }

        LevelObject(void);
        ~LevelObject(void);
};

struct BaseFactory
{
    typedef std::map<std::string, LevelObject*(*)()> map_type;

    static LevelObject* createInstance(const std::string& s)
    {
        map_type::iterator it = getMap()->find(s);
        if(it == getMap()->end())
        {
            return 0;
        }
        return it->second();
    }

    private:
        static map_type* objectMap;

    protected:
        static map_type* getMap()
        {
            if(!objectMap)
            {
                objectMap= new map_type;
            } 
            return objectMap; 
        }
};

template<class T>
struct DerivedRegister : BaseFactory
{ 
    DerivedRegister(const std::string& s)
    { 
        getMap()->insert(std::make_pair( s, &LevelObject::createT<T> ));
    }
};


//Item.h
#pragma once

#include "LevelObject.h"

class Item :
    public LevelObject
{
    int ID;
    static DerivedRegister<Item> reg;

public:
    Item(int id);
    ~Item(void);
};


//Item.cpp
#include "Item.h"

Item::Item(int id)
{
    ID = id;
}

Item::~Item(void)
{
}

DerivedRegister<Item> Item::reg("item");

逻辑是派生对象,即Item,将注册一个字符串并引用一个返回其自身实例的函数。在调用createInstance时,它将接受用户输入的字符串并使用该映射来确定要返回的对象。

不幸的是,此代码未正确编译,并且给出了以下错误:

  

错误1错误C2752:   '的std :: TR1 :: _ Remove_reference&LT; _Ty&GT;' :   不止一个部分专业化   匹配模板参数列表

     

错误2错误C2528:'摘要   declarator':指向引用的指针   非法的c:\ program files \ microsoft   视觉工作室   10.0 \ vc \ include \ type_traits 965

     

错误3错误C2528:'type':指针   引用是非法的c:\ program   files \ microsoft visual studio   10.0 \ vc \ include \ type_traits 349

如果有人可以帮助消除这些错误,我将不胜感激。 或许我首先要完全错误,所以如果有人觉得我应该完全走向另一个方向,请告诉我。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这个问题发布已经有很长一段时间了,但由于没有答案,我也在这里偶然发现,我想我会加一个。我复制了您所做的相同工厂代码(来自StackOverflow回答here)并遇到了同样的问题。我在this StackOverflow回答时找到了解决方案。

事实证明,Visual Studio 2010(我假设您正在使用)与std::make_pair存在问题。只需使用std::pair<std::string,LevelObject*(*)()>代替您就可以了。至少这对我来说解决了这个问题。

答案 1 :(得分:0)

我在LevelObject类构造函数和析构函数中添加了空体:

LevelObject(void) { }
~LevelObject(void) { }

然后声明map类的静态BaeFactory成员变量:

BaseFactory::map_type* BaseFactory::map;

并且在GCC和Visual Studio中编译的代码都没有错误。