以前に
C++でboost::shared_ptrを使ってインターフェイスクラスを書くと言う事を書いたが、今回はそれのC++/CLI版。C++/CLIでは新たに interface が導入されJavaライクなインターフェイスが定義できるようになっている。またC++/CLIのマネージコードではガベージコレクションされるので gcnew と生成すれば破棄は自動的に行われるのでboost::shared_ptrも不要だ。早速サンプル。
// インターフェイスクラス
interface class IName {
public:
virtual String ^ getName();
};
// 実装クラス
ref class Name : public IName {
public:
Name( const std::string name )
{
a_name = gcnew String( name.c_str() );
}
virtual String ^ getName()
{
return a_name;
}
private:
String ^ a_name;
};
// ファクトリー関数
IName ^ makeName( const std::string name )
{
IName ^ name_ptr = gcnew Name( name );
return name_ptr;
}
// 使い方
void printName()
{
std::string myname = "miyachi";
IName ^ name_ptr = makeName( myname );
Console::WriteLine( "Name = " + name_ptr->getName() + Environment::NewLine );
}
C++/CLIのマネージコードの世界ではStringを使う。内部はJavaと同じくユニコードになるので単純にcharポインタには変換できないので注意が必要。charポインタを使って初期化は出来る。
サンプルを見ると判るが、インターフェイスクラスにはinterfaceを付けて宣言をして、実装クラスにはrefを付けてマネージコードである事を宣言しておく。ただ細かくは実装クラスのメンバメソッドにもvirtualを付けなければいけなかったりする。
このサンプルを見るとC++/CLIと言うのはもう従来のネイティブなC++とは別物だと判る。コンソール出力もstd::coutだと.NETのStringが使え無いのでConsole::WriteLineを使わねばならない。
C#はマネージコードだけで済むなら便利だ、C++/CLIはネイティブコードとマネージコードの混在が可能なのが便利だ、ただしいずれにせよC++な世界とは言えないので移植性面では多大な問題があるだろう。C#やC++/CLIがどこまで広まるかが鍵となるが、.NET環境以外でこれらの言語を使えるようになるのだろうか?ちなみにMacOSの世界だとまた別言語となるObjective-C++なんてものもあるんだが… 困ったもんですねえ(^^;