VC++/CLIで関数を追加するには

解決


Ag  2008-04-24 03:52:50  No: 68134  IP: 192.*.*.*

.NET2008です。

CLIで、関数を追加するには、どうしたらいいのでしょうか。

たとえば、
int Hoge(int i)
というような、関数を追加したい場合です。

MFCの場合は、クラスビュー右クリックで、ポップアップメニューを開き、追加→関数の追加で、メンバ関数の追加ウイザードが開きますが、CLIの場合、同じようなウイザードは見当たらないようです。

よろしくお願いします。

編集 削除
επιστημη  URL  2008-04-24 06:24:23  No: 68135  IP: 192.*.*.*

エディタで直接打ち込めばいいやん。

編集 削除
そだ  2008-04-24 07:49:52  No: 68136  IP: 192.*.*.*

.NET 2005 にはあるけどなぁ〜
いらないけど。

編集 削除
そだ  2008-04-24 07:52:25  No: 68137  IP: 192.*.*.*

失礼 VC++ 2005 orz
.NET  は消えたんだった

編集 削除
επιστημη  2008-04-24 08:58:43  No: 68138  IP: 192.*.*.*

> MFCの場合は、クラスビュー右クリックで、ポップアップメニューを開き、
> 追加→関数の追加で、メンバ関数の追加ウイザードが開きますが、
> CLIの場合、同じようなウイザードは見当たらないようです。

Visual Studio 2008 Team System - Team Suite ではできますよ?
# 要らないけど

編集 削除
Ag  2008-04-24 11:14:16  No: 68139  IP: 192.*.*.*

Visual Studio 2008 Team System - Team Suite
で検索すると、マイクロソフトのダウンロードセンターがひっかかります。
でも、初心者なので、現時点では、.NET2008のWindowsフォームアプリケーションの範囲内で、理解したいと思うのですが。

また、手書きをするとしても、返り値をどうするのでしょうか。 

そもそも「要らない」という理由が分かりません。
特にメンバ関数など作らず、そのつど、シコシコッとコーディングするのでしょうか。

編集 削除
そだ  2008-04-24 11:26:37  No: 68140  IP: 192.*.*.*

COMのライブラリやイベントなどを作るならともかく、
一般のメンバ関数を作るのにわざわざ追加ウイザードを
使わないということです。
そのつどシコシコッとコーディングします。
返り値は自分で決めるのでウィーザードで設定しても
書いてもとどのつまり同じことです。

編集 削除
そだ  2008-04-24 11:50:28  No: 68141  IP: 192.*.*.*

イベントの話な気がしてきたので
こちらをどうぞ。
http://dobon.net/vb/dotnet/beginner/eventhandle.html

編集 削除
Ag  2008-04-24 13:29:05  No: 68142  IP: 192.*.*.*

そださん、ありがとうこざいます。

たいへんお手数なのですが、たとえば、Form1.h で、MFCの

int CaaaView::Hoge(int a, int b)
{
  return a+b;
}

に相当する関数を手書きする場合、コードはどのようになるのでしょうか。

編集 削除
επιστημη  2008-04-24 13:42:53  No: 68143  IP: 192.*.*.*

ref class Form1 : Form {
   ....
   int Hoge(int a, int b) { return a+b; }
   ...
};

なにがわからんのかさっぱりわからん...

編集 削除
そだ  2008-04-24 16:12:33  No: 68144  IP: 192.*.*.*

>int CaaaView::Hoge(int a, int b)
>{
>  return a+b;
>}
>に相当する関数を手書きする場合、コードはどのようになるのでしょうか。
そのまま書けばいいのでは・・・
もっともヘッダーに書くので上記のεπιστημηさんみたいな
書き方が妥当な気がしますが。

CLI以前にC++の問題な気がするな〜
イベントじゃないし、普通のメンバ関数だし
・・・orz

編集 削除
rin  2008-04-25 01:22:29  No: 68145  IP: 192.*.*.*

>また、手書きをするとしても、返り値をどうするのでしょうか。 
このあたりの言葉からして
これまでは、基礎を知らないまま
VSの入力支援機能に頼ってただけなのでは?


VS2005のVC++・CLRにはあった

編集 削除
Ag  2008-04-25 04:13:59  No: 68146  IP: 192.*.*.*

επιστημηさん、そださん、ありがとうございます。

要は、そのまま書けばいいんですね。
しかも、MFCなら別にヘッダファイルに宣言をする必要がありますが、それもいらない。

たいへん失礼いたしました。

編集 削除
επιστημη  2008-04-25 05:29:52  No: 68147  IP: 192.*.*.*

> しかも、MFCなら別にヘッダファイルに宣言をする必要がありますが、それもいらない。

ちがうよう。コレがヘッダなんだってばぁ。

編集 削除
そだ  2008-04-25 10:14:23  No: 68148  IP: 192.*.*.*

拡張子見てないのかなぁ
コントっぽくなってきた

編集 削除
Ag  2008-04-25 12:38:26  No: 68149  IP: 192.*.*.*

επιστημη

編集 削除
Ag  2008-04-25 12:50:53  No: 68150  IP: 192.*.*.*

すみません、手拍子で送信してしまいました。

> ちがうよう。コレがヘッダなんだってばぁ。

いえ、「そもそもヘッダファイルですね」とか、書こうと思ったのですが、突っ込まれそうな気がしたので、やめたのです。
でも、結局、突っ込まれました。

ただ、ヘッダファイルだとしても、改めて、宣言とか「ひな型」を書く必要はないんですね。
CLIは、省略できることが多く、なんだか拍子抜けします。

編集 削除
επιστημη  2008-04-25 13:00:10  No: 68151  IP: 192.*.*.*

> ただ、ヘッダファイルだとしても、改めて、宣言とか「ひな型」を書く必要はないんですね。

ヘッダファイルは宣言でありひな型ですけど。

> CLIは、省略できることが多く、なんだか拍子抜けします。

なんか噛み合わんなぁ。

--- Form1.h
ref class Form1 : Form {
   int Hoge(int a, int b) { return a+b; }
};

あるいは

--- Form1.h
ref class Form1 : Form {
   int Hoge(int a, int b);
};

--- Form1.cpp
int Form1::Hoge(int a, int b) { return a+b; }

です。書式としてはC++と同じです。

編集 削除
PATIO  2008-04-25 15:59:44  No: 68152  IP: 192.*.*.*

> CLIは、省略できることが多く、なんだか拍子抜けします。

επιστημηさんも書かれてますが、
C++でもおんなじ様なことは出来ますよ。
どうもC++の方も理解が足りない部分が有りそうな気がしますね。
あと、言語的に言うならC++/CLIが正式な名称だったはず。

言語的には別物ですけれど、文法的には殆ど同じだったと。
C++/CLIで追加された部分以外は殆どC++と同じなんでは無いかなぁ。

編集 削除
PATIO  2008-04-25 16:02:34  No: 68153  IP: 192.*.*.*

あと、統合開発環境(IDE)は確かに便利ですけれど、
頼りすぎない方がいいです。
そうで無いとIDEの調子が悪いと何も出来なくなってしまいます。
IDEは空くまでも手間を省く為の物であって必要な手間を
理解しないで良いと言うわけでは有りません。
逆にフルスクラッチで欠けるくらいの知識を持ってこそ
IDEのよさも生かせると思います。

編集 削除
PATIO  2008-04-25 16:03:27  No: 68154  IP: 192.*.*.*

あうあう。誤字

誤)
IDEは空くまでも手間を省く為の物であって必要な手間を

正)
IDEはあくまでも手間を省く為の物であって必要な手間を

編集 削除
Ag  2008-04-25 16:12:01  No: 68155  IP: 192.*.*.*

επιστημηさん、ありがとうございます。

Form1.h で

#pragma endregion

int Hoge(int a, int b) { return a+b; }

};
}

とすると、ビルドを通ります。

#pragma endregion

ref class Form1:Form {
   int Hoge(int a, int b) { return a+b; }
};

};
}

とすると、

'Form1' : 入れ子になっているクラスは、それを囲んでいるクラスと同じ名前を指定することはできません

というエラーになります。


#pragma endregion
};

ref class Form1:Form {
   int Hoge(int a, int b) { return a+b; }
};

}

や、

#pragma endregion
};
}

ref class Form1:Form {
   int Hoge(int a, int b) { return a+b; }
};

としても、エラーになります。

手もとの参考書では、ref class は、「参照クラス型」としていますが、それ以上の説明はありません。

編集 削除
あー  2008-04-25 16:20:03  No: 68156  IP: 192.*.*.*

あなたは絶対に素のC++の基礎から勉強する方が良い

編集 削除
επιστημη  2008-04-25 16:21:20  No: 68157  IP: 192.*.*.*

> 'Form1' : 入れ子になっているクラスは、それを囲んでいるクラスと同じ名前を指定することはできません
> というエラーになります。

当然そうなりますね。C++と同じです。

編集 削除
Ag  2008-04-25 16:42:45  No: 68158  IP: 192.*.*.*

επιστημηさん、ありがとうございます。

単刀直入に、

ref class Form1:Form {
   int Hoge(int a, int b) { return a+b; }
};


の置き場所はどこでしょうか。

編集 削除
επιστημη  2008-04-25 17:02:42  No: 68159  IP: 192.*.*.*

ref class Form1:Form {
   int Hoge(int a, int b) { return a+b; }
};

これをそのままどこかに置けるわけじゃありません。
Form1のメソッド int Hoge(int a, int b) の宣言部
は ref class Form1 : Form { ... }; のカッコ内、
実装部は Form1.cpp の Form1 が属するnamspace内に置きます。
# 宣言と同時に実装してもかまいません。

つまりC++と同じです。

編集 削除
Ag  2008-04-25 19:43:10  No: 68160  IP: 192.*.*.*

επιστημηさん、ありがとうございます。

Form1.cpp を使わない場合、どうするのかなぁ、と、思ったのですが、要は、クラスを作ればいいのですね。

お世話になりました。

編集 削除
επιστημη  2008-04-25 21:51:35  No: 68161  IP: 192.*.*.*

> 要は、クラスを作ればいいのですね。

たぶんわかってない。ヘッダ書いた時点でクラスはできてます。

編集 削除
yoh2  2008-04-25 22:17:04  No: 68162  IP: 192.*.*.*

既に指摘済ですが、C++でもやろうと思えば(まあ、あまりそんなこと思いませんが)
すべてヘッダで実装してしまえますし、C++/CLIでもヘッダと.cppファイルとに
分けて実装することもできます。

ヘッダと.cppを分けるか、ヘッダにすべて実装するかというのは、C++とC++/CLIの
違いではなく、Visual Studioのお行儀の問題。

http://www.atmarkit.co.jp/fdotnet/special/vcppinvista02/vcppinvista02_01.html
の、「●生成されたひな型コードの是非」参照。
# 本人を差し置いてリンク張っちゃいました。

編集 削除