2011-12-15 3 views
2

C++でどうすればよいのかは分かりません。 Objective-Cで、私は、C++のヌルポインタ値のテスト

if (myValue != [NSNull null]) { … } 

myValueは、(クラスメソッドによって返された)nullオブジェクトと比較され、そのオブジェクトが値を持っている場合、これは、素晴らしい作品このようにしてもゼロ、if文をオブジェクトを確認することができます返信true

そこで質問がNULLポインタ値を正しくテストする方法ですが、私はこのよう

if (myValue != NULL) 
{ 
    qDebug() << "It is not null"; 
} 

をしましたが、それは動作しません。

+0

myValueのタイプは何ですか?もっとコードを追加できますか? – crazyjul

+2

C++にはnullオブジェクトのようなものはありません。あなたは、しかし、nullポインタを持つことができます。 –

+0

ヌル可能なオブジェクト型が必要な場合は、Boost.Optionalもあります。 –

答えて

5

C++には、null値の概念はありません。ヌルポインタのみです。 NULLへのポインタではないものを比較することはできません。

+0

+1実際には、例えば、と比較して整数を比較することはできますが、しかしそれは意味をなさない。 –

+0

@AntonioPérez標準によれば、数値型を「NULL」と比較できます。しかし、ポインタ以外のものを比較すると誤解を招きます。また、コンパイラによっては警告が出されることがあります。 –

0

私が正しいとすれば、ヌルポインタをチェックしたいと思う。これは、C++で実際にC++でのポインタ

Foo *pInstanc = new Foo; 
if(pInstance) 
{ 
    //do something with pInstance 
} 
0

非常に簡単です、基本的にあなたがオブジェクトやデータが格納されているいくつかのメモリ位置にアドレスが含まれています。この場合、「NULLポインタ」は空のメモリアドレスにすぎません。これはゼロ値として表されます。

SomeClass *someClassPointer = // ... call some method to get pointer 

// Check for null pointer 
if (someClassPointer == 0) 
{ 
    // Pointer is null 
} 

これは、これを行うことによって単純化することができる:

if (someClassPointer) 
{ 
    // For checking that the pointer is not null 
} 

if (!someClassPointer) 
{ 
    // For checking that a pointer is null 
} 
+0

"空ポインタ"は空のメモリアドレスではありません。それはオブジェクトを指すことが保証されている非常に特別なアドレスです(C++の文脈では)。そして、必ずしもゼロ値として表現されるわけではありません(これは頻繁です)。保証されるのは、0に評価される整数定数式がポインタコンテキストでヌルポインタに変換されるということです。 –

+0

@JamesKanzeあなたが言うことは、古いCでは真実でした。これはもはやC++と標準Cでは正確ではありません。 Bjarne Stroustrup http://www2.research.att.com/~bs/bs_faq2.html#null – Offirmo

+0

@Offirmo私が言ったことは、C++ 98、C++ 03、C++ 11、C90、C99に当てはまります。そして、私が言ったこととは違うあなたが与えるリンクには何も見ません。 Bjarneは、単に「NULL」の代わりに「0」を使うことの好みについて議論しています(これは「値0の整数定数式」と評価するために定義する必要があります)。 –

0

短い答え:だから、それをチェックするために、あなたはこのような何かを書くと、それが依存しています。

長い答え:まず、参照(myValueの型がT &のようなもの)と比較することはできません。また、割り当てられたオブジェクト(myValueがTの場合のみ)をnullにすることはできません。これらの型は常に割り当てられ、nullではありません。 (あなたがあなたのスタックを台無しにしたり、他の悪いことをしない限り - あなたがより大きな問題を持つよりも、これらのケースをチェックしません)。

nullをチェックできる唯一のタイプはポインタです(myValueはT *タイプのものです)。これらのタイプの場合:

  • C++ 98を使用する場合は、0をチェックできます。通常、NULLはマクロ(#define NULL 0)です。
  • 新しいC++ 11を使用している場合は、新しいnullptrキーワードがあります。これは、これに対してチェックする必要があります。

0はfalseと評価されますので、通常のブールのようにポインタを使用することもできます。 nullptrはnullptr_t型で、演算子bool()が実装されているので、boolを使うようにすることもできます。

一般的には、nullptrの欠如はエラーの原因です。したがって、C++ 11を使用できる場合、常にnullptrを使用してください。NULLまたは0を使用しないでくださいポインタと比較する - メソッドがオーバーレイされている場合、コンパイラはポインタ型ではなくint型のパラメータを持つメソッドを使用するため、問題に遭遇します。あなたは今、おそらくあなたが望むものではないものを(最初の関数が呼び出されます

foo(NULL); 

を呼び出す場合はC++ 11でそう

void foo(int a); 

void foo(void *); 

:。

のは、次の2つの機能を持っていると仮定しましょう次のように記述します。あなたが持っているでしょう

foo(nullptr); 

C++ 98におけるながら書くこと:

foo((void *)0); 

これは、C++ 98より前にnullがないことが大きな問題であった理由の1つです。あなたはObjective-Cのよりも似た何かを持っているしたい場合は、(C++ 98のために)次の関数を書くことができます:

template<typename T> 
inline bool isNull(const T *obj) { 
    return obj == ((const T *) 0); 
} 

// to use it: 
if (isNull(myType)) { //myType is a pointer to something 
    // some code 
} 

私は1つが、実際に使用されているのを見たことがないが。

この回答がC++での概念の理解に役立つことを願っています。

+0

C++ 90では、常に「NULL」と比較できます。マクロはNULLポインタ定数に評価されることが保証されます。 –

関連する問題