无法在C ++地图容器中输入正确的元素

时间:2012-06-20 09:25:34

标签: c++ map

我有代码:

string key = "", value = "", type = "";
while(in)
{
    getline(in, key, '=');
    getline(in, value, '\n');
    getline(in, type, '\n');
    in.get(); // get the dividing empty line
    CommonParamValue *paramValue = CreateParamValue(type);
    paramValue->SetValue(value);
    params.insert(make_pair(key, *paramValue)); // PROBLEM
    delete paramValue;
}

当我调用params.insert(make_pair(key, *paramValue));时,我得到一个具有正确键末尾EMPTY值的地图元素。当我检查

paramsIter = params.find(paramKey);
    if (paramsIter != params.end())
    {
        if( ("" == paramsIter->second.GetValue())
        ...
    }

所有时间条件"" == paramsIter->second.GetValue()都是真的,但一定不是这样! 其他信息:

class CommonParamValue
{
public:
    virtual void SetValue(string value){}
    virtual string GetValue(){ return ""; }
};
class StringParamValue : public CommonParamValue
{
    string str;
public:
    StringParamValue(){}
    virtual void SetValue(string value){str = value;}
    virtual string GetValue() {return str;}
};
CommonParamValue* Report::CreateParamValue(const string &strType) const
{
    if (strType == "int")
    {
        return (new IntParamValue());
    }
    else if(strType == "string")
    {
        return (new StringParamValue());
    }
    else
    {
        // error
        exit(1);
    }
}

问题是为什么当我params.insert(make_pair(key, *paramValue));时,我总是得到一个具有正确密钥和EMPTY值的元素?有什么问题?

2 个答案:

答案 0 :(得分:3)

我怀疑map被声明为:

std::map<std::string, CommonParamValue> params;

插入将导致值切片为CommonParamValue""始终从GetValue()返回map。为了获得所需的行为,CommonParamValue中的值将需要是指向std::map<std::string, std::shared_ptr<CommonParamValue> > params; 的指针,最好是智能指针:

{{1}}

答案 1 :(得分:0)

插入地图的对象是CommonParamValue而非StringParamValue,这意味着插入地图的对象副本会切割到{{1} }。

更改地图定义以映射(智能)指针或引用。