gpt4 book ai didi

C++11。 Lambdas成员变量捕获,STL列表中的 "this"指针陷阱

转载 作者:太空狗 更新时间:2023-10-29 20:40:06 24 4
gpt4 key购买 nike

我有一个带有简单按钮的简单事件系统。该系统由 std::function 列表驱动,内部分配了 lambda。

这是完整的按钮类:

class Button {

private:

Square square;
Text label;
bool hovered = false;
std::function <void ()> on_mouse_enter;
std::function <void ()> on_mouse_leave;

public:

Button (const Square& SQUARE, const Text& LABEL):
square {SQUARE},
label {LABEL}
{
on_mouse_enter = [this] () {
square.set_color(1, 1, 1);
};

on_mouse_leave = [this] () {
square.set_color(0, 0, 0);
};
}

std::function <void (const Render&)> get_rendering() {
return [this] (const Render& RENDER) {
RENDER.draw(square);
RENDER.draw(label);
};
}

std::function <void (const Point&)> get_updating() {
return [this] (const Point& CURSOR) {
if (not hovered) {
if (is_including(square, CURSOR)) {
hovered = true;
if (on_mouse_enter)
on_mouse_enter();
}
} else
if (not is_including(square, CURSOR)) {
hovered = false;
if (on_mouse_leave)
on_mouse_leave();
}
};
}

};

然后我将这样的按钮添加到事件管理器中,如下所示:

Button button {/*SOME_PARAMS_HERE*/};

mngr.push_to_render(button.get_render());
mngr.push_to_updater(button.get_updater());

它运行完美,没有问题,on_mouse_enteron_mouse_leave 按预期运行。

但是如果我用 STL 容器包装器做一些事情,就像这样:

std::list <Button> sb;

sb.emplace_back(Button {/*SOME_PARAMS_HERE*/});

mngr.push_to_render(sb.back().get_render());
mngr.push_to_updater(sb.back().get_updater());

整个事情都分崩离析了。 on_mouse_enteron_mouse_leave 未按预期工作。

通过输出调试消息,我可以看到在 on_mouse_enteron_mouse_leave 中由 this 访问的方 block 不是它们应该的方 block ,接下来我看到不是它应该的样子。

这种捕获有什么问题,如何解决?

最佳答案

如果您要被复制,请不要捕获this。无论您捕获什么,您都负责管理其生命周期。

其次,传递给进入/离开按钮的指针很有意义。

std::function<void(Button*)> on_mouse_enter;
std::function<void(Button*)> on_mouse_leave;

然后我们有:

    on_mouse_enter = [] (Button* but) {
but->square.set_color(1, 1, 1);
};

on_mouse_leave = [] (Button* but) {
but->square.set_color(0, 0, 0);
};

并且复制构造函数不再为您留下指向不同 this 的指针。

最后,当您调用 on_mouse_enter 时,传递 this

关于C++11。 Lambdas成员变量捕获,STL列表中的 "this"指针陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25466376/

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