. Сеть уже идет System.ComponentModel.BackgroundWorker
класс конкретно для справлений с работающими фоновыми задачами и связывающийся с GUI. Используйте его.
Нет, нет простого ответа. :-( Я думаю, что почти каждый эксперт по объектно-ориентированным объектам говорит «предпочитают композицию наследованию», будет языковая поддержка, которая сделает композицию намного проще, чем наследование.
Я не говорю, что это хорошо (просто то, что пришло в голову).
Но вы можете поэкспериментировать с перегрузкой оператора ->
#include <memory>
#include <iostream>
class X
{
public:
void plop()
{
std::cout << "Plop\n";
}
};
class PimplX
{
public:
PimplX()
{
pimpl.reset(new X);
}
X* operator->()
{
return pimpl.get();
}
private:
PimplX(PimplX const&);
PimplX& operator=(PimplX const&);
std::auto_ptr<X> pimpl;
};
int main()
{
PimplX x;
x->plop();
}
Один из вариантов - использовать вместо этого интерфейсный класс:
class ClassA {
virtual void foo() = 0;
static ClassA *create();
};
// in ClassA.cpp
class ImplA : public ClassA {
/* ... */
};
ClassA *ClassA::create() {
return new ImplA();
}
Однако это увеличивает накладные расходы на выборку указателей функций vtable.
Кроме этого, я не могу придумать ничего подобного орудие труда. Как вы сказали, синтаксический анализ C ++ - нетривиальная задача, и существуют другие языки, где это менее проблематично (например, C # или Java связывают все с задержкой, так что вы можете позже без проблем изменить их расположение в памяти).