Быстрый вопрос, ребята, у меня есть следующая проблема:
У меня есть указатель Object (struct) в моем коде, и когда я изменяю что-то, чтобы отслеживать его историю, я сохраняю его в векторе (стеке) объектов.
Так я и пытаюсь сделать.
{
Object* myObject;
vector<Object> stack;stuffHappensInObject(*myObject);
stack.push_back(myObject);
if(IclickLoadLast){
myObject = stack.at(size-1);
}
}
У меня проблема с push_back
и я не знаю, возможно ли получить ВСЕ переменные структуры в новом объекте в стеке. Как я могу это сделать?
Во-первых, не используйте указатели, здесь это не нужно. Проблема была вызвана тем, что вы пытались добавить Object*
к вектору Object
(не говоря уже о быстром билете на UB-землю при разыменовании неинициализированного указателя). Вот фиксированный код:
{
Object myObject;
std::vector<Object> stack;stuffHappensInObject(myObject);
stack.push_back(myObject);
if(IclickLoadLast){
myObject = stack.at(stack.size() - 1);
}
}
Я также изменился size
в stack.size()
который является действительным методом std::vector
что вы можете использовать. Кроме того, взгляните на std::stack
который обеспечивает больше стековых операций:
{
Object myObject;
std::stack stack;stuffHappensInObject(myObject);
stack.push(myObject);
if(IclickLoadLast){
myObject = stack.top();
}
}
В обоих случаях, если вы используете C ++ 11, я предлагаю вам использовать std::vector::emplace_back
или же std::stack::emplace
вместо push_back
а также push
,
Пара вопросов:
Это не будет работать:
stack.push_back(myObject);
так как myObject
имеет тип Object*
в то время как стек берет объекты типа Object
, Обратите внимание на небольшую разницу в типе. Я не уверен, почему вы даже используете указатели (недостаточно контекста).
Но есть еще одна серьезная проблема:
Здесь вы отменяете ссылку на неинициализированный указатель. Результат неопределенное поведение.
Object* myObject; // No value defined (so it is random)
stuffHappensInObject(*myObject); // De-referencing (the *) on an uninitialized pointer.