2013-08-27 53 views
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未在此範圍內聲明」的錯誤。 我該怎麼做才能糾正這個問題。

+1

您的代碼。 'createSelector'可以在不返回任何東西的情況下結束。你應該先解決。 – juanchopanza

+1

什麼是「Int」,是否與「int」相同?你爲什麼要比較'int'和'NULL'? 'selector'不是一個指針。代碼不能編譯,因爲'Selector'沒有聲明。請修復您的代碼以顯示真正的問題。 –

+0

@JonathanWakely:謝謝:) – sajal

回答

1

爲了讓-creator實例化,您必須爲其提供一個定義。目前,你只有一個聲明。

class SelectorFactory 
{ 
    static std::map<std::string,Int> _creator; 
}; 
std::map<std::string,Int> SelectorFactory::_creator; 
+0

但我有我的功能定義在我需要使用此地圖的類本身。 – sajal

+0

@sajal,這並不重要,你仍然必須定義靜態成員(但是忘記這麼做不會導致「_creator沒有在此範圍內聲明」錯誤) –

1

SelectorFactory.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__ 

SelectorFactory.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; 
    } 
} 
相關問題