gpt4 book ai didi

继承类上的 C++ OpenCV mouseCallback

转载 作者:行者123 更新时间:2023-11-28 01:46:17 28 4
gpt4 key购买 nike

考虑 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);
}

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

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!!!!!!
}

}

为什么我不能通过 Child1 的继承来使用 mouseCallback()

我遇到了一个错误:

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

我期待着输出:

mouseCallback2 OK
Child 1 OK

最佳答案

mBase是Base*类型,那么就不用&了,简单cv::setMouseCallback("标题", callback, mBase);

&mBase 会给你一个指向指针的指针,所以你的 static_cast 不会给你原来的 mBase 指针,而是它的地址。不确定第一个回调是如何工作的,两者都应该导致 UB。

关于继承类上的 C++ OpenCV mouseCallback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44954349/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com