C++相談室 part84

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
1 :デフォルトの名無しさん :2010/08/04(水) 18:34:23
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part83
http://hibari.2ch.net/test/read.cgi/tech/1280914463/
2デフォルトの名無しさん:2010/09/18(土) 00:10:03
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2010/09/18(土) 00:10:09
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4デフォルトの名無しさん:2010/09/18(土) 00:10:16
5デフォルトの名無しさん:2010/09/18(土) 00:10:26
6デフォルトの名無しさん:2010/09/18(土) 00:10:34
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
7デフォルトの名無しさん:2010/09/18(土) 00:10:41
テンプレは以上です。
8デフォルトの名無しさん:2010/09/18(土) 00:46:09
>>1 乙です
9デフォルトの名無しさん:2010/09/18(土) 01:00:11
for(it = c.iterator(); it /*op bool*/; ++it)
{
cout << *it << endl;
}
こういうインターフェースのほうがシンプルでいいと思うんだけど
ポインタ互換性が無いけどいまどき生配列でループ回す人なんかいないでしょ
どうしてもポインタ使いたいならit = iterator(ptr, ptr + N);とかでイテレーター作ればいいし
標準化の人たちはほんとセンスないよね
10デフォルトの名無しさん:2010/09/18(土) 01:11:44
センスがないのはお前だ

- 部分レンジをイテレータで表現できなくなる(例えばどうやって std::partial_sort の引数を渡すんだ?)
- operator bool は論外(暗黙の変換のせいでおかしな式がいろいろコンパイル通るようになる)
11デフォルトの名無しさん:2010/09/18(土) 01:20:13
>>10
別にpartial_sortには矛盾しないでしょ
partial_sort(c.iterator(), c.iterator() + n, c.iterator() + c.size());
operator boolでループの打ち切りを判断できるだけで別に終了条件をいつもの比較にしてもなんら問題は無い拡張だからね
あとsafebolはここでは本質ではないからその話を持ち出すお前のほうがはるかにセンスないよ
12デフォルトの名無しさん:2010/09/18(土) 01:25:06
for (auto x: c) { cout << x << endl; }

でええやん。
13デフォルトの名無しさん:2010/09/18(土) 01:28:36
つか、
普通は
for_each( c.begin(), c.end(), cout << *it << endl );
と、書きたいでしょうに。
14デフォルトの名無しさん:2010/09/18(土) 01:35:16
for_each(adaptor(container), lambda);のほうがいいな
15デフォルトの名無しさん:2010/09/18(土) 01:38:13
>>14
それだと、始点と終点がコントロールできない。
つか、別にオーバーロードすればいいだけじゃんか。
16デフォルトの名無しさん:2010/09/18(土) 01:42:09
>>15
オーバーロードで両ほうできるようにすればいいさ
17デフォルトの名無しさん:2010/09/18(土) 01:50:12
>>14
ovenやRangeExみたいな感じだな

>>9,>>11はちょっと意味わからない。それってシンプル?
18デフォルトの名無しさん:2010/09/18(土) 02:08:34
lambda=ランバダ
19デフォルトの名無しさん:2010/09/18(土) 02:25:37
面白い、とでも思ってるのか…?w
20デフォルトの名無しさん:2010/09/18(土) 12:10:05
test
21デフォルトの名無しさん:2010/09/18(土) 12:41:56
委譲のことをオーバーロードっていうの?
22デフォルトの名無しさん:2010/09/18(土) 12:43:50
違います
23デフォルトの名無しさん:2010/09/18(土) 15:48:06
>>11
ランダムアクセスできないイテレータのときはどーするの?
std::listとかの
24デフォルトの名無しさん:2010/09/18(土) 15:49:56
Stringってワイド文字列は扱えないの?
tcharやwcharをcharに変換してつかってことなのかな??
25デフォルトの名無しさん:2010/09/18(土) 15:55:27
あ、partial_sortはそもそも random_access_iterator が必要だった。
それはそれとして、random_access_iterator 以外はit + n とかできないけど 9,11 はどうする気なのだろう
26デフォルトの名無しさん:2010/09/18(土) 16:27:31
std::advance()
27デフォルトの名無しさん:2010/09/18(土) 16:33:10
>>24
std::wstring
28デフォルトの名無しさん:2010/09/18(土) 16:56:55
>>23
advance
29デフォルトの名無しさん:2010/09/18(土) 17:26:49
>>27std::wstring・・・存在していたのか!
どもです、こちらをつかってみますね。
30デフォルトの名無しさん:2010/09/18(土) 18:29:48
Hoge.hpp
template <class X> class Hoge { ・・・; }

Hoge_int.cpp
template class Hoge<int>

これってコンパイル体感できるぐらい早くなる?
31デフォルトの名無しさん:2010/09/18(土) 19:59:36
extern templateしないとhppをincludeしてる側でも実体化するぞ
32デフォルトの名無しさん:2010/09/18(土) 20:12:15
extern templateなんて在ったんですねthxです
33デフォルトの名無しさん:2010/09/18(土) 20:14:31
やたら0xの話ばっかりする奴いるな。
0xスレにいけよ。ここはC++総合スレじゃないんだからよ。
34デフォルトの名無しさん:2010/09/18(土) 20:37:22
C++総合だろ
35デフォルトの名無しさん:2010/09/18(土) 21:37:23
0xネタは専用スレにいってくれるとありがたいなあ。
実務的にはまだそうでないコンパイラが主流だし。
36デフォルトの名無しさん:2010/09/18(土) 22:00:22
advanceのことは知ってるが、
あれは 9,11の案との相性とか効率とかが悪いと思うんだけど、
どう考えてるの?
でことなんだが
37デフォルトの名無しさん:2010/09/18(土) 22:11:43
俺はここでC++全般のあれこれの話が聞けるほうがありがたい。あっちこっち行ってないし。
知らないネタはスルーしてるし。
38デフォルトの名無しさん:2010/09/18(土) 22:12:46
何のための専門スレだよ、0x用があるならそっちが妥当だろ。
39デフォルトの名無しさん:2010/09/18(土) 22:14:17
>>38
何のためって、そりゃあ0x専門の話したい人のためだろう
40デフォルトの名無しさん:2010/09/18(土) 22:16:36
だからここで0xの書き込みをしないで向こうに書き込めって話だ。
41デフォルトの名無しさん:2010/09/18(土) 22:21:05
C++の相談に来た初心者に0xで答える。何たるキチガイかー!
42デフォルトの名無しさん:2010/09/18(土) 22:21:34
C++相談室なんだから別にいいじゃん。STLスレやboostスレがあるからって、
その話一切禁止なんてことないだろう。
43デフォルトの名無しさん:2010/09/18(土) 22:22:17
C++相談室(0xをのぞく)になってりゃ分らなくもないが、
そうなっていない以上制限する必要もないな。
44デフォルトの名無しさん:2010/09/18(土) 22:22:33
0xはまだ策定中だしな
0xの話を出すのはオレは許容できるけど
現行の規格に則ったアドバイスをしてる所に、
「そんなやり方は古くなるから教えるな、0xでは〜」というのはやめてほしい
相談者にとっては現行のやり方を知ることも大切だろう
新しい規格が定まっても従来のコードを読む必要があったりするかもしれないし
45デフォルトの名無しさん:2010/09/18(土) 22:23:42
なんかアレルギー持っちゃった人がいるけど、ああそういうのもあるのね、でいいじゃん
46デフォルトの名無しさん:2010/09/18(土) 22:44:25
void C++SpecialThread( C++Topics &tp );
C++0xTopics g_C++0xTopic;
int C++Thread(){
  g_Topic.discussion();
}
-----------------------------------
void C++SpecialThread( C++Topics &tp );
int C++Thread(){
  C++0xTopics C++0xTopic;
  C++SpecialThread( C++0xTopic );
}
void C++SpecialThread( const C++Topics &tp ){
  tp.discussion();
}
47デフォルトの名無しさん:2010/09/18(土) 23:16:25
>>44
見えない敵と戦うのも大変だな
48デフォルトの名無しさん:2010/09/19(日) 06:58:54
std::ofstream ofstr("hoge.txt");
で、ファイルのオープンチェックに
if (ofstr) { ... } と if (ofstr.is_open()) { ... }
とするのでは意味が違うのでしょうか?いつも前者でチェックしていたのですが、ひょっとして間違い!?
49デフォルトの名無しさん:2010/09/19(日) 16:29:16
cmakeをqmakeに変換する方法を教えてください
50デフォルトの名無しさん:2010/09/19(日) 16:37:58
>>48
operator void *() が定義されているから前者で良い
51デフォルトの名無しさん:2010/09/19(日) 16:49:23
operator boolじゃないのか?
52デフォルトの名無しさん:2010/09/19(日) 16:50:19
初歩的な質問なんですが、
class A{ .... }; class B: public A{.......}; class C: public A{.......};

A* a;
a = new B;
a = new C;

みたいに使いたい時のdeleteの仕方が分かりません。

delete (B*)a;

とやらないとBのデストラクタが呼ばれないみたいなんですが、
newする前にこうやってdeleteしていくんでしょうか?
5351:2010/09/19(日) 16:50:22
ごめんなさい
試したら私が間違ってました
54デフォルトの名無しさん:2010/09/19(日) 16:51:22
>>52
仮想関数ぐらい勉強しろハゲ
5552:2010/09/19(日) 17:06:07
なるほど。デストラクタをvirtualにすれば良かったのですね。
ありがとうございます。
56デフォルトの名無しさん:2010/09/19(日) 17:32:04
x,y座標点を持っているクラスが大量にあって、その中で一番近いクラスのポインタを
もつようにしたいんだけど、効率のいい探索方法ってどんなのがありますか?
例えば
class A{
 int x;
 int y;
 A *Near;
};
で、Aが1000個ぐらいあって、各一番距離が近いAを求めたい。
1つ1つ残り999個との距離を求めて探すのは効率悪すぎるしいい方法教えてください
57デフォルトの名無しさん:2010/09/19(日) 17:37:30
4文木に入れて調べる
58デフォルトの名無しさん:2010/09/19(日) 17:42:00
kd-tree
59デフォルトの名無しさん:2010/09/19(日) 17:42:32
WindowsFormAppでOpenGLをダイアログで表示したいのですが
初歩から始めるにあたってよいサイト・参考書を教えてください
60デフォルトの名無しさん:2010/09/19(日) 17:42:54
R木に入れる
61デフォルトの名無しさん:2010/09/19(日) 17:51:52
速度が重要ならkd-treeでbest bin firstを使うといいとかでてきた
まぁ色々挙げられたから後は質問者が調べて実験すりゃいいか
62デフォルトの名無しさん:2010/09/19(日) 18:09:20
データ構造を4本木にしてもっておくの?
座標の配列とは別に4本木を作るの?
63デフォルトの名無しさん:2010/09/19(日) 18:11:36
ありがとう、二分木の派生みたいな方法で探すのがいいのね。
それらをキーワードに勉強してきます。
64デフォルトの名無しさん:2010/09/19(日) 20:53:15
いちいち随時ソースファイル分けてプログラミングする利点って何ですか?
自分は、いつも一つのファイルに書き続けて、もうこの関数は書き換えることはないってなってから
ファイル作成してコピペで移動してるんだけど、もう書き始めからファイル作成してそっちに
関数作り始める人の方が多いよね。何故ですか?

一つのファイルでずっと書いていた方が、見やすいし修正とか便利だと思うんだけど。
いちいちファイル間移動して書くの面倒すぎる
65デフォルトの名無しさん:2010/09/19(日) 20:55:33
一つのファイルが長いと不便だから
66デフォルトの名無しさん:2010/09/19(日) 21:00:47
長くても大抵の開発環境では関数の定義に移動や変数の検索とかの機能があるし、
逆に長ければ長いほど一つのファイルにまとめておいたほうが便利じゃない?
67デフォルトの名無しさん:2010/09/19(日) 21:01:18
結果的に分けてるんだったら別にいいんじゃない?自分がコード書くときどう書いたって。
68デフォルトの名無しさん:2010/09/19(日) 21:04:21
分ければコンパイル時に無駄が少ないのよ
69デフォルトの名無しさん:2010/09/19(日) 21:10:01
いったい何でコード書いてるんだろう
メモ帳か?
70デフォルトの名無しさん:2010/09/19(日) 21:20:53
>>67
大多数がそうするってことは、何か利点があるのかなと思って
>>68
へぇ初めて知った。今度から積極的に分けるようにする。完成してからだけど
>>69
eclipseかVisualStudioです。
メモ帳の場合だとファイル分けて書いていったほうが便利なのは分かる。
プログラミング用の関数参照とかの機能無いから長いと探しにくいし
71デフォルトの名無しさん:2010/09/19(日) 21:54:36
>>70
> メモ帳の場合だとファイル分けて書いていったほうが便利なのは分かる。
普通逆だと思うけどな
プログラミング用の関数参照とかの機能無いから、別のファイルにまたがると参照が大変だし。
だからメモ帳の場合は単一ファイルか、数ファイルにする。
統合開発環境なら別ファイルにまたがっても参照や検索が楽だろ。
72デフォルトの名無しさん:2010/09/19(日) 22:34:59
>>70
> へぇ初めて知った。今度から積極的に分けるようにする。完成してからだけど
これも逆だ
73デフォルトの名無しさん:2010/09/19(日) 22:40:31
俺はスクロールが一画面に収まらなくなってきたら分け始めるな
理由:pgupとかhomeとかで関連外に出ることがないということが保証されるから
74デフォルトの名無しさん:2010/09/19(日) 22:45:49
100万行の1ファイルを1行更新してビルドと
1000行くらいの1000ファイルに分けて1行更新してビルドしたら
分けた方が速いとおもう
75デフォルトの名無しさん:2010/09/19(日) 22:53:35
機能で分けろよ。長さで分けてどうすんだ。
76デフォルトの名無しさん:2010/09/19(日) 23:11:04
つーか、長くなるってことは分割しなきゃいけない兆候ではある
77デフォルトの名無しさん:2010/09/19(日) 23:11:59
一つのファイルを変更すると
そのファイルとそのファイルを参照してるファイルを再コンパイルすることになる

ってことは理解してるんだろうか
7874:2010/09/19(日) 23:19:06
そんなの理解してるに決まってる。単位は機能である必要もない。
>>72みたいな意見もあるので、どっちのケースもあると言っただけ。
79デフォルトの名無しさん:2010/09/19(日) 23:22:46
>>77>>64に対して言った意見だよ
80デフォルトの名無しさん:2010/09/20(月) 19:04:20
mapをバイナリでファイルに保存したいんだけど、シリアル化無しでもいける?
いけるのなら読み込みサイズをどう指定するか教えてほしい。sizeof(map<string, int>)とかでいける?
81デフォルトの名無しさん:2010/09/20(月) 19:21:25
そう言うのはもう少し基本を勉強してからだな
82デフォルトの名無しさん:2010/09/20(月) 19:32:47
>>80
>シリアル化なしでいける?
意味不明すぎる、シリアル化をなんだと思ってるんだ
シリアル化せずにファイル保存っておい

map全体をmemcpyでchar 文字列にコピーするようなノリでできるのか聞いてるなら無理だよ

83デフォルトの名無しさん:2010/09/20(月) 19:43:39
ちょっと高級な言語から入門するとこういう雑魚が量産されちゃうんだよね
84デフォルトの名無しさん:2010/09/20(月) 19:45:04
まず罵るのが出来るプログラマーの条件
85デフォルトの名無しさん:2010/09/20(月) 19:54:59
単にバイナリシリアライズしたいだけならば今はmessage packがアツいぜ!!
86デフォルトの名無しさん:2010/09/20(月) 20:39:46
>>84
問題箇所は気づいたときにマークしとかないと忘れるからな
87デフォルトの名無しさん:2010/09/20(月) 21:32:47
>>80
何を言っているのか意味不明です。
88デフォルトの名無しさん:2010/09/20(月) 21:43:52
UNIXではコアダンプといってメモリをファイルに書き出す機能があって
プログラムが終了したあとでも内容を確かめる事ができる機能が
あるんだ。
89デフォルトの名無しさん:2010/09/20(月) 21:50:01
ふーん
90デフォルトの名無しさん:2010/09/21(火) 01:11:30
C++を初心者に使わせるのはもうやめてくれ、ドザはC#でもシコシコやってればいいんだよ
91デフォルトの名無しさん:2010/09/21(火) 03:02:04
>>90
いいんだよ頭が禿げ上がるまで使わせてやれば
92デフォルトの名無しさん:2010/09/21(火) 10:38:53
>>88
原理的にはそうだけど、実際 core dump なんて解析してる?
俺は本格的に debug する時もせいぜい breakpoint 入れてデータ見たり程度だけど。
まわりでも最近 core なんか解析したという話はあまり聞かんなぁ…
1年前くらいに業務用のコードでやってたかな
93デフォルトの名無しさん:2010/09/21(火) 11:52:33
開発環境でeclipseとVisual C++はどちらがお勧めでしょうか?
94デフォルトの名無しさん:2010/09/21(火) 14:28:34
>>90
マカーは大変だなw
95デフォルトの名無しさん:2010/09/21(火) 14:43:03
Visual C++
96デフォルトの名無しさん:2010/09/21(火) 14:51:53
visual C++は止めておいた方が良い、
MicrosoftはC++に独自の規格をつくることで
それを標準にしてC++のシェアを独占しようとしている。
Visual C++をつかうということはその企みの手助けをすることになって
将来C++を使うにはmicrosoftの高い製品を買わなければ使えなくなるということが
おこり得る可能性は否定できない。
よってgccを使うことをオススメする。
97デフォルトの名無しさん:2010/09/21(火) 14:57:55
あほか。何十年後より今を大切にするんだ。
98デフォルトの名無しさん:2010/09/21(火) 14:58:13
何をしたいかによるんじゃないか
GUI 付きアプリを作るなら Visual C++(最近は Visual Studioというかな)
の方が向いてるのでは

CUI で良いのなら Eclipse の方がどこでも使える利点がある
99デフォルトの名無しさん:2010/09/21(火) 15:14:31
vc++だったら非標準オフ機能使えよカス
100デフォルトの名無しさん:2010/09/21(火) 15:16:09
>>96
犬糞に引きこもってろカス
101デフォルトの名無しさん:2010/09/21(火) 15:24:04
使えるときに使える奴使え。
そのときにあった物を使えば良いんだよ。
VC++が完全有料化されてたら、別のが流行するだろ。
そしたら勉強すればいいだろ。
PHP Ruby バイソンとか元々知らなくても必要な使えるようにするだろ。
102デフォルトの名無しさん:2010/09/21(火) 15:25:43
ばいそん?
103デフォルトの名無しさん:2010/09/21(火) 15:30:48
バイソンって構文木を作るやつだっけ?
104デフォルトの名無しさん:2010/09/21(火) 15:39:12
読み方く知らないだ。すまん。
PHP Ruby Perl と並ぶ奴。スクリプト言語。Pで始まる奴。
105デフォルトの名無しさん:2010/09/21(火) 15:41:36
調べた。
Python - Wikipedia

Python(パイソン)は、オランダ人のグイド・ヴァンロッサムが作った
オープンソースのプログラミング言語。
オブジェクト指向スクリプト言語の一種であり、Perlとともに欧米で広く普及している。

イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。

Pythonは英語で爬虫類のニシキヘビの意味で、
Python言語のマスコットやアイコンとして使われることがある。
106デフォルトの名無しさん:2010/09/21(火) 15:47:02
バイソンwwwwwwww

107デフォルトの名無しさん:2010/09/21(火) 15:49:53
まあ、マイク「バイソン」は鉄板やろ?
108デフォルトの名無しさん:2010/09/21(火) 15:50:30
まさかのマジボケ
109デフォルトの名無しさん:2010/09/21(火) 15:53:30
EclipseがJavaで書かれているのが残念だなあ
もっさりだろ
110デフォルトの名無しさん:2010/09/21(火) 16:12:28
今のVisualStudioは大部分C#で書かれてるけどな
111デフォルトの名無しさん:2010/09/21(火) 16:29:39
C#はJITコンパイルだからまだ軽いんだよ
Javaは完全に仮想マシン方式じゃん
重さが違うよ
112デフォルトの名無しさん:2010/09/21(火) 16:39:30
JavaもJITコンパイルしてるぞ
C#も仮想マシン(とは呼ばないが同じもの)の上で動いてるぞ
仮想マシンがJITコンパイルしちゃいけない決まりはない
113デフォルトの名無しさん:2010/09/21(火) 16:44:49
C#は仮想マシーン無いだろ。
ネイティブに変換するんだろ。
以前にしてあればキャッシュ読み込むだろ。
114デフォルトの名無しさん:2010/09/21(火) 16:45:12
バイソンもJavaも釣りだろ
こんなのがム板に居るわけがない
115デフォルトの名無しさん:2010/09/21(火) 16:57:28
仮想マシンって意味解ってる?
プログラミング言語から見て仮想化された環境というだけの意味で
特に具体的なインタプリタなどの実装を指してるわけじゃないぞ
116デフォルトの名無しさん:2010/09/21(火) 17:17:12
CLRとかVESとかアホの俺でも知ってるぞな。
確かにngenは.NETの売りだろうけど起動しっぱなしのアプリじゃ大して意味ないんじゃね。
.NETのGUIはアンマネージド使いまくってるというのはあるが、eclipseに関して言えばSWTだし。
117デフォルトの名無しさん:2010/09/21(火) 17:19:04
バイソンって日本じゃベガって言うんだぜ
118デフォルトの名無しさん:2010/09/21(火) 17:31:23
VSはクロスプラットフォームじゃないからクリティカルな部分はアンマネージコード使い放題
それが最大の違い
119デフォルトの名無しさん:2010/09/21(火) 17:42:12
話を元に戻すと、どちらもそれなりにもっさり。
VSの方が非もっさり。.NET4ならもう少し非もっさり。
もっさり許容範囲は人それぞれ。
120デフォルトの名無しさん:2010/09/21(火) 18:25:01
今 C++ でクロスプラットフォーム開発したいなら Qt が楽じゃないかな
QtCreator 使いやすい

ターゲットがずっと Windowsだけなら VS でしょ
121デフォルトの名無しさん:2010/09/21(火) 18:25:42
>>112
それはJava Serverの話
普通のPCにインストールされているJava ClientはJITコンパイルしてない
122デフォルトの名無しさん:2010/09/21(火) 19:51:36
全部はされないってだけで普通にJITコンパイルしてるから
123デフォルトの名無しさん:2010/09/21(火) 20:18:19
>>118
> アンマネージコード使い放題
絶対ずるいよな。
124デフォルトの名無しさん:2010/09/21(火) 20:23:55
#define register
程度の次元でしかない
125デフォルトの名無しさん:2010/09/21(火) 22:21:52
へえ
126デフォルトの名無しさん:2010/09/22(水) 00:16:06
>>92
コアダンプはろくにデバッガが使えないようなときに大変重宝しますよ。
デバッガがあってもそれなりに重宝します。
127デフォルトの名無しさん:2010/09/22(水) 02:53:40
coutで出力すると 3 となるdouble変数を
intにキャストすると 2 になるのですが、
これは、double変数が極めて3に近い2.????・・・というという値で、
近似したから3になった
という解釈で良いのでしょうか?
128デフォルトの名無しさん:2010/09/22(水) 03:17:36
>>127
setprecisionマニピュレータで有効桁数を増やしてみな
多分3じゃない

それとscientificも忘れずに
129デフォルトの名無しさん:2010/09/22(水) 04:31:28
#include <iostream>
#include <iomanip>

int main()
{
double d = 2.99999999999999;

std::cout << d << std::endl;
std::cout << std::setprecision(15) << std::scientific << d << std::endl;

}

>>127
まあこういう事だと思うよ
絶対に後者で表示されるのは3じゃないはず
130デフォルトの名無しさん:2010/09/22(水) 06:13:18
CodeGearのC++Builderも思い出してあげてもらえませんか…
131デフォルトの名無しさん:2010/09/22(水) 17:09:44
>>130
なんだっけそれ?
132デフォルトの名無しさん:2010/09/22(水) 21:55:25
CodeGeassのCCを思い出したお
133デフォルトの名無しさん:2010/09/22(水) 23:22:11
union Foo
{
  int a;
  boost::array<char,4> b;
};

これは問題ないですか?
134デフォルトの名無しさん:2010/09/23(木) 01:23:30
>>133
C++03では問題有り(どうあがいてもエラーになる)

C++0xでは一部制限有りだがOK(この場合、代入ができなくなる)
もし代入させたかったら、自前でunionの代入演算子を定義する必要がある。
いまどちらのメンバーを使っているか分からないため、どうやって定義するかは悩ましいところだが。

その他の型、たとえばstd::stringとかをメンバーに持ちたかったら、
明示的にunionのデフォルトコンストラクターやデストラクターなどを定義する必要がある。
135デフォルトの名無しさん:2010/09/23(木) 02:17:36
>>134
> C++03では問題有り(どうあがいてもエラーになる)

ならないよ。
136デフォルトの名無しさん:2010/09/23(木) 02:27:04
arrayってようはstruct { type x[N]; }にメンバ追加しただけでしょ
だから
struct B { char c[4]; };
union Foo{ int a; B b; };
が通るのと同じようにarraytも通る
charが違う型になるとダメな場合もある
137デフォルトの名無しさん:2010/09/23(木) 09:36:51
printfとwriteはどちらが早いですか。printfはリダイレクトしてます。
138デフォルトの名無しさん:2010/09/23(木) 09:40:21
C言語なら俺に聞け(入門編)Part 69
http://hibari.2ch.net/test/read.cgi/tech/1284477697/503
スレを勃てるまでもないC/C++の質問はここで 17
http://hibari.2ch.net/test/read.cgi/tech/1285115590/25
139デフォルトの名無しさん:2010/09/23(木) 09:48:31
流石にこいつは時間からみてコピペ野郎だろ
どっちにし
140デフォルトの名無しさん:2010/09/23(木) 09:51:23
にしこり
141デフォルトの名無しさん:2010/09/23(木) 10:53:18
使い終わった変数を使いまわすのは、どう思いますか?
string s;
適当な処理
s = "";
適当な処理
142デフォルトの名無しさん:2010/09/23(木) 10:57:02
スパゲッティ化の第一歩、能無しはそれで何か節約できてると勘違いする。
143デフォルトの名無しさん:2010/09/23(木) 10:58:44
STLの仕様って古いから細かいところが糞だらけだよね
144デフォルトの名無しさん:2010/09/23(木) 10:59:20
>>142
transmittionってソフトのguiの書き方なんですけどね
145デフォルトの名無しさん:2010/09/23(木) 11:01:39
>>142
じゃあどうやって書く?
146デフォルトの名無しさん:2010/09/23(木) 11:07:13
{
string s;
some_code;
}
{
string s;
some_code;
}
147デフォルトの名無しさん:2010/09/23(木) 11:14:45
使い終わった時点で不可視になるべき…と
148デフォルトの名無しさん:2010/09/23(木) 11:15:48
それは数百行の巨大関数を作る第一歩だろ
中でスコープ切ったりしなくていい程度に関数の長さを抑える方を優先するべき
149デフォルトの名無しさん:2010/09/23(木) 11:20:34
{
  const int ret = ProcessA();
  assert( ret == 0 );
}
{
  const int ret = ProcessB();
  assert( ret == 0 );
}
{
  const int ret = ProcessC();
  assert( ret == 0 );
}
こんな感じでブロック分けたりするけど。
A,B,Cで別々の関数に分けるのも意味ないし。
150デフォルトの名無しさん:2010/09/23(木) 11:25:03
C++をちゃんと解ってる人はC++で20行以上の関数を書くことはめったに無い
151デフォルトの名無しさん:2010/09/23(木) 11:30:15
>>150
そんなことはない。
152デフォルトの名無しさん:2010/09/23(木) 11:46:01
でもまぁ、20行を越えると数が減って50行を越えることは殆どないな。
153デフォルトの名無しさん:2010/09/23(木) 12:00:09
などと妙な事を吹いていた150のその後の行方は誰も知らない。
154デフォルトの名無しさん:2010/09/23(木) 12:01:06
500行超えるソース見ると、これよく理解出来るよなぁと感心してしまう。
100行超えた辺りからゲンナリして、1000行超えてるとこいつ天才かと思う(悪い意味で
155デフォルトの名無しさん:2010/09/23(木) 12:05:12
50行も普通に超える。
156デフォルトの名無しさん:2010/09/23(木) 12:11:26
どんなソースでも20行に軽く収まる。
#include ""
157デフォルトの名無しさん:2010/09/23(木) 12:17:32
IBMの調査によると、
20行の関数5個より、100行の関数一個のほうがバグが少ない。

コードコンプリートに載ってた。
158デフォルトの名無しさん:2010/09/23(木) 12:20:35
関数が小さいとユニットテストの効率が高いけど面倒なのよねぇ
159デフォルトの名無しさん:2010/09/23(木) 12:29:36
結局引数を多数取る関数か
状態を維持するために一回しか使われないクラスが増えるだけなんだよな。
160デフォルトの名無しさん:2010/09/23(木) 12:34:26
質問です
自分、C,C++で数値計算していたのですが
そのソースやヘッダを利用してGUIを組みたいと考えています。

これまでのヘッダやソースをインクルードして
GUIを出来ればヴィジュアルエディタのようなもので
生成されたコード中で、同じように使いたいのですが
どのようなライブラリを使えばそれが可能でしょうか?

優先順位としては
これまでの資産の利用>GUIの開発のしやすさ
です。

ご教示お願いします
161デフォルトの名無しさん:2010/09/23(木) 12:35:57
Qt
162デフォルトの名無しさん:2010/09/23(木) 12:38:17
Tcl/Tk
163デフォルトの名無しさん:2010/09/23(木) 12:54:38
実行するとメモ帳のカーソル位置から左の英単語を取得してメッセージダイアログにその取得した英単語を表示するコードって書くの難しいですか?何行ぐらいでかけますか?
164デフォルトの名無しさん:2010/09/23(木) 12:58:39
何でGUIしてもこれまでの資産の利用しやすさは同じだろう
165デフォルトの名無しさん:2010/09/23(木) 13:00:11
10行
166デフォルトの名無しさん:2010/09/23(木) 13:04:09
ヴィジュアルエディタってつまりviのこと?
167デフォルトの名無しさん:2010/09/23(木) 13:07:25
初歩的なしつもんなんですが、effective C++にかいてあるように
何も無しでstd::swap(a,b)を使うとstd::swapしかよばれないけど
using std; swap(a,b)をつかうと引数で検索されますが
using namespace std;を使ってswap(a,b);を使うのと
using; swap(a.b);を使うのとの違いはなんですか?
それとusing std;を使わずにusing namespace std;のみで
swap(a,b);を使うとどうなりますか?
よろしくお願いします。
168デフォルトの名無しさん:2010/09/23(木) 13:28:34
関数は絶対20行に収めなきゃとかは思わないけど
長くなってきたら、その仕事が単一になってない兆候ではある
169デフォルトの名無しさん:2010/09/23(木) 13:44:00
収めなきゃっていうか大体2,3十行もあれば事足りるでしょ
そうでない場合はクラス化関数化が下手くそな証拠
170デフォルトの名無しさん:2010/09/23(木) 13:48:49
20行5つより100行の方がバグが少ないという話があったが
単に関数間の依存関係の切り方が下手くそなだけじゃないのかね
171デフォルトの名無しさん:2010/09/23(木) 13:58:44
>>167
ちょっと間違ってるところあるけど整理すると

1 using namespace std; で swap
2 using std::swap; で swap
3 using を使わず std::swap(a,b) と使う

の3つの使い方があると思う

1 だと std の namespace のものを全て持ち込むので意図せず
使ってしまうものがあるかも知れない

2 std の namespace swap だけ意図的に持ち込む

3 std を一切持ち込まず常に指定して使う

現実的な問題だと、簡単なコードや自分だけなら1でも良いと思う。
1が一番楽(トラブル無ければ)。

プロの環境だと安全性重視で2,3が推奨(必須?)。
ただ 3 はかったるいんで 2 で普通良いと思うが、
この辺はポリシーや好みの問題も大きい。
常に絶対どうしても3じゃなきゃダメダメダメという人もいるから
そういう場合は文句を言わない。

読んだのだいぶ前で忘れたけど本にもこういうこと書いてあるはずだけど…
172デフォルトの名無しさん:2010/09/23(木) 14:03:37
おれは常に3だぜ
std::ってタイプさせたら俺の右に出る物はいない
173デフォルトの名無しさん:2010/09/23(木) 14:04:56
stdは単一の名前空間に全部ぶち込んであるから1は変なバグでる要因だよなー
174デフォルトの名無しさん:2010/09/23(木) 14:38:35
>>135-136
すまん。
boost::arrayには、コピー代入演算子が定義されていると勘違いしていた。
今見たら、メンバーテンプレート関数だった。

175デフォルトの名無しさん:2010/09/23(木) 15:24:20
****は****の兆候

これ聞きあきた
176デフォルトの名無しさん:2010/09/23(木) 15:58:28
>>171
常識的に考えてADLが必要な時に2でそれ以外は3だろ。
177デフォルトの名無しさん:2010/09/23(木) 16:55:21
namespace{ 関数 }
これだけで書いてあるコードがあったんですが
これじゃ無名名前空間と同じ気がするのですが、何かメリットはあるのですか?
178デフォルトの名無しさん:2010/09/23(木) 16:57:52
>>154
出来ないことができるからプロを名乗れる。
5000行越えだってOK
179デフォルトの名無しさん:2010/09/23(木) 16:58:11
単純に無名名前空間を使いたかったのでは?
180177:2010/09/23(木) 17:02:20
>>179
やっぱり、そういう事ですよね
thx
181デフォルトの名無しさん:2010/09/23(木) 17:04:33
>>177
staticの代わり
182デフォルトの名無しさん:2010/09/23(木) 17:13:04
この前38000行を超えているcppを見かけた
よくバグを出さないもんだと感心半分呆れ半分
183デフォルトの名無しさん:2010/09/23(木) 17:14:22
変に注意力ある奴って力技でなんとかできたりするから設計に無頓着な事あるよね
184デフォルトの名無しさん:2010/09/23(木) 17:16:39
関数やクラスが普通のサイズでかかれてたら、ファイルのサイズは
大きくても問題なくね?
185デフォルトの名無しさん:2010/09/23(木) 17:38:53
>>182
1関数10000行ですね
186デフォルトの名無しさん:2010/09/23(木) 17:46:32
>>185
むかしのアセンブラではよくあったねw
187デフォルトの名無しさん:2010/09/23(木) 18:01:16
イヤすぎw
188171:2010/09/23(木) 19:15:17
>>181
そんな使い方もあったんですね
thx
189デフォルトの名無しさん:2010/09/23(木) 20:39:37
>>182
そのような感じのクラスが5つ
1万行超えているクラスが24
コメントはほとんど無し(きちんと書かれている場合は2000行前後のクラスのみ)
クラス数が全部で300ほど・・・・
そのアプリのVersionアップ作業。

そして恐怖は他にdllと外部実行ファイルが20程・・・・
190デフォルトの名無しさん:2010/09/23(木) 22:32:40
>>182
wwwwww
ちょっと直して再コンパイルするのもめんどくさそうだ。
191デフォルトの名無しさん:2010/09/23(木) 22:34:37
それが全部、一つのクラスのだからってんだったら、逃げ出したくなるなw
192デフォルトの名無しさん:2010/09/23(木) 22:35:45
>>189
うちも似たようなもんだな
巨大なシステムだとある程度は仕方が無い
193デフォルトの名無しさん:2010/09/23(木) 22:47:59
ファイル分割がきたないと1ファイルより迷惑だ
194デフォルトの名無しさん:2010/09/23(木) 22:51:46
結構重要な問題だよねファイル分割って
boost形式で管理してるけどこれはこれで依存性があっちこっち飛んで混乱する
195デフォルトの名無しさん:2010/09/23(木) 22:55:14
問題がファイル分割なのか、クラス設計なのか、っていう点もあるんだけどね
196デフォルトの名無しさん:2010/09/23(木) 23:27:38
一つの関数が一万行オーバーよりすごいものを見た事あるが
素性がバレそうなので書けないw
printf()を1行追加してコンパイルかけたら半日つぶれたのは良い思い出
197デフォルトの名無しさん:2010/09/23(木) 23:31:38
マ板の辞めソーススレに投下してやれよ
198デフォルトの名無しさん:2010/09/23(木) 23:32:33
全部ヘッダか
199デフォルトの名無しさん:2010/09/23(木) 23:55:37
>>196
ん、もしかして知り合い?
200デフォルトの名無しさん:2010/09/24(金) 06:31:18
>>196
その程度ならマ板で結構見たぞw
201デフォルトの名無しさん:2010/09/24(金) 07:16:21
マ板に昔「全部ヘッダに書くべき(キリッ」って言ってた奴がいた気がするな
202デフォルトの名無しさん:2010/09/24(金) 09:44:18
機能一つに対して

ルート
 ヘッダー
 ソース
 サブフォルダ
  複数のヘッダー(ソースなし)

こんな感じの構成かな
ルートにあるヘッダはサブフォルダの薄いラッパーかtypedefのみのことが多い
コンパイル防壁はルートのソースが引き受ける
オーバーヘッドが少し気になるけどスッキリするから無理やり気にしない
203デフォルトの名無しさん:2010/09/24(金) 20:57:12
ルートのディレクトリ名.(a|so)でも作れそうな勢いだな
204デフォルトの名無しさん:2010/09/24(金) 21:10:57
クラスのテンプレート引数に文字列を渡したいと思い、次のようなコードを書きました。
http://codepad.org/ZUGkKE63

コンパイルエラーが出でいますが、テンプレート引数をString1からextern付きの
String2に変えるとコンパイルが通ります。
なぜなんでしょ?
205デフォルトの名無しさん:2010/09/24(金) 21:26:01
>>204
String1のconstを取る
206204:2010/09/24(金) 21:48:38
>>205
なるほど、それでも通りますね。
もしやと思ってString1を乱数で書き換えるようにしたら、コンパイルが通っちゃいました。
http://codepad.org/s10YT1b8

テンプレートは必ずしもコンパイル時に解決されるわけじゃないんですね。
207デフォルトの名無しさん:2010/09/24(金) 22:20:39
templateに文字列は地雷としか思えない
208デフォルトの名無しさん:2010/09/24(金) 22:23:38
strがString1に置き換わってるだけだから
コンパイル時に解決してるんじゃね?
209デフォルトの名無しさん:2010/09/25(土) 00:11:53
204は不可解だな
誰か説明してくれんか
210デフォルトの名無しさん:2010/09/25(土) 00:37:51
アドレスは外部リンケージじゃないとテンプレート引数に使えないとかじゃなかったっけ
211デフォルトの名無しさん:2010/09/25(土) 01:36:05
const char * String1 = "Hoge";にしたらどうよ。
212デフォルトの名無しさん:2010/09/25(土) 01:41:42
>>210
あっそうなんだ
最適化が絡んでるのかな?
213デフォルトの名無しさん:2010/09/25(土) 01:43:18
>>211
それだと今度は別のエラーがでるんじゃね?
214デフォルトの名無しさん:2010/09/25(土) 07:51:06
>212
どっちかっていうと ODR の方じゃないかな。
215デフォルトの名無しさん:2010/09/25(土) 11:58:39
ODR (One Definition Rule)
"定義は一つ"規則。

プログラム中で、一つの関数は同じただ一つの定義しか持ってはいけない。 一つのクラスは同じただ一つの定義しか持ってはいけない、という規則。 ファイル1で
struct X { int x; }; と書いてファイル2で
struct X { char x; }; と書いていたら、構造体Xに関するODR違反になります。 一見物凄く当たり前なんですが、template の(部分)特殊化版を使った トリッキーなコードだと、人間の気付かぬ間にODR違反に突入する恐れがあるので、 ちょびっと注意が必要です。
216デフォルトの名無しさん:2010/09/25(土) 13:41:38
>>214
なるほど。
テンプレートが実体化されたものはリンク時にまとめられるんだから、
アドレスをテンプレート引数にする場合は外部リンケージを持った変数名
じゃなきゃダメだわ。
217デフォルトの名無しさん:2010/09/25(土) 13:50:51
いきなりC++やる前にCを先にやるほうがいいですか?
218デフォルトの名無しさん:2010/09/25(土) 13:53:54
さらっとC勉強したらC++行けばいいんじゃないの
219167:2010/09/25(土) 14:46:00
訂正
3行目1文字目 誤:using std 正:using std::swap
6行目1文字目 誤:using std 正:using std::swap
220デフォルトの名無しさん:2010/09/25(土) 15:02:14
ハンドルクラス(pimplイディオム)のPersonクラスの実装がPersonImplとすると、
PersonImplを変更しても
Personを使う翻訳単位が再コンパイルをしないのは
Personクラスのサイズが変わらないからということですか?
Personを使う翻訳単位が再コンパイルをするかを決めるのは、
Personクラスのヘッダーファイルだけに関係するんですか?
Personクラスのクラスの関数の内容を変えても
クラスのサイズは変わらないから再コンパイルされませんか?
221デフォルトの名無しさん:2010/09/25(土) 15:15:03
>>220
される訳がない。
もう一度Excelのマクロを勉強することをオススメする
222デフォルトの名無しさん:2010/09/25(土) 15:19:57
>>220
不完全型とか不透明ポインタってものがあってまぁそのあたりを調べればなんか納得がいくんじゃないだろうか
223デフォルトの名無しさん:2010/09/25(土) 16:03:29
まとめると翻訳単位は
使うクラスのヘッダーファイルをみて
ポインターじゃないデータのサイズが変わっていたら
再コンパイルする。
関数の定義が変わっているのは再コンパイルしない
関数が増えていたら再コンパイルする
という理解であってますか?
224デフォルトの名無しさん:2010/09/25(土) 16:11:44
>>223
ヘッダファイルは見にいかない。
再コンパイルn基準は内部最適化コードの差異でしか判断しない。
よって再コンパイルはされる訳がない。

まずはコンパイルn仕様から勉強しないと話にならないよ
225デフォルトの名無しさん:2010/09/25(土) 16:16:02
ヘッダーファイルの最終更新日時が変わってたら再コンパイルする
定義が変わってようが変わってなかろうが何か修正したらアウト
ヘッダーファイルを修正しさえしなければいい
Personの定義はヘッダーファイルに書くので修正したら影響するが
PersonImplの定義はヘッダーファイルに書かないので修正しても影響ないという理屈
226デフォルトの名無しさん:2010/09/25(土) 16:19:12
「PersonImplの定義はヘッダーファイルに書かないので修正しても影響ない」
「いや、その理屈はおかしい。」

      ,. -──- 、
    /   /⌒ i'⌒iヽ、
   /   ,.-'ゝ__,.・・_ノ-、ヽ
   i ‐'''ナ''ー-- ● =''''''リ      _,....:-‐‐‐-.、
  l -‐i''''~ニ-‐,.... !....、ー`ナ      `r'=、-、、:::::::ヽr_
   !. t´ r''"´、_,::、::::} ノ`     ,.i'・ ,!_`,!::::::::::::ヽ
   ゝゝ、,,ニ=====ニ/r'⌒;   rー`ー' ,! リ::::::::::::ノ
    i`''''y--- (,iテ‐,'i~´ゝ''´    ̄ ̄ヽ` :::::::::::ノ>>225
    |  '、,............, i }'´       、ー_',,...`::::ィ'
 ●、_!,ヽ-r⌒i-、ノ-''‐、    ゝ`ーt---''ヽ'''''''|`ーt-'つ
    (  `ーイ  ゙i  丿   ;'-,' ,ノー''''{`'    !゙ヽノ ,ヽ,
    `ー--' --'` ̄       `ー't,´`ヽ;;;、,,,,,,___,) ヽ'-゙'"
                   (`ー':;;;;;;;;;;;;;;;ノ
                    ``''''''``'''''´
227デフォルトの名無しさん:2010/09/25(土) 16:24:31
コンパイルが通る

IDEなりmakeなりの動作
がごっちゃになりつつある気がするぜ
228デフォルトの名無しさん:2010/09/25(土) 16:29:57
まとめると、
翻訳単位は#include Person.hのところに
Person.hの内容を書いたのと同じだから、
翻訳単位に書かれている事が変化したかどうか
のみで再コンパイルするか決めるという理解であってますか?
229デフォルトの名無しさん:2010/09/25(土) 16:37:48
>>228
なにを言ってるか意味不明
ヘッダファイルに差異があるからコンパイルされるというのは間違いだよ
230デフォルトの名無しさん:2010/09/25(土) 16:41:17
翻訳単位って言い方がなんか特別なもののように考えているようだけど、
そんなに大仰なものじゃないよ?

main.cppというファイルがあって、コンパイルしました。
で、その中で、#include Person.hとかかれているのであれば、
Person.hが変更されなければ、main.cppが再コンパイルされる
ことはないよ。
(もちろん、main.cppを書き換えたらコンパイルするけどさ)
PersonImplが変更されたらmain.cppがコンパイルされるかどうかは、
PersonImplがどこに書かれているかによる。
Person.hの中にかかれていれば、コンパイルされるし、
Person.cppとかに書いてあれば、それは関係ない。
ついでにいえば、PersonImplの実装が、hennna.cppとかで
あろうと構わないし、同様なのね。

main.cppがコンパイルされるかどうかは、Person.hが変更されたか
どうか、というその一点にだけかかっている。
231デフォルトの名無しさん:2010/09/25(土) 16:53:16
C++はメモリを食うからCで作れってゆうのをどこかのブログで読みました
C++はC#とかVBみたいな位置にあるのでしょうか?
232デフォルトの名無しさん:2010/09/25(土) 16:55:28
>>231
そのブログのことは忘れろ
233デフォルトの名無しさん:2010/09/25(土) 16:57:06
>>231
ちゃんとC++を解ってれば大したオーバーヘッドはない
逆にC++の機能(templateや継承、ポリモーフィズム)をCで模倣しようとすると手間もコストもC++でやるより増える
234デフォルトの名無しさん:2010/09/25(土) 16:58:07
OSはCで作られてますがC++で作られてるのってないのはCがいいからですか?
235デフォルトの名無しさん:2010/09/25(土) 16:58:20
C++とC#、VBは別。
C++はCとほぼ同じ。
無駄のあるコードを書けばメモリ食うだけ。
C++の方が多くの材料がそろっているから使う奴によっては無駄なことをしやすい。
236デフォルトの名無しさん:2010/09/25(土) 17:09:11
>>235
嘘乙
C++の現場にいるけど、C言語しか知らない人は使い物にならないよ。

逆にVBを10年やってましたの人の方がC++のアーキテクチャ詳しかったりするし、
C言語だけ知らない人はコボラー扱い
237デフォルトの名無しさん:2010/09/25(土) 17:11:18
すいません今C#の勉強をしてますかC#を極めてからC++をやるとスムーズに行こうできますか?
238デフォルトの名無しさん:2010/09/25(土) 17:11:42
>>236
まあ、メモリを食うとか食わないとかって観点からの話だろ。
239デフォルトの名無しさん:2010/09/25(土) 17:13:06
>>237
C#やJavaから入ったほうが楽かもね。
240デフォルトの名無しさん:2010/09/25(土) 17:20:27
>>236
はあ?

そりゃVB10年やってたって他の言語にも詳しいやつだって中にはいるだろうが、
そんな特殊な例あげて、嘘とかって罵るってばかげてるだろ。

C/C++とC#,VBは全く別物。
C/C++はネイティブコンパイラ、後者はマネージドコードという中間言語
のようなものに翻訳する

で、CとC++なら、やっぱりメモリもスピードもCの方が有利。
これはもう言語が面倒みる範囲が全然違うので、しょうがない。

ただし、C++で簡単にできるようなことをCでやろうとするのは、
確かにかなり手間がかかる。
241デフォルトの名無しさん:2010/09/25(土) 17:24:42
C++で簡単にできることって例えば?
242デフォルトの名無しさん:2010/09/25(土) 17:27:45
>>241

stdとか

あとFlashFLVみたいなストリーミングをネイティブCだけで実装すると
手間がかかるかも知れない。

ポインタの制御だって、C++はかなり楽だけどC言語で行くと地獄を見る
243デフォルトの名無しさん:2010/09/25(土) 17:32:09
>>241
例えば、文字列、配列の扱い一つとってもそうでしょ。
C++なら、std:stringだけでも、連結したり、伸ばしたりするのは、
ライブラリが面倒みてくれるし、配列もそう。

これだけだってCで自分で実装すればかなり面倒だろ。
244デフォルトの名無しさん:2010/09/25(土) 17:32:48
C++が、スピード、メモリ食うのは言語のせいではなく
STLの実装やコンパイラのせい。質が悪いだけ。
完璧な品質であれば(が作れれば)、大差はないだろ。
245デフォルトの名無しさん:2010/09/25(土) 17:36:45
むかしはソフトウェアを極限まで早くできないかってやってたけど、
あるときから考えが変わった。

ソフトウェアの動作速度より俺らの給料と休日の方が圧倒的に大事だろう、と。

それ以来 苦情が出るまで高速化に着手しないことにした。
246デフォルトの名無しさん:2010/09/25(土) 17:36:52
>>244
だから昔からC++なんかよりVBの方がよっぽど優秀って言われてきたんだろ?

STLが悪者と逃げる>>244はなんちゃってC++技術者なんだなww
247デフォルトの名無しさん:2010/09/25(土) 17:37:58
>>244
いやあ、そうでもないよ。

やっぱり、C++は言語仕様が安全性などのためにいろいろ要求するからね。
どうしても、生成コードは増えざるを得ないし、それらを実行する負荷ってのは
どうしても発生する。

オブジェクトサイズみても一目瞭然じゃない。

そりゃ人間がみりゃ不要なコードも当然あるから、完璧な最適化が可能であれば、
最終的にCとC++がニアイコールになるけれど、そんなないものねだりしたって
しょうがないでしょ。
248デフォルトの名無しさん:2010/09/25(土) 17:40:31
適材適所の材料つかえって事だ。
249デフォルトの名無しさん:2010/09/25(土) 17:45:53
>>248
つまりは、そういうことですねw
250デフォルトの名無しさん:2010/09/25(土) 17:46:44
>>248

なるほど
専門卒=C
国立大卒=C++


251デフォルトの名無しさん:2010/09/25(土) 17:47:12
コンパイル時定数計算とか、コンパイル時分岐の最適化とか
このへんの高速化はCには真似できないし場合によってはC++のほうが早いんじゃねーの?
252デフォルトの名無しさん:2010/09/25(土) 17:50:38
>>250
日大卒の俺の友人がC++とか言ってるんだけど彼にC++が使える気がしないw
C++はクソみたいな落とし穴が一杯だから、俺sugeeモードになれる人じゃないと結構苦しんではないかと。

俺?俺は旧帝出身の別の職業に就いている。
ただの趣味グラマだからレベルは高くないけどそんな俺より彼が正直C++を使えるとは思えない。

ってチラシの裏に書けば良いのにここに書いてみる
253デフォルトの名無しさん:2010/09/25(土) 17:51:05
linusはメッチャC++を嫌ってるな。
254デフォルトの名無しさん:2010/09/25(土) 17:51:32
>>246
> だから昔からC++なんかよりVBの方がよっぽど優秀
俺は初耳だぞw
VBは中途半端じゃないか。
255デフォルトの名無しさん:2010/09/25(土) 17:53:12
>>253
LinusはC++だけが嫌いなんじゃなくて、
C++をバカが使うのがいやなんだろうと思っている。

まあ結局 彼自身は頭良いからC言語で十分高度なプログラミングができる、
だからそもそもC++が存在するのがいけねぇんだって
結論になるからC++も嫌いなんだろうけど。

256デフォルトの名無しさん:2010/09/25(土) 17:55:20
まだVB6が現役だったころ、VC++ vs VBみたいな話になると、
「VBは生産性高い、C++は高度なことができる、使い分けが肝心」みたいな
話になってたけど、VBが生産性高いのは単にVBプログラマがVBしか使えないから
だよな。
257デフォルトの名無しさん:2010/09/25(土) 18:00:06
CをつかうよりもC++のオブジェクト指向の部分だけ使わない方が
よくね?
258デフォルトの名無しさん:2010/09/25(土) 18:03:21
というか、そのころのVC++の生産性が低かったんだろ。
259デフォルトの名無しさん:2010/09/25(土) 18:06:00
>>253
だってカーネルプログラミングで使えない物を外すとC99だもの
260デフォルトの名無しさん:2010/09/25(土) 18:19:25
グローバル変数とか手動で処理した方が知能がいりそうだよな
261デフォルトの名無しさん:2010/09/25(土) 18:33:57
実際の所、C++はパワフル過ぎてほとんどのひとが飲み込まれてるというか、機能に振り回されてるよね
262デフォルトの名無しさん:2010/09/25(土) 18:40:12
>>258
いや、VB6がよく使われてた業務用のシステムとか、ダイアログに
グレープシティーのコンポーネント貼ったようなのばっかりだったから
VCでも大差なかっただろうし、内部のロジックとかC++のほうが
圧倒的に簡単に書けるでしょ。
VBが生産性高いって、VBしか使えない連中の思い込みだよ。
263デフォルトの名無しさん:2010/09/25(土) 18:43:21
>>256
10年前くらいだろうけど、当時はネット環境や書籍も貧弱な中で
C++の文法、Win32API、MFCの三重苦だったからな
VBやJavaに流れがいっても仕方なかった
264デフォルトの名無しさん:2010/09/25(土) 18:43:26
講義でVB使ったときにはあまりに使い辛くて画面に向かい合ってるだけで吐き気がした
265デフォルトの名無しさん:2010/09/25(土) 18:56:19
>>262
VB6 の頃はだいぶましになってたけど、VB4 あたりでは VC と VB で
生産性はかなり違ったよ。

だから別に VC に移行する必要のない案件は VB のまま継続してただ
けだろ。
266デフォルトの名無しさん:2010/09/25(土) 19:08:08
なぜVC++はC++と関連性が高いのにVBはBとまるで別物なんだぜ?とか言ってみる
267デフォルトの名無しさん:2010/09/25(土) 19:34:31
Bといってるのは、Basicなのか、それともCの元になった言語のことか、
と突っ込んでみるw
268デフォルトの名無しさん:2010/09/25(土) 19:48:58
D言語って何で流行んないの?
269デフォルトの名無しさん:2010/09/25(土) 19:51:30
新しい言語の出来がどんなによくてもそれだけで流行ってことなんかない
必要性のない言語は消えていく
270デフォルトの名無しさん:2010/09/25(土) 19:57:22
GCを導入したせいじゃないかな
271デフォルトの名無しさん:2010/09/25(土) 19:58:11
>>268
俺達が乗り換えないから。

あと、仕様がさだまらないから一度作ったライブラリすら
無効になることが普通にあるらしく、そんなんやってられないじゃん。

272デフォルトの名無しさん:2010/09/25(土) 20:02:22
Dって完成したのだろうか
273デフォルトの名無しさん:2010/09/25(土) 21:31:21
それを言ったらCだって完成してるんだかどうなんだか。
274デフォルトの名無しさん:2010/09/25(土) 21:32:34
C++はともかくCは完成してるだろう
275デフォルトの名無しさん:2010/09/25(土) 21:43:52
完成?
蛇足ばっかりでムカデのような状況だと思う
B に型を導入してコンパイラ化するところまでで「成長」はほとんど止まってるだろ

プロトタイプや const については
変な話だが C++ スレなのでやめておく
276デフォルトの名無しさん:2010/09/25(土) 21:53:02
完成ってどういう意味?完成してる言語の具体例は?
277デフォルトの名無しさん:2010/09/25(土) 21:54:28
ふーむw

UNIXのシェルスクリプトくらいかね?
awkも完成っていっていいかも。
278デフォルトの名無しさん:2010/09/25(土) 21:56:34
俺がD触ってたときはver1.0にすらなってなかったので
正式リリースされたのかどうかって意味だ
279デフォルトの名無しさん:2010/09/25(土) 22:17:06
>>275
社会で通用しないタイプだな
280デフォルトの名無しさん:2010/09/25(土) 22:20:37
VBをどうこう言っている連中はVB6とVB.netがまるで別物だってことに気付いているのかね。
VB6は部品を全部自前で用意しているからWindowsの標準的な部品を使おうとすると却って使えない。
VB.netはC#の方言でしかないからVBしかやってこなかった連中が乗り換えやすいと言う宣伝文句以上の意義がない。
要は、VB6までは素人乗りで生産性が上がった気がしている連中の玩具でVB.netはC#を使えない連中の縋る石。

って、スレ違いの話ばかりではなんなのでC/C++についても少々。
実際に既存プログラムの高速化を行なっているが、処理時間の一番のネックになる重要な演算部分は
とどのつまりはSSEや並列化を考慮してぎりぎりまで最適化する関係でC/C++の差の出ないコードになる。
その周辺部分はC++で保守性と見通しをよくするか、Cのまま放置するかしばしば悩むことになる。
少なくとも、充分な最適化能力のあるコンパイラを使う限りC/C++で処理時間に大きな差は出ない。
281デフォルトの名無しさん:2010/09/25(土) 22:27:45
>>280
知ってるから「VB6」って書いてるんじゃないの? > VBどういう言ってる連中
282デフォルトの名無しさん:2010/09/25(土) 22:34:12
つまり貴方が言いたい事はこういうことですね。
プログラムの大半を書くのが楽なRubyを使って、
効率の必要な場所だけCのコードを呼び出すと。
283デフォルトの名無しさん:2010/09/25(土) 22:38:37
>>277
何を持って「完成」というかだな
ループカウンタも shell script だけでは回せなくて「完成」というわけだからな
284デフォルトの名無しさん:2010/09/25(土) 22:39:31
>>282
そのレスはどれに対するレスなんだい?
285デフォルトの名無しさん:2010/09/25(土) 22:42:09
>>283
実にくだらない
286デフォルトの名無しさん:2010/09/25(土) 22:50:22
なんで人間の作ったプログラムと人間の作った同世代のコンパイラで差ができるん
287デフォルトの名無しさん:2010/09/25(土) 22:57:44
>>282
PHPがさんざんやりまくって今更感満点ですが、やりたいのでしたら歓迎します。
288デフォルトの名無しさん:2010/09/25(土) 23:53:25
それはPythonの十八番
289デフォルトの名無しさん:2010/09/26(日) 04:31:01
静的型チェックの無い動的型の言語は、大規模プログラム書くには心臓に悪すぎる。
290デフォルトの名無しさん:2010/09/26(日) 05:24:05
Pythonで書かれた大規模プログラムが無いとな
291デフォルトの名無しさん:2010/09/26(日) 05:30:17
>>289
つまり、君は、C++なんて使いたくない、と。
少なくともプログラミング言語C++第2版レベルのC++でないといやだと?w

STLとかジェネリックプログラミングなんてとんでもないよな?
静的型チェックなんてないもんな。
292デフォルトの名無しさん:2010/09/26(日) 08:14:02
え、あるじゃん
293デフォルトの名無しさん:2010/09/26(日) 08:27:37
>>291が何を言いたいのかわからない
294デフォルトの名無しさん:2010/09/26(日) 08:30:41
?w←これ気持ち悪いからやめてくれ
295デフォルトの名無しさん:2010/09/26(日) 09:35:11
C++
これもきもい
296デフォルトの名無しさん:2010/09/26(日) 10:18:32
型推論と動的型の区別がつかないやつは何度か見たけど、
テンプレートと動的型の区別が付いてないやつは初めて見た。
297デフォルトの名無しさん:2010/09/26(日) 10:29:39
>>291は無知をさらけ出して自ら羞恥心を煽り興奮するタイプ
298デフォルトの名無しさん:2010/09/26(日) 10:49:11
C++は完全な静的型ではありません。
ベースクラスのポインタやvoid *が。
299デフォルトの名無しさん:2010/09/26(日) 10:50:49
俺と同じタイプがもう一人いるとは。
C++っつーか手続き型言語はもうダメだ。飽きたよ。最適化いい加減でとろいし。
300デフォルトの名無しさん:2010/09/26(日) 10:53:53
いいえコンパイル時には完全な静的型です
301デフォルトの名無しさん:2010/09/26(日) 10:54:52
302デフォルトの名無しさん:2010/09/26(日) 10:55:50
void*がどうしたとか、静的動的の文脈の話題じゃないよな。

だいたい「テンプレートは動的ですね」に「いやそうじゃないだろ」って
反論されて「void*とかあるだろ」って言い返すのって、無理やりすぎる。
303デフォルトの名無しさん:2010/09/26(日) 11:04:20
お前こそ無理がある。負け>>302
304デフォルトの名無しさん:2010/09/26(日) 11:05:47
言い返せないからってレッテル張りとかわろっちwww
305デフォルトの名無しさん:2010/09/26(日) 11:12:54
>>303
まったくムリはありません。
306デフォルトの名無しさん:2010/09/26(日) 11:13:55
>>305
じゃあ俺にもない
307デフォルトの名無しさん:2010/09/26(日) 11:17:37
第三者が判定すると>>303の完全敗北
308デフォルトの名無しさん:2010/09/26(日) 11:18:03
>>306
いえ
「テンプレートは動的だ」

「動的じゃないだろ」

「ぼ、void*があるから動的です」

すごいムリがある。
309298:2010/09/26(日) 11:22:59
>>289>>302でおれの方が完全勝利じゃん。
310デフォルトの名無しさん:2010/09/26(日) 11:25:07
馬鹿ばっかりだな
C++を馬鹿がさわるのを禁止しよう
選ばれた人間だけが使うべき言語だ
311デフォルトの名無しさん:2010/09/26(日) 11:25:15
void*もreinterpret_castするなら静的(何が?
312デフォルトの名無しさん:2010/09/26(日) 11:25:18
Python使いの心臓は強い、まで読んだ
313デフォルトの名無しさん:2010/09/26(日) 11:25:55
C++は言掛りのつけられやすい言語
314デフォルトの名無しさん:2010/09/26(日) 11:27:40
だって複雑過ぎてよく分かんねーんだもん
315デフォルトの名無しさん:2010/09/26(日) 11:28:26
実行するまでわからないエラーばっかりの言語とかマジキチって思うわ。C++最高
316デフォルトの名無しさん:2010/09/26(日) 11:30:16
テンプレートのエラーも長ったらしい上にああ、そこかーーーってエラーが多いけどね
317デフォルトの名無しさん:2010/09/26(日) 11:33:25
どこだよーってエラーが多い
誰か何とかして
318デフォルトの名無しさん:2010/09/26(日) 11:34:50
つstatic_assert
319316:2010/09/26(日) 11:35:43
>>317
そうそう、そういう意味
320デフォルトの名無しさん:2010/09/26(日) 11:38:21
>>318
そんなものでどうにかなるんだろうか…
321デフォルトの名無しさん:2010/09/26(日) 11:39:52
なるよ
ぜんぜん違う
322デフォルトの名無しさん:2010/09/26(日) 11:42:43
俺なんて自分で作ったやつ使ってるだけでわけわかめエラーが出るのに… orz
323デフォルトの名無しさん:2010/09/26(日) 11:48:06
エラーの分かりづらさはあるけど
慣れれば速攻特定できる

つまり俺はそれだけエラーを書いてきたってことですよ
324デフォルトの名無しさん:2010/09/26(日) 11:48:44
C++なんて実行すればSEGVの連投。
325デフォルトの名無しさん:2010/09/26(日) 11:56:28
>>309
いや
「動的型は大規模開発には向いていない」

「C++も、ぼ、void*があるからだめだね」

でもムリがありすぎだろ
326デフォルトの名無しさん:2010/09/26(日) 12:05:12
もー基地外は放っておけよ
327デフォルトの名無しさん:2010/09/26(日) 12:05:18
負けたものをいつまでもグチグチ言ってんな。
「で、でもムリありすぎだろ」って。
328デフォルトの名無しさん:2010/09/26(日) 12:06:27
C++の一番の問題は、入門書だろうなあ。
ちゃんとした考えが身につく前に使えちゃうからどんどん勘違いする。
329デフォルトの名無しさん:2010/09/26(日) 12:08:50
スクリプト言語の方がはるかに使えちゃうと思うが
330デフォルトの名無しさん:2010/09/26(日) 12:09:01
まずPythonで作ってprofilerかけてボトルネックだけC++で作り直す方法で
生産性が30倍になりました
331デフォルトの名無しさん:2010/09/26(日) 12:10:11
>>328
何でも良いんならそりゃスクリプトに行くでしょうよ
いざC++やらにゃとなった時の話だよ
332デフォルトの名無しさん:2010/09/26(日) 12:10:22
C++は詳細なコーディング規約を作っ徹底させないとプロジェクトで使い物にならない
333デフォルトの名無しさん:2010/09/26(日) 12:14:40
コーディング規約程度じゃダメで、この人の方式が最高って人を決めて、とことん合わせないといけない気がする
334デフォルトの名無しさん:2010/09/26(日) 12:18:04
>>330
C++はあれだけど、動的型の言語は信者が言うほど生産性高くないと思ってる。
静的型の言語+IDEがいい。
335デフォルトの名無しさん:2010/09/26(日) 12:18:22
C++には広く使われている一つの標準的なコーディング規約もないんだな。
336デフォルトの名無しさん:2010/09/26(日) 12:19:47
>>334
IDEとか言っている時点でド素人臭しかしない
vimだろうそれでも漢かよ
337デフォルトの名無しさん:2010/09/26(日) 12:21:10
>>334
動的型だからとかじゃなくてPythonだから生産性が高いんだよ
338デフォルトの名無しさん:2010/09/26(日) 12:23:22
いまどきソース管理ツールを使ってないと恥ずかしいってのは
常識になってると思うけど、そろそろIDEくらい使わないと
恥ずかしいってのも常識化してもいいころだよな。
339デフォルトの名無しさん:2010/09/26(日) 12:23:48
vimでもIDEでも生産性なんて変わらねー。でもVCのIDEのが賢いと思う。
340デフォルトの名無しさん:2010/09/26(日) 12:25:45
マウスに手を伸ばす時点で生産性は悪い(キリッ!
341デフォルトの名無しさん:2010/09/26(日) 12:26:20
便利だからって理由でC++の機能を使いまくってると絶対破綻するからなあ
このへんをきっちり抑えた概念的な入門書とか無いのかな
342デフォルトの名無しさん:2010/09/26(日) 12:27:01
俺は C++ とスクリプトの両方使うけど簡単な使い捨てはスクリプトばっかりだな
ただ、入り組んだものはC++の方が安心感ある
ディフェンシブにコーディングしやすいからかな
その人次第なんだろうけど
343デフォルトの名無しさん:2010/09/26(日) 12:28:02
高度なIDEを作りづらいのはC++の言語仕様だよね。
そんな特殊なプラットフォーム挙げてもらってもね〜。
344デフォルトの名無しさん:2010/09/26(日) 12:28:37
345デフォルトの名無しさん:2010/09/26(日) 12:29:50
googleの規約って有名だけど割と変わったパターンだよね
346デフォルトの名無しさん:2010/09/26(日) 12:31:39
つーかスクリプトで生産性が高いってのは
糞長いコンパイルが無いからってのが重要だろ
347デフォルトの名無しさん:2010/09/26(日) 12:37:09
せやなw
348デフォルトの名無しさん:2010/09/26(日) 12:42:33
標準機能と言語の寛大さの違いからくるコードの長さの違いじゃないの?
boostが標準で初心者に簡単に扱えるなら生産性はぐっと上がると思う。
349デフォルトの名無しさん:2010/09/26(日) 12:43:59
STLを熟知してないとC++を効率的に使うのは難しい
                    おれゆき
350デフォルトの名無しさん:2010/09/26(日) 12:44:13
例外の有用な使い方のtipsってないのか?
Boost.Exceptionとかあるぐらいだし巷で言われるようなただの糞ってわけでもないと思うんだけど
ちょっと調べただけじゃなんか例外はうんことかばっかで「使うな」以外の結論がでてこない
351デフォルトの名無しさん:2010/09/26(日) 12:46:00
10年前の話かよw
352デフォルトの名無しさん:2010/09/26(日) 12:48:29
>>349
そうだboostの前にSTLがあった orz
353デフォルトの名無しさん:2010/09/26(日) 12:49:00
ExceptionalC++だって10年近く前のネタだし
もっとこうBoost.Exceptionとか徐々にコンパイラ拡張で入っているC++0xの特性を使った
新しいやり方の例外処理についてのネタとか知りたいと思うわけで
354デフォルトの名無しさん:2010/09/26(日) 13:36:26
結局、分野によって問題になりやすいバグの種類も違うだろうし(必要になる機能も違うだろうし)
全分野で統一した規約ってのはなかなか難しいのかもね。
355デフォルトの名無しさん:2010/09/26(日) 14:28:14
もっとも良くできた規約は
「C++の使用を禁止する」というものだ

嘘みたいだけど本当なんだぜ
356デフォルトの名無しさん:2010/09/26(日) 14:28:31
ばかじゃねーの
357デフォルトの名無しさん:2010/09/26(日) 15:06:10
言語以前だな
一番良いのはプログラムを書かないこと
358デフォルトの名無しさん:2010/09/26(日) 15:08:05
こんなクソ職業はドカタにやらせて
自分は就かないってのが一番いいんじゃないかな。
359デフォルトの名無しさん:2010/09/26(日) 15:08:43
C++は設計からしてマルチパラダイムなんだから
コードの書き方の流儀が複数でてきていいと思うんだけどな。
360デフォルトの名無しさん:2010/09/26(日) 15:09:31
おれは農業とプログラマーを見下す人間を信用しない。
361デフォルトの名無しさん:2010/09/26(日) 15:13:57
正直向いてないと思うけど今更会社辞められないし頑張るしかないよね
362デフォルトの名無しさん:2010/09/26(日) 15:31:04
職業がクソなんじゃなくてお前が腐ってるだけだよ。
マより辛い仕事なんて世間には山ほどある。
363デフォルトの名無しさん:2010/09/26(日) 15:36:22
自殺のリスク考えたら
プロアルピニストくらいやばそう
364デフォルトの名無しさん:2010/09/26(日) 15:48:32
>>362
山ほどあるならとりあえず10個ぐらい挙げてみてよ
365デフォルトの名無しさん:2010/09/26(日) 16:00:35
ハローワークにあるほとんどの仕事。
366デフォルトの名無しさん:2010/09/26(日) 16:07:27
>>362
> 職業がクソなんじゃなくてお前が腐ってるだけだよ。
いや俺はマなんて仕事についてないし。
もっともうけの良い職業についている。
どちらかというとマに書かせる方。
367デフォルトの名無しさん:2010/09/26(日) 16:11:24
マ板でやれ
368デフォルトの名無しさん:2010/09/26(日) 16:23:32
char a[4];
reinterpret_cast<int&>(a[0]) = 0x11223344;

これは何か危険性があったりしますか?
369デフォルトの名無しさん:2010/09/26(日) 16:32:07
アラインメントの問題があります
370デフォルトの名無しさん:2010/09/26(日) 16:48:57
>>367
やです
371デフォルトの名無しさん:2010/09/26(日) 19:37:37
(sizeof(char)*4 == sizeof(int))がtrueかは環境依存
372デフォルトの名無しさん:2010/09/26(日) 19:46:48
strict aliasing rule?
373デフォルトの名無しさん:2010/09/26(日) 19:56:56
>>371
sizeof(char) == 1
はC++をまともに実装している環境では絶対に成り立つが、
(sizeof(char)*4 == sizeof(int))が成り立つとは限らないのは確かである。

ではコンパイル時分岐させるなどして
(sizeof(char)*4 == sizeof(int))が成り立つ環境においてのみに
話を限定する時、
>>368は本当にだめだと言い切れるの?


374デフォルトの名無しさん:2010/09/26(日) 19:58:25
375デフォルトの名無しさん:2010/09/26(日) 20:22:17
共用体にしとけばいいんじゃね?
376デフォルトの名無しさん:2010/09/26(日) 20:28:51
377デフォルトの名無しさん:2010/09/26(日) 20:35:47
*.cppに静的な非メンバ関数が書いてあるのですが、
なぜclassに参加させないのですか
378デフォルトの名無しさん:2010/09/26(日) 20:38:00
書いた本人にしか意図は分からんが
クラスにメンバを書き換えないことを保証できる。
379377:2010/09/26(日) 20:39:19
>>378
理解しました
ありがとうございます
380デフォルトの名無しさん:2010/09/26(日) 20:39:25
>>377
非メンバを禁止すればオブジェクト指向になるというのは妄想。
381デフォルトの名無しさん:2010/09/26(日) 20:40:09
union {
int n;
char a[sizeof(int)];
};

こうすればいいのか。まんどくさいな。
382デフォルトの名無しさん:2010/09/26(日) 20:41:09
>>377
静的メンバ変数を宣言した場合
その実体の定義をクラス定義の外側に記述しなくちゃいけないとか
そういうことをいってるのじゃなくて?
383デフォルトの名無しさん:2010/09/26(日) 20:50:52
>>381
変換のために使うならエンディアンを考慮すればだけど
384デフォルトの名無しさん:2010/09/26(日) 22:26:08
>>350
なんで例外使わないなんて結論になるの?
そんなんじゃ new も使えないの?
コンストラクタの失敗どうすんの?
385デフォルトの名無しさん:2010/09/26(日) 22:29:58
>>381
そんなことしても結果に移植性が無いことに変わりは無いよ。
期待してる動作を素直にビット演算で実装するべき。
386デフォルトの名無しさん:2010/09/26(日) 22:31:19
newが失敗したら問答無用でアウトなものでしかやったことないんだけど
普通はすべてのnewの失敗例外をハンドリングしてるものなの?
387デフォルトの名無しさん:2010/09/26(日) 22:41:47
今時の仮想記憶を使った環境でnewが失敗するような状況って
エラー処理しても続行できる気がしないよな。
388デフォルトの名無しさん:2010/09/26(日) 22:44:36
Cでmalloc()のリターン値もチェックする必要ないんじゃね? って言っても
同意してもらったことがない。
389デフォルトの名無しさん:2010/09/26(日) 22:47:22
>>388
mallocは戻りをチェックする必要がある。
newは例外を投げるので戻りをチェックする必要は無い。例外をキャッチするかは用途に合わせてご自由に。
390デフォルトの名無しさん:2010/09/26(日) 22:48:02
チェックせずに強制終了するよりも、
メモリが足りませんってエラー出した方が 「よく分からんエラーが出たぞ!!どうにかしろ!!」 って怒られる現実
391デフォルトの名無しさん:2010/09/26(日) 22:49:03
失敗が絶対に許されない案件では
まず全量の資源を確保して
話はそれからだな
392デフォルトの名無しさん:2010/09/26(日) 22:51:01
>>390
mainで例外をキャッチすれば済むね
393デフォルトの名無しさん:2010/09/26(日) 22:55:39
>>391
全量の資源が確保できなかったら失敗じゃん
394デフォルトの名無しさん:2010/09/26(日) 22:58:26
>>393
失敗しないnewは無理だろう。
395デフォルトの名無しさん:2010/09/26(日) 22:59:39
そんな状況もnewが例外を投げればプログラムぞっこー可のー
396デフォルトの名無しさん:2010/09/26(日) 23:03:51
でかいリソース確保するときだけチェックすればいいんじゃないの
397デフォルトの名無しさん:2010/09/26(日) 23:06:14
>>393
仕事を受けてしまってから「ダメでした」というのと
始めから「無理です」というのは違うぞ
398デフォルトの名無しさん:2010/09/26(日) 23:08:29
>>389
newが例外出すってのは知ってる。
new失敗するような状況でまともなリカバリムリでしょって話の流れで。
399デフォルトの名無しさん:2010/09/26(日) 23:10:40
あとlinuxとかmalloc()のリターン値をチェックしてもメモリの
確保に失敗したか成功したか分からんって話もあるな。
400デフォルトの名無しさん:2010/09/26(日) 23:15:40
なんかチェックするかしないかというようなくだらない話をしてる人がいるが、
チェックした結果のエラー通知に例外を使うべきかどうかという話じゃなかったのか?
401デフォルトの名無しさん:2010/09/26(日) 23:20:38
最初に全部メモリ確保って無駄多すぎてやばいでしょ
失敗する確率増やしてどうすんの
402デフォルトの名無しさん:2010/09/26(日) 23:22:37
ならば他に途中で絶対に失敗しない手段をあげてみたらどうよ
403デフォルトの名無しさん:2010/09/26(日) 23:27:59
>>400
いや、newに失敗するような状況で、どうせまともなリカバリできないでしょって話。
404デフォルトの名無しさん:2010/09/26(日) 23:28:06
>>401
最初にメモリ確保できないような環境はサポート外とすれば何も問題ない。
405デフォルトの名無しさん:2010/09/26(日) 23:29:56
ようは失敗時どこまで元に戻さないといけないかって問題だな。
戻したい状態に戻せるリソース量と速度の兼ね合いで決まる。
406デフォルトの名無しさん:2010/09/26(日) 23:30:00
その最大メモリってどうやって計算すんの?
407デフォルトの名無しさん:2010/09/26(日) 23:33:15
主にロジックに依存するんじゃないの?出したい速度、戻したい状態にもよるけど
408デフォルトの名無しさん:2010/09/26(日) 23:35:51
>>406
実測
409デフォルトの名無しさん:2010/09/26(日) 23:38:35
最初に確保するって
自前のアロケータ使ったりするの?
410デフォルトの名無しさん:2010/09/26(日) 23:48:17
アロケータかどうかは知らないけどメモリ管理はするよ。自分でコーディングしたことはないけど。
とくに32bitだったら特殊な管理しないとできなくない?AWEだかPAEだか3文字のなんか。
仮想メモリ使い切るようなロジックを考えるなら最大メモリも計算できないようなロジックを選択
すべきではないと思うけど…
411デフォルトの名無しさん:2010/09/26(日) 23:54:14
>>406
本当は、それの標準化が欲しいところなんだが
メタボ化ばかりにお盛んで(ry
412デフォルトの名無しさん:2010/09/27(月) 00:03:22
つーかクライアントが使う最大メモリ量なんてわからなくね?
可変長コンテナとかいちいち最大値を定数で持たせて、
すべてのコンテナが最大値をとったと仮定してメモリを取るの?
でもこれだとすごい量が必要になりそうだよね
413デフォルトの名無しさん:2010/09/27(月) 00:06:38
大規模になりそうなロジックはある程度の長さに分割して処理するべきと言ってるだけ。
小さいやつなら何だっていいじゃん別に。
414デフォルトの名無しさん:2010/09/27(月) 00:16:03
>>412
家庭用ゲーム機などでは本来はすべて上限を設定すべきだけど。
しかし最近の希望的観測プログラマーはやってないことも。
415デフォルトの名無しさん:2010/09/27(月) 00:21:55
>>412
想定するハードウェアスペックからスワップしない程度のメモリ使用量を決めてその範囲内で動くように設計するけどな。
416デフォルトの名無しさん:2010/09/27(月) 00:22:24
>>377
普通にその.cpp以外のファイル.cppで使って欲しくないってんじゃない?
ファイルスコープに限定されているって話だよね?
417373:2010/09/27(月) 00:24:56
>>376
何がなんだか分からな…
いやつまりは
> chBuf[2]のアドレスが奇数に配置されていた
こういうことがあり得るのが問題だ!ってことですか?
418デフォルトの名無しさん:2010/09/27(月) 00:33:07
>>376じゃないけどそうなんじゃない?
最近のCPUは知らないけどアラインメントに気をつけないとバスエラーになるのは
インテル以外では結構普通だった。
419373:2010/09/27(月) 00:43:30
じゃあアラインメントを保証すべく策を練る。
//////////////////////////
コンパイル時分岐させるなどして
(sizeof(char)*4 == sizeof(int))が成り立つ環境においてのみに
話を限定する時、

char * a = new char[4];
*(reinterpret_cast<int*>(a)) = 0x11223344;
これは危険性は「newが失敗しない限りは絶対にない」と言いきって良いんでしょうか?

参考コード: ttp://codepad.org/Ebt5gKHu

420デフォルトの名無しさん:2010/09/27(月) 00:46:29
エンディアン依存だけどアラインメントは問題ないよ
421デフォルトの名無しさん:2010/09/27(月) 00:48:30
エンディアン依存・・・私の勉強不足です。
すみません!

もうreinterpret_castっていつ使うために存在しているんですかね。
422デフォルトの名無しさん:2010/09/27(月) 00:52:05
組み込みシステムとかなら、整数をアドレス値にキャストするとかあるんじゃない
423デフォルトの名無しさん:2010/09/27(月) 00:54:37
先生!なんでアラインメントに問題がないのかよく分かりません。
424デフォルトの名無しさん:2010/09/27(月) 01:01:03
new char [N]はサイズがN以下のすべての型のアラインメントに一致するアドレスを返すって規格があったようななかったような…
operator newなら確実なんだけど…
425デフォルトの名無しさん:2010/09/27(月) 01:01:41
>>399
メモリの遅延割り当ての話?
mallocの時点では実際には確保されずに
メモリに書き込んだ時点で確保するんだっけ。
426421:2010/09/27(月) 01:05:21
>>422
ありがとうございます。
427デフォルトの名無しさん:2010/09/27(月) 01:41:27
>>425
メモリが欲しいっつってmalloc/newしてんのに
迷惑な話だよな、それ
いつも思うけど
428デフォルトの名無しさん:2010/09/27(月) 01:47:27
>>427
仮想記憶では普通だとおもう。
物理メモリに割り当ては随時だろうけど、予約だけはされてるんじゃないのかなとか思う?
429デフォルトの名無しさん:2010/09/27(月) 01:59:53
mallocのmanにはっきりと「バグ」と書いた上に散々扱き下ろされてるし、
普通というわけでもないような
430デフォルトの名無しさん:2010/09/27(月) 02:01:53
>>425
何そのクソ仕様
431デフォルトの名無しさん:2010/09/27(月) 02:04:45
ではWindowsでもmallocで取った新しいアドレスにアクセスしてると途中で突然死んだりするの?
432デフォルトの名無しさん:2010/09/27(月) 02:07:56
linusが悪いの?
433デフォルトの名無しさん:2010/09/27(月) 02:08:31
mallocとcallocの引数が異なる件について
434デフォルトの名無しさん:2010/09/27(月) 02:10:26
>>431
そんなことは起きない。mallocがVirtualAllocを使って実装されてたとすると、物理メモリはアクセスされるまで割り当てられないが、領域は仮想領域に予約されているのでメモリ不足にはならない。
435デフォルトの名無しさん:2010/09/27(月) 02:10:30
>>431
mallocでちゃんとNULLが返るはず
436431:2010/09/27(月) 02:15:47
>>432
mallocってCの標準関数でシステムコールじゃないしkernel関係ないんじゃないの?よく知らないけど
>>434
予約するだけじゃプロセスの仮想アドレスが割り当てられるだけで実体はなく、アクセスした際に
仮想メモリ全体の空間がなくなれば同様に落ちるんじゃ…
>>435
それならいいんだけど。
437デフォルトの名無しさん:2010/09/27(月) 02:19:51
HDD側にもちゃんと領域が予約されてるってことじゃないの
438デフォルトの名無しさん:2010/09/27(月) 02:24:29
スワップも含めて、本当にメモリ不足になったらOOM killerが発動するんだろうけど、
どのタイミングで走るんだろう。
大きすぎるmalloc要求?それとも遅延割り当てされた領域へのアクセス?

mallocの時点でメモリ不足だとわかるなら
割り当てを失敗させればいいだけだから後者なんじゃないかな。
439デフォルトの名無しさん:2010/09/27(月) 02:28:20
MEM_COMMITをつければ物理領域に割り当てが来るんじゃなかった?物理メモリの割り当てとは別に
440デフォルトの名無しさん:2010/09/27(月) 02:30:16
>>437
うーん、よくわからない。ページファイルと二重に確保してるってこと?
>>438
なぜだーー前者じゃないの?
>>439
コミット付きなら分かる。予約って言ってたからそれだけだと思った。
441440:2010/09/27(月) 02:42:28
mallocのVirtualAllocにMEM_COMMITが付くってことならつまり
Windowsでは実際に仮想メモリの実体まで確保しているってことだよね。
それならmallocでOOM時NULLを返せると思う。
442440:2010/09/27(月) 02:54:02
>>438
言っている意味がようやくなんとなく分かった。つまり予約しただけの空間に実体を割り当てたときに
プロセスを落とすケースはいつかって話だったのか。mallocのときはエラー返すだけで済むから
後者だけってことだね。
443デフォルトの名無しさん:2010/09/27(月) 03:25:21
>>431,434,435
Linuxだけどちょっと試してみた。

メモリ1GB。スワップなしのLinux上で
mallocがNULLを返すまで1MBずつ割り当て続けたら
実メモリを越える2.8GBあたりまで割り当てられた。

その後0埋めしていったら、
855MBほど書き込んだところでOOM killerにkillられた。
callocでも試してみたけど、どういうわけか同じ動作。
444431:2010/09/27(月) 03:44:28
>>443
おお、Linuxで実際に試してくれたんだ。ありがとう。
mallocについては想定どおりの結果だね。プロセスの仮想アドレスの内
ユーザー空間目一杯まで予約できて(32bitですよね?)、仮想メモリの実体の
限界までアクセスできて(確保できて)足りなくなったら落とされる、と。
callocについては知らない。個人的に同じ動作に違和感はないけど。
445デフォルトの名無しさん:2010/09/27(月) 04:02:14
callocは0埋めあらかじめしてるようなものだから不思議がってるんだろうよ
446440:2010/09/27(月) 04:08:32
>>437
これの意味もようやくなんとなく分かった。プロセスの仮想アドレスの予約だけでなく、
ページファイルにも確保でなく予約をしているのではないか?ってことか。実際に実体が
必要になったときに物理メモリを確保できればするが、できなければ予約したページ
ファイルの領域を使用すると。サイズ的には確保しているのと同じだけど処理は速く
なって、デメリットもない。WindowsのVirtualAllocが予約の際にそこまでしてくれて
ればmallocでコミットまでしなくてもいいのか。
>>445
初めて知って意味を把握しました。 orz
447デフォルトの名無しさん:2010/09/27(月) 04:11:27
/dev/zeroを指定してmmap()してるから、メモリにはまだ触ってないということかな
448デフォルトの名無しさん:2010/09/27(月) 04:39:22
ちょっとcallocしてstraceしてみましたが、mmapで指定されたfdは-1でした。64bitですが。
449デフォルトの名無しさん:2010/09/27(月) 04:40:39
結局、移植性を確保しつつ安全にメモリを確保する方法ってあるの?
450デフォルトの名無しさん:2010/09/27(月) 05:01:13
プログラム開始時に必要分mallocして全て0埋めする
451デフォルトの名無しさん:2010/09/27(月) 08:40:56
>>283
完成=言語として枯れている状態
削除される機能もなければ追加される機能もない状態
452デフォルトの名無しさん:2010/09/27(月) 10:30:18
Linuxでなら、/proc/meminfoを見れば
その時点でどのくらいまでメモリを割り当てていいかがわかる。

その値に応じてsetrlimitとかで仮想メモリの量を自主規制すれば
mallocがちゃんとNULLを返してくれるようになり、
>>443のみたいな無茶な割り当てはせずに済む。
453デフォルトの名無しさん:2010/09/27(月) 11:50:27
>>451 実用性とは必ずしも関係無いね
454デフォルトの名無しさん:2010/09/27(月) 14:56:43
>>451
> 完成=言語として枯れている状態
それは短絡的すぎないか。
455デフォルトの名無しさん:2010/09/27(月) 15:27:28
>>448 MAP_ANONYMOUS を使ってるんだろう。これでもゼロ埋めされた領域になる。
456デフォルトの名無しさん:2010/09/27(月) 19:24:23
>>451
見放されたことも完成というのか
457デフォルトの名無しさん:2010/09/27(月) 22:20:15
template< class T > T Endian( T val )
{
char* const byte = reinterpret_cast<char*>( &val );
std::reverse( byte, byte + sizeof( val ) );
return val;
}

エンディアンを入れ替えるのはこんな感じでいいですか
458デフォルトの名無しさん:2010/09/27(月) 22:22:39
ダメです
459デフォルトの名無しさん:2010/09/27(月) 23:04:47
今日は自分がやりたいと考えていた、プログラミングをやっているコードを見つけた
何て最高なんだ
460デフォルトの名無しさん:2010/09/28(火) 12:46:28
そのコードバグあるよ
461デフォルトの名無しさん:2010/09/28(火) 13:05:35
応用的な質問なんですが、
囲碁とか将棋には詰め碁とあるじゃないですか?
そこで詰めC++を作りたいので
ルールがわかりません。
おしえてください。
462デフォルトの名無しさん:2010/09/28(火) 13:46:38
>>461
>そこで詰めC++を作りたいのでルールがわかりません。

「作りたい」からですよ。「作りたい」と思うのをやめればきっと判ります。
463デフォルトの名無しさん:2010/09/28(火) 15:42:19
詰めC++が少しだけわかったので報告します。

使用できる変数 a b c 使用できる構文のfor3回 while4回
使用できる演算子=3回 +2回を使って
3*24+5を計算しなさい
こんな感じでいいでしょうか?
解きたいのでどなたか問題だしてみませんか?
464デフォルトの名無しさん:2010/09/28(火) 15:46:01
stlのコンテナの要素を別のコンテナに移動したいんですがどうすればいいですか?
465デフォルトの名無しさん:2010/09/28(火) 15:46:49
>>464
要素を代入するだけじゃん
466デフォルトの名無しさん:2010/09/28(火) 17:18:10
ループで代入すか。
だよね。連続してるわけじゃないし。
467デフォルトの名無しさん:2010/09/28(火) 17:19:24
>>466
普通std::copy
468デフォルトの名無しさん:2010/09/28(火) 17:25:36
はじ〜
469デフォルトの名無しさん:2010/09/28(火) 17:32:07
コピー演算子が使えないとは知らなかった。
470デフォルトの名無しさん:2010/09/28(火) 17:53:00
class内で配列を初期化したいのですが
static const int a[3]={1,2,3};
とか書いてもエラーになります。
どうやって初期化すればいいですか?
環境はvisual studio2008です。
471デフォルトの名無しさん:2010/09/28(火) 17:59:20
class X {
public:
static const int a[3];
};

const int X::a[3] = {10,};

こーゆー感じ
472デフォルトの名無しさん:2010/09/28(火) 18:31:37
>>471
出来ました。
ありがとうございます。
473デフォルトの名無しさん:2010/09/28(火) 18:46:28
静的メンバになってるけど大丈夫なのか?w
474デフォルトの名無しさん:2010/09/28(火) 19:36:56
ちなみに、C++0xだと、非staticデータメンバーには、言うなれば「デフォルトの初期化子」みたいなものを書けるからな。

class Foo
{
int x = 0 ;
int a[3] = { 1, 2, 3 } ;

Foo() { } // メンバーはデフォルトの初期化子で初期化される
Foo( int x ) : x(x), a{ 1, 2, 3 } { } // コンストラクターのメンバー初期化子で初期化される
} ;
475デフォルトの名無しさん:2010/09/28(火) 19:40:33
VC6で開発中です。

wininet.dll のバージョン6.0を指定して使いたいと思い、
InternetExplorerのバージョン6.0のマシンから拾ってきました。
動的リンクによって、使用しようとしていますが、
関数の指定の仕方がわかりません。
GetProcAddressの型変換に問題があるのだとは思っていますが、
どうすればよいのでしょうか。

HMODULE dll = LoadLibrary("./wininet.dll");
int (*proc)(int) = (int (*)(int))GetProcAddress(dll, "FtpPutFileW");
hFtp = m_lpclFtpConnection->operator HINTERNET();
ret = proc(hFtp, pszLocalFile, pszRemoteFile, INTERNET_FLAG_TRANSFER_ASCII, 0);
FreeLibrary(dll);//開放
476デフォルトの名無しさん:2010/09/28(火) 19:44:25
>>443
callocで同じなのは、多分初めて使う時に0クリアされるってことなんだろうな
477デフォルトの名無しさん:2010/09/28(火) 19:46:18
いまどきVC6で開発しなければならない職場ってのは、ポインターも理解出来ないアホがいるわけか。
納得。
478デフォルトの名無しさん:2010/09/28(火) 20:00:09
>>475
__stdcall
479デフォルトの名無しさん:2010/09/28(火) 20:00:37
__stdcallって言おうとしたらそれ以前の問題か
480デフォルトの名無しさん:2010/09/28(火) 20:08:39
キャストが思いっきりおかしいし、どこから持ってきたハンドルなんだよとか
481デフォルトの名無しさん:2010/09/28(火) 20:14:49
operator HINTERNET() もおかしい
482デフォルトの名無しさん:2010/09/28(火) 20:21:36
そういえば、何で変換関数を明示的に呼び出しているんだよw
483デフォルトの名無しさん:2010/09/28(火) 20:23:54
フルボッコですな
484475:2010/09/28(火) 20:38:14
>>480
system32に存在する wininet.dll を使用した場合に、
下記の記述でFTP転送ができていたので、
ハンドルは正常に取得できているはずです。

hFtp = m_lpclFtpConnection->operator HINTERNET();
ret = ::FtpPutFile(hFtp, pszLocalFile, pszRemoteFile, INTERNET_FLAG_TRANSFER_ASCII, 0);

>>477
受け渡す情報をポインタで作成まではしてみました。
関数ポインタへポインタで引数を渡せばいいのでしょうか。

>>482
FtpPutFileW は、変換関数なのですか。
FtpPutFile でいいのでしょうか。

>>478,479
__stdcall については、調べている最中です。
485デフォルトの名無しさん:2010/09/28(火) 20:55:19
>>463
> 使用できる変数 a b c 使用できる構文のfor3回 while4回
> 使用できる演算子=3回 +2回を使って
あのな
詰めxxxにはこういう条件は不要だ
最短手順以外は正解ではないのだ
486デフォルトの名無しさん:2010/09/28(火) 21:02:36
>>467
すみません、これでいいんですか?

std::map<int, std::string> test;
std::map<int, std::string>::iterator it = test.find(1);
test.insert(std::pair<int, std::string>(4, it->second)); // 4番目に移動
test.erase(it);
487475:2010/09/28(火) 21:04:25
現在下記のソースです。
GetProcAddressにカーソルを合わせたら int *_cdecl と出るけれども、
型に合わせて変換したら、void型...
これだと、呼び出せないのは当たり前なのですが・・・
error C2197: 'int (__stdcall *)(void)' : 実引数が多すぎます。
私、正解に近づいてます・・・?

int (__stdcall *proc)(void) = GetProcAddress(dll, "FtpPutFile");

// FTP接続が開始されているとき
if(NULL != m_lpclFtpConnection)
{
// ファイルをアップロードする。
hFtp = m_lpclFtpConnection->operator HINTERNET();
T_FtpPutFileW *t_FtpPutFile = new T_FtpPutFileW;
t_FtpPutFile->hConnect = hFtp;
t_FtpPutFile->lpszLocalFile = (const WCHAR*)pszLocalFile;
t_FtpPutFile->lpszNewRemoteFile = (const WCHAR*)pszRemoteFile;
t_FtpPutFile->dwFlags = INTERNET_FLAG_TRANSFER_ASCII;
t_FtpPutFile->dwContext = 0;

ret = proc(t_FtpPutFile);
488デフォルトの名無しさん:2010/09/28(火) 21:14:32
ぜんぜん。
WinInet以前の問題すぎる。
489デフォルトの名無しさん:2010/09/28(火) 21:14:39
>>487
関数ポインタを勉強し直せ
490475:2010/09/28(火) 21:17:41
勉強してきます。
ありがとうございました。
491デフォルトの名無しさん:2010/09/28(火) 21:23:27
別のDLLから持ってきたHINTERNETを渡してるわ、
CHAR *を無理矢理WCHAR *にキャストしてるっぽいわ、
なんの説明もないm_lpclFtpConnectionだのT_FtpPutFileWだの持ち出してるわ、
おかしくない行見つける方が難しいだろ
492デフォルトの名無しさん:2010/09/28(火) 21:29:08
>>460
教えてください
493デフォルトの名無しさん:2010/09/28(火) 21:46:57
>>487
一歩進んで二歩下がる
494デフォルトの名無しさん:2010/09/28(火) 22:32:17
>>493
進んでいるところなんてあるのか?w
495デフォルトの名無しさん:2010/09/28(火) 23:54:59
呼び出し規約が正しくなった。
他は全部退化した気がするが。
496デフォルトの名無しさん:2010/09/29(水) 06:13:22
std::string は at() や[] でアクセスするとchar&を返すわけですが、
私は std::string& を返す方が良いのではないかと感じてしまいます。

これは、もし私がオリジナルのstring型を作るなら、
string型の値を加工した結果をstring型とすることで
文字処理中に別の型のchar型を意識する必要を無く(減ら)そうとする
設計にするだろうと考えたからです。

しかし、std::stringがそうなっていないのは、
上記の私の考え方が間違っているからだと思うのですが
問題点はどのようなものなのでしょうか?
497デフォルトの名無しさん:2010/09/29(水) 06:28:36
std::string&を返したとして、str[0] = 'a'はどう処理されるんだ?
498デフォルトの名無しさん:2010/09/29(水) 07:36:18
そもそも、リファレンスで返すということは、
わざわざオブジェクトを動的に確保しなければならないのか?
static変数や一時変数では無理だからな。
で、誰が解放するんだ?
499デフォルトの名無しさん:2010/09/29(水) 10:07:21
内部にインデックスを保持して
[]でそれを更新して自分をリターン
代入もオーバーロードして…
まあできてもやらんわこんな糞仕様
500デフォルトの名無しさん:2010/09/29(水) 10:27:46
string s = "hello";
s[2] = "world";
cout << s[2];
ってやると何が出るんだろうなそれ
501デフォルトの名無しさん:2010/09/29(水) 10:58:47
文字列をコピーする事に伴うオーバーヘッドが気になるなら、
CStringを見習え。
502デフォルトの名無しさん:2010/09/29(水) 12:20:53
QStringもおもしろ動作するよ
503デフォルトの名無しさん:2010/09/29(水) 13:05:24
OreStr s = "hello";

s[2] = "***"; // s == "he***lo"

s.range(2,5) = "[world]"; // s == "he[world]lo"

みたいな
504デフォルトの名無しさん:2010/09/29(水) 13:34:36
pythonのStringっぽいな
505デフォルトの名無しさん:2010/09/29(水) 14:53:20
>>491
もう重症患者だよな
506デフォルトの名無しさん:2010/09/29(水) 14:54:00
>>503
それ便利だな。
是非そのクラスをboostライセンスで公開してくれ。
507デフォルトの名無しさん:2010/09/29(水) 17:52:06
配列の先頭と要素数を引数に取るような関数はよく見るけど、

void Hoge(int* array, int num);
void Hoge(int array[], int num);

どっちが推奨なんでしょうか?
508デフォルトの名無しさん:2010/09/29(水) 17:54:54
演算子 new, delete のオーバーロードの仕方を教えてください。
509475:2010/09/29(水) 18:07:13
昨日、皆さんから頂いた情報のおかげで、
解決することができました。
ありがとうございました。
510デフォルトの名無しさん:2010/09/29(水) 18:10:08
>>508
特定クラスのnewとdeleteのオーバーライトはしっているが、
デフォルトのnewとdeleteのオーバーライトはどうすりゃいいんだ。

おしえてエライ人!!!
511デフォルトの名無しさん:2010/09/29(水) 18:14:19
#define new NEWでおk
512デフォルトの名無しさん:2010/09/29(水) 18:17:27
>>511
だまされないぞw
513デフォルトの名無しさん:2010/09/29(水) 18:22:25
void * operator new (std::size_t size, Arg arg)
{
・・・
};

これでいいよ
514デフォルトの名無しさん:2010/09/29(水) 18:55:14
>>507
どっちも意味は全く同じ
下のほうが「配列の先頭アドレスを渡す」という意図がはっきりする程度
515デフォルトの名無しさん:2010/09/29(水) 19:02:11
>>513
てことは自前のアロケーターを使いたい場合はこれを書いたヘッダでもインクルードしてやればいいってことか。
516デフォルトの名無しさん:2010/09/29(水) 19:39:40
>>503
のOreStrって本気で実装する気になったら
どうするのがいいんだろうね。

特にOreStrでoperator =(const char *)をどう定義するかと
operator[]をどう定義するか。

517デフォルトの名無しさん:2010/09/29(水) 19:40:28
@> OreStr s = "hello";
これは簡単そうだが実はBで後述する問題がある。

A> s[2] = "***"; // s == "he***lo"
これは難しい。
まず直感的に言ってs[2]で返って欲しいのはchar型の変数だ。
しかしそうするとchar型への代入演算子はもう新たに定義できない。
そこで自前のクラスを返すことを考えるしか策がないわけだが、
ただそうするだけだとvoid foo(char c);とかいう関数に渡せないことになり、
operator overloadingとしては大分 気持ち悪い。
回避策として
 s[2]で返すのをOreCharとかいうクラスにして、
 char型への暗黙の型変換を定義しておけば
 void foo(char c);とかいう関数に渡す分にはまるでchar型の
 変数が返っているのと同じように振る舞える。
ということで擬似的に解決可能だけど、
そうだとしても
 s[2] = "***";
これが元のsに反映される様なoperator=なんて定義できるんだろうか。

B> s.range(2,5) = "[world]"; // s == "he[world]lo"
これは更に難しい。
sがOreStr型ならs.range(2,5)だってOreStr型を返して欲しいが、
それだとOreStrのoperator=(const char*)をどう定義するんだよ!
@を満たしつつBをも満たすって相当苦しいよな…。

518デフォルトの名無しさん:2010/09/29(水) 19:44:46
std::array<int, 5> a;
std::array<int, 5> b;

// 離れた場所で
static_assert(a.size() == b.size());

のようなことをやりたいのですが、a, b は定数式ではないのでコンパイルできませんよね。
size()なんてテンプレート引数をそのまま返すだけなんだから定数扱いしてくれてもいいのに。
519デフォルトの名無しさん:2010/09/29(水) 19:45:12
>>517
>そうだとしても
> s[2] = "***";
>これが元のsに反映される様なoperator=なんて定義できるんだろうか。
OreCharがOreStrへの参照と位置を持っていればいいのでは?
520デフォルトの名無しさん:2010/09/29(水) 20:00:45
最近の学生はProxyパターンもしらんのか
521デフォルトの名無しさん:2010/09/29(水) 21:33:07
>>519
> OreCharがOreStrへの参照と位置を持っていればいいのでは?
確かに−。
そしてそのメンバを読んであげればいいのか。
ありがとう。

>>520
すみません
趣味グラマなもので。



そうなると、Aは行けるから、@とBを両立させる方法だけが残った問題か・・・。
522デフォルトの名無しさん:2010/09/29(水) 21:35:00
素直にinsertとreplace使えよと
523デフォルトの名無しさん:2010/09/29(水) 21:46:26
>>518
こんな感じで
ttp://codepad.org/74OOjF7m
524デフォルトの名無しさん:2010/09/29(水) 21:49:19
んなくだらねーことにマクロ使うなボケ
525デフォルトの名無しさん:2010/09/29(水) 22:03:21
stlのコンテナでイテレータが無効になっているかどうかを知る方法ってあるんでしょうか?
526デフォルトの名無しさん:2010/09/29(水) 22:04:25
>>518
N3126では
constexpr size_type size();
となってるのでコンパイルできると思う
527デフォルトの名無しさん:2010/09/29(水) 22:28:58
VC++6.0なんてもう無くなってしまえばいいのに
528デフォルトの名無しさん:2010/09/29(水) 22:38:44
アロケーターというのはSTLの要求を満たしたクラスのことだぞ。
529デフォルトの名無しさん:2010/09/29(水) 22:43:35
STLの要求を満たしたクラスってなんかもっと言いやすい名前付いてないの?
530デフォルトの名無しさん:2010/09/29(水) 22:52:53
あ、>>515に対してのレスね。
>アロケーターというのはSTLの要求を満たしたクラスのことだぞ。

>>529
「要求」ならば、英語ではrequirementとかconceptなどと言うんだが、
英語でも結局、これらの名詞に対して、「満たす」に該当する動詞を使うわけで、一言で言い表す言葉はないんじゃないか。

その「要求」に対して、アロケーターとかイテレーターとかコンテナーとか名前をつけておいて、
「ある型Tはアロケーターである」などとは言えるだろうけど。


531デフォルトの名無しさん:2010/09/29(水) 23:43:34
STL compatible とかでいいんじゃね
532デフォルトの名無しさん:2010/09/29(水) 23:44:34
STL風
533デフォルトの名無しさん:2010/09/29(水) 23:47:59
STL勢
534デフォルトの名無しさん:2010/09/29(水) 23:51:38
似非STL
535デフォルトの名無しさん:2010/09/29(水) 23:52:12
STL臭い
536デフォルトの名無しさん:2010/09/29(水) 23:53:25
なんでstlのネームスペースがstdなの?気持ち悪い
537デフォルトの名無しさん:2010/09/29(水) 23:54:41
スタンダードテンプレートライク=>STL
538デフォルトの名無しさん:2010/09/29(水) 23:55:19
STL like -> STL
539デフォルトの名無しさん:2010/09/29(水) 23:56:06
stdはSTL専用の名前空間ではないぞ
標準ライブラリ全部 (printfとかiostreamとか全部) の名前空間だ
540デフォルトの名無しさん:2010/09/29(水) 23:57:14
スタンダードテンプレートライクなんだからstdtにしてほしい
541デフォルトの名無しさん:2010/09/29(水) 23:57:44
wcscmpがstdの中に無い環境もあるんですけどwcscmpは標準ライブラリ扱いではないんですか?
542デフォルトの名無しさん:2010/09/30(木) 00:03:18
なかなか準拠度の低い処理系をお使いのようで。
543デフォルトの名無しさん:2010/09/30(木) 00:05:27
>>541
C++ならstd::wstring使おうぜ
544デフォルトの名無しさん:2010/09/30(木) 00:07:56
wchar関連は中途半端なんだよ。

charとその文字列をクラス化(typedef)したstd::stringならともかく、
ワイド文字を扱いたかったら各環境独自が用意している文字列クラスを
使った方が結局の所移植性が出て来るという
本末転倒な事態が多い。

545デフォルトの名無しさん:2010/09/30(木) 00:09:11
std::stl::vector
この方が綺麗だったような気もする。

だが、考えようによっては
std名前空間内は標準以外もう誰も入れないのだから、
名前の衝突などを恐れなくていいから
むしろ無駄にタイプ量を増やす結果になるな。
546デフォルトの名無しさん:2010/09/30(木) 00:15:06
stdとcstdぐらいは分けろって思った
547デフォルトの名無しさん:2010/09/30(木) 00:16:40
>>544
結局、wchar_tってのは、規格上で、
「wchar_tは、ひとつのオブジェクトで、その環境で表現可能な任意の一文字を表すことができる」
なんて非現実的な定義がされてるから問題なんだよ。
机上の空論というか、現実を見ていなかったというか。

そんな文字コードの規格、当時はおろか、現代ですら存在しないのに。
548デフォルトの名無しさん:2010/09/30(木) 00:24:47
namespace STL{
#include <vector>
using ::std::vector;}
549デフォルトの名無しさん:2010/09/30(木) 03:54:52
wchar_t は UNICODE が広まる前に規格制定されたので、許してあげてくださいね。
550デフォルトの名無しさん:2010/09/30(木) 07:37:49
>>508
やりたいのはどれ?
- 引数を追加した ::operator new のオーバーロードを定義する。
- 特定のクラスとその派生クラスで使われる operator new を定義する。
- デフォルトの ::operator new を再定義して置き換える。
551デフォルトの名無しさん:2010/09/30(木) 07:41:26
>>510
あぁ >>550 の最後の奴でいいのか。

グローバル名前空間に void* operator new (std::size_t) を定義すればいいよ。
必要なら対応する void operator delete (void*) throw() もね。
552デフォルトの名無しさん:2010/09/30(木) 12:55:58
サロゲートペアまでだったら、wchar_tを32bitにすればいいと
思ってたけど、結合文字とかあるからどうしても一文字が
可変長になってしまう。

C#みたいな新しい言語は、length()みたいな長さを返すメソッドは、
物理的な長さじゃなくて文字数を返すようにして、char型は
廃止して、length() == 1の文字列を一文字にすればよかったのに。
現状stringとstringinfoを組み合わせないと、文字列操作が正しく
処理できないとか、中途半端すぎる。
IOのときにはどうせencode, decodeをかますわけだし。
553デフォルトの名無しさん:2010/09/30(木) 13:16:14
>length()みたいな長さを返すメソッドは、
>物理的な長さじゃなくて文字数を返すようにして、

メモリアロケーション、どうする気?擬似コードだけど
memory_alloc( length( string_data) )
みたいにしたいでしょ?
554デフォルトの名無しさん:2010/09/30(木) 13:40:32
size()!=length()でsize()はバイト数で返すとか。
555デフォルトの名無しさん:2010/09/30(木) 14:15:19
.NET だと System.Globalization.StringInfo でエレメント単位の処理ができるな。
556デフォルトの名無しさん:2010/09/30(木) 14:20:20
length() なんて曖昧な名前イクナイ
byteLength(), charLength(), codePointLength(), graphemeClusterLength() にしようぜ
557デフォルトの名無しさん:2010/09/30(木) 14:25:09
長さは要素数でサイズはブロックサイズ。これって常識じゃなかったのか
558デフォルトの名無しさん:2010/09/30(木) 17:46:04
>>553
文字の操作がstring内で完結してれば物理的な長さを意識する
必要なないのでは。
クラスの内部ではもちろん、物理的な長さと両方もってる必要あるけど。

>>556
文字列クラスにはbyteLength()みたいのはいらないのが幸せだと思う。
IOのときはC#みたいにエンコード、デコードで
string←→バイト列 の変換をかますようにして。
559デフォルトの名無しさん:2010/09/30(木) 17:58:45
>>557
length: 要素数
size: バイト数(ブロックサイズ?)
常識的にこうなってるってこと?

少なくともC++の常識ではないな。STLとかsizeで要素数だし
別の言語ならそうなっていても不思議ではない
560デフォルトの名無しさん:2010/09/30(木) 19:04:15
C++標準は色々と常識知らずだからあてにならんw
561デフォルトの名無しさん:2010/09/30(木) 19:12:57
お前の頭の中の常識はもういいから
562デフォルトの名無しさん:2010/09/30(木) 19:33:54
『私の頭の常識』 Now Showing
563デフォルトの名無しさん:2010/09/30(木) 22:33:02
たぶん、strlen、wcslen、sizeofとかにおける語の用法から
脳内で勝手に常識が形成されたんだろうね。
564デフォルトの名無しさん:2010/10/01(金) 19:18:55
よく宣言と実装は分けろって話がありますが
クラスの関数が今後追加する可能性が高い場合
ファイルを分けて記述する(コンパイル時の)有用性は落ちるという考えであってますか
(可読性が落ちるというような話は無しで)
565デフォルトの名無しさん:2010/10/01(金) 19:25:17
分けたほうがビルド時間はお得だよ
566デフォルトの名無しさん:2010/10/01(金) 19:50:43
つまり、クラスに何を持たせるべきで何を持たせるべきでないかがはっきりしてないってことだろ
まだ有用性がどうのという段階ではない実験なら原則1ファイルがやりやすいと思う
567デフォルトの名無しさん:2010/10/01(金) 19:52:42
使いまわす予定のない関数なら、.cppの中に、宣言も実装も両方
書いても問題ないよ。
568デフォルトの名無しさん:2010/10/01(金) 22:47:08
ただ予定は無くても、ついつい使いまわす事になるからできるなら
初めから考えておいた方が良いと思うけどね
569デフォルトの名無しさん:2010/10/01(金) 23:12:45

俺が過去のコードを再利用する時は
継承とかテンプレートとかみたいな美しい方法じゃなくて
コピペが多いんだけど、みんなもそんな感じ??
570デフォルトの名無しさん:2010/10/01(金) 23:13:44
美しく書きなおしてから再利用しろよ
571デフォルトの名無しさん:2010/10/01(金) 23:14:37
コピペとか無いわー
572デフォルトの名無しさん:2010/10/01(金) 23:43:28
>>571
お前もやってるだろう。
573デフォルトの名無しさん:2010/10/01(金) 23:48:41
>>569
ライブラリに分類して、そのフォルダーを参照させて使うようにしてる。
574569:2010/10/02(土) 00:20:36
>>573
結構綺麗じゃん。

あれ?俺だけ??wwww
575デフォルトの名無しさん:2010/10/02(土) 02:37:13
コードの量や種類にも依るんじゃないか?
小さくて独立してない部分なら俺もコピペする時あるよ
ある程度まとまった単位になると(大きさだけじゃないけど)
まとまってなければ、まとめることを考える
576デフォルトの名無しさん:2010/10/02(土) 11:23:50
まず同じ機能が標準ライブラリで実現できるようになっていないか検討するところからだな。
577デフォルトの名無しさん:2010/10/02(土) 14:25:59
似たような記述があったらそれらをまとめてひとつにするよ。クラス化したりテンプレート使ったり
578デフォルトの名無しさん:2010/10/02(土) 14:28:19
何でもかんでもまとめりゃ良いってモンじゃない
そんなことしてると、何のためにあるのか不明瞭な関数やクラスが量産される
579デフォルトの名無しさん:2010/10/02(土) 14:55:49
それはまとめ方がヘタクソなんだろう
580デフォルトの名無しさん:2010/10/02(土) 16:49:03
自分が作ったライブラリを使用したことがない
581デフォルトの名無しさん:2010/10/02(土) 17:03:47
自分で作ったのは対象ごとに微妙に変わってしまうしな
依存してるもの全ソフトを更新とか無理だし、互換性なんて維持できないし
582デフォルトの名無しさん:2010/10/02(土) 18:06:04
配布されている良く寝られたライブラリの方が使い勝手もいいしな
でも、そういうライブラリが用意しなない特定用途向けの小物は自分でライブラリ化する。

俺ライブラリ化しておけば後に採用したライブラリへの移行時にも役に立つし
583デフォルトの名無しさん:2010/10/02(土) 18:12:50
そういう小物は小出しにできるほど独立してないと使いにくいので
結局ライブラリにはしないでソースファイル単位で取り込んじゃう。
584デフォルトの名無しさん:2010/10/02(土) 18:15:02
スターティックライブラリーじゃなくても
ダイナミックライブラリーじゃなくても
ソースファイルで取り込むのもライブラリーというよ。
585デフォルトの名無しさん:2010/10/02(土) 18:18:11
うーん、そういう言い方はしてこなかったしコピペとの対比だったからなぁ。
586デフォルトの名無しさん:2010/10/02(土) 18:31:48
ライブラリファイルにするとウィンドウズでしか使えないじゃん
587デフォルトの名無しさん:2010/10/02(土) 18:33:10
ライブラリは移植性考えると普通はヘッダオンリーになるよね
588デフォルトの名無しさん:2010/10/02(土) 18:41:43
移植性なんてそんなに気にする事かいな?
589デフォルトの名無しさん:2010/10/02(土) 18:45:18
どうせ糞なものは移植する需要もないし
590デフォルトの名無しさん:2010/10/02(土) 19:04:32
インラインにするかどうかって移植性は関係なくね?
591デフォルトの名無しさん:2010/10/02(土) 19:08:34
別のプロジェクトにファイルを持って行くことを「移植」と称してると予想してみる
592デフォルトの名無しさん:2010/10/02(土) 20:46:10
新しい移植の定義がここに生まれました。

593デフォルトの名無しさん:2010/10/04(月) 01:02:07
趣味プログラマでバージョン管理システム入れてる人居ますか?
594デフォルトの名無しさん:2010/10/04(月) 01:03:32
質問の意図をちゃんと書け。小出しにするな。
595デフォルトの名無しさん:2010/10/04(月) 01:06:20
プログラマなら短く書くべきだ
596デフォルトの名無しさん:2010/10/04(月) 01:11:05
>>593
いる
597デフォルトの名無しさん:2010/10/04(月) 01:31:17
TortoiseSVNでネットワーク接続してるHDD上にリポジトリ作って定期的にコミットしてる
複数の人間からアクセスするにはちょっと怖い使い方だけど、どうせ自宅でアクセスするのは俺だけだし手軽だし
598デフォルトの名無しさん:2010/10/04(月) 01:39:13
リポジトリの履歴が汚れるとやだなとか考えてしまうような人にはsvnは向かない
599デフォルトの名無しさん:2010/10/04(月) 01:40:22
>>593
入れてるよ
ある程度コード書くなら必要だよ
ファイル単位の rcs 位でもいいから
600デフォルトの名無しさん:2010/10/04(月) 01:43:05
>>598
ブランチで細かくコミットして、区切りでマージ、ブランチ削除で問題ない。

個人でもバージョン管理入れとくと便利だし、コミットなんて負担にならないし
601デフォルトの名無しさん:2010/10/04(月) 02:01:51
>>600
それリポジトリのルートでsvn logすると思いっきり全部見えるよね。
そういうの一切残したくなかったりすと延々とコミットしなくなって無意味状態に。

後からでもコミットを改竄し放題のgitの方が向いてるんだろうけどWindowsだといろいろとアレだし。
602デフォルトの名無しさん:2010/10/04(月) 02:09:18
それはお前がアレな人間だからじゃ
603デフォルトの名無しさん:2010/10/04(月) 02:15:03
「Javaよりはまし」
604デフォルトの名無しさん:2010/10/04(月) 02:25:48
2chで一々句点を打ってるあたりに病的な神経質さを感じる
605デフォルトの名無しさん:2010/10/04(月) 02:27:03
便利そうだな、俺も入れてみよう
606デフォルトの名無しさん:2010/10/04(月) 02:30:29
コミットちゃんとしないとすげー怒られる会社思い出す
607デフォルトの名無しさん:2010/10/04(月) 06:59:54
SVNは便利。
608デフォルトの名無しさん:2010/10/04(月) 07:15:15
ビルド通らないコードをコミットして放置する人いるよね
609デフォルトの名無しさん:2010/10/04(月) 10:43:54
そういうときの為のバージョン管理だろうが
610デフォルトの名無しさん:2010/10/04(月) 10:49:54
ここちょっと弄りたいけど今の状態も残しときたいな的なことにはRCSを併用している
611デフォルトの名無しさん:2010/10/04(月) 10:50:41
そりゃバージョン管理してもコード書けない人が
書けるようになるわけじゃないからね
612デフォルトの名無しさん:2010/10/04(月) 15:20:39
なんでstructとclassが今あるような実質まったく違わないものじゃなくて
PODかそうでないかにしなかったんですか?
613デフォルトの名無しさん:2010/10/04(月) 16:18:45
「javaの方がマシ」
614デフォルトの名無しさん:2010/10/04(月) 16:25:48
>>612
D&E 76ページ。

禿は複数のコンセプトを作りたくなかったとのこと。
曰く、(実際はだいぶ違うから原書読め)
もし、structが「Cとの互換性のため」であり、classが「C++の新機能」であったならば、
プログラマは二分して宗教戦争を始めてただろう
ひとつのコンセプトであれば、伝統的なCスタイルのプログラミングから、
C++スタイルのプログラミングに、容易に移行できる。

615デフォルトの名無しさん:2010/10/04(月) 16:34:13
0xff000000みたいな数値を256回メモリーに書き込む命令はない?
616デフォルトの名無しさん:2010/10/04(月) 16:36:26
つーかclassキーワードなんていらなかったよね
617デフォルトの名無しさん:2010/10/04(月) 16:44:49
>>615
memsetのことだろうか
618デフォルトの名無しさん:2010/10/04(月) 16:52:42
自分でも何言ってんだかわかんねぇんだろう。
既存のCのコードはstructを使っている筈で、これはPOD。
新しいコードで非PODならclassを使うのなら対立しようがないが。
619デフォルトの名無しさん:2010/10/04(月) 17:00:14
格納じゃなくて書き込むだからねぇ
writebackを殺すところから始めないとな
620デフォルトの名無しさん:2010/10/04(月) 17:09:03
>>615
むり
621デフォルトの名無しさん:2010/10/04(月) 17:24:57
>>615
Linux限定でiowrite32_repとか。
622デフォルトの名無しさん:2010/10/04(月) 17:33:22
無いなら自分で作ればいいじゃない
623デフォルトの名無しさん:2010/10/04(月) 22:13:10
>>615
vectorのassign
624デフォルトの名無しさん:2010/10/04(月) 22:49:34
structとclassのもともとの意味は知らんけど、使い分けはできてるよな。
ただのデータの塊はstruct、抽象を提供するのがclass
625デフォルトの名無しさん:2010/10/04(月) 22:57:33
データーセット以外でもstruct使いまくるし。TMPで特に
最初はデーターか否かで分けてたけど、今はもうどうでも良くなって
最初の継承かメンバがpublicかprivateかどうかしか見てないわ
626デフォルトの名無しさん:2010/10/04(月) 23:03:46
なんだその糞設計
627デフォルトの名無しさん:2010/10/04(月) 23:20:36
設計関係ないしwww
628デフォルトの名無しさん:2010/10/04(月) 23:25:08
確かに設計以前の問題だ
629デフォルトの名無しさん:2010/10/04(月) 23:27:24
C互換性以外でstructかclassかで迷う人って何も見えてない間抜けだよね
630デフォルトの名無しさん:2010/10/04(月) 23:29:51
タイピング量で言ったらclassがラクダよ。
631デフォルトの名無しさん:2010/10/04(月) 23:31:58
統計的にみて継承はpublicであることが多い
だからstructのほうが平均タイプ量で得する
632デフォルトの名無しさん:2010/10/04(月) 23:33:52
assが打ちにくい
633デフォルトの名無しさん:2010/10/04(月) 23:38:16
バカじゃねーの
634デフォルトの名無しさん:2010/10/04(月) 23:39:37
賢かったらPGなんてやってませんよ
635デフォルトの名無しさん:2010/10/04(月) 23:42:45


#define class struct
#define private public
#define protected public

の3文を入れるのがタイプ量軽減に最強だな。
636デフォルトの名無しさん:2010/10/04(月) 23:44:32
>>630
でも template は <typename T> じゃなきゃ嫌だ。
637デフォルトの名無しさん:2010/10/04(月) 23:46:29
template <struct T>はなぜだめなのか
638デフォルトの名無しさん:2010/10/05(火) 00:09:28
というか、どうして全く同じ意味のキーワードが2つあるのだろう?
639デフォルトの名無しさん:2010/10/05(火) 00:13:08
とりあえず禿のせいにしておけばいい
640デフォルトの名無しさん:2010/10/05(火) 00:19:37
>>634
こういうギリギリPGが寄ってたかって味方してくれる訳か。
641368:2010/10/05(火) 00:22:37
書き込んでから「本当にそうだっけ?」と思って仕様を確認してみたら、
> There is no semantic difference between class and typename in a template-parameter.
わざわざ「意味の違いはないよ」と書いてある。
なんで2つ必要なんだ? どこぞのコンパイラが作った既成事実を追認でもしたのか?
642デフォルトの名無しさん:2010/10/05(火) 00:30:51
正しいかはわからないけど、リファレンスの内部表現はポインタのそれと
違うかもしれないって聞いたけど大丈夫?
643デフォルトの名無しさん:2010/10/05(火) 00:33:00
>>641
テンプレート引数に出てくるtypenameとclassは同じ意味だけど、
受け取った型から内部の型を取り出すときのキーワードとしては違いがあるみたい。

struct A{typedef int I;};
struct B{typedef B I;};

template<typename T>
struct C
{
typedef typename T::I J;
// typedef class T::I J; // NG for A, OK for B
};
644デフォルトの名無しさん:2010/10/05(火) 00:42:59
>>642
違うかもしれないというより、同じかもしれないという仮定自体が間違い。
645デフォルトの名無しさん:2010/10/05(火) 01:20:35
>>643
そこは typename じゃなきゃコンパイルできないじゃん。
646デフォルトの名無しさん:2010/10/05(火) 07:16:16
>>645
TがBならclassでもコンパイルは通る。
647デフォルトの名無しさん:2010/10/05(火) 09:37:00
>>646
なるほど。でもそこであえてclassにする意義ってなんだろう?
C#みたいに型引数に大きな制約をかけられるってんならわかるが、
組み込み型のみ拒否できる意義とは?
648デフォルトの名無しさん:2010/10/05(火) 13:00:53
なんでC++は型にはこだわるのに修飾子は大雑把なんだぜ?
649デフォルトの名無しさん:2010/10/05(火) 13:32:17
650デフォルトの名無しさん:2010/10/05(火) 13:49:59
型はCPUの中で決まってるから
651デフォルトの名無しさん:2010/10/05(火) 15:25:12
やっとポインタ理解した
652デフォルトの名無しさん:2010/10/05(火) 15:42:21
やっとポインタ理解した(つもり)
653デフォルトの名無しさん:2010/10/05(火) 15:55:03
理解したと思った瞬間、理解していないことが分かる。
654デフォルトの名無しさん:2010/10/05(火) 16:18:10
class A {
private:
    int size;

public:
    int size() { return size; }
};

Javaだと通るんだけど…
"再定義; 以前の定義は 'データ メンバー' でした。"というエラーが出るんだけどC++の仕様?

回避するには、ユニークな名前にしないと、ダメ?
655デフォルトの名無しさん:2010/10/05(火) 16:34:19
ダメ
656デフォルトの名無しさん:2010/10/05(火) 16:37:22
>>654
> Javaだと通るんだけど…
C++は異世界です。
名前の勉強をしてください。
657デフォルトの名無しさん:2010/10/05(火) 16:41:00
Javaには(メンバ)関数ポインタがないから、メソッド名が単独で現れることがないので。
658デフォルトの名無しさん:2010/10/05(火) 16:49:07
ありがとうございます。

class A {
private:
    int size;
public:
    void setSize(int size) { this->size = size; }
    int getSize() { return size; }
};

みたいにしなければならないんですね。

とりあえず、元のソース書いた人間を恨みます。
659デフォルトの名無しさん:2010/10/05(火) 16:55:56
かえってJava臭くなったのはなんでなんだぜ。
660デフォルトの名無しさん:2010/10/05(火) 17:01:57
get set
という解決策を作るとはびっくりだ。
661デフォルトの名無しさん:2010/10/05(火) 17:04:09
アクセさが必要=設計に問題がある
とか言い出す輩が登場
662デフォルトの名無しさん:2010/10/05(火) 17:05:24
本物のプログラマはクラスメンバを隠蔽しない。
663デフォルトの名無しさん:2010/10/05(火) 17:05:44
ならばJavaや.NETのライブラリ群は全滅だな。
そういえばアクセッサうんぬん厨はいたね。
664デフォルトの名無しさん:2010/10/05(火) 17:09:38
>>658
とりあえず、
int getSize() const {return size;}
の方がいい
665デフォルトの名無しさん:2010/10/05(火) 17:14:40
>>664
constつけると、呼んだときに副作用がないことを保障するんだっけか?
666デフォルトの名無しさん:2010/10/05(火) 17:16:26
うん、setアクセサは引数にconstをつけて、
ついでにメンバ変数名とは違う名前にしといた方が安全。

void setSize(const int value) { size = value; }

さあ皆さん、宗教論争の始まりです。
667デフォルトの名無しさん:2010/10/05(火) 17:22:54
本格的にJava => C++に移植するの初めてなんですよ。
遮蔽や継承するので、アクセサメソッド経由にしたいんです。

C++のリファレンスのような書き方知らないんで…
Java臭くなってしまって、ごめんなさい。
668デフォルトの名無しさん:2010/10/05(火) 17:23:09
sizeをsetできるっていう発想が不気味
少なくとも素直にsizeに代入しただけで終わるはずはないと思う
669デフォルトの名無しさん:2010/10/05(火) 17:26:00
const修飾子ですね。気を付けます。

>>666さん
一応、intel C/C++ コンパイラ / MSVC / GCCで確認したのですが、
そのへんの変数のスコープは、大丈夫みたいでしたよ。
670デフォルトの名無しさん:2010/10/05(火) 17:35:08
>>669
まあそうなんだけど、アクセサを拡張するときに間違いのもとになる。
おそらく、何かのサイズを変更する関数が単なるメンバ変数の書き換えで
済みはしないだろ。機能を追加することになるはずだ。
そのときのための保険をコストなしでかけられるんだから、かけといて
損はないだろ?
671デフォルトの名無しさん:2010/10/05(火) 17:53:22
const参照戻しって出来ますか。
出来る場合、

const int& test();

って感じでいいんですか?
急いでいます。お願いします。
672デフォルトの名無しさん:2010/10/05(火) 17:54:59
>>671
今調べるから2時間ほど待ってて
673デフォルトの名無しさん:2010/10/05(火) 17:56:24
内部のハンドルを渡す参照はconstで戻さないといけないのは基本だろwwwwwww
674デフォルトの名無しさん:2010/10/05(火) 18:05:41
>>671
良いけど、
メリットデメリットくらいちゃんと勉強しろ。

特に無効な参照になってないよな?
まさかと思うけどメンバ関数じゃなくて普通の関数でローカル変数への
参照を返しているとかいうバカじゃないよな?
675671:2010/10/05(火) 18:10:33
いえいえ、かなりのレベルまで達しています。

STLのmapのfindでデータを見つけて、そのイテレータを使って値を返そうと
したときにconst参照で返したいなと思っただけです。

mapにデータはあるので、ローカル変数扱いじゃないでしょうから、
消滅してる可能性はないと思ったのでね。

偉そうなこと言って間違ってたらすみません。
676671:2010/10/05(火) 18:12:09
あ、ありがとうございました。
677デフォルトの名無しさん:2010/10/05(火) 18:16:13
>>675
> STLのmapのfindでデータを見つけて、そのイテレータを使って値を返そうと
> したときにconst参照で返したいなと思っただけです。
なんでそう思ったのかよく分からん。
まさかイテレータをコピー渡ししたくないなんてバカじゃないよな?

678デフォルトの名無しさん:2010/10/05(火) 18:22:03
イテレータを戻すくらいなら値の参照戻しの方が100倍マシ。
679デフォルトの名無しさん:2010/10/05(火) 18:24:10
>>678
それはさすがに勉強不足すぎだろう

いや別にお前の会社が傾くだけだから好きにしてくれていいんだけど。
680671:2010/10/05(火) 18:25:20
>>677
いや、テンプレートを使ったmapのクラスを作ってるんです。
このクラスは色んなクラスで使って、こいつはそのクラスのメンバとして持たせるつもりです。
その際に、mapに登録したデータを取り出したかったんです。
イテレータがpだとしたら
*pを返り値にしてあげて、そのデータを受け取った側も一応データを変更できないように
constをつけておこうと思った次第であります。
681デフォルトの名無しさん:2010/10/05(火) 18:25:50
わざわざイテレータを戻すメリットや如何。
682671:2010/10/05(火) 18:26:57
イテレータを戻すという表現はおかしいですね、イテレータが指し示すデータを戻したいと思いました。

すみません。
683681:2010/10/05(火) 18:28:39
>>682 ああすまん。俺は >>679 に訊いたんだ。あんたの意図はよく分かる。
684デフォルトの名無しさん:2010/10/05(火) 18:32:46
急いでるんだかなんだかしらんけど自分でちょっと試しにコードかけば分かる問題だろ……
685デフォルトの名無しさん:2010/10/05(火) 18:34:00
これだけの議論で十分 良いコードが書けたと思うのは
俺だけじゃあるまい
686671:2010/10/05(火) 18:34:12
>>684
そうでしたね。めんどくさいので良くやってしまいます。すみませんでした。
ありがとうございました。また来ます。
687671:2010/10/05(火) 18:35:32
>>685
おめでとうございます。頑張って下さい。
688デフォルトの名無しさん:2010/10/05(火) 18:35:46
         i                  i l l
.          !               i | |
            !                 r¬| h
            i                `TY´ !
           i                   {  丿
          i              j /|
             !      _ _ _       / l!」
           !  /.::.::.::.::.::.`ヽ、 ハ ノ
          i /.::.::.::.::.::.::.::.::.::i:.:〉/   〉
              i i.::.;:.::.::.::.::.::.:::i::.:ト'/  /
            !|:.::i.::.::.::.::.::.::lリ:::j/   /   釣れたー!!
           !l::::l:::.:::.:::.:::;:;ルイ  /
           |'V:トNlVル'´ノ 丶 /
           L乂^〈、__/   〈
            {いゝ、       ' ヽ
            ト「`ヽハ.   ヽ   ! 丿
           ト! : : Vヘ    广´
             ,ハl : : 人∧、  /
.         / ハ/   (尢)、{
        入_,ル' -─−:八ヽl、
    r─‐'´ / {.: : : : : : : : ;ハ、 〉
     ´ ̄`ゾ  ヽ、: : : : :/  l`|
          ! ` ーイ    ヽl
              `、  │    |
                ヽ_」、__」
             ヽ::::l:::::::::::::|
689671:2010/10/05(火) 18:36:48
それでは、ありがとうございました。
690デフォルトの名無しさん:2010/10/05(火) 18:57:24
何もしなくても map<...>::value_type::first_type は const の筈だけど
691デフォルトの名無しさん:2010/10/05(火) 18:59:32
const_iteratorが起き上がりこっちを見ている
692デフォルトの名無しさん:2010/10/05(火) 19:25:50
http://codepad.org/0R0vN5sg
      ☆ チン     マチクタビレタ〜
                        マチクタビレタ〜
       ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        ヽ ___\(\・∀・) < 値が必要なのにイテレータを戻すメリットまだ〜?
            \_/⊂ ⊂_ )   \_____________
          / ̄ ̄ ̄ ̄ ̄ ̄ /|
       | ̄ ̄ ̄ ̄ ̄ ̄ ̄|  |
       |  愛媛みかん |/
693671:2010/10/05(火) 19:43:26
>>690-691
const_iteratorの存在をすっかり忘れてました。すみません。

でもconst_iteratorにした場合って、返り値の部分はどうかけばいいんですか?
pがconst_iteratorだとして
int& test()
{
return *p;
}
と値を返した場合、この関数を使用して値を受け取った側はこの値を書きかえれない
ようになっているのでしょうか?
constなしでも書きかえれないようになっているということですかね?
694デフォルトの名無しさん:2010/10/05(火) 19:51:37
>>692 のリンク先にconst_iterator を返すコードがあるけど、冗長なだけだよ。
695671:2010/10/05(火) 19:58:57
>>694
すいません。これウイルスだと思ってました。

私がやりたいのはイテレータを返すのではなく、値が変更できないように
const状態で値を返したいんです。
添字でのアクセスじゃなくて、イテレータで(*p)とかで値を返す場合は、
そのイテレータはconst_iteratorだろうが、iteratorだろうが、
かならず戻り値の表記としては、
const int& test()のようにconstは必要なんですか?
それとも、const_iteratorの場合は戻り値にconstという表記はいらないのですか?
696デフォルトの名無しさん:2010/10/05(火) 20:07:27
>>695
値を返し、かつmapを書き換えられないようにしたいなら、普通に値戻しすればいい。
int test()
{
p->second;
}
という具合。さらに戻した値の変更まで禁止したければconstを付けてもいい。
いずれにしても、関数が戻すのは値のコピーだから、mapは書き換えられない。
697671:2010/10/05(火) 20:11:37
>>696
ありがとうございます。
すいません。マップなのでp->secondですね。ボケてました。

実は値戻しすると結構大きい構造体を返すときにオーバーヘッドが発生するので
参照を使いたいなーと思ってたんです。
なので参照をつかった場合はどうなるのかと思って質問しています。

よろしくお願いします。
698デフォルトの名無しさん:2010/10/05(火) 20:13:38
const参照でいいよ
699671:2010/10/05(火) 20:16:18
>>698
const参照でいいですかね。
ありがとうございます。
700デフォルトの名無しさん:2010/10/05(火) 20:43:32
MFCで GetFocus() の返り値のCWnd *をdynamic_castして、どの種類のコントロールに
フォーカスが行っているかを調べたいと思っています。
エディットボックスを選んでいるかどうかなら

CEdit *e = dynamic_cast<CEdit *>(GetFocus());

って感じで、後はeがNULLかどうか調べれば・・・と考えていたんですが、
どうやら常にキャストが失敗しているようなんです(フォーカスがエディットボックスにあっても失敗します)。
原因は何故でしょうか?こういう形でオブジェクトの型を判別するのは不可能なんでしょうか?
701デフォルトの名無しさん:2010/10/05(火) 20:48:27
>>700
MFC相談室に行った方がいいと思う。
702デフォルトの名無しさん:2010/10/05(火) 20:58:34
MFCのCWnd*からCEdit*のキャストならDYNAMIC_DOWNCASTの方が確実じゃないかな。
703デフォルトの名無しさん:2010/10/05(火) 21:26:44
>>692
バカなの?
704デフォルトの名無しさん:2010/10/05(火) 21:29:12
ちょっと煽られただけで顔真っ赤とかw
705デフォルトの名無しさん:2010/10/05(火) 21:29:54
俺なんか煽られてもいないのに顔真っ赤だよ
706デフォルトの名無しさん:2010/10/05(火) 21:33:29
熱出たかな。
707デフォルトの名無しさん:2010/10/05(火) 21:34:17
>>705
おいそれウイルスだぞ。
708デフォルトの名無しさん:2010/10/05(火) 21:38:50
>>702
そんなマクロがあったとは知りませんでした、ありがとう!無事に判別できました。

ここにdynamic_castではダメな理由が書いてありますね。
http://www.codeguru.com/forum/archive/index.php/t-198308.html
709デフォルトの名無しさん:2010/10/05(火) 22:09:39
>>700
その手のMFC実装のお陰でC++を間違って理解しかけた初心者の頃の俺を思い出す
710デフォルトの名無しさん:2010/10/05(火) 22:15:56
MFCはダウンキャストが保証されてる不思議環境だからなぁ
CEdit *e = (CEdit*)GetFocus();
だけで普通に動いちゃうと思うぞ
711デフォルトの名無しさん:2010/10/05(火) 22:29:10
多重継承不許可なんだからダウンキャストがホイホイ出来るのはそれほど不思議な話じゃないと思うんだが
712デフォルトの名無しさん:2010/10/05(火) 22:43:25
でも親クラスが持ってないメソッドを呼び出したらどうなるん?
713デフォルトの名無しさん:2010/10/05(火) 22:44:23
デーン
714デフォルトの名無しさん:2010/10/05(火) 22:54:37
715デフォルトの名無しさん:2010/10/05(火) 22:55:00
型を自分で管理するとか謎の現象が起こっている。
716デフォルトの名無しさん:2010/10/05(火) 22:58:29
>>710
MFC以外は保障されてないの?
型が分かってればそういうダウンキャストも平気かと思ってたけど。
717デフォルトの名無しさん:2010/10/05(火) 22:59:01
>>700
VC6?
718デフォルトの名無しさん:2010/10/05(火) 23:07:05
>>714
未来へ行くなら、IS03を待て。
719デフォルトの名無しさん:2010/10/05(火) 23:12:00
ほっとけ、ただのマルチだ
720702:2010/10/05(火) 23:12:30
あれー?やっぱ出来ないのかなこれ?さっきのは勘違いだったかも知れないっす。

CWnd* pWnd = GetDlgItem(IDC_EDIT1);
BOOL bIsEdit = pWnd->IsKindOf(RUNTIME_CLASS(CEdit));

この場合もbIsEditは0になるみたいですね。あくまでGetDlgItem()が返すのは
CWnd型のポインタであって、CEditじゃないから、ダウンキャストは常に失敗すると
いうことであってますかね?

>>717
2008です。
721700:2010/10/05(火) 23:14:00
>>720
やっべ間違えた、↑の名前欄の702は700の間違いです
722デフォルトの名無しさん:2010/10/05(火) 23:16:52
マルチうぜーぞ
723デフォルトの名無しさん:2010/10/05(火) 23:34:02
>>720
IDC_EDIT1に対応するCEdit型のコントロール変数を追加してみろ。
GetDlgItemの戻り値が変わる。

何を言ってるのか わからねーと思うが(ry
724デフォルトの名無しさん:2010/10/06(水) 00:19:05
>>720
http://msdn.microsoft.com/ja-jp/library/t91eb9y9%28v=VS.80%29.aspx
このサンプルを見る限りそうじゃないよね
>>723の言う通りにすれば出来ると思う
725デフォルトの名無しさん:2010/10/06(水) 07:11:17
WNDCLASSでEDITやボタン作るしくみ知っていれば不思議な挙動ではない
726700:2010/10/06(水) 10:36:53
>>723
やってみました。頭がどうにかなりそうだった・・・
DDXってどういう仕組みになってんですかね。
さっきDYNAMIC_DOWNCASTで成功したと思ったのはこのことだったようですね。
その後DDX_Control()を置き換えてDDX_Text()にしたので失敗したようです。


>>724
>>720のソースはここから持ってきました。試してはいませんが
http://www.microsoft.com/msj/1297/c1297.aspx
727デフォルトの名無しさん:2010/10/06(水) 11:59:14
クラス内で関数や変数にstaticをつける意味を教えて下さい。
728デフォルトの名無しさん:2010/10/06(水) 12:11:33
クラスオブジェクトと深い繋がりが有るケド
インスタンスオブジェクト情報は不要な関数や変数に適用します。
729デフォルトの名無しさん:2010/10/06(水) 12:13:41
意味がよくわかりません。もう少し具体的にお願いします。
730デフォルトの名無しさん:2010/10/06(水) 12:15:40
インスタンス化しないで使えるってことが大きいのでは
731デフォルトの名無しさん:2010/10/06(水) 12:17:34
グローバルな変数にstaticをつけて、局所的に使用するのとはまったく意味が違うってことでしょうか?
732デフォルトの名無しさん:2010/10/06(水) 12:21:47
>>730
インスタンス化しないで使えるっていうのはこういうことでしょうか?

class TEST{
public:
static void tesutodayo()
{
cout<<"あほ!";
}

というクラスがあったとして、このヘッダをインクルードしたファイルがあったら、
TEST Test;
Test.tesutodayo();

ってしなくても
TEST::tesutodayo();
って感じで呼ぶことができるってことでしょうか?
733デフォルトの名無しさん:2010/10/06(水) 12:23:57
>>732
俺はあほじゃねーよばか!
734デフォルトの名無しさん:2010/10/06(水) 12:24:12
文法的な意味を聞いてたのか
それなら>>731で合ってる
スコープがクラス内になってるだけで
735デフォルトの名無しさん:2010/10/06(水) 12:26:03
いや>>731であってるじゃなくて
static 変数みたいなもんって解釈であってる
736デフォルトの名無しさん:2010/10/06(水) 12:30:18
なんだかよく分からなくなってきたんですが、
ローカル変数にstaticつけて、静的変数にするのと同じって意味ですか?

それともグローバルな変数にstaticつけて、局所的に使用するのと同じってことですか?

あと、インスタンス化しないで使えるっていうのは>>732みたいなことで
いいのでしょうか?
737デフォルトの名無しさん:2010/10/06(水) 12:32:44
>>710
その変換はできるけど、それは保障されていないだろう。
ボタンにフォーカスがあるときにそれを実行したらどうなる?
738デフォルトの名無しさん:2010/10/06(水) 12:48:43

HWND e = GetFocus();

739デフォルトの名無しさん:2010/10/06(水) 12:50:32
>>736
どっちでもいいよ
740デフォルトの名無しさん:2010/10/06(水) 12:58:27
>>739
答えになってません。
741デフォルトの名無しさん:2010/10/06(水) 13:05:45
たとえば定数とかグローバルに放っておくのと
742デフォルトの名無しさん:2010/10/06(水) 17:25:46
std::function<void()>とかいうコードみたことあるんですが、
このfunctionの使い方について、詳しく説明してるサイトがあったら教えて下さい。
743デフォルトの名無しさん:2010/10/06(水) 17:41:00
>>742
http://boost.org/libs/function/
名前空間は違うが使い方は同じだ
std::functionは0x環境で使える
744デフォルトの名無しさん:2010/10/06(水) 17:45:39
>>743
う、英語ですか。日本語のページがあると嬉しいんですが。
ちなみに0x環境って何ですか?
簡単な説明と使い方を教えてくれてもいいです。
745デフォルトの名無しさん:2010/10/06(水) 18:13:17
vectorなどのコンテナを制御するクラスをテンプレートを用いて作成した場合で、
その型をユーザ定義型(構造体)などを型にした場合、その型特有の処理をさせることってできますか?
たとえば、
template <typename A> class TEST{
typename vector<A> test;
};
こういうクラスがあったとして、
このテンプレート引数をある構造体にしたいんです。
このクラスで下のような関数を作って、値を返したいんです。
でもテンプレートクラスを実体化するまで型が決まってないので、
こんな書き方してもコンパイルエラーがでます。
何かいい方法はないでしょうか。
int TEST::call()
{
return test[0].data
}

746デフォルトの名無しさん:2010/10/06(水) 18:39:28
>>745
分割するとだめみたいだな
クラスの定義部分にメンバ関数本体を書けば通る

template <typename A>
class TEST {
typename std::vector<A> test;
public:
TEST(A a) { test.push_back(a); }
A call() {
return test[0];
}
};

int main()
{
TEST<double> td(1.0);

std::cout << td.call() << std::endl;
}
747デフォルトの名無しさん:2010/10/06(水) 19:00:01
>>745
質問の趣旨であろう「その型特有の処理」の意味がわからん
テンプレートの特殊化のことか?

それとコンパイルエラーは関係ない
× int TEST::call()
○ template<typename A> int TEST<A>::call()
748デフォルトの名無しさん:2010/10/06(水) 19:20:23
部分特殊化しようとしたけどうまく行かんねえ・・・

template <class A, class B>
class TEST {
std::vector<A> test;
public:
TEST(A a) { test.push_back(a); }
B call();
};

template <class A, int>
int TEST<A, int>::call() // エラー
{
return test[0].d;
}
749デフォルトの名無しさん:2010/10/06(水) 19:27:14
こうしちゃうと重複定義になっちゃうしなあ

struct SS {
double d;
int i;
};

template <class A, class B>
class TEST {
std::vector<A> test;
public:
TEST(A a) { test.push_back(a); }
B call();
};

template <class A, class B>
B TEST<A, B>::call()
{
return test[0].d;
}

template <class A, class B>
B TEST<A, B>::call() // エラー
{
return test[0].i;
}
750デフォルトの名無しさん:2010/10/06(水) 19:40:44
>>747
わかりにくくてすいません。
言い方が悪かったです。その型のメンバを呼び出すが正しいです。

例えば
strucct ABC{
int width;
int height;
};
っていう構造体があるとして、こいつをさっきのクラステンプレートに渡します。
まあ、ここまではうまくいくんですけど、

>>749の方がやっていただいてる通り、インスタンス化するまでは、
まだ型が決まってないので、このテンプレートクラスの関数には
下記のようにそのメンバのwidthとかが書けないんです。
まだ型が確定してないからだと思います。

template <class A, class B>
B TEST<A, B>::call() // エラー
{
return test[0].width;
}

int型とかだと、そのまま書けば値は一つしかないのでできますが、
構造体になると、構造体の型によってそのメンバって変わってきますよね?
これをクリアする方法をお伺いしたかったのです。
無理でしょうか?
751デフォルトの名無しさん:2010/10/06(水) 19:53:57
struct A
{
int x;
};

template <class T> struct X
{
A a;
int func(void) const { return a.x; }
};

普通に呼べるよ
752デフォルトの名無しさん:2010/10/06(水) 20:00:17
struct A { int x; };
struct B { int y; };

int & Get(A & a) { return a.x; }
int & Get(B & b) { return b.y; }

template <class T> class C
{
T obj;
public:
int func(void) { return Get(obj); }
};
753デフォルトの名無しさん:2010/10/06(水) 20:19:04
>>744
boost::functionでぐぐれば日本語も見つかるからそれで頑張れ、ものすごいおおざっぱに言うと関数ポインタみたいなもんだ
0xはc++0xでぐぐればいい、これもすごいおおざっぱにいうとvs2010で使える機能みたいなもんだ
754デフォルトの名無しさん:2010/10/06(水) 20:35:04
>>750
こんな感じ?
template <typename A> class TEST {
std::vector<A> test;
int call();
};
struct HOGE { int data; };
struct ABC { int width; int height; };
template <> int TEST<int>::call() { return test[0]; };
template <> int TEST<double>::call() { return (int) test[0]; };
template <> int TEST<HOGE>::call() { return test[0].data; };
template <> int TEST<ABC>::call() { return test[0].width; };
755750:2010/10/06(水) 20:38:41
できました。皆さんありがとうございました。

絶対無駄にはしません。

本当にありがとうございました!
756デフォルトの名無しさん:2010/10/06(水) 20:50:27
>>754
やっぱりその手しかないよね
明示的特殊化
757デフォルトの名無しさん:2010/10/06(水) 21:19:25
Cのキャストは使っちゃだめですか
758デフォルトの名無しさん:2010/10/06(水) 21:28:25
あれって明示的特殊化なの?
explicit instantiationじゃないの?
759デフォルトの名無しさん:2010/10/06(水) 21:28:37
当然です
760デフォルトの名無しさん:2010/10/06(水) 21:41:13
だって template <> と書いたらexplicit instantiaionじゃないじゃん
761デフォルトの名無しさん:2010/10/06(水) 21:42:36
operatorの引数名の定番としてlhsやrhsがありますが、
同様にコピーコンストラクタの引数名の定番はありますか?
762デフォルトの名無しさん:2010/10/06(水) 21:43:54
http://slashdot.jp/~Yoh2/journal/410673?m=1

しかしひでえな
今の新しいコンパイラはちゃんとバグが取れてるのか?
763デフォルトの名無しさん:2010/10/06(水) 22:00:17
>>761
other
764デフォルトの名無しさん:2010/10/06(水) 22:03:05
コンストラクタの初期化リストでベースクラスのメンバは初期化できない。
ってことで合ってますか?
765デフォルトの名無しさん:2010/10/06(水) 22:09:33
>>764
そうだよ
初期化リスト中でベースクラスのコンストラクタを呼び出す
766デフォルトの名無しさん:2010/10/06(水) 22:15:44
こんな感じだな
しかしstringがムーブコンストラクタを使うようになって速くなったね

class Base {
std::string base_str;
public:
Base(const std::string& str) : base_str(str) {}
virtual void print_str() const {
std::cout << base_str << std::endl;
}
};

class Derived : public Base {
std::string derived_str;
public:
Derived(const std::string& str1, const std::string& str2 = "") : derived_str(str1), Base(str2) {}
void print_str() const {
std::cout << derived_str << ' ';
Base::print_str();
}
};

int main()
{
Derived d("derived", "base");

d.print_str();
}
767デフォルトの名無しさん:2010/10/06(水) 22:18:32
標準ライブラリがmoveを使うよ
やったねC+ちゃん!
768デフォルトの名無しさん:2010/10/06(水) 22:28:17
>>754だと例外的なクラスが増えるたびにTESTを拡張しなければならないから気持ち悪い
>>752にデフォルトのGetを加えたものが良いと思うな
769デフォルトの名無しさん:2010/10/06(水) 22:32:52
>>752程度の回答でよかったのか
構造体内に違う型が混在していてそれをテンプレートでコンパイル時に仕分ける方法を
探しているのかと悩んでしまったぜ
770デフォルトの名無しさん:2010/10/06(水) 22:47:39
こういう問題にはtraitsを使いなさい
メンバ関数の特殊化はおすすめできない
コードが汚くなるだけじゃなく部分的特殊化で問題が生じたりしてめんどくさい
771デフォルトの名無しさん:2010/10/07(木) 00:05:19
>>742
別件で書いたものだけでこういうことやいろんなことができるようになる
http://codepad.org/XAMW2Mxi
boostの和訳の少し古い奴ならcppllからsourcefofgeダウンロードできたはず

>>745
こんな感じのことやりたいのかな?
http://codepad.org/UrnwJaPk
772デフォルトの名無しさん:2010/10/07(木) 13:35:50
>>768-770
昨日の者です。
>>751のやり方でいけました。このやり方で進めてます。

>>754のやり方はコードが汚いし、型が増えるたびに拡張するのはよくないので
やめました。
773デフォルトの名無しさん:2010/10/07(木) 13:39:06
>>772
> >>754のやり方はコードが汚いし、型が増えるたびに拡張するのはよくないので
> やめました。
そもそもテンプレートとしてなww
774デフォルトの名無しさん:2010/10/07(木) 13:50:56
>>771
boostの件についてはありがとうございます。
こんなことができるとは。反則ですね。
非常に助かりました。

>>745の件については、>>751のやり方でいきます。
ソースコードはもらっておきます。
775デフォルトの名無しさん:2010/10/07(木) 15:52:56
変数にstaticつける利点は分かったんですが、
関数にstaticつける利点がわかりません。

これはクラス内での話しですが、クラス内関数にstaticをつける利点に
ついて分かりやすく教えてください。
776デフォルトの名無しさん:2010/10/07(木) 15:54:52
そのクラスのインスタンスがなくても呼べる。
777デフォルトの名無しさん:2010/10/07(木) 16:09:17
>>776
つまりその関数はpublicで指定するしかないってことですよね?
性的メンバ変数を操作するための関数みたいなもんですよね?
778デフォルトの名無しさん:2010/10/07(木) 16:11:21
別にprivateでもいいよ
例えばfriendからなら呼べる
779デフォルトの名無しさん:2010/10/07(木) 16:14:25
あとクラスにコールバック関数を仕込める
780デフォルトの名無しさん:2010/10/07(木) 16:16:15
みなさん、BSがノーベル賞受賞しました、
ってことになったらどう思う?
同時受賞者もでるのかな?
781デフォルトの名無しさん:2010/10/07(木) 16:16:56
他のメンバ関数(非static含む)からでも呼べるよ
782デフォルトの名無しさん:2010/10/07(木) 16:19:56
>>780
スレチなので死んでください
783デフォルトの名無しさん:2010/10/07(木) 16:19:57
visual C++ 2010 Expを使ってシリアルポートの通信プログラムを
作っていて、BCD構造体という使いたいのですが、
BCDという識別子が認識されません。
これを使うにはどうしたらいいのでしょうか?
作成中のプログラムはwin32コンソールアプリケーションで
すべてC言語で書いています。
<stdio.h>、<stdlib.h>、<windows.h>をインクルードしています。
windowsでのプログラミングは初めてなんで見当違いな聞き方かもしれない
ですけどよろしくお願いします。

784デフォルトの名無しさん:2010/10/07(木) 16:21:18
>>783
それを使うのに、必要なライブラリをいれろ
785デフォルトの名無しさん:2010/10/07(木) 16:22:07
>>783
なんていうライブラリですか?

786デフォルトの名無しさん:2010/10/07(木) 16:22:21
なるほどよく分かりました。ありがとうございます。
787デフォルトの名無しさん:2010/10/07(木) 16:23:12
>>783
いっぺん出直してこいやカス
788デフォルトの名無しさん:2010/10/07(木) 16:27:43
>>785
知能っていうライブラリだけど君持ってないよね
789デフォルトの名無しさん:2010/10/07(木) 16:27:48
>>787
いや それがわからんから聞いてる。
790デフォルトの名無しさん:2010/10/07(木) 16:28:47
>>788
死ね
791デフォルトの名無しさん:2010/10/07(木) 16:31:24
いいえ生きます
792デフォルトの名無しさん:2010/10/07(木) 16:31:28
なるほど!friendつけるのって、
自分のクラス内にアクセスさせたい関数につけるって考えたほうがいいですね。

たとえば、WinMain関数をクラス内にfriendつけて、宣言しちゃえば、
WinMainからそのクラスのメンバにアクセスできますもんね!

なーるほど。
793デフォルトの名無しさん:2010/10/07(木) 16:32:38
Linuxでwindowsのプログラムが動くwineってソフトがあるんだ。
それに乗り換えれば、やさしいLinux開発者か何でも教えてくれるよ。
794デフォルトの名無しさん:2010/10/07(木) 16:36:49
>>783
BCD?
DCB?
795デフォルトの名無しさん:2010/10/07(木) 16:39:55
>>794
DCBですた。すいません。
796デフォルトの名無しさん:2010/10/07(木) 20:24:45
Effective STL の第39項に「述語を純粋関数にしよう」とあります。
これ自体は容易に納得のいくことなのですが、今日 std::count_if を使いながら
ふと思ったのです。
述語をラムダ式で書くとき、変数のキャプチャを行うことが多いと思いますが、
変数のキャプチャを行ったラムダ式は純粋関数と言えるのでしょうか?

というか、ラムダ式を述語として安全に使える条件とは?
797デフォルトの名無しさん:2010/10/07(木) 20:40:32
キャプチャしなくても関数じゃありません
798デフォルトの名無しさん:2010/10/07(木) 20:50:37
↑afo
799デフォルトの名無しさん:2010/10/07(木) 21:08:48
ああはいはい、「ラムダ式」じゃなくて「ラムダ式によって暗黙に構築される
関数オブジェクト」と言えば満足ですかね?
800デフォルトの名無しさん:2010/10/07(木) 21:13:17
C++ではラムダはサポートされてません
801デフォルトの名無しさん:2010/10/07(木) 21:20:18
C++は関数型言語
802デフォルトの名無しさん:2010/10/07(木) 21:55:55
術語ってなーに?
803デフォルトの名無しさん:2010/10/07(木) 22:02:30
ふと気になったんだけど、
C++は、int* array = new int[1024]; とやった時、配列の中身0クリアされている?

Cで mallocした時とかは、補償されてないけどさ。
804デフォルトの名無しさん:2010/10/07(木) 22:10:57
クラスかprimitiveなintとかかによって違うんだよね?
805デフォルトの名無しさん:2010/10/07(木) 22:11:33
配列 new や malloc ではゼロクリアされない。
STLのコンテナで、要素数を指定できるコンストラクタを持ってる奴なら、
全要素をデフォルトコンストラクタで初期化する。
806デフォルトの名無しさん:2010/10/07(木) 22:16:53
http://codepad.org/YXiaPsF2
とまあこんな具合。
807デフォルトの名無しさん:2010/10/07(木) 22:17:41
>>806
ありがとうございます。
808デフォルトの名無しさん:2010/10/07(木) 22:18:47
C++0xで初期化させる配列newとか出来ないの?

あとクラスなら
MyClass* arr = new MyClass[1024];
これでもデフォルトコンストラクタで初期化されるんだよね?
809デフォルトの名無しさん:2010/10/07(木) 22:19:56
memset()で0クリアすりゃいいじゃん
810デフォルトの名無しさん:2010/10/07(木) 22:20:33
値初期化したいなら
new T[...]()
とすればいい
811デフォルトの名無しさん:2010/10/07(木) 22:24:32
>>808
YES。

> C++0xで初期化させる配列newとか出来ないの?
むしろ組み込みの配列を使うと警告が出るくらいでいいと思う。
812デフォルトの名無しさん:2010/10/07(木) 22:31:08
>>810
こんなんできたのか知らんかった
813デフォルトの名無しさん:2010/10/07(木) 22:32:00
C++は恐ろしい言語やで・・・
814デフォルトの名無しさん:2010/10/07(木) 22:32:03
>>810
こんなんできたのか知らんかった
815デフォルトの名無しさん:2010/10/07(木) 22:32:03
>>810
この構文を最初に知ったとき「きめぇ」って思った
816デフォルトの名無しさん:2010/10/07(木) 22:33:23
良かった。確保後のゼロクリアは無駄じゃなかったのか。

仕様を確認しておかないと…、コードの使い回しや移植を考えると不安だよね。
0クリアされている物と前提しているコードあるらしいし。

意地の悪いlibcでも作って、遊んでみると面白いかも
817デフォルトの名無しさん:2010/10/07(木) 22:35:35
javaとかだとオブジェクト指向とかばかり言って、
ロジックよりも構造ってイメージがあるわけですが

お前らはどう思いますか
818デフォルトの名無しさん:2010/10/07(木) 22:43:29
>>810の人気に嫉妬
819808:2010/10/07(木) 22:47:56
>>809
double型では困りません?


>>810-811
ありがとうございます。



ちなみに私>>808>>807はもと質問者の>>803とは別人です。

820デフォルトの名無しさん:2010/10/07(木) 22:58:52
malloc()やらnew int[]の結果がゼロクリアされてる前提で
書かれてるコードもいやだし、そんなコードを想定して
とりあえずゼロクリアしてだましだまし動かしてる状況も悲しいものがあるな。
821デフォルトの名無しさん:2010/10/07(木) 23:10:20
後半がイミフ
822デフォルトの名無しさん:2010/10/07(木) 23:13:48
>>821
文字通りの意味
823デフォルトの名無しさん:2010/10/07(木) 23:14:31
>>819
>double型では困りません?

目的がわからん
Cのcalloc()も単に0クリアするだけだったろ?
そもそもIEEE754準拠なら0クリアで0.0になるし

後からmemset()してもstd::fillかstd::fill_n使ってもいいし
824デフォルトの名無しさん:2010/10/07(木) 23:17:16
IEEE754準拠なら0クリアで0.0になるのか、知らなかったぜ。

整数型だけかとおもてた
825デフォルトの名無しさん:2010/10/07(木) 23:22:47
>>817
偉そうなごたくはどうでも良いが、はっきり言って Java で書くのは
C++に比べてかったるい。

主観的かつ実用面だけの意見だが所詮道具だから。
826デフォルトの名無しさん:2010/10/07(木) 23:23:04
>>824
0の状態で符号ビットを立てると -0.0 という奇妙な数になる
何の役に立つのかわからんけど
そうやっていろんなあり得ない値をポインタ経由で代入してprintf()してみたもんだ
ものすごい長い数字になった事もあるしあれは多分printf()の想定外の数が
入力されたからだろうな

大抵は+NANか-NANになってしまう
827デフォルトの名無しさん:2010/10/07(木) 23:25:45
>>826
ありがとう。
そういう遊び心がだいじなのか。
828デフォルトの名無しさん:2010/10/07(木) 23:28:06
すいません。
thisポインタの型ってどんな型ですか。教えてください。
voidとかintとかの表記で表してください。
829デフォルトの名無しさん:2010/10/07(木) 23:28:39
>>828
そのクラスのポインタの型
830デフォルトの名無しさん:2010/10/07(木) 23:29:40
>>827
大事かどうかは人の価値観次第だけど、今時のコンピュータは大抵何を
やっても壊れない(HDDのフォーマットとかセクタWriteは別だよ)のでC/C++の
内部がどうなっているのが調べて見ると興味が沸いてくる

それとコンパイルしたソースのアセンブリ出力を読んでみるとかな
831デフォルトの名無しさん:2010/10/07(木) 23:29:58
やっぱりわかったからもういい
832デフォルトの名無しさん:2010/10/07(木) 23:31:46
MFCのイベントハンドラについてなのですが、次のような関数を
template <int index>
void &CHogeDlg::OnBnClickedButton()
{
  switch (index)
  {
    // ボタンごとの処理
  }
}

以下のようにイベントハンドラとして登録しているコードを見ました。
ON_BN_CLICKED(IDC_BUTTON1, &CHogeDlg::OnBnClickedButton<1>)
ON_BN_CLICKED(IDC_BUTTON2, &CHogeDlg::OnBnClickedButton<2>)
ON_BN_CLICKED(IDC_BUTTON3, &CHogeDlg::OnBnClickedButton<3>)

この場合、indexの値ごとに別々の関数が作られることになるのだと思いますが、
関数内部での定数による分岐などは消えてなくなるのでしょうか?
833832:2010/10/07(木) 23:32:43
ごめんなさい。関数定義に&はいらないっすね。
834デフォルトの名無しさん:2010/10/07(木) 23:35:44
>>830
とりあえずやってみるって大事だよな
http://msdn.microsoft.com/ja-jp/library/cc440193(VS.71).aspx
>しかし筆者の経験では、Visual C++ はフィルタ式としてあらゆる整数値型、ポインタ型、構造体型、配列型、そして void 型さえも受け入れます(ただし、浮動小数点フィルタを試したところ、見事に内部コンパイラ エラーが帰ってきました)。
835デフォルトの名無しさん:2010/10/07(木) 23:40:38
Cでもswitch文の構文を使って気持ち悪い文はいくらでも書けるしな
こういう自由度の高さがウケているんだろうなあ
バグの温床でもあるけど
836デフォルトの名無しさん:2010/10/07(木) 23:43:32
switchをブロックを使わずに書くとひどいことになる
837デフォルトの名無しさん:2010/10/07(木) 23:44:33
switchとifとforをごちゃ混ぜにしてもコンパイル通るもんなあ
838デフォルトの名無しさん:2010/10/07(木) 23:45:40
>>832
一見キモイけど合理的だな
839デフォルトの名無しさん:2010/10/07(木) 23:48:04
よ〜しパパcaseをはさんでループ書いちゃうぞ。
840デフォルトの名無しさん:2010/10/07(木) 23:48:22
>>832
最適化の可能性を置いとけば
普通に分岐処理を行うわな

見た目の問題でそうしたんだろう
でも普通はbindにしないかなぁ
841デフォルトの名無しさん:2010/10/07(木) 23:50:43
てかなんでそういうことしてんのにswitch残したんだろうか
半端だな
もっとがんばって消せよ
842デフォルトの名無しさん:2010/10/07(木) 23:53:50
普通に特殊化でいいよな
843デフォルトの名無しさん:2010/10/07(木) 23:56:06
単なる分岐のためにindexを使っているならちょっと弱いというか、もったいない。
844デフォルトの名無しさん:2010/10/07(木) 23:59:01
switch(index)
{
case 1: 〜;
case 2: 〜;
case 3: 〜; break;
case 4: 〜;
}
みたいにbreak有り無しが入り乱れてたら特殊化するより楽かも
845デフォルトの名無しさん:2010/10/08(金) 00:01:16
特殊化するくらいなら別々の関数でよくね?
ON_CONTROL_RANGEがイヤになってテンプレートに置き換えてみたとか
そういうことじゃないのかな。
846デフォルトの名無しさん:2010/10/08(金) 00:10:23
ある8ビットのマシン用のCのサブセットのセルフコンパイラが
#ifディレクティブがサポートされていなかった。
どうするかというと実行されない文のコードを生成しないので
普通のif文でやるのです。
僕と同じマシンの同じコンパイラが頭に浮かんだでしょうか?
昔のPC板で会いましょう。
847デフォルトの名無しさん:2010/10/08(金) 00:46:56
>>796
引数以外の状態に依存するから純粋関数ではないと思うよ
でもさ、ラムダを使う条件ということだが、純粋関数がどうとか気にする必要ないんじゃないの?
多分ムーブするんだろうから

それに何年も前にboostをはじめとする手法でアルゴリズムに
純粋関数以外のものも突っ込んでいるわけで、
メイヤーズの2000年初頭の頃の指標には例外が存在していることは
認識しておいたほうがいいと思うけどね
848デフォルトの名無しさん:2010/10/08(金) 01:01:25
メイちゃんはどこでも大人気
849デフォルトの名無しさん:2010/10/08(金) 03:57:04
>>796
純粋関数は「ある式の評価結果が常に等しく、副作用がない」関数のことだから、
キャプチャしたのが変数の参照でなければ、あるいは参照であっても、
評価期間を通じて値が変化しないことを保証できるなら、
少なくともその評価期間において、そのラムダ式は純粋関数だと考えてよいのでは?
850デフォルトの名無しさん:2010/10/08(金) 08:59:27
すいません。WIAPIの質問になるんですが、
timeBeginPeriod関数で精度を上げたいと思うんですが、
これを呼び出すタイミングって
ゲーム開始時に呼び出しといて、
ゲーム終了時にtimeEndPeriodを呼び出すだけでいいんですか?

それともFPS制御をしてる処理部分だけをこれらの関数で囲めばいいんですか?
851デフォルトの名無しさん:2010/10/08(金) 09:03:27
::new( _NORMAL_BLOCK, __FILE__, __LINE__ )

ていうコードをdefineしてるコードを見たんですが、
これは何をしてるんですか?
852デフォルトの名無しさん:2010/10/08(金) 09:15:15
853デフォルトの名無しさん:2010/10/08(金) 09:15:18
>>851
通常の new と比べて追加で3つの引数を持つ new を使うようにしている。
引数の内容から考えて、メモリリークを検出できるデバッグ版の new と
考えられる。

・・・っていうか crtdbg.h のやつか。
854デフォルトの名無しさん:2010/10/08(金) 09:36:11
>>852
すいませんでした。移動します。
855デフォルトの名無しさん:2010/10/08(金) 09:38:37
>>853
newをオーバーライドしてるってことですか?
856デフォルトの名無しさん:2010/10/08(金) 11:33:04
いいえ違います
857デフォルトの名無しさん:2010/10/08(金) 12:18:49
>>846
普通じゃね?
よくマニュアルを読んでみろ、コンパイラとプリプロセッサが別のコマンドはよくあること。
858デフォルトの名無しさん:2010/10/08(金) 12:20:13
Aていうクラスがあるとして
これを動的確保するときに
new A()ってやつとnew Aっていう括弧がないやつがあるんですが、
何が違うんですか?
859デフォルトの名無しさん:2010/10/08(金) 12:31:54
コンストラクタとデストラクタって必ずpublicにする必要ありますか?

privateとかにすると、クラスを宣言することすらできないんですが・・・
860デフォルトの名無しさん:2010/10/08(金) 12:36:45
プライベートでもプロテクテッドでも構いませんよ
861デフォルトの名無しさん:2010/10/08(金) 12:38:23
>>859
privateにしてもいい
単に可能ってだけじゃなくて、わざとそうすることもある
どういう時かはぐぐれ
862デフォルトの名無しさん:2010/10/08(金) 12:43:46
でもprivateにするとアクセスできませんって言われるんですが。。。
863デフォルトの名無しさん:2010/10/08(金) 13:43:15
友達の彼女のマンコに直接指を入れることは出来ないだろ
それと同じだ
864デフォルトの名無しさん:2010/10/08(金) 13:44:44
で、できればもうちょっとわかりやすく説明してほしいです。。。
865デフォルトの名無しさん:2010/10/08(金) 14:09:48
直接彼女の友達になれば入れられる
866デフォルトの名無しさん:2010/10/08(金) 14:14:17
言いたいことは分かるがその理屈はおかしいwww
867デフォルトの名無しさん:2010/10/08(金) 14:26:37
そのクラスにpublicでstaticな関数を作ってそこでnew してポインタ返すとか
firendつかって別のクラスとかで作れるようにしたりとか
そういう方法で作ったりできる
868デフォルトの名無しさん:2010/10/08(金) 14:26:53
彼女のfriendになればセックスできるということでしょうか?
869デフォルトの名無しさん:2010/10/08(金) 15:35:15
やってみれば分かる
870デフォルトの名無しさん:2010/10/08(金) 18:39:06
フォームアプリケーションのテキストボックスの値を
cppファイルの方から参照するにはどうすればいいの?
871デフォルトの名無しさん:2010/10/08(金) 18:49:26
ある基底クラスをfriend使って、あるクラスのお友達にしたら、
その基底クラスを継承してる派生クラスからもアクセスできてしまうってことないよね?
872デフォルトの名無しさん:2010/10/08(金) 19:25:43
スマートポインタはmallocの返すポインタでも使えますよね?
873デフォルトの名無しさん:2010/10/08(金) 19:33:42
freeを呼ぶデリータを指定すればいいだけ
874デフォルトの名無しさん:2010/10/08(金) 19:37:31
>>872
boostやC++0xのshared_ptrみたいなカスタムデリータを
指定できるスマポでなら使える
875デフォルトの名無しさん:2010/10/08(金) 19:38:44
>>873
それどうすれば良いんですか?
コード例クレクレださい
876デフォルトの名無しさん:2010/10/08(金) 19:53:45
ggrks
877デフォルトの名無しさん:2010/10/08(金) 20:06:38
mallocで得たポインタをshared_ptrに渡すのは特別な場合以外では
全くお勧めできない。デリータ指定し忘れてもコンパイル通るから

ましてや既に提示された情報からググることも出来ない人には正しく
使うことはぜったいムリムリムリムリかたつむりよ
878デフォルトの名無しさん:2010/10/08(金) 20:17:56
なつかしいなかたつむり
879デフォルトの名無しさん:2010/10/08(金) 20:26:05
もうこれでいんじゃね?w
ttp://codepad.org/nk9tJJuy
880デフォルトの名無しさん:2010/10/08(金) 21:42:41
stl用のアロケーター自作したいんですが、これってオブジェクトは空じゃないとダメですか?
881デフォルトの名無しさん:2010/10/08(金) 21:58:58
>>880
空でも無くてもいいよ。
アロケーターで確保したメモリは、確保したのと別のインスタンスのアロケーターでも開放できなければならない。
よって空の実装が多くなるね。
882デフォルトの名無しさん:2010/10/08(金) 22:06:38
>>881
別のインスタンスでも開放できないといけないって初めて知りました
どうもサンクスです
883デフォルトの名無しさん:2010/10/08(金) 22:31:59
おい、嘘を教えるなよ。
884デフォルトの名無しさん:2010/10/08(金) 22:37:09
ほんとだよ
885デフォルトの名無しさん:2010/10/08(金) 22:45:01
正直質問の意味が分からないからどっちでもいいや
886デフォルトの名無しさん:2010/10/08(金) 22:46:54
「アロケーターで確保したメモリは、確保したのと別のインスタンスのアロケーターでも開放できなければならない」
どこに書いてあるんだよ? こんなこと
887デフォルトの名無しさん:2010/10/08(金) 22:48:17
ggrks
888デフォルトの名無しさん:2010/10/08(金) 22:49:37
class A{
protected:
int a,b;
};
class B : public A{
};

っていう二つのクラスがあったとして、
クラスBのインスタンスを二つ作った場合、aとbは共有されますか?
889デフォルトの名無しさん:2010/10/08(金) 22:52:32
誰か>>858お願いしますう。
890デフォルトの名無しさん:2010/10/08(金) 22:53:52
もちろん
891デフォルトの名無しさん:2010/10/08(金) 22:54:52
>>889
new A() ; は初期化子として()を記述している。よって値初期化される。
new A ; は初期化子を省略している。よってデフォルト初期化される。
892デフォルトの名無しさん:2010/10/08(金) 22:57:00
>>891
おい嘘書くな
893デフォルトの名無しさん:2010/10/08(金) 22:58:08
>>888
共有?
staticメンバ変数ならば共有されるけど、非staticなら別々でしょ
894デフォルトの名無しさん:2010/10/08(金) 22:58:55
>>891-892
どっちが本当なんですか?
895デフォルトの名無しさん:2010/10/08(金) 23:00:03
どこが嘘なんだよ
896デフォルトの名無しさん:2010/10/08(金) 23:03:09
まずPODなのか非PODなのか明かせ
897デフォルトの名無しさん:2010/10/08(金) 23:04:15
非PODの場合 new Aは初期化されなく、new A()はゼロ初期化される

class A {
int i;
public:
A() {}
A(int j) : i(j) {}
void print() const {
std::cout << i << std::endl;
}
};

int main()
{
A* ap = new A(10);
ap->print();
delete ap;

A* ap1 = new A;
A* ap2 = new A();

ap1->print();
ap2->print();

delete ap2;
delete ap1;
}
898デフォルトの名無しさん:2010/10/08(金) 23:04:47
staticメンバ変数って絶対初期化する必要あるんですか?
899デフォルトの名無しさん:2010/10/08(金) 23:05:56
>>897
ありがとうございました!
900デフォルトの名無しさん:2010/10/08(金) 23:06:53
>>897
馬鹿かお前
901デフォルトの名無しさん:2010/10/08(金) 23:08:37
>>899
おいおい>>897は間違ってるぞ
非PODの場合はnew Aもnew A()も同じ
PODの場合はゼロで初期化される
これ前にも同じ質問が出て、確か規格票が書かれたと思うが

class A {
int i;
public:
A() {}
A(int j) : i(j) {}
void print() const {
std::cout << i << std::endl;
}
};

int main()
{
A* ap = new A(10);
ap->print();
delete ap;

A* ap1 = new A;
ap1->print();
delete ap1;

A* ap2 = new A();
ap2->print();
delete ap2;
}
902デフォルトの名無しさん:2010/10/08(金) 23:11:51
C++0xでPODの定義変わるんだよね。。。
903デフォルトの名無しさん:2010/10/08(金) 23:12:29
>>901
ありがとうございます。
PODってのはよく分からないですが、VCでやったらゼロ初期化されませんでした。
PODなら()をつけたらゼロ初期化されると覚えておきます。
904デフォルトの名無しさん:2010/10/08(金) 23:13:16
>>881
Allocator requirementsを読んで出直してこい。

>>897
結果だけでモノを言うんじゃない。

>>902
定義は変わっても意味は同じ。
単に細分化されただけ。
905デフォルトの名無しさん:2010/10/08(金) 23:15:57
>>903
だから規格票読めって
PODは()を付けた時のみゼロ初期化
それ以外は何もしない(領域のみ確保)と覚えておけばよい
もちろん非PODでデフォルトコンストラクタが定義されていた場合はそれが実行される
906デフォルトの名無しさん:2010/10/08(金) 23:17:58
サンプルコードでPODはどこ?
907デフォルトの名無しさん:2010/10/08(金) 23:18:02
staticメンバ変数って絶対初期化する必要あるんですか?
908デフォルトの名無しさん:2010/10/08(金) 23:25:27
>>907
staticストレージの有効期間を持つ(あまり馴染みのない言い方だが)オブジェクトは、
あらゆる初期化の前に、必ずゼロ初期化されると保証されている。
909デフォルトの名無しさん:2010/10/08(金) 23:25:50
使わなければ初期化しなくてOKですよ
910デフォルトの名無しさん:2010/10/08(金) 23:34:20
ありがとうございます。
初期化するときってグローバル領域でする必要があるじゃないですか。
そこで初期化しなかった場合実体が作られないんですよね?

その後実体を作るには普通にクラス内で値を入れれば実体化されるんですか?
911デフォルトの名無しさん:2010/10/08(金) 23:35:59
>>906
ほらよ

class A {
int i;
public:
A() {}
A(int j) : i(j) {}
void print() const {
std::cout << i << std::endl;
}
};

struct B {
int i;
};

↓続く
912デフォルトの名無しさん:2010/10/08(金) 23:36:48
int main()
{
A* ap = new A(10);
ap->print();
delete ap;

A* ap1 = new A;
ap1->print();
delete ap1;

A* ap2 = new A();
ap2->print();
delete ap2;

B* bp = new B;
bp->i = 11;
delete bp;

B* bp1 = new B;
std::cout << bp1->i << std::endl;
delete bp1;

B* bp2 = new B();
std::cout << bp1->i << std::endl;
delete bp2;
}
913デフォルトの名無しさん:2010/10/08(金) 23:38:14
用語がめちゃくちゃだな。意味もあやふやだし。
なんだよ「グローバル領域」とか「実体化」って。

staticストレージ上に構築されるオブジェクトは、プログラムの開始からすでに存在している。
914デフォルトの名無しさん:2010/10/08(金) 23:41:18
すいませんでした。気をつけます。ありがとうございました。
915デフォルトの名無しさん:2010/10/08(金) 23:41:59
>>905
これマジかよって思ってideoneでコードを書いて確認してみたら、
ゴミが入らなくてどっちも0で確認できなかった。
916デフォルトの名無しさん:2010/10/08(金) 23:57:25
codepad使え
917デフォルトの名無しさん:2010/10/09(土) 00:13:59
>>915
そりゃdeleteしてすぐnewしても同じ領域が割り付けられるとは限らないからな
ガチガチの処理系依存だよ
918デフォルトの名無しさん:2010/10/09(土) 00:18:27
919デフォルトの名無しさん:2010/10/09(土) 00:19:37
どこに?なのかが?
920デフォルトの名無しさん:2010/10/09(土) 00:26:23
>>918
だからそういう偶然に頼るなって
921デフォルトの名無しさん:2010/10/09(土) 00:32:33
stlアロケーターの要求してるinit_page_size()って何に使うんですか?
これって4Kbyte固定でいいんですか?
922デフォルトの名無しさん:2010/10/09(土) 00:32:45
多分これだろ

§5.3.4
15 A new-expression that creates an object of type T initializes that object as follows:
? If the new-initializer is omitted:
? If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized
(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
? Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is ill-formed;
? If the new-initializer is of the form (), the item is value-initialized (8.5);
? If the new-initializer is of the form (expression-list) and T is a class type, the appropriate constructor is
called, using expression-list as the arguments (8.5);
? If the new-initializer is of the form (expression-list) and T is an arithmetic, enumeration, pointer, or
pointer-to-member type and expression-list comprises exactly one expression, then the object is initialized
to the (possibly converted) value of the expression (8.5);
? Otherwise the new-expression is ill-formed.
923デフォルトの名無しさん:2010/10/09(土) 00:38:01
>>920
どこが偶然に頼ってるの?
924デフォルトの名無しさん:2010/10/09(土) 00:41:16
なにが?なのか説明しる
925デフォルトの名無しさん:2010/10/09(土) 01:47:27
>>921
そんな要求なかったような…?
926デフォルトの名無しさん:2010/10/09(土) 01:59:51
927デフォルトの名無しさん:2010/10/09(土) 02:23:03
ポインタ型(あるいはそれを模したイテレータやスマートポインタなどの型)の変数から
*演算子で値を得る行為をなんと呼べばいいでしょうか。
「デリファレンス」だと思っていたんですが、実際口にしてみたら通じなかったもので……
どういう言い方が一般的なんでしょうか。

int x = 100;
int *px = &x;
int y = *px; // ← ココ
928デフォルトの名無しさん:2010/10/09(土) 02:26:20
dereferenceが唯一のただしい言葉だ。
「デリファレンス」は所詮、鮨をSushiと記述するのと同じぐらいの正しさでしか無い。
929デフォルトの名無しさん:2010/10/09(土) 02:30:49
>>927
一般的には「ポインタの値をとる」とかいっちゃうかな?

ポインタの値とかいうと、アドレス値をさしちゃいそうな気もするけれど、
Cでプログラム書く場合、アドレスがいくつであるかってのは基本的に気にしないから、
それで通じちゃう。

ま、デリファレンスで通じないのも辛いところだがw
930デフォルトの名無しさん:2010/10/09(土) 02:32:14
便乗するけど、int *px = &x; この行為は何という?
"reference" でいいのかな。
931デフォルトの名無しさん:2010/10/09(土) 02:38:41
間接参照?
932デフォルトの名無しさん:2010/10/09(土) 02:46:37
>>930
どの行為だよ?

int * pxは int *型の変数pxの宣言と定義。
= &xはその初期化子。
&xはxに&演算子を適用した式。

オブジェクトへのアドレスを得るという事ならば、
規格では、「アドレスを取る」(実際には、大抵受身で使われている)という言い方もされているがな。
933デフォルトの名無しさん:2010/10/09(土) 09:23:37
質問です。以下のコードを g++ でコンパイルすると
sort.cpp:21: error: no matching function for call to ‘sort(int [4], int*, main(int, char**)::Functor)’
とエラーになります。その場で関数オブジェクトを定義したい時はどうすればいいでしょうか?

#include <algorithm>

int main(int argc, char* argv[])
{
int items[] = { 4, 3, 1, 2 };
int num_items = sizeof(items) / sizeof(items[0]);

struct Functor {
bool operator ()(int lhs, int rhs) {
return lhs > rhs;
}
};

std::sort(items, items + num_items, Functor());

return 0;
}
934デフォルトの名無しさん:2010/10/09(土) 09:35:15
>>933
C++0xを使う。
C++0xならば、関数内クラスをtemplate argumentに渡すことが許されている。
C++03では、関数内クラスはtemplate argumentに渡すことができない。
935デフォルトの名無しさん:2010/10/09(土) 10:06:27
#include <iostream>
using namespace std;
class B;
class A{
private:
friend class B;
int nice;
public:
void disp(){
cout<<"test"<<endl;
}
};
class B{
protected:
static A a;
public:
void Init(){
a.disp();
}
};

class C : public B{
};
A B::a;
int main(void)
{
C c;
c.a.disp();
return 0;
}
936935:2010/10/09(土) 10:07:25
>>935ですが、
このソースでクラスBを継承したCから、その静的メンバであるaのdisp関数に
アクセスできません。
Bを継承したCからなら、protected領域にあるaにアクセスしてその
disp関数にもアクセスできると思ったのですが、できないのでしょうか?
937デフォルトの名無しさん:2010/10/09(土) 10:07:31
ttp://codepad.org/nwZhGigW

static関数なら通るけどこれじゃ状態が持てないよね
938デフォルトの名無しさん:2010/10/09(土) 10:08:51
>>934
ありがとうございます。
そうですか…ちょっと検討してみます。
939デフォルトの名無しさん:2010/10/09(土) 10:22:00
>>936
お前は何を言っているんだ。
当たり前じゃないか。
そのコードでは、A::dispにアクセスしているのはmain関数だ。
class Cじゃない。
そのコードを通したかったら、class Aに
friend int main(void) ;
という宣言が必要だ。
940935:2010/10/09(土) 10:48:54
>>939
そういえば、そうですね。
friendの定義を勘違いしていました。
友達にした関数から呼べるって意味でしたね。ありがとうございます
941935:2010/10/09(土) 10:51:56
class B;
class A{
private:
friend class B;
int nice;
public:
void disp(){
cout<<"test"<<endl;
}
};
class B{
protected:
static A a;
public:
void Init(){
a.disp();
}
};
class C : public B{
public:
void test(){
a.disp();
}
};
A B::a;
int main(void)
{
C c;
c.test();
return 0;
}
942935:2010/10/09(土) 10:55:32
クラスC内の関数からa.disp()を呼び出すことができるんですが、
何故でしょうか?

友達にしてるのはクラスBなのですが、クラスCの関数内からクラスAのdispが
呼べてしまってます。
943935:2010/10/09(土) 10:59:54
すいません。わかりましたのでいいです。
勘違いしてました。
944デフォルトの名無しさん:2010/10/09(土) 11:01:25
>>937>>933への回答?
それでよさげだけど

dereferenceは「参照剥し」とか言われてた時代がなかったっけか?
945デフォルトの名無しさん:2010/10/09(土) 12:43:23
いや、今でも参照剥がしって言うよ。
946デフォルトの名無しさん:2010/10/09(土) 13:02:38
ふつう、参照先取得だろ。
947デフォルトの名無しさん:2010/10/09(土) 13:04:53
dereferenceの日本語訳については
C++ Labyrinth
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-dereference.html
ここでも取り上げられていたな。
948デフォルトの名無しさん:2010/10/09(土) 13:08:18
>>947
参照剥がしってしっくり来るし必殺技ぽくってかっこよくね?
949デフォルトの名無しさん:2010/10/09(土) 13:36:20
「参照剥がし」だとコピーが行われているって感じが出ない。
あとなんか、「剥がす」っていう言葉を聞くと羅生門の情景が目に浮かぶ。
950デフォルトの名無しさん:2010/10/09(土) 13:39:01
参照剥がしたら実態が行方不明になっちゃうイメージ
実体化とかがいいと思う
951デフォルトの名無しさん:2010/10/09(土) 13:42:22
実体化じゃ、インスタンス化と区別つかんと思うが。
952デフォルトの名無しさん:2010/10/09(土) 13:42:38
c++
って
ちんこぷらぷらの略ですか?
953デフォルトの名無しさん:2010/10/09(土) 13:44:53
>>952
そのとおりです
954デフォルトの名無しさん:2010/10/09(土) 13:54:48
サブクラス
Application* Application::self()
{
return (Application*)KApp;
}

スーパークラス
static KApplication *KApp;

self()は安全ですか?
955デフォルトの名無しさん:2010/10/09(土) 13:58:56
スーパークラス、サブクラスの用語の使い方が間違っていると思うが…
956デフォルトの名無しさん:2010/10/09(土) 14:01:47
安全とかいう以前に、インスタンスが作られない。
957954:2010/10/09(土) 14:17:21
>>955
何故?
958デフォルトの名無しさん:2010/10/09(土) 14:29:23
安全じゃないです
959デフォルトの名無しさん:2010/10/09(土) 14:46:52
>>954 の内容をエスパーするに、
class Applcation : public KApplication の定義がどこかにあるんだろう。
960954:2010/10/09(土) 17:37:44
>>958
thx
>>959
普通に考えればわかるよな
961デフォルトの名無しさん:2010/10/09(土) 18:41:22
>>960
普通に考えるというか、好意的に解釈してやれば、というところか。
KApplicationはサブクラスだろ。
962デフォルトの名無しさん:2010/10/09(土) 18:44:37
>>961
そうだよ
963デフォルトの名無しさん:2010/10/09(土) 18:56:17
>>962
じゃあ逆じゃねえか
964デフォルトの名無しさん:2010/10/09(土) 19:56:53
dynamic_cast汁
965デフォルトの名無しさん:2010/10/09(土) 19:58:16
/*BMI.c*/
#include<stdio.h>
int main(void) {
double height,weight,BMI;
printf("身長[ m]:"); scanf("&lf",&height);
printf("体重[kg]:"); scanf("&lf",&weight);
BMI=weight/height/height;
printf("BMIは%fです。\n",BMI);
if(BMI>=25){
printf("肥満です!\n");
}else if(BMI<18.5){
printf("低体重です!\n");
}else{
printf("標準。\n");
}
return 0;
}

BMIを計算するコードですが、コンパイルした後実行しようとすると
unknown software exceptionというエラーが出て進めません。
どこを書き直せばいいですか?
966デフォルトの名無しさん:2010/10/09(土) 20:00:10
&lfが違う
967デフォルトの名無しさん:2010/10/09(土) 20:00:54
scanf
968デフォルトの名無しさん:2010/10/09(土) 20:03:50
>>966-967
ちゃんと見てませんでした。
ありがとうございます
969デフォルトの名無しさん:2010/10/09(土) 20:30:19
970デフォルトの名無しさん:2010/10/09(土) 21:07:38
>>969
971デフォルトの名無しさん:2010/10/09(土) 22:10:04
>>968
C++とC言語って別の言語だから、Cオンリーのコードなら
C言語スレに行った方がいいよ。

理由:
1. せっかく専用スレがあるから。
2. C言語はほぼC++に取り込まれているが、だからといってC++スレで
 聞いたからにはC++にしか通用しない文法や標準ライブラリやクラスで
 で返されても仕方ないことだから。
972デフォルトの名無しさん:2010/10/09(土) 23:08:42
>>971
アップキャストダウンキャストみたいな
973デフォルトの名無しさん:2010/10/09(土) 23:16:57
親クラスに無理矢理Cスタイルのキャストでダウンキャストして
存在しないメンバ関数呼び出したらエラーダイアログが出て来たorz
974デフォルトの名無しさん:2010/10/09(土) 23:27:43
親クラスにダウンキャストって何言ってるの?
975デフォルトの名無しさん:2010/10/09(土) 23:48:11
template classを使うときはTest<ClassName> t;
<ClassName>は絶対に必要なんですか?
976デフォルトの名無しさん:2010/10/09(土) 23:59:25
言いたい意味がわかっているか不安だが、必要ない
たとえば

template <class T>
T sqr(T x){ return x*x; }

int n(30);
cout<<sqr(n)<<endl;

みたいなので OK
試せばすぐわかる
977デフォルトの名無しさん:2010/10/10(日) 00:07:44
それは関数テンプレートや。
978デフォルトの名無しさん:2010/10/10(日) 00:14:16
>>975
必要ない。C++は賢いから推論で自動的に最適なClassNameにしてくれる
一々指定するって馬鹿らしい
979975:2010/10/10(日) 00:14:58
>>978
thx
980デフォルトの名無しさん:2010/10/10(日) 11:46:22
boostって広く使われているんですか?
パッケージ管理システムを調べると、boost関連のパッケージが全くインストールされていません
981デフォルトの名無しさん:2010/10/10(日) 13:01:02
うーん…
OSSで広く使われているか、と言われると、どうだろう?
そもそもOSSだとC++で書かれているものが少ないので、その中でboostを使っている、
となれば、さらに少なくなるな。

ちなみにFedora13で依存関係を調べてみたところ、boostに依存しているものは一つも
なかったw

でも、boostはテンプレートライブラリで、外部ライブラリを必要としないものも多いので、
実態はソース全部調べてみないとわからんけどw
982デフォルトの名無しさん:2010/10/10(日) 13:08:23
boostを嫌う人は結構いる
主な理由は「俺が分からん」「依存するライブラリが増えるのが嫌」「テンプレート重い」など
983デフォルトの名無しさん:2010/10/10(日) 13:10:08
プラットフォームによってライブラリのファイル名が違っていて
可搬性のあるMakefileが書けないとかいう話は聞いた
984デフォルトの名無しさん:2010/10/10(日) 13:13:31
>>983
boostの中身のヘッダー名では書かなくてもいいだろう。3カ月おきにfullメイクすればすむことだし
985デフォルトの名無しさん:2010/10/10(日) 13:15:22
ヘッダじゃなくてライブラリって書いたんだが・・・
986デフォルトの名無しさん:2010/10/10(日) 13:16:11
ライブラリのことだったか。boostはincludeするだけで自動でライブラリファイル名のリンク指示してしてくれたはずだけど
もしかしてVCだけ?
987デフォルトの名無しさん:2010/10/10(日) 13:17:41
うん
988デフォルトの名無しさん:2010/10/10(日) 13:25:46
VC以外は書かなくっちゃいけないのか。
可搬性考えなくてもあんな長ったらしいらいぶらり名書くの大変じゃん。デバッグ版とかリリース版とか
989デフォルトの名無しさん:2010/10/10(日) 13:55:26
そんな程度の事を理由として「使わない」という判断するような無能
が俺の近くに寄ってきませんように(祈
990デフォルトの名無しさん:2010/10/10(日) 13:57:28
使いたいけどコンパイラの問題で使えなかったりするわ
991デフォルトの名無しさん:2010/10/10(日) 14:06:13
誰でも便利さのわかる BOOST_FOREACH あたりから徐々に混入させていくんだ。
992デフォルトの名無しさん:2010/10/10(日) 14:19:35
shared_ptr
スマポ良いよスマポ
993デフォルトの名無しさん:2010/10/10(日) 14:22:13
まず、scoped_ptrだろ。
あとはtupleとか。

それから、lambda便利だぞ
994デフォルトの名無しさん:2010/10/10(日) 15:00:26
ヘッダだけのライブラリにしちゃえばいいのにねぇ。

lambdaは現実に仕事で使っているやつがいたら
うらやましいけどおいおいってなる。
995デフォルトの名無しさん:2010/10/10(日) 15:02:38
boostって使うのは簡単でいいんだけどさ
個人使用でないもので実際に使うとなると知識不足が気になっちゃうんだよね
なんというかただ使うだけだと速度とのトレードオフが見えないというか
かといってコード見て使ってると得した気分にならんし
996デフォルトの名無しさん:2010/10/10(日) 15:04:17
うちは VS2010 に切り替えたから、ラムダ使い放題だよ。
むしろ高階関数があるのにラムダがなかったのが異常だったんだ!

今はまだ俺しか使ってないけどさ。
997デフォルトの名無しさん:2010/10/10(日) 15:34:12
>>991
0xが策定されたら淘汰される急先鋒では
998デフォルトの名無しさん:2010/10/10(日) 15:35:41
boostなー、ただでさえtemplateはリンク長くなるから注意しないといけないので、なかなか厳しい
0x実用化してくれたら良いんだが、だいぶ先だろうなあ
999デフォルトの名無しさん:2010/10/10(日) 15:41:24
わ〜次スレ〜
1000デフォルトの名無しさん:2010/10/10(日) 15:42:16
FCDが出たはずなのにガンガン仕様に手が入れられてるんですけどー
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。