2006-02-27

C++/CLIによるインターフェイスクラスの使い方  [by miyachi]

以前に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++なんてものもあるんだが… 困ったもんですねえ(^^;

2006-02-27 12:56:15 - miyachi - [プログラミング] -

コメント一覧

コメント無し

コメントを書く

このアイテムは閲覧専用です。コメントの投稿、投票はできません。