1 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:04:54 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part66 pc12.2ch.net/test/read.cgi/tech/1231640498/ ※part63, part66 が重複していたようですので part69 としました。
281 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 14:18:55 ] じゃあ俺はなめらかプリンでよろしく
282 名前:271 mailto:sage [2009/05/17(日) 14:33:58 ] >>280 サーセン。吊って来ます。 ありがとうございました。
283 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 14:35:03 ] constの同音異義語っぷりもなかなか見事なものだ
284 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 17:10:42 ] >>280 非組み込み型の戻り値について const つけてあると、右辺値参照として取れなくなっちゃいそう。 この指針は将来的に非推奨になるんじゃなかろうか?
285 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 17:52:26 ] そもそも右辺値参照自体が、 Effective C++で問題が広く知れ渡ったことで 実装されることになったんじゃないかな。 ぷらぷら界に多大な影響を与えた引き替えに、 次の版は全面改定だな。
286 名前:デフォルトの名無しさん [2009/05/17(日) 17:55:23 ] cppunitに関する質問ってありですか?
287 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 17:56:06 ] >>286 専用スレがあるから、まずはそっちで。 ↓ CPPUnitについて少し話そうかい pc12.2ch.net/test/read.cgi/tech/1042358524/
288 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 18:07:21 ] 互換性考えたら右辺const値のオブジェクト代入は右辺値参照を無視してコピー噛ますんじゃないかな
289 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 18:09:03 ] そう。だから右辺値参照を使って最適化しているつもりが、うっかり今までどおりの コピーになったりすることが考えられる。まぁ最適化の範疇と認識する分には問題には ならないんだろうけど。
290 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 19:44:11 ] 右辺値参照って、なんだかよく分からない。 C++0xが出れば解説も増えるかな?
291 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 20:32:36 ] 僕もよく解らないけど、関数の返すオブジェクトがコピーされるとき、 もとのオブジェクトが捨てられる場面で、 コピーコンストラクタを呼ばないでよりコストの低い破壊的なコピー、 つまりオブジェクトのメンバを移動することをするってことなんでしょ? ただそれだけでしょ?
292 名前:290 mailto:sage [2009/05/17(日) 21:12:34 ] 現在 標準C++のコンパイラの最適化機能として実装されている 戻値最適化 とは違うのかいな? C++ ラビリンス Return value and constructor ttp://www.fides.dti.ne.jp/~oka-t/cpplab-retval-ctor.html
293 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:12:36 ] そうそう、「移動」の概念(ムーブセマンティクス)を容易に実現するための言語仕様として考え出されたのが右辺値参照。 ほかに分かりやすい例を挙げるとしたらauto_ptr(の後継)がvectorに入れられるようになることとか、 functionやbindなどで各引数のconstや参照の有無の挙動を完全に再現したoperator ()を実現できるなんて効果がある。
294 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:27:43 ] 多次元配列の要素全てを任意の値で埋めたい場合 どう書くのが良いでしょうか。 1次元の場合は std::fill や std::fill_n が使えるのですが。 int a[10][10]; for(int i=0; i < 10; i++) for(int j=0; j < 10; j++) a[i][j] = 42; ということをしたいわけです。
295 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:28:25 ] >>292 最初の例や2番目のコピーコンストラクタ・代入演算子が呼ばれる例でもムーブセマンティクスは効く。 そこのコピーコンストラクタ・代入演算子の呼出が、ムーブコンストラクタ・代入演算子の呼出になる。 一般にムーブコンストラクタ代入演算子はコピーコンストラクタと違って、 それより遙かに低コストで例外の投げようもない実装になるので、より最適なコードになるとされる。
296 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:31:12 ] >>294 自分で書いてるじゃねーか。何が不満なの?
297 名前:デフォルトの名無しさん [2009/05/17(日) 21:34:04 ] 酒鬼薔薇
298 名前:290 mailto:sage [2009/05/17(日) 21:34:39 ] >>295 ほっほー。 そうなのかぁ。 ありがとう。C++0xが楽しみになって来たんだぜ。
299 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:46:45 ] いや普通に memset(a, 42, 100); で、いいんでない。string.h が使える環境なら それより最近、スザンヌとギャル曽根の区別が付かなくて困ってます 見分け方を教えてください
300 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:47:47 ] >>299 int に memset() して 42 になるとでも思ってんのか?
301 名前:299 mailto:sage [2009/05/17(日) 21:47:53 ] アンカー忘れ。>>294 な
302 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 21:51:12 ] >>299 これはひどい。
303 名前:299 mailto:sage [2009/05/17(日) 21:52:38 ] すまん。レス取り消し。int だったね 回線切って(ry
304 名前:299 mailto:sage [2009/05/17(日) 21:53:52 ] >>301-302 仕事速いな。暇人
305 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:04:38 ] >>304 お前の方がよっぽど暇人に見えるんだが
306 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:11:27 ] >>294 その配列だったら連続性が保証されてるから std::fill_n(&a[0][0], 100, 42) でいいだろ。
307 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:12:15 ] >>294 お好きなほうをどうぞ。 std::fill_n(&a[0][0], sizeof a / sizeof a[0][0], 42); namespace bll = boost::bind; std::for_each(a, a + sizeof a / sizeof a[0], bll::bind(std::fill_n<int*, std::size_t, int>, bll::_1, sizeof a[0] / sizeof a[0][0], 42));
308 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:23:24 ] >>307 std::fill_n(first, n, val) は [first, first + n) に対しての操作だから 要素数でOK。sizeof a / sizeof a[0][0] は冗長。
309 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:26:42 ] それも要素数・・・
310 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:28:14 ] g++にてテンプレートに暗黙の型変換を絡めたら分からなくなったので教えてください。 C++ code - 60 lines - codepad ttp://codepad.org/l7pocEaw このソースコードでは50行目hoge < short(1)の部分で error: no match for 'operator<' in 'hoge < 1' と言われてしまいます。どうやら暗黙の型変換がうまくいかないようです。 これを改変してForward declarationを無くして代わりにクラステンプレートの内部で friend 関数を定義することで回避できます。 C++ code - 49 lines - codepad ttp://codepad.org/F0VomJTk しかし、どうして前者のソースコードでは暗黙の型変換がうまくいかないのでしょうか?
311 名前:294 mailto:sage [2009/05/17(日) 22:30:18 ] みなさまありがとうございます。 std::fill_n(&a[0][0], sizeof a / sizeof a[0][0], 42) がよさそうですね。勉強になりました。
312 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:39:30 ] >>309 だから、要素数が既知なのに一々冗長に書くことないってこと。
313 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:42:54 ] >>312 「要素数が既知」ということに依存したコードにするほうが面倒なこともあると覚えておけ。 一般的には、保守性のほうが一回だけの記述の利便よりも重要だ。
314 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:45:14 ] >>313 何頭に血を登らせてるの? 質問者が提示したコードで要素数が定数になってたんだからそれでいいだろ。 不明な場合に要素数を計算するのは当然のこと。
315 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 22:45:22 ] >>312 マジックナンバーは避けるべきだろjk const N = 10; int a[N][N]; なんてしているならsizeofを使わずにNと書いてもいいとは思うけど。
316 名前:デフォルトの名無しさん mailto:sage [2009/05/17(日) 23:08:17 ] そういう本質でない話はもういい
317 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 01:54:38 ] template<T,U>void fill(T (&d)[U],T v){for(unsigned i=0;i<U;++i)d[i]=v;} template<T,U0,U1>void fill(T (&d)[U0][U1],T v){for(unsigned i=0;i<U0;++i)for(unsigned j=0;j<U1;++j)d[i][j]=v;} マジックナンバーイラズサイテキ化キタイダイ int a[10][10]; double b[10]; fill(a,0); fill(b,0.0);
318 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 02:07:27 ] オナニーレスうぜえな ループを書きたくないってのが本題なのに、それじゃ本末転倒だろうが
319 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 02:22:32 ] >>318 何いってんの? ライブラリって知ってる?
320 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 02:57:44 ] >>310 暗黙の型変換はテンプレートを具象化しなければならない時には行われないから んで、どうすればいいかというと後者のようにすればいい Effective C++の46項に詳しく書いてあるよ
321 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 03:25:03 ] >>284 ,285,288,289 C++0x の話としては,戻り値の型が const 修飾されていると move 出来ない (immutable な右辺値になる) ので, Effective C++ の記述がやや古くなるのはその通りだと思います. C++0x 的には, EC++ のこの記述は 恐らく "Extending move semantics to *this" と "Defaulted and Deleted Functions" との組み合わせに置き換わるべき話だと思います.
322 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 03:56:14 ] C++が苦手なCプログラマなのですが、ちょっと質問です。 ファイル内の文字列を探すプログラムです。 これをC++で書くとしたらこの程度でもクラスを作るのですか? #include <stdio.h> #include <string.h> int main(int ac, char * av[]) { //ファイルからメモリーに読み込み FILE * fp = fopen("文字列が入ったファイル", "r"); fseek(fp, 0, SEEK_END); int fSize = ftell(fp); fseek(fp, 0, SEEK_SET); char * buf = (char *)malloc(fSize); fread(buf, 1, fSize, fp); fclose(fp); //さがす char ss = "abcde"; int ss_len = strlen(ss); char * p = buf; for (int i = 0; i < fSize - ss_len; i++) { if (strncmp(ss, p, ss_len) == 0) { printf("%d番目に見つかりましたよ\n", i); return 0; } p++; } free(buf); return 0; }
323 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 04:00:29 ] おれはc++のOOP が標準だから、特別な理由が無い限りOOPで書く。 英語で育った人は、特に何も考えずに英語会話するのと同じ
324 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 04:03:57 ] その程度だと、既存のクラスを使うだけで出来上がるね。つまり、クラスを作る出番ではないと。 極論すればクラスってのは作るものというより使うもの。
325 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 04:09:51 ] それに、mallocをfreeしてないでしょ、終われば開放するけど、 それはたまたま短いプログラムだから、OOPだと、明示的にディストラクタがある。 まあ使わなきゃ意味無いけど、私はこれも標準で書いてしまう。だから少し安心なわけ。 それに、そのプログラムはバッファーオーバランしないようだけど、それも、保護されやすい。 ただし、標準でOOPが身についてるからであって、人によってはOOPでもいくらでも汚くかける。
326 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 04:13:16 ] あ、ごめ freeしてた orz
327 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 04:14:40 ] いや…、Cはもう、身についてないから…と言い訳する orz orz orz
328 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 04:16:55 ] 一人で無駄に4レスも使いやがって
329 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 04:17:57 ] 俺はその程度ならclass内でやったりしないな。FILEも普通に使うし。 ただ、バッファはvector<char>で確保するし 探索も文字列探索クラス(BM法とか)を作って実行するね。 処理自体は(mainには限らないが)普通の関数に置く。 ただこれは当然「ファイル内の文字列探索が処理の全て」の場合。 何らかのclassの処理の中でファイル内探索を必要とする時は、当然そのように書く。
330 名前:310 mailto:sage [2009/05/18(月) 05:52:46 ] >>320 Effective C++では後者の方式が天下りに与えられていました。 あくまで前者のような方式(実装をクラス宣言部分に書かない) で解決する方法はありませんか? (後者の方式でprivate宣言されたヘルパー関数を呼び出すという回避策もありますけれど。)
331 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 05:56:50 ] >>325 destructor はディストラクタではなくデストラクタね。発音的にも用語的にも。 ディスクトップでなくデスクトップなのと同じで。
332 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 10:51:25 ] >>330 関数が2つになっちゃうけど、 クラス内に template<typename T> friend bool operator <(const Hoge &lhs, T rhs); template<typename T> friend bool operator <(T lhs, const Hoge &rhs); って書けば、関数テンプレートの定義を外に書けると思う…たぶん それか、関数テンプレートをやめて定義を特殊化して書いてもいけるんじゃないかな。 間違ってたらサーセン
333 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 16:13:37 ] >>322 を見て思ったんですが、 ファイルを読み込み文字列検索するだけでこんな長く分り難いにコードにえーって感じなんですが、 C++を使って書くとこれより短く解りやすいコードになるんですか? それはどんな感じになるんですか? >>322 で printf("%d番目に見つかりましたよ\n", i); return 0; ここでreturnしているんですが、ここではfreeしなくて良いんですか?
334 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 16:41:01 ] >333 main() {system("grep abcde 文字列が入ったファイル");} >free リークしていないので問題ないが、姑に目を付けられる。
335 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 16:53:00 ] でも突然サブルーチンに昇格する可能性もあるから、 常にfreeした方がいいよ。
336 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 17:02:55 ] >>334 >free 見つかった時、見つからない時の両方でfreeしないなら良いけど 片方しかしてないって、C使いらしくないんじゃない? 短いコードでたった2箇所を管理するだけなのに、それすら出来ないなんて
337 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 17:55:44 ] freeの仕様について言及しただけで、 >>322 のソース自体に文句付けるなら もっといろいろあるだろ。
338 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 21:07:11 ] return 0; を break; に置き換えるとか?
339 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 21:14:11 ] ファイルを一気に読むのが好きになれない、俺なら1行ずつの処理にする。
340 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 21:15:00 ] 配列まではすんなり頭に入ったけど、ポインタとかクラスのメンバ関数とかわけわかんねー・・ なんにしても作りたい物が無ければ頭に入らない気がしてきたんだけど、ドリルみたいなものって無いですか
341 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 21:16:19 ] 宿題スレに山ほど
342 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 21:19:51 ] こんなスレあったのか、ありがとう
343 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 21:35:44 ] >>341 宿題スレはいいよな 糞問ばっかりだけど最初のうちは数こなす方が大事だし
344 名前:310 mailto:sage [2009/05/18(月) 23:20:37 ] >>332 なるほど。 やはり関数を1つにまとめ、かつ (特殊化をすると妨げられる)汎用性を保とうとするならば Dan Saksの More C++ Idioms/friend 関数の生成(Making New Friends) - Wikibooks ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends) すなわちEffective C++でいう後者の方式しかないようですね。 ありがとうございました。
345 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 23:30:53 ] 次はコナン風で頼む。
346 名前:デフォルトの名無しさん [2009/05/18(月) 23:32:24 ] どっちのコナンだよ
347 名前:デフォルトの名無しさん mailto:sage [2009/05/18(月) 23:43:35 ] やってくれるのか? わくわく
348 名前:デフォルトの名無しさん mailto:sage [2009/05/19(火) 01:23:32 ] コナン・ザ・グレート風で頼む。
349 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:15:48 ] クラス中の宣言の中でメンバ関数の定義をした場合、 自動的にinline展開要請になるんだよね? では クラス中の宣言の中でfriend関数の定義を記述した場合、 inline展開要請になるのかい?
350 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:32:49 ] ^^
351 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:35:26 ] inline展開陳情のほうがいいかも。
352 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 23:49:36 ] 俺のBCC 6.1.0ではオプションを付けない限り inline は全部無視される\(^o^)/ デバッグの時の事を考えてだと
353 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 00:48:25 ] >>352 BCC以外でもみんなそうだけど……。
354 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 15:44:38 ] 同じ質問になるのですが、86とは別人です。 コンストラクタで例外を投げるな、というのをかなり以前Cマガジンで読みました。 その後、Google や >>93 で、コンストラクタ内で例外を投げる時に 適切にリソースを解放すれば問題ない、というのが多かったのですが、 以下のサイトに気になる記述も見つけました。 ttp://www.geocities.jp/chacha_yhk1219/prog/prog004.html newで作ったときにオブジェクト自体がリークしてしまう monoist.atmarkit.co.jp/fembedded/symbian/symbian04/symbian03.html ポインタが返ってこない。知らないポインタは消せない コンストラクタで例外を発生させてもよいが、その場合は new するな、 という理解でよいでしょうか。
355 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 16:19:13 ] >>354 Symbianは組込だからそうなっていないのかもしれないが、普通はその心配は要らない。 その場合は確かにプログラムで対処できないので、言語が面倒を見てdeleteしてくれる。 規格では15.2にそう定められている。 ちなみに、そういうわけでnewを定義するときには必ず対応するdeleteを定義しないといけない。 ttp://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-2.html
356 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 17:13:34 ] >>355 規格での項番まで示していただきまして、有難う御座います。 15.2/2 の箇所ですね。 規格に正しく準拠した処理系であれば問題ないとことで、懸念なく利用したいと思います。 有難うございました。
357 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 22:49:39 ] 初心者ではないと思っていたのですが、初心者からこんな質問を受けて 的確に答えられなかった自分が恥ずかしいです。どなたか、模範解答を教えてください。 「ヘッダファイルの用途と、使用によるメリットは理解できました。 ただ、cpp ファイルを分ける目的がわかりません。 また、cpp ファイルを複数持たせた場合、ビルド順はどうなるのですか?」 宜しくお願いします。
358 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:01:32 ] むしろcppファイルを分けないでどうやってまともに開発しているのか分からないぐらいだが。 分割コンパイルすることで仕様変更に伴う再コンパイル時間の短縮とかも見込めるけど、 それ以上にそもそも他人が作ったクラスとかを使いたい(再利用したい)場合とか cppファイルが分かれてなかったら再利用できないだろ。
359 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:06:45 ] >>358 その観点で考えると、うちのプロジェクトは基本的にほどんどがヘッダファイルで構成されていて、 クラスは基本的に .h で作って #include で取り込む、っていう方法を取っています。 なので、再利用には困りません。 ほとんどがヘッダっていう考え方がNG? あと、ビルド順序はどうなるものですか?やってみたんですが分かりませんでした。
360 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:07:48 ] いやまて。ヘッダファイルに直接定義を書き込んでいるのか? そんなことできないだろ。
361 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:10:52 ] 出来るだろ。じゃないとboostのビルド不要なライブラリは実現できないよ。
362 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:12:36 ] 「ビルド順はどうなるか」って、質問者はもちろん、>>357 自身も理解してない気配。 分割コンパイルやリンクについてわかってないまま脱初心者とは。 ちなみに、グローバルやclass-staticな変数の初期化順については 何も規定されていないことが規定されている。 ということは、リンク順についてそれが当てはまることを意味するが 規格に「リンク」という単語が出ているかは知らない。 cppの分割については>>358 と同じ。 classにわけたり、意味的なまとまりにわけたりして まともなものを作るのなら分割するのが当然。 >>359 Javaチックな書き方ってことかね。 別にそれならそれで良いんじゃないの。 .hに全部書く、ということは、「ビルド(コンパイル)時間の短縮」なんて 露ほどにも考えていないということだから、 再利用もできるし分割コンパイルなんて必要無いかもね。
363 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:13:20 ] 言い方がまずかったか。「できないものがある」。こうだな。 もしかして、全部 inline にしたり、あらかじめ obj にしたりしてあるのだろうか。
364 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:17:24 ] >>359 >クラスは基本的に .h で作って #include で取り込む、っていう方法を取っています。 >なので、再利用には困りません。 >ほとんどがヘッダっていう考え方がNG? マジ?? その会社 大丈夫??? 考えて見ればcppファイルが1つだけなら関数の定義とかを.hに書き込んでも バイナリの時点で重複は起らないが(hでインクルードガードしていること前提ね。) それにしても、、、ねぇ。。。
365 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:18:54 ] >>360 dllexport が必要な時と、main() 系、コールバック系以外はすべてヘッダファイルなんです。 クラスの定義や構造体など、ほとんど。 ヘッダファイルの考え方が違うのかな… >>362 規定が無い点について理解しました。 確かにうちのプロジェクトのソースはビルド時間かなりかかるんです… .cpp で書くと分割コンパイルされて速度が向上するということですね。 まったく知りませんでした。。 まさに java チックです。 なので、include 順序がかなり大事で問題も結構起きるんですよね。 でも私個人的には、c++ で開発しているので、c++ の基本を知りたいです。 >>363 全然、そんなことないんです>< おまけに、プリコンパイルヘッダもないので時間ばかりが掛かって…
366 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:21:28 ] >>365 ヘッダに定義を全部書いたら、クラスのインタフェースに全く影響を及ぼさない 変更であっても、そのヘッダに依存するソースファイルすべてが再コンパイル されるじゃないか。その程度も分かってない会社って一体・・・
367 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:22:39 ] >>364 インクルードガードしてもできないよ。 インクルードガードは同一翻訳単位内でしか有効ではないから。
368 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:25:16 ] >>364 そうなんですよ!! .cpp ファイルは main 用に1つだけあって、あとは .h の処理を呼び出したり、 クラスを生成してクラスに処理を任せたり、、、 グローバル関数までもが .h に居る始末です。 >>366 まさにその通りですね。 これでも一部上場なのですが、本当にお恥ずかしいです。
369 名前:364 mailto:sage [2009/05/23(土) 23:25:54 ] >>367 いやできるでしょ。 cppが1つしかないんだぜ? ってことは翻訳単位も(恐ろしいことだが)一つってことじゃん。
370 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:27:17 ] すでに拡張子の意味を逸脱した使い方なのはわかった
371 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:29:20 ] >>369 あぁ、そういうことか。理解したw すごいな。
372 名前:357 mailto:sage [2009/05/23(土) 23:33:35 ] 結論としては、>>370 がおっしゃっているように、 拡張子の意味を確実に逸脱しているのですね。 みなさんがおっしゃったように、リンクの意味を理解していなかったようです。 分割ビルドは十分理解できました。 今一度教えてください。みなさんは .h を基本的にどのような用途で利用されていますか? また、現状のように .cpp を1つだけもち、ほとんどすべてを .h に置くことで発生しうる 考えられる問題がありましたら教えてください。 >>369 すみません、私は理解できませんでした。 まだ初心者であることを思い知りました。 翻訳単位が1つだと、恐ろしいものですか?時間が掛かる、という観点でしょうか。
373 名前:369 mailto:sage [2009/05/23(土) 23:40:35 ] >>372 >翻訳単位が1つだと、恐ろしいものですか? そんな開発者見たことないから、恐ろしいと形容した。 >今一度教えてください。みなさんは .h を基本的にどのような用途で利用されていますか? あくまで宣言だけを書いておく。 MyClassを使う必要があればMyClass.hをインクルードする。 一方MyClass.cppにもMyClass.hをインクルードしておいて、別途コンパイルしておく。 こうすることで、MyClass.cppが変更されても他の大部分のcppは再コンパイルしないで済む。 あるいはMyClass.cppをコンパイルしてライブラリとして公開する場合、 他社には.hだけを見せるわけだから実装を隠せるとか。 >また、現状のように .cpp を1つだけもち、ほとんどすべてを .h に置くことで発生しうる >考えられる問題がありましたら教えてください。 他の会社や組織に公開する時に実装がだだ漏れになるとか
374 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:46:19 ] つか、どんな教科書で勉強したんだよ。 大概の教科書は分割の仕方書いてあるだろ^^
375 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:49:36 ] >>372 ビルドに時間が掛かって仕方がないだろう
376 名前:357 mailto:sage [2009/05/23(土) 23:54:38 ] >>323 なるほど、、、将来を見据えた設計をしながら開発してるんですね。 なんかもう、うちの会社が悩ましいです。 >>374 会社の研修では一切… ちなみにほとんどのプロジェクトがそんな感じです。 java と COBOL 人間ばかりなので、include = そこにそのファイル内容を挿入、っていう 意味合いだけしか着目していないんだと思います。 >>375 その通りですね。勉強になりました。 今日皆さんにご指導いただいた内容を以って、会社の開発体制の改善を 促して以降と思います。 ありがとうございました。
377 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:55:23 ] まて、>>357 は本当にC++を扱う一部上場企業に勤めているのか? 例えば、分割コンパイルには関係ないようなC++の問題だしても解けるか?
378 名前:357 mailto:sage [2009/05/23(土) 23:55:32 ] >>376 ○ >>323 × >>373
379 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:56:27 ] どうせ元ABCのあそこだろ?
380 名前:デフォルトの名無しさん mailto:sage [2009/05/23(土) 23:59:44 ] >>377 私も信じられなくなってきましたが、こんな開発者ばかりながらも、 一部上場です。 私はアセンブル系のドライバ開発あがりで、ウィザードを利用して ATL/WTL アプリケーションの 開発をやっているので、一から自分でファイルを作ってプロジェクトを構成したことがありませんでした。 20年弱もプログラミングをして来ましたが、初心者からはなかなか抜け出せませんね。 大変勉強になりました。
381 名前:デフォルトの名無しさん mailto:sage [2009/05/24(日) 00:06:46 ] >>380 そうなのか。 じゃあもういっそC++やめて、各自が得意なCOBOLとかアセンブラやればいいのではないでしょうかね。。。 少なくとも一人、C++の知識がある人が居ないととんでもないことになるのでは。 まああなたがその一人になれば良いだけだが。 頑張ってください。