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;
}
Работа с классами
И так, приступим.
Задача: есть два класса
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 и память для него не выделялась.
во-вторых - можешь так:
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
Что-то подобное на форуме уже обсуждалось. Думаю, тебе надо копать в сторону фабричного метода.
[QUOTE=The_Ice]
Код:
[/QUOTE]
Никогда, никогда, так не делай!
А вот человек дело говорит:
[QUOTE=k3Eahn]
Что-то подобное на форуме уже обсуждалось. Думаю, тебе надо копать в сторону фабричного метода.
[/QUOTE]
new не может создать объект в двух случаях: ошибка выделения памяти или ошибка выполнения конструктора. В обоих случаях произойдёт генерация исключительной ситуации.
О том, как именно будет происходить освобождение выделенной памяти, на форуме уже писали. Но в данном случае можно посоветовать одно - не заморачиваться ;)
[QUOTE=Green]УЖАС!!!! (помечен красным):
Никогда, никогда, так не делай!
[/QUOTE]
это плохо? а почему?
2) delete this; - уничтожает объект, при этом все внешние ссылки становятся невалидными, но никто им этого не сообщил;
3) mainclass=(CLASS_2*)mainclass->init(); - сама по себе запись выглядит бессмысленной со стороны пользователя класса. Похоже на место,где возникает memoryleak.