继承类上的C ++ OpenCV mouseCallback

时间:2017-07-06 16:25:34

标签: c++ opencv inheritance callback

考虑Base类和两个Child类:

class Base
{
public:
    ~Base() = default;

    virtual void mouseCallback() = 0; // this is overriden by the Childs!

    void mouseCallback2() { std::cout << "mouseCallback2 OK" << std::endl; }//Not overriden
};

class Child1 : public Base
{
public:
    ~Child1() = default;

    void mouseCallback() override;
};

class Child2 : public Base
{
public:
    ~Child2() = default;

    void mouseCallback() override;
};

实施地点:

void Child1::mouseCallback()
{
    std::cout << "Child 1 OK" << std::endl;
}

void Child2::mouseCallback()
{
    std::cout << "Child 2 OK" << std::endl;
}

我有CameraVision课程:

class CameraVision
{
public:
   // ...
   void init();
   static void callback(int event, int x, int y, int flags, void* userdata);
private:
   Base* mBase; // A pointer to the Base class!
}

其中包含init()方法,如下所示:

void CameraVision::init()
{
    mBase = new Child1();

    // Here I set the callback
    cv::setMouseCallback("Title", callback, &mBase);
}

因此当鼠标有一个事件我有这个时,overriden方法会崩溃我的应用程序。

void CameraVision::callback(int event, int x, int y, int flags, void* userdata)
{
    if (event == cv::EVENT_LBUTTONDOWN)
    {
        Base* tof = static_cast<Base*>(userdata);

        tof->mouseCallback2(); // THIS WORKS!

        // But this is what I need
        tof->mouseCallback(); // ERROR!!!!!!
    }

}

为什么我无法使用mouseCallback()继承Child1

我收到了error

Exception thrown at 0x000000013F391938 in Demo.exe: 0xC0000005: Access violation executing location 0x000000013F391938

我期待output

mouseCallback2 OK
Child 1 OK

1 个答案:

答案 0 :(得分:2)

mBase是Base *类型,然后您不需要简单地使用&amp; cv::setMouseCallback("Title", callback, mBase);

&amp; mBase将为您提供指向指针的指针,因此您的static_cast不会返回原始的mBase指针,但是它的地址。不确定第一个回调是如何工作的,都应该导致UB。