[表示 : 全て 最新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/

41 名前:デフォルトの名無しさん [2016/02/22(月) 22:58:23.84 ID:yZnaoS7H.net]
>>37
struct hoge
{
hoge(){}
int baka;
};
ならbakaは不定です。
ほんとにゼロ初期化されるのがルールなんですか

42 名前:デフォルトの名無しさん [2016/02/22(月) 23:00:01.44 ID:yZnaoS7H.net]
>>39
大抵のサイトは値を省略すると「ゼロで初期化される」と書いてあります。
正確なところを教えてください。値を省略すると何が起こるのですか

43 名前:デフォルトの名無しさん mailto:sage [2016/02/22(月) 23:33:38.04 ID:/YQF/sqY.net]
>>42
n3690から抜粋すると
8.5.17:The semantics of initializers are as follows. The destination type is the type of the object or reference being
initialized and the source type is the type of the initializer expression. If the initializer is not a single (possibly
parenthesized) expression, the source type is not defined.
— If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized
8.5.4.3: List-initialization of an object or reference of type T is defined as follows:
if the initializer list has no elements and T is a class type with a default constructor, the
object is value-initialized.
8.5.8: To value-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9) with either no default constructor (12.1) or a
default constructor that is user-provided or deleted, then the object is default-initialized
8.5.7: To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor (12.1) for T is called

つまりこの場合に限ると
・リストで初期化するとlist-initializeされる。
・リストが空の場合、list-initializeはvalue-initializeになる。
・デフォルトコンストラクタが削除されてたり、ユーザ定義されてる場合はvalue-initializeはdefault-initializeになる。
・default-initializeはデフォルトコンストラクタを呼び出す
・hoge::hoge()は何も実行しない→hoge::bakaは未定義のままになる
といった具合。

解決するには、
hoge() : baka(0) {return;}
みたいにちゃんと初期化コードを書かなきゃ駄目。

44 名前:デフォルトの名無しさん mailto:sage [2016/02/22(月) 23:37:52.25 ID:/YQF/sqY.net]
ちなみにhoge::hoge()を定義しない場合、暗黙のデフォルトコンストラクタが定義されて
その場合はvalue-initializeはzero-initializeになるですよー

45 名前:デフォルトの名無しさん mailto:sage [2016/02/22(月) 23:59:33.96 ID:ANT1CVM2.net]
面倒だ
struct hage
{
 hage() = default;
 hage( int ){}
};
これでOK

46 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 02:18:04.37 ID:gGx+alPj.net]
前スレでラムダ式を気軽に使っていいか?という質問をした者ですが、
以下のようにforの中に定義を書いてしまった場合、forのループの度に
ラムダ式のオブジェクトを生成したりするんでしょうか?
そうだとするとforの外に出しておいたほうがいいんでしょうか?

for
{
 〜ウン十行ある〜

 auto func = [](){}; // ラムダ式を使う場所の近くで定義を書きたい(把握しやすいように)

 if
 {
  func();
 }
 else
 {
  func();
 }

}

47 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 02:42:27.72 ID:0Gk/RmeS.net]
2chに書き込む暇が有ったら測定してみろ

48 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 07:59:59.43 ID:ltvQNGjy.net]
>>41
以下だと、int baka; を、{ }で囲んでいないから、初期化できていない
struct hoge
{
hoge(){}
int baka;
};

上記を以下のようにすればよい。>>37 に書いてある
struct hoge
{
int baka;
};

hoge h = {};

ちゃんと本を読め。初心者歓迎スレに行け

49 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 08:04:39.95 ID:ltvQNGjy.net]
>>46
ループ毎に、処理が変わらないのなら、forの外に書く

ループ毎に、処理が変わるのなら、forの内に書く



50 名前:デフォルトの名無しさん [2016/02/23(火) 08:18:48.42 ID:UeUvEN3+.net]
>>48
bakaをゼロで初期化する方法は最初から聞いてません
初期化の値を省略した場合の挙動を聞いているのです
デフォルトコンストラクタが呼ばれるならそう書けばいいのにどこもゼロで初期化されるとしかかいてませんでした

51 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 08:31:58.63 ID:xDQTJcBy.net]
まあ>>50が予想された結果だ
>>43の後に>>48はいろいろとマヌケすぎる

52 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 11:21:56.71 ID:ltvQNGjy.net]
>>43 みたいに、複雑な判定が必要なら、
そもそも必ず明示的に初期化すべき

多くのコーディング規則でも、
初期化していない値を使ってはならないと書いてあるだろ

未初期化の場合、初期化し忘れたのか、
故意にやっているのか、意図がわからないから困る

もし、各コンパイラで挙動が異なったら、
こんなバグや意図を突き止めて、修正するのは大変

53 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 13:35:15.59 ID:aFHEViKg.net]
>>50
素人が適当なウソを無責任に書き散らしているサイトが多いが、
「どこでも」と言うなら、Cの構造体の初期化について書いてあったんだろう。

要約するとお前が間抜け

54 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 14:05:39.64 ID:4c1IOC2x.net]
>>50
C++の文脈でPODと非PODの違いにも触れずに={}で一律にゼロ初期化されるなんて
書いてるバカなサイトなんて見たことないんだが?
どこでもっていうなら3つくらいは挙げてくれ

55 名前:デフォルトの名無しさん [2016/02/23(火) 14:15:32.01 ID:UeUvEN3+.net]
>>54
列挙しても特に意味ないので
意味があるならやりますけど

56 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 14:24:32.35 ID:4c1IOC2x.net]
もうお前はいいよ相手にしちゃいかんやつだ

57 名前:デフォルトの名無しさん [2016/02/23(火) 14:37:12.48 ID:UeUvEN3+.net]
突然絡んできてもういいよとは何が何やらわかりません
どうしてしまったんですか

58 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 20:17:07.10 ID:bPGlp/ev.net]
>>55
意味ならあるだろ
>>54は={}でゼロ初期化されるなんて書かれているサイトは見たこと無いって主張していて、
君はその逆に、どのサイトを見ても={}でゼロ初期化されるって書いてあると主張している。

どちらが正しいか証明したければ
君が知ってるサイトを片っ端から挙げるべきなのは分かるね?
逆に君がそうしない、又は出来ないというのなら君が単に嘘ついて炎上学習したって事になる。

59 名前:デフォルトの名無しさん [2016/02/23(火) 20:24:46.11 ID:MF5ot8kL.net]
>>58
嘘もついてないですし自分の正しさを証明する必要も意味もないので
貼るなら正しい仕様を理解するための参考になるサイトを貼ってくれる方がいいですね
ダメなサイトを貼る意味ってあります?



60 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 20:34:32.34 ID:xDQTJcBy.net]
>>59
興味があるので、ゼロ初期化と書いてあるサイトを教えていただけませんか?
今回だけ特別に教えて欲しいです。
代わりに参考になるサイトを紹介します
www.open-std.org/
→WG21→papers
N4567がオススメです

61 名前:デフォルトの名無しさん [2016/02/23(火) 20:48:31.49 ID:MF5ot8kL.net]
>>60
そこは知ってるので別の所お願いします

62 名前:デフォルトの名無しさん mailto:sage [2016/02/23(火) 23:03:35.63 ID:bPGlp/ev.net]
>>59
背理法って知ってる?

63 名前:デフォルトの名無しさん [2016/02/24(水) 06:55:08.54 ID:iraD9m85.net]
>>62
熱膨張的な物言いでカッコいいですね

64 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 07:00:00.19 ID:iS9soXkB.net]
ボク自身も熱で膨張しそうです

65 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 08:48:53.60 ID:qiLj0DES.net]
熱くたぎる怒張がどうしたって?

66 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 12:21:03.69 ID:CiZ4HRqF.net]
>>62
ム板じゃないところに来てるかと思って板名見なおしたぞ

67 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 14:23:42.94 ID:4ZA9ynQM.net]
>片桐 はいり(かたぎり はいり、1963年1月18日 - )は、日本の女優。
>本名、片桐 由美(かたぎり ゆみ)。東京都大田区出身。
>スターダストプロモーション芸能1部所属。

68 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 20:35:27.44 ID:qiLj0DES.net]
はいりはいりふれはいりほー

69 名前:デフォルトの名無しさん [2016/02/24(水) 21:23:02.15 ID:wSKjAMnV.net]
int a = int();
a = int();
のint()はどういう意味ですか
一行目と二行目のint()に違いはありますか



70 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 21:27:07.75 ID:f7gTsPBB.net]
一行目、aをコンストラクトする。
二行目、コンストラクトした一時オブジェクトをaに代入する。

71 名前:デフォルトの名無しさん [2016/02/24(水) 21:31:59.33 ID:iraD9m85.net]
一行目は一時オブジェクトは作成されないのですか

72 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 21:44:13.38 ID:t5G9cIIP.net]
qiita.com/hmito/items/9f4bdc8442b6f6b3c7bc
結構面白かったです。

73 名前:デフォルトの名無しさん mailto:sage [2016/02/24(水) 22:14:05.66 ID:ZvNmPlpt.net]
>>71
知ってるくせに

74 名前:デフォルトの名無しさん [2016/02/25(木) 09:45:38.74 ID:pcAVTpJw.net]
int();

int(0);
は何が違うんですか

75 名前:デフォルトの名無しさん mailto:sage [2016/02/25(木) 09:50:39.66 ID:pDSMfAMl.net]
int(0)の方が1文字多い。そしてより明示的
だけどよっぽどの偏屈者じゃない限りint()とかint(0)とか書かない

76 名前:デフォルトの名無しさん mailto:sage [2016/02/25(木) 20:29:55.94 ID:/tM+b5YW.net]
int()はint型の値初期化によって得られる値
int(0)は0をintにconst_castした結果

77 名前:デフォルトの名無しさん mailto:sage [2016/02/25(木) 23:46:46.50 ID:Y3PURJ2y.net]
auto i = int{}; はフツーだろ?
auto j = int{0}; は変人

78 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 00:43:33.92 ID:VN+AWD5G.net]
いやいやフツーはint i = 0;だろw

79 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 02:27:23.53 ID:JkkprwN3.net]
int i {0}; // だろ



80 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 02:57:45.65 ID:sByuqtKs.net]
宣言と初期化に関して、いろんな表記が有りすぎて笑えないレベルだな
コンストラクタなのかキャストなのかも分かりにくいし
最高です

81 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 06:59:41.78 ID:L7RTVb9K.net]
しかしnewでクラス作成時にメンバを全ゼロ初期化する方法がないんだな

82 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 07:10:06.43 ID:FbdyjvxV.net]
ちょっと何言ってるかわからない

83 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 07:44:52.80 ID:L7RTVb9K.net]
しかしnewでクラス作成時コンストラクタ呼出し前にメンバを全ゼロ初期化する方法がないんだな

84 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 07:48:12.67 ID:L7RTVb9K.net]
DelphiとかBCBだとTObject派生物はゼロ初期化されるが
標準C++規格でのやり方では聞いたことが無い

85 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 08:01:04.93 ID:Pw5RFD2X.net]
自分が知らない、聞いたことがないことを
方法が無いと断定する低能には難しいだろうな

86 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 08:04:28.09 ID:tJ1gUyHd.net]
初期化はコンストラクタでやるもんだと思うが、なぜコンストラクタ呼び出し前に
そんなことやる必要があるんだろうか。

87 名前:デフォルトの名無しさん [2016/02/26(金) 08:28:20.75 ID:ouDcFdqg.net]
char p[sizeof hoge]={};
new(p) hoge();


88 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 08:53:49.35 ID:L7RTVb9K.net]
>>86
初期値がゼロのメンバ変数はいちいち初期化する面倒が不要になる

89 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 10:15:10.11 ID:OlJixx6H.net]
struct X { int a, b, c; }
X *x = new X({0, 0, 0});
これを簡略化したいってことか?



90 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 12:19:06.42 ID:h1q56VEq.net]
new X() で済む話だよね。

91 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 18:27:57.97 ID:Pw5RFD2X.net]
これでおk
struct baka {
 int p;
 baka() = default;
 baka(int p) : baka{}, p{p} {
 }
};

92 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 18:43:51.81 ID:AYRtcLu9.net]
struct baka {
 int a=0;
 bool b=true;
 baka() = default;
};
でええやん

93 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2016/02/26(金) 18:45:56.98 ID:6Zondczs.net]
struct tensai {
 int a=0;
 bool b=true;
};

94 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 19:38:43.59 ID:VKP1Cmo0.net]
0で初期化すれば安心って、それ自体が間違ってる気がする。

95 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 20:27:08.19 ID:5826a3fE.net]
PostMessageを監視すべし

96 名前:デフォルトの名無しさん [2016/02/26(金) 23:25:03.72 ID:yiTr60/V.net]
double型の行列とcomplex<double>型の行列演算結果がcomplex<double>
型になるように型拡張を行うには何のテクニック使ったらいい?

あ、単純な演算子のオーバーロード使うと結構大変だから(できんわけではないが)
テンプレートテクニックとかうまく使えないかな。

97 名前:デフォルトの名無しさん mailto:sage [2016/02/26(金) 23:45:09.61 ID:zaiZLpHx.net]
演算子のオーバーロードが一番いい

98 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 00:58:43.79 ID:e3stW6O/.net]
なにをいってるかわからんな
行列の個々の要素ごとにdoubleとcomplex<double>で四則演算するなら
結果は自動的にcomplex<double>になるだろ

99 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 01:54:26.55 ID:pvHfkl8D.net]
complex<double>をベクトルとみなして、doubleをスカラとみなすのか
そういう演算はC++では普通標準で用意しないから自分でオーバーロードすればいいじゃん



100 名前:デフォルトの名無しさん [2016/02/27(土) 01:57:02.77 ID:C/ecoBXH.net]
TVアニメ『NEW GAME!』というのを知り、漫画を読みました。
無職5年目ですが、ぷろぐらむ(C++)Win32 アプリケーションを使い
ゲームを製作(勉強)したいと思いました。
お勧めの参考書籍やサイトが有りましたら教えて下さい

101 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 02:32:29.58 ID:wxfsuIHK.net]
>>96
行列クラス自分で作るつもりなら当然行列どうしや行列とスカラーの演算子も定義しなきゃいかんわな
俺ならそんなもの自作しないで既存の行列演算ライブラリ(例えばeigenとか)使うけど
ちなみに>>98が言ってるようにdouble型とcomplex<double>型のスカラー演算結果は標準でcomplex<double>になるよ

102 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 03:47:18.73 ID:0gtZVCNd.net]
>>100
ここは怖い人ばかりなので初心者スレへどうぞ

103 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 04:15:41.61 ID:EVLCSxnr.net]
>>102は会話のできないアスペ

104 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 09:03:39.57 ID:vL66Pzde.net]
>>96
もしかして、このあたりの話をすればいいのかな?
stackoverflow.com/questions/17013655/how-to-use-decltype-to-determine-the-result-of-an-addition
これが「結構大変だ」と言っていたのならすまぬ。

105 名前:デフォルトの名無しさん [2016/02/27(土) 09:52:02.29 ID:HsyJ5PWO.net]
>>104

ありがとう。

スカラー単位の型拡張はあたりまえだけど、double型を要素とする
行列をcomplex<double>型の行列に型拡張するときどうするんだろ
と思ってね.

やはり要素レベルでtraitsを使って,traitsで定義した型を要素と
する行列を作るのが正攻法かなあ。C++14だともっとエレガントに
できないかな? 紹介してくれた所を見てみるよ.

106 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 12:31:21.47 ID:hVqcAFgk.net]
手法にこだわって目的を達成できない典型的パターンだな。

107 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 16:53:21.38 ID:tW+Ks6U1.net]
目的がオナニーだから問題ない

108 名前:デフォルトの名無しさん [2016/02/27(土) 18:46:59.39 ID:HsyJ5PWO.net]
馬鹿には好きなだけ言わせとくよ

109 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 20:19:31.60 ID:qyipvj4l.net]
初心者の口から出る「エレガント」に反吐が出る



110 名前:デフォルトの名無しさん [2016/02/27(土) 20:25:42.58 ID:HsyJ5PWO.net]
はいはい、キチガイ犬w

111 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 20:43:20.31 ID:e3iZnQnQ.net]
#ifndef INCFILE_H_
最後のアンダーバーは何のためにあるですか?

112 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 21:54:26.15 ID:TnvXsjWd.net]
反吐が出ると言って本当に吐いてるやつを見たことがない

113 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 21:57:54.41 ID:EVLCSxnr.net]
自然言語の言い回しも理解できない低能には
プログラム言語は難しいだろう

114 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 22:06:17.26 ID:EVLCSxnr.net]
>>111
低能が書いた#defineによる定数と
名前を衝突しにくくするためだろうきっと

115 名前:デフォルトの名無しさん [2016/02/27(土) 22:07:02.57 ID:T6Jc3KoX.net]
ひとつのテンプレート関数内部で'A'とL'A'を自動判別する方法教えてください
int a['A' or L'A'];
みたいな

116 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 22:26:19.05 ID:TnvXsjWd.net]
>>113
あのさ、ここは2チャンネルであって、基本的に初心者が集まる場所なんだよ?
昔とは違うんだ。わかるか?

117 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 23:38:42.62 ID:bRJMsBK5.net]
>>116
馬鹿の無根拠な妄言ktkr

118 名前:デフォルトの名無しさん mailto:sage [2016/02/27(土) 23:53:52.62 ID:TnvXsjWd.net]
もともとは>>109の発言

119 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 09:01:53.38 ID:p5UOgBYD.net]
昔ってなんだ? ネットニュースか?



120 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 09:51:52.96 ID:sxXcnRPc.net]
>>100
14歳からはじめるC言語オンラインゲームプログラミング
15歳からはじめるDirectX9 3Dゲームプログラミング教室
14歳からはじめるシリーズ~ あと二冊

121 名前:デフォルトの名無しさん [2016/02/28(日) 10:59:04.87 ID:yeDT/yDi.net]
Compositeデザインパターンでcomposite1のchildlenの型をcomponentの配列ではなくcomposite2の配列に限定し、composite2のchildrenはleafのみの配列に限定したいのですが、どのようにしたらいいのでしょうか?

122 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 13:29:41.30 ID:w64tNJjH.net]
それはコンポジットパターンなのか?

123 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 13:48:26.49 ID:5n5R60tK.net]
それだけじゃ型を明示しろよとしか思えんが

124 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 14:19:39.94 ID:tz1QY8TO.net]
そういうふうに組めばいいとしか言いようがない。
組む際に何がネックになってるのかね。

125 名前:デフォルトの名無しさん [2016/02/28(日) 17:19:18.45 ID:yeDT/yDi.net]
>>123
>>124
Compositeでchildrenの型としてComponentを用い、それを継承してComposite1とComposite2を作ったら
これらのchildrenの型が自動的にComponentになってしまうのでどこでどうやって型を明示すればよいのか困っております

126 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 17:35:13.98 ID:emPXsfmM.net]
型を限定したいとか明示したいとか言ってる時点でCompositeパターンを使うのは間違いなんじゃない?

127 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 18:05:44.76 ID:jJK+500Y.net]
配列要素の型を限定したい(componentの配列ではなくcomposite2の配列に限定したい)というのはいかんともし難い
配列要素の型を明示したいだけなら多態性がわかっていれば問題なくできるはず…

ただし、インスタンスの配列で多態性をやるには配列要素の型は基底クラスでなく派生クラスにする必要があり、
派生クラスが2種類(以上)あるcomponentパターンはできない

この場合の配列は基底クラスを指すポインタの配列であるべきなのでは…

※ 個人の感想です。

128 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 18:27:33.71 ID:fFRYdAaf.net]
配列を持つコンポーネントにして、visitorと組み合わせるってのはダメなのかな

129 名前:デフォルトの名無しさん [2016/02/28(日) 18:28:25.88 ID:yeDT/yDi.net]
>>122,>>126
Compositeパターンじゃなくてもいいのですが、childrenに対する操作は同じ操作がたくさんあるので継承したいのです。
しかしcomposite1はcomposite2にしかないメソッドを呼び出すこともあり、この時ダウンキャストするのを出来れば避けたいと思っております。
>>127
やはり限定するのは難しいですか……
すみません、
>配列要素の型を明示したいだけなら多態性がわかっていれば問題なくできるはず
というのは何を使って明示することを想定されているのか教えていただけないでしょうか?



130 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 19:11:55.42 ID:c40FCrwk.net]
登場人物がComposite1とComposite2とLeafだけなら、普通にComposite1::getChild()は
Composite2を返してComposite2はLeafを返せばいいだけだろ。

131 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 19:52:22.72 ID:PMSRihXY.net]
>>125
「これらのchildrenの型が自動的にComponentになってしまう」
↑ここが何かおかしい。んなわけねーだろ、と。
ほんとうにそんなところまで Composite が制約を加えてるなら、そこが問題。

>>129
ダウンキャストして済むならそれで済ませればいいだろうとも思う。
「避けたい」の具体的な理由があるのかと。

132 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 20:57:13.19 ID:gim467qR.net]
>>129
childrenに対する操作の一部を共通化したいだけなら、
こんな感じでCompositeに共通処理を集めるだけじゃ駄目かね。

template<class Child> class Composite { /* 共通処理 */ };
class Leaf { };
class Composite2 : public Composite<Leaf> { /* Leafだけの処理 */ };
class Composite1 : public Composite<Composite2> { /* Composite2だけの処理 */ };

133 名前:デフォルトの名無しさん [2016/02/28(日) 21:20:23.21 ID:yeDT/yDi.net]
>>131
class composite{
vector<shared_ptr<component> > children;
}

class composite1:public composite{
}

の形で実装したらcomposit1のchildrenはcomponentになると思っていましたが、違ったでしょうか?
ダウンキャストを避けたいのは単に私が管理しきれなくなりそうだからです

>>132
おっしゃる通りの実装で解決しました。
たしかにtemplateを使えば私の望む動きをしてくれます。
分かりやすく素晴らしい回答大変ありがとうございました。

134 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 21:27:42.44 ID:emPXsfmM.net]
妙に早いな

135 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 21:33:54.60 ID:PMSRihXY.net]
>>133
配列実体の持ち方を composite で決めてしまっているところが問題だということ。

class composite{
virtual component& nth_child(int n) = 0;
}

class composite1:public composite{
vector<shared_ptr<compisite2> > children;
}

こうしておけばよかったんじゃないかと思うんだけど >132 で解決したならいいかな。

136 名前:デフォルトの名無しさん mailto:sage [2016/02/28(日) 22:12:35.00 ID:jJK+500Y.net]
お禿げ様はインターフェースは一般に最初の基底クラスに全て集まる傾向にあるとはどっかに書いてたが
実装まで最初の基底クラスに集約するのが良い設計なのかどうか…

Cmposite1、Comosite2だけならまだしも
Cmposite3、Comosite4、…と増えていった場合に都度Compositeクラスのソースコードが編集され、肥大化していくんやで〜

137 名前:デフォルトの名無しさん mailto:sage [2016/02/29(月) 05:58:03.54 ID:j6jzPb2d.net]
Mixin的な使い方に限るなら問題ないでしょう。
継承が嫌なら、Compositeをメンバ変数にするとか、
vectorを受け取る関数テンプレート群にしてしまうとかすればいいし。

138 名前:デフォルトの名無しさん [2016/03/02(水) 23:08:12.47 ID:g3p9uXMc.net]
C++の質問です。

ウィンドウハンドルHWND型を数値化する方法をご教授下さい。

何をしたいのかというと、VisualStudio付属のspy++を使用して、
色々な事をしています。

spy++の各ウィンドウの「ウィンドウ」文字列の右にウィンドウハンドルID?のような、
ウィンドウ毎に一意につけられたIDが表示されています。
このIDを取得したいのです。

なのでウィンドウハンドルHWND型を数値化出来れば、上記spy++のウィンドウハンドルID?
と同じ物を取得できると考えました。

よって、ウィンドウハンドルHWND型を数値化する方法をご教授下さい。
※もしかしたら目的と実施しようとしている事が間違っているかもしれません
※その場合は正しくウィンドウハンドルID?を取得できる方法をご教授下さい

139 名前:デフォルトの名無しさん mailto:sage [2016/03/02(水) 23:26:29.94 ID:v5tMoIR7.net]
>>138
size_t id = reinterprete_cast<size_t>(hwnd);



140 名前:デフォルトの名無しさん mailto:sage [2016/03/02(水) 23:57:02.22 ID:9ZwWQH++.net]
なぜそこでstd::intptr_tでなくsize_tが出てくるのか不思議

141 名前:デフォルトの名無しさん mailto:sage [2016/03/03(木) 05:25:34.43 ID:tlFkd89Q.net]
しかもreinterpret_cast<&size_t>じゃないとパンニングできないし






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

前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