C++/CLIのオーバーライドなど

このエントリーをはてなブックマーク
Share

気分を変えて 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です。

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.