我有代码:
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值的元素?有什么问题?
答案 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} }。
更改地图定义以映射(智能)指针或引用。