Вставка данных, содержащих указатель, в вектор

У меня есть следующий класс:

class Op
 {
 private:
 std::vector<std::string> m_operands;
 std::string m_op;
 public:
 Op(std::string op = "") : m_op(op){}
 std::string GenCode();
 void AddOperand(std::string& operand) ;
 std::vector<std::string> GetOperands() const { return m_operands; }
 std::string GetOp() const { return m_op; }
 };
</std::string></std::string>

Экземпляры класса сохраняются в std::vector<op> m_movOpV</op>; Т.е. следующий метод добавляет новый op:

Op* AddMovOp()
{
 Op op("MovOp");
 m_movOpV.push_back(op);
 return &m_movOpV.back();
}

Кроме того, я определил:

typedef std::pair<std::string,op*> Assignment;
std::vector<assignment> m_proceduralAssign;
</assignment></std::string,op*>

Таким образом, после добавления Op я могу сгенерировать Assignment используя следующую функцию:

void AddAssignment(ModuleVCodeGen::Op* op,const std::string& lExp)
{
 Assignment assignment = (Assignment)std::make_pair(lExp,op);
 m_proceduralAssign.push_back(assignment);
}

Нижеприведенный сценарий создает проблему:

1.Op* op1 = AddMovOp();
2.op1->AddOperand("operand1");
3.AddAssign(op,"1");
4.Op* op2 = AddMovOp();

После выполнения шага 4. m_movOpV обновляется корректно с новой Op But m_proceduralAssign имеет мусорные данные: Assignment которое уже существует в m_proceduralAssign превращается в пустые m_operands и плохой указатель на m_op. И не добавлено новое Assignment (которое я пытался добавить).

Не могли бы вы посоветовать, где эта проблема, и как ее решить?

1 ответ

Вы должны пересмотреть свой дизайн. Большая проблема, которую я вижу с вашим кодом прямо сейчас, заключается в том, что ссылки и указатели на векторные объекты недействительны довольно часто (во время push_backs и других операций), поэтому, возвращая указатель на вновь вставленный элемент, вы задаете проблему. Если бы я был вами, я бы посмотрел на сохранение индекса.

licensed under cc by-sa 3.0 with attribution.