Задумал я сделать класс-логгер на базе 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
{
...
};
но помоему лучше так не делать, опять же параметры в конструктор неудобно передавать...
как быть?