Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Процедура удаления любого объекта / 25 сообщений из 55, страница 1 из 3
08.11.2015, 12:17
    #39097537
crush1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Хочу сделать универсальную процедуру, которая удаляет любой объект и присваивает ему значение NULL.
Как делается обычно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A
{
public:
	A()
	{
		cout << "Create" << endl;
	}

	~A()
	{
		cout << "Destroy" << endl;
	}
};
.....
A *a = new A();
...
delete a;
a = NULL;



Вместо последних двух строк хочу иметь следующую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MyDeleteObject(LPVOID hObject)
{
	delete hObject;
	hObject = NULL;
}

A *a = new A();
MyDeleteObject(a);



Всё отрабатывает без ошибок, но вот только деструктор класса не вызывается. Как исправить ?
Я полагаю, что компилятор не понимает, что объект-указатель hObject относится к классу "A".
Возможен ли вообще такой подход ?
...
Рейтинг: 0 / 0
08.11.2015, 12:31
    #39097543
crush1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Может завести ещё 1 параметр и в функцию передавать тип объекта ? А потом при удалении через какой-нибудь cast приводить к этому типу и удалять ?
...
Рейтинг: 0 / 0
08.11.2015, 12:33
    #39097545
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
crush1Возможен ли вообще такой подход ?
MyDeleteObject должна быть template.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.11.2015, 12:57
    #39097559
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
crush1,

Передавай не LPVOID, а какой либо прародитель XMyObject*, и виртуальный деструктор тебя спасет.
...
Рейтинг: 0 / 0
08.11.2015, 13:02
    #39097560
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Еще можно сделать неправильно - макросом.
Шаблоном не очень хорошо - сгенерится своя функция для каждого типа.

Кроме того, нужно учитывать случай, когда у тебя массив объектов.
http://www.cplusplus.com/reference/new/operator delete []/
...
Рейтинг: 0 / 0
08.11.2015, 15:09
    #39097608
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class Deletable{
public:
  virtual ~Deletable() = default;
};

class Point: public Deletable{
public:
    int x;
    int y;
    ~Point(){
        std::cout << "DELETING!" << std::endl;
    }
};

using dd = Deletable *;

void erase(dd &obj){
    delete obj;
    obj = nullptr;
}


int main() {
  Deletable *p = new Point;
  std::cout << p << std::endl;
  erase(p);
  std::cout << p << std::endl;
}
...
Рейтинг: 0 / 0
08.11.2015, 15:24
    #39097618
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
ЗимарглШаблоном не очень хорошо - сгенерится своя функция для каждого типа.
И что тут плохого?
...
Рейтинг: 0 / 0
08.11.2015, 15:26
    #39097619
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Anatoly MoskovskyИ что тут плохого?
раздувание кода, разве это хорошо?
...
Рейтинг: 0 / 0
08.11.2015, 15:58
    #39097631
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
FishHookAnatoly MoskovskyИ что тут плохого?
раздувание кода, разве это хорошо?монописуально. особенно в данном случае. А вот от лишней писанины избавит, и от ненужных бессмысленных наследований тоже.
...
Рейтинг: 0 / 0
08.11.2015, 16:08
    #39097635
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
egorychмонописуально. особенно в данном случае.
Особенно в данном?
crush1Хочу сделать универсальную процедуру, которая удаляет любой объект
В пессимистическом варианте вы получите вариант функции для всех классов использующихся в программе.
Ну вперёд, чо!
...
Рейтинг: 0 / 0
08.11.2015, 16:11
    #39097636
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Если функция действительно нужна всем классам програмы, то ручное написание всех её вариантов, безусловно, круче шаблона ...
...
Рейтинг: 0 / 0
08.11.2015, 16:52
    #39097656
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
FishHookНу вперёд, чо!функция то пипец огромная, 3 строчки, раздует код неимоверно Куда лучше не забыть все эти классы отнаследовать от Deletable. И потом долго медитировать, задлянафига это сделано вообще.
...
Рейтинг: 0 / 0
08.11.2015, 17:24
    #39097674
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
egorychFishHookНу вперёд, чо!функция то пипец огромная, 3 строчки, раздует код неимоверно Куда лучше не забыть все эти классы отнаследовать от Deletable. И потом долго медитировать, задлянафига это сделано вообще.
Наследование - основополагающий принцип ООП в С-подобных языках. Если задача решается без метапрограммирования, то её нужно решать без метапрограммирования. А если я забуду отнаследоваться от
Deletable, то получу ошибку компиляции.
...
Рейтинг: 0 / 0
08.11.2015, 19:03
    #39097713
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
FishHookраздувание кода, разве это хорошо?
Вы вообще видели объемы бинарников С++?
Там на мегабайты идет речь, а вы тут со своим раздутием на пару Кбайтов )))
...
Рейтинг: 0 / 0
08.11.2015, 19:11
    #39097716
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
crush1,

только макросом\шаблоном со всеми вытекающими
...
Рейтинг: 0 / 0
08.11.2015, 19:31
    #39097724
FishHook
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Anatoly Moskovskyраздутием на пару Кбайтов
пару килобайтов там, пару килобайтов сям, а потом сами же гундите на форумах "что ж за программы то пошли! Элементарная тулзовина полгигабайта отжирает! Вот в наше время в 64к умудрялись приличную игру засунуть! Совсем школота обленилась!"
...
Рейтинг: 0 / 0
08.11.2015, 20:40
    #39097760
Зимаргл
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
Anatoly MoskovskyЗимарглШаблоном не очень хорошо - сгенерится своя функция для каждого типа.
И что тут плохого?
Я не говорил, что плохо. Некрасиво.

К тому же ТС хочет чего то странного типа FreeAndNil, так что правильности построения я не советчик =)
...
Рейтинг: 0 / 0
08.11.2015, 22:18
    #39097829
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
crush1хочу иметь следующую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MyDeleteObject(LPVOID hObject)
{
	delete hObject;
	hObject = NULL;
}

A *a = new A();
MyDeleteObject(a);



Всё отрабатывает без ошибок, но вот только деструктор класса не вызывается. Как исправить ?
Я полагаю, что компилятор не понимает, что объект-указатель hObject относится к классу "A".
Возможен ли вообще такой подход ?

Чтото мне подсказывает, что указатель a тут не изменится.

Должна быть функция MyDeleteObject( T ** p_hObject){ .... *p_hObject = NULL;

Не уверен, что будет работать грязный хак - приведение void ** p_hObject к произвольному классу, например к Deletable:

delete (Deletable *)(*p_hObject);
...
Рейтинг: 0 / 0
08.11.2015, 22:50
    #39097843
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
crush1Хочу сделать универсальную процедуру, которая удаляет любой объект и присваивает ему значение NULL.
Как делается обычно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class A
{
public:
	A()
	{
		cout << "Create" << endl;
	}

	~A()
	{
		cout << "Destroy" << endl;
	}
};
.....
A *a = new A();
...
delete a;
a = NULL;



Вместо последних двух строк хочу иметь следующую функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void MyDeleteObject(LPVOID hObject)
{
	delete hObject;
	hObject = NULL;
}

A *a = new A();
MyDeleteObject(a);



Всё отрабатывает без ошибок, но вот только деструктор класса не вызывается. Как исправить ?
Я полагаю, что компилятор не понимает, что объект-указатель hObject относится к классу "A".
Возможен ли вообще такой подход ?
да, все правильно.

нет, такой подход невозможен, указатель должен быть типизированным. поэтому функция должна быть шаблонной.
...
Рейтинг: 0 / 0
08.11.2015, 22:50
    #39097844
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
crush1Может завести ещё 1 параметр и в функцию передавать тип объекта ? А потом при удалении через какой-нибудь cast приводить к этому типу и удалять ?

тип нельзя передать как параметр.
...
Рейтинг: 0 / 0
08.11.2015, 22:51
    #39097845
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
ЗимарглЕще можно сделать неправильно - макросом.
Шаблоном не очень хорошо - сгенерится своя функция для каждого типа.

Кроме того, нужно учитывать случай, когда у тебя массив объектов.
http://www.cplusplus.com/reference/new/operator delete[]/


ну и пусть генерируется, она тут же заинлайнится.
...
Рейтинг: 0 / 0
08.11.2015, 22:53
    #39097847
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
FishHookegorychмонописуально. особенно в данном случае.
Особенно в данном?
crush1Хочу сделать универсальную процедуру, которая удаляет любой объект
В пессимистическом варианте вы получите вариант функции для всех классов использующихся в программе.
Ну вперёд, чо!


да и хрен с ним!
...
Рейтинг: 0 / 0
08.11.2015, 22:57
    #39097850
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
такая функция, разумеется, должна принимать ссылку на указатель, чтобы иметь возможность его обнулять.
...
Рейтинг: 0 / 0
09.11.2015, 00:09
    #39097873
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
MasterZivтакая функция, разумеется, должна принимать ссылку на указатель, чтобы иметь возможность его обнулять. В "советах" читал, что ссылки следует всегда делать константными. Это в духе C, где переменные передаваемые по значению не менялись. Синтаксически в C++ передача переменной по ссылке и по значению не отличаются.

Константная ссылка в C++ может принять временный объект или литерал, что расширяет область применения функции.
...
Рейтинг: 0 / 0
09.11.2015, 00:15
    #39097874
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура удаления любого объекта
mcureenabВ "советах" читал, что ссылки следует всегда делать константными.

Либо это вредные советы, либо ты их неправильно читал. Константные ссылки используют
вместо передачи по значению для того, чтобы не создавать временные объекты и тратить время
на копи-конструктор.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Процедура удаления любого объекта / 25 сообщений из 55, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]