0

我有这样的课:

class SelectorFactory
{
public:

    static std::map<std::string,int> _creator;  
    static void registerCreator(std::string& name,int value)
    {
    //static std::map<std::string,int> _creator;
        if(_creator.end() != _creator.find(name))
        {
           std::cout << "Selector already registered \n";
        }
    else
    {
        std::cout << "Entering " <<name<<" in register: \n";
        _creator[name]=value;
    }
    }   

    static int createSelector(std::string selectorName)
    {
    //static std::map<std::string,int> _creator;
        std::map< std::string , int >::iterator mapIter=_creator.find(selectorName);
        if(mapIter==_creator.end())
        {
            std::cout<<selectorName<<" Not found in the Map \n" ;
            return 0;
        }
        else
        {
            int selector= mapIter->second;
            return selector;
        }
    }
};

如果我取消注释上面的注释行,代码正在编译,但它没有从 createSelector 函数返回任何值,这很明显。但是如果我保持它们的注释,我会收到错误,因为“_creator 没有在这个范围内声明”功能。我应该怎么做才能纠正这个问题。

4

2 回答 2

1

为了-creator实例化,您必须为其提供定义。目前,您只有一个声明。

class SelectorFactory
{
    static std::map<std::string,Int> _creator;
};
std::map<std::string,Int> SelectorFactory::_creator;
于 2013-08-27T09:58:01.293 回答
1

选择器工厂.h:

#ifndef __SELECTOR_FACTORY__H__
#define __SELECTOR_FACTORY__H__
#include <string>
#include <map>

class SelectorFactory
{
public: 
    static void registerCreator(std::string& name,int value); 
    static int createSelector(std::string selectorName);
private:              // !!!!!!!!! NOT PUBLIC!!!   >:(
    static std::map<std::string,int> _creator;   

};
#endif // __SELECTOR_FACTORY__H__

选择器工厂.cpp:

#include "SelectorFactory.h"
#include <iostream>

std::map<std::string,int> SelectorFactory::_creator; 

void SelectorFactory::registerCreator(std::string& name,int value)
{
    if(_creator.end() != _creator.find(name))
    {
        std::cout << "Selector already registered \n";
    }
    else
    {
        std::cout << "Entering " <<name<<" in register: \n";
        _creator[name]=value;
    }
}   

int SelectorFactory::createSelector(std::string selectorName)
{
    std::map< std::string , int >::iterator mapIter=_creator.find(selectorName);
    if(mapIter==_creator.end())
    {
        std::cout<<selectorName<<" Not found in the Map \n" ;
        return 0;
    }
    else
    {
        int selector= mapIter->second;
        return selector;
    }
}
于 2013-08-27T10:43:09.227 回答