2013-03-29 33 views
1

我實施類似於從STD中的一個自定義地圖類,但是我有一個problem.In他們的地圖,當你(例如)做:std :: map如何確保所有指針都爲空?

map<string, SomeObject*> container; 
SomeObject* object = container["this doesn't exist"]; 
在調試對象

0x0000000從地圖,使無效值總是null.However,在我的地圖值無效像初始化指針 - 他們有像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(); 

我有一個布爾的containsKey(關鍵字類型鍵);功能,但它涉及for循環。是否有某種方法來確保我想要在映射的初始化時間,還是我必須進行定製PointerWrapper將包含指針SomeObject設置到nullptrPointerWrapper的構造函數?我很難搞清楚std頭文件中發生了什麼,它們有大量的宏和typedefs。

+2

std :: map <>'_value-initializes_它的值 - 請參閱[這個問題/答案](http://stackoverflow.com/q/9025792/636019)的標準。 – ildjarn

+5

檢查密鑰的典型方法是map :: find(key)!= map :: end,而不是檢查默認值。 http://stackoverflow.com/questions/2333728/stdmap-default-value有一個很好的解決你的問題。 – IdeaHat

回答

3

你的價值觀(任何類型)將被初始化,默認的構造函數明顯被調用。

對於內置類型,如int和指針(如SomeObject*),他們將是零初始化(而不是未初始化)

所以,whileyou可以在您的具體指針例如使用= NULL,語法類似這樣的意志做正確的事所有類型

template < typename Key, typename Value > 
void MyMap<Key, Value> add_new_key(const Key &k) 
{ 
    std::pair<Key, Value>(k, Value()); 
//        ^^ Either calls constructor or zero-initializes 

    // Store the data as you wish... 
} 
3

std::map值初始化它在內部創建的任何新值。在標量類型的情況下,這意味着它們被初始化爲0.

2

使用std :: map引用不存在的條目時創建一個並將其值設置爲空。對於一個指針,意味着將該值設置爲null;如果你明確構建對象

SomeObject* object = SomeObject*(); 
//        ^^ Explicit construction 

對於類