Active object
От: Abyx Россия  
Дата: 31.05.11 16:29
Оценка:
Задумал я сделать класс-логгер на базе Active оbject'а, но столкнулся с проблемой удаления этой замечательной конструкции.

Допустим Active оbject выглядит так
class ActiveObject
{
public:
    ~ActiveObject()
    {
        post([this]{ terminated = true; });
        thread->join();
    }
...
};

А логгер от него наследуется
class Log : ActiveObject
{
public:
    ~Log()
    {
        post([this]{
            stream << "log closed";
            stream.close();
        });
    }

private:
    ofstream stream;
};

всё бы хорошо, но сначала вызовется ~Log, потом удалится stream, потом вызовется ~ActiveObject с thread->join();
а надо бы чтобы сначала был вызван thread->join(), а потом уже удалялся stream.

Можно сделать так
class ActiveObject
{
public:
    ~ActiveObject() { if(!terminated ) stop; }
protected:
    void stop()
    {
        post([this]{ terminated = true; });
        thread->join();
    }
.......

class Log : ActiveObject
{
public:
    ~Log()
    {
        stop();
    }

но вручную вызывать код деструктора базового класса это как-то некрасиво, и не очень-то надежно

можно сделать ActiveObject шаблонным
template<template<class> class Base>
class ActiveObject : public Base<ActiveObject<Base>>
{
    ...
};

template<class ActiveObject>
class Log
{
  ...
};

но помоему лучше так не делать, опять же параметры в конструктор неудобно передавать...

как быть?
In Zen We Trust
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.