Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2009, 13:35   #1
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию Самоудаляющиеся элементы массива.

У меня есть класс BULLET(т.е. пуля), как мне организовать массив и класс, чтобы при определенном условии элемент массива самоудалялься?
Набросайте примерчик, пожалуйста.... Ничего в голову подходящего не лезет...
Levsha100 вне форума Ответить с цитированием
Старый 19.06.2009, 14:35   #2
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

реши для себя, что значит "удаление из массива". реальное удаление, со сдвигом всех элементов (возможно, через новый массив), либо флаг, что элемент недействителен. первое будет довольно дорогой операцией, при частом вызове и большом массиве
vvviperrr вне форума Ответить с цитированием
Старый 19.06.2009, 14:39   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
#include <iostream>
#include <conio.h>
using namespace std;

class BULLET
{
 private:
  int *mas; // массив
  int N;   // размер
  
 public:
  BULLET(int n)
   {
    N = n;
    mas = new int[N];
   }
  ~BULLET()
   {
    N = 0;
    delete[] mas;
   }
   
  void delEl(int k)  // удаление k-ого элемента
   {
    int *tmp = new int[N-1];
    for(int i=0; i<k; i++)
     tmp[i] = mas[i];
    for(int i=k; i<N-1; i++) 
     tmp[i] = mas[i+1];
    --N;
    delete[] mas;
    mas = tmp; 
   }  
   
  void free(void)
   { 
    N = 0;
    delete[] mas;
   }
   
 void add(int i,int el)
  {
   mas[i] = el;
  } 
  
 void print()
  {
   cout<<endl;
   for(int i=0; i<N; i++)
    cout<<mas[i]<<" ";
   cout<<endl; 
  }  
   
};

int main()
{
 const int N=5;
BULLET test(N);
int i;
 
for(i=0; i<N; i++)
 test.add(i,i);  // заполняем числами по порядку
test.print();  // выводим

test.delEl(3);  // удаляем 3-й элемент
test.print();  // выводим

test.free();  
  
getch();
return 0;
}
Наверное, через списки лучше будет делать.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 19.06.2009, 15:14   #4
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

1)Скорее реальное удаление.
2)Массив должен быть не в классе т.е. массив объектов BULLET.
Списки, а как их организовать?
//Конечная цель- оружие для бота, т.е. он "выстрелил"- создал новый экземпляр BULLET в массиве.
///////////
Наверное я что-то неправильно понимаю
Levsha100 вне форума Ответить с цитированием
Старый 19.06.2009, 15:16   #5
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Levsha100,
Вопрос в том, какая стоит вообще задача. Если имеется в виду что-то типа игры, где летит пуля и при попадании в кого-то/что-то она исчезает и что-то делает, то я бы сделал не так.
Тогда, по-моему, лучше сделать некий сторонний класс, который собственно и будет управлять всеми этими объектами и при попадании их удалять. Обычно, когда мелкие объекты становятся в программе слишком "умными" и делают сами кучу действий, ими становится неудобно управлять.
Pashan вне форума Ответить с цитированием
Старый 19.06.2009, 15:29   #6
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

То есть не имеет смысла писать класс, можно обойтись записью, и все проверки/операции делать не в классе, а в основной программе.
Levsha100 вне форума Ответить с цитированием
Старый 19.06.2009, 15:42   #7
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Ну лично мое мнение такое.
Допустим, есть некоторая игра с игроками, монстрами, предметами, летящими снарядами и т.п. Все это вместе образует некоторое состояние игры. И по-любому все это должно где-то хранится. По-моему, лучше сделать некий отдельный класс "Состояние Игры", который всем этим и будет заниматься. То есть хранить все массивы, обрабатывать передвижения и пересечения объектов.
А если вносить логику в сами игровые объекты, начнется путаница - а кто о ком что должен знать? Где должно отслеживаться попадание пули в игрока - в классе игрока или в классе пули? Так это хотя бы в одном месте будет. А классы объектов будут предоставлять методы для изменения самих объектов, но не для взаимодействия с другими объектами.
Впрочем, это чисто ИМХО. Кто-то может со мной не согласиться.
Pashan вне форума Ответить с цитированием
Старый 19.06.2009, 15:43   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Levsha100
2)Массив должен быть не в классе т.е. массив объектов BULLET.
Ну там принцип тот же самый. Просто у меня массив int'ов, а у вас будет массив BULLET'ов.
Цитата:
Сообщение от Levsha100
Списки, а как их организовать?
Отдаленный набросок:

Код:
class BULLET
{
 int blabla;
 public:
  BULLET(int k) : blabla(k) {}
};

typedef struct Spis
{
 BULLET *bul;
 Spis *next;
 Spis *pred;
};

void addToSpis(Spis *S, BULLET *el)
{
 Spis *newel = new Spis;
 newel->next = NULL;
 newel->pred = S;
 S->next = newel;
}

Spis* delEl(Spis *elS) // удаляем элемент списка, на который указывает elS
{
 Spis *tmp = elS->pred;
 tmp->next = elS->next;
 elS->next->pred = tmp;
 delete elS;
 return tmp->next;
}
Здесь BULLET - собственно, класс пули.
Spis - структура, которая хранит пулю (указатель на нее) и данные о связях с другими элементами списка (соседними).

По этому списку нужно пройтись, например, как-нибудь так:
Код:
Spis *p = begin; // begin - указатель на первый элемент списка
while(p)
 {
 if( <тут условие> ) p = delEl(p);
 else p = p->next;
 }
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 19.06.2009, 15:48   #9
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Всем громадное СПАСИБО! Буду пробовать.
Levsha100 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Элементы массива Ximer Паскаль, Turbo Pascal, PascalABC.NET 5 26.04.2009 00:53
Удалить элементы массива Маськ@ Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2008 17:46
Элементы массива в листбокс KiDoki Общие вопросы Delphi 4 07.10.2008 18:05
Повторяющиеся элементы массива Stanislav Общие вопросы Delphi 10 23.05.2008 12:31
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44