Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Выпиливание экземпляра класса самим собой - C++

11.10.2012, 16:52. Просмотров 992. Ответов 29
Метки нет (Все метки)

Наслышан и начитан о плохом тоне и ub команды delete this, однако, будет ли ошибкой вызывать вместо delete this деструктор?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class SECURITY
{
*some data*
public :
SECURITY()
{
*check something, and it is wrong*
~SECURITY();
*ну а здесь уже нет никаких обращений к полям класса или функциям, работающими с полями*
}
~SECURITY()
{
delete *somedata*;
delete [] *somedata*;
...
}
}
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2012, 16:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выпиливание экземпляра класса самим собой (C++):

При создании экземпляра класса, создается 2 экземпляра вместо 1 - C++
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех конструкторах (1. по умолчанию, 2. со всеми...

Создание нового экземпляра дочернего класса из экземпляра базового - C++
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

Сложение экземпляра базового класса и экземпляра наследника - C++
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения "знал"...

Удаление экземпляра класса в функции самого класса (Ошибка при отладке) - C++
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и количество этих указателей refcounter ...

Передача свойства одного экземпляра класса другому экземпляру класса - C++
#include <tchar.h> class A { public: A(); int aVar; }; class B : public A

Явное создание экземпляра класса и явная специализация шаблона класса - C++
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1638 / 1010 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.10.2012, 17:21 #16
soon, зачем дублировать то, что и так уже есть в std::exception?
C++
1
2
3
4
5
6
7
#include <stdexcept>
#include <string>
 
class file_does_not_exist: public std::runtime_error {
public:
    file_does_not_exist(const std::string& msg): std::runtime_error(msg) {}
};
2
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.10.2012, 20:33  [ТС] #17
Deviaphan, везде, где читал, была конструкция throw(). Даже и не знал, что throw .. возможно. Спасибо. Хотя я все равно буду писать throw(), ибо привычнее.


soon, в этот раз не помог, да и не дело это - решать проблему перезапусками.
К сожалению, наследоваться от exception'ов нельзя (по условию). Нужна конструкция, получающая int или catch(...), где int за'define'нен под ошибки.

Проблема решена: ) Всё дело было в переполнении буферной переменной

Добавлено через 22 минуты
Throw нельзя делать в case?..
C++
1
2
3
4
5
6
7
switch (flag)
        {
        case 'н':
            throw PROCESS_FAILURE; // не воспринимает
 
        case 'д':
            break;
а
C++
1
2
if (flag == 'н')
throw PROCESS_FAILURE;
работает
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.10.2012, 06:55 #18
throw можно делать везде, кроме деструктора. В деструкторе тоже можно, но не нужно.
У тебя опять что-то глючит. Перезапусти студию и сделай полный ребилд проекта.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
14.10.2012, 07:46  [ТС] #19
Deviaphan, не помогло ;<

Добавлено через 20 минут
А вообще могу ли я прерывать конструктор? Допустим, в конце конструктора (последней строчкой) вызвать его метод типа Dialog() и работать в нем и с экземпляром, и вообще. Будет ли в этом что-то плохое?
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.10.2012, 08:01 #20
Бросать исключения в конструкторе можно и нужно. "последней строчкой" работать с этим объектом (вызывать методы и т.п.) можно только в том случае, если ты перехватил исключение внутри конструктора и корректно их обработал. Т.е. если после отработки исключения у тебя получился корректно сформированный экземпляр. В противном случае ты будешь вызывать методы для не сформированного объекта, это почти то же самое, что сделать приведение типа случайного адреса к указателю на класс и что-то там вызывать. Ну и виртуальные функции в конструкторе вызывать нельзя даже при отсутствии исключений.

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
не помогло ;<
Попробуй
C++
1
2
       case 'н':
            { throw PROCESS_FAILURE; } // не воспринимает
При генерации исключения ты создаёшь новый объект, а case нельзя новые объекты создавать. Только если вложенную область сделать.
2
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
14.10.2012, 10:25  [ТС] #21
Deviaphan,
т.е структура вида :
C++
1
2
3
4
5
6
7
8
9
10
11
12
CLS::CLS()
{
/*абсолютное заполнение полей и, если нужно, выбрасывание exception-ов
 с отчисткой памяти конструктора и уже присовенных участков типа char *buffer = new char[x]...*/
if (Dialog() == PROCESS_FAILURE)
throw something;
else
{
printf("Something success");
throw success;
}
}
, где Dialog() активно юзает и поля класса и его методы, хотя конструктор ещё не выполнен до конца.
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.10.2012, 11:10 #22
nexen, Меня долго мучал этот вопрос, но я все думал, что используется нечто другое... В общем, зачем вы кидаете исключение, если все завершилось хорошо? Или это опять оговорено в условии?
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
14.10.2012, 11:16  [ТС] #23
soon, как-то на автомате вышло написать "throw success". В реалии при завершении "success" у меня просто довызывается конструктор, а в конце программы вызывается delete уже из main.
Так ведь можно?
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.10.2012, 11:25 #24
nexen, довызывается?
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
14.10.2012, 15:33  [ТС] #25
Цитата Сообщение от soon Посмотреть сообщение
nexen, довызывается?
Имеется ввиду, что :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
CLS::CLS()
{
/*абсолютное заполнение полей и, если нужно, выбрасывание exception-ов
 с отчисткой памяти конструктора и уже присовенных участков типа char *buffer = new char[x]...*/
if (Dialog() == PROCESS_FAILURE)
throw something;
else
{
printf("Something success");
}
// если success, то конструктор завершает свою работу с штатном режиме, а в \
main экземпляр выпиливается delete.
}
Добавлено через 3 часа 43 минуты
Не позволительно так? ;(
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.10.2012, 15:55 #26
nexen, можно.
1
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.10.2012, 17:16 #27
Лучше вызови вручную мтеод Dialog после создания объекта. Чем проще код, тем лучше.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
15.10.2012, 06:57  [ТС] #28
Цитата Сообщение от Deviaphan Посмотреть сообщение
Лучше вызови вручную мтеод Dialog после создания объекта. Чем проще код, тем лучше.
Это то понятно, что так можно, но, насколько я помню, стиль типа :
C++
1
2
3
4
5
int main ()
{
GAME game = new GAME();
return 0;
}
обычно и используется. Т.е только инициализируются новые экземпляры, где и происходит всё "буйство красок". Вот и хотелось сделать так же с двумя экземплярами.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.10.2012, 07:15 #29
Цитата Сообщение от nexen Посмотреть сообщение
GAME game = new GAME();
Либо ты перепутал с C#, либо у тебя утечка памяти будет.)
И ни в коем случае не используй вышеприведённый способ. Конструктор должен конструировать объект. ВСЁ! Не нужно впихивать в него невпихуемое!
Напиши
C++
1
2
GAME game;
game.Run();
и не мучай свой мозг.)
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
15.10.2012, 09:20  [ТС] #30
Deviaphan, ; ( Ну хорошо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 09:20
Привет! Вот еще темы с ответами:

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса? - C++
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе, (напр., получив такой базовый объект...

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами - C++
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

Вызов метода класса без создания экземпляра класса. - C++
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов. Я это делаю с помощью new - delete. Мне...

Создать экземпляр класса по ссылке экземпляра класса - C++
Есть класс для обработки клиентов // Абстрактный class ClientProcessing { }; Я создаю от него наследника class...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.10.2012, 09:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru