【发布时间】:2018-04-25 02:25:15
【问题描述】:
自从我开始使用std::map 以来,每当我点击按钮时,我都会收到断言错误。我想清除my_map里面的所有内容,然后每次点击按钮重新开始添加。
my.cpp
typedef std::map<str, MyClass> mapper;
mapper my_map;
void add_map(const str& name, MyClass* l) { /...../ }
void invoke_me()
{
这里我用my_map的大小初始化变量i,但是它返回之前的大小,然后才被清除
int i = my_map.size(); // i = 4, my_map.size() = 1
if (!my_map.empty())
{
for (const auto& it : map)
{
// Assert error: map/set iterator not incrementable
const MyClass& l = it.second;
l.on_clicked();
}
}
}
// cont'd
这应该可以很好地清除my_map,但我认为它做得不对
void clear_map()
{
my_map.clear();
}
implementor.h
struct MyClass
{
std::function<void()> on_clicked;
};
implementor.cpp
MyClass button;
button.on_clicked = [&] {
clear_map();
add_map("MyButton", &button);
};
其实on_click是一个回调,它必须通过invoke_me函数调用
main.cpp
while (RUNNING)
invoke_me();
我会说这是因为地图大小不正确,这就是为什么即使它超出范围,它也会继续循环,或者我可能已经损坏或弄乱了该地图。
【问题讨论】:
-
您的意思是
for (const auto& it : my_map)?您无需在 for 循环之前检查地图是否为空。真实代码的简短完整示例将大大帮助我们帮助您。有几个常见错误可能会导致您看到的相同症状,但仅凭片段很难判断。 -
它返回之前被清除之前的大小 这是不可能的。请提供minimal reproducible example。
-
我将
my_map设为全局变量而不是成员类变量,因为我不希望它被重置。 -
这里使用的指针和实例也存在奇怪的不匹配。如果您的地图存储实例,那么您可能制作了您传递指针的对象的副本。 耸耸肩编辑并没有真正增加任何清晰度。
-
button在用于on_clicked之前是否可能超出范围?您通过引用进行捕获,然后在将其添加到地图时对其进行复制。