История изменений
Исправление
nanoolinux,
(текущая версия)
:
Ещё один. И они ещё удивляются, почему спп такой не стабильный и кривой.
class Some
{
Resource1 *r1;
Resource2 *r2;
Resource3 *r3;
public:
Some(int ident);
~Some();
};
Some::Some(int ident)
{
unique_ptr <Resource1> _r1(new Resource1(ident));
unique_ptr <Resource2> _r2(new Resource2(ident));
unique_ptr <Resource3> _r3(new Resource3(_r2.get())); //<- this way works as well
r1 = _r1.release();
r2 = _r2.release();
r3 = _r3.release();
}
Some::~Some()
{
delete r1;
delete r2;
delete r3;
}
Но можно ещё лучше (я так и делаю обычно)
class Some2
{
unique_ptr <Resource1> r1;
unique_ptr <Resource2> r2;
unique_ptr <Resource3, function <void (*)(Rousrce3 *)> > r3; //custom deinit
public:
Some2(int ident);
}
Some2::Some2(int ident)
:r1(new Resource1(ident)),
r2(new Resource2(ident)),
r3(new Resource3(r2.get()), [] (Resource3 *r) {r->any_deinit_must_be_done_before_delete();})
{
if (!r1->do_some_tricky_and_return_true()) {
throw Some2Exception("r1 tricky failed");
}
}
Исходная версия
nanoolinux,
:
Ещё один. И они ещё удивляются, почему спп такой не стабильный и кривой.
class Some
{
Resource1 *r1;
Resource2 *r2;
Resource3 *r3;
public:
Some(int ident);
~Some();
};
Some::Some(int ident)
{
unique_ptr <Resource1> _r1(new Resource1(ident));
unique_ptr <Resource2> _r2(new Resource2(ident));
unique_ptr <Resource3> _r3(new Resource3(_r2.get())); //<- this way works as well
r1 = _r1.release();
r2 = _r2.release();
r3 = _r3.release();
}
Some::~Some()
{
delete r1;
delete r2;
delete r3;
}
Но можно ещё лучше (я так и делаю обычно)
class Some2
{
unique_ptr <Resource1> r1;
unique_ptr <Resource2> r2;
unique_ptr <Resource3, function <void (*)(Rousrce3 *)> > r3; //custom deinit
public:
Some2(int ident);
}
Some2::Some2(int ident)
:r1(new Resource1(ident)),
r2(new Resource2(ident)),
r3(new Resource3(r2.get()), [] (Resource3 *r) {r->any_deinit_must_be_done_before_delete();})
{}