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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2015, 10:05   #11
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

new возвращает указатель на объект, если память выделилась. и если всё гуд вызывает конструктор. что бы он ещё проверял валидность объекта, нужно его переопределить, больше никак.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 02.08.2015, 10:13   #12
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

можно в виде кода, а то , в отличии от Делфи, С++ на слух не воспринимаю
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 02.08.2015, 10:21   #13
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
можно в виде кода, а то , в отличии от Делфи, С++ на слух не воспринимаю
Пост.
справочник
Код:
class Myclass
{
public:
        void* operator new(size_t);
        void operator delete(void*);
};
Код:
void* Myclass::operator new(size_t size)
{
    void *storage = malloc(size);
    if(NULL == storage) {
            throw "allocation fail : no free memory";
    }
    return storage;
}
Как пример определения, надеюсь вы поняли, что если проверив, что объект плохо создался нужно сделать free.. и вернуть NULL

ЗЫ: вы можете описать функцию getError у класса, и если он отличен от 0, то объект не создался успешно.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 02.08.2015 в 10:24.
Perchik71 вне форума Ответить с цитированием
Старый 02.08.2015, 10:44   #14
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Понятно, нужно "обернуть" конструктор в операторы. Буду пробовать =)

по поводу з.ы.
Я конечно не специалист в С++ и не шарю как смотрится с точки зрения гуру С++ во такой код:

Код:
class TIntellectDrawer
  {
     private:
        TDrawCircle * Circle;
     public:
        bool created;

     // конструктор
     TIntellectDrawer 
     {
        created = true;
        try
          Circle = new TDrawCircle;
        catch ()
        {
          Circle = 0;
          created =  false;
        }   
     }   

     ~TIntellectDrawer(void) 
     {
       created =  false;
     }   
   }

TIntellectDrawer drawer = new TIntellectDrawer;
if (!drawer->created) 
{
   ваш объект не создан
   drawer = 0;
}
в Паскале (Делфи) считается одним из подвидов говнокода
Не хочется начинать изучения с++ с этого диалекта
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 02.08.2015, 10:47   #15
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Ну я бы защитил эту переменную, что бы её не было возможности изменить и сделал бы функцию, которая только возвращает. Так безопаснее на мой взгляд.

ЗЫ: можно и не логическое хранить а и целое, например если вы хотите за этими цифрами спрятать текст.
Наапример: создать массив строк, а индекс ошибки - индекс в этом массиве (с вычитом -1, ибо с с++ массивы начинаются с 0 индекса)

З.Ы.Ы:
Если вобще продолжать тему з.ы. то можно сделать так...
Код:
static std::string MyClass::getErrorMsg() const
{
    if(nerror)
         return g_array_error_msg[nerror-1];
    else return "No Error";
}
Поскольку функция статик, то доступ к членам класса запрещён, но можно это исправить
Код:
static std::string MyClass::getErrorMsg(const MyClass* Self) const
{
    if(Self->getError())
         return g_array_error_msg[Self->getError() - 1];
    else return "No Error";
}
Тем самым функцию можно вызвать минуя создание класса,
Код:
MyClass::getErrorMsg(my_class);
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 02.08.2015 в 11:03.
Perchik71 вне форума Ответить с цитированием
Старый 02.08.2015, 11:40   #16
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Не надо делать delete this
Надо либо НЕ ловить там exception, либо перебросить его дальше.
Компилятор сам вызовет нужные деструкторы.

Вам первым же ответом указали как надо делать.
http://programmersforum.ru/showpost....68&postcount=2

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Как пример определения, надеюсь вы поняли, что если проверив, что объект плохо создался нужно сделать free.. и вернуть NULL
Ага, а еще надо будет в этом new угадывать *тип* объекта, который мы создаем, поскольку переопределив new для класс мы переопределяем его и для его *наследников*. Каждый из этих наследников тоже может выдать ошибки, которые будет отлавливать new.

Последний раз редактировалось Stilet; 02.08.2015 в 13:43.
waleri вне форума Ответить с цитированием
Старый 02.08.2015, 11:53   #17
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ага, а еще надо будет в этом new угадывать *тип* объекта, который мы создаем, поскольку переопределив new для класс мы переопределяем его и для его *наследников*. Каждый из этих наследников тоже может выдать ошибки, которые будет отлавливать new.
Ничего там угадывать не нужно, удаляем то что инициализировалось и освобождаем указатель... вы большой любитель усложнять.
ЗЫ тот пост ему поможет лишь с членами объекта а не с самим объектом.
человек спросил как сделать так, что бы new реагировал на конструктор.. ему сказали.

И Да, если вы не в курсе, тело функции остаётся не изменой, даже при наследовании, если наследник не изменил её... и то можно вызвать путём родитель::функция. и результат будет такой же, кк его и описали. Вообщем не усложняйте.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 02.08.2015 в 11:57.
Perchik71 вне форума Ответить с цитированием
Старый 02.08.2015, 12:10   #18
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Ничего там угадывать не нужно, удаляем то что инициализировалось и освобождаем указатель... вы большой любитель усложнять.
Т.е. вы предлагаете заменить механизм, встроенный в язык, своим костылем, который будет работать только для строго определенных условий и никак не будет предупреждать, если вы эти условия не соблюдаете и это я усложняю?!
waleri вне форума Ответить с цитированием
Старый 02.08.2015, 12:17   #19
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Т.е. вы предлагаете заменить механизм, встроенный в язык, своим костылем, который будет работать только для строго определенных условий и никак не будет предупреждать, если вы эти условия не соблюдаете и это я усложняю?!
Я предлагаю дополнить механизм new для конкретного класса, а не изменить его вовсе, тем более new возвращает ошибку только в одном случаи, если не удалось выделить память. А это мало, если требуется следить за инициализацией.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 02.08.2015, 14:01   #20
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Сделал вставку быдлокода с п.с. =)
Более сложные механизмы внутренней кухни С++ мне как то "не хотят" вклиниваться в черепушку. Ну не привык я заниматься байтодро...есвтом и изучениме таинсв устройства ОС и менеджера памяти в программах, которые предназначены совершенно для других целей. В Делфи это делает за меня разработчик среды.
Извините господа гуру, что я выбрал такой топорный метод
Код:
class TIntellectDrawer
  {
     private:
        bool valid;
        TDrawCircle * Circle;
     public:
       
     // конструктор
     TIntellectDrawer 
     {
        valid = true;
        try
          Circle = new TDrawCircle;
        catch ()
        {
          Circle = 0;
          valid =  false;
        }   
     }   

     ~TIntellectDrawer(void) 
     {
       valid =  false;
     }   
     
     bool assigned(){return valid;}

   }

TIntellectDrawer drawer = new TIntellectDrawer;
if (!drawer->assigned) 
{
   ваш объект не создан
   drawer = 0;
}
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить объект из реестра. foxes Общие вопросы Delphi 7 05.12.2013 13:31
как удалить в списке объект по ссылке the_deer_one C# (си шарп) 4 25.04.2012 06:34
как удалить объект во время выполнения программы на AS 2.0 ALKOrobot JavaScript, Ajax 0 11.07.2011 01:09
как удалить объект по указателю на его базовый класс? AndreyBS Общие вопросы C/C++ 5 17.04.2011 11:29
Объект одного класса в конструкторе другого Benderbej PHP 5 13.02.2011 22:48