1 名前:デフォルトの名無しさん mailto:sage [2008/07/16(水) 22:39:18 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.56【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1215278693/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
207 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:07:15 ] ローカル変数とは定義された順にスタックに積まれるのですか?
208 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:42 ] >>206 obj2.pはobj1.pと同じだから落ちて当たり前。 何がしたいのか分からないけど、ポインタにNULLポインタを入れておけば それがdeleteされても問題なく動く。
209 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:13:50 ] >>206 > delete時にチェックする方法はあるんでしょうか? 参照カウンタをどこかに持つとか。
210 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:18:20 ] あー、参照カウンタにしても、けっきょくコピーコンストラクタをオー バーライドしなきゃいけないか。
211 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:25:16 ] >>208 どこでNULLをセットすればいいですか? >>209 なるべく簡単な方法がいいんですよね catchしちゃえばいいのかな このアドレスは使っちゃ駄目みたいなのは カーネルに聞けば教えてくれるのかなと思ったんですが
212 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 10:33:33 ] >>206 あくまでチェックしたいってことなら、方法は無い。 ヌルをセットするとかして、とにかく落ちないようにするなら auto_ptr でも使っとくのが簡単。 #include <memory> #include <string> using std::string; using std::auto_ptr; class test { auto_ptr<string> p; public: test() : p(new string) {} }; int main() { test obj1; test obj2 = obj1; }
213 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 11:37:38 ] >>207 規格ではスタックが使われるのかすら決まってなかった気がする
214 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 12:39:32 ] >>211 string*ではなくstringをメンバに持たせる
215 名前:デフォルトの名無しさん [2008/07/23(水) 16:25:27 ] class hoge{ private: int fuga; public: void setfuga(int a){ fuga = a; } int getfuga(){ return fuga; } }; class foo{ private: std::vector<hoge> var; public: void sethoge(hoge hage){ var.push_back(hage); } std::vector<hoge> getvar(){ return var; } }; int main(){ foo foo0; hoge hoge0; hoge0.setfuga(1); foo0.sethoge(hoge0); std::vector<hoge>::iterator itr; itr = foo0.getvar().begin(); std::cout << foo0.getvar().at(0).getfuga() << std::endl; std::cout << (*itr).getfuga(); return 0; } これを実行すると、一つ目のcoutは正常に出力(1)されますが、二つ目はでたらめな値が出ます。 itr = foo0.getvar().begin()はfoo0.getvar().at(0)を指すiteratorだと思うので、同じ結果になると 思っているのですが…。どなたかお教えいただけると助かります。
216 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 16:35:26 ] >itr = foo0.getvar().begin(); getvarの戻り値はfoo0.varそのものではなくfoo0.varの一時的なコピーで、次の文に移る前には破棄される getvarはfoo0.varのコピーを返すのではなくfoo0.varへの参照を返す必要がある
217 名前:デフォルトの名無しさん [2008/07/23(水) 16:38:55 ] >>216 その通りでした。ちょうど思いついたところでした。 すみません、どうもありがとうございます。
218 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:39:07 ] HOGEという構造体がtypedefされているとします。 HOGE *hoge;と宣言します。 void function(HOGE *hoge){ }という関数に function(hoge)と渡すと参照渡しになってますか?
219 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:42:42 ] >>218 それはC++でいうところの参照ではありません
220 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:44:26 ] アドレス私ですか?
221 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:46:44 ] ?
222 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 20:47:38 ] アドレス渡しですか?の間違いです
223 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:01:10 ] 「自分宛のレスですか?」という意味だと勘違いしたのは、 俺だけじゃないはず。
224 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:33:45 ] foo(HOGE fuga){ } bar(HOGE* pFuga){ } baz(HOGE& fuga){ } func() { HOGE hoge; HOGE *pHoge; // 値渡し foo(hoge); // ポインタ渡し(アドレス渡し) bar(pHoge); // 参照渡し baz(hoge); }
225 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:40:34 ] foo(HOGE fuga) foo(HOGE &fuga) HOGE hoge; foo(hoge); この場合どっちが優先されますか?
226 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:43:00 ] >>225 自分でコンパイルしてみては?
227 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:40 ] 自分で試してください。 俺は試しました。VC++2005EE XXX.cpp(19) : error C2668: 'foo' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) XXX.cpp(11): 'void foo(HOGE &)' の可能性があります。 XXX.cpp(7): または 'void foo(HOGE)' 引数リスト '(HOGE)' を一致させようとしているとき
228 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:44:44 ] もし環境依存だったら自分で試しただけでは分からないし
229 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 21:50:02 ] それは試してうまくいった後に質問すべきこと。
230 名前:デフォルトの名無しさん [2008/07/23(水) 22:08:24 ] g++でプリコンパイル済みヘッダが使えないって聞いたんだが、 stdafx.hみたいに一つのヘッダファイルでSTLやboostとかのヘッダ 全部読み込むのはやめたほうがいい?
231 名前:デフォルトの名無しさん mailto:sage [2008/07/23(水) 22:44:37 ] いつのg++の話?
232 名前:デフォルトの名無しさん [2008/07/23(水) 23:54:09 ] >>224 225は自分じゃないです。 ポインタ渡しした場合はbar関数の中で値を書き換えても、元には影響ないんですか?
233 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:03:05 ] >>232 ポインタを引数に指定しないとだめか、そうでないかの違いで、影響あることには変わりないよ
234 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:10:51 ] 225は違う人だったのか… ポインタ渡しは影響する 参照渡しも影響する 値渡しだけは影響しない
235 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:21:32 ] クラスは参照型なのでゴニョゴニョ
236 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 00:23:12 ] >>232 bar(HOGE* pFuga){ *pFuga = ...; //影響する pFuga = ...; //影響しない }
237 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 02:02:44 ] >>230 そういう理由もあるだろうし、依存関係は最小限にしたほうがいいと思うよ。 g++ でもプリコンパイル済みヘッダ自体は使えたような気がする。使い方が 全然違ったはずだけど。
238 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 09:04:36 ] >>235 嘘をつくな
239 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:36:21 ] あれ? クラスもコピーコンストラクタ呼ばれて値渡しされるよね?
240 名前:デフォルトの名無しさん [2008/07/24(木) 13:39:58 ] コピーコンストラクタ呼ばれて値渡しされるし、逆にコピーコンストラクタが定義されていないと コンパイルできないはず
241 名前:240 [2008/07/24(木) 13:42:25 ] 値渡しの話だよね?
242 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:43:59 ] コピーコンストラクタがなければ勝手に丸ごとコピーします。 でないと、struct A a, b; a = b;というC由来のコードがコンパイルできなくなってしまう。
243 名前:240 [2008/07/24(木) 13:44:40 ] あ、そっか、そうだね、失礼
244 名前:240 [2008/07/24(木) 13:47:05 ] あ、よくがんがえたら、クラスのメンバーに、コピーコンストラクタが定義されていないオブジェクトが含まれている時と 勘違いしてた。 自分がよくコンパイルエラー出すもんで。。w
245 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:52:09 ] 実際 中間インスタンス生成+コピーコンストラクタ呼んだ後は 参照でわたしてる? 呼び出し元のインスタンスには影響を与えないけど、スタックに実体を積んでいるわけではない みたいな構造
246 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 13:53:44 ] それぞれ想定している状況が違っている悪寒。
247 名前:デフォルトの名無しさん [2008/07/24(木) 13:55:27 ] VC2008 VC6 BCC MinGW でboostいれたいんですけど バイナリ配布しているVC2008しか成功しません 1.35のそれぞれのバイナリ置いてある所無いですか?
248 名前:デフォルトの名無しさん [2008/07/24(木) 14:17:41 ] www.boost.org/development/tests/release-1_35_0/developer/summary.html boostてdrwinとvc7以上で主に動くんですね borlandはかなり駄目ですね
249 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 14:39:09 ] darwinってmacのことだぞ
250 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 19:59:10 ] boost::regex で,置換する時に置換フォーマットが $10 だと 10 番目のキャプチャ要素に置換されるんだけれど, これを一番目のキャプチャ要素 $1 + 0 にするにはどうしたらいいの?
251 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:00:54 ] >>250 regex を二回呼べばいいんでは?
252 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:09:39 ] すいません 2 回呼ぶと言うのはどういう意味でしょうか?
253 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:23:33 ] >>250 簡単な例をplz
254 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:29:02 ] ${1}0でいけたような気がしたけど、どうだったかなあ
255 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:31:59 ] 1.35のregexでいまためしてみた。 "\\10"で大丈夫。sed format string syntaxってやつだ。 "${1}0"はだめ。 #include <iostream> #include <string> #include <boost/regex.hpp> int main() { boost::regex re("(.)(.)(.)(.)(.)(.)(.)(.)(.)(.).*"); std::string s ="abcdefghijklmn"; std::cout << boost::regex_replace(s, re, "\\10") << std::endl; return 0; }
256 名前:デフォルトの名無しさん mailto:sage [2008/07/24(木) 20:34:49 ] そういう意味か!
257 名前:250 mailto:sage [2008/07/24(木) 20:38:51 ] >>255 ありがとう!それでうまくいきました.
258 名前:デフォルトの名無しさん [2008/07/25(金) 10:23:37 ] boost_serializationを画面やメモリに出力したいのですが教えて下さい test_classは別に定義してあるとします。これだとファイル出力です #include <fstream> #include <string> int main() { std::ofstream fp("XXX.xml"); boost::archive::xml_oarchive oarchive(fp); test_class Z; Z.a = 22; Z.b = 7; oarchive << boost::serialization::make_nvp("Root", Z); }
259 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:34:45 ] >>258 よくわからんが ofstreamのかわりにcoutやsstreamを使えばいいだけなんじゃないの?
260 名前:デフォルトの名無しさん [2008/07/25(金) 10:35:02 ] 追記 型 const boost::serialization::nvp<T>の出力方法がわかればいいのですが
261 名前:デフォルトの名無しさん [2008/07/25(金) 10:36:58 ] トンクス これでいけました! xml_oarchive oarchive(fp); → xml_oarchive oarchive(cout);
262 名前:デフォルトの名無しさん [2008/07/25(金) 10:41:06 ] メモリに格納したいのでstringにしたらエラーでました。 メモリに入れる良い方法ありませんか? string s; boost::archive::xml_oarchive oarchive(s); 1番目の引数を 'std::string' から 'std::ostream &' に変換できません。
263 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 10:46:46 ] >>262 つ[stringstream]
264 名前:デフォルトの名無しさん [2008/07/25(金) 10:50:32 ] トンクス
265 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:06:02 ] 参照を使うべきかポインタを使うべきか悩んでいるのですが、 参照なんて使わない!もしくはできる限り全て参照を使う!って方いますか? どうもポインタと参照の違いが分かりません(使いどころとして)
266 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:46:14 ] >>265 C++では、ポインタを使わないといけないケース以外はポインタを使わない。 使うとしても、大抵はイテレータと言う形で使っている。 必要に迫られれば、ポインタを使うこと自体は吝かではない。
267 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:50:08 ] C++だと関数にヌル終端文字列を渡すときも、const char * とか使わず、 全て const char & とか const std::string & を使うの?
268 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:51:13 ] const char & を渡してどーすんだ
269 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 13:58:18 ] 俺は、参照を使わざるを得ないときと、値渡しの代わりとしてコピーのコストを抑えるためにしか、参照を使ってないな それ以外はポインタ
270 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:08:14 ] void test(const char& s){ if(&s==NULL){ std::cout << "(NULL)" << std::endl; } else{ std::cout << &s << std::endl; } } int main(){ test(*"aaa"); test(*static_cast<const char*>(NULL)); return 0; } --結果--- aaa (NULL) 扱えないことはない。 でもまぁ正直言って、これはないw
271 名前:265 mailto:sage [2008/07/25(金) 14:12:35 ] 値渡しのコピーを省くためなら、参照でなくともポインタでできそうですけど、 それをわざと参照でやる理由はなんでしょう? c++まだ勉強中で、ざっと見た感じ、以下のようなものしか有用性はないような気がしてます。 ポインタでの煩わしい明示を省ける、視覚的に区別する以外のメリットはあるのでしょうか? int n; int &func(); void main() { int i = 0; func() = i; } int &func() { return n; }
272 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:29:06 ] ポインタは参照と違ってNULLを渡すことができるらしいよ。 参照はポインタと違っていい一般保護例外を起こすようなアドレスを排除できるらしいよ。
273 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:35:22 ] >>271 少なくともread-onlyな引数を、効率のためにconst参照渡しがしたいケースなら、 素直にreference使ったほうが便利だよ >>272 の言うような問題もないし、呼ぶ側としても ただの値渡しと同じように記述できて、型変換や何かが必要な場合もコンパイラが面倒 見てくれるからな ユーザ定義演算子などでは、意図した記法を実現したければ、 事実上参照以外に選択肢が無いこともある
274 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:36:21 ] >>272 やってやれんことはないな void hoge(double &d) { } hoge(*(double *)NULL); hoge(*(double *)123);
275 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:37:23 ] >>271 const参照になるけど、 ・良いかどうかは別にして、コンストラクタの暗黙呼び出しが使える。 ・一時オブジェクトが渡せる。 という利点はある。 struct IntX { int n; IntX():n(0){} IntX(int argn):n(argn){} }; void test(const IntX& a){ std::cout << a.n << std::endl; } void test2(const IntX* a){ std::cout << a->n << std::endl; } int main(){ test(IntX()); test(10); //test2(&IntX(20)); //左辺値でないのでコンパイル不可 return 0; } あと、>>272 がツッコミ入れてくれた通り、 >>270 で書いた *static_cast<const char*>(NULL) みたいなネタは 実際のプログラムでやったら(無効な参照を作ったら)駄目だからね。
276 名前:265 mailto:sage [2008/07/25(金) 14:47:48 ] ふむふむ、なるほど。よく分かりません\(^o^)/ もう少し理解を深めてから出直したいと思います。
277 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:48:21 ] このスレか別のスレかわからないが最近同じネタをやってて、 参照が追加になったのは演算子のオーバーロードやコピーコンストラクタで 必要に迫られたからということらしい。 通常では戻り値はいいとして引数で使うと変数の変化が追いにくくなるので 多用はしないということだった。
278 名前:265 mailto:sage [2008/07/25(金) 14:55:17 ] C++の機能拡張に合わせて追加された、ということでしょうか。 同じネタが上がるということは、同じ疑問を持つ人がいるということですかね。 オーバーロードやコピーコンストラクタのあたりも見直してみます。
279 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:56:12 ] >>274 その場合は呼び出し元に問題があることが確定するのが、参照にしとく利点になるかな? ポインタだと、渡された側でヌルチェックすべきかどうか気になってしまう。
280 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 14:57:23 ] >>276 まだ勉強中って書いてあったね、ごめん。 慣れるまで、参照でなければならない箇所以外は ポインタで良いと思うよ。 たぶん、経験が自然に教えてくれる。
281 名前:デフォルトの名無しさん [2008/07/25(金) 14:57:42 ] hoge(*(double *)NULL); こんなん落ちないの?
282 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:01:25 ] 落ちると思って良い。 ちなみに言語規約違反な。
283 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:04:08 ] 間違った。規約じゃなくて規格。
284 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:08:09 ] C++でC言語のキャスト使うのやめれ
285 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:08:49 ] そういうときは未定義動作っていうんだ。コンパイルはできちゃうからね。
286 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 15:13:29 ] #define NULL reinterpret_cast<void*>(0)
287 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:21:06 ] BCCでの質問です。 ファイル間のインクルードの関係が以下の時、変更してないファイルも毎回コンパイルされるんですが回避策ってありますか? A.h B.h(include A.h) A.cpp(include A.h) B.cpp(include A.h,B.h) オナがいします。
288 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:22:52 ] >>287 ヘッダを変更しなければいいだけじゃないの?
289 名前:デフォルトの名無しさん [2008/07/25(金) 17:31:40 ] C言語勉強中なのですが、理由が知りたいです。 簡単なプログラムなのですが、回答よろしくお願いします void hogefunc(char *); void main() { char a[256] = "abc 0001"; hogefunc(a); } void hogefunc(char *tmp) { char b[256]; strcpy(b,tmp); } ////////////// デバッグを行うと、bの中身が"abc"のみでaの中身"abc 0001"が文字列コピーできていません。 予想だと、aの中身とbの中身は同じになると思ってました。なぜ0001が切られたのでしょうか? よろしくお願いします
290 名前:289 mailto:sage [2008/07/25(金) 17:34:42 ] 全て打つ前に転送してしまいました・・ このプログラムの場合、aの中身とbの中身を同じにするにはどうすればいいでしょうか?
291 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:34:57 ] そんなはずがない。なんかの見間違いなんじゃないか
292 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:35:57 ] void hogefunc(char *); void main() { char a[256] = "abc 0001"; hogefunc(a); } void hogefunc(char *tmp) { char b[256]; strcpy(b,tmp); printf("%s",b); } で試したけどちゃんと表示されてました
293 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:35:58 ] >>289 >>290 んなこたぁーない もう少しデバッグのステップ続けてみ
294 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:36:21 ] >>287 どうやってコンパイルしてる? make 使ってるのなら makefile 見せてみ
295 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 17:37:42 ] "abc 0001" ^ 実はこれが\0というオチを予想
296 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:01:40 ] >>288 ,294 どうやらファイル名が長すぎるのが原因のようでした。 最小限の再現作ってたらincludeのみのヘッダファイルが二個だけになったので^^;
297 名前:デフォルトの名無しさん [2008/07/25(金) 19:11:07 ] 一様乱数を生成する関数のソースについて質問があります。y=1/sqrt(2)*exp(-1/2*x*x)の計算で In function `GaussRandom':: undefined reference to 'sqrt’と In function `GaussRandom': : undefined reference to `exp'というエラーがでて実行できません。もちろん<math.h>は定義しました。 レポート課題なのでマジで困ってます。是非教えてください。ソースを下に載せておきます。 ちなみにxが一様乱数で、yが正規乱数です。 double GaussRandom() { double x; double y; x=UniformRandom(); y=1/sqrt(2)*exp(-1/2*x*x); return y; } double UniformRandom() { double x; int r=1; r=1229*r+351750; x=r/1664501; return x; }
298 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:29:31 ] >>297 お前いい加減にしろよ。
299 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 19:53:42 ] >>289 変数寿命が切れてるから上書きされているんじゃないの?
300 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:23:03 ] クラス内の関数ポインタでつまづいた。 分からない、全然分からない。 どこが分からないのかすら分からない。
301 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:28:50 ] 普通の関数ポインタはわかるのか? じゃあメンバ関数ポインタでぐぐるんだ
302 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:35:00 ] ええ、それで調べているんですけど、どうしてこんなに難解なのかと小一時間(ry 関数ポインタをメンバに含めると初期化できませんよね?こんな風に void (*pf[])() = {hoge, piyo, foo}; もう普通に関数にした方がいいのかな……。
303 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:39:47 ] オーバーロード演算子関数のポインタって取れないんですか? X (*f)(X &, X &) = +; X (*f)(X &, X &) = &+; X (*f)(X &, X &) = ::+; X (*f)(X &, X &) = &::+; X (*f)(X &, X &) = *::+; X (*f)(X &, X &) = operator +; X (*f)(X &, X &) = &operator +; X (*f)(X &, X &) = &::operator +; とか色々試したんですが「;が足りません」だの「operatorの位置が不正です」だのなんだの 構文に文句付けられて通りません 取り方があれば教えて下さい
304 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:42:20 ] それってただの関数ポインタじゃないか?
305 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:46:28 ] >>303 これでいけたぞ #include <stdio.h> struct X{}x; X operator+(X&, X&){printf("x");return X();} int main(){ X (*f)(X&, X&) = operator+; f(x,x); }
306 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:53:37 ] >>302 #include <stdio.h> class A{ static void (A::*pf[])(); public: void hoge(){ printf("hoge"); } void piyo(){ printf("piyo"); } void foo(){ printf("foo"); } void call(){ for(int i = 0; i < 3; i++) (this->*pf[i])(); } }; void (A::*A::pf[])() = { &A::hoge, &A::piyo, &A::foo }; int main() { A().call(); }
307 名前:デフォルトの名無しさん mailto:sage [2008/07/25(金) 20:56:10 ] 俺には解読不能な文字列が多すぎて、目眩がしそう。