1 名前:デフォルトの名無しさん mailto:sage [2016/02/21(日) 16:36:27.08 ID:jZESqUY+.net] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part122 peace.2ch.net/test/read.cgi/tech/1453557975/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 peace.2ch.net/test/read.cgi/tech/1439849418/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
304 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:13:56.70 ID:gceSYQgA.net] >>300 struct outer { void method(){ inner_b obj; //←これ } struct inner_a { void method() { inner_b obj; //←これ } }; struct inner_b{ }; }; VSだけかもしれないけど、インナークラスの前方参照は出来ますよ、ただし、メソッド内ではね struct outer{ inner *ptr; inner{}; }; って書けない話だろうけど struct outer{ struct inner; inner *ptr: struct inner{}; }; って前方宣言してあげれば良いだけで、大した手間ではない 同一コンパイル単位で前方参照できるといっても、例外は有って構わないわけで struct hogehoge; と書くことぐらいの手間は全くの程度問題
305 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:23:03.30 ID:gceSYQgA.net] 何事にも例外が有ってよいと思うわけです、ハイ 完ぺき主義者ではないので 仮に 「インナークラスの型のポインタ変数を前方参照っぽく定義より先に使って宣言したいときは struct hogehoge; と事前に前方宣言しなければならない」 というルールが有ったとしても、この程度は何の手間でもないから問題ないですね
306 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:24:08.59 ID:gceSYQgA.net] あーこれ間違ったわ struct outer{ inner *ptr; inner{}; }; ↓ struct outer{ inner *ptr; struct inner{}; }; struct が抜けてたわ
307 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:25:04.02 ID:WCvUs0lb.net] >>305 それならそのまま使えばいいじゃないの。 何に不満があるんだよ。
308 名前:デフォルトの名無しさん [2016/03/09(水) 22:25:25.73 ID:eOjuPS6Y.net] int main() { struct A{ A(){} }; struct B{ A a; int x; }; B b = B(); printf( "%d\n", b.x );
309 名前:デフォルトの名無しさん [2016/03/09(水) 22:26:12.04 ID:eOjuPS6Y.net] b.xがvc2015だと0なのに2012、2013だと不定値になります。何故でしょうか。
310 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:28:49.66 ID:lHuhk1uY.net] 不定なのが偶々0なだけ
311 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:30:44.15 ID:av11/7D/.net] 初期化されてないから
312 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:32:19.48 ID:WCvUs0lb.net] >>309 0が正しいと思う。MSのバグじゃないの?
313 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:34:09.23 ID:+X5y9V0s.net] >>309 0が正しい。
314 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:35:46.14 ID:+X5y9V0s.net] なので、VC++のバグに1票。
315 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:37:39.69 ID:PsUKAneX.net] >>302 できるからやればいいじゃん って言うのは ID:gceSYQgA が言ってること以外にも色々ある ってまで説明しないとわからんの? 主張するのは勝手だけど、長々やるほどじゃねーだろ って言われてるだろ
316 名前:デフォルトの名無しさん [2016/03/09(水) 22:41:03.03 ID:WCvUs0lb.net] ごめん血迷ってた。default-intializedだね。
317 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:43:46.61 ID:+X5y9V0s.net] >>316 zero initializeでは?
318 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:46:47.91 ID:lHuhk1uY.net] いやPODだから不定値だろ
319 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:48:02.12 ID:WF7rFyWl.net] PODだと不定値 などという仕様がどこから出てきたのか
320 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 22:49:51.34 ID:+X5y9V0s.net] >>318 だからゼロ初期化という仕様なんだって。
321 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 23:01:30.54 ID:WF7rFyWl.net] ついでに、PODがあるようには見えない
322 名前:デフォルトの名無しさん [2016/03/09(水) 23:05:53.89 ID:WCvUs0lb.net] 逆、非PODだから不定値。 自分はPODのカッコ付きと勘違いした。
323 名前:デフォルトの名無しさん mailto:sage [2016/03/09(水) 23:10:57.26 ID:WF7rFyWl.net] ここまで、>>309 の炎上学習法若しくは確認間違いという指摘無し
324 名前:デフォルトの名無しさん [2016/03/10(木) 01:14:31.68 ID:lKwsVgJC.net] という>>323 の炎上学習法に見えるね 自分で確認するのが面倒だからって
325 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 01:44:57.86 ID:eUGHchpD.net] 0になったり他の値になったりするのは、偶々だね。 12.6.5のサンプル struct C { C(){} A a; const B b; int i; int j = 5; }; // initializes members as follows: // OK: calls A::A() // error: B has no default constructor // OK: i has indeterminate value // OK: j has the value 5 規格書読めない初心者は発言しないように。
326 名前:デフォルトの名無しさん [2016/03/10(木) 01:58:57.97 ID:8KJ6+/BF.net] >>325 話を読めない人は発言してもいいんですか?
327 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 02:32:53.57 ID:mfhQ4lhr.net] >>325 お前さーC++14の規格票を持ってることだけが自慢なんだろ 俺も持ってるからお前の間違い突っ込んでやるよ
328 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 02:47:23.86 ID:eUGHchpD.net] タダで入手できるもの持ってると自慢できるのか? じゃ、自慢しよう どうだ、まいったか
329 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 03:23:13.76 ID:mfhQ4lhr.net] >>328 タダだと?どこで無料で入手出来るというんだ お前もしかしてタダで入手したのか?
330 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 03:41:17.30 ID:mxNsUMFn.net] >>308-309 B() で B 型のオブジェクトが値初期化 "value initialize" される。 (8.5 p11) B はユーザー定義のデフォルトコンストラクタを持たないクラス型なので、値初期化のプロセスとして まずゼロ初期化 "zero initialize" され、そのあとデフォルト初期化 "default initialize" される。 (8.5 p8 bullet-2) int 型の B::x がゼロ初期化されると値 0 になる。 (8.5 p6 bullet-1) そのあと B::x がデフォルト初期化されるが、 int 型なので何も行われず 0 のまま。 (8.5 p7 bullet-3) と言う感じで、 C++14 の規格に従うと 0 になる。 C++03 以降だと経路が多少違うものの同じ結果になるけど、古の C++98 では B::x は不定となってしまっていた。 www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#35 MSDN 見る限りだと 2013 で value initialize に対応してそうなんで、 2013 で不定ならバグかな。 https://msdn.microsoft.com/en-us/library/w7wd1177%28v=vs.110%29.aspx https://msdn.microsoft.com/en-us/library/w7wd1177%28v=vs.120%29.aspx
331 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 10:36:48.16 ID:OLUNjZSr.net] >>330 この仕様ってポインタに対しても有効? 以前似たような質問が議論されてたんだけど。 echo.2ch.net/test/read.cgi/tech/1439849418/184
332 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 11:13:34.09 ID:l944yzKo.net] 330じゃないけどポインタもscalar typeだから同じくゼロ初期化でしょ でもvalue initializeルールに依存するようなクラスは書くべきじゃないなあ echo.2ch.net/test/read.cgi/tech/1439849418/184 をNode node;ってやっちゃったらやっぱりnode.nodeは不定だよ こんなコードは書かずにちゃんとコンストラクタを書いて明示的にnullptrで初期化しなくちゃいかん
333 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 11:23:42.71 ID:mBEuB6ly.net] デストラクター作ってPODを諦めてるのに、適切に初期化するコンストラクター無いとか ただのバグでしかない
334 名前:デフォルトの名無しさん [2016/03/10(木) 11:46:11.58 ID:xbWf2tod.net] やっぱりvc2012でも2013でもxはゼロで初期化されません バグですか gccではゼロになります
335 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 13:35:05.45 ID:l944yzKo.net] バグだね >>308 のBはxの初期値が重要ならこれもバグ
336 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 18:43:26.84 ID:uK8a0ubO.net] VCの規格無視はいつもの事らしいから気にすんな
337 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 20:58:27.62 ID:l944yzKo.net] 調べたらこのバグは2012年6月にはもう報告されているね https://connect.microsoft.com/VisualStudio/feedback/details/746973/incorrect-c-11-value-initialization-for-type-with-implicitly-declared-but-non-trivial-default-constructor VC++ 2015 RCでやっと直ったらしい
338 名前:デフォルトの名無しさん [2016/03/10(木) 21:21:03.49 ID:wKO6hiHF.net] そもそもが、int()で0だなんて馬鹿げたルールができたばっかりに...
339 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 21:38:31.66 ID:kxB40Mc+.net] マイクロソフト「C++11対応は2015 Update 2から本気出す」
340 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 22:09:45.41 ID:1z8FCjXU.net] >>331 有効 using P = int *; P p{}; はp==nullptrになる
341 名前:デフォルトの名無しさん mailto:sage [2016/03/10(木) 22:59:23.79 ID:XIXQ4NCN.net] 変数の初期値がどうなるかというだけの話でこんな議論になるのはC++ぐらいだろうなぁ。
342 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 11:55:53.38 ID:+X87dz7B.net] 値か0の初期化を当たり前にし、初期化なしを例外記述にする方向性なのだろう。 今のところ(バグがあるので)値初期化を信じず、 未初期化を前提に書けと言うのは、ある意味正しいのかもしれないが、 考え方としては逆行しているね。
343 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 12:52:11.72 ID:Y6ECzuws.net] ある意味正しいじゃなくてパフォーマンスを考慮すると未初期化がデフォなのはC++としては完全に正しいんだよ 0初期化がデフォになってしまったらCを継承したC++の利点が薄れてしまう value initializationこそがC++の思想に逆行してると思う
344 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 13:05:18.46 ID:kWA4jyXp.net] >>308 そもそも非POD型をメンバーに持つPOD型は非POD型になるだろ。 >cpplover.blogspot.jp/2010/06/c0xpod.html >さらに、非PODな非staticデータメンバーを持たないこと。
345 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 13:10:43.94 ID:vYMpLkUm.net] コンストラクタの強制なんかを見ると、 うっかり未初期化の値を使うことによる不具合を防ぐって 言語思想も含まれてるでしょ。 となると、単純な値にも何らかの初期値が保証される方向性もアリかと。 初期値は保証されるが、そのことによるパフォーマンス上のペナルティがない、 プログラマが初期化すればデフォルト初期値の処理は発生しない、 という仕様なら八方丸くおさまると思ったり。
346 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 13:12:37.67 ID:+X87dz7B.net] >>343 正しいなら実装側でstack protectorなんてデフォルトにならないよ。 現状もパフォーマンスが欲しいときだけ別にするというのが基本だ。
347 名前:デフォルトの名無しさん [2016/03/11(金) 13:13:39.58 ID:2/u08KSA.net] 基本強制初期化で int a = noinit; みたいにしたら初期化しない方式で
348 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 13:21:02.38 ID:zH9xDiQd.net] デフォは未初期化で記述方法によっては初期化もしてくれるって方針だろ。 その記述方法が紛らわしいのと、規格通り実装しないのがメジャーなコンパイラの1つなのが問題 もう少し分かりやすい記述なら良いのに、現状だとデフォルトconstructorが呼ばれているようにしか見えない。
349 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 14:21:15.08 ID:49om0mRF.net] >>347 Dでは int i = void; // デフォルトの初期値を省く コンパイラのオプションで従来動作も選べればすぐ導入可能だと思うがね
350 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 15:25:46.64 ID:dykTweBs.net] >>349 だからどうしたって話 int i{0}; とタイプすることもできないのか
351 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 15:35:13.63 ID:kWA4jyXp.net] int i(); でもいいよ。
352 名前:デフォルトの名無しさん [2016/03/11(金) 15:36:56.24 ID:kuBG6faz.net] int i = 0; while(std::cin >> i) std::cout << i; こんな馬鹿っぽい初期化いらんし邪魔だ
353 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 18:27:14.35 ID:0EDCO8WT.net] >>351 ウソを書くな
354 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 22:49:53.55 ID:YlUxysAB.net] >>351 それは関数宣言だと何度
355 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 22:52:02.91 ID:RA7SR1be.net] お前ら一体 何を言ってるんだ
356 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 22:56:28.69 ID:YlUxysAB.net] >>344 その通りだけど、ゼロ初期化とは何の関係も無い件
357 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:02:09.89 ID:4G2Dcq4h.net] 15年C++書いてきて 別案件でC#と数ヶ月戯れたけど C++はやっぱり変態だと感じたわ 良くも悪くも
358 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:09:07.85 ID:RA7SR1be.net] C++はぐちゃぐちゃ汚いよね
359 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:30:50.24 ID:RoKMXwVB.net] それは綺麗なC++コーダに出会ってない坊やだからさ
360 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:31:51.83 ID:+X87dz7B.net] またハゲの話してる…。
361 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:33:00.33 ID:RA7SR1be.net] いや書き方の問題じゃなくて言語仕様自体の問題なんd
362 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:35:30.87 ID:a6R8C1/e.net] C++はヘンタイだし、クソ言語だと思うけど、 大好き
363 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:36:37.63 ID:+X87dz7B.net] あなたの落とした物はこのC++CLIですか?それともこのJ#ですか?
364 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:37:36.54 ID:RA7SR1be.net] 言語体系や構文ではC#が上だが、玄人好みなのはC++
365 名前:デフォルトの名無しさん [2016/03/11(金) 23:43:00.34 ID:+X87dz7B.net] ヘンタイな玄人好みって、まるで素人童貞みたいな言い草だな。
366 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:44:29.48 ID:RA7SR1be.net] すまんわかるようでわからん
367 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:53:03.42 ID:YlUxysAB.net] お前ら一体 何を言ってるんだ
368 名前:デフォルトの名無しさん mailto:sage [2016/03/11(金) 23:54:21.02 ID:RA7SR1be.net] ほんとだよ全く
369 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 00:03:43.97 ID:z2WBnFu0.net] でもそれがc++なんだよね。
370 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 00:35:06.18 ID:FH3bqKTZ.net] こういうことをC++でやるにはあの機能ではダメでこの機能を使ったこの設計でなければならない っていう無知と思い込みから汚いコード書いて無駄に苦労してる人は珍しくないぞ
371 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 01:39:29.17 ID:Zbyfy48z.net] 自分だけはキレイなコードかいてるという前提
372 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 01:43:01.42 ID:Pl4Qm8o2.net] データ構造を隠蔽したままinterfaceを隔離する方法ってありませんか? class IContainer { }; class Ifold { virtual do(IContainer& container) const = 0; }; class VectorContainer : public IContainer { private: std::vector<double> container_; }; みたいな感じでIfoldのインターフェースはコンテナに依存しないようにしたいです。 visitorパターンにするとIContainerに、Ifoldの具象クラスのacceptメソッドが増えていくのが…。 何かうまい実装はありませんでしょうか?
373 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 02:13:17.49 ID:VClvi+pB.net] 言っている意味が全然わからない。 Ifoldの具象型がIContanerの具象データに依存してるって事? 上位型だけでやりとりしたいなら、IfoldかIContainerどっちでも良いが、 具象型の中でダウンキャストでもすればいいだろ。
374 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 02:16:35.39 ID:VClvi+pB.net] もし外でvisit/accept可能か確認したいなら、 bool supports(IContainer&) (またはIfold&)とか付ける。 それ以外思いつかないが、そういうことじゃない?
375 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 02:18:19.39 ID:Pl4Qm8o2.net] >>373 Ifoldの具象型がIContainerの具象型が中で持ってるデータ構造に依存するのはOKです ダウンキャストというと、どのように行えばいいですか? インターフェースクラスからは具象クラスがわからないため何にダウンキャストすればいいか決定できません…
376 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 02:19:31.10 ID:Pl4Qm8o2.net] >>374 すみません、具体的にどのような実装になるかイメージができません…
377 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 02:21:31.37 ID:VClvi+pB.net] >>375-376 いまいち要領を得ないが、具象クラスにdo(IContainer& x);を実装、 中でIContainerからVectorContainerなどにキャストすれば良いんじゃないのか? これ以上は何がしたいのかよくわからないから何とも言えん。
378 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 02:42:31.41 ID:VClvi+pB.net] もしかしてIfoldではなく、その具象クラスすら、 受け取るべき具象コンテナが決まってないって事か? それもう設計破綻してるから無理だろ。 そうではなく特定型にキャスト可能かわからないってだけなら、 自分でID付けてis_a(int id)とか実装して調べるか、dynamic_cast。
379 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 02:51:53.53 ID:9NhLr4qt.net] >>372 class IContainer { virtual double& at(int index)=0; virtual void push_back(double& v)=0; };
380 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 09:19:37.98 ID:Vp+P3H45.net] >>372 std::accumulateみたいなことがしたいように見受けられるけどそうかね?
381 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 09:54:48.36 ID:fbT4KBM6.net] std::stack<T, C>を IContainerを受け取るIStackに魔界造したイメージだろうきっと
382 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 11:36:06.87 ID:oS3fCNyN.net] 欲しいのは単にiteratorじゃね? visitorはfoldの仕方が変わるからaccept必要でしょ?
383 名前:デフォルトの名無しさん mailto:sage [2016/03/12(土) 13:19:48.43 ID:VClvi+pB.net] てっきりテンプレート無しに異なる数値型を扱いたいって事かと思ってたよ。 テンプレート使うならStrategyだけで済んじゃうし。
384 名前:デフォルトの名無しさん [2016/03/14(月) 22:12:09.15 ID:bYJAKtH4.net] 結局何だったんだ…?
385 名前:デフォルトの名無しさん [2016/03/15(火) 18:46:33.79 ID:7F6lH4i+.net] すみません、visitorパターンを使うとacceptを持つインターフェースクラス(ライブラリコード)が、 具象クラスであるvisitor(ユーザーコード)に依存してしまうという問題を解決したかったのですが、いまいち伝わらなかったみたいです。 >>378 型タグによるダウンキャストは、メンテの観点から採用できません... >>382 自分がなにを抽象化したいのか再考するきっかけになりました。 ありがとうございました。 結局visitorを内部のコンテナ型に依存するインターフェースクラスとすることで解決しました。 実際にはIVectorContainerとかIListContainerのような形にしました。 正確にはvalue_typeは決まってたのでテンプレートテンプレートパラメータを使いました。
386 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 20:37:53.71 ID:drELySke.net] それだとデータ別にインターフェースできるから統一できないんじゃないの。 ダウンキャストの方が見えてる分まだマシかと。
387 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 20:46:48.46 ID:7F6lH4i+.net] >>386 ダウンキャストだとコンテナ型が増えるたびにif文を追加しなくてはならず、 しかも追加し忘れてもコンパイル時にエラーが出ないので…
388 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 20:51:40.14 ID:drELySke.net] >>387 またわけわからん事言っとるね君。 テンプレートだろうが、結局特定のコンテナのインターフェースに依存するだから、 その部分は場合分けしなきゃならんでしょ。
389 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 20:54:05.87 ID:7F6lH4i+.net] >>388 いや、それはaccept側のオーバーライドで解決します これがvisitorパターンの一般的な実装かと思いますが、どこがわかりませんか?
390 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 21:12:36.21 ID:drELySke.net] >>389 うむわけわからんよ。 どうやってacceptのオーバーライドで別種のvisitorを分ける? そもそもテンプレート型に仮想関数付ける形こそ始末が悪くメンテしにくいのだから、 それならいっそインターフェースも消して、 テンプレートの構造的部分型だけで十分だと思うんだが。
391 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 21:13:54.39 ID:7F6lH4i+.net] >>390 家に帰ったら実装書きます
392 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 22:59:29.47 ID:7F6lH4i+.net] >>390 こういうことです https://ideone.com/JpA22R これダウンキャストで実装すると、acceptを一つにまとめてif文で一つずつキャストを試すわけですよね? その場合ConcreteXxxContainerがひとつ増えるとacceptを修正し忘れてもコンパイルが通ってしまって困ります
393 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 23:00:15.31 ID:18/5NGhU.net] visitorクラスの基底クラスをライブラリ側が提供すれば良いのでは?
394 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 23:01:00.99 ID:7F6lH4i+.net] >>393 という風にしました
395 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 23:04:19.56 ID:z48QWO4Q.net] ダウンキャストとか言ってるアホはやばいだろ コード書かせちゃダメなレベル
396 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 23:11:15.71 ID:18/5NGhU.net] >>394 申し訳
397 名前:デフォルトの名無しさん mailto:sage [2016/03/15(火) 23:48:10.07 ID:L3nufqEx.net] 結局具体的に何をやりたいのか分からんな そもそもVisitorパターンが本当に適切なのか? Visitorパターンみたいな汚くなりがちなものはなるべく避けるべきだと思うが
398 名前:デフォルトの名無しさん mailto:sage [2016/03/16(水) 06:31:57.64 ID:+XU07v9B.net] >>392 なんだオーバーライドじゃなくてオーバーロードじゃないの。 静的なのがいいなら構造部分型や標準コンテナの模倣で十分だろう。 そこまでしてインターフェースとVisitorに拘る理由は何? >>395 dynamic_castなら危険でも何でもない。 そうやってダウンキャストを危険危険と、 いちいち大げさに騒ぎ立てる方がアホというか初心者だな。 実際OOPなら多くの場所で使われてるし、設計が簡単になるなら使っても良いんだよ。
399 名前:デフォルトの名無しさん mailto:sage [2016/03/16(水) 06:42:44.25 ID:+XU07v9B.net] そんなに静的なチェックが重要と言うなら、オーバーロードもやめとけ。 それぞれ別の名前にしたほうがより安全確実だからね。馬鹿みたいだけど。
400 名前:デフォルトの名無しさん mailto:sage [2016/03/16(水) 07:47:22.56 ID:Jbc4KVVa.net] そんなに言うならコード提示すればいいのに
401 名前:デフォルトの名無しさん mailto:sage [2016/03/16(水) 11:05:22.41 ID:9QBMlTeC.net] > ダウンキャストとか言ってるアホはやばい > そうやってダウンキャストを危険危険と 個人的には「ダウンキャスト」っていう用語自体がアホ アップ/ダウンの概念を不用意に持ち込んだ初心者ワードだと思う 暗黙の型変換(implicit conversion) キャスト演算[明示的な型変換(explicit conversion) 後者を単にキャストと呼ぶのがC/C++の文化
402 名前:デフォルトの名無しさん mailto:sage [2016/03/16(水) 12:20:06.84 ID:hEm8Gz+A.net] >>401 お前のルールをさも普遍的なものであるかのように語られても
403 名前:デフォルトの名無しさん [2016/03/16(水) 15:13:44.46 ID:YWKSC+YR.net] 参照を返す関数は戻り値の一時オブジェクトは作成されないのですか
404 名前:デフォルトの名無しさん mailto:sage [2016/03/16(水) 17:05:09.47 ID:noSrSdLM.net] 一体どこに一時オブジェが作成される要素があるというのか