今回は、あまり教える程理解できていないので、メモ的な意味で...
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 |
上記表はおいおい追記しようと思いますが、こんなのもあるよ!と思った方はこのページ下部よりコメント頂けると助かります。
よろしくお願い致します。
コメント