2007/06/27(水)リフレクション

リフレクションを利用したオブジェクトの複製の例.
実行時にオブジェクトのメタデータからコンストラクタを取得しています.

using namespace System;

class hoge;
class huga: public hoge;
class piyo: public hoge;

int main()
{
  hoge ^obj;
  hoge ^obj2;

  Type ^type;
  ConstructorInfo^ constructorInfoObj;

  obj = gcnew huga();
  type = obj->GetType(); // 型情報(メタデータ)の取得
  constructorInfoObj = type->GetConstructor(System::Type::EmptyTypes); // 引数無しのコンストラクタの取得
  obj = (hoge^)constructorInfoObj->Invoke(nullptr); // 引数無しでコンストラクタを呼び出す

  // ここで obj は huga のオブジェクトになってる

  obj = gcnew piyo();
  type = obj->GetType(); // 型情報(メタデータ)の取得
  constructorInfoObj = type->GetConstructor(System::Type::EmptyTypes); // 引数無しのコンストラクタの取得
  obj = (hoge^)constructorInfoObj->Invoke(nullptr); // 引数無しでコンストラクタを呼び出す

  // ここで obj は piyo のオブジェクトになってる

  return 0;
}

2007/06/02(土)3日

プログラムを作り始めて早3日.
.NETの方言にも少しずつ慣れてきました.

で,思ったこと.
以前のシンプルだったC言語はどこへ行った...

良きに計らいすぎ

なにがどうなっているのやらさっぱり.関数呼び出しなのか,変数への代入なのか.
確かにプロパティは便利なんだけど,ゲッター,セッターを定義する場合,プロパティ名とは別に変数が必要になるし.プロパティ名と同名の変数が使えれば管理が楽なのに.

文法も機能も複雑化.

ガベージコレクションを使うために以前は__gcで修飾してたけど,2005から(?)は^とか%とかrefとかいろいろ増えた.

ヘッダ至上主義?

実行ファイルの最適化の為なのか,ヘッダファイルでほとんど済ませてしまう.
cppファイルはヘッダファイルをコンパイルする為のものに成り下がってます.

増えた機能は使わなくてもプログラムは書けるのでCLIを意識しなければいいんだろうけど,それだとwindowsプログラムが書けなくなる.
個人的には純粋なC++程度が一番使いやすかった.独自拡張で機能を増やすのもいいけれど,そのせいで覚えにくくなるのも困る.

以前はC言語覚えれば他の言語に応用できると言ってたけど,オブジェクト指向の流行を考えると素直にJavaやっておいたほうがいいかもしれませんね.

2007/05/31(木)VC独自仕様?

^とかいう修飾子が増えてました.
ガベージコレクションできちんと追跡できるようになったポインタのようです.

VS 2005 EEドキュメント中の"C++ Language Reference"に説明が載っていますが,これって.NETの独自拡張ですよね?
CLR用,というかメモリ管理のための拡張が意外と多そうです.
勝手にメモリを解放してもらえるのは楽だけど,仕様がいろいろ追加されていて追いかけるのが大変.

メモ

1: ref class myclass {
2:     int i;
3: };
4: int main(void){
5:     myclass ^obj = gcnew myclass();
6:     int %ti = obj->i;
7:     ti = 100;
8:     return 0;
9: }

1:マネージ型としてクラスを定義
 こうしておくと,マネージドヒープ上にクラスを構築できる.
5:マネージ型はnewではなく,gcnewを使う
 受け取るポインタ側も*ではなく,^を使う
6:マネージドヒープ上の値を参照する場合,&ではなく,%になる

従来のC++で書くとこんな感じ.
メモリ削除をガベージコレクションに任せずに自分で削除する必要がある.

1: class myclass {
2:     int i;
3: };
4: int main(void){
5:     myclass *obj = new myclass();
6:     int &ti = obj->i;
7:     ti = 100;
8:     delete obj;
9:     return 0;
10: }

2007/05/31(木).NET

いつまでのVC6を使ってるのもなんなので,VC++ 2005 EEを使ってみることにしました.
で,最初に思ったこと.

何したらいいの?(汗)

結構,というか,根本的に変わってますね.
今までWindows APIとかMFCでプログラムを組んでいたので,.NETのメソッドは全然わからない.一応,GUIはある程度さわっていたので仕組みは分かるのですが,目的のメソッドがどこにあるのか分かりません.
MSDN ライブラリを参考に作り始めてはみたものの,プログラムを書く時間より,メソッドを探している時間の方が圧倒的に長くなってます.

VS2005 アカデミックなら5000円で買えるので買ってしまおうかな.
って,アカデミックライセンスって大学出ると使えなくなってしまうのかな?
それだと意味無いので無難にStandardのUpgradeのほうがいいのか.