带字典的共享实例(c ++)

时间:2014-11-20 03:55:25

标签: c++ dictionary

我是C ++新手。我试图实施一些东西。我的目标很简单:

  1. 可以在不同范围内轻松访问的共享实例。
  2. 此共享实例具有用于存储键值对数据的字典实例变量(map)。
  3. 我们可以添加新的键值对或通过公共访问器获取键的值。
  4. 这是我的标题:

    // .h
    using namespace std;
    
    class Person;
    typedef map<string, Person> DictForPeople;
    
    class Company {
        Company();
        void setValueForKey(string key, Person value);
        Person valueForKey(string key);
    private:
        DictForPeople _dictForPeople;
    };
    
    class Person {
    public:
        Person();
        void setName(string name);
        string name();
    private:
        string _name;  // !!!: raise error here
    };
    

    和实现(.cpp):

    // .cpp
    Company::Company(){
    
    }
    void Company::setValueForKey(string key, Person value){
        _dictForPeople[key] = value;
    }
    Person Company::valueForKey(string key){
        return _dictForPeople[key];
    }
    Person::Person(){
    
    }
    void Person::setName(string name){
        _name = name;
    }
    string Person::name(){
        return _name;
    }
    

    我试图使用singleton pattern,但它会引发很多编译错误。如何使用string / map的访问器正确声明共享实例?


    更新1:

    上面的代码引发了一个错误: 未定义模板的隐式实例化&#39; std :: __ 1 :: basic_string,std :: __ 1 :: allocator&gt;&#39;

    环境 Xcode 6 / Mac OS X 10.10 ,LLVM / Clang。我出于某些原因尝试使用C ++而不是Objective-C.


    更新2:

    我使用Singleton Pattern的实现如下(reference):

    // .h
    using namespace std;
    
    class Person;
    typedef map<string, Person> DictForPeople;
    
    class Company {
        static Company& getInstance() {  // For Singleton Pattern
            static Company instance;
            return instance;
        }
    
        void setValueForKey(string key, Person value);
        Person valueForKey(string key);
    private:
        Company() {};  // For Singleton Pattern
        Company(Company const&);  // For Singleton Pattern
        void operator=(Company const&);  // For Singleton Pattern
    
        DictForPeople _dictForPeople;
    };
    
    class Person {
    public:
        Person();
        void setName(string name);
        string name();
    private:
        string _name;  // !!!: raise error here
    };
    

    此更改会引发更多错误:

    1. 字段类型不完整&#39;人物 :可以通过将类声明Person移到类声明{{上方}来修复1}}。
    2. 其他错误与之前引入的消息相同( 未定义模板的隐式实例化&#39; std :: __ 1 :: basic_string,std :: __ 1 :: allocator&gt;&#39 ; )但在不同的地方。 C ++文件Company LLVM

      utility

    3. 更新3:

      我忘了提到上面的代码嵌入了template <class _T1, class _T2> struct _LIBCPP_TYPE_VIS_ONLY pair { typedef _T1 first_type; typedef _T2 second_type; _T1 first; // <<<-- raise the error here _T2 second; // pair(const pair&) = default; // pair(pair&&) = default; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR pair() : first(), second() {} 块。

1 个答案:

答案 0 :(得分:0)

你的代码对我来说似乎很好。

您是否在头文件中加入了stringmap?如果是,请同时提供汇编error's