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

解決


Ag  2008-04-24 12:52:50  No: 68134

.NET2008です。

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

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

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

よろしくお願いします。


επιστημη  URL  2008-04-24 15:24:23  No: 68135

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


そだ  2008-04-24 16:49:52  No: 68136

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


そだ  2008-04-24 16:52:25  No: 68137

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


επιστημη  2008-04-24 17:58:43  No: 68138

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

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


Ag  2008-04-24 20:14:16  No: 68139

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

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

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


そだ  2008-04-24 20:26:37  No: 68140

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


そだ  2008-04-24 20:50:28  No: 68141

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


Ag  2008-04-24 22:29:05  No: 68142

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

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

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

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


επιστημη  2008-04-24 22:42:53  No: 68143

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

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


そだ  2008-04-25 01:12:33  No: 68144

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

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


rin  2008-04-25 10:22:29  No: 68145

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

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


Ag  2008-04-25 13:13:59  No: 68146

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

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

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


επιστημη  2008-04-25 14:29:52  No: 68147

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

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


そだ  2008-04-25 19:14:23  No: 68148

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


Ag  2008-04-25 21:38:26  No: 68149

επιστημη


Ag  2008-04-25 21:50:53  No: 68150

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

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

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

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


επιστημη  2008-04-25 22:00:10  No: 68151

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

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

> 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-26 00:59:44  No: 68152

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

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

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


PATIO  2008-04-26 01:02:34  No: 68153

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


PATIO  2008-04-26 01:03:27  No: 68154

あうあう。誤字

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

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


Ag  2008-04-26 01:12:01  No: 68155

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

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-26 01:20:03  No: 68156

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


επιστημη  2008-04-26 01:21:20  No: 68157

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

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


Ag  2008-04-26 01:42:45  No: 68158

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

単刀直入に、

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

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


επιστημη  2008-04-26 02:02:42  No: 68159

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-26 04:43:10  No: 68160

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

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

お世話になりました。


επιστημη  2008-04-26 06:51:35  No: 68161

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

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


yoh2  2008-04-26 07:17:04  No: 68162

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加