【C++/CLI】 nullチェック

今回は、あまり教える程理解できていないので、メモ的な意味で...

 

C言語ではメモリを確保したか?を確認するのにポインタがNULLかどうか確認しますが、C++では『^』で表されるハンドル型というC言語のポインタにも似た型が登場し、このハンドル型で示されるオブジェクトが確保されたのか?(gcnewされたのか?)を確認するのにはnullptrを用います。

 

(コード例)

System::Drawing::Graphics^ g;
if (g == nullptr) MessageBox::Show("gは未定義です");	//MessageBoxが表示される
g = CreateGraphics();
if (g == nullptr) MessageBox::Show("gは未定義です");	//MessageBoxが表示されない

しかし、System::Drawing::Colorクラスでは

System::Drawing::Color^ c;

とも

System::Drawing::Color c;

とも書けるのです。

 

このとき

System::Drawing::Color c;
if (c == nullptr) MessageBox::Show("cは未定義です");

と書くと

 

error C2446: ‘==’ : ‘nullptr’ 型から ‘System::Drawing::Color’ 型への変換ができません。
この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません。
error C2088: ‘==’ : class に対して正しくありません。

 

というエラーメッセージが表示され怒られてしまします。

 

正解は

System::Drawing::Color c;
if (c == System::Drawing::Color::Empty) MessageBox::Show("cは未定義です");

のように書きます。

 

そんなnullチェックをするのに、nullptrで比較してしまいそうなクラスをまとめておこうと思います。

System::Drawing::Colorクラス System::Drawing::Color::Empty
System::IntPtrクラス System::IntPtr::Zero

 

上記表はおいおい追記しようと思いますが、こんなのもあるよ!と思った方はこのページ下部よりコメント頂けると助かります。

よろしくお願い致します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください