2

他の変数のような値で C++ を初期化することは可能std::queueですか?NULL

このような:

HANDLE variable = NULL; 

class Test
{
}

すなわち

std::queue<Test*> testQueue = NULL;

また

testQueue.empty();

またはそのようなもの?

4

4 に答える 4

8

これを書くと:

std::queue<Test*> testQueue; //it is default initialized

それで十分です。ポインターにして NULL で初期化する必要はありません。

また、これを行うことができます:

if ( testQueue.empty()) 
{
    //testQueue is empty
}
于 2012-04-16T05:55:49.367 に答える
2

キューへのポインターを使用する場合は、確実にそれをヌル ポインターに初期化できます (ただし、可能であればそれを避けたいと思うでしょう)。

単純にキューを定義すると、それが空かどうかをテストできます (提案したように.empty())。

于 2012-04-16T05:56:23.367 に答える
2

質問に直接答えるには、null ポインターで初期化しません。デフォルトでは、キューは空であり、それをテストします(他の回答で示唆されているように)。しかし、ここには、それよりも少し深い根本的な問題があると思います。それは、ポインターの観点から考えすぎていることです。

コンテナを使用しているため、std::queue<Object *>. 代わりに、std::queue<Object>可能な場合は a を使用することをお勧めします (ポインターではなくオブジェクトを保存します)。オブジェクトが有効な状態にないことを示す null 値を使用するのではなく、コンストラクターで値を初期化するだけで (すべてのオブジェクトが有効な状態になります)、その後、すべてのオブジェクトstd::queueが有効になります。C++ では、オブジェクトの使用方法は次のように設定する必要があります。

  1. オブジェクトのコレクションを処理する必要がある場合は、スタック上またはコンテナー (できれば STL コンテナー) にオブジェクトを直接作成します。
  2. 参照 (たとえば、オブジェクトを関数に渡し、コピーを避けたいが、ここでは参照は を介し​​て作成されたオブジェクトを参照する場合1)
  3. スマート ポインター (これは、コードに表示される唯一の時間である必要がありnewます)。これらは慎重に使用し、オブジェクトの作成が機能しないことを確認した場合にのみ使用する必要があります1
  4. 通常のポインター。これはほとんど使用しないでください。私のプロジェクトのほとんどでは、生のポインターは使用しません。残りの部分では、それらを一種のキャッシング メカニズムとしてのみ使用します。この場合、長い計算によって操作対象のオブジェクトが決定され、null ポインターはまだ決定されていないことを意味します。ただし、「プライマリ」ハンドルがポインターであるオブジェクトはまだ作成していません。ポインターは、 で作成したオブジェクトを指しています1

コンテナーに何を格納するかを決定するときは、上記にも従う必要があります (最初にオブジェクトのコレクション、次に参照、次にスマート ポインター、最後に生のポインターを優先します)。

ポインターは、ほとんどの変数がヒープ上 (または C++ の用語ではフリー ストアから) に作成される Java では一般的であり、STL、参照、およびスマート ポインターが存在しない C ではやや一般的です。しかし、それらは現代の C++ ではあまり使われません。

于 2012-04-16T06:18:50.123 に答える
1

キューは、コンストラクタを持つ C++ オブジェクトです。デフォルト値に初期化する必要はありません。常に空のキューとして開始されます。.empty()空かどうかをチェックするだけです。.clear()必要に応じてその内容を削除しますが、新しく構築されたものでは、これは必要ありません。

于 2012-04-16T05:59:46.637 に答える