c++ - 在 IF 中声明派生类以供外部使用

标签 c++ class scope derived-class base-class

我有以下代码,我想在 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; 给你未定义的行为,因为你试图取消引用指向被销毁对象的指针。

另一个可能的问题是未初始化的 ptrSterStereoOption 变量。看起来这是可能的情况,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/

相关文章:

c++ - 模板类不同的返回类型取决于类参数

html - 我的 Css 类不适用于我的 html 文件

c++ - 最终类的嵌套类是否自动最终?

java - 何时在匿名类中创建方法

python - 嵌套列表理解范围

c++ - 如何从类创建节点?

c++ - 使用 g++ 4.9.0 打包扩展失败,但适用于 clang++ 3.4

php - 关于 PHP 范围的问题——从 Java 程序员的角度

c++ - bool 变量。检查的逻辑

javascript - 执行上下文困惑