вектор объектов, имеющих указатель объекта

Быстрый вопрос, ребята, у меня есть следующая проблема:

У меня есть указатель Object (struct) в моем коде, и когда я изменяю что-то, чтобы отслеживать его историю, я сохраняю его в векторе (стеке) объектов.
Так я и пытаюсь сделать.

{
Object* myObject;
vector<Object> stack;stuffHappensInObject(*myObject);
stack.push_back(myObject);

if(IclickLoadLast){
myObject = stack.at(size-1);
}
}

У меня проблема с push_back и я не знаю, возможно ли получить ВСЕ переменные структуры в новом объекте в стеке. Как я могу это сделать?

-1

Решение

Во-первых, не используйте указатели, здесь это не нужно. Проблема была вызвана тем, что вы пытались добавить 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,

1

Другие решения

Пара вопросов:

Это не будет работать:

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.
1

По вопросам рекламы [email protected]