Вы не можете просто объявить другую переменную с тем же именем на том же уровне области видимости, даже после вызова деструктора. Деструктор не не удаляет старое имя из области.
Чтобы решить вашу проблему, я бы предложил просто добавить новые уровни области, поскольку кажется, что вы используете только state::State_Machine
на несколько строк в любой момент времени.
{ state::State_Machine state_machine_test_off;
state_machine_test_off.change_state(States::LOADED);
EXPECT_EQ(States::LOADED,state_machine_test_off.get_state()); }
{ state::State_Machine state_machine_test_off;
state_machine_test_off.change_state(States::INITIALISED);
EXPECT_NE(States::INITIALISED,state_machine_test_off.get_state()); }
Если вы все еще хотите явно вызывать деструктор, вы должны убедиться, что безопасно, чтобы деструктор вызывался несколько раз на одном и том же объекте (вы сказал, что вы не можете изменить существующий код, поэтому либо это будет работать, либо не будет). На практике я был бы удивлен, если бы это работало хорошо, так как большинство деструкторов предполагают, что объект будет уничтожен, и не будут тратить время на то, чтобы пометить его как разрушенный (это может потребовать дополнительного состояния и определенно потребует циклов) .
Если вы по-прежнему настроены, несмотря на сложность и риски, вы можете написать что-то вроде этого:
state_machine_test_off.~State_Machine(); //Destructor to iniciate again the process
new (&state_machine_test_off) state::State_Machine;
Это использует размещение new
, что совершенно не нужно, если вы просто используете сфера правильно (см. выше). Вы также должны рассмотреть, что произойдет, если конструктор потерпит неудачу, тем более что вам все еще потребуется обработать уже удаленный объект с повторным вызовом его деструктора.