Я программирование конечного автомата с использованием государственного образца взята отсюда:Где я должен позвонить delete в этом случае?
и я реализовал его здесь:
ссылаясь на то, что я сделал себе представить, у вас есть это ситуация:
//MAIN MACHINE
class machine{
public:
void handle(){
_state->handle();
}
void setStatePtr(AbstrState *state){
_state = state;
}
private:
AbstrState* _state;
};
//BASE STATE
class AbstrState {
public:
AbstrState(machine* m){
_context = m;
}
virtual void handle() = 0;
protected:
machine *_context;
};
//ACTUAL STATES
class ONState : AbstrState{
public:
ONState(machine *m) : AbstrState(m) {}
void handle(){
if(BUTTON_PRESSED){
_context->setStatePtr(new OFFState(_context));
}
}
};
class OFFState : AbstrState{
public:
OFFState(machine *m) : AbstrState(m) {}
void handle(){
if(BUTTON_PRESSED){
_context->setStatePtr(new ONState(_context));
}
}
};
Станок является инициативой ialized with setStatePtr(new OFFState(&machine))
Этот вопрос возникает здесь: поскольку я использую новый оператор, я должен вызвать delete где-нибудь, а где? Я попытался выполнить функцию setStatePtr:
void setStatePtr(.. s){
delete _state;
_state = s;
}
но это не сработает.
Я не определяю никакого указателя p * = new p(); поэтому я не знаю, где можно вызвать любое удаление. Мой вопрос более точный, поэтому, пожалуйста, не предлагайте другую реализацию или обычаи, потому что у меня все еще будут те же сомнения :)
Когда я делаю foo (что-то новое), где я могу назвать delete?
Спасибо заранее,
Andrea
Используйте умные указатели. 'std :: shared_ptr' приходит на ум. –
@ Cheersandhth.-Alf - вот ответ. Может быть, опубликовать его как один? – hoodaticus
'std :: unique_ptr' вызовет удаление в нужном месте. –