web-dev-qa-db-ja.com

オブジェクトをnullに設定することはできますか?

さらにコードで、オブジェクトがnull /空かどうかを確認します。

オブジェクトをnullに設定する方法はありますか?

36
John

クラスのオブジェクトをNULLに設定することはできません。ただし、ポインタ(オブジェクトのメモリアドレスを含む)をNULLに設定できます。

あなたが求めていることができないことの例:

Cat c;
c = NULL;//Compiling error

できることの例:

Cat c;
//Set p to hold the memory address of the object c
Cat *p = &c;
//Set p to hold NULL
p = NULL;
44
Brian R. Bondy

C++ではオブジェクトを「空/ヌル」にできないことは事実ですが、C++ 17では std::optional はその意図を表します。

使用例:

std::optional<int> v1;      // "empty" int
std::optional<int> v2(3);   // Not empty, "contains a 3"

次に、optionalに値が含まれているかどうかを確認できます。

v1.has_value(); // false

または

if(v2) {
    // You get here if v2 is not empty
}

ただし、プレーンint(または任意のタイプ)は、有用な意味で「null」または「empty」(これらの単語の定義により)になることはありません。のことを考える std::optionalこれに関するコンテナとして。

手元にC++ 17準拠のコンパイラがない場合は、代わりに boost.optional を使用できます。一部のC++ 17以前のコンパイラは、std::experimental::optional、少なくとも実際のstd::optional 私の知る限り。詳細については、コンパイラのマニュアルを確認してください。

9
Baum mit Augen

オブジェクトがNULL /空かどうかを確認します。 NULLと空であることは同じではありません。ジャスティンとブライアンがすでに言及したように、C++ではNULLは通常ポインターに関連付ける割り当てです。おそらくoperator =をオーバーロードできますが、実際にこれを実行したい場合は、十分に検討してください。その他のいくつか:

  1. C++では、NULLポインターは「空の」オブジェクトを指すポインターとは大きく異なります。
  2. オブジェクトの変数がデフォルト状態にリセットされた場合にtrueを返すbool IsEmpty()メソッドがないのはなぜですか? NULLの使用をバイパスする可能性があると思います。
  3. A* p = new A; ... p = NULL;は、コードがガベージコレクションされることを保証できない限り、悪い(delete pなし)です。どちらかといえば、これはメモリリークにつながり、そのようなリークがいくつかあると、コードが遅くなる可能性が高くなります。
  4. これを行うことができますclass Null {}; Null _NULL;その後、状況に応じて他のクラスのoperator =およびoperator!=をオーバーロードします。

おそらく、オプション4の改善に役立つように、コンテキストに関する詳細を投稿してください。

アルパン

4
Fanatic23

NULLはC++で単に0として定義されていますが、NULLへのポインターを設定できます。

myObject *foo = NULL;

また、標準ヘッダーを含める場合はNULLが定義されますが、言語自体には組み込まれないことに注意してください。 NULLが未定義の場合、代わりに0を使用するか、これを含めることができます。

#ifndef NULL
#define NULL 0
#endif

余談ですが、ポインタではなくオブジェクトをNULLに設定したい場合は、 Null Object Pattern について読むことができます。

3
Justin Ardini

どのタイプの「オブジェクト」?

NULL(およびnullptr)をポインタ型のオブジェクトに確実に割り当てることができます。NULLを算術型のオブジェクトに割り当てることができる場合は、実装定義です。

何らかのクラスタイプのオブジェクトを意味する場合、答えは[〜#〜] no [〜#〜]です(operator=がポインターまたは算術タイプを受け入れるクラスを除く)

多くのタイプにはコピーの割り当てとデフォルトの構築の両方があるため(多くの場合暗黙的に)、「空」がより妥当です。 既存のオブジェクトがデフォルトで構築されたものに似ているかどうかを確認するには、適切なbool operator==も必要です

0
Caleth