時にC++だが、こいつはなんだかんだ言って愛されてる。
そんなわけで、Microsoftの.netでも使えるように考えてあるんですよね。
C++/CLI、CLIというのは共通言語基盤、手っ取り早く言えば.NET Frameworkのことだ。
これのメリットはメモリをマネージしてくれるということ。
メモリ破壊とかメモリリークとかは気にしなくても大丈夫。
ただ、C++を拡張させた言語で、一応C++ではない。
しかし、C++自体混沌としてるのに、C++/CLIはさらにひどい。
ただ、それでも価値はあると思うよ。C#でできることと同じ程度のことがC++/CLIはできるわけで。
その一方、C++同様に危険なことはできるまま。
普通は廃止されているC#とは違うところ。
まず、Hello worldを表示させるプログラムの1つ
int main(array<System::String ^> ^args)
{
System::String ^str;
str = "Hello world";
Console::WriteLine(str);
return 0;
}
まず、mainの引数はC#では、
static void main(string[] arg)
となっているとおりstringの配列でした。実はstringの配列であるのは一緒なのだけど、
array<System::String ^> ^argsという長ったらしい書き方になってます。
マネージされる配列はarray<型>の形で表すわけ。
それでさらに、C#で言えば参照型の変数なのは、C++/CLIではハンドルと呼ぶそうだ。
マネージされるやつのポインタらしい。まぁポインタみたいなものですわ。
ポインタ変数なら*をつけて宣言するけど、ハンドルは^をつけて宣言する。
だからStringクラスのポインタの配列のポインタということね。
それで残りも理解できるのでは。
System::StringはC#で言うSystem.Stringに相当する。名前空間とクラスの間は::で区切る。
で、C#で言うSystem.IO.StreamReaderはSystem::IO::StreamReaderと書く。
これはC++そのもの。
さて、こんなプログラム
namespace hidemaro{
ref class reader{
private:
System::IO::StreamReader^ sr;
public:
reader(System::String ^str){
sr = gcnew System::IO::StreamReader(str,System::Text::Encoding::UTF8);
}
System::String^ next(){
System::String^ str;
str = sr ->ReadLine();
return str;
}
property bool isEOF{
bool get(){
return sr->EndOfStream;
}
}
};
}
int main(array<System::String ^> ^args){
if(args->Length < 1){
System::Console::WriteLine("Error : Argument Error");
System::Environment::Exit(0);
}
hidemaro::reader^ myr = gcnew hidemaro::reader(args[0]);
while(!myr->isEOF)
System::Console::WriteLine(myr->next());
return 0;
}
長くなりすぎたか。
gcnewというのはマネージされるインスタンスを作成するのにつかうやつ。
そうじゃないやつはnewで作る。と区別してる。
->は構造体のポインタからメンバを参照するやつ。クラスでも同様らしい。
で、Cの構造体宣言のまねをしてるからかクラスの宣言の最後に;が付いている。
というのは少し不思議な風景。
まぁやってて思うんだが、C#がいかに.NET向きになっているかというのがよくわかるな。
C++/CLIでもかなり改善されたほうで、昔はC++マネージ拡張という扱いにくいものだったそうだ。
それをC++/CLIという新しい言語にしたからちょっと違うというところらしい。
^とかgcnewとか、C++にはなくてJavaやC#にあるpropertyを輸入してみたり。
そうそう、だから.NET Frameworkの下で動いてるんだよ。
CLI下で動かすためのプログラム言語というとC#・VB.NET・C++/CLIぐらいだろうか。
で、やっぱりC#が一番よい、ただどれも同じようなことができるようになってる。
まぁけどC++はよく知られているから、それにCLI的なことを覚えるだけなのは得なのか…
正直わからんけどね。