Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с классами

13K
03 ноября 2006 года
AlexU
6 / / 16.12.2005
Возникла небольшая проблемка, прошу кто сможет помочь.
И так, приступим.
Задача: есть два класса
class CLASS_1
{
public:
CLASS_1(){};
~CLASS_1(){};
};

class CLASS_2
{
private:
CLASS_1 *MyClass;
public:
CLASS_2(){MyClass = new CLASS_1();}
~CLASS_2(){delete CLASS_1};
};

и основная программа
main()
{
CLASS_2 *mainclass;

mainclass = new CLASS_2();
}

и теперь собственно суть задачи: при создании второго класса (new CLASS_2) вызывается его конструктор, в котором создается первый класс, и независимо от результата new CLASS_1(), второй класс в основной программе создастся и вернет свой указатель, как сделать так, чтобы если первый класс не создан, второй класс тоже не создавался, возвращал NULL и память для него не выделялась.
8.8K
03 ноября 2006 года
The_Ice
109 / / 04.04.2006
во-первых непонятно, почему первый класс не сможет создаться? у тебя что оперативы не хватает?
во-вторых - можешь так:
class CLASS_2
{
private:
CLASS_1 *MyClass;
public:
CLASS_2(){};
void* init(){
MyClass = new CLASS_1();
if(!MyClass)
{
delete this;
return 0;
}else
return this;
};
~CLASS_2(){if(MyClass)
delete MyClass;};
};
int main()
{
CLASS_2 *mainclass;

mainclass = new CLASS_2();
mainclass=(CLASS_2*)mainclass->init();
return 0;
}
но на счет стопудовости - не отвечаю, потому что не могу себе представить ситуацию, когда MyClass = new CLASS_1(); будет равно нулю... :)
и обрати внимание на деконструктор CLASS_2 - там должно быть delete MyClass, а не CLASS_1
1.8K
03 ноября 2006 года
k3Eahn
365 / / 19.12.2005
[quote=AlexU] как сделать так, чтобы если первый класс не создан, второй класс тоже не создавался, возвращал NULL и память для него не выделялась.[/quote]

Что-то подобное на форуме уже обсуждалось. Думаю, тебе надо копать в сторону фабричного метода.
3
03 ноября 2006 года
Green
4.8K / / 20.01.2000
УЖАС!!!! (помечен красным):
[QUOTE=The_Ice]
Код:
class CLASS_2
{
private:
    CLASS_1 *MyClass;

public:
    CLASS_2(){};

    [color=red]void*[/color] init(){
    MyClass = new CLASS_1();
    if(!MyClass)
    {
        [color=red]delete this;[/color]
        return 0;
    }else
        return this;
    };

    ~CLASS_2(){
        if(MyClass)
        delete MyClass;};
};
int main()
{
    CLASS_2 *mainclass;

    mainclass = new CLASS_2();
    [color=red]mainclass=(CLASS_2*)mainclass->init();[/color]
    return 0;
}

[/QUOTE]
Никогда, никогда, так не делай!

А вот человек дело говорит:
[QUOTE=k3Eahn]
Что-то подобное на форуме уже обсуждалось. Думаю, тебе надо копать в сторону фабричного метода.
[/QUOTE]
309
04 ноября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=AlexU]при создании второго класса (new CLASS_2) вызывается его конструктор, в котором создается первый класс, и независимо от результата new CLASS_1(), второй класс в основной программе создастся и вернет свой указатель, как сделать так, чтобы если первый класс не создан, второй класс тоже не создавался, возвращал NULL и память для него не выделялась.[/QUOTE]
new не может создать объект в двух случаях: ошибка выделения памяти или ошибка выполнения конструктора. В обоих случаях произойдёт генерация исключительной ситуации.
О том, как именно будет происходить освобождение выделенной памяти, на форуме уже писали. Но в данном случае можно посоветовать одно - не заморачиваться ;)
7.0K
04 ноября 2006 года
pink master
79 / / 21.10.2006
2Green
[QUOTE=Green]УЖАС!!!! (помечен красным):

Никогда, никогда, так не делай!
[/QUOTE]
это плохо? а почему?
3
05 ноября 2006 года
Green
4.8K / / 20.01.2000
1) void* - теряется информация о типе;
2) delete this; - уничтожает объект, при этом все внешние ссылки становятся невалидными, но никто им этого не сообщил;
3) mainclass=(CLASS_2*)mainclass->init(); - сама по себе запись выглядит бессмысленной со стороны пользователя класса. Похоже на место,где возникает memoryleak.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог