0

私はコードを持っています:

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 値を持つ要素を常に取得するのはなぜですか? なにが問題ですか?

4

2 に答える 2

3

mapは次のように宣言されていると思われます:

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

挿入により、CommonParamValue常に""fromを返す a に値がスライスされGetValue()ます。目的の動作を得るには、 の値はへのポインタ、できればスマート ポインタでmapある必要があります。CommonParamValue

std::map<std::string, std::shared_ptr<CommonParamValue> > params;
于 2012-06-20T09:29:36.947 に答える
0

マップに挿入されたオブジェクトは ではありCommonParamValueませんStringParamValue。つまり、マップに挿入されたオブジェクトのコピーは にスライスされCommonParamValueます。

(スマート) ポインターまたは参照がマップされるようにマップ定義を変更します。

于 2012-06-20T09:45:34.307 に答える