我有以下代码,我想在 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... SVOpenCV block 匹配, SVOpenCVSemiGlobalBlockMatching, SVNoMD, SV交叉, 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;
关于c++ - 在 IF 中声明派生类以供外部使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12341769/