■過去ログ置き場に戻る■
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.