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 &DoStereo = *ptrSter;破棄されたオブジェクトへのポインターを逆参照しようとするため、この行では未定義の動作が発生します。

別の考えられる問題は、初期化さptrSterれていないStereoOption変数です。ptrSter適切なオブジェクトが割り当てられず、その逆参照が UB にもつながる可能性があります。

newステートメントで動的ストレージを使用し、結果を何らかのポインターに格納する必要があります。C++03 やC++11など、この目的のために、raw ではなくスマート ポインターを使用することを強くお勧めしますstd::auto_ptrstd::unique_ptr

例:

 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 に答える
1

あなたは正しい方向に始めています:

SVAlgorithm *ptrSter;

しかし、インスタンスの 1 つを作成するためにファクトリのようなものが必要になるため、次のようにする必要があります。

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 に答える