为什么访问前向声明的类的数据成员会给我造成读取访问冲突?

时间:2019-04-25 11:30:32

标签: c++

我有两个类,在第一个类“ DrawGraphics”中,我试图从已预先声明为“ MainComponent”的类中访问成员变量。但是,这导致读取访问冲突。

这是错误消息:

teacher = TeacherSalary.objects.get(id=id).name

我正在使用JUCE框架,异常发生在这里:

Unhandled exception thrown: read access violation.
std::_Unique_ptr_base<juce::Slider::Pimpl,std::default_delete<juce::Slider::Pimpl> >::_Myptr(...) returned 0xFFFFFFFFFFFFFFFF.

您在下面看到的内容仅占实际代码的20%,但我将尝试仅包含每个文件的相关部分,以免使您陷入可疑的编写代码中。

DrawGraphics.h

    _NODISCARD pointer operator->() const _NOEXCEPT
        {   // return pointer to class object
        return (this->_Myptr()); // <-- this is the exception breakpoint
        }

DrawGraphics.cpp

class MainComponent;

class DrawGraphics : public Component
{
public :

void clock();

private:

    MainComponent* mainComponent;
};

MainComponent.h

#include "DrawGraphics.h"
#include "MainComponent.h"

void DrawGraphics::clock()
{

    double sliderOutput = mainComponent->ampSlider.getValue();

    // THIS ^ CAUSES THE ERROR

    DBG("Slider output is : " << sliderOutput);

}

MainComponent.cpp

class MainComponent : public Component,
                      public Slider::Listener
{
public:
    Slider ampSlider;
    void sliderValueChanged(Slider* slider) override;

private:
    DrawGraphics drawGraphics;
};

我希望能够简单地访问ampSlider产生的数据流。如果我未能包含与问题实际相关的部分代码,请提前道歉。

...

编辑: 好的,所以我的问题是我没有初始化mainComponent。我通过改变来做到这一点 在DrawGraphics.h中从void MainComponent::sliderDragStarted(Slider* slider) { if (slider == &ampSlider) { drawGraphics.clock(); } } MainComponent* mainComponent;

然后在DrawGraphics.cpp中,通过在DrawGraphics :: clock()的开头简单地添加MainComponent* mainComponent{};来创建mainComponent对象。

似乎在尝试获取ampSlider的值时,我指的是一个空的单元化对象。

感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

MainComponent似乎未初始化,请更改为:

MainComponent* mainComponent{};

然后,在使用前,请检查是否为空:

if (!mainComponent) {
  return;
}
//do stuff with mainComponent

应该解决问题。