объявление производного класса в IF для использования вне

У меня есть следующий код, где я хочу объявить объект внутри инструкции IF. Я понимаю, что простое объявление внутри IF означает, что это выходит за рамки остальной части программы. Поэтому я думаю, что мне нужно использовать указатель.
Моя проблема в том, что классы, из которых я хочу выбрать пользователя, являются производными от базового класса. Поэтому я решил, что мне, вероятно, нужно создать указатель на основе этого базового класса … Это звучит примерно так?

Посмотрите ниже, что я пытаюсь сделать, я в правильном парке?

//create a stereo input object
StereoImage SO;
SO.open(File1,File2);

int StereoOption;

if (counter == 0) StereoOption = 1;

//think i need to create a pointer to the base class
SVAlgorithm *ptrSter;

//choose which method to use in stereo processing and set the base class pointer to derrived class
if (StereoOption == 1) {SVOpenCVBlockMatching DoStereo; cout << "Using option 1" << endl; *ptrSter = DoStereo;}
else if (StereoOption == 2) {SVOpenCVSemiGlobalBlockMatching DoStereo; cout << "Using option 2" << endl; *ptrSter = DoStereo;}
else if (StereoOption == 3) {SVNoMD DoStereo; cout << "Using option 3" << endl; *ptrSter = DoStereo;}
else if (StereoOption == 4) {SVCross DoStereo; cout << "Using option 4" << endl; *ptrSter = DoStereo;}
else if (StereoOption == 5) {SVAdaptDP DoStereo; cout << "Using option 5" << endl; *ptrSter = DoStereo;}

//set create DoStereo from the pointer
SVAlgorithm &DoStereo = *ptrSter;

//output matrix
Mat_<short> DispOut;

//load the disparity method params, compute it and show - works
DoStereo.loadParams();
DoStereo.compute(SO.getRawFrame(0),SO.getRawFrame(1),DispOut);
imshow("Disparity Map", DispOut*255);

Следующие классы все являются производными от класса SVAlgorithm …
SVOpenCVBlockMatching,
SVOpenCVSemiGlobalBlockMatching,
SVNoMD,
SVCross,
SVAdaptDP.

0

Решение

Нет, ваш код неверен. Указатель абсолютно не влияет на время жизни объекта.
Так что эта строка SVAlgorithm &DoStereo = *ptrSter; дает вам неопределенное поведение, потому что вы пытаетесь разыменовать указатель на уничтоженный объект.

Другая возможная проблема неинициализирована ptrSter а также StereoOption переменные. Похоже, здесь возможен случай, когда ptrSter не будет назначен с надлежащим объектом, и его разыменование также приведет к UB.

Вам нужно использовать динамическое хранилище с new заявление и сохранить результат в некотором указателе. Это настоятельно рекомендуется использовать умный указатель вместо сырья для этой цели, например std::auto_ptr для C ++ 03 или std::unique_ptr для C ++ 11.

Пример:

 std::unique_ptr<SVAlgorithm> ptrSter;

if (StereoOption == 1) { ptrSter.reset(new SVOpenCVBlockMatching()); }
else if (StereoOption == 2) { ptrSter.reset(new SVOpenCVSemiGlobalBlockMatching()); }
else if (StereoOption == 3) { ptrSter.reset(new SVNoMD()); }
else if (StereoOption == 4) { ptrSter.reset(new SVCross()); }
else if (StereoOption == 5) { ptrSter.reset(new SVAdaptDP()); }

if(!ptrSter)
{
assert(false);
return;
}

SVAlgorithm &DoStereo = *ptrSter;
1

Другие решения

Вы начинаете в правильном направлении с:

SVAlgorithm *ptrSter;

Но теперь вам нужно нечто вроде фабрики для создания одного из ваших экземпляров, поэтому вы должны сделать что-то вроде:

SVAlgorithm *ptrSter = SVFactory(StereoOption);

где SVFactory() инкапсулирует ваши операторы if следующим образом:

SVAlgorithm* SVFactory(int StereoOption){
if (StereoOption == 1) { return new SVOpenCVBlockMatching(); }
else if (StereoOption == 2) { return new SVOpenCVSemiGlobalBlockMatching();}
else if (StereoOption == 3) { return new SVNoMD();}
else if (StereoOption == 4) { return new SVCross();}
else if (StereoOption == 5) { return new SVAdaptDP();}
}

и позже:

delete ptrSter;
1