0

我有以下代码,我想在 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。

4

2 回答 2

1

您从正确的方向开始:

SVAlgorithm *ptrSter;

但是现在您需要像工厂这样的东西来创建您的实例之一,所以您应该执行以下操作:

SVAlgorithm *ptrSter = SVFactory(StereoOption);

whereSVFactory()封装你的 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;
于 2012-09-09T18:39:21.713 回答
1

不,你的代码是错误的。指针对对象的生命周期绝对没有影响。所以这一行SVAlgorithm &DoStereo = *ptrSter;给了你未定义的行为,因为你试图取消引用指向被破坏对象的指针。

另一个可能的问题是未初始化ptrSterStereoOption变量。看起来这里是可能的情况,当ptrSter不会分配适当的对象并且它的取消引用也会导致 UB。

您需要使用带有new语句的动态存储并将结果存储在某个指针中。为此,强烈建议使用智能指针而不是原始指针,例如C ++ 03std::auto_ptrC std::unique_ptr++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;
于 2012-09-09T18:43:28.263 回答