Воскресенье, 17 Ноября 2024, 23:43

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Текущий объект
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;
}
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг