- 1 名前:デフォルトの名無しさん [2009/01/11(日) 11:21:38 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part65 pc11.2ch.net/test/read.cgi/tech/1230341243/
- 520 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:00:29 ]
- C++Builder(8万円くらいする)
Turbo C++(C++ Builderの無料版 機能が削られていて少し古い) Qt Creater(マルチプラットフォームのソフトが作れる コンパイルが遅い)
- 521 名前:デフォルトの名無しさん [2009/04/09(木) 15:08:24 ]
- >>520
turbo c++でGUIって開発できるの??
- 522 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 15:52:24 ]
- できるよ
- 523 名前:500 mailto:sage [2009/04/09(木) 22:50:09 ]
- >>510-511
そういえば関数テンプレートの定義は ヘッダに書くけど、それは普通の関数の類推で inlineじゃなきゃいけないなんて考えちゃだめなんだったな。 Effective C++に書いてあったような気がしてきた。。。 ありがとうお二方。
- 524 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:53:28 ]
- 「exit(0)で終了するとデストラクタが呼び出されたり呼び出されなかったりする」
っていうC++の仕様について学べるサイトを教えてください。 巻頭言 2000〜 park1.wakwak.com/~y-nagano/200001.html 一応ググったらこんなのがヒットしましたが、これ以外にも何かオススメをご存じであればお願いします。
- 525 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:10:23 ]
- std::powとかhypotとかをスレッドセーフに実行したいんだけど、おみゃーらどうしてる?
軽いに越したことはないずら
- 526 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 23:12:13 ]
- 常識的に考えればスレッドセーフでないわけがない。
って書こうとしたが、errnoとか気にしている?
- 527 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:16:23 ]
- あれ?そうだったの?errnoは気にしてない。
うーん、じゃあ他のところで変な風になってたのかにゃ・・・? ありがとうござんした
- 528 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 02:35:26 ]
- >>524 >>333-
- 529 名前:デフォルトの名無しさん [2009/04/10(金) 08:30:05 ]
- errnoを気にするとどうなの?
- 530 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 11:55:32 ]
- >>529
errnoはグローバル変数なので、 errno = 0; std::pow(x, y); if (errno != 0) { /* 失敗 */ } みたいなコードを書いたときに、powとifの間で他のスレッドによってerrnoが変更されてしまう可能性がある だから、errnoを気にするとpowとかはスレッドセーフじゃなくなる たいていのコンパイラにはerrnoをTLSに置いてスレッドセーフにするオプションとかがあるけどね
- 531 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 15:48:35 ]
- タクティカルレーザーシステム?
- 532 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 17:30:34 ]
- >>531
いやTrue Love Storyです。 じゃなくてThread Local Storageです。
- 533 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 18:05:46 ]
- 元気でね 頑張ってね
手紙書くね たまに会えるよね なんでかな 寂しいのに 寂しいよと 言えなかった
- 534 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 19:06:46 ]
- wwwwwwwwwwww
- 535 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 21:10:40 ]
- イイハナシダナー
- 536 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 22:17:52 ]
- >>530
よく分からんがerrornoへの代入って規格的に許されてたっけ?
- 537 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 22:27:30 ]
- 18歳以上ならeroero挿入おkだよ
- 538 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 22:32:32 ]
- はいはいエロスエロス
- 539 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 23:13:49 ]
- 18歳以上なのに、いつになってもeroeroの値がインクリメントされず初期値のままです。
- 540 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 00:09:13 ]
- >>539
君の中ではその変数は1つだけ存在すれば十分だよね。 俺達他人に迷惑書けて欲しくないから、君の実装から外には出さないで欲しいなぁ。 ってことでeroeroは自動的に0に初期化されてます。
- 541 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 00:15:47 ]
- E2BIGになって困る
- 542 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 00:39:57 ]
- >>540
static変数ってことか。
- 543 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 01:22:23 ]
- >>536
大丈夫です C99(ISO/IEC 9899:1999)の7.5の脚注170に「むしろそうするべき」って書いてある(C++の規格には「Cの規格を見てね」って書いてある)
- 544 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:07:03 ]
- 若干スレ違いな気がして申し訳ないんだが、
C++の書籍(他の言語は知らんけど)って正誤表無いor乏しいの多くない? 『Exceptional C++』を買ったんだけど、1ページ目から 誤植と思われる物があって困る。。。 だれか正誤表作ってくれている人とかコミュニティとか無い??
- 545 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:34:26 ]
- グローバルスコープに
std::string foo(); って書いたら、 std::string型を返す、引数のない、fooという名前の関数の宣言になるの? それとも std::string型のfooという変数の宣言とデフォルトコンストラクタ呼び出しになるの?
- 546 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:35:50 ]
- >>545
前者 C++は関数の宣言が優先
- 547 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 21:37:26 ]
- >>546
なるほど。 ありがとう。
- 548 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:09:01 ]
- 一応書いとくけど、ローカルスコープでもクラススコープでも同じだから。
ローカルでも関数の宣言は出来るからね。
- 549 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:16:46 ]
- これもちなみに
強制的に変数の宣言とデフォルトコンストラクタと見なさせるには std::string (foo()); と書けばよかったような 間違ってたらすまん
- 550 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:27:27 ]
- やってみたけどあかんかった
カッコつけても関数宣言と見なされる std::string foo(""); と何でもいいからパラメータ付けるしかないな
- 551 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:47:13 ]
- >>544
ぐぐれよかす ttp://www.gotw.ca/publications/xc++-errata.htm ttp://www.informit.com/content/images/0201615622/errata%5Cxcerrata.pdf
- 552 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:49:15 ]
- んばば んばんば えらったえらった
- 553 名前:544 mailto:sage [2009/04/11(土) 23:51:04 ]
- >>551
いや、日本語でググったりピアソンエデュケーション社の Webページで検索してみたりしたんだが英語は見落としていた。 ありがとう、恩に着る。
- 554 名前:545 mailto:sage [2009/04/11(土) 23:55:38 ]
- >>548
ローカルでは関数の宣言だけは出来るけど定義はできないんだよね。 ありがとう。
- 555 名前:デフォルトの名無しさん mailto:sage [2009/04/11(土) 23:57:37 ]
- >>550
いや、カッコつけなければいいだけ。
- 556 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:31:48 ]
- >>555
じゃなくてstd::stringのコンストラクタ呼び出したいんだけど
- 557 名前:555とは別人 mailto:sage [2009/04/12(日) 00:35:04 ]
- >>556
だから括弧つけなければいいなじゃないの? std::string foo; これでデフォルトコンストラクタ呼び出しになるでしょ?
- 558 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:36:12 ]
- デフォルトコンストラクタの話じゃなかったのか。
デフォルトじゃないなら引き数書くのは当たり前だろ。
- 559 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 00:46:26 ]
- なんだ?
未来指向なプログラムの話か?
- 560 名前:まとめ mailto:sage [2009/04/12(日) 00:53:22 ]
- 要は
1. std::string str="hogehoge"; ならstrの宣言&"hogehoge"を引数にとるコンストラクタの呼び出しとなる。 2. std::string str("hogehoge"); って書いてもstrの宣言&"hogehoge"を引数にとるコンストラクタの呼び出しとなる。 3. std::string str(const char* arg); ならstd::string型を返し、const char*を引数にとる関数strの宣言となる。 これを引数なしverにすると 1'. std::string str; ならstrの宣言&デフォルトコンストラクタの呼び出しとなる。 2'&3'. std::string str(); ならstd::string型を返し、引数のない関数strの宣言となる。 ってことだよね。 たぶんこのスレのみんなは分かっているけどレスが言葉足らずでカオスになっているだけかと。
- 561 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 01:17:31 ]
- >>556
もし、本当に「デフォルトコンストラクタを呼び出したいだけ(変数は用意したくない)」なら std::string(); と書けば呼べるだろうね。 もちろん、ソース上には現れない一時変数が用意されるだけだけど。 普通に「デフォルトコンストラクタで初期化される変数を用意したい」ならば 皆が書いているように std::string str; とすれば良いだけ。
- 562 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 15:26:49 ]
- 純粋なC++で、初心者でもないのにgotoを使う人って見たことある?
やるとしたらスパゲッティにならないで使える人なんだろうけど。
- 563 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 15:59:10 ]
- goto使えば二重三重ループから一気に抜けられるじぇ
- 564 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:16:02 ]
- あなた天才
- 565 名前:562 mailto:sage [2009/04/12(日) 16:26:45 ]
- まあネストしたループから一気に抜けるって使い方か。
別の方法としてわざと例外をthrowしてるヤツがいたけど それよりはマシか。 変なフラグ変数用意するくらいならgotoのがいいのだろうか?
- 566 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:28:22 ]
- フラグ変数なんか使うな
プログラムの見通しが悪くなる
- 567 名前:562 mailto:sage [2009/04/12(日) 16:31:09 ]
- >>566
ですよねー。 俺もそう思うよ。 サンプルソースならともかく flagとかhogeっていうフラグ変数を 用意しているヤツを見ると もう頭痛がしてくる。
- 568 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:35:57 ]
- クラス設計で、メンバ関数はどの順番で記述する?
例えば基底クラスでpolymorphicな使い方を想定しているとして。 以下public指定なものだけを書く。 class 〜〜{ 1.コンストラクタをずらずらと。 2.virtual デストラクタ。 3.swap()メンバ関数 4.これら以外の普通のdo_something()メンバ関数をずらずらと。 5.operator= 6.operator+ 7.以下必要ならoperator云々 }; ってな感じにすれば良い? 今ひとつ経験不足でどんな感じが良いのかわからんのだ。
- 569 名前:568 mailto:sage [2009/04/12(日) 16:36:50 ]
- >基底クラスでpolymorphicな使い方
ってまあ要するに基底クラスのポインタに派生クラスのポインタを変換して使うつもりって言いたい。
- 570 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:37:32 ]
- まぁ、多重ループから一撃で抜けるなら
その部分をカプソー化してれつるんで抜ける方が スマートな気もするよね。
- 571 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:38:34 ]
- >>570
れつるん って南蛇井?
- 572 名前:571 mailto:sage [2009/04/12(日) 16:39:47 ]
- >>570
ああreturnか。
- 573 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:41:17 ]
- >>566
下手するとgotoなんかよりずっとスパゲッティーになるな フラグ変数が2つ出てきたり、状態が3つとかあったりすると死ねる
- 574 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 16:44:14 ]
- >>573
やっぱ2重程度ならともかくそれ以上多重にネストしているあたりから おかしくなり始めていると考えた方が良いのかなぁ。
- 575 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 20:26:39 ]
- フラグって一切使っちゃダメなん?
一切使うな的なことを初めのころ本で呼んで、 それ以来、可能な限り使わない方法を考えてる。 フラグを使わない方法を考えるだけで1日潰すなんてザラ。 でも、実際仕事を始めたら、普通にみんな使ってるし、 大体、DB自体がフラグのカラムでいっぱいだし、 そうなるとコード側でもフラグを操作しないとダメになる。 何が言いたいかっつーと、 フラグを使いまくってる職場のプログラム設計がおかしいのか、 フラグ排除主義の過激派が悪いのか、真理を教えてくれ
- 576 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 20:36:26 ]
- 別に、そう深刻に考える問題でもないと思うけど。
>>567は逆に考えれば、明快な名前を持つフラグ変数ならマシってことでもある。
- 577 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 21:07:24 ]
- フラグや多重ループはベタなコードを一度書いてみてジックリ考察すれば
単純なクラス構造に落とせると思うっス 使い捨てクラスが増殖するけど 後の状態変数の把握のし易さは別次元。
- 578 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 21:53:11 ]
- まぁ、アジャイル・プラクティスの教えに従えば、何事もバランスが大事。
そして、ダメだとわかったときにはリファクタリングする勇気。 でも、できればフラグやgotoは減らしていきたい。
- 579 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 21:58:37 ]
- gotoなんか使ってる奴はダメだね
男ならsetjmp/longjmpだろ と行きたいところだがある意味>>565で既出だった
- 580 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:02:40 ]
- 恩師、goto熊男先生いわく、
「ノォ!」 なので、gotoは使っちゃいけないと思うな。 (おっさん限定ネタ)
- 581 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:07:05 ]
- BreakTwoLevelsException
- 582 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:10:20 ]
- いや、最初の論点は
「goto使用を避けるためにフラグを使う」というのが最悪、ってことだろ。 もちろんフラグなんて可能な限り使わないほうが良いが、避けられないケースはある。 また、よく言われるループ内のswitchからの脱出の話題で 「switch使うな、classにしろ」という論も 猫も杓子もそうしろと言い出すのはナンセンスとしか言い様が無い。 「return使え」も同様。 要は、臨機応変に適材適所で手元にある道具を使え、ってことだ。
- 583 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:20:54 ]
- 内部ループ部分の関数括りだしや、contiue を活用すれば、二重以上のループは
殆ど登場しないから、個人的には goto は要らないな。 STL やファンクタも併用すれば、ループそのものの登場機会が減るし。
- 584 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:22:10 ]
- このスレって荒れないね。
すばらしい。 理性的な人がそろっているな。
- 585 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:33:13 ]
- C++は、使う人が理性的でないと、大変なことになるからかもね
- 586 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:35:43 ]
- でも、スコットメイヤーもハーブサッターも
著書の中で毒舌はきまくりだよ。
- 587 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 22:45:51 ]
- >>581
BreakがTwoLevelsかどうかはcatch節によるんで、その名前はあんまりです。
- 588 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 23:09:04 ]
- C++で正常系なのに例外を使うなんて信じられないっす
- 589 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 23:12:42 ]
- 局地的な使い捨てフラグの禁止は古い最適化思想の名残のような感じがするけどなぁ。
大局的にはフラグ専用の変数を用意してあちこちで状態を変更しまくってると ・フラグの状態を変更すべき処理を追加・変更したのにフラグの変更処理を忘れる ・フラグの今の状態がどこで変更された結果なのかがわからなくて状態の信頼性に欠ける とかの問題がでやすくなるから気をつけろってことだろ。
- 590 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 23:21:33 ]
- みんなそういう意味で言ってたと思うよ。
- 591 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 23:31:53 ]
- ユーザ定義リテラル使って、
throw "hoge_loop"_break; とか。
- 592 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 23:51:00 ]
- ある自作関数が1行で終わるとても短いstatic関数だったので、
それを実装ごと丸々ヘッダhoge.hに書きました。 特にinline指定はしなかったのですが、 そのhoge.hをインクルードするソースファイル.cppが複数あるにもかかわらず g++で問題無くコンパイル・リンク・実行できました。 普通の関数だったらmultiple definitionとか言われるはずだと思うのですが、 static関数なら大丈夫だったりするのでしょうか?
- 593 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 00:04:18 ]
- はい。ただし無駄です。
- 594 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 01:33:22 ]
- >>584
そう言われると、なんだか最近まったり進行している気がしてくる。
- 595 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 02:47:58 ]
- >>592
(メンバ関数でない)static関数とはまさにそういうものだろ。
- 596 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 05:50:11 ]
- >>586
毒舌っていうのは理性と知性によって導き出されるものだよ。 馬鹿な人間が感情のままに吐くのは、面白味も攻撃力も無い単なる罵倒。
- 597 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 15:16:18 ]
- >>596
まぁ、すてきな毒舌なこと。
- 598 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 15:51:35 ]
- >>596
>馬鹿な人間が 自虐?
- 599 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:04:21 ]
- ごめん、何に噛み付いてるのかよくわからない。
メイヤーズやサッターが理性的でないと言いたいのか、 それとも「毒舌というのが知性や理性の欠如から出るものなんだ」と主張したいのか、 それとも普段の自分が否定されたみたいで悔しいのか。
- 600 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:19:14 ]
- ごめん、何を必死に弁解してるかわからない。
いや、マジで
- 601 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:23:39 ]
- >>599
かみつくという認識もないくらい、ただの脊髄反射煽りだから気にすんな。
- 602 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 16:24:42 ]
- >>601
そうやって煽り返すから荒れるんだよ もう少し自重しようよ
- 603 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 17:02:39 ]
- >599はどのレスの人間で、どのレスに噛み付かれたのかと思ったんだ?
- 604 名前:デフォルトの名無しさん [2009/04/13(月) 17:21:35 ]
- メイヤーズやサッターが知性も理性の欠片もない。
面白味も攻撃力も無い単なる罵倒。
- 605 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 17:40:10 ]
- わどらー
- 606 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:21:38 ]
- プログラム中でint型の変数を2種類(a,bとする)定義し、その2つによって複
素数の型の要素を持つa列b行の2次元配列を定義したいのですが、 ------ #include <iostream> #include <complex> using namespace std; void main(){ int a,b; complex<double> c[][]; cin >> a; cin >> b; complex<double> *c = new int[a][b]; ------ これでエラーが多発してしまいます。 配列の定義に問題があれば教えていただけないでしょうか。
- 607 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:25:00 ]
- std::vector<std::vector<std::complex<double> > > c(a, std::vector<std::complex<double> >(d));
- 608 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:27:27 ]
- >complex<double> *c = new int[a][b];
型が違うからね。 >>607 の方法が一番素直なやり方と思う。
- 609 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:28:31 ]
- ×(d)
○(b)
- 610 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:29:35 ]
- std::vectorならresize()メソッドが使えるから後から大きさを変更する事もできる
アクセスは c[1][2] のように書ける
- 611 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:51:41 ]
- Boostを使ってもいいなら、boost::multi_arrayを検討してみるのもいい。
- 612 名前:デフォルトの名無しさん [2009/04/13(月) 22:26:09 ]
- file 1
template<class T> class Parent { void Umu() { Child* p = new Child; p->Method() } }; file 2 template< class T > class Child { void Umaseru() { m_pParent->Umu(); } } テンプレの場合、実装部分をcppに退避する事ができないので、 上記のような相互参照するクラスのテンプレートって実装できないのでしょうか?
- 613 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:29:15 ]
- 先行宣言すればいいよ
- 614 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:46:20 ]
- 先行宣言しても、そのクラスのメンバ呼出ししてたらコンパイルできない気がする。
- 615 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:03:59 ]
- 基底クラス内にあるクラスは派生クラスで特殊化可能ですか?
- 616 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 07:26:03 ]
- a Gr bner basis
- 617 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 09:59:34 ]
- template<class T> class Parent {
void Umu(); }; template< class T > class Child { void Umaseru() { m_pParent->Umu(); } } template<class T> void Parent::Umu() { Child<T>* p = new Child<T>; p->Method() }
- 618 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 06:30:03 ]
- 質問です。お時間あればよろしくお願いします。
-------------------------------- class Base { // 省略 virtual size_t getSize() const { return sizeof(*this); } }; class Derived : public Base { // 省略 }; int main() { Derived d; d.getSize(); -------------------------------- d.getSize()の値がBaseなのですが、自分が期待していたのはDerivedのサイズの取得です。 DerivedではgetSize()を定義せず、 Derivedのサイズを返すメンバ関数をBaseで定義することはできるでしょうか? 何か良い方法があれば教えていただきたいです。
- 619 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 06:57:06 ]
- >>618
もし、Derivedにprivateなメンバ関数を追加することが許されるのであれば、 BaseとDerivedに、それぞれsizeof(Base)とsizeof(Derived)を返すprivateでvirtualなメンバ関数を追加する。 で、Base::getSize() からはそれを呼び出すようにする。 原則としてsizeofの値はコンパイル時に決まるのであり、実行時の型で決まるものではないことに注意。 (C99の可変長配列は例外となる。)
- 620 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 08:53:01 ]
- >>619
早速の返答ありがとうございます。 なるほどサイズは動的に決まるわけではないんですね。 そもそもこんな事をしたくなる設計がよくないんでしょうかね…
|

|