1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
357 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:54:59 ] >>351 配置newって嫌われ者なの?
358 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 05:48:41 ] >>355 列挙型の実態が整数"ではない”実装を見たことがない。
359 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 09:35:37 ] >>357 別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。
360 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:53:34 ] 誰もつっこまないけどchar impl_storage[max_size]なんてしたらアライメントどうするんだよ。
361 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:55:15 ] >>360 boost::aligned_storage あたりでおきかえる。
362 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 11:33:04 ] じゃあ最初からboost::aligned_storageって書けよ
363 名前:349 mailto:sage [2010/02/25(木) 12:07:15 ] >>362 boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、 そんな気持ちを込めて「〜みたいな領域」と書きました。
364 名前:343 mailto:sage [2010/02/25(木) 12:49:32 ] >>345 >>348 >>353-354 ありがとうございます。 assert() exit() terminate() abort() について勉強してきます。
365 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 17:02:41 ] >>363 >そんな気持ちを込めて「〜みたいな領域」と書きました。 どう考えてもそれだけの情報からその気持ちは伝わらないから。 頭大丈夫?日本語分かる?精神鑑定してもらったら?
366 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:49:40 ] 解析で使う A-Z a-z 0-9 1 1 2 3 2 1 2 3 3 4 な表ってなんて名前だっけ?
367 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:57:50 ] >>366 LR解析表なのか?状態複数あって LR衝突してないのか?
368 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 21:03:59 ] >>367 表の中は説明で適当に書いただで意味はないんだ。 どんな名前だったか忘れてしまったもんで。 助かったよ。ありがとう
369 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 22:34:38 ] >>365 俺には伝わっていたが、伝わらない人がいるのもわかる。 そして、伝わらなかったからといってそのようなレスをするあなたが心配です。
370 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:26:29 ] 一般に、 g++ -lhoge test.cpp という調子でライブラリを読み込んで成功したとき、 hogeの場所を知るコマンドってありますか? 具体的には g++ -llapack test.cpp なのですが、これは Fortranのライブラリをリンクしているそうです。 Fortranでは DSYEV という関数名なのがC系だと dsyev_ と、アンダーバーがつくようになるというのがよく分からないので・・・。
371 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 14:38:16 ] よくわからんが、場所っていうのはディレクトリ名じゃなくて関数名のことかい それにOS依存の話題だったら微妙にスレ違いだぜ
372 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:45:41 ] LD_LIBRARY_PATHとか
373 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:47:09 ] ・リンカが検索に用いるパスを探すことで場所を知ることができる ・ラッピングした際に小文字にしたんでしょう
374 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 16:06:37 ] >>370 www.netlib.org/clapack/faq.html As previously stated, the CLAPACK library was built using a Fortran to C conversion utility called f2c. The entire Fortran 77 LAPACK library is run through f2c to obtain C code, and then modified to improve readability. CLAPACK's goal is to provide LAPACK for someone who does not have access to a Fortran compiler. It is important to note that this f2c conversion was run on a machine that appends an underscore to differentiate C and Fortran 77 namespaces. If your machine does not append an underscore to differentiate namespaces, then CLAPACK will not work on your machine.
375 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 17:11:46 ] ありがとうございます。 だんだん事情が分かってきました。 人間がCに移植しているわけではないのですね。 clapack.h をみても、単に宣言が書いてあるだけなので、 Cのソースコードとしてincludeするわけでもないのか。 あと前半はたしかにOS依存の話ですね。 手元の環境ではLD_LIBRARY_PATHも空だったし。 すみませんでした。
376 名前:デフォルトの名無しさん [2010/02/26(金) 20:04:26 ] /*******************************************************/ #define MAX(x,y) ((x)>(y) ? (x):(y)) int a = 3; int b = 3; int m = MAX(a,++b); はプリプロセッサによって int a = 3; int b = 3; int m = ((a)>(++b) ? (a):(++b)); と展開されます。 結果的に++bが2度評価され、bとmは5になってしまいます。 /*******************************************************/ という記述を見たのですが、標準C++の規格ではbとmは5になるってのは保証されますか? 私には未定義の動作になりそうに見えるのですが。 よろしくお願いします。
377 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:07:07 ] 保証されますよ
378 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:25:05 ] >>377 int m =++b, a , ++b; の場合はどうなりますか? bとmが5になりますか? それとも未定義の動作でしょうか?
379 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:30:14 ] 未定義の動作ですよ
380 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:39:49 ] int m = (a)>(++b) ? (a):(++b); だとOKで、 int m =++b, a , ++b; だと未定義の動作なのですね。 うーん、ややこしいです。 両方とも一つの式の中で2回bの値が 変化しているように思うのですが、 どういった相違により 片方がOKでもう一方はダメに なるのでしょうか?
381 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:41:58 ] カンマがね、ヤバイんですよ・・・ここだけの話
382 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:54:23 ] unsigned A(){ struct{unsigned a;unsigned operator()(int x){return ++a<<x;}}r={1}; retrun r(0)|r(8)|r(16)|r(24);} 0x04030201 // 式中でオブジェクトの順状態て保証される?
383 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:00:47 ] >>382 されない
384 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:42:11 ] なんか関数の実引数の区切りのカンマと、カンマ演算子を間違っているやつがいるようだ。 >>378 の m, b ともに 5 になることは保証されているぞ (5.18-1) m=func(++b, a, ++b); だと未定義動作だけどな。 >>376 副作用完了点でぐぐってみるべし
385 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:03:09 ] a++, a++; 未定義
386 名前:380 mailto:sage [2010/02/26(金) 22:23:55 ] int m=func(++x, ++x); が未定義動作というのは全会一致ってことですね。 int m = (a)>(++b) ? (a):(++b); は正当で int m =++b, a , ++b; も正当 ですが int m =++b, ++b; は未定義ということなのですか? int m=(++x) + (++x); は未定義動作になりますか?
387 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:06 ] 未定義
388 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:58 ] >>384 int a=3; int b=3; int m =++b, a , ++b; このときにmが5になることが保証されているといっている?
389 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:40:35 ] >>378 これはコンパイルエラーでしょ。
390 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:43:36 ] >>384 カンマ演算子は副作用完了点たりえないのでは?
391 名前:390 mailto:sage [2010/02/26(金) 22:45:15 ] 間違えて覚えてたみたい。ごめんなさい。
392 名前:384 mailto:sage [2010/02/26(金) 22:46:49 ] 章番号までちゃんと示してある。言語規格書呼んでから話するんだな。
393 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:23 ] >>392 自信満々のところ水を差すようだけど、 >389 の言うとおりコンパイルエラーになると思うんだ。 カンマ演算子とか言ってるところを見ると、 int m =(++b, a , ++b); こう解釈したんだろうとは思うけど。
394 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:31 ] 特例は3項演算子、カンマ演算子のほかに&&と||もあるから int b=1; int a=++b&&++b&&b; こんなのでもちゃんとa=3になるな しかしひどいコードだ
395 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:57:41 ] もういいから黙って二行に分けろよカス
396 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:59:04 ] >>393 その程度だろ codepad.org/8ZqDzVjC 今話してる話題と関係ないだろ
397 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:07:28 ] 何そのイン○リさんみたいな返し?流行ってんの?
398 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:08:14 ] 何言ってんだか
399 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:11:21 ] >>393 コンパイルエラーにはならず、カンマ演算子の最後、つまり2回目の++bが値として使われるので mに4が代入された後、bはインクリメントされる。 なので、>>388 を書いた。
400 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:16:56 ] >>399 なんだか知らんが ++bは前置増分演算子って呼ぶってことは知ってるの?
401 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:20:01 ] ttp://codepad.org/xadcb34S ああこういう意味でコンパイルエラーってことね。 上記の話をまとめると int m =(++b, a , ++b); は ttp://codepad.org/J7jHthUQ のようになり、正当な動作をするって考えていいのね。
402 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:21:46 ] つまり 3項演算子(条件演算子 カンマ演算子 && || の4つは、副作用完了点となるから それらのオペランドに++aが複数回出現しても 未定義の動作にならないってこと?
403 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:29:57 ] >>400 なんだかどうしようもないところでボケていてすまんかった
404 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:45:55 ] >>402 「オーバーロードされてなければ」それで合ってる
405 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 15:54:25 ] ttp://codepad.org/AsWip2mX このコードで std::cout << hairetsunoyousosuu(arr) << std::endl; の部分は 期待通りになるのですが std::cout << foo(arr) << std::endl; の部分が期待通りになりません。 どうすれば 「引数として渡された配列の要素数を返す『関数』」 が書けるでしょうか? よろしくお願い申し上げます。
406 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:00:57 ] 関数の仮引数の[]はただのポインタに変わる コンパイル時にわかるものなら_countofを参考にする それをDLLとして公開するとか誰が渡すんだかわからないものを自動で取得する汎用的な方法はない
407 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:03:23 ] >>405 main::arrはint[5]型 foo::argはint[]型 sizeof(int[5])はsizeof(int*) * 5 sizeof(int[])はsizeof(int*) int*とintの大きさがたまたま同じだっただけ。
408 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:05:30 ] >>406 ポインタとは違ってmainで定義したarrの要素全部がコピーされるけどね。
409 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:34:50 ] 構造体と勘違いしてんじゃねえのお前
410 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:42:25 ] こまけぇことはいいんだ、vector使え!
411 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:23:11 ] >>405 なんか codepad は Error 500 で見れなかったんだけども、こういう話? d.hatena.ne.jp/matsutakegohan1/20071006/1191643652
412 名前:405 mailto:sage [2010/02/27(土) 19:19:17 ] >>406-411 みなさんありがとうございます。 template<class T, int N> int len(T (&)[N]){return N;} と #include <cstddef> template<typename T, std::size_t N> char (&lengthof_helper_char_array(T (&a)[N]))[N]; #define lengthof(a) (sizeof(lengthof_helper_char_array(a))) ですと、どちらが望ましいのでしょうか?
413 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:24:04 ] >>412 どちらが望ましいかは場合によるね。 前者はコンパイル時定数としては使えない。 後者はコンパイル時定数として使えるようにしてあるけど、そのために読みにくく なっているし、基本的に避けるべきであるマクロまで組み合わされている。
414 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:39:51 ] >>413 なるほど、そう言った違いがあるのですね。 ありがとうございました。
415 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:43:00 ] ttp://www.kijineko.co.jp/tech/superstitions/parameter-of-isalpha-is-char.html ここに書いてあることについてお伺いしたいのですが。 const char str[] = "abc123"; for (char* s = str; *s != '\0'; s++) { if (isalpha(static_cast<unsigned char>(s))) { ... } } こうすべきとのことですが、これは const char str[] = "abc123"; for (char* s = str; *s != '\0'; s++) { if (isalpha(s)) { ... } } の用にキャストを外すと動かないことがあるということでしょうか? "abc123"のように、内容全てがASCII文字であってもだめなのでしょうか? よろしくお願い申し上げます。
416 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:46:07 ] >通常は問題ないのですが、多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合などは、
417 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:04:49 ] >>416 多バイト文字を含む文字列の各要素も isalphaでアルファベットかどうかを調べることが可能と言うことでしょうか? たとえば "あいうえおabcd" のような全角文字でもできるのでしょうか?
418 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:10:47 ] その記事も含めてそんなことをいってる奴は居ない
419 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:11:28 ] > is 系関数に実引数として渡すことができる値は、0 〜 UCHAR_MAX または EOF だけです
420 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:30:00 ] ASCIIだけなら問題ないんじゃない? 他の文字コード入ってたら知らんけど
421 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:58:27 ] "abc123"は多バイト文字を含む文字列ではありませんよね。 では多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合など とは、具体的にはどんな文字列のことなのでしょうか?
422 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:17:37 ] sjisとかunicodeとか。 isalphaのかわりに_ismbcalphaやiswalphaで調べられる。
423 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:22:38 ] 3の倍数のときだけ多バイトな文字列の例. "123456789"
424 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:39:22 ] それスゲー迷惑だけどオッサンが漢字キーを駆使しながら頑張って作ったものだと想像するに少し許せる 正規表現置換とかだったら死刑
425 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 23:14:54 ] 文字コードって訳わかんない ひとつに絞って他のコードは国際法で規制しろよ
426 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 23:43:28 ] >>425 トロンコード最強ってことで。くっくっく。
427 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 00:29:23 ] >>415 isalpha()に「0〜UCHAR_MAX または EOF 以外の値」が渡された時の動作は未定義 ということはわかっているのかね。きじねこは不可解な動作やらクラッシュという表現をしてるが 例えばstrにSJIS全角文字「A」(コード0x8260)を含んでいたとして(str="Aabc123"とか) forループ内でisaplha()に、0x82、0x60と渡されていくことになるが、 例えばcharが符号付きでint型が32ビットの処理系だと0x82→0xffffff82と 符号拡張で変換されるから「0〜UCHAR_MAX または EOF 以外の値」となって未定義となる unsigned charにキャストしとけば「0〜UCHAR_MAX または EOF」には納まる このきじねこの記事雑だな constや*忘れてる
428 名前:415 mailto:sage [2010/02/28(日) 00:34:56 ] >>422 >>423 >>427 解説ありがとうございます。 そう言った意味なんですね。
429 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 18:15:24 ] hoge *p = new hoge; my::smp q(new hoge); // ok my::smp r(p); // no! 上の初期化法だけを許可したいんだけど、方法はある? つまりテンポラリなポインタだけを受け取れるような方法 C++0xだと右辺値参照というのがあるからできるらしいのだけど・・・ 今ではまだメタプログラミングを駆使しても不可能かな?
430 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 18:20:41 ] 無理。my::smpのコンストラクタ内でnew hogeを実行するようにすれば近いことはできるんじゃない? 引数付きのコンストラクタも考えると現実的でないが
431 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 19:01:30 ] >>430 thx コピーコストが気になるけどその方向で考えてみますわ
432 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 21:10:12 ] boostにそんなのがあった気が
433 名前:デフォルトの名無しさん [2010/02/28(日) 23:34:24 ] テンプレートクラスについてお聞きします。 テンプレートクラスは、ヘッダファイル内に関数の実装の定義も書きますよね? もしテンプレートの特殊化をした場合は、cppファイルに書いていいものなのでしょうか? たとえば、テンプレートパラメータにbool値をとるクラスを定義したとして、 関数の実装をヘッダファイルに書かず、 テンプレートパラメータがtrueのときの処理と、falseのときの処理を それぞれcppファイル側に書いてもいいものでしょうか? (そのようなクラス設計がいいかどうかは別として・・・)
434 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:36:04 ] >>433 まずいだろう 他のファイルからもそのヘッダファイルを参照していたらどうなる?
435 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:50:58 ] >>433 いいよ template<bool A> struct X { void f() {} }; template<> struct X<true> { void f(); }; とヘッダーに書いて void X<true>::f(){} を別のコンパイル単位に書くのはOK。 bool が typename でも同じ
436 名前:デフォルトの名無しさん [2010/02/28(日) 23:51:44 ] クラス設計に関して質問です。 Waveファイルの入出力に関するクラスと、再生に関するクラスの2つを作ったとします。 実際waveファイルを入力して、再生するというプログラムを書く場合オブジェクトを何にしたらいいでしょうか? オブジェクト指向がよくわかっていなくて・・・
437 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:59:35 ] // ヘッダファイル template<bool B> struct hoge { hoge(); }; // ソースファイル template<> hoge<true>::hoge() {} template<> hoge<false>::hoge() {} これで問題ないね
438 名前:433 [2010/03/01(月) 00:18:10 ] >>435 >>437 ありがとうございました!
439 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 00:45:56 ] >>436 WaveIO obj = new WaveIO(filePath); Player obj2 = new Player(); obj2.Play(obj); とかってなるんでないの
440 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 02:23:03 ] マルチスレッドキューありますか。 自作しようして無理だった。
441 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 05:44:38 ] >>432 make_sharedだな。TR1にもC++0xにもある。 >>440 Intel TBBになんかあったはず。
442 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 00:34:04 ] クラスのメンバ関数とそのconst関数の共通化をしようとして失敗しています。 以下のコードでは [ ]演算子のオーバーロードがその例です。 どうしたら理想([ ]によるメンバ変数arrayの中身変更)的な動作になるでしょうか? codepad.org/9YXChfJT
443 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 00:56:27 ] 高校1年の春、2年生に進級する直前のできごとでした。 僕は難関、最初の壁と名高いポインタにぶつかりました。 ポインタ・・・彼は僕を苦しめました 存在が意味不明でした。 『本当に必要なのか? いつ、使うの?君はなんなんだい?』 僕は寝ることをやめて飲まず食わず 1週間、ずっとポインタを見つめた結果 理解できませんでした・・ そのときの挫折はまさに、絶望でした。 自分の理解力の無さと頭の悪さに怒りを覚え その怒りはそのうちに悲しみにかわり 僕は1ヶ月、眠れませんでした。
444 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:11:16 ] >>442 × return const_cast<double&>( static_cast<const Test>(*this)[pos] ); ○ return const_cast<double&>( static_cast<const Test&>(*this)[pos] );
445 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:14:32 ] そんな僕がまたプログラマ目指そうと思ったのですが どう思います?
446 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:17:12 ] >>445 好きにすればいい。分からない事があったらここに書き込めば俺は答える。
447 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:35:19 ] >>444 ありがとうございます。 <間違い> return const_cast<double&>( static_cast<const Test>(*this)[pos] ); は、static_cast<const Test>(*this) で *this の中身をコピーした const Test型 のオブジェクトを生成し、 その生成されたオブジェクトに [pos] でアクセスしている。 だから、実際には *this の中身にアクセスできていない。 という解釈で良いでしょうか?
448 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:38:14 ] >>442 こういうのも return const_cast<double&>( static_cast<const Test*>(this)->operator[](pos) );
449 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:41:27 ] >>447 そういうこと。
450 名前:442 mailto:sage [2010/03/03(水) 04:18:56 ] >>448 >>449 ありがとうございます!
451 名前:デフォルトの名無しさん [2010/03/03(水) 07:50:18 ] ツリーのクラス構造について質問です。 現在、以下のようなクラスを考えています。 class Base{} class ParentBase : public Base { }; class Parent : public ParentBase { }; class ChildBase : public Base { }; class Child : public ChildBase { }; class ChildA : public Child {} class ChildB : public Child {} class ParentA : public Parent { public: ChildA childa; ChildB childb; }; class ParentB : public Parent { public: ParentA parenta; }; Parentの派生クラスは、メンバ変数でChildだったり、Parentのオブジェクトの実体を保持します。(例:ParentA, B) ここで、各Parentが保持するオブジェクトから、親オブジェクトへアクセスする方法はないでしょうか? やりたいことは、ParentA::childaで、ParentAの関数を呼ぶ、ParentB::parentaで、ParentBの関数を呼ぶ、ということがしたいのです。 一番基底クラスのBaseクラスで、Baseクラスへのポインタ持たせてやろうと思ったのですが、そのポインタへの実体のセット方法がわからなくて、迷ってしまいました。 何かいい方法はないでしょうか?
452 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:04:37 ] ポインタを理解したのは、確かポインタ渡し、参照渡し、値渡しの違いを知ったときだった憶えがある
453 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:15:38 ] >>451 コンストラクタで渡すなりセットするメンバ関数を作るなり public にして設定するなり、 いろいろあるだろ。何が気に入らないんだ?
454 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:27:28 ] struct hoge: public unary_function<int,int> { int operator(int); }; 的な関数オブジェクトを g++ -Weffc++ hoge.cpp でコンパイルした場合、 warning: base class struct std::unary_function<int, int> has a non-virtual destructor というエラーがどうしても出るのですが、 ライブラリの責任であってユーザ側からは対応しようがない、 というので正しいでしょうか?
455 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:41:08 ] protected継承
456 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:43:09 ] >>454 ja.lmgtfy.com/?q=%22warning%3A+base+class%22+std%3A%3Aunary_function+%22has+a+non-virtual+destructor%22
457 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:35:06 ] >>456 要するにGCCがそうだと言ってるからそうだ、ということですね。 これに対するライブラリ実装者の答えが欲しいのですが・・・。