У меня есть база с использованием std :: thread _threadcall в его деструкторе, но мне нужно инициализировать его из подкласса (представьте себе несколько подклассов, все по -разному инициализации _threadcall ).
class QueryBase
{
std::condition_variable _cv;
bool _run{ true };
std::thread _threadCall;
virtual ~QueryBase();
void virtual CallRunner()=0;
}
QueryBase::~QueryBase()
{
_run = false;
_cv.notify_one();
_threadCall.join();
}
< /code>
subclass: < /p>
class __declspec(dllexport) AsyncQuery: public QueryBase
{
protected:
MessageChangedCallback _log{};
public:
AsyncQuery(MessageChangedCallback fn);
void Add(const std::string& msg);
void CallRunner() override;
}
AsyncQuery::AsyncQuery(MessageChangedCallback fn)
: QueryBase(), _log(fn),
_threadCall([&] { CallRunner(); }) //E0292 _threadCall is a non-static member
// or base class of class AsyncQuery
{
}
< /code>
Могу ли я инициализировать его из конструктора подкласса или каким -то образом? Если нет, я обязан писать один и тот же DTOR в каждом отдельном подлассе? Подклассы: < /p>
class QueryBase
{
std::function f;
void virtual CallRunner()=0;
QueryBase::QueryBase() : _threadCall(f)
{
}
AsyncQuery::AsyncQuery(MessageChangedCallback fn)
: _log(fn)
{
f = [&] {CallRunner();};
}
, где callrunner () определяется (переопределяет чистый виртуальный) только в подклассах. Какие -нибудь плюсы/минусы об этом?
У меня есть база с использованием std :: thread _threadcall в его деструкторе, но мне нужно инициализировать его из подкласса (представьте себе несколько подклассов, все по -разному инициализации _threadcall ). [code]class QueryBase { std::condition_variable _cv; bool _run{ true }; std::thread _threadCall; virtual ~QueryBase(); void virtual CallRunner()=0; }
AsyncQuery::AsyncQuery(MessageChangedCallback fn) : QueryBase(), _log(fn), _threadCall([&] { CallRunner(); }) //E0292 _threadCall is a non-static member // or base class of class AsyncQuery { } < /code> Могу ли я инициализировать его из конструктора подкласса или каким -то образом? Если нет, я обязан писать один и тот же DTOR в каждом отдельном подлассе? Подклассы: < /p> class QueryBase { std::function f; void virtual CallRunner()=0;
QueryBase::QueryBase() : _threadCall(f) { }
AsyncQuery::AsyncQuery(MessageChangedCallback fn) : _log(fn) { f = [&] {CallRunner();}; } [/code] , где callrunner () определяется (переопределяет чистый виртуальный) только в подклассах. Какие -нибудь плюсы/минусы об этом?