【问题标题】:Scope of class member within conditional if条件 if 中类成员的范围
【发布时间】:2012-04-10 15:31:20
【问题描述】:

在 C++ 中,我创建了一个具有受保护(数据类型)成员和私有(函数)成员的类:

class Qt3DViewer : public QMainWindow
{
 ...
 protected:
    vtkImageData * imgC1;
 ...
 private:
    void ComputeSlices();
}

在类成员“ComputeSlices”的实现中,我使用条件if 来更新imgC1

void Qt3DViewer::ComputeObliqueSlices()
{
 ...
 if (someFlag==1)
     this->imgC1 = reader1->GetOutput();
 else
     this->imgC1 = reader2->GetOutput();

 ...
 // Code that requires this->imgC1 updated!
}

问题在于 imgC1 的更新仅在条件内有效,在 if 块更新超出范围并且 imgC1 成员真正更新后!

如何使用条件块更新imgC1并确保在块之后实际更新成员?

【问题讨论】:

  • 我绝不是 C++ 专家,所以我不确定是否将 imgC1 声明为受保护和 ComputeSlicesas 私有有什么事情要做。
  • 你的问题毫无意义。当然imgC1 正在更新,您在条件的两个分支中都为其分配了一个值。在条件之后,您可以使用imgC1 做任何您想做的事情。我不太明白这是什么问题。
  • if 块内部完成的代码更改应该反映在外部......你能举一个你所观察到的指针值的例子吗?
  • 你为什么不也显示Getoutput函数?
  • 在这种情况下,调试器是你的朋友!在if 所在的行上设置一个断点,然后单步执行看看会发生什么。如果结果出乎意料,则进入 getter 函数,看看那里发生了什么。

标签: c++ class scope


【解决方案1】:

您显示的代码是有效的,除非

reader1->GetOutput(); 

返回指向本地对象的指针,这将导致未定义的行为并可能显示您遇到的行为。

类似:

vtkImageData *GetOutput()
{
    vtkImageData obj;
    //....
    //....
    //....
    vtkImageData* ptr = &obj;
    //....
    //....
    //....
    return ptr;
}

请注意,无论其访问说明符如何,所有类成员都可以在该类的成员函数中访问。
因此,除非您的代码中潜伏着未定义的行为,否则this->imgC1 始终可以访问,并且应该按照您使用它的方式在成员函数中进行更新。

【讨论】:

  • 谢谢 Als,这实际上是问题所在,类成员 GetOutput() 正在返回一个指向本地对象的指针。我通过避免使用这种方法(在 VTK 中)规避了这个问题。再次感谢。
  • @msotaquira:很高兴我的心理调试是正确的 :) 但是,您应该解决问题而不是使用解决方法。函数 GetOutput() 有一个错误,应该修复它。它应该返回复制一个对象,或者它应该返回一个动态分配的对象,其所有权转移给调用者,所有者在完成工作后释放动态内存(通过调用delete)。
【解决方案2】:

可能是reader1->GetOutput()有问题,比如GetOutput()的某个局部对象在GetOutput()全部执行完后被释放

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2019-03-17
    • 2016-11-27
    • 2013-02-16
    • 1970-01-01
    • 2018-02-01
    • 2014-01-25
    • 1970-01-01
    相关资源
    最近更新 更多