У меня есть следующий код, где я хочу объявить объект внутри инструкции 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.
Нет, ваш код неверен. Указатель абсолютно не влияет на время жизни объекта.
Так что эта строка 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;
Вы начинаете в правильном направлении с:
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;