【发布时间】:2017-01-03 05:18:46
【问题描述】:
我正在尝试创建一个将其实例存储在地图中的类,如下所示:
class Apple {
public:
static Apple* getApple(const std::string &name) {
auto it = allApples.find(name);
if (it == allApples.end()) // if this apple doesnt exist, make a new one
return new Apple(name);
else // if the apple exists, return its pointer
return it->second;
}
private:
static std::unordered_map<std::string, Apple*> allApples =
std::unordered_map<std::string, Apple*>();
Apple(const std::string &name) {
// create an apple
allApples.insert({ name, this });
}
}
现在,我创建了存储静态 Apple 的类,如下所示:
class Orange {
static Apple *myOrangeApple;
}
myOrangeApple = Apple::getApple("orange");
当我运行程序时,它在 getApple() 方法的第一行崩溃,出现向量下标超出范围错误。我试过环顾四周,但我真的找不到任何处理地图和超出范围错误的解决方案。从我所做的一些研究中,我最好的猜测是它与静态订单初始化有关,但我真的不太确定。
【问题讨论】:
-
第一行你的意思是
auto it = allApples.find(name);?我没有看到与std::vector或下标运算符相关的任何内容。 -
@songyuanyao,是的,那一行是抛出调试断言/异常的那一行(在发布版本中)。我也没有看到任何与矢量相关的东西,这就是我如此困惑的原因。
-
你能给我们足够的代码以便我们编译它并复制问题吗?
-
@DavidSchwartz,这就是它的全部......除了那个函数和构造函数之外,我从来没有访问过
allApples映射 -
那么编写
main函数并确认它复制了问题应该没有问题。请这样做。
标签: c++ stl unordered-map