1 名前:デフォルトの名無しさん (ワッチョイ 3b96-ov1m) mailto:sage [2017/07/29(土) 11:28:28.97 ID:o30VDF4g0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part130 mevius.2ch.net/test/read.cgi/tech/1490917669/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.100【環境依存OK】 echo.2ch.net/test/read.cgi/tech/1478440682/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) - VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
454 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 10:24:10.68 ID:DHTk7O50d.net] 全くその通りだよね ポインタ滅ぶべしとか思ってるのかも知れないけど、初心者はまずイテレータを理解してその後 ポインタを学べば良いなんてプロセスは効果的とは限らないし、個人的には無理があると思う。
455 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 10:46:40.85 ID:8V5/tdJ10.net] C++使ってて初心者は隠蔽された中身を理解しなくていいとか本気で思ってる奴いるのかよ それにイテレータはポインタのような操作ができるインターフェイスなのでポインタを理解してることは前提となっている
456 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 12:26:30.87 ID:+APqOuiHM.net] 逆だよ。初心者は隠蔽された中身を理解しなくていい範囲と使うべき。 初心者に教えるときも注意しなきゃいかん。
457 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 12:41:58.03 ID:aPsP1NJ+d.net] >>443 イテレターを使う上で、ポインタを知らないと何が問題?
458 名前:デフォルトの名無しさん [2017/08/31(木) 12:45:17.10 ID:JYM1pg890.net] 「あたかもポインタのように振る舞うオブジェクト」を使うにあたって そもそもポインタを知らないことの何が問題か本気でわからないのか?
459 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 14:20:58.17 ID:+APqOuiHM.net] イテレーターのコンセプト、理解してる? ポインタのように振る舞う、じゃないよ。
460 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 14:38:31.89 ID:BoCBvGLq0.net] イテレーションすることを目的にしてるけど、 ポインタもイテレータの機能を持ってるからポインタを想像するとわかりやすいっていうのはある。
461 名前:デフォルトの名無しさん [2017/08/31(木) 15:09:44.78 ID:JYM1pg890.net] >>447 どっかから引用したわけじゃないんで そういうフレーズにはなってないだろうなあ ポインタの使い方に
462 名前:、イテレータの使い方を似せてあるのは 誰の目にも明らかなんだが、おまえだけ違うのか? 重箱の隅でない説明がもしできるなら拝聴したいぜ [] [ここ壊れてます]
463 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 15:25:08.02 ID:8V5/tdJ10.net] ポインタに似せるというコンセプトではないので、ポインタと同じ構文で操作できてもポインタとは何の関係もありませ〜んwwww そんな話してねえだろコミュ障か?
464 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:21:10.10 ID:N6KLaE+9M.net] イテレータの使い方がポインタの使い方に似せてある…? もしかして、イテレータの意味わかってないんじゃないか??
465 名前:デフォルトの名無しさん [2017/08/31(木) 16:22:24.21 ID:JYM1pg890.net] あ、ふじこったw そのザマ見て気が済んだ
466 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:48:47.10 ID:8V5/tdJ10.net] >>451 はいはい イテレータはポインタの操作方法と互換性がある ただし静的配列やvectorで使われているランダムアクセスイテレータはすべての操作をサポートしているが、それ以外ではサポートしていない操作もあるので注意 とまで補足を入れたらいいんだろ 配列の話をしていたはずなのにアスペはすぐ話の腰折るから困る
467 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:53:43.88 ID:DHTk7O50d.net] むしろ初心者ほど中身を知りたがるもの。 イテレータなんて実装が隠蔽されてるわけじゃなし、知った上で抽象化したらこうなるってのが妥当な方向だ。 コンパイラがやる最適化等とは別の話だ。
468 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:55:03.46 ID:DHTk7O50d.net] だいたいポインタの理解なんて義務教育レベルだしな。
469 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 16:55:37.94 ID:+APqOuiHM.net] >>450 初心者に教える、つう前提を無視するなよ。アホか? なんで初心者にイテレーター教えるのにポインタが必要なんだよ。説明してみろ。
470 名前:デフォルトの名無しさん [2017/08/31(木) 17:03:23.95 ID:JYM1pg890.net] さあねえ 俺はポインタを知らんやつにイテレータを教えたことがない それを馬鹿にしたければするがいい じゃあ、あんたはどうやって教えたのか、こっちが聞きたい
471 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 17:29:30.90 ID:8V5/tdJ10.net] >>456 その場でイテレータを使うだけなら必要ないが、それでは何故か動くおまじないになるだけ マンツーマンじゃあるまいし基礎を理解していない者に教えるのは疲れるし両者にとって不毛だ 複雑な実装のイテレータを理解しろともコンピュータの仕組みを理解しろとも言ってないし キーワードだけ見つけて何がなんだか分からない助けてくれと言う前に簡単な基礎からやれという指摘はおかしいか?
472 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 17:43:42.94 ID:N6KLaE+9M.net] >>453 ちがうちがう イテレータっていうのは繰り返しの抽象化だから、ランダムアクセスだのなんだのってのはおまけ ポインタっていうのはアドレスに少し機能を付け加えたもの リストのイテレータはリストのポインタと関係ないが、リストの特別版である配列のイテレータは配列のポインタと互換がある だから、イテレータの操作とポインタの操作に互換があるというのは間違えてる 人に教える前にデータ構造について一から勉強しなおしたほうがいいのでは?
473 名前:デフォルトの名無しさん [2017/08/31(木) 17:59:29.96 ID:JYM1pg890.net] ポインタに限ったことではなく、イテレータでもハンドルでも 「何が」「どこにある」という情報を持つもの、という概念を説明するとき ポインタが最も直接的な実装となっているので 具体的なアドレス値を図に書いて説明できるし 復習するにも実測値でその図を書いてみることができるし デバッガでも関係性を追ってみることが出来る ++で何をどう増やしているのか、比較とはどういうことかも 実測値から直感しやすい そして、それで憶えたことがvectorのイテレータでならとりあえず通用する そこからlistだとかistream_iteratorだとかへと差分学習で進めば楽だし algorithmもポインタさえ知ってればとりあえず使えて そこからまた差分学習でイテレータで使う場合を憶えれば楽という経験則 何か間違っているかね?
474 名前:デフォルトの名無しさん [2017/08/31(木) 18
] [ここ壊れてます]
475 名前::04:14.09 ID:JYM1pg890.net mailto: 誰かさんみたいに、ちがうちがうと自分の繊細さに酔うやつが 学習者の思考を丹念に潰しやる気を削いでいく有害な騒音源となる 語学の先生にもいるだろ? [] [ここ壊れてます]
476 名前:はちみつ餃子 mailto:sage [2017/08/31(木) 18:05:11.71 ID:Ev17QaWq0.net] イテレータはポインタに似せたというよりは、部分的にポインタと共通のインターフェイスに抽象化されたものであって、 C にも有ったポインタという機能と新しい機能を無理なく (?) 統合するアイデアでしょ。 だから、どちらが先にありきと言えるものではないけども、 大抵の C++ 入門書だと時代的に早く出現したポインタを先に説明するのが一般的だと思うし、 初心者がその流れに沿わない学習をしているのだとしたら 体系的に学ぼうとせず場当たり的に調べてるんじゃないのと疑うって話じゃないかな。 前提がちゃんと出来上がってない人の質問にきちんと答えるのは無理だよ。 だからこれとこれを先にやった方がいいよっていうのは誠実な回答だよ。
477 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 18:10:20.20 ID:8V5/tdJ10.net] >>459 マジでアスペか 実用上どのように使うかって話をしてるのに、聞いてもいないのに一人で勝手に賢いイテレータの定義の話をしている お前は>>412 と>>419 と>>422 を100回読んでから入門サイトでどんな説明をしてるか見てこい 俺はその上で質問者のやろうとしていることは、ポインタを操作することと同じなのでまずポインタを理解してくれと言っている
478 名前:デフォルトの名無しさん [2017/08/31(木) 18:24:58.66 ID:JYM1pg890.net] >>462 は? イテレータは少なくとも1993年以後にできたもので ポインタはBにもあったもので、どちらが先にありきは明白だ イテレータの設計にあたりポインタを意識しなかったなんて珍説を唱えるには膨大な説明がいると思うが おまえやってみるか?
479 名前:デフォルトの名無しさん [2017/08/31(木) 19:01:39.56 ID:JYM1pg890.net] 33e4-p7enの主張が二転三転していて何が言いたいのかわからん
480 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:05:47.57 ID:Him+FUnNM.net] std::optionalもアクセス構文が同じだから、使うにはポインタの知識が必要なのかな
481 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:07:29.54 ID:+APqOuiHM.net] >>463 必要なのは配列とインデックスと有効範囲だけだろ。ポインタを説明する必要は無い。
482 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:17:27.06 ID:8V5/tdJ10.net] >>467 使うために必要かどうかではない ポインタはC++を使う上で知ってて当たり前 ID:95r+Hm0D0 みたいに添字しかわかんねえと言われたらお前はそれよりもポインタからだとなる
483 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:20:33.91 ID:JJLmvwvW0.net] もうやめてくんない? 誰もイテレータの成り立ちなんて興味ないのよ
484 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:20:55.53 ID:Ce9FMcgb0.net] 好きな順で覚えればいいよ
485 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:27:09.07 ID:+APqOuiHM.net] 初心者に配列管理を説明するのにわざわざポインタ持ち出すな、つうてんの。そういう事言ってるから老害なんだよ。 range-based forを説明した方がよっぽど有益だわ。
486 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:33:38.32 ID:N6KLaE+9M.net] >>460 もちろんvectorを例にイテレータとポインタをまとめて教えるのは一つの手段として有りだと思うよ ただ、何度も書いてる通りポインタとイテレータは独立した概念だから、その差分学習は論理必然じゃない 現に、俺は学部時代に授業でプログラム習ったときは、vectorのような連続領域じゃなくlistのような抽象リストで習ってるし ポインタはCの授業で、アドレスの抽象として習ってるし、イテレータはデザパタの本で知ったからね どの学び方がいいかは人それぞれなんだろうけど、独立した概念を一緒だよとか変な方便使うのは間違ってると思うよ
487 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:34:33.87 ID:N6KLaE+9M.net] >>471 まぁ今ならコレだな
488 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:47:11.97 ID:oD4Vxh+n
] [ここ壊れてます]
489 名前:M.net mailto: >>471 に一票 [] [ここ壊れてます]
490 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 19:58:01.09 ID:8V5/tdJ10.net] >>471 この意見はさすがに論外だわ ポインタは難しいものでもややこしいものでもないから、ちゃんとした読み物があれば問題なく理解できる 難しいなら後回しにしてもいいならわかるが、最初から教えないというのは学習の機会を奪っているとさえいえる
491 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 20:02:22.38 ID:4TB5IpyN0.net] >>443 はげどう >>444 言語選ぼうよ;; >>445 イテレータはポインタの概念を引きずってゐる プログラムの動作を簡明に表すという意味では 配列の構文さえあれば十分なのに、 ※ 個人の感想です
492 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 20:04:46.13 ID:Ce9FMcgb0.net] 老害が多いな ソフトをやるならアセンブラからとか言いそうな勢い
493 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 20:08:55.54 ID:4TB5IpyN0.net] 尤も、C++の配列とか要素型であるクラスの継承とか多態性を表現しきらん欠陥品ではあるのだが (インターフェースの配列はポインタの配列としてやるしかない;; それゆえにやっぱC++で入門するなら中身知っとけと、
494 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 20:10:07.84 ID:Y1zUatWId.net] >>475 あなたに教えを請う人がいれば、あなたが教えたいように教えたらいい
495 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 20:11:27.89 ID:g5ZfiDra0.net] >>478 STLはテンプレートライブラリだから、動的なポリモーフィズムにガッツリ対応してないのは当然だし、 そーいうのがほしけりゃ自分で書けばいいだけ
496 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 20:17:41.92 ID:4TB5IpyN0.net] >>480 左様動的なポリモーフィズムにガッツリ対応したコンテナクラスのテンプレートを 曲がりなりにもかけるようになってからがC++の入門編 抽象化された上位レイヤーの知識だけあれば詳細は知らなくて良い、というのは 漏れのない抽象化が達成された後のみ通用する話だが ずんねんながらC++はそうではないし言語の性格上っ今後とも永遠にそうはならない
497 名前:デフォルトの名無しさん [2017/08/31(木) 20:25:29.52 ID:SvYtbMXE0.net] >>471 その有益というrange-based forを説明してくれよ。
498 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 21:08:08.63 ID:iFrEf/VH0.net] >>482 そこは流石にググれよ
499 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 21:11:56.48 ID:DEelFUhW0.net] このなげぇクソはいつ終わるんだ
500 名前:デフォルトの名無しさん [2017/08/31(木) 21:32:29.56 ID:SvYtbMXE0.net] >>483 悪いが馬鹿老害は黙っててくれないか。 若い人がせっかく説明したほうが有益だと言ってくれてるのだから。他の人も賛同してくれてる。
501 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 22:00:17.40 ID:Tmpts49Ar.net] 期待を裏切らない>>474
502 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 22:12:11.60 ID:Ce9FMcgb0.net] みんな、ちゃんとアセンブラから勉強しろよwww
503 名前:はちみつ餃子 mailto:sage [2017/08/31(木) 23:18:28.91 ID:Ev17QaWq0.net] >>464 いや、もちろん意識してるだろ。 そう書いたつもりだけど、どこをどう読んだんだ?
504 名前:デフォルトの名無しさん [2017/08/31(木) 23:19:12.52 ID:JYM1pg890.net] >>471 おまえさ、じゃあ配列の添字は何だと思っているわけ? 「どこにある」という情報をもつもの、という点で同じだぞ だから for(i = first ; i != last; ++i) において first や last や i が 整数であろうがポインタであろうがイテレータであろうが 同じ論理が通用するんだろうがよ ポインタで範囲外アクセスこくような大馬鹿者が 整数ならそんなことないとでもぬかすのか?
505 名前:デフォルトの名無しさん [2017/08/31(木) 23:24:55.90 ID:JYM1pg890.net] >>472 おまえC++やCよりも前に何かやってただろ 俺だってC++をCより先に憶えたクチで そんな真似ができたのはアセンブラ使いだったからな 間接の概念をまっさらから憶えるのに イテレータは無駄に難しいマゾプレーだつってんだ ポインタわかっててもハンドルで悩むやついるくらいで それに輪を掛けて++まであるのがイテレータであって
506 名前:デフォルトの名無しさん [2017/08/31(木) 23:27:04.06 ID:JYM1pg890.net] >>4
507 名前:88 悪かったよ そのようで [] [ここ壊れてます]
508 名前:デフォルトの名無しさん [2017/08/31(木) 23:32:03.77 ID:SvYtbMXE0.net] >>471 まだ説明してないのか。説明頼むよ。キミが言い出したことなんだよ。
509 名前:デフォルトの名無しさん mailto:sage [2017/08/31(木) 23:40:32.47 ID:y40vazij0.net] (void*以外の)ポインタ自体も生のアドレス概念からは抽象化されている。 指されるオブジェクトの型やサイズを持っているんだからね。 それをさらに(ある方向に)抽象化したものがイテレータなんであって、そのように段階を追って 抽象化されていくストーリーを語るのは初心者向けにも有意義だと考える。
510 名前:はちみつ餃子 mailto:sage [2017/08/31(木) 23:59:46.91 ID:Ev17QaWq0.net] イテレータに限らないけど抽象化されたものは抽象化されたままで扱わないと抽象化した意味がなくて、 (内部の実装を意識しなきゃならないのなら抽象化の甲斐が無い。) 一方では、その抽象化を作る側になることもあるので抽象化が出来上がるまでは抽象化の内側も知ってなきゃいけない。 つまり、層を積み重ねるたびに抽象化の壁を作っていくってのがプログラムを構成する基本的なやり方だろう。 だから、プリミティブな方から積み重ねながらその抽象化が意味するところを学ぶってのは普通の方法だと思う。 そういう意味で >>493 に賛成。 抽象化の内側を知ってしまった人が抽象化の壁の向こうを忘れて抽象化されたものとしてだけ 扱うってのはそれなりにセンスがいるんじゃないかとも思うんだけど、 C/C++ の背景にあるセマンティクスは良くも悪くも機械の理屈なんで、 どうあがいても高級アセンブラだと割り切って泥臭いポインタの側から学ぶのがいいと私は思うよ。 その泥臭いところを頑張って隠してるのが C++ ってもんなんで、 泥臭いところを知ったら C++ の色んな機能が「あー、こういうの欲しかったわー」ってなってありがたみを感じる。
511 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 00:30:44.48 ID:oWX+X4Ay0.net] ストラウストラップが言うにはC++は 低レイヤーにアクセスできる機能とオーバーヘッドが無く使いやすいように隠蔽できる機能を持っている言語というようなことを言っていて 低レイヤーの部分を知らなくていいとは言っていない
512 名前:デフォルトの名無しさん mailto:sage [2017/09/01(金) 01:02:22.22 ID:E+DzN2Xf0.net] アセンブラの代替言語なのだから当たり前だ。用途もOSやドライバ、マイコン向けばかりだ。 COBOL、FortranやPerl、C#やJavaの代わりに使う人などいない。 低層を隠蔽する機能などお呼びではない。
513 名前:デフォルトの名無しさん [2017/09/01(金) 02:01:03.59 ID:2msaHTP30.net] いやCOBOLの代わりには使うぞ Fortranの代わりつーとCな客はいたねえ
514 名前:デフォルトの名無しさん [2017/09/02(土) 16:34:51.42 ID:Vkplowcj0.net] opencv.jp/cookbook/opencv_img.html#image-resize ここのソースコードをコピペしてコンパイルしようとしたのですが 関数 `cv::Mat::release()' 内: test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): `cv::Mat::deallocate()' に対する定義されていない参照です collect2: error: ld returned 1 exit status このようなエラー文が出てしまいます 使っているOSはdebian stretchです /usr/include/opencv2には必要なファイルはありました どのようにコンパイルすればいいのでしょうか
515 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 16:50:32.70 ID:8FAKxNXu0.net] 環境依存すれってなくなったの?
516 名前:片山博文MZ mailto:sage [2017/09/02(土) 16:53:40.92 ID:bEjlZdoBd.net] >>498 ライブラリをリンクする。
517 名前:片山博文MZ mailto:sage [2017/09/02(土) 17:01:02.17 ID:bEjlZdoBd.net] >>500 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]2ch.net mevius.2ch.net/test/read.cgi/tech/1500329247/
518 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 17:02:35.03 ID:8FAKxNXu0.net] ないすー。
519 名前:デフォルトの名無しさん [2017/09/02(土) 17:03:12.44 ID:Vkplowcj0.net] >>501 すみませんでした こっちで質問してみます
520 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 18:03:57.34 ID:qkqtxzLpd.net] c++に限った話じゃないんだけど参考書 とかだとメソッドの後にフィールドが 書かれてる事が多いようだけど、それが 一般的なの?
521 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 18:45:42.87 ID:qDvIb2f40.net] ちがう 一般的にはフィールドたるメンバ変数の方が先に来る 学習の都合で、メンバ変数を先に説明した方が、どう考えてもラク メンバ関数を先に説明すると、入門書を読むレベルの初心者は間違いなく混乱するので、そんな参考書はまず見かけない そもそもメソッドの中で使う変数は始めに宣言しておかないと使えない 結論としてはあなたが用語の取り違えをしてる……としか
522 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 19:04:41.89 ID:4lafg32N0.net] クラスのレイアウトの話じゃなくて?
523 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 19:23:47.80 ID:FGRVT/X40.net] レイアウト、というとデータの並び順の意味にとられかねず語弊がある
524 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 19:28:16.32 ID:4lafg32N0.net] じゃあ宣言の順序
525 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 19:57:46.29 ID:l0rE+2Xa0.net] public、protected、privateの順に書いていくと 自然と変数はpublic関数の次に来るわ
526 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 21:02:43.47 ID:EU1kDRi00.net] 普通アクセス修飾子の順じゃなくてフィールド→メソッドの順じゃないの カプセル化するから変数なんてほとんどprivateだろうし 変数は変数でまとめて書いてもらわないと混乱する
527 名前:デフォルトの名無しさん [2017/09/02(土) 21:08:20.92 ID:Wuw432Mc0.net] ユーザーにとって重要な項目から順に書く つまり、public→protected→privateで ユーザーに見せる必要のないprivateは一番下で
528 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 21:13:48.77 ID:FGRVT/X40.net] 変数の宣言と関数の宣言の順序がどうでも良いのは自明 メンバ関数の定義がメンバ関数内で使用するメンバ変数の宣言に先行する場合も実験する限り合法 (規格に具体的にどういう文言で規定してあるのかは知らん まあ定義時点で不完全な型やら値やらはテンプレートの定義で頻出するから あんま定義と宣言の順序にこだわらない処理系の作りなのだと納得しておく しかしなぜかテンプレートの引数でない型の定義(または宣言)と使用には厳格な順序を求められる… 次のコードはビルドが通らない class Baz { // struct Bar; // 左のコメントアウトを外したら逝ける void foo(Bar& b); struct Bar { int x, y; } }; 多分Cとの互換性のために仕様がワケワカメになった例
529 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 21:17:46.72 ID:RAQSA3Kg0.net] ルールが存在してwell documentedで、ガバナンスがきいていることが重要 お前らのオレオレ哲学なんかどうでもいい
530 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 21:19:59.11 ID:EU1kDRi00.net] ああそっか、プロトタイプ宣言しなきゃいけないんだっけC++は C#の脳で考えてたわ
531 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 21:51:57.26 ID:MiX3UcgLr.net] >変数の宣言と関数の宣言の順序がどうでも良いのは自明 自明かねぇ C++11は問題になる例が思いつかないがC++98,03,14はどうでも良くない
532 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 22:01:20.86 ID:VLpwNclp0.net] コンストラクタ実行時のメンバ変数の初期化の実行順が、初期化子の記述順ではなくクラス定義での並び順に従うっていうのがあった気がするけど、新しい規格では変わったんだっけ?
533 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 22:10:24.95 ID:pFkNGMyF0.net] >>516 うそーん、初期化子の記述順>クラス定義の並び順だと思ってた。 てか、宣言の並び順は無関係? そら、警察官も道行く江添さんに聞きたくもなるわw
534 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 22:21:28.04 ID:MiX3UcgLr.net] >>516 微妙な表現以外、特に変わったという話は聞いたことがない C++03 12.6.2/5 Then, nonstatic data members shall be initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers). C++20 draft 15.6.2/(13.3) Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).
535 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 22:37:32.53 ID:i6uhqYA10.net] >C++11は問題になる例が思いつかないがC++98,03,14はどうでも良くない とか書いてるから何か制約が無くなるような変更があったのかと思って聞いたんでない?
536 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 22:39:43.42 ID:FGRVT/X40.net] ちな漏れがどうでもよい(どんな順序でも問題ない)と言ったのは 変数の宣言と関数の宣言の順序(どちらを先にするか)だからな これ豆な
537 名前:デフォルトの名無しさん mailto:sage [2017/09/02(土) 23:00:05.29 ID:MiX3UcgLr.net] C++11でもこれがあったか struct A { int m; decltype(m) /*←mは先に宣言が必要*/ f() { return m; /*←mは後でもいい*/ } }; C++11で緩和されたのは11章のどっか(忘れた)
538 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 15:24:44.62 ID:5WRYI1ZX0.net] static メンバ関数と friend 関数の使い分けについて教えてください どちらも似た機能だと思ってしまうのですが‥
539 名前:はちみつ餃子 mailto:sage [2017/09/03(日) 15:42:16.65 ID:XXf7E2cS0.net] あ〜、そんなこと考えたことなかったけど、クラス (メンバ関数) 内部から見たら近いっちゃ近いのかも? クラスを定義する側じゃなくてそのクラスを使う側の気持ちで考えて。
540 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 15:47:48.54 ID:5WRYI1ZX0.net] friend 関数は public で,static メンバ関数は private で,て感じでこの前は書きました 普通はどうするものかをお聞きしたいところです
541 名前:はちみつ餃子 mailto:sage [2017/09/03(日) 15:55:23.63 ID:XXf7E2cS0.net] すまんけど自明すぎてどう使い分けるとか説明できない。 使い分け以前にそもそも理解できているか怪しいと思う。
542 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 16:12:00.06 ID:5WRYI1ZX0.net] 何度も宣伝するようで気が引けますが,前に書いたのは >>158 演算子のオーバーロードに絡むものは基本 friend で,内輪で使うものは private の static メンバ関数で, くらいの線引きをしています. 書いてみてわかったのは「自明」という感じはしないこと,かな,考えてみれば friend 関数って他の言語にはなさそうです
543 名前:デフォルトの名無しさん [2017/09/03(日) 16:48:05.14 ID:jXGwZqzU0.net] 何で? operatorはグローバルに出さなくても多重定義候補に挙がるぞ 俺は別の理由でoperatorをグローバルにする傾向があるが
544 名前: mailto:sage [2017/09/03(日) 17:05:16.51 ID:5WRYI1ZX0.net] >>527 codepad.org/8Z3c2obA ほー,これは不思議だなあ‥ friend をはずすとコンパイルできない friend をつけてしまうと public に置こうが private に置こうが関係ない,という認識であっていますか?
545 名前:デフォルトの名無しさん [2017/09/03(日) 17:23:08.48 ID:jXGwZqzU0.net] 何が不思議? friendを外すとメンバoperator+に過剰な仮引数となりエラー friendは「メンバではない」のでアクセス指定は無関係 1点だけ気になるのが、friendは当該クラス自体と同じスコープに新しい識別子を導入しないはず・・・ 識別子はoperator+で、これのみは某か標準のヘッダで既に宣言されているということか?
546 名前: mailto:sage [2017/09/03(日) 17:29:26.39 ID:5WRYI1ZX0.net] >>529 >operator+に過剰な仮引数となりエラー つまり operator+ の >>528 とは違うもう一つの呼び出し書式にしないといけないわけですね. でもこの場合は private に置くとコンパイルできない codepad.org/RLo9fKuI friend はアクセス制御如何にかかわらず「強引にpublic にする」ように見えますね‥わからない‥
547 名前:片山博文MZ mailto:sage [2017/09/03(日) 17:31:44.96 ID:zmbOaeS6d.net] friendなら、その人のプライベートにアクセスできる。それだけの意味。
548 名前:片山博文MZ mailto:sage [2017/09/03(日) 17:33:29.06 ID:zmbOaeS6d.net] ある人のfriendなら、その人のプライベートにアクセスできる。
549 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 17:36:12.98 ID:5WRYI1ZX0.net] >>531 >>522 をどうかよろしくお願いいたします.
550 名前:デフォルトの名無しさん [2017/09/03(日) 17:39:19.97 ID:jXGwZqzU0.net] >>530 強引にpublic・・・で憶えやすいならそれでいいんじゃね? ちな俺の憶え方はメンバでないものをどうやってprivateにするんだ、だ
551 名前:片山博文MZ mailto:sage [2017/09/03(日) 17:40:51.54 ID:zmbOaeS6d.net] あるクラスX内部のstaticでpublicな関数fは、Xのインスタンスの存在に関係なくX::fという名前でアクセスできる。 あるクラスX内部のfriendな関数gは、X内部のプライベートなメンバーm_aにアクセスできる。
552 名前:デフォルトの名無しさん mailto:sage [2017/09/03(日) 17:42:36.39 ID:5WRYI1ZX0.net] >>534 確かに friend 関数は「メンバーじゃない」ですか‥main() と同じような普通の関数なわけですね‥
553 名前:デフォルトの名無しさん [2017/09/03(日) 19:02:31.58 ID:jXGwZqzU0.net] friendは他のクラスのメンバかも知れない そういうときも俺の憶え方なら動揺せずに済む
554 名前:デフォルトの名無しさん [2017/09/03(日) 19:05:08.53 ID:/S0gLPFy0.net] メンバ関数より、メンバでもfriendでもない関数を使おう って誰かが言ってた