Добрый день! Есть желание улучшить следующий кусок кода, но нет идей по поводу того, как это сделать:
class Baz;
// Базовый класс.
class Foo : public boost::noncopyable {
public:
typedef boost::shared_ptr<Foo> Ptr;
protected:
Baz *baz_;
Foo(Baz *baz) : baz_(baz) {}
virtual ~Foo() {}
friend void boost::checked_delete<>(Foo *);
};
// Наследник (один из множества классов).
class Bar : public Foo {
public:
// Единственный способ создать объект этого класса.
static Ptr create(Baz *baz)
{
return Ptr(new Bar(baz));
}
private:
Bar(Baz *baz) : Foo(baz) {}
// Скрываем деструктор чтобы нельзя было уничтожить объект вызывав явно
// delete[].
virtual ~Foo() {}
// Нужно для работы boost::shared_ptr<>.
friend void boost::checked_delete<>(Foo *);
};
Классов, подобный Bar достаточно много, поэтому хочется хоть как-то уменьшить количество кода, которое приходится писать руками...
Здравствуйте, syomin, Вы писали:
Типа того:
S>class Baz;
template<class T>
class Foo : public T {
public:
typedef boost::shared_ptr<Foo> Ptr;
// Единственный способ создать объект этого класса.
static Ptr create(Baz *baz)
{
return Ptr(new T(baz));
}
protected:
Baz *baz_;
Foo(Baz *baz) : baz_(baz) {}
virtual ~Foo() {}
friend void boost::checked_delete<>(Foo *);
};
// Наследник (один из множества классов).
class Bar_impl : public Baz {
...
};
typedef Foo<Bar_impl> Bar;
Кстати, базовый Baz не особо и нужен
Здравствуйте, s.ts, Вы писали:
ST>Здравствуйте, syomin, Вы писали:
ST>Типа того:
S>>ST>class Baz;
ST>template<class T>
ST>class Foo : public T {
ST>public:
ST> typedef boost::shared_ptr<Foo> Ptr;
ST> // Единственный способ создать объект этого класса.
ST> static Ptr create(Baz *baz)
ST> {
ST> return Ptr(new T(baz));
ST> }
ST>protected:
ST> Baz *baz_;
ST> Foo(Baz *baz) : baz_(baz) {}
ST> virtual ~Foo() {}
ST> friend void boost::checked_delete<>(Foo *);
ST>};
ST>// Наследник (один из множества классов).
ST>class Bar_impl : public Baz {
ST>...
ST>};
ST>typedef Foo<Bar_impl> Bar;
ST>
ST>Кстати, базовый Baz не особо и нужен
Ну там ещё горстка виртульных функций есть, просто они к теме не относятся :)
К сожалению, в предложенном вами случае можно сделать так:
Bar *bar;
delete (Bar_impl *) bar;