Я ищу элегантное решение для своего дела. Я попытался найти шаблон дизайна, который указал и предлагает решение для этого случая, но я не смог его найти.Должен вызывать первый шаблон дизайна
У меня есть базовый класс, который использует для хранения общего объекта, а затем вызывает его. Я хочу, выполнение будет разделен на две части:
- А должны иметь часть, которая всегда будет иметь место (do1st()).
- Пользовательский код (do2nd()).
Например:
class InvokeBase
{
public:
InvokeBase(void *ptr) : context_(ptr) {}
virtual ~InvokeBase() {}
void operator()() = 0;
protected:
void do1st() {//Mandatory code to execute for every InvokeBase type when calling operator()};
void * context_;
};
class InvokeDerived : public InvokeBase
{
public:
InvokeDerived(void *ptr) : base(ptr){}
virtual ~InvokeDerived();
void do2nd() {//User defined code}
void operator()()
{
do1st(); // << How to force this execution?
do2nd();
}
};
void main()
{
InvokeBase *t = new InvokeDerived();
t(); // << here i want the execution order will be do1st and then do2nd.
}
Хитрость заключается в том, что я хочу do1st будет выполняться всегда, что я не должен вызывать его из InvokeDerived. Я хочу разрешить пользователю наследовать от InvokeBase с гарантией, что do1st всегда будет вызываться при вызове оператора().
[Шаблон Метод шаблон] (HTTP: //en.wikipedia.org/wiki/Template_method_pattern) –
'void * context' - это C-решение. В C++ у нас есть несколько лучших решений. В этом случае решением будет просто удалить «context», поскольку он не используется. Также непонятно, почему 'InvokeBase' будет содержать контекст, так как кажется более логичным хранить контекст в' InvokeDerived'. – MSalters