Текущий объект
|
|
Saitei | Дата: Пятница, 31 Января 2014, 16:05 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Как удалить текущий объект? Чтобы память действительно освободилась и дальше не было проблем? Я почему-то раньше думал, что если напишу в классе "delete this", то всё будет хорошо..... Однако в интернете начитался, что это какое-то шаманство и будут проблемы =(
|
|
| |
maxxC | Дата: Пятница, 31 Января 2014, 17:30 | Сообщение # 2 |
был не раз
Сейчас нет на сайте
| Приведи конкретный пример того, что ты хочешь сделать. Про delete this все верно сказано, использовать вообще не рекомендуется, разве что только в редких случаях, когда гарантируется, что удаленный объект вообще не будет использоваться после этого действия, да и оно бывает не всегда нужно, потому что все это кривенько и возможность проверить объект на валидность стремится к нулю.
|
|
| |
Saitei | Дата: Пятница, 31 Января 2014, 17:53 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| maxxC, При условии, что мышь находится на объекте + нажата ЛКМ, должен удалиться объект. Все объекты создаются неявно
|
|
| |
maxxC | Дата: Пятница, 31 Января 2014, 18:05 | Сообщение # 4 |
был не раз
Сейчас нет на сайте
| Saitei, Хорошо, в чем проблема текущей ситуации? Вот алгоритм действий: объекты созданы в куче и указатели на них хранятся в каком-то контейнере, если нажата ЛКМ перебираем контейнер, проверяем коллизию с мышью, получаем указатель на текущий объект из контейнера с которым произошло событие, выполняем для этого объекта delete и удаляем его из контейнера.
|
|
| |
Saitei | Дата: Пятница, 31 Января 2014, 21:02 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| maxxC, всё сказанное я итак осознаю. Меня интересует код. Как корректно удалить текущий объект? При условии, что условие удаление уже написано
|
|
| |
avolkoff | Дата: Пятница, 31 Января 2014, 22:39 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| В чем создавал, там и удаляй, например, есть менеджер объектов, в нем есть функции для создания и удаления объектов. Менеджер использует контейнер для хранения. Используешь менеджер для создания, обращения, удаления объектов и всё. Код #include <iostream> #include <vector>
// // Простой объект //
class CObject { private: int m_ID;
public: CObject(int nID) { m_ID = nID; std::cout << "Created! ID is " << m_ID << std::endl; } ~CObject() { std::cout << "Destroy! ID is " << m_ID << std::endl; }
int GetID() { return m_ID; } void PrintID() { std::cout << "ID is " << m_ID << std::endl; } };
class CObjectMgr { private: std::vector<CObject *> m_Objects;
public: CObjectMgr() { }
~CObjectMgr() { // // Освобождаем память выделенную под объекты //
for(std::vector<CObject *>::iterator it = m_Objects.begin(); it != m_Objects.end(); it++) { delete (*it); // освобождаем } }
CObject* Create(int nID) { CObject *pObj = new CObject(nID); // создаем объект динамически m_Objects.push_back(pObj); // вставляем в конец return pObj; // возвращаем указатель на него }
CObject* Get(int nID) { // проходим по вектору for(std::vector<CObject *>::iterator it = m_Objects.begin(); it != m_Objects.end(); it++) { if(((*it)->GetID()) == nID) // сравниваем ID return *it; // возвращаем его }
return 0; // если нет, то 0 }
void Destroy(int nID) { for(std::vector<CObject *>::iterator it = m_Objects.begin(); it != m_Objects.end(); it++) { if(((*it)->GetID()) == nID) // сравниваем ID { delete (*it); // освобождаем память m_Objects.erase(it); // стираем объект из вектора return; // выходим из функции } } } };
int main(int argc, char *argv[]) { CObjectMgr mgr; // Создаём экземпляр менеджера
// Заполняем for(int i = 0; i < 100; i++) mgr.Create(i);
// Получаем mgr.Get(46)->PrintID();
// Удаляем если не надо mgr.Destroy(55);
return 0; }
|
|
| |