Как удалить глобальный объект или посоветуйте, что поменять
От: kavalero  
Дата: 15.08.04 11:13
Оценка:
Уважаемые гуру! Посоветуйте, пожалуйста как справится со следующей проблемой.
Написал класс CBASEMain. В нём есть виртуальная функция Virt(int q), которая переопределяется в наследуемых классах (их 5 штук).
В программе объявляю глобальный массив объектов СBASE *fff[100]; (глобальный, потому что мне надо иметь доступ к нему из разных функций...).
Итак, при нажатии на кнопку, вызывается функция OnButtonAdd(), в которой происходит :
fff[i++]= new <класс-наследник (их 5 штук) от CBASE>, т.е. при каждом нажатии на кнопку Add создаётся объект.
Далее, в OnButtonAdd(), запускается таймер (один для всех объектов), событие которого вызывает функцию My(), в теле которой есть вызов в цикле fff[i]->Virt(int q), т.е. вызов нужной версии виртуальной функции Virt(int q),
и при определённых условиях, в My() нужно бы было вызвать что-то типа delete fff[2], т.е. удалить один объект из массива объектов. Но так как массив объектов я объявил глобальным — это ведёт к завершению программы. Можно ли как-то это исправить ? А как сделать чтобы он был не глобальным я не знаю. Т.е. этот массив объектов должен быть доступен функциям OnButtonAdd() и My()?

Пожалуйста, помогите.
Re: Как удалить глобальный объект или посоветуйте, что помен
От: dr. Frost Россия  
Дата: 16.08.04 06:26
Оценка:
а может проще написать типа класс одиночку(Singletone) который бы и осуществлял все манипуляции с массивом нужных элементов?

типа
*.h
///////////////////////////////
class CMyCBASEMan
{
private:
static CMyCBASEMan* m_Me;
CMyCBASEMan();
/// All whan you want;

///
public:
~CMyCBASEMan();
CMyCBASEMan* GetInstance();
/// твои мемберы класса все как обычно.
};

////////////////////////////////////
*.cpp

///////////////////////////////////
...

CMyCBASEMan* CMyCBASEMan::m_Me=0;
//конструктор
//деструктор

CMyCBASEMan* CMyCBASEMan::GetInstance()
{
if(!m_Me)
m_Me=new CMyCBASEMan;
return m_Me;
}



//использование

...::OnButtonAdd()
{
CMyCBASEMan *man=CMyCBASEMan::GetInstance();
// дальше как обычно.
}
Уверенность, это чувство которое возникает у вас перед тем как вы осознали ситуацию.
Re: Как удалить глобальный объект или посоветуйте, что помен
От: lubichevav  
Дата: 16.08.04 06:50
Оценка:
Здравствуйте, kavalero, Вы писали:

так как массив объектов я объявил глобальным — это ведёт к завершению программы — это как понимать?
Re: Как удалить глобальный объект или посоветуйте, что помен
От: Georgy Украина  
Дата: 16.08.04 07:26
Оценка:
Здравствуйте, kavalero, Вы писали:

K>и при определённых условиях, в My() нужно бы было вызвать что-то типа delete fff[2], т.е. удалить один объект из массива объектов. Но так как массив объектов я объявил глобальным — это ведёт к завершению программы.


Возможно, проблема в том, что после delete fff[2] не стоит fff[2] = NULL, и на следующий тик таймера вызывается вирт. ф-я мёртвого объекта?
Для более точного "диагноза" желательно увидеть код.
Не думайте, мысли — источник ошибок.
Re[2]: Как удалить глобальный объект или посоветуйте, что по
От: Кодт Россия  
Дата: 16.08.04 09:42
Оценка:
Здравствуйте, Georgy, Вы писали:

K>>и при определённых условиях, в My() нужно бы было вызвать что-то типа delete fff[2], т.е. удалить один объект из массива объектов. Но так как массив объектов я объявил глобальным — это ведёт к завершению программы.


G>Возможно, проблема в том, что после delete fff[2] не стоит fff[2] = NULL, и на следующий тик таймера вызывается вирт. ф-я мёртвого объекта?

G>Для более точного "диагноза" желательно увидеть код.

Да и вообще, дизайн программы вызывает большие вопросы.
Глобальный... голый массив... голых указателей... без контроля размера (а что, если юзер нажмёт кнопку 101 раз?)...
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.