【发布时间】:2013-03-29 21:37:38
【问题描述】:
我正在实现一个类似于 std 的自定义地图类,但是我有一个问题。在他们的地图中,当你这样做时(例如):
map<string, SomeObject*> container;
SomeObject* object = container["this doesn't exist"];
在调试器对象中是 0x0000000,因此映射中的无效值始终为 null。但是,在我的映射中,无效值就像未初始化的指针 - 它们具有无效值,例如 0xcdcdcdcd,但是在 Release 模式下它是另外一回事,所以我不能依赖检查
if(object == 0xcdcdcdcd)
所以我希望能够做到这一点:
MyMap<string, SomeObject*> container;
SomeObject* object = container["this doesn't exist"]; //and for this to definetely be nullptr
这样我就可以了
if(object == nullptr)
DoSomething();
我有一个 bool ContainsKey(KeyType key); 函数,但它涉及一个 for 循环。有什么方法可以确保我在地图初始化时想要什么,或者我有制作一个自定义的 PointerWrapper,它将包含 SomeObject 的指针,该指针在 PointerWrapper 的构造函数中设置为 nullptr ?我很难弄清楚 std 标头中发生了什么,它们有大量的宏和 typedef。
【问题讨论】:
-
std::map<>value-initializes 其值 - 参见 this question/answer 了解标准。 -
检查键的典型方法是 map::find(key)!=map::end,而不是检查默认值。 stackoverflow.com/questions/2333728/stdmap-default-value 可以很好地解决您的问题。