Добрый день товарищи. Есть вектор в кротом храню объекты, так же есть указатель
Код
objects* obj;//берет некоторый объект из вектора, далее делаем некоторые манипуляции с ним if(!obj==NULL) { SetPos(obj->x,obj->y); }
Но проблема в том, что данный объект может удалиться в любой момент, но условие все равно срабатывает и в функцию передаются неверные данные. Как можно это исправить?
Но проблема в том, что данный объект может удалиться в любой момент, но условие все равно срабатывает и в функцию передаются неверные данные. Как можно это исправить?
ЦитатаArchido ()
Стоит почитать про smart pointer'ы
+1. Или же можно извратиться:
Код
... if(objects[i].Update() == false) { objects[i].Delete(); //здесь уже можно удалять objects[i], например } ...
Спасибо, но это немного не то. Как можно проверить что в указателе отсутствуют данные? При объявлении vector<object*> vec; object *obj=0;
obj=vec.at(i); if(!obj==0) { ///// } Если из вектора удалить данный объект, то в указателе будет мусор типа 0xfeefee, вот можно ли его как то обнаружить?
Хм, интересно получается. Добавил флаг kill на проверку перед удалением из вектора, а в памяти он весит. Так что обычной проверкой на флаг вроде как справился.
Как можно проверить что в указателе отсутствуют данные?
В указателе нет данных, в нем содержится только адрес области памяти, в которой уже и располагаются эти самые данные. Штука в том, что когда удаляется какой-то объект, память, которую он ранее занимал, не удаляется в прямом смысле слова - она просто перестает принадлежать этому объекту и всем указателям, которые на этот объект\память указывали. Поэтому вот это:
Цитата
Добавил флаг kill на проверку перед удалением из вектора, а в памяти он весит. Так что обычной проверкой на флаг вроде как справился.
в корне не правильно. В этой памяти может располагаться уже совсем другой объект, чем это плохо и чем это грозит нужно объяснять? Однажды там будет краш.
В чем проблема про умные указатели почитать? Они специально придуманы для управления временем жизни объекта, для вот таких вот ситуаций. Могу еще один вариант, конечно, посоветовать: можно хранить указатель на вектор в классе объекта, а позже в деструкторе удалять себя из этого вектора. C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Вторник, 28 Апреля 2015, 10:20
Да, я уже заметил ошибку, но как быть то auto_ptr копирует из вектора причем обнуляя его значение в нём. Нашел пример
Код
class MyClass { std::auto_ptr<Resource> res; public: MyClass(Resource* r): res(r) { } };// res is automatically freed when the MyClass object is destroyed
Но как адаптировать под свою задачу пока не очень понял.
но как быть то auto_ptr копирует из вектора причем обнуляя его значение в нём.
Это только один из видов таких указателей, auto_ptr использует технику разрушающего копирования, поэтому объектом может владеть только один указатель. Тебе нужен shared и скорее всего weak для хранения. Вообще советую нормально ознакомиться с этой темой, что, как и в каких случаях используется... простым копированием примеров тут едва ли можно обойтись. C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Среда, 29 Апреля 2015, 05:50
Ковыряюсь в С++14. Как работать с "auto... i"? Как понимаю, в функцию я могу передавать сколько угодно аргументов разных типов. Как их всех вывести на экран, например?
Ребят, срочно нужна помощь. Как преобразовать вещественное число с фиксированной точкой в число с плавающей точкой, сохранив две цифры после точки в мантиссе. Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.
innovation, речь идет о каких-то супер-пупер классах чисел-объектов, или, просто, о необходимости красиво их напечатать? В последем случае смотрите свойства printf, тип e. Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Gudleifr, А можно все такие увидеть пример данного алгоритма ? Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.
innovation, алгоритма чего? Что, конкретно, Вы хотите? Какого типа входная величина, какого - выходная? Если типы стандартные, у них есть имена - float, double, char*, string... Если нестандартные - требуется описать в виде record, unit, struct или class... Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
Сообщение отредактировал Gudleifr - Понедельник, 15 Июня 2015, 17:59
innovation, в C++ нет родной поддержки чисел с фиксированной точкой, поэтому для ответа на вопрос нужно либо больше информации (как число представлено в памяти), либо нужен экстрасенс. Быстрый гуглинг дал вот это: http://habrahabr.ru/sandbox/44727/ (я не читал, но вроде есть что-то про переводы)
Сообщение отредактировал Jhon - Понедельник, 15 Июня 2015, 19:54
Какой самый живучий паразит? Бактерия? Вирус? Кишечный глист? Идея. Она живучая и крайне заразная; стоит идее завладеть мозгом, избавиться от нее практически невозможно. Я имею виду сформировавшуюся идею, полностью осознанную, поселившуюся в голове.