私は次の(簡略化された)クラスを持っています:
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