Вопрос по использованию умных указателей
От: syomin  
Дата: 25.01.08 11:54
Оценка:
Добрый день! Есть желание улучшить следующий кусок кода, но нет идей по поводу того, как это сделать:
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 достаточно много, поэтому хочется хоть как-то уменьшить количество кода, которое приходится писать руками...
Re: Вопрос по использованию умных указателей
От: s.ts  
Дата: 25.01.08 13:43
Оценка:
Здравствуйте, 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 не особо и нужен
Re[2]: Вопрос по использованию умных указателей
От: syomin  
Дата: 25.01.08 15:09
Оценка:
Здравствуйте, 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.