1

std のものと同様のカスタム マップ クラスを実装していますが、1 つの問題があります。

map<string, SomeObject*> container;
SomeObject* object = container["this doesn't exist"];

デバッガーオブジェクトでは0x0000000であるため、マップからの無効な値は常に null です。しかし、私のマップでは、無効な値は初期化されていないポインターのようなものです - 0xcdcdcdcdのような無効な値がありますが、リリースモードでは別のものなので、チェックすることはできません為に

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); があります。マップの初期化時に必要なものを確保する方法はありますか、またはPointerWrapper でnullptrに設定されたSomeObjectのポインターを含むカスタムPointerWrapperを作成する必要がありますか? std ヘッダーには膨大な量のマクロと typedef が含まれているため、何が起こっているのかを理解するのに苦労しました。

4

3 に答える 3

3

std::mapvalue は、内部で作成する新しい値を初期化します。スカラー型の場合、これは 0 に初期化されることを意味します。

于 2013-03-29T21:40:17.417 に答える
3

オブジェクトを明示的に構築すると、値(任意のタイプ)が初期化されます

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

クラスの場合、デフォルトのコンストラクターが明らかに呼び出されています。

ints やポインター ( など) などの組み込み型のSomeObject*場合、それらは (初期化されていないのではなく) ゼロで初期化されます。

したがって、= 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...
}
于 2013-03-29T21:41:25.077 に答える
2

std::map を使用すると、存在しないエントリを参照すると、エントリが作成され、その値が空に設定されます。値を null に設定することを意味するポインターの場合。

于 2013-03-29T21:40:29.803 に答える