Используя placement new
, вы можете повторно вызвать конструктор:
bool foo::recheck()
{
new (&midiIn) ofxMidiIn();
midiIn.listPorts();
}
Строка new (&midiIn) ofxMidiIn()
восстановит midiIn
в своей области памяти, вызвав конструктор ofxMidiIn
.Однако этот подход создаст проблему, если ofxMidiIn
имеет указатель (и), и вы выделили память для них в предыдущем объекте.У тебя будет утечка памяти.Вы можете явно вызвать деструктор, написав:
(&midiIn)->~ofxMidiIn(); //call the destructor explicitly
new (&midiIn) ofxMidiIn(); //then do this!
Демо: http://ideone.com/OaUtw
В любом случае, я считаю, что лучшим и чистым решением было бы создание переменнойкак указатель как:
ofxMidiIn *midiIn;
А затем используйте new
и delete
.А когда вы делаете new
в следующий раз, необходимо удалить предыдущий объект, написав:
bool foo::recheck()
{
delete midiIn; //must do this if it already has been allocated memory!
midiIn = new ofxMidiIn();
midiIn->listPorts();
}