私は次の(簡略化された)クラスを持っています:
class Operator {
private:
std::map<std::string, std::unique_ptr<Operand>> op;
public:
template <class T>
void insertOperand(std::string const &s, T o = T()) {
op.insert(std::pair<std::string, std::unique_ptr<StreamOperand>>(
s, std::move(std::unique_ptr<T>(new T(o)))
);
}
void setOperandsValue(std::string const &o, int v) {
op.find(o)->second->setValue(v);
}
};
Operand
新しい作品を挿入しても問題ありません。ただし、関数が返されると、デストラクタが呼び出されるため、map
を呼び出すときにオブジェクトは含まれませんsetOperandsValue
。私はDDDを使用してこれを観察しました:最後にinsertOperand
Operator::~Operator()
が呼び出されます。
std :: unique_ptrをSTLで使用することを確認した後、紹介しました(より良い:使用済み)std::move
が、正しく配置されていないか、何かが不足しています(知識不足が原因である可能性が高い)。利用できないので使用してmap::emplace
いません。
編集:デストラクタ呼び出しは、を破壊しているため、有効ですnew T(o)
。とにかく、map
に入るときは空のままsetOperandsValue
です。
編集#2:結果を入力setOperandsValue
して実行すると、つまり、以前に追加したのにエントリが見つかりません。op.find(o)
op.end