1 名前:デフォルトの名無しさん (ワッチョイ f37a-QmV0) mailto:sage [2017/03/31(金) 08:47:49.65 ID:UkLjKqcm0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part129 echo.2ch.net/test/read.cgi/tech/1483940967/ このスレもよろしくね。 【初心者歓迎】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
75 名前:デフォルトの名無しさん (アウアウイー Sa97-lIlP) mailto:sage [2017/04/08(土) 17:54:16.17 ID:8P1QJwbCa.net] ↓みたいに、相互参照するstaticなデータを初期化するときはどうするのよ? こういうのは、CとC++で互換性あるコードは書けんのかね? #include <stdio.h> st
76 名前:ruct A { char *s; struct A *p; }; static struct A a[]; static struct A b[] = {{"1st in b[]", a}, {"2nd in b[]", a+1}}; static struct A a[] = {{"1st in a[]", b}, {"2nd in a[]", b+1}}; int main(){ printf("%s, %s\n", a[0].s, a[0].p->s); printf("%s, %s\n", b[1].s, b[1].p->s); return 0; } [] [ここ壊れてます]
77 名前:デフォルトの名無しさん (ワッチョイ 36a3-D6lx) mailto:sage [2017/04/08(土) 18:22:48.95 ID:lscI+aDp0.net] 前方宣言の方のstaticを削りゃいいんじゃね?
78 名前:片山博文MZ ◆T6xkBnTXz7B0 (スフッ Sd92-+G+c) mailto:sage [2017/04/08(土) 18:29:35.52 ID:QtLPEhOXd.net] static変数を別の翻訳単位から参照するのはおかしいんじゃね? 俺だったらexternにするぞ。
79 名前:デフォルトの名無しさん (ワッチョイ 72cc-n0J+) mailto:sage [2017/04/08(土) 20:50:02.31 ID:N0c155CY0.net] K&RならC勉強していた女子社員にやったわ 姉貴が蛍光ペンで目茶苦茶にしてくれたからもう要らなかったんけどねw
80 名前: ◆QZaw55cn4c (ワッチョイ beff-rt0y) mailto:sage [2017/04/08(土) 21:28:14.31 ID:gcfXcmks0.net] >>71 lib や *.o を単独で配布して,そのヘッダを書くとき(lib/o の中に静的変数がある)ときは,extern はないと困るだろうな,とは思う extern 不要論を連呼するキチガイがいるらしいから,注意したほうがいい
81 名前:デフォルトの名無しさん (ワッチョイ be14-4Usw) mailto:sage [2017/04/08(土) 21:34:09.29 ID:ATd5Gv2i0.net] でも実際extern からアクセスしろってライブラリは見たこと無い 普通関数じゃね?
82 名前:デフォルトの名無しさん (ワッチョイ 72cd-8Vmj) [2017/04/08(土) 21:38:17.52 ID:J+fRzcYw0.net] クソライブラリを使うときにexternないと困るな
83 名前: ◆QZaw55cn4c (ワッチョイ beff-rt0y) mailto:sage [2017/04/08(土) 21:39:43.39 ID:gcfXcmks0.net] >>80 例えば <cstdio> の FILE *stdout とか 外部のライブラリの中の静的変数へのプロトタイプとして FILE *stdout; て書くと多分そのモジュールに stdout が確保されてしまうんじゃないかな? 関数は int f(); だけで実体がないのだったらプロトタイプだとわかるけれども 変数は実体を伴うのか参照なのかを区別できない気がする 関数だけ提供するライブラリが存在するのは理解できる
84 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/08(土) 21:56:34.32 ID:LBU0hU+r0.net] >>75 つ__cplusplus
85 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/08(土) 23:26:49.13 ID:TFmwEDa6r.net] externの必要性をとうとう理解してしまったQ それに対し相変わらずコミュ障のもう一人のクソコテ
86 名前:デフォルトの名無しさん (アウアウイー Sa97-lIlP) mailto:sage [2017/04/08(土) 23:36:29.56 ID:8P1QJwbCa.net] >>83 #ifdef __cplusplus #define _static #define _extstatic extern namespace { #else #define _static static #define _extstatic static #endif _extstatic struct A a[]; _static struct A b[] = {{"1st in b[]", a}, {"2nd in b[]", a+1}}; _static struct A a[] = {{"1st in a[]", b}, {"2nd in a[]", b+1}}; #ifdef __cplusplus } #endif まぁ、確かにこんだけ書けばCでもC++でも無警告でコンパイル通ったけど、 まぁ面倒ですこと(゚д゚)!
87 名前:デフォルトの名無しさん (ワッチョイ 7f8c-7E04) mailto:sage [2017/04/08(土) 23:39:18.99 ID:bfo0YVHI0.net] >>85 わざわざc使わなくてもc++だけでよかでしょ?
88 名前:デフォルトの名無しさん (ワッチョイ cf7a-02AM) mailto:sage [2017/04/09(日) 00:00:11.10 ID:cP8aqgv30.net] Cでも使いたい人には自分でラッパー作ってくれと言ってるわ
89 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 00:52:09.49 ID:djBIOydUr.net] >>85 >こんだけ書けばCでもC++でも無警告でコンパイル通ったけど そんな文法違反な糞コードを「ボクのパソコンでは動いたもん」みたいに自慢されても…
90 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 01:02:23.00 ID:djBIOydUr.net] >>77 ひょっとして、もしかするとお前の頭では 「extern」=「外部リンケージ」なのか?
91 名前:片山博文MZ ◆T6xkBnTXz7B0 (スププ Sd92-+G+c) mailto:sage [2017/04/09(日) 07:01:35.78 ID:qFsmFYyfd.net] わっしょい、わっしょい
92 名前:片山博文MZ ◆T6xkBnTXz7B0 (スププ Sd92-+G+c) mailto:sage [2017/04/09(日) 07:08:55.81 ID:qFsmFYyfd.net] 自分の理解できないことを、何でもコミュ症で片付けるやつ、嫌い。
93 名前:片山博文MZ ◆T6xkBnTXz7B0 (スププ Sd92-+G+c) mailto:sage [2017/04/09(日) 07:13:22.07 ID:qFsmFYyfd.net] 言語障害って日本語があるのに、何で意味不明な略したりするのかな。臆病者だから?
94 名前: ◆QZaw55cn4c (ワッチョイ beff-rt0y) mailto:sage [2017/04/09(日) 07:31:21.97 ID:ArlDNXBP0.net] >>84 ところが C には仮定義というものがあって,仮定義しておけば静的変数を共有できるんだよ だから extern は要らない子!と主張できるんだ ここは C++ だから,仮定義が出来ない前提で話しているだけだよ 君はまだまだ浅いね
95 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 08:37:34.70 ID:djBIOydUr.net] >>93 ん?extern要らない説の根拠は(翻訳単位に閉じた)仮定義じゃなくて リンカが頑張ることだったと記憶していたのだが ひょっとしてもしかすると、アフォ?
96 名前:デフォルトの名無しさん (ワッチョイ 130e-+TA9) [2017/04/09(日) 09:10:41.09 ID:A2LIIX7y0.net] 仮定義はリンカが頑張って実現してるんだが リンカのマップ情報とか見たことないの?
97 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 09:37:03.20 ID:djBIOydUr.net] なるほど 仮定義というものが何なのか理解していないのでこういうとんちんかんな発言になるのだな
98 名前:デフォルトの名無しさん (ワッチョイ 130e-+TA9) [2017/04/09(日) 10:11:41.88 ID:A2LIIX7y0.net] それはこっちの台詞だyo
99 名前:デフォルトの名無しさん (ワッチョイ cf59-dxaC) mailto:sage [2017/04/09(日) 10:30:05.69 ID:elB46Etj0.net] 仮定義ってなんだっけ extern int a; が複数の翻訳単位にあったら勝手にaの実体が1個できるというやつだっけ; C++には無いの?(驚愕
100 名前: ◆QZaw55cn4c (ワッチョイ bf35-D1KF) mailto:sage [2017/04/09(日) 10:53:03.36 ID:Cfl4+wb20.net] >>98 仮定義はリンカにおんぶにだっこしてもらう仕様だよ extern を書かなくてもいい、というものだ 実体を持たない普通の外部変数と同じように int evil_global; とか書くだけでいい、ヘッダに extern int evil_global; と書く必要がなくなる(宣言部分での初期化はできないことに注意) いやまあ、ちょっと追いきれていないところがあって、まだ俺も浅いのはみとめるが、とりあえず C++ にはないので、みなかったことにしている 議論が続きそうだが俺は参加しないよ
101 名前: ◆QZaw55cn4c (ワッチョイ bf35-D1KF) mailto:sage [2017/04/09(日) 10:53:48.84 ID:Cfl4+wb20.net] >>94 仮定義は翻訳単位に閉じたとはいいきれないよ
102 名前:デフォルトの名無しさん (ワッチョイ bf35-D1KF) mailto:sage [2017/04/09(日) 11:04:16.30 ID:Cfl4+wb20.net] >>99 訂正するね 誤:実体を持たない普通の外部変数と同じように 正:実体を持たない外部変数であっても なんか訂正しきれていないきもするが
103 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 17:20:17.02 ID:djBIOydUr.net] >>98 >複数の翻訳単位にあったら勝手にaの実体が1個 それはQの妄想というやつで仮定義とは別 なおISO/ IEC 9899:2011では未定義動作になっているので仮に実体が一個になっても違反ではない
104 名前:デフォルトの名無しさん (ワッチョイ cf59-dxaC) mailto:sage [2017/04/09(日) 19:24:59.42 ID:elB46Etj0.net] 「仮定義」でググッたらあったわ; ttp://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devwin32/tentativedefinitions_xml.html extern、static、初期化のいずれも無しの変数宣言っぽいものが(関数外のスコープで)複数個現れたとき、 C言語規格の方が高度なことをしてくれるのか (C++では>>102 によると未定義動作とのことなので同じ結果になるかどうかは規格外の仕様に拠る。 しかし上の説明だけでは関数宣言にexternを付ける意味がまだわかんね;
105 名前:デフォルトの名無しさん (ワッチョイ f6bc-+TA9) [2017/04/09(日) 19:56:25.40 ID:9WDYOgp70.net] >>102 もはや何を言っているのかしどろもどろだな 未定義の動作は何が起きても構わないが、 その内容に依存するコードが違反かどうかもわからないクルクルパーはお気の毒
106 名前:デフォルトの名無しさん (ワッチョイ cf59-dxaC) mailto:sage [2017/04/09(日) 20:10:15.00 ID:elB46Etj0.net] いやすまん「規格外の仕様に拠る」はやや誤解して書いてたわ; 下記の通り、未定義動作を含むコードは合法には成り得ず、実行できるかもしれないが、結果は保証されない。(つまり違反 ttp://www.c-lang.org/detail/undefined_behavior.html >未定義の動作に対して,その状況を無視して予測不可能な結果を返してもよい。 >翻訳時又はプログラム実行時に,文書化された,環境に特有な方法で処理してもよい(診断メッセージの発行を伴っても伴わなくてもよい。)。 >さらに(診断メッセージを出力し)翻訳又は実行を中断してもよい。 ここで、診断メッセージ云々とか「文書化された,環境に特有な方法で処理」とは安全に実行を止めることを意味する Windowsでアプリのクラッシュ時に出てくるダイアログとか、コアダンプとかがそれにあたる
107 名前:デフォルトの名無しさん (ワッチョイ cf59-dxaC) mailto:sage [2017/04/09(日) 20:15:29.79 ID:elB46Etj0.net] ていうか最初の疑問に戻るんですが、総合すると、CでもC++でも「extern」 = 「外部リンケージ」、でおkなのでは… ただ外部リンケージの意味で省略可能だったり、 ANSI Cにおいては「仮定義」に関する仕様が追加されてるから話が複雑化したように見えているだけで、
108 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 20:16:15.29 ID:djBIOydUr.net] >下記の通り、未定義動作を含むコードは合法には成り得ず 何というか、「下記」のどこを縦読みするとそうなるんだか
109 名前:デフォルトの名無しさん (ワッチョイ f6bc-+TA9) [2017/04/09(日) 20:18:42.95 ID:9WDYOgp70.net] >>106 追加じゃなく追認な
110 名前:デフォルトの名無しさん (ワッチョイ cf59-dxaC) mailto:sage [2017/04/09(日) 20:19:44.66 ID:elB46Etj0.net] >>107 >翻訳時又はプログラム実行時に,文書化された,環境に特有な方法で処理してもよい つまり翻訳時にビルドエラーで止めても良い
111 名前:デフォルトの名無しさん (ワッチョイ cf59-dxaC) mailto:sage [2017/04/09(日) 20:34:41.52 ID:elB46Etj0.net] >>108 互いに正しく適合する「宣言」と「定義」からなるプログラムにとって「仮定義」の概念は不要なのだから、 この場合何を追認したかというと既存のソースコードにおける「extern」の誤用を追認したとしか考えられないのでは… つまり言語規格の既存の条項が「追認」されたわけではなく、あくまで条項が「追加」されたんである (多分「追認」なんて定義もされていないだろうし、
112 名前:デフォルトの名無しさん (ワッチョイ 722b-Crua) mailto:sage [2017/04/09(日) 20:52:23.27 ID:k8qrPdcw0.net] >>106 > 総合すると、CでもC++でも「extern」 = 「外部リンケージ」、でおkなのでは… ちょっと端折り過ぎかな n3797(C++14) 7.1.1 Storage class specifiers Example: static int b; // b has internal linkage extern int b; // b still has internal linkage
113 名前:デフォルトの名無しさん (ワッチョイ f6bc-+TA9) [2017/04/09(日) 21:03:07.96 ID:9WDYOgp70.net] >>110 少なくとも「externの誤用」ではない externと書かなかった場合のことについてだ
114 名前:デフォルトの名無しさん (ワッチョイ f6bc-+TA9) [2017/04/09(日) 21:04:18.72 ID:9WDYOgp70.net] 今となっては忸怩たる思いだが 俺は「追認された」張本人の1人であって
115 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 21:32:38.73 ID:djBIOydUr.net] >>109 なるほど理解した まさか>>102 から>>105 にかけて『違反』という言葉の意味ををすり替えられていたとは気付かなかった失礼
116 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 21:52:43.91 ID:djBIOydUr.net] >>110 >「仮定義」の概念は不要なのだから 仮定義が無いと通らない例が>>75 で出ているのに 不要である理由の説明も無しにいきなり結論付けられても…
117 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/09(日) 22:01:05.39 ID:djBIOydUr.net] >103 そのサイトのANSI Cの説明は多分ウソだぞ 同じ内容なはずのISO Cはそんな定義じゃないから
118 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/10(月) 14:43:46.26 ID:DheowmrF0.net] おまえら規格票くらい買うか、せめてドラフトくらい用意しろや External object definitions Semantics If the declaration of an identifier for an object has file scope and an initializer, the declaration is an external definition for the identifier. A declaration of an identifier for an object that has file scope without an initializer, and without a storage-class specifier or with the storage-class specifier static, constitutes a tentative definition. If a translation unit contains one or more tentative definitions for an identifier, and the translation unit contains no external definition for that identifier, then the behavior is exactly as if the translation unit contains a file scope declaration of that identifier, with the composite type as of the end of the translation unit, with an initializer equal to 0. If the declaration of an identifier for an object is a tentative definition and has internal linkage, the declared type shall not be an incomplete type. 今どき「ANSI C」とか言っちゃってるサイトは眉に唾してかかれ
119 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/10(月) 14:44:01.60 ID:DheowmrF0.net] EXAMPLE 1 int i1 = 1; // definition, external linkage static int i2 = 2; // definition, internal linkage extern int i3 = 3; // definition, external linkage int i4; // tentative definition, external linkage static int i5; // tentative definition, internal linkage int i1; // valid tentative definition, refers to previous int i2; // 6.2.2 renders undefined, linkage disagreement int i3; // valid tentative definition, refers to previous int i4; // valid tentative definition, refers to previous int i5; // 6.2.2 renders undefined, linkage disagreement extern int i1; // refers to pre vious, whose linkage is external extern int i2; // refers to pre vious, whose linkage is internal extern int i3; // refers to pre vious, whose linkage is external extern int i4; // refers to pre vious, whose linkage is external extern int i5; // refers to pre vious, whose linkage is internal EXAMPLE 2 If at the end of the translation unit containing int i[]; the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to zero on program startup.
120 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/10(月) 14:44:21.17 ID:DheowmrF0.net] 6.9.2 外部オブジェクト定義 意味規則 オブジェクトの識別子の宣言がファイル有効範囲及び初期化子をもつ場合,その宣言を識別子の外部定義という。 ファイル有効範囲のオブジェクトの識別子を,初期化子を使わず,かつ,記憶域クラス指定子なしか又は記憶域クラス指定子static で宣言する場合,そのオブジェクトの識別子の宣言を仮定義(tentativedefinition)という。 翻訳単位が,ある識別子に対する仮定義を一つ以上含み,かつその識別子に対する外部定義を含まない場合,その翻訳単位に,翻訳単位の終わりの時点での合成型,及び0 に等しい初期化子をもったその識別子のファイル有効範囲の宣言がある場合と同じ規則で動作する。 オブジェクトに対する識別子の宣言が仮定義であり,内部結合をもつ場合,その宣言の型は不完全型であってはならない。
121 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/10(月) 14:45:14.16 ID:DheowmrF0.net] 例1. int i1 = 1; // 定義,外部結合 static int i2 = 2; // 定義,内部結合 extern int i3 = 3; // 定義,外部結合 int i4; // 仮定義,外部結合 static int i5; // 仮定義,内部結合 int i1; // 正しい仮定義,前の定義を参照する int i2; // 前に内部結合をもつ定義があるため,結合の不一致が生じ,6.2.2 によって動作は未定義となる int i3; // 正しい仮定義,前の定義を参照する int i4; // 正しい仮定義,前の定義を参照する int i5; // 前に内部結合をもつ定義があるため,結合の不一致が生じ,6.2.2 によって動作は未定義となる extern int i1; // 外部結合をもつ前の定義を参照する extern int i2; // 内部結合をもつ前の定義を参照する extern int i3; // 外部結合をもつ前の定義を参照する extern int i4; // 外部結合をもつ前の定義を参照する extern int i5; // 内部結合をもつ前の定義を参照する 例2. 翻訳単位が int i[]; を含み,その翻訳単位の最後で,配列i が依然として不完全型をもつ場合,配列i は暗黙の初期化子によって一つの要素をもつようにされる。その要素にはプログラム開始時に0 がセットされる。
122 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/10(月) 18:45:17.26 ID:srG0I8DXr.net] N1570のリンクを貼ったら、真実を知った>>100 が傷ついちゃうかも知れないと思って遠慮してた
123 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/10(月) 23:59:41.82 ID:srG0I8DXr.net] とりあえずC++のリンケージ仕様でも投下しとくか www.open-std.org/JTC1/SC22/WG21/docs/papers/2017/ ここのN4660(C++17 DIS)の6.5節の段落3〜4あたりだな
124 名前:デフォルトの名無しさん (ワッチョイ 138f-+TA9) [2017/04/11(火) 15:06:41.62 ID:xAQ0kPvC0.net] パスいるやん
125 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/11(火) 17:53:37.33 ID:gmpvjUS3r.net] まじか じゃあ同じ内容のN4659で
126 名前: ◆QZaw55cn4c (ワッチョイ beff-rt0y) mailto:sage [2017/04/12(水) 19:45:40.04 ID:r8mKYRyu0.net] >>122 いや,だからC++の話だったら仮定義はない,って >>99 で書いたつもりだが, C++ のリンクを貼ってなにを言おうとしているの?
127 名前:デフォルトの名無しさん (オッペケ Sr57-GJ90) mailto:sage [2017/04/12(水) 22:5
] [ここ壊れてます]
128 名前:2:37.49 ID:hzellBg9r.net mailto: >>125 Cの仕様が示されたのだから次はC++での仕様が示されないと>106が可哀想ではないか スレ違いの仮定義ではなくexternの意味・リンケージとの関係が本題だったと記憶 [] [ここ壊れてます]
129 名前:デフォルトの名無しさん (ワッチョイ db57-EaKP) [2017/04/13(木) 12:41:59.49 ID:NIQ3hjXd0.net] んだね
130 名前:デフォルトの名無しさん (ワッチョイ eb00-AM0K) [2017/04/13(木) 17:14:46.56 ID:IqLxmvNO0.net] moduleが標準入りするのはいつごろよ?ついでにD言語のversionとaliasもパクって完全体になってほしいね
131 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/13(木) 18:41:48.04 ID:RdwWAERL0.net] それよりネットワーク関連を標準化しろ この際asioでも許容
132 名前:デフォルトの名無しさん (ワッチョイ 3b32-Lcy7) mailto:sage [2017/04/13(木) 21:28:48.50 ID:n9EAyVre0.net] asioとhttp系の何かつけてくれ
133 名前:デフォルトの名無しさん (ワッチョイ eb86-HE/W) mailto:sage [2017/04/15(土) 11:47:11.44 ID:BNJEkz/Q0.net] >>129-130 ネットワークライブラリを作っております 遊んでみてください、宣伝失礼しました。 https://github.com/Ichishino/subevent
134 名前:デフォルトの名無しさん (ササクッテロル Sp6f-cQmk) mailto:sage [2017/04/15(土) 11:52:21.06 ID:0ry10bQQp.net] 標準で入ってることが重要なんじゃないかなあ…
135 名前:デフォルトの名無しさん (ワッチョイ 1f6b-HE/W) mailto:sage [2017/04/15(土) 11:56:11.76 ID:JwQS3cI30.net] 炊飯器用の小さいネットワークライブラリも必要になるんじゃねえの
136 名前:デフォルトの名無しさん (ワッチョイ 0f1f-V7Gz) mailto:sage [2017/04/15(土) 12:21:35.22 ID:QXvRHshA0.net] 漁師さん用も頼む
137 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/15(土) 14:16:17.69 ID:/RNhb41k0.net] 外部ライブラリっていうだけでハードル高くなるからな 仕事で使いづらいのはもちろんとしてOSSでも使用者に各ライブラリを掻き集めてもらわないといけなくなるから最小限にしたい
138 名前:デフォルトの名無しさん (ワッチョイ 1fb2-EaKP) [2017/04/15(土) 21:37:48.57 ID:53BEnEdf0.net] 論理積で空集合になったからといって じゃあ論理和にしろと? 頭悪すぎだろ
139 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/15(土) 22:25:04.54 ID:D67U9VSC0.net] 静的型付け言語でオブジェクト指向すると 基底クラスにメソッドが集まっていく…
140 名前:デフォルトの名無しさん (ワッチョイ efa6-HE/W) mailto:sage [2017/04/15(土) 22:33:53.11 ID:uwyLFIA10.net] それはよくない兆候だよね
141 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/15(土) 23:01:12.27 ID:/RNhb41k0.net] 何故テンプレートを使わないのか
142 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/16(日) 01:51:56.03 ID:M1nx5OGg0.net] 基底クラスにメソッドが集まっていくのは仕方が無いにしても、 公開する相手別にインターフェースを分けて抽象クラスの多重継承でもしておけば 大きな混乱は避けられる 希ガス
143 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/16(日) 03:21:47.75 ID:9vBuyRLK0.net] 仕方ないか? そういう場合大抵は派生先のあのクラスとあのクラスでこれ使うから基底にいれとこうみたいになってis aじゃなくなってる気がする
144 名前:デフォルトの名無しさん (ワッチョイ 3b0d-T+tu) [2017/04/16(日) 10:05:38.55 ID:P5/zt8YK0.net] 俺も>>141 に一票かな。 基底クラスに集まって来るような関数群は、共通に使うという一点に於いてのみ意味があることが多いんだよね。 と、すると、大抵別クラスとして分離可能になるってケースが多い気が。 つまり、実はhas-aが妥当で、それどころかUMLで言うところの依存関係だけで問題ない事が多いという。
145 名前:デフォルトの名無しさん (ワッチョイ bbf4-aC3X) mailto:sage [2017/04/16(日) 13:02:22.02 ID:FhXvPItE0.net] dynamic_castは悪という間違った考え方が基底に余計なメンバ関数を実装させる原因
146 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/16(日) 13:15:07.28 ID:cLuVKvb50.net] dynamic_castが悪いのではなくdynamic_cast使いまくるようなら設計に問題があるのではないかという話なのでは
147 名前:デフォルトの名無しさん (ワッチョイ 4b3c-yJ/5) mailto:sage [2017/04/16(日) 14:09:06.37 ID:1LAAxzhm0.net] おっと、Javaを悪く言うのはそこまでだ
148 名前:デフォルトの名無しさん (オッペケ Sr6f-xkGs) mailto:sage [2017/04/16(日) 14:12:39.55 ID:kL6yOSUfr.net] 144がアスペなのは間違い無い
149 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/16(日) 14:49:30.10 ID:9vBuyRLK0.net] 144を理解出来ない146が…
150 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/16(日) 14:53:55.66 ID:M1nx5OGg0.net] 知らね ゼロから設計するならともかく、すでに出来上がった構造に仕様追加がなされた場合、 基底クラスにメソッドを追加する流れになりがち かつdynamic_castはある意味オブジェクト指向的解決手段と言えるかもしれないが、 静的型付けという枠組み(>137)から逸脱する
151 名前:デフォルトの名無しさん (ワッチョイ 1fcc-35Q+) mailto:sage [2017/04/16(日) 15:31:42.38 ID:Jwa8aGsr0.net] dynamic_cast と reinterpret_cast が本来の意味と逆だよな
152 名前:デフォルトの名無しさん (ワッチョイ bbf4-aC3X) mailto:sage [2017/04/16(日) 22:20:05.54 ID:FhXvPItE0.net] 複数インターフェース継承してdynamic_castすればいいところを、基底で取り敢えず全インターフェース重ねてなにもしない実装を定義するみたいなことが多すぎる。
153 名前:デフォルトの名無しさん (オッペケ Sr6f-xkGs) mailto:sage [2017/04/16(日) 22:47:27.74 ID:kL6yOSUfr.net] >dynamic_cast と reinterpret_cast が本来の意味と逆だよな 訳:ボクは言語障害です
154 名前:デフォルトの名無しさん (ワッチョイ 9f78-T+tu) [2017/04/17(月) 02:47:11.79 ID:/ZxvtgP60.net] >>150 いや、それもなんかおかしいだろ。
155 名前:デフォルトの名無しさん (ワッチョイ 6b3c-cQmk) mailto:sage [2017/04/17(月) 03:21:23.30 ID:GWeDXk7n0.net] 抽象から具体へのキャストって何かもやもやする SOLID原則のDIPに反するんじゃないかって気もするし
156 名前:デフォルトの名無しさん (ワッチョイ eb92-D+C1) [2017/04/17(月) 07:06:11.59 ID:D/VW2xRY0.net] 昔風の継承モデルは最近使わなくなったなあ テンプレートの方が融通性高い
157 名前:デフォルトの名無しさん (ワッチョイ 1fcc-35Q+) mailto:sage [2017/04/17(月) 07:43:02.51 ID:H8Au7WAd0.net] は?バカじゃねぇの
158 名前:デフォルトの名無しさん (ワッチョイ 9fc3-hp0W) mailto:sage [2017/04/17(月) 07:48:02.60 ID:4nIA4vL50.net] はい
159 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/17(月) 08:36:25.34 ID:R62eo4r30.net] dynamic_castするよりはそいつが該当するinterfaceを持ってるか確認するほうがマシだと思う struct scroll_interface{ virtual bool down(float value)=0; virtual bool up(float value)=0; }; struct view{ virtual scroll_interface* scrollable(){return 0;} }; struct list_view : view{ virtual scroll_interface* scrollable(){return ptr;} }; if(auto sc = view->scrollable()){ sc->down(1); } みたいな感じ
160 名前:デフォルトの名無しさん (ワッチョイ eb7a-3MbB) mailto:sage [2017/04/17(月) 08:50:40.08 ID:bqYXNS3A0.net] 非メンバ関数にできるものはvariant使った方がいいなって感じになってきた
161 名前:デフォルトの名無しさん (スップ Sd3f-a7Ro) mailto:sage [2017/04/17(月) 08:54:59.22 ID:OwDSFehNd.net] >>157 なんかやだ
162 名前:デフォルトの名無しさん (ワッチョイ 3b37-T+tu) [2017/04/17(月) 08:55:54.12 ID:5RBrgFiu0.net] >>157 いや、それdynamic_castと寸分違わず同じだから… gotoをdo{}while()にするのと同じレベルだと思う。
163 名前:デフォルトの名無しさん (スプッッ Sd3f-lyFy) [2017/04/17(月) 09:07:38.99 ID:qMcNcEsbd.net] RTTIはオプションで切っておきたい
164 名前:デフォルトの名無しさん (ワッチョイ 0b75-7bPG) [2017/04/17(月) 09:13:50.45 ID:R62eo4r30.net] >>160 継承関係になくていいというところが違うし(結構大事だと思う)、dynamic_castはダイナミックリンクするライブラリと組み合わせると面倒くさいからなるべく使いたくないんだよね。
165 名前:デフォルトの名無しさん (スップ Sd3f-a7Ro) mailto:sage [2017/04/17(月) 10:32:14.53 ID:OwDSFehNd.net] 依存関係の強さは変わらんよね
166 名前:デフォルトの名無しさん (ワッチョイ 1f6b-HE/W) mailto:sage [2017/04/17(月) 12:22:18.70 ID:PEkyQsSL0.net] その「強さ」を具体的に数値化できればな
167 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 14:44:09.70 ID:YxhJnxLO
] [ここ壊れてます]
168 名前:0.net mailto: >>157 スクロールできないクラスの中にscroll_interface*を返す関数があってnullptrを返すのか その論法では絶対にあり得ない機能への問い合わせ関数を膨大な数抱え込むここになるぞ [] [ここ壊れてます]
169 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 14:46:29.60 ID:YxhJnxLO0.net] >>162 継承を使わないインターフェイスは確かに欲しいが 後半が何を言っているのか好意的に読んでもわからんぞ
170 名前:デフォルトの名無しさん (スップ Sd3f-a7Ro) mailto:sage [2017/04/17(月) 16:34:39.13 ID:OwDSFehNd.net] QueryInterfaceいやだ
171 名前:デフォルトの名無しさん (ワッチョイ eb00-AM0K) [2017/04/17(月) 16:58:00.17 ID:rD3LHvJv0.net] COM設計したやつって基地外だよな
172 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 18:04:25.63 ID:YxhJnxLO0.net] APIが単一空間に際限なく増えることへの危機感から 何らか対策を講じるとして、割とまともな答えだと思う
173 名前:デフォルトの名無しさん (ワッチョイ 2bf4-EaKP) [2017/04/17(月) 18:05:14.09 ID:YxhJnxLO0.net] GUIDの扱い方が変態的なのがちょっとイヤだけどね
174 名前:デフォルトの名無しさん (ワッチョイ eb59-0/8P) mailto:sage [2017/04/17(月) 22:27:32.59 ID:ZfEceRxS0.net] やっぱこれからはAPIが呼び出し元のコードを生成すべき
175 名前:デフォルトの名無しさん (ブーイモ MMaf-YOru) mailto:sage [2017/04/17(月) 22:40:09.29 ID:KscfyyhaM.net] 呼び出し元のコードは誰が呼び出すんだ