■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part50
501 名前:デフォルトの名無しさん :2006/06/26(月) 12:59:35
>>480
その場合はどちらも同じ。
まぁ世の中広いから、違うコードを吐くコンパイラがあるやもしれんが。

一方、クラスで++の演算子オーバロードしたときに、後置演算子だと
効率の悪い場合があるから、そのような場合は特に理由がない場合は
必ず前置演算子を使っておくのが吉。

結局とのところ>>480で++iとするのは「単なる慣習」でしょう。

502 名前:デフォルトの名無しさん :2006/06/26(月) 13:12:58
>>480
インクリメント演算子でここまでに説明があったことは、オブジェクト指向の問題じゃ
なくて、単にC++の事情だから間違えないように。

ちなみに、純粋なオブジェクト指向言語と呼ばれているRubyには、インクリメント
演算子は存在しない。

503 名前:デフォルトの名無しさん :2006/06/26(月) 13:13:58
for(i=0;i<10;i++)
 printf("%d",i);

for(i=0;i<10;++i)
 printf("%d",i);

両方やってみればいいじゃん

504 名前:デフォルトの名無しさん :2006/06/26(月) 13:17:55
>503
何がやりたいのかわからん

505 名前:デフォルトの名無しさん :2006/06/26(月) 13:18:37
馬鹿が沸いた

506 名前:デフォルトの名無しさん :2006/06/26(月) 13:52:13
イテレータだと後置の方が効率イイヨ

507 名前:デフォルトの名無しさん :2006/06/26(月) 14:01:23
ほんと、このスレの住人は、聞きかじりの知識で議論モドキをするのが好きだねぇw

508 名前:デフォルトの名無しさん :2006/06/26(月) 14:10:56
下手な突っ込みも読み飽きた。

509 名前:デフォルトの名無しさん :2006/06/26(月) 16:10:47
>>506
理由もしくはヒントをおせーて

510 名前:506 :2006/06/26(月) 16:54:50
ばっちゃが言ってたから

511 名前:506 :2006/06/26(月) 17:08:17
今調べたら前置の方が良いね

512 名前:デフォルトの名無しさん :2006/06/26(月) 17:20:32
はいはい、もうどっちでもいいよ

513 名前:デフォルトの名無しさん :2006/06/26(月) 18:09:32
constで確保される領域って、バッファオーバーフローとかでも破壊されないの?


514 名前:デフォルトの名無しさん :2006/06/26(月) 18:11:05
>>512
いや、どっちでもじゃなくて>>495で。

>>513
いやそういうもんじゃない。環境依存。
コンパイラは明示的にキャストしない限り怒る。

515 名前:デフォルトの名無しさん :2006/06/26(月) 18:16:42
どうしても演算子オーバーロードの話に持って行きたがる馬鹿

516 名前:デフォルトの名無しさん :2006/06/26(月) 18:43:49
かといって他の話が出てこないんじゃなぁ。出せないんだろうけど。

517 名前:デフォルトの名無しさん :2006/06/26(月) 19:21:14
なんで?前置後置は>>499-500 に回答が書いてあるじゃない。
大昔ってか、今でもあるんだけど、CPUの機械語にスタックを実現する為の
前置デクリメントと後置インクリメントがあった、つか、あるんだよ。
で、大昔は、Cの最適化がタコだったから、++iと書くよりi++と書いた方が
より最適化されたし、i--と書くより--iと書く方がより最適化されたってことだよ。
しかし、本当にプリデクリメントとポストインクリメントの歴史を知らなかったのか?
やっぱり、最初にアセンブラをやらせるべきなのかなあ。

518 名前:デフォルトの名無しさん :2006/06/26(月) 19:35:53
なんだろう。
釣りなのかなぁ。
釣りなんだろうなぁ。

519 名前:デフォルトの名無しさん :2006/06/26(月) 19:41:29
まとめると、>>480で++iと書くのは「単なる慣習」であって、i++と書いても同じこと。
ただ、その慣習になったのは理由があって、それはC++の演算子オーバーロードに関係がある。

はい、これでこの話終わり。

520 名前:デフォルトの名無しさん :2006/06/26(月) 19:43:02
なんで喧嘩してんのかわからん

>>480のループはぶっちゃけ今ではどっち使ったって同じ
でも前置が使われることが多いのは何故か → 慣習的なもの

なぜそういう慣習が生まれるのか → まぁいろいろありまして

このへん一致した意見なんじゃねーのか

521 名前:520 :2006/06/26(月) 19:44:29
ああ、かぶった
いや一点違うところが

演算子オーバーロードはあくまで、慣習を生み出した原因のうちの一つだと思うよ

522 名前:デフォルトの名無しさん :2006/06/26(月) 19:51:25
つまり、どうしても演算子オーバーロードの知識を自慢したい馬鹿の為に話がこじれた、と。

523 名前:デフォルトの名無しさん :2006/06/26(月) 19:55:20
演算子オーバーロードの知識って何?

524 名前:デフォルトの名無しさん :2006/06/26(月) 19:56:59
なんだろう。
釣りなのかなぁ。
釣りなんだろうなぁ。

525 名前:デフォルトの名無しさん :2006/06/26(月) 20:00:43
 __     __       n     _____  _____     ___ ___    ___
 |   |    /  /      / /    /       | /__  __/ [][] _| |_| |__ _| |_
 |   |.   /  /    /⌒ヽ/     /   / ̄ ̄|. l    / /     |    _  | |_  レ'~ ̄|
 |   |  /  /    ( ^ω^ )    /   /.  / /    |  |___      ̄|  | / / /   /| |
 |   |  /  /     ノ/ /  ノ   /    ̄ ̄ /     \__|     |  |  ̄ /_  /  | |_
 |   |. /  /   // / ノ     /   / ̄ ̄ ̄                |_|     |__|   \/
 |   |/  /  ⊂( し'./    /   /
 |.     /     | ノ'      /   /
 |    /.     し'      ./   /
  ̄ ̄ ̄              ̄ ̄

526 名前:デフォルトの名無しさん :2006/06/26(月) 20:01:57
>>520
>なんで喧嘩してんのかわからん

「・・・でも同じですよね?」に答えようとせず、演算子オーバーロードの話を
持ち出してくる馬鹿が多いから。>>501で初めて「同じ」という解答があった。
初めてまともなコメントしたのが>>495
それ以前のコメントはクズ。

527 名前:デフォルトの名無しさん :2006/06/26(月) 20:02:43
だせぇな、AA貼ってまで煽るならageだ!漢ならageダロ?

528 名前:デフォルトの名無しさん :2006/06/26(月) 20:03:18
526=495

529 名前:526 :2006/06/26(月) 20:07:24
>>528
いや、俺夜中に馬鹿を煽ってた書き込みしてた奴だから

530 名前:デフォルトの名無しさん :2006/06/26(月) 20:14:35
>>529
わかってんだったら、煽らずに回等してやれよw

531 名前:デフォルトの名無しさん :2006/06/26(月) 20:14:45
馬鹿迷惑な話だ

532 名前:デフォルトの名無しさん :2006/06/26(月) 20:21:50
>単なる慣習?それとも明確な理由があるの?
に対する回答が>>482じゃん

>>495なんかよりも前に「同じ」回答が出てるのに
それが理解出来ずに>>483,490,491,493を書いたんだろ?

>>495でやっと理解できたものの引っ込みがつかないんで以降も
>>497,503,505,507,512,515と馬鹿みたいな一行コメントを繰り返したんだろ?

533 名前:デフォルトの名無しさん :2006/06/26(月) 20:23:11
全角の引用符使ってる人って、どのスレでもちょっとアレだよね

534 名前:デフォルトの名無しさん :2006/06/26(月) 20:26:13
1分41秒

535 名前:526 :2006/06/26(月) 20:26:50
>>532
お前も馬鹿発言した中の一人なんだろう?
その発言番号の中で夜中以外では>>515が俺だから。

まぁぶっちゃけると>>501も俺な。自作自演って奴だw

536 名前:デフォルトの名無しさん :2006/06/26(月) 20:33:00
釣り師乙。

537 名前:デフォルトの名無しさん :2006/06/26(月) 20:41:02
どっちもどっちだな。
くだらんことに時間使うな。

538 名前:デフォルトの名無しさん :2006/06/26(月) 20:42:21
いずれにせよ、C++使うなら>>495は理解しておけ。

539 名前:デフォルトの名無しさん :2006/06/26(月) 20:52:07
おまえら「メソッド」の時もくらだんことであーだこーだ言ってた奴らだろ。
ウザいよ

540 名前:デフォルトの名無しさん :2006/06/26(月) 21:03:20
ハァ?言語も指定せずになにいってんだこいつ

541 名前:デフォルトの名無しさん :2006/06/26(月) 21:08:48
( ´д)ヒソ(´д`)ヒソ(д` )ヒソ(ここはC++スレだよなあ)

542 名前:デフォルトの名無しさん :2006/06/26(月) 21:10:42
>>495=>>538ということで、今回の議論はめでたく幕を閉じました。

めでたし、めでたし

543 名前:デフォルトの名無しさん :2006/06/26(月) 21:24:12
っつか、お前に聞いてないし、粗探しならよそでやってくれ

544 名前:デフォルトの名無しさん :2006/06/26(月) 21:25:49
適当な奴も多いけど、しっかりした書き込みしてくれる人もたまにいるから
2ちゃんやめられないんだよな

545 名前:デフォルトの名無しさん :2006/06/26(月) 21:42:43
例外のことで悩んでいます。

例外の効果的な使い方が今一ピンとこないため、自分が書くコードでは一切
使わないようにしています。基本的には戻り値でエラーを返して、無理な場合は
アウトパラメータを使うようにしてます。STLが出す例外はトップレベルでcatchしてます。

そんな私なんですが、Exceptional C++という書籍に、例外のことが詳しく載っていると
いう情報をWebで見ました。私は田舎に住んでるので、近所の書店にはありませんでした。
また貧乏なため気軽にネットで買うということも出来ません。

この本は買う価値がありますか?
また、内容について簡単に教えてくれたらうれしいです。

546 名前:デフォルトの名無しさん :2006/06/26(月) 21:47:13
>>545
都会の本屋にいけ

547 名前:デフォルトの名無しさん :2006/06/26(月) 22:01:58
氷のような冷たさだな。空気読めよ。
俺はその本持ってないから答えられんけど。

548 名前:デフォルトの名無しさん :2006/06/26(月) 22:07:30
>>545
amazonで中身検索できる本だから目次と一部みられるところから判断してみたら?


549 名前:デフォルトの名無しさん :2006/06/26(月) 22:08:24
>>545
基本的にはGuru of weekの内容をまとめ、
そこに出された問題の解答を著者が詳しく解説したもの。

なので、英語を読むのを厭わないなら、GoWの原典
ttp://www.gotw.ca/gotw/
を一通り読めばだいたいの内容は網羅できる。
(MoreExceptionalC++まで含めて)
細かな説明や一般的な解答が欲しければ本を買うしかないが。

550 名前:デフォルトの名無しさん :2006/06/26(月) 22:29:34
急速にスレの質が低下してまいりました

551 名前:デフォルトの名無しさん :2006/06/26(月) 22:55:44
もとからでしょ

552 名前:デフォルトの名無しさん :2006/06/26(月) 23:16:45
>>545
「例外を勉強したいならExceptional C++」という認識は正しい。
が、この本は例外を懇切丁寧に扱ってはいる
(例外の解説に1章/50ページを費やしている)が、
例外を専門に扱っているわけではない。一応勘違いがないようにってことで。
もっとも、C++の例外処理に特化した本てのはないんだけどね。

例外の章の内容は、ざっと書くと
「例外中立とは」「例外保証とそのレベル」「RAII」「やってはいけないこと」
「例外安全なコードの書き方」「テンプレートとの関わり」てな感じかな。

例外を知りたい・知る必要があって、GotW原文はちょっと... と思うなら、
十分買う価値があると思うよ。
少なくとも例外目的で他の本に手を出すぐらいならこの本を先に読むべきだろう。

あと、例外処理だけじゃなくてエラー処理も概観したいというなら、
C++ Coding Standardsもお勧め(これもあまり安い本じゃないけどね)。
エラー処理と例外の解説に1章/20ページを費やしている。
ただ、この本はC++全体を幅広く扱った本なので、手取り足取りな解説は載っていない。


553 名前:デフォルトの名無しさん :2006/06/26(月) 23:29:48
例外の基礎、良さを知りたいなら、
その辺のウェブで紹介されてるJavaの例外処理でも調べてみては?

↓こんなのとか。あんまいい例ではないが。
http://javafaq.jp/S018.html#S018-01

554 名前:デフォルトの名無しさん :2006/06/26(月) 23:37:16
>>553
全然「不測の事態」じゃないじゃんw
俺、そういう使い方嫌い。

555 名前:デフォルトの名無しさん :2006/06/26(月) 23:40:11
戻り値と例外のどっちにするかで喧嘩が起こりませんように。

556 名前:デフォルトの名無しさん :2006/06/26(月) 23:47:11
いつまでたってもnewbieは毎年発生するからね。
永遠の話題なんだと思うよ。

557 名前:デフォルトの名無しさん :2006/06/26(月) 23:53:49
そういえば、throws節(というのかな?関数宣言の後ろにくっつけるやつ)は
明記しないほうが良い(してはいけない?)というのをどこかで見て、それが
どこだったか忘れて探したけど見つからないことがあったんだけど、誰か
知ってる人いますか?


558 名前:デフォルトの名無しさん :2006/06/26(月) 23:59:14
>>557
Exceptional C++に書いてあったような気がしたが、記憶が定かではないorz

559 名前:デフォルトの名無しさん :2006/06/27(火) 00:01:57
>>557
例外仕様のことか?
アレは確か例外仕様を定義しても、守れる保証が全然ないし、
守れなかったら double fault で即死するからメリットより
デメリットのほうがでけぇよって話だったと思う。

560 名前:デフォルトの名無しさん :2006/06/27(火) 00:04:06
>>557
C++ Coding StandardsのChapter 75にAvoid exception specificationsってのがあるが
それのことじゃまいか

561 名前:デフォルトの名無しさん :2006/06/27(火) 00:08:48
>>558
項目15.の3. page59-60
索引では「例外仕様」だね

562 名前:557 :2006/06/27(火) 00:11:25
みんなありがと。
早速明日(ってもう今日か)調べてみる。

563 名前:デフォルトの名無しさん :2006/06/27(火) 00:15:28
>557
http://www.boost.org/more/lib_guide.htm#Exception-specification
http://www.gotw.ca/publications/mill22.htm

あとはここらへんとか

564 名前:デフォルトの名無しさん :2006/06/27(火) 01:18:26
http://pc8.2ch.net/test/read.cgi/tech/1142667446/
この辺に出てるURLも参考にすると良いかもしれない。


565 名前:デフォルトの名無しさん :2006/06/27(火) 01:45:05
>>545
先にEffective C++の第三版読め。

566 名前:デフォルトの名無しさん :2006/06/27(火) 10:17:12
>>554
確かに不測の事態の説明には向いてないね。ErrorとかExceptionとかRuntimeExceptionとか、
例外クラスに継承関係を作っとくと便利というのを説明したかったんだけど。

>>557
Mingwのg++限定かもしれないが、以前runtime_errorを継承したHogeExceptionというのを作って、
void hoge() throw(HogeException); というメソッドを定義したら、
catch(runtime_error)では受け取れず、catch(HogeException)でしか受け取れなくなった。
継承関係は無視されるみたいでツカエネとか思ったよ。

567 名前:デフォルトの名無しさん :2006/06/27(火) 10:30:52
>>556
ふつー、catch(runtime_error&)だろ

568 名前:デフォルトの名無しさん :2006/06/27(火) 11:05:32
>>567
挙げられてるケースでは状況が変わらないと思うよ。

569 名前:513 :2006/06/27(火) 11:31:58
>>514
>いやそういうもんじゃない。環境依存。
環境によってはconstエリアが絶対に破壊されない場合もあるのですか?
いや、何でこんなこと気にするのかって言うと、変数値以外の全ての領域をconstにすれば
どんなバグが含まれていようと落ちないプログラムが作れるのかなと妄想したもんで。
もちろん中の値は壊れたまま動きつづけるようになって使い物にならなくなるんでしょうけど

570 名前:デフォルトの名無しさん :2006/06/27(火) 11:37:35
>>569
例えば組み込み系でconst用セグメントをROMに配置する場合、破壊されないヨ

571 名前:デフォルトの名無しさん :2006/06/27(火) 11:40:54
バグの原因は、バッファオーバーフローだけじゃないだろ。

572 名前:513 :2006/06/27(火) 12:09:54
>>570
なるほど、そういう環境もあるんですね〜T。hxです。

>>571
領域を破壊するバグの一つとしてバッファオーバーフローを挙げてみました。
オーバーフローとかでも桁あふれしてもあふれた分無視とか・・・はっ
昔ファミコンでそんな動きを見たことがあるような気がしてきた。

573 名前:デフォルトの名無しさん :2006/06/27(火) 12:46:01
マリオの裏面とか

574 名前:デフォルトの名無しさん :2006/06/27(火) 12:54:07
>>572
たとえconst領域が変更できなくても
RAMにあるリターンアドレスや関数ポインタは変更され得るので
そこが狂ったときはコードでない場所にジャンプしてあぼん。
バッファオーバーフロー攻撃はこれを巧妙に改ざんして
用意したコードにジャンプさせるわけだしな。

関数ポインタはC++で仮想関数を含むクラスインスタンスを作れば
vtblとして山ほど作られるのでヒープ上でも攻撃しやすいよな。蛇足だけど。

575 名前:デフォルトの名無しさん :2006/06/27(火) 14:16:42
>>569
>もちろん中の値は壊れたまま動きつづけるようになって使い物にならなくなるんでしょうけど

プログラムの場合、そういうのを「落ちる」っていうんじゃないかな。

576 名前:デフォルトの名無しさん :2006/06/27(火) 14:19:08
いいえ、そういうのは「暴走」といいます。

577 名前:デフォルトの名無しさん :2006/06/27(火) 14:19:41
>>569
で、特定の変数領域以外すべてread onlyなプログラムにおいて、
read onlyな領域に何かを書き込もうとした場合どうするんだ?

普通なら保護例外吐いて死ぬが。

578 名前:513 :2006/06/27(火) 17:51:27
>>574
なるほど・・・要するにconst領域は安全でもconst領域への入り口が破壊される可能性があって、
入り口は必ずconstの外に必要なものって事かな。
無知だからSEのエスパー能力を働かせてみたよ(´・∀・`)間違ってそうだけど

>>577
>read onlyな領域に何かを書き込もうとした場合どうするんだ?
read onlyな領域が物理的に書き込めない環境の話なのでその質問は答えるのは無理。

>>574さんの回答で妄想は妄想のままということでケリがついたっぽいのでこの辺で退場しまふ。

579 名前:デフォルトの名無しさん :2006/06/27(火) 18:45:25
c/c++で
zipファイルを解凍するライブラリって何がよろしいですか?

580 名前:デフォルトの名無しさん :2006/06/27(火) 18:48:02
OS

581 名前:デフォルトの名無しさん :2006/06/27(火) 18:48:38
orz
OSは?

582 名前:579 :2006/06/27(火) 18:58:15
OSは、Windowsです
ごめんなさい><

583 名前:デフォルトの名無しさん :2006/06/27(火) 18:59:36
zlib

584 名前:デフォルトの名無しさん :2006/06/27(火) 19:18:49
>>574
関数ポインタはC++で仮想関数を含むクラスインスタンスを作れば
vtblとして山ほど作られるのでヒープ上でも攻撃しやすいよな。蛇足だけど。
↑のあたり説明してるサイトない?
dlmallocとかでの関数ポインタの書き換え攻撃は知ってるけど、
vtblを利用したのは初耳だ。おせーてくれ

585 名前:デフォルトの名無しさん :2006/06/27(火) 19:19:31
質問です
こういうコードを書くとアクセス違反で例外が出されるようです

CFoo *pFoo=0; // ヌルポ
pFoo->foooo(); // メンバ関数にアクセス

そこでこのようにtryブロックで囲んでみたのですが、catch(...)でキャッチ出来ません
なぜでしょうか?catch(...)はどんな例外でも捕まえられると思っていたのですが違うのでしょうか
また、アクセス違反の例外はcatch(?) の?の部分に何と書けば捕まえられるのでしょうか?
どうかお願いします

try{
  CFoo *pFoo;
  CString str = pFoo->m_str;
}catch(...){
  printf("catch sita");  
}

586 名前:585 :2006/06/27(火) 19:20:33
間違えた、下のはこうです
try{
  CFoo *pFoo;
  pFoo->foooo();
}catch(...){
  printf("catch sita");  
}


587 名前:デフォルトの名無しさん :2006/06/27(火) 19:25:32
>>585
環境はVC2005かg++だと思うんだがこいつらはWindowsのSEHをC++のEHでcatchできない。

588 名前:デフォルトの名無しさん :2006/06/27(火) 19:29:53
>>587
ありがとうございます
SEHとEHの違いを良く分かって居ないようなのでもう少し勉強してみます


589 名前:デフォルトの名無しさん :2006/06/27(火) 19:35:06
zlibってパスワード付のZIPって無理なんですか?
対応してるのってあります?

590 名前:デフォルトの名無しさん :2006/06/27(火) 19:39:23
スレ違い

591 名前:デフォルトの名無しさん :2006/06/27(火) 19:47:55
>>589
標準C++以外のライブラリの相談なら、環境依存スレなどへどうぞ。

592 名前:デフォルトの名無しさん :2006/06/27(火) 20:39:09
>>587
一応書いておくと、Visual C++ 2005でも/EHa使えば、SEHをcatch (...)で捕まえられる。

>>588
基本的にcatchで捕まえられる例外は、誰かがどこかでthrowした例外だけと思え。

593 名前:デフォルトの名無しさん :2006/06/27(火) 21:09:23
class A
{
private:
struct B { int i; };
public:
B& hoge() { return b_; }

private:
B b_;
};

A a;
a.hoge().i = 0; // ここ

A::Bはprivateなのですが、VC++2003ではエラーになりませんでした。
これは言語的に正しいのでしょうか?
正しいのだとしたら、どう解釈したらいいのでしょうか?

594 名前:デフォルトの名無しさん :2006/06/27(火) 21:19:33
内部へのハンドルを返すAが悪いって事で



595 名前:デフォルトの名無しさん :2006/06/27(火) 21:24:59
「海水がしょっぱいのはなぜか」という質問に
「飲むな」と答えるほど的外れな回答。

596 名前:デフォルトの名無しさん :2006/06/27(火) 21:28:53
というレスが的外れなわけだけど、的外れを指摘する的外れレスって
指摘すると必ず怒り出すんだよね。
さあ困った。

597 名前:デフォルトの名無しさん :2006/06/27(火) 21:29:52
          ,. ---=ニニ==、
        ,.-ヲミ´         \
      ///イ           ,.-ヽ
     ////イ´          イ´⌒ヽ
    ,.イノ//彡     ,.-⌒`ヽ  / /匁、
   /三三三   /   ィ刄、    ー'´ Y
   !三三三彡    ィf‐―'´ ヽ   ヽ、 乂
   ト三三彡イ    ´      ノ  、 r )  ハ ヽ
   `トミ三三ネ、        ゝ '´      ', )
   (ヽ、三ト、川         ,.ィ ´ ̄ラソ  !
    Y⌒厂ソ )ノ!      ( f―ニニ‐'    !
   /.///| | 人_        ヽ `ー―'   ,'
  { !| | | ト、く へ )               /
  / ///// ハ _,イく`、          _.ノ(
  |(//////////ハヽ \`ー―、   ̄ ̄ ,. ハ
  ))ノ///////ノヽヽヽ \    ̄ ̄ ̄ ̄ヽ  \

       ハージ・マッターナー [Herge Mattuner]
           (1941〜1999 アメリカ)

598 名前:デフォルトの名無しさん :2006/06/27(火) 21:31:26
>>595-596
どっちも同罪

599 名前:デフォルトの名無しさん :2006/06/27(火) 21:35:50
public, private, protected などは識別子の可視性を制御するだけであって、
その識別子によって定義される対象の可用性を制限するわけではないから。

ですよね

600 名前:デフォルトの名無しさん :2006/06/27(火) 21:36:01
C++ カプセル化 でグーグルといいお

601 名前:デフォルトの名無しさん :2006/06/27(火) 21:37:58
頭の悪い議論ばかりしてると、本当に頭が悪くなっちゃいますよ(^^;

602 名前:デフォルトの名無しさん :2006/06/27(火) 21:38:53
基底クラスのprivateなtypedefを
派生クラスでpublicにする時もそうなんかな

603 名前:デフォルトの名無しさん :2006/06/27(火) 22:56:34
struct B { int i; }; という記述は、
class B{ public: int i; }; と等価だから、

いいんじゃねーの?言語的に。

変数 i は public だし。
メソッド hoge も public だし。

604 名前:デフォルトの名無しさん :2006/06/27(火) 23:02:14
この場合Bの可視性は影響しないって事?

605 名前:デフォルトの名無しさん :2006/06/27(火) 23:20:35
Bの可視性とは関係ないって事。

606 名前:デフォルトの名無しさん :2006/06/27(火) 23:24:49
つうかAは実際Bを隠蔽してないよな

607 名前:デフォルトの名無しさん :2006/06/28(水) 00:11:09
C++ Primer について質問したいことがあります。

このたび第三版を読み始めたんですが、P67あたりに、
メンバ変数名はアンダーバーで始めるのが普通である
(第二版まではメンバ変数の取り扱いに set get を使っていたが実は効率が悪いことが判明した)、
というような一節がありました。これがいまいちピンと来ません。

メンバ変数名が m_value で値の取得は getValue() の様にするのが常識だと思っていたのですが
この本が言わんとしてるのは

class num
{
private:
 int _value;
public:
 void value( int NEW_VALUE ); // 値の書き込み
 int value(); // 値の取得
};

という感じでメンバ関数をオーバーロードしてクラスを作れということなんでしょうか?

普段こんな感じでコード書いてる方っていらっしゃいます?

608 名前:デフォルトの名無しさん :2006/06/28(水) 00:31:41
名前の隠蔽でんでんがあるから_つけろって俺は覚えてたけど
俺間違ってるな・・・

609 名前:デフォルトの名無しさん :2006/06/28(水) 00:50:15
>>607
釣りか? 釣りなのか!?
>>608
でんでん・・

610 名前:デフォルトの名無しさん :2006/06/28(水) 00:58:12
>>607
統一されていれば好きな物(コーディング規約で指定されている場合は指定されているもの)を使えばいいだけの話。
m_XXX / getXXX()が常識ということは一切ないから、変な誤解はしないように

611 名前:デフォルトの名無しさん :2006/06/28(水) 00:58:20
>でんでん
もしかして: うんぬん

612 名前:デフォルトの名無しさん :2006/06/28(水) 01:05:33
>>607
データメンバ名とget-set系メンバ関数名の話に限らず、
命名はスタイルの問題なんで「これが普通」とか「これが常識」といった
普遍的なものはない。自分の手に馴染むものを選べばいいんでは。

というか俺ルールを初心者に刷り込むのはどうかと…
まあ変に悩ませないって点ではいいのかもしれんが。


613 名前:デフォルトの名無しさん :2006/06/28(水) 01:06:42
>>608-612
レスありがとうございます。
しょうもない質問してすいませんでした

614 名前:608 :2006/06/28(水) 01:11:23
>でんでん
class B
{
public:
void v(){puts("めがっさ");}
};

class D :public B
{
public:
int v;
};

D d;
d.v(); //error

こんなの。こういうの避けるために_つけると思ってた
ごめん。>>607とまったく関係ないわ。すまん。マやめる。

615 名前:デフォルトの名無しさん :2006/06/28(水) 01:11:38
アンダーバーを先頭につけてはいけません。


616 名前:デフォルトの名無しさん :2006/06/28(水) 01:23:30
>>607の例なら問題はないけどな
無用な混乱を避けるためにも、アンダーバーを避けるか、
末尾につけるようにするのが妥当か

617 名前:デフォルトの名無しさん :2006/06/28(水) 02:16:14
>>614
別にやめなくてもいいにょろ

618 名前:デフォルトの名無しさん :2006/06/28(水) 02:20:50
>>585
ぬるぽに -> した時点で未定義動作。何が起こるかわからない。
移植性に価値があるのなら catch(...) で問題が検出できると思わないほうがいい。

619 名前:デフォルトの名無しさん :2006/06/28(水) 02:24:27
アンダーバーを先頭につけるのは、予約されてなかったっけか?

620 名前:デフォルトの名無しさん :2006/06/28(水) 02:45:27
>>619
グローバル名前空間での識別子として予約されてる。
どっかのスコープの中では宣言しても衝突しないことになる。
だからといって使っていいかというと、混乱の元なのでやめたほうがいい。

621 名前:デフォルトの名無しさん :2006/06/28(水) 02:50:32
しかもアンダーバーの次が大文字だと、グローバルスコープかどうかに関わらず予約されていたり、
色々面倒な規則があるしな。
中にはマクロでスコープを無視してくるお行儀の悪い実装もあるし、
使わないに超したことはないっていうだけ。
でも先頭に付けた方が見やすいっちゃ見やすいんだよな。

622 名前:デフォルトの名無しさん :2006/06/28(水) 15:23:19
アンダーバーの次が小文字ならOKだお
17.4.3.1.2に明記されているし、GoF本でも使っている。
メンバに m_ なんか付けるより、よっぽどクールだお!

…と、周りに説明するのに疲れたので、最近は諦めてる。

623 名前:デフォルトの名無しさん :2006/06/28(水) 16:07:57
単に人望が無いだけだろう

624 名前:デフォルトの名無しさん :2006/06/28(水) 16:13:18
人望でコードスタイルは変える気は起きないなあ
コーディング規約でも作って義務化しないと

625 名前:デフォルトの名無しさん :2006/06/28(水) 17:29:40
void mf( int _value );
こんなことやってる俺はダメ?w

626 名前:デフォルトの名無しさん :2006/06/28(水) 17:48:08
後ろに付ければ問題ないのに、何で前に付けるんだろう?

627 名前:デフォルトの名無しさん :2006/06/28(水) 17:52:39
武勇伝武勇伝、武勇伝伝ででんでん♪

628 名前:デフォルトの名無しさん :2006/06/28(水) 17:57:13
>>629
そうしてる(してた)のをどこかで見たからで、後ろ派より前派が多かったんでしょう。
あくまでも、その人が見た範囲でだけど。

629 名前:デフォルトの名無しさん :2006/06/28(水) 18:04:24
サフィックスは認識しづらいしな

630 名前:デフォルトの名無しさん :2006/06/28(水) 18:44:27
メンバ変数にサフィックスもプレフィックスも使わない俺は少数派?

631 名前:デフォルトの名無しさん :2006/06/28(水) 18:54:06
>>630
どうやってメンバと非メンバを区別してるの?

632 名前:デフォルトの名無しさん :2006/06/28(水) 19:04:19
this->foo
foo

633 名前:デフォルトの名無しさん :2006/06/28(水) 19:08:55
そのスタイルは昔2,3回見たことがあるけど、最近は見ないな。
今見ると何となくPHPっぽくも見える。

634 名前:デフォルトの名無しさん :2006/06/28(水) 19:53:00
うおっまぶしっ

635 名前:デフォルトの名無しさん :2006/06/28(水) 20:42:46
>>631
最初が小文字ならローカル
大文字ならメンバっておれのコードは見難いですかそうですか

636 名前:デフォルトの名無しさん :2006/06/28(水) 21:38:42
変数名に大文字は抵抗ある

637 名前:デフォルトの名無しさん :2006/06/28(水) 21:48:46
g_number とか変数名のソース読む気になれん

638 名前:デフォルトの名無しさん :2006/06/28(水) 21:49:14
それ以降はこちらでどうぞ
http://pc8.2ch.net/test/read.cgi/tech/1149986051/

639 名前:デフォルトの名無しさん :2006/06/28(水) 21:55:55
命名規則とかインデントとか議論すると、不毛な宗教論争に発展するのは目に見えているのに……。
といいつつ自分も晒し

//空白を空けて、typename(classはどうしても必要なテンプレートテンプレートパラメータにしか使わない)
template < typename T >
class Foo //クラス名の先頭は必ず大文字。
{
private : //デフォルトに頼らず宣言しておく。
  int x_ ; //メンバ変数には、アンダーバーを末尾につける。
} ;

//関数名の先頭は小文字。
//K&R形式のインデントは、個人的に嫌いなので使わない。
void func( Foo const & val ) //やはり、空白を入れる。
{
  int x ; //セミコロンの前にも空白を入れる。
  x = 1 + 1 ; //演算子の間にも空白を入れる。
}

640 名前:デフォルトの名無しさん :2006/06/28(水) 21:57:56
突っ込みたいけど突っ込まないぞ!釣られないぞ!
コーディングなんとかスレってあったよね、そっちいけばいいんじゃない?

641 名前:デフォルトの名無しさん :2006/06/29(木) 01:00:12
>>639 OK. 特定した。

642 名前:デフォルトの名無しさん :2006/06/29(木) 01:07:50
>>639
珍しいスタイルだな。

643 名前:デフォルトの名無しさん :2006/06/29(木) 06:37:29
>>639の心の声:「この俺のすばらしいコーディングスタイルを見れば、みんな絶賛せずにはいられないハズだ。」

644 名前:デフォルトの名無しさん :2006/06/29(木) 06:51:24
みんなの心の声:「キモ杉wつか自己顕示欲丸出しでウザイ」

645 名前:デフォルトの名無しさん :2006/06/29(木) 06:58:51
皆の心の声:「ふーん」

646 名前:デフォルトの名無しさん :2006/06/29(木) 07:27:41
スタイルの善し悪しはスレ違いだから何とも言わないが
(個人的には空白の開けすぎで見辛いように思える)

> typename(classはどうしても必要なテンプレートテンプレートパラメータにしか使わない)

classがどうしても必要になるテンプレートパラメータってなんだ?
templateの仮引数中ではtypenameとclassは同義じゃねーの?

647 名前:デフォルトの名無しさん :2006/06/29(木) 07:30:39
>>646
template<template<typename>class U>
class A{};

648 名前:デフォルトの名無しさん :2006/06/29(木) 07:47:20
>>647
ああなるほど。
「typenameの代わりにclassを使わなければいけない場合がある」と勘違いした。

649 名前:デフォルトの名無しさん :2006/06/29(木) 08:52:17
>>648
いや、>>647のclassの場所にtypenameは使えない。

650 名前:デフォルトの名無しさん :2006/06/29(木) 08:59:33
class A
{
int b;
public: A( const int i )b(i){};
};

constで受け取って、constじゃないのに入れるっておかしい?
いまいち、constの有効利用法が解らないんですが・・・

651 名前:デフォルトの名無しさん :2006/06/29(木) 09:05:21
>>650
とりあえず散歩して来い。川の堤防の上とかジョギングするのもいい。
とにかく一度頭をリセットするんだ。

652 名前:デフォルトの名無しさん :2006/06/29(木) 09:06:51
>>650
その場合、const int iはコンストラクタ中でiが不変であることをコンパイラに伝える意味しかない。
#つまり、間違ってコンストラクタ中でiに代入することを防止するということ。
別に渡す側にとっては何の関係もない。

653 名前:デフォルトの名無しさん :2006/06/29(木) 09:10:58
あとコンパイラの最適化がしやすくなるかも
(といっても、最近のコンパイラは賢いから、変わらない事も多いけど)

654 名前:デフォルトの名無しさん :2006/06/29(木) 10:57:13
>>650
参照渡しとコピー渡しとプリミティブタイプあたりの関係を勉強した方がいいと思う。

655 名前:デフォルトの名無しさん :2006/06/29(木) 17:37:56
>>650
C++全体でいうと、constはオブジェクトが不変であることを表明するというという
使い方がある。仮引数にconstを付ければ、そのメンバ関数内ではその引数の
オブジェクトは不変だし、メンバ関数にconstを付ければ、そのメンバ関数呼び出しで
オブジェクトが変わらないことが保障される。
constなメンバ関数から、constでないメンバ関数は呼べない(コンパイル出来ない)から、
知らないところでオブジェクトがいつの間にか変わっているということがない。

656 名前:デフォルトの名無しさん :2006/06/29(木) 17:41:46
ただし、メンバ変数をmutableで宣言するとconstなメンバ関数内でも変更可能になる。
この効果的な使い方は・・・ググって。

657 名前:デフォルトの名無しさん :2006/06/29(木) 17:43:29
ひとつ言い忘れた。
constなオブジェクトからはconstなメンバ関数しか呼べない。
意味的に不変であると宣言したオブジェクトは、コンパイル出来ないという
物理的な壁でもって、不変であることが保障される。

658 名前:デフォルトの名無しさん :2006/06/29(木) 17:53:34
constを変数につけるのに意味がある場合は、char*とか参照で渡す場合に意味がでるって感じですか?
あと演算子のオーバーロードとか。
ビット的定数性と概念的定数製も読みましたけど、これが必要と思えない...


659 名前:デフォルトの名無しさん :2006/06/29(木) 18:01:32
mutableが必要になる場面はたまーーーにあった。
constなメソッドが要求されるのだが、メンバ変数を変更したいとき(そのままやん)。

概念的普遍性が必要になったことはないが、必要な人は必要なんだと思う。

660 名前:デフォルトの名無しさん :2006/06/29(木) 21:31:38
クリティカルセクションがメンバにある場合に使った事ある。

661 名前:デフォルトの名無しさん :2006/06/29(木) 21:32:34
クラス内にキャッシュ機構を持たせる時に使いました

662 名前:デフォルトの名無しさん :2006/06/29(木) 22:38:07
漏れはそのオブジェクトが描画済みかどうかのフラグだけ
外に出したくなかったんでmutableにしたことあるな。

663 名前:デフォルトの名無しさん :2006/06/29(木) 22:58:28
パフォーマンスや統計情報を測定するためのメンバ変数の書き換えとかで使いました。

664 名前:デフォルトの名無しさん :2006/06/29(木) 23:02:20
テストでstubクラスを作ったときに、constなメンバ関数で内部情報を更新するために使いました。

665 名前:デフォルトの名無しさん :2006/06/30(金) 00:02:14
mutable なんて知らなかった…
thisポインタをキャストしてたよ。

mutableって何と読むの?ミュテーブル?

666 名前:デフォルトの名無しさん :2006/06/30(金) 00:04:42
>>665
ttp://dictionary.goo.ne.jp/search.php?mode=0&IE=sjis&type=sleipnir&MT=mutable&kind=ej&ej

667 名前:デフォルトの名無しさん :2006/06/30(金) 00:06:56
mutableを使ったら、彼女ができました。
本当にありがとうございました。

668 名前:デフォルトの名無しさん :2006/06/30(金) 00:10:48
mutableでガンが治りました。

669 名前:デフォルトの名無しさん :2006/06/30(金) 00:13:34
次はexport使えばお金持ちになるよ。

670 名前:デフォルトの名無しさん :2006/06/30(金) 00:18:00
constについては、C++ FAQ Liteに、const correctnessって章があるから読んでみるといいかもね。
ttp://www.parashift.com/c++-faq-lite/const-correctness.html

671 名前:デフォルトの名無しさん :2006/06/30(金) 00:21:19
>>669
exportを使ったら、
物凄くマイナーな国の通貨と、
物凄くマイナーなジャンル(ピザデブ)の彼女ができました。

672 名前:デフォルトの名無しさん :2006/06/30(金) 01:15:37
>>666
いや、日本語読みを知りたいんだが…

673 名前:デフォルトの名無しさん :2006/06/30(金) 01:16:49
>>672
普通にミュータブル

674 名前:デフォルトの名無しさん :2006/06/30(金) 01:31:45
>>673 ありがとん!

675 名前:デフォルトの名無しさん :2006/06/30(金) 01:52:55
std::map<double, hoge*> var;
var[1.] = new hoge;

ってするとして、varはdestructorでどうやって扱えばいいの?

676 名前:デフォルトの名無しさん :2006/06/30(金) 01:56:22
for (std::map<double, hoge *>::iterator it = var.begin();
it != var.end(); it++) delete it->second;
これでおかたずけかな

677 名前:デフォルトの名無しさん :2006/06/30(金) 02:01:09
まあ、そのうち面倒になって
std::map<double, boost::shared_ptr<hoge> > var;
とかやりだすんだが。

678 名前:675 :2006/06/30(金) 02:11:29
>>676
やっぱそうやるしかないのか。
ありがとう。
>>677
そのうち。

679 名前:デフォルトの名無しさん :2006/06/30(金) 02:45:04
C++ではあるクラスのコンストラクタから同じクラスの別のコンストラクタは呼び出せない
とCマガのバックナンバーに書いてありました
しかし

#include <iostream>
#include <string>

class Base {
  Base() { Base("aaa"); }
  Base(std::string message) { std::cout << message << std::endl; }
};

int main(void) {
  Base b;
  return 0;
}

とするとちゃんとaaaと表示されます
どういうことなの?

680 名前:デフォルトの名無しさん :2006/06/30(金) 02:53:54
>>679
言語仕様で呼び出すことが禁止されているわけではない。
コンストラクタの実行中はまだthisポインタが確定していない。
その状態で別のコンストラクタを呼び出した際の動作は未定義。

だいたいの処理系ではthisがヘンな値を指したままBase(std::string message)が呼び出されるけど
その例ではthisを一切必要としていないから、”たまたま“うまく動いているように見えるだけ。

thisを必要とする処理、たとえばメンバ変数への代入なんかをするとアウト。

681 名前:デフォルトの名無しさん :2006/06/30(金) 03:01:27
>>679
Base("aaa") という式は Base() で初期化中のオブジェクトに対して
Base(string) を呼び出しているわけではなく、 Base(string) によって
初期化された Base 型の一時オブジェクトを得ることになる。
デストラクタにも出力を置いて試してみるといい。出力には this も加えると
わかりやすいだろう。

>>680
どこから出たデマだ?

682 名前:デフォルトの名無しさん :2006/06/30(金) 03:04:37
>>680
コンストラクタの中から普通にメンバ関数呼べるわけだし、
this がないわけないだろ。
仮想関数は Base のものになっちゃうが。

683 名前:デフォルトの名無しさん :2006/06/30(金) 03:13:40
>>682
確かにメンバ関数呼び出しもコンパイルできるし、 this も有効な値を持っているが、
コンストラクタの中では初期化が完了していない状態だということには気をつける必要がある。

684 名前:デフォルトの名無しさん :2006/06/30(金) 03:18:29
メンバ変数への代入が出来ないコンストラクタって・・・

685 名前:デフォルトの名無しさん :2006/06/30(金) 03:21:11
>>683
コンストラクタの実行中はコンストラクトは完了していない。
もったいぶって書くほどのことか?

686 名前:デフォルトの名無しさん :2006/06/30(金) 06:56:54
>>661,663
そうか
mutableを使えばいいのか
ありがとう


687 名前:デフォルトの名無しさん :2006/06/30(金) 07:13:02
うん?
bを生成中に、一時オブジェクトを生成しただけだろ。
コンストラクタ(だけ)を呼び出しているわけではないと思うのだが。

688 名前:デフォルトの名無しさん :2006/06/30(金) 13:20:07
>>679
そのデフォルトコンストラクタは、
Base() {
 Base unused("aaa");
}
とほぼ意味だから。

コンストラクタで、別のコンストラクタを呼び出すには、
Base() {
 new (this) Base("aaa");
}
みたいに、配置newを使うしかない。ただ、コレを使うと
初期化リストとか怖いことになるかもしれないので注意

689 名前:デフォルトの名無しさん :2006/06/30(金) 14:15:54
>>679
↓こうしたことと同じ。コンストラクタ内の一時変数ができるだけ。
Base(){
  Base hensu("aaa");
} // ← 変数hensuが解放されて終わり。

デストラクタ(this->~Base())みたいに、this->Base("aaa")で呼べればいいのにとか思ったんだけど、
コンストラクタってクラスメソッドと同じ扱いっぽいから無理みたいだね。

690 名前:デフォルトの名無しさん :2006/06/30(金) 14:16:45
>>683
何がいいたいのかさっぱりわからん

691 名前:デフォルトの名無しさん :2006/06/30(金) 15:15:18
vector <struct TAG>は出来ますが、
vector <classのTAG>はどうなんでしょう?

性能うpするにはclassよりstruct?

692 名前:デフォルトの名無しさん :2006/06/30(金) 15:27:54
>>691
何か根本的な勘違いをしてる

693 名前:691 :2006/06/30(金) 15:32:50
いや、根本的な勘違いしてると思ってなければ事故解決するさ。

std::vectorでstructは今まで使ってたけど、
classにしたらどうなるか教えてでつ。

694 名前:デフォルトの名無しさん :2006/06/30(金) 15:39:16
>>693
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00117.html
つまりclassにしても変わらない

695 名前:デフォルトの名無しさん :2006/06/30(金) 15:41:46
質問です。

ヘッダファイルなどで
class CHoge;
と書いておくと、CHogeはクラスなのだと認識してくれるので、その下で
CHoge* pHoge;
なんて書いてもOKですよね。(実際にCHogeのclass定義などが後に存在していたとしても)

それと同じ理屈で、
enum HOGE
{
 TEST=0
};
と「後に宣言される」HOGEを認識させることはできないでしょうか?

イメージ的には
enum HOGE; // HOGEはenumですよと宣言
HOGE hoge; // HOGE型を生成

//実際にはその下のほうでHOGEの中身を定義
enum HOGE
{
Test=0
};
です。
enumは所詮intなので、可能そうかなと思うのですが…。

696 名前:デフォルトの名無しさん :2006/06/30(金) 15:43:36
できません

697 名前:デフォルトの名無しさん :2006/06/30(金) 15:48:11
enum のサイズは、その含んでる値を元に、
処理系依存に決定されるんだったはず。
だから、サイズが分からないという扱いになって、無理。

698 名前:デフォルトの名無しさん :2006/06/30(金) 16:17:32
>>696-697
すばやいお返事ありがとうございます。
残念。ダメですか。
enumの分割宣言とかできたらよかったのですけど…。

仕方ないのでint変数として作ることにします。
ありがとうございました。

699 名前:デフォルトの名無しさん :2006/06/30(金) 16:59:05
質問させててください
"特定のクラスにだけ継承を許す"というクラスは作成できるでしょうか

全ての関数が純仮想関数なインターフェースクラス(以下IClass)を定義したのですが、
他の人は、そのインターフェースクラスを継承するのではなく
それの一部に機能を実装したベースクラス(以下BClass)を継承してもらいたいのです

friend登録の逆思想で、IClass側に「私はBClass以外には継承されない」と制限をかけさせることはできないでしょうか

700 名前:デフォルトの名無しさん :2006/06/30(金) 17:06:27
>699
コンストラクタをprivateにしてfriendすれば?

701 名前:デフォルトの名無しさん :2006/06/30(金) 17:08:13
そこまでしてIClassを作りたいのはどうしてなのでしょうか?>>699


702 名前:デフォルトの名無しさん :2006/06/30(金) 17:11:49
> friend登録の逆思想で
自分でここまで書いてて答えにたどりつけないところがすごいな
つか、概念的にインターフェースじゃないよな、そのクラス


703 名前:デフォルトの名無しさん :2006/06/30(金) 17:20:46
>>700あ、なるほど。ありがとうございます。

>>701
IClass.hの更新はもうない(ようにしている)のですが、BClassの更新(変数の追加)はまだまだありそうなのです。
変数の増減の度に、この.hを読み込んでいる全ファイルがリコンパイルというのはよろしくないなと思いまして。

704 名前:デフォルトの名無しさん :2006/06/30(金) 17:43:20
思いっきり pimpl の適用事例に読めるなぁ

705 名前:デフォルトの名無しさん :2006/06/30(金) 17:55:45
>>704
ありがとうございます。pimplというのは聞いたことのない単語でしたが、調べたところ実に今回の解決にマッチしそうでした。
導入をテストしてみたいと思います。

706 名前:デフォルトの名無しさん :2006/06/30(金) 18:04:51
今この質問に答えててふと思ったんだが、ClassはCHoge。InterfaceはIHoge。
じゃあabstractクラスはみんなどうしてる?
AHogeか?
ハンガリー使わないって意見は別問題として。

707 名前:デフォルトの名無しさん :2006/06/30(金) 18:11:07
CHoge。

708 名前:デフォルトの名無しさん :2006/06/30(金) 18:24:34
実体が作れないのにCHogeって気持ち悪くね?

709 名前:デフォルトの名無しさん :2006/06/30(金) 18:27:25
俺はIHogeにするかな。

710 名前:デフォルトの名無しさん :2006/06/30(金) 18:38:56
インターフェースクラスってのは、少しでも実装が書いてあったらダメなのかね?
virtualじゃない(オーバーライドしないことを前提とした)実装が書いてあってもよさそうなもんだけど。

711 名前:デフォルトの名無しさん :2006/06/30(金) 18:48:32
>>706
インターフェイスにはI付けるけど、
クラスにはC付けない派。もちろん抽象クラスにも付けない。

712 名前:デフォルトの名無しさん :2006/06/30(金) 19:09:05
>>710
インターフェースを提供するクラス、って意味だから、
共通のインターフェースを提供してさえいれば、
実装の有無はあまり関係ないと思ってるが。
Javaのinterfaceは位置づけが微妙だな

713 名前:デフォルトの名無しさん :2006/06/30(金) 19:12:38
別問題を承知で ハ ン ガ リ ー 使 わ な い

714 名前:デフォルトの名無しさん :2006/06/30(金) 19:25:21
>710
つNVI

virtualが一切無いけど、
protectedなメンバ変数を利用してインターフェイスを名乗らせたりもした。

715 名前:デフォルトの名無しさん :2006/06/30(金) 19:26:03
>>713
だよな、やっぱり逆ポーランドじゃないと。

716 名前:デフォルトの名無しさん :2006/06/30(金) 22:09:16
最近、目がぼやけてポーランドとボーランドの区別がつきにくくなってきた。

717 名前:デフォルトの名無しさん :2006/06/30(金) 22:13:31
ABCにだけIを付ける。
Cは一切付けない。

718 名前:デフォルトの名無しさん :2006/07/01(土) 01:46:37
WinFX のネーミングルールでは、
インターフェースには I を付けるべきだが、
クラスには C 付けんな。ってどっかに書いてあった気がした。
あとアンダースコアも使うなとか。

ところでWinFXってなに?外国為替証拠金取引か?って感じだが。

719 名前:デフォルトの名無しさん :2006/07/01(土) 07:35:35
>>718
WinFXはWin32APIの置き換えとなるはずだったもの。
今では、置き換えされず、名前も単に.NET Framework 3.0になることが決定済み。

720 名前:デフォルトの名無しさん :2006/07/01(土) 08:18:55
>>716
昔から、MSゴシック/MS明朝とも、濁点と半濁点の区別、付けづらいよな。
その点Macで使われてたOsakaは区別付けやすかったんだが、
そのMacも最近を標準フォントをヒラギノに替え、
やはり濁点と半濁点を区別しづらくなった。

721 名前:デフォルトの名無しさん :2006/07/01(土) 21:38:51
#include <list>

class Hoge{
int* pointer;
public:
Hoge( int n ){ pointer = new int(n); }
//Hoge( const Hoge& hoge ){ pointer = new int(*hoge.pointer); }
~Hoge(){ delete pointer; }
};

int main(){
{
std::list<Hoge> list_hoge;
list_hoge.push_back( Hoge(777) );
}
return 0;
}

実行するとスコープを外れた時に、メモリのエラーが出ます。
コメントアウトしてあるコピーコンストラクタを有効にすれば問題は無いのですが、
それよりlistに挿入する度に、一回コピーが発生するのがどうにも無駄で。

実体ではなくポインタのリストにすれば良いのは分かるのですが、
管理の手間を省くために出来れば、実体のリストにしたいところです。
このままの形式で、挿入時にコピーを発生させずに済む方法があれば、教えて頂けないでしょうか。

722 名前:デフォルトの名無しさん :2006/07/01(土) 22:12:16
pointerを共有可能なスマートポインタにする

723 名前:デフォルトの名無しさん :2006/07/01(土) 22:15:55
>>721
>実体ではなくポインタのリストにすれば良いのは分かるのですが、
>管理の手間を省くために出来れば、実体のリストにしたいところです。
boost::ptr_list

boost::shared_ptr <Hoge>をlistに入れるとか


724 名前:デフォルトの名無しさん :2006/07/01(土) 22:22:05
しかし折角のlistが、実質的にほとんど
iterator->func() ではなく
(*iterator)->func()
みたいな記述になっちまうのは、妙な話だよな

725 名前:デフォルトの名無しさん :2006/07/01(土) 22:37:07
>>724
ptr_listにすれば前者の書き方でいけるだろ

726 名前:デフォルトの名無しさん :2006/07/01(土) 22:45:17
>>725
ああいや、スタンダードなのにこれか、みたいな

727 名前:デフォルトの名無しさん :2006/07/01(土) 23:24:36
ptr_listがあるだろ。

728 名前:721 :2006/07/01(土) 23:26:05
皆さんありがとうございます。
ということは実体でlistを使うと言うことはほとんど無いんですかね。ちょっと不思議な感じもしますが。
boostの使用も検討してみます。

729 名前:デフォルトの名無しさん :2006/07/01(土) 23:28:53
>>727
いやだからptr_listはSTLじゃないだろ、くどいな

730 名前:デフォルトの名無しさん :2006/07/01(土) 23:29:16
STLのコンテナはすべてコピーベースです

731 名前:デフォルトの名無しさん :2006/07/01(土) 23:52:17
>>729
ptr_listがあるだろ、くどいな

732 名前:デフォルトの名無しさん :2006/07/02(日) 00:00:03
そういやshared_ptrはC++0xに盛り込まれるけど、pointer containerはどうなるんだろう?

733 名前:デフォルトの名無しさん :2006/07/02(日) 00:04:55
>>731
どこでもboostが使えると思うなよw

734 名前:デフォルトの名無しさん :2006/07/02(日) 00:05:18
shared_ptrをコンテナにぶっこめばいいから要らないんじゃね?

735 名前:デフォルトの名無しさん :2006/07/02(日) 08:39:56
>>724
boost::indirect_iteratorもある。

736 名前:デフォルトの名無しさん :2006/07/02(日) 09:32:36
>>735
おおboostにもあったか!


737 名前:デフォルトの名無しさん :2006/07/02(日) 10:26:24
>>735
ptr_listがあるだろ

738 名前:デフォルトの名無しさん :2006/07/02(日) 11:17:19
皆で特定の何かの評価をしているのに、〜もあるだろって奴が増えたな
関係ないがコピーベースって言葉、初めて聞いたな

739 名前:デフォルトの名無しさん :2006/07/02(日) 11:21:42
>>738
環境によるだろ。
俺はVC6で極力Boostを使用するようにして使っているが、
例えばVC8を使っても使わない時と比べ10K個ほどしか「〜もあるだろ」が増えない。

740 名前:デフォルトの名無しさん :2006/07/02(日) 11:25:06
1万個も増えるのか

741 名前:デフォルトの名無しさん :2006/07/02(日) 11:32:26
たった1まんこじゃねーか
もっとよこせ

742 名前:デフォルトの名無しさん :2006/07/02(日) 13:11:37
#ifndef UNIT0_H
#define UNIT0_H

namespace Unit0 {
//クラス、関数宣言
}
using namespace Unit0;

#endif

こんな感じでヘッダファイル内の宣言を丸ごとnamespaceで囲んで問答無用でusingするのって問題ありますか?

743 名前:デフォルトの名無しさん :2006/07/02(日) 13:15:40
何のためにnamespace Unit0で囲ったの?


744 名前:デフォルトの名無しさん :2006/07/02(日) 13:18:31
問題あるなし以前にそういうことをする動機を聞きたいものだが

ソースファイル内なら十分意味があると思うが
そちらに関しても普通は無名名前空間を使うのが筋だし

745 名前:742 :2006/07/02(日) 13:20:08
使い回しの別のコンパイル単位とクラス名とか被った時の保険です。(*‘ω‘*)

746 名前:デフォルトの名無しさん :2006/07/02(日) 13:33:52
>>741
お前、「年齢=彼女が居ない期間」だろ?
1まんこで十分だ、沢山あってもウザイだけだぞ。

747 名前:デフォルトの名無しさん :2006/07/02(日) 13:54:18
>>745
using namespace Unit0;
これをヘッダじゃなくてソースファイルに書くようにしたら?


748 名前:デフォルトの名無しさん :2006/07/02(日) 14:31:27
>>745
Unit0::hoge;
べた打ちが吉と視た。

749 名前:デフォルトの名無しさん :2006/07/02(日) 16:28:45
質問なんですが、双方向リスト構造でソートを行う場合、理想的なソート方法はなんでしょうか?

750 名前:デフォルトの名無しさん :2006/07/02(日) 16:32:03
まあ、某Win32用アプリケーションフレームワークで実際にこんな使われかたしてるので‥‥(*‘ω‘*)

#ifndef SystemHPP
#define SystemHPP

namespace System
{
//ここに宣言
}/* namespace System */
using namespace System;
#endif// System



■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.