気分を変えて C++/CLI のTIPSです。
その1:ToString() のオーバーライド
ref class
や value struct
を定義すればC#でそのまま普通のクラス・構造体として使えますが、ListBoxなどに表示する際、ToString()
をオーバーライドしたくなりますよね。
この場合のオーバーライドのやり方が若干変わっています。
public ref class Hoge
{
public:
virtual System::String ^ToString() override
{
return gcnew System::String(_T("HOGEHOGE"));
}
};
このように、virtualとoverrideを指定すれば上手くオーバーライドできます。
もちろん、System::String^
型を返すようにします。
その2:比較演算子のオーバーライド
ref class
で比較演算子をオーバーライドする際、NULLチェックをやらないといけませんが、その際には nullptr
キーワードを使います。
nullptr
は C++/CLI のキーワードで、C# の null に相当するものです。C++ の NULL とは別物です。
public ref class Hoge
{
public:
System::String ^name;
static bool operator == (Hoge ^h1, Hoge ^h2)
{
//if (h1 == nullptr || h2 == nullptr) これだと無限ループ
if (!h1 || !h2)
{
return false;
}
return h1->name == h2->name;
}
};
operator ==()
の中でハンドルがNULLであるかどうかをチェックするときに、==
演算子を使うとStackOverflowするので、if 文の中で直接判定させればOKです。