[表示 : 全て 最新50 1-99 101- 201- 2chのread.cgiへ]
Update time : 04/16 18:54 / Filesize : 82 KB / Number-of Response : 283
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

C++相談室 part93



1 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:00:31.85 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part92
toro.2ch.net/test/read.cgi/tech/1320339482/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
toro.2ch.net/test/read.cgi/tech/1323692486/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

175 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:39:45.29 ]
>>170
それはゴミも渡しているんだよ。サイズは1だろが。

176 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 14:40:01.43 ]
>>169
どうやらmainの初期化処理と終了処理の内部で::newが使われて
いるのが原因らしい。bool g_initを付けてフラグで指定すると
うまく動くようだ。でもこれって余分なコードだよね?
codepad.org/xCEvYC2p

177 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:40:32.54 ]
>>173

template <int N>
void func(double (&a)[N]);

みたいな奴か?

178 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:41:27.31 ]
>>175
だからゴミを取り除く議論をしてるだろうが
お前全然人のレス読まないのな

179 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:43:56.89 ]
>>176
いやそれは関係ないと思う
まだエラーが出るぞ

Error 00003. 0x400000 (r) (Thread 0x0E18):
Exception 0xC0000005: Access violation at 0x4.
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170:
| _Nodeptr _Lbound(const key_type& _Keyval) const
| { // find leftmost node not less than _Keyval
|> _Nodeptr _Pnode = _Root();
| _Nodeptr _Wherenode = _Myhead; // end() if search fails
|
Call Tree:
0x00406F41(=operator_new2.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170
0x0040511A(=operator_new2.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914
0x00402881(=operator_new2.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888
0x004026F4(=operator_new2.exe:0x01:0016F4) operator_new2.cpp#49
0x00403535(=operator_new2.exe:0x01:002535) operator_new2.cpp#62
0x0040D19F(=operator_new2.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189
0x0040D2BF(=operator_new2.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124
0x32C5F979(=CC32120MT.DLL:0x01:05E979)
0x32C65399(=CC32120MT.DLL:0x01:064399)
0x32C6533B(=CC32120MT.DLL:0x01:06433B)
0x32C9C66B(=CC32120MT.DLL:0x01:09B66B)
0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9)
0x32C012BB(=CC32120MT.DLL:0x01:0002BB)
0x7C9624CA(=ntdll.dll:0x01:0214CA)
0x7C81CAAE(=kernel32.dll:0x01:01BAAE)

180 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:47:40.15 ]
>>178
ゴミを取り除くためにはstring s = ch;でいいだろ。
charのポインタを渡されたらサイズ不明で処理して\0を終端と見なすしかない。
それを自動でやってくれるのがstring s = ch;

181 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:48:10.94 ]
もういい、しゃべるな。

182 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:49:16.16 ]
>>180 >>125
> 4文字ちょうどの場合は \0 終端されていません。

183 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 14:51:58.17 ]
g_mapのメソッドとnewとdeleteがどこからどういう順番で
呼ばれてくるかが分からない。




184 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:52:38.16 ]
自作関数に限らず、標準関数でも終端は\0として処理するぞ。
4バイト以内に\0が現れなければそれ以降に\0が出るところまでを一文と見なす。
これが正常動作。
最初に\0を付加しないのがバグ。

185 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:55:21.43 ]
いまは固定長でサイズが4だと判明してるから、min( \0が現れる位置、4 )でいいがサイズ不明なら、\0が現れる位置という情報しか取れない。

186 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 14:56:48.54 ]
g_mapのメソッドがコンストラクタよりも前に呼び出される
ということ? どうすればいいんだ。。。

187 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 15:05:47.49 ]
やった!できたー!皆様、有難うございます!
codepad.org/Qz23i49K

188 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 15:13:30.05 ]
>>187 このコードを見て皆様はどう思いますか?

189 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:22:46.37 ]
>>184
バグじゃなくて、わざと'\0'終端でない場合どうするかって話をしてるんだが・・・文盲?

190 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:23:17.62 ]
>>185
sizeof()でいいだろ

191 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:28:53.09 ]
>>187
何これ

Error 00001. 0x350010 (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECC0)

| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()

The object array (0x00BAECC0) [size: 1 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)

192 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:29:40.55 ]
Error 00003. 0x350010 (r) (Thread 0x179C):
Resource type mismatch: a(n) memory block was expected.
free(0x00BAECE0)

| operator_new3.cpp line 65:
| }
|
|> std::free(p);
| }
| void operator delete[] (void* p) throw()

The object array (0x00BAECE0) [size: 5 bytes] was created with new[]
| C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443:
| { // convert C string to _Elem sequence using _Cvtvec
| size_t _Count = _CSTD strlen(_Ptr) + 1;
|> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count];
|
| for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)

Error 00004. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xBA05A0) was never freed

The memory block (0x00BA05A0) [size: 48 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;

193 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:29:51.56 ]
Error 00005. 0x300010 (Thread 0x179C):
Resource leak: The memory block (0xB99270) was never freed

The memory block (0x00B99270) [size: 540 bytes] was allocated with malloc
| operator_new3.cpp line 20:
| void* operator new (size_t size) throw(std::bad_alloc)
| {
|> void *p = std::malloc(size ? size : 1);
| if (p == NULL) throw std::bad_alloc();
| return p;



194 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:53:35.70 ]

           ______
          r〃〃〃 f7⌒ろ)
           l‖‖‖ ||   f灯
            |‖‖‖ ||   | |
            |儿儿儿._」⊥厶
           〔__o____o_≦ト、
.          i / ⌒  ⌒  ヽ )
          !゙ (・ )` ´( ・)   i/
          |  (_人__)    | \
          \  `ー'    /  / ー- 、
.          ,ィ(⊆≧リ≦⊇)〃   /     rク\
.       /   | ̄r少}¨ ̄〃   /    /′ ヽ
      〃 l   |  l| | l| 〃    /     /    └ヽ
     /    l  |l | |l/″   /      !  厂    \
    く,  Y   ! l」fレト!    /       | /        1
    丿  |   | 丿} じ’  /      | /         |
   /     l   | `¨      /      レ′        |

             真の思考停
    (在位 2009年9月16日〜2010年6月8日)

   民主朝の初代考停、言行不一致、虚言、脱税、
   そして外交において巨大な負の遺産を築いた。

195 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 15:55:12.76 ]
できた。これで帰れるぞぉ、はあ。
codepad.org/3Rwidmma

196 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:57:12.60 ]
>>195
今度こそエラー無しだな
おつかれ

197 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 17:22:52.87 ]
>>190
関数の引数ではchar[]を渡せずchar*になることが多い。サイズ不明になる。

198 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 17:41:34.06 ]
>>197
話をそらすなよ
関数の引数の話なら別パラメータでsize_tを渡せばいいし

199 名前:141 mailto:sage [2012/01/04(水) 21:02:54.35 ]
>>195
感謝です

200 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 21:49:07.46 ]
class Object {
ObjectManager * pObjMng;
// ry
};

class ObjectManager {
Container<Object *> cpObj;
// ry
};

こんな感じの相互参照があるんだけど
スマポにするならどっちがshared_ptrでどっちがweak_ptrにするのが一般的ですか?

201 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:08:30.42 ]
所有権を持たない場合にweak_ptrを使う

202 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:15:03.46 ]
集約してるならsp
参照しているならwp
ということでしょうか

203 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:34:57.06 ]
戻り値にするようなモノはsp
というか削除する責任者が
居なくなりそうならsp
自分は削除に感知しないと思う
オブジェクトはwpだろ



204 名前:デフォルトの名無しさん [2012/01/05(木) 06:45:42.41 ]
STLの安全性は保障されていないということでよろしいでしょうか?

205 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 08:46:48.44 ]
C系列で保証なんて何も無いよ

206 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:36:00.48 ]
中身の短いメンバ関数って、積極的にヘッダでインライン化するべきですか?
それとも、大した恩恵は無く、ソース内に入れておくべきですか?


207 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:41:12.11 ]
>>206
呼び出す回数に凄く依存する。
インライン化されずに時間掛かったとして、全体0.01%だったらしなくても変わらず。
出来上がってから実測。

208 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:42:46.14 ]
>>206
自分はコンパイラさんにお任せするのでinlineキーワードを使ったことがない。

209 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:52:54.35 ]
クラス定義内に書いたらinline付いてるのと同じ。

どんなに短くても、ループ内で何回呼び出されようと
自動的にインライン化されることはほとんどないので
自分でインラインにするべきかどうか判断した方がいい。

短ければ関数呼び出しよりもサイズ小さくなる場合もあるし。

210 名前:208 mailto:sage [2012/01/05(木) 15:57:58.20 ]
>>209
あれ?そうなの??
昔最適化で勝手にインラインになるから気にするなって言われたのをずーっと信じてたんだけど。
まー、個人的にはカリカリチューンはきらいだからねぇ。。。
むむむ・・・。

211 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:14:54.06 ]
ボトルネックが確定してから変更すれば良い。
それまでは自分の書きやすい方法で。

212 名前:208 mailto:sage [2012/01/05(木) 16:17:14.64 ]
おk!

213 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:49:01.18 ]
昔はコンパイル単位をまたがる最適化とか一般的じゃなかったけど
GCCは4.5からVCは8から出来たと思う
だから今は関数に別名を付けたいときやヘッダで完結させたいときしかinline使わないな



214 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:52:25.27 ]
インライン使うと、同じ関数が他所に分断され配置されキャッシュの効果が薄まる。
なるべく使わない方がメモリと速度に良い。

215 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:58:37.20 ]
AMDがVC++ならO2よりO1使ってキャッシュに詰め込めと言ったり大変な世界だな

216 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:07:24.77 ]
プライベートメンバのラッパとか
関数呼び出しよりも軽い処理は積極的に
インラインにすればいいんじゃねーの

217 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:12:01.61 ]
Javaとc++どっちやろうか迷ってます。
プログラミングは初めてです。
両方やったことある人に聞きます。
最初はどっちから手を出した方がいいですか?

218 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:14:25.52 ]
>>217
初見でC++は死ぬと思うがな
割と適当でもなんとかなるJavaにしたら?
まぁホント言うならC#(ry

219 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:18:43.63 ]
C++はマルチパラダイムかつ値のセマンティクスがある言語だから、初心者がやると(プログラムが)爆死しやすい。
オブジェクト指向一本に絞ってるJavaのが無難。
メモリ上の扱いとか覚える気ならC++。

220 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:20:22.01 ]
>>217
マルチPOSTすんなカス

221 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:31:58.83 ]
実用面で、PHP(C++のスクリプト言語化のようなもの)
Groovy(JAVAのスクリプト言語化のようなもの)
C#
をすすめてみた。

222 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:37:58.84 ]
Groovyってどんな言語? JavaプログラマのためのGroovy入門(2/7):CodeZine
codezine.jp/article/detail/3757?p=2

223 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:42:28.04 ]
>>213
ヘッダだけで完結させるならstaticじゃね
どちらでも内部結合になるし、
そんな場合は大して長くない処理を書くことが多いからinlineでも
全然問題ないと思うけど



224 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:45:02.44 ]
C++からやれよ。AOJとかの結果見ると、Javaがどんだけメモリバカ食いで実行速度遅いか、がく然とするぞ。

225 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:48:40.31 ]
>>223
下駄雪駄もstaticで書くのか?w

226 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:49:15.64 ]
>>223
下駄雪駄もstaticで書くのか?w

227 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:53:10.30 ]
>>225
普通の関数の話だった
セッターゲッターはstaticの意味が変わってしまうがな
てか下駄雪駄の意味がわからずしばらく考えたじゃないか

228 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 18:56:59.60 ]
内部結合のstaticはC++11で廃止されたから使わない

229 名前:206 mailto:sage [2012/01/05(木) 19:03:11.22 ]
みなさんどうもです。
セッタやゲッタの中にも数行必要なものもありますし、
そうなるとますますソースとヘッダどちらに書くかの境界線が判断できない上に、
「このセッタはヘッダ」「このセッタはソース」みたいになると、
個人的には読みにくいと感じるため、>>211さんの言われるように、
ボトルネックだと感じるまではすべてソースに書いておこうと思います。

230 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:34:46.07 ]
>>218
べつにC++からでいいだろ。
Java勉強しなくても、C++知ってりゃ書ける。
その逆はない。

231 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:38:36.01 ]
オブジェクト指向言語からやるとC++の変なところを学習しにくい
C++を便利に使ってしまう

232 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:44:00.84 ]
>>214
それはない。インライン展開しまくったとしても、
今時のキャッシュメモリなら1次キャッシュに収まるからな。
それと、96bit画像の描画したときは、インライン展開した方が、
関数外と関数内の式が結合され7割まし早かった。

233 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:51:23.46 ]
OO勉強したいなら、PythonやSmalltalkから入ったほうがマシだろ。
参考書の大半が引数書き換えを邪気に扱ってるし、
オブジェクトの委譲によって、オブジェクトを組み立て、
オブジェクトの振る舞いを作ることによりプログラムの動作を
決めるというOOの基本を実践してるサンプルが少ない。

SwingでGUIをつくるのにJFrameを継承するとかバカな解説ばっか。



234 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:12:28.04 ]
実はオブジェクト指向ってしっくりこないんです!

235 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:13:37.27 ]
そうですか。それはスパゲティですね。

236 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:33:57.78 ]
私はIS部門の人間なんです。SIerの客なんですよ。私に嫌われたらどうなりますか?
皆さん生きていけないですよ!

237 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:38:35.52 ]
優柔不断なのが悪い
他の女とどうなるか解からんが
素直にシャルルを選んどけ

238 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:39:08.77 ]
>>236
>私に嫌われたらどうなりますか?

おまえの仕事をする奴がいなくなるだけじゃない?

239 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:42:45.09 ]
みながわさんはいまだにオブジェクト指向の話で持ち出されるのか

240 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 02:02:23.80 ]
>>223
inline に内部結合にするなんて効果は無いよ。

241 名前:デフォルトの名無しさん [2012/01/06(金) 02:07:20.94 ]
すみません、C++初心者です
例えば、Objクラス型のオブジェクトを、引数なしで作成・初期かする場合、

Obj obj;

とするだけで、デフォルトコンストラクタがよばれるのでしたっけ?

それとも、

Obj obj();


でないといけないのでしょうか。

242 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 02:08:53.29 ]
>>241
なんで試さないんだよ

ちなみに前者が正解。後者はアウト。

243 名前:241 [2012/01/06(金) 02:12:05.64 ]
>>242
すみません。。
どうもありがとうございます。

デフォルトコンストラクタに、適当なpublicメンバ変数aに定数を代入する
操作が入ったHogeクラスを作って、

Hoge obj;


のあと、obj.aの内容をみて確かめてみます。



244 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 07:22:00.98 ]
>>228
見たけど別に廃止されてなかったが (3.5-3)

245 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 10:15:13.53 ]
>>244 deprecatedじゃね

246 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 10:30:20.35 ]
C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?

247 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:02:49.28 ]
>ある程度アクセス制御されたグローバル変数
具体例頼む。

248 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:33:20.05 ]
class shared {
protected:
static int n;
};

class hoge : public shared {};
class fuga : public shared {};

みたいに丸出しよりましかな程度のものだけど

249 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:36:26.76 ]
関係ないけどこれの方がnをcppで定義しなくていいから楽。

class shared{
protected:
static int &n(){ static int value; return value; }
};

250 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:37:03.63 ]
>C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?
どっちでもいいんじゃない?マルチパラダイムなんだし。

251 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:56:25.41 ]
>>246 「いい」の基準が不明だな。どっちにも文句を付けられるだろう。

252 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:25:32.88 ]
>>248
どっちも無し。

int n;
new hoge( &n );
new fuga( &n );
で十分

253 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:41:32.84 ]
template<typename T>
struct temp_type{ typedef const T &t; };

template<typename T>
struct temp_type<T*>{ typedef T *t; };

template<>
struct temp_type<int>{ typedef int t; };

template<typename T>
void hoge(typename temp_type<T>::t v){}

int a = 1;
int *b = &a;
struct HOGE{} h = {};
//C2783
hoge(a);
hoge(b);
hoge(h);

テンプレートで指定された型に応じて
値を渡すか、const参照を渡すかを決めたいのですが
「テンプレート 引数を 'T' に対して減少できませんでした」
となります。

関数hogeでは引数を書き換える予定はないです。
テンプレートでない関数の場合は
例えばconst int &やint *const &など渡さないと思うし
参照を関数内でデリファレンスするのも無駄だと思うので
アドレスとおなじサイズの整数やポインタを渡す場合は
値渡し選択したいのですが、どのように書いたらいいですか?



254 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:47:54.36 ]
hoge<int>( 10 ); // おそらくOK



255 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:51:12.06 ]
>>253
template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
template<typename T> void hoge(int v);
これでは何故ダメなのか?

256 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:25:35.67 ]
ideone.com/sKJtY

257 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:29:15.48 ]
複数のクラスが互いに参照しあって連携してるケースは難しいね
メディエーターパターンを使ってシステムの連絡路を一本化するのがいいと言われてやってみたけど
メディエーターのインターフェースが凄まじく大きくなってしまった

258 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:30:20.02 ]
それはどういう意味があるコードなの?
オーバーロードとは何が違うの?

259 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:31:41.96 ]
>>254 型を書けばいけました。でも呼び出し側の書き方は変えたくないです。
>>255 hogeの処理は共通なので定義は1つにしたいです。

hogeのような関数がたくさんあって、呼び出しも多いので
関数を型の個数分書いたり、呼び出し部分の記述量を増やすことなく
実現するにはどのようにしたらよいですか?

条件後出しですいません。

260 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:38:49.00 ]
template<typename T> void hoge(const T &v);
template<typename T> void hoge(const T *v);
処理の内容が同じならこの2つでいいよ。
後者は、前者を呼び出すだけでいい。

速度はコンパイラが勝手に最適化するから気にすんな。
うんな事より、プログラムを1つ完成させることに力を入れろ。
どうしても気になるなら最適化後のアセンブリコード見て確認してみ。

261 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:41:42.27 ]
>>257
Mediatorを分割すりゃよかったんじゃね。
別に1つの依頼者クラスが1種類の調停者にだけ
依頼せにゃならんわけでもないだろう。

そもそも何をしてるのか知らんから
Mediatorが適した課題かどうか怪しいが

262 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:41:49.47 ]
@
bool Load()
{
return false;
}

A
void Load()
{
new throw Exception()
}

関数のエラーをboolかthrowどっちで検知すればいいのだろうか


263 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:44:12.88 ]




264 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:48:23.09 ]
正解: optional

265 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:55:09.37 ]
>>241

C++11からは、一様な初期化構文を使って、デフォルトコンストラクタ呼び出しを明示できるよ
ttp://d.hatena.ne.jp/faith_and_brave/20111221/1324394299

X x; // ok

X x(); // error

X x{}; // ok (C++11)


266 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:57:37.01 ]
X x {} って気色悪いな

267 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:58:50.74 ]
C#ではよくある事。

268 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:17:49.32 ]
class IHoge {
public:
virtual ~IHoge(void) { }
virtual void Method(void) = 0;
};

class HogeBase : public IHoge {
public:
void Method(void) { }
};

class HogeEx : public HogeBase { };

こうやっていちいち分けるのが流行ってるのはなんで?
どうせポリモーフィックなクラスはほぼ全てがHogeBaseを継承するんだし

class HogeBase {
public:
virtual ~HogeBase(void) { }
virtual void Method(void) { }
};

class HogeEx : public HogeBase { };

でいいじゃないですか?

269 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:30:19.69 ]
>>268
IHogeって事はCOMか?COMは実体を持てないからな。

それは別として、最上位に完全抽象化クラスを置いとくのは、
HogeBaseの全てをオーバーライドするクラスを作ったとき、
HogeBaseの実装がデッドウエイト(容量食うだけのゴミ)になるから。


270 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:32:37.36 ]
>>262
Function( source.Load() ); // Loadはsourceから読み出した情報を返す
こういうコードを書こうとしたとき、どっちを取るべきが正しいか考えろ。

271 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:39:14.50 ]
>>269
なるほど

272 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:48:34.28 ]
>>262
Loadが失敗する状況がふつうにありえそうなら1。
(プログラムの実行自体が怪しくなるような)ハードやOSの異常による状況でしか失敗しないようなら2。

273 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:51:30.44 ]
bool Load(...) {
// ファイルフォーマットエラーなど
return false;
// ハードウェアエラーなど
throw unko();
// 成功
return true;
}

これで決まりや



274 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:01:26.36 ]


 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
 もろに北朝鮮と繋がっているテレビ局が1つ  
年寄はまだまだテレビという外国人に騙され続ける


275 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:03:02.69 ]
例外とはまさしく例外であり必ずキャッチされなければプログラムを終了するしかないものに対して使うのがいいだろう。
一方、返却値は返却値。失敗してもいかなるリソースの破壊、開放忘れも発生しない場合に使える。

276 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:05:46.18 ]
事前に書いたフローチャートに書いてないことは例外

277 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:07:59.24 ]
例外ってフローチャートに書いてないの?

278 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:13:05.48 ]
普通は書かない
書いてあるならどんなエラーでも想定の範囲内だから例外ではなく返り値などで判断

279 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 23:42:39.91 ]
二重キャストって意味あるんだね
はまって痛い目見たよ
こんなん

template<class T> struct Base {
  Base(){ unko = reinterpret_cast<__int64>(this); }
  void OK(){ T *t = static_cast<T *>(reinterpret_cast<Base<T> *>(unko); }
  void NG(){ T *t = reinterpret_cast<T *>(unko); }
  __int64 unko;
};

struct Derived : Base<Derived> {};

int main()
{
  Derived d;
}

280 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 00:19:45.06 ]
void NG(){ T *t = reinterpret_cast<Base<T> *>(unko); } これだけで十分そうだが?
reinterpret_castで直接reinterpret_cast<T*>してんのが引っかかっただけじゃないの?
void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
オフセットが違うから位置がずれて異常が起きる。

281 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 00:54:17.62 ]
>>280
>void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
>オフセットが違うから位置がずれて異常が起きる。
ありがとう、目から鱗だわ
ポインタ値とアドレス値は同じものだと思ってたけど違うのか


282 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 01:39:13.10 ]
>>245
廃止ってのはexportみたいなのを言うんだ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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