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

C++ 无法在C+;中输入正确的元素+;地图容器,c++,map,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);

我有密码:

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))我得到一个map元素,它的key end值为空。当我检查

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))我总是得到一个具有正确键和空值的元素?怎么了?

我怀疑
地图被声明为:

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

我怀疑
map
被声明为:

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

插入到映射中的对象是
CommonParamValue
而不是
StringParamValue
,这意味着插入到映射中的对象副本将被切片到
CommonParamValue


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

插入地图的对象是
CommonParamValue
而不是
StringParamValue
,这意味着插入地图的对象副本被切片为
CommonParamValue


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

您遇到了称为切片的问题。有关更多信息,请参见的答案。多边形幻象总是通过指针,而不是通过对象来实现其功能!您所做的是将CommonParamValue类型的对象插入stl映射,因此StringParamValue中的所有附加信息都将丢失!也许您应该将params声明为std::map,这样您就可以调用params.insert(make_pair(key,paramValue)),当然,您应该在确定不再使用该对象时删除该对象。您遇到了称为切片的问题。有关更多信息,请参见的答案。多边形幻象总是通过指针,而不是通过对象来实现其功能!您所做的是将CommonParamValue类型的对象插入stl映射,因此StringParamValue中的所有附加信息都将丢失!也许您应该将params声明为std::map,这样您就可以调用params.insert(make_pair(key,paramValue)),当然,您应该在确定不再使用该对象时删除该对象。非常感谢!你当然是对的。我不知道C++的特殊功能,非常感谢!你当然是对的。我不知道C++的特殊性。