[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2ch.scのread.cgiへ]
Update time : 03/25 20:45 / Filesize : 142 KB / Number-of Response : 589
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part123



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]
一体どこに一時オブジェが作成される要素があるというのか






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<142KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef