1 :
デフォルトの名無しさん :
2010/09/18(土) 00:09:47
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
テンプレは以上です。
for(it = c.iterator(); it /*op bool*/; ++it) { cout << *it << endl; } こういうインターフェースのほうがシンプルでいいと思うんだけど ポインタ互換性が無いけどいまどき生配列でループ回す人なんかいないでしょ どうしてもポインタ使いたいならit = iterator(ptr, ptr + N);とかでイテレーター作ればいいし 標準化の人たちはほんとセンスないよね
センスがないのはお前だ - 部分レンジをイテレータで表現できなくなる(例えばどうやって std::partial_sort の引数を渡すんだ?) - operator bool は論外(暗黙の変換のせいでおかしな式がいろいろコンパイル通るようになる)
>>10 別にpartial_sortには矛盾しないでしょ
partial_sort(c.iterator(), c.iterator() + n, c.iterator() + c.size());
operator boolでループの打ち切りを判断できるだけで別に終了条件をいつもの比較にしてもなんら問題は無い拡張だからね
あとsafebolはここでは本質ではないからその話を持ち出すお前のほうがはるかにセンスないよ
for (auto x: c) { cout << x << endl; } でええやん。
つか、 普通は for_each( c.begin(), c.end(), cout << *it << endl ); と、書きたいでしょうに。
for_each(adaptor(container), lambda);のほうがいいな
>>14 それだと、始点と終点がコントロールできない。
つか、別にオーバーロードすればいいだけじゃんか。
>>15 オーバーロードで両ほうできるようにすればいいさ
>>14 ovenやRangeExみたいな感じだな
>>9 ,
>>11 はちょっと意味わからない。それってシンプル?
lambda=ランバダ
面白い、とでも思ってるのか…?w
test
委譲のことをオーバーロードっていうの?
違います
>>11 ランダムアクセスできないイテレータのときはどーするの?
std::listとかの
Stringってワイド文字列は扱えないの? tcharやwcharをcharに変換してつかってことなのかな??
あ、partial_sortはそもそも random_access_iterator が必要だった。 それはそれとして、random_access_iterator 以外はit + n とかできないけど 9,11 はどうする気なのだろう
std::advance()
>>27 std::wstring・・・存在していたのか!
どもです、こちらをつかってみますね。
Hoge.hpp template <class X> class Hoge { ・・・; } Hoge_int.cpp template class Hoge<int> これってコンパイル体感できるぐらい早くなる?
extern templateしないとhppをincludeしてる側でも実体化するぞ
extern templateなんて在ったんですねthxです
やたら0xの話ばっかりする奴いるな。 0xスレにいけよ。ここはC++総合スレじゃないんだからよ。
C++総合だろ
0xネタは専用スレにいってくれるとありがたいなあ。 実務的にはまだそうでないコンパイラが主流だし。
advanceのことは知ってるが、 あれは 9,11の案との相性とか効率とかが悪いと思うんだけど、 どう考えてるの? でことなんだが
俺はここでC++全般のあれこれの話が聞けるほうがありがたい。あっちこっち行ってないし。 知らないネタはスルーしてるし。
何のための専門スレだよ、0x用があるならそっちが妥当だろ。
>>38 何のためって、そりゃあ0x専門の話したい人のためだろう
だからここで0xの書き込みをしないで向こうに書き込めって話だ。
C++の相談に来た初心者に0xで答える。何たるキチガイかー!
C++相談室なんだから別にいいじゃん。STLスレやboostスレがあるからって、 その話一切禁止なんてことないだろう。
C++相談室(0xをのぞく)になってりゃ分らなくもないが、 そうなっていない以上制限する必要もないな。
0xはまだ策定中だしな 0xの話を出すのはオレは許容できるけど 現行の規格に則ったアドバイスをしてる所に、 「そんなやり方は古くなるから教えるな、0xでは〜」というのはやめてほしい 相談者にとっては現行のやり方を知ることも大切だろう 新しい規格が定まっても従来のコードを読む必要があったりするかもしれないし
なんかアレルギー持っちゃった人がいるけど、ああそういうのもあるのね、でいいじゃん
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
std::ofstream ofstr("hoge.txt"); で、ファイルのオープンチェックに if (ofstr) { ... } と if (ofstr.is_open()) { ... } とするのでは意味が違うのでしょうか?いつも前者でチェックしていたのですが、ひょっとして間違い!?
cmakeをqmakeに変換する方法を教えてください
>>48 operator void *() が定義されているから前者で良い
operator boolじゃないのか?
初歩的な質問なんですが、 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していくんでしょうか?
53 :
51 :2010/09/19(日) 16:50:22
ごめんなさい 試したら私が間違ってました
55 :
52 :2010/09/19(日) 17:06:07
なるほど。デストラクタをvirtualにすれば良かったのですね。 ありがとうございます。
x,y座標点を持っているクラスが大量にあって、その中で一番近いクラスのポインタを もつようにしたいんだけど、効率のいい探索方法ってどんなのがありますか? 例えば class A{ int x; int y; A *Near; }; で、Aが1000個ぐらいあって、各一番距離が近いAを求めたい。 1つ1つ残り999個との距離を求めて探すのは効率悪すぎるしいい方法教えてください
4文木に入れて調べる
kd-tree
WindowsFormAppでOpenGLをダイアログで表示したいのですが 初歩から始めるにあたってよいサイト・参考書を教えてください
R木に入れる
速度が重要ならkd-treeでbest bin firstを使うといいとかでてきた まぁ色々挙げられたから後は質問者が調べて実験すりゃいいか
データ構造を4本木にしてもっておくの? 座標の配列とは別に4本木を作るの?
ありがとう、二分木の派生みたいな方法で探すのがいいのね。 それらをキーワードに勉強してきます。
いちいち随時ソースファイル分けてプログラミングする利点って何ですか? 自分は、いつも一つのファイルに書き続けて、もうこの関数は書き換えることはないってなってから ファイル作成してコピペで移動してるんだけど、もう書き始めからファイル作成してそっちに 関数作り始める人の方が多いよね。何故ですか? 一つのファイルでずっと書いていた方が、見やすいし修正とか便利だと思うんだけど。 いちいちファイル間移動して書くの面倒すぎる
一つのファイルが長いと不便だから
長くても大抵の開発環境では関数の定義に移動や変数の検索とかの機能があるし、 逆に長ければ長いほど一つのファイルにまとめておいたほうが便利じゃない?
結果的に分けてるんだったら別にいいんじゃない?自分がコード書くときどう書いたって。
分ければコンパイル時に無駄が少ないのよ
いったい何でコード書いてるんだろう メモ帳か?
>>67 大多数がそうするってことは、何か利点があるのかなと思って
>>68 へぇ初めて知った。今度から積極的に分けるようにする。完成してからだけど
>>69 eclipseかVisualStudioです。
メモ帳の場合だとファイル分けて書いていったほうが便利なのは分かる。
プログラミング用の関数参照とかの機能無いから長いと探しにくいし
>>70 > メモ帳の場合だとファイル分けて書いていったほうが便利なのは分かる。
普通逆だと思うけどな
プログラミング用の関数参照とかの機能無いから、別のファイルにまたがると参照が大変だし。
だからメモ帳の場合は単一ファイルか、数ファイルにする。
統合開発環境なら別ファイルにまたがっても参照や検索が楽だろ。
>>70 > へぇ初めて知った。今度から積極的に分けるようにする。完成してからだけど
これも逆だ
俺はスクロールが一画面に収まらなくなってきたら分け始めるな 理由:pgupとかhomeとかで関連外に出ることがないということが保証されるから
100万行の1ファイルを1行更新してビルドと 1000行くらいの1000ファイルに分けて1行更新してビルドしたら 分けた方が速いとおもう
機能で分けろよ。長さで分けてどうすんだ。
つーか、長くなるってことは分割しなきゃいけない兆候ではある
一つのファイルを変更すると そのファイルとそのファイルを参照してるファイルを再コンパイルすることになる ってことは理解してるんだろうか
78 :
74 :2010/09/19(日) 23:19:06
そんなの理解してるに決まってる。単位は機能である必要もない。
>>72 みたいな意見もあるので、どっちのケースもあると言っただけ。
mapをバイナリでファイルに保存したいんだけど、シリアル化無しでもいける? いけるのなら読み込みサイズをどう指定するか教えてほしい。sizeof(map<string, int>)とかでいける?
そう言うのはもう少し基本を勉強してからだな
>>80 >シリアル化なしでいける?
意味不明すぎる、シリアル化をなんだと思ってるんだ
シリアル化せずにファイル保存っておい
map全体をmemcpyでchar 文字列にコピーするようなノリでできるのか聞いてるなら無理だよ
ちょっと高級な言語から入門するとこういう雑魚が量産されちゃうんだよね
まず罵るのが出来るプログラマーの条件
単にバイナリシリアライズしたいだけならば今はmessage packがアツいぜ!!
86 :
デフォルトの名無しさん :2010/09/20(月) 20:39:46
>>84 問題箇所は気づいたときにマークしとかないと忘れるからな
UNIXではコアダンプといってメモリをファイルに書き出す機能があって プログラムが終了したあとでも内容を確かめる事ができる機能が あるんだ。
89 :
デフォルトの名無しさん :2010/09/20(月) 21:50:01
ふーん
90 :
デフォルトの名無しさん :2010/09/21(火) 01:11:30
C++を初心者に使わせるのはもうやめてくれ、ドザはC#でもシコシコやってればいいんだよ
>>90 いいんだよ頭が禿げ上がるまで使わせてやれば
>>88 原理的にはそうだけど、実際 core dump なんて解析してる?
俺は本格的に debug する時もせいぜい breakpoint 入れてデータ見たり程度だけど。
まわりでも最近 core なんか解析したという話はあまり聞かんなぁ…
1年前くらいに業務用のコードでやってたかな
93 :
デフォルトの名無しさん :2010/09/21(火) 11:52:33
開発環境でeclipseとVisual C++はどちらがお勧めでしょうか?
94 :
デフォルトの名無しさん :2010/09/21(火) 14:28:34
Visual C++
visual C++は止めておいた方が良い、 MicrosoftはC++に独自の規格をつくることで それを標準にしてC++のシェアを独占しようとしている。 Visual C++をつかうということはその企みの手助けをすることになって 将来C++を使うにはmicrosoftの高い製品を買わなければ使えなくなるということが おこり得る可能性は否定できない。 よってgccを使うことをオススメする。
あほか。何十年後より今を大切にするんだ。
何をしたいかによるんじゃないか GUI 付きアプリを作るなら Visual C++(最近は Visual Studioというかな) の方が向いてるのでは CUI で良いのなら Eclipse の方がどこでも使える利点がある
vc++だったら非標準オフ機能使えよカス
使えるときに使える奴使え。 そのときにあった物を使えば良いんだよ。 VC++が完全有料化されてたら、別のが流行するだろ。 そしたら勉強すればいいだろ。 PHP Ruby バイソンとか元々知らなくても必要な使えるようにするだろ。
ばいそん?
103 :
デフォルトの名無しさん :2010/09/21(火) 15:30:48
バイソンって構文木を作るやつだっけ?
読み方く知らないだ。すまん。 PHP Ruby Perl と並ぶ奴。スクリプト言語。Pで始まる奴。
調べた。 Python - Wikipedia Python(パイソン)は、オランダ人のグイド・ヴァンロッサムが作った オープンソースのプログラミング言語。 オブジェクト指向スクリプト言語の一種であり、Perlとともに欧米で広く普及している。 イギリスのテレビ局 BBC が製作したコメディ番組『空飛ぶモンティ・パイソン』にちなんで名付けられた。 Pythonは英語で爬虫類のニシキヘビの意味で、 Python言語のマスコットやアイコンとして使われることがある。
バイソンwwwwwwww
107 :
デフォルトの名無しさん :2010/09/21(火) 15:49:53
まあ、マイク「バイソン」は鉄板やろ?
まさかのマジボケ
EclipseがJavaで書かれているのが残念だなあ もっさりだろ
今のVisualStudioは大部分C#で書かれてるけどな
C#はJITコンパイルだからまだ軽いんだよ Javaは完全に仮想マシン方式じゃん 重さが違うよ
JavaもJITコンパイルしてるぞ C#も仮想マシン(とは呼ばないが同じもの)の上で動いてるぞ 仮想マシンがJITコンパイルしちゃいけない決まりはない
C#は仮想マシーン無いだろ。 ネイティブに変換するんだろ。 以前にしてあればキャッシュ読み込むだろ。
バイソンもJavaも釣りだろ こんなのがム板に居るわけがない
仮想マシンって意味解ってる? プログラミング言語から見て仮想化された環境というだけの意味で 特に具体的なインタプリタなどの実装を指してるわけじゃないぞ
CLRとかVESとかアホの俺でも知ってるぞな。 確かにngenは.NETの売りだろうけど起動しっぱなしのアプリじゃ大して意味ないんじゃね。 .NETのGUIはアンマネージド使いまくってるというのはあるが、eclipseに関して言えばSWTだし。
バイソンって日本じゃベガって言うんだぜ
VSはクロスプラットフォームじゃないからクリティカルな部分はアンマネージコード使い放題 それが最大の違い
話を元に戻すと、どちらもそれなりにもっさり。 VSの方が非もっさり。.NET4ならもう少し非もっさり。 もっさり許容範囲は人それぞれ。
今 C++ でクロスプラットフォーム開発したいなら Qt が楽じゃないかな QtCreator 使いやすい ターゲットがずっと Windowsだけなら VS でしょ
>>112 それはJava Serverの話
普通のPCにインストールされているJava ClientはJITコンパイルしてない
全部はされないってだけで普通にJITコンパイルしてるから
>>118 > アンマネージコード使い放題
絶対ずるいよな。
124 :
デフォルトの名無しさん :2010/09/21(火) 20:23:55
#define register 程度の次元でしかない
へえ
>>92 コアダンプはろくにデバッガが使えないようなときに大変重宝しますよ。
デバッガがあってもそれなりに重宝します。
coutで出力すると 3 となるdouble変数を intにキャストすると 2 になるのですが、 これは、double変数が極めて3に近い2.????・・・というという値で、 近似したから3になった という解釈で良いのでしょうか?
>>127 setprecisionマニピュレータで有効桁数を増やしてみな
多分3じゃない
それとscientificも忘れずに
#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じゃないはず
CodeGearのC++Builderも思い出してあげてもらえませんか…
CodeGeassのCCを思い出したお
union Foo { int a; boost::array<char,4> b; }; これは問題ないですか?
>>133 C++03では問題有り(どうあがいてもエラーになる)
C++0xでは一部制限有りだがOK(この場合、代入ができなくなる)
もし代入させたかったら、自前でunionの代入演算子を定義する必要がある。
いまどちらのメンバーを使っているか分からないため、どうやって定義するかは悩ましいところだが。
その他の型、たとえばstd::stringとかをメンバーに持ちたかったら、
明示的にunionのデフォルトコンストラクターやデストラクターなどを定義する必要がある。
>>134 > C++03では問題有り(どうあがいてもエラーになる)
ならないよ。
arrayってようはstruct { type x[N]; }にメンバ追加しただけでしょ だから struct B { char c[4]; }; union Foo{ int a; B b; }; が通るのと同じようにarraytも通る charが違う型になるとダメな場合もある
printfとwriteはどちらが早いですか。printfはリダイレクトしてます。
流石にこいつは時間からみてコピペ野郎だろ どっちにし
にしこり
使い終わった変数を使いまわすのは、どう思いますか? string s; 適当な処理 s = ""; 適当な処理
スパゲッティ化の第一歩、能無しはそれで何か節約できてると勘違いする。
STLの仕様って古いから細かいところが糞だらけだよね
>>142 transmittionってソフトのguiの書き方なんですけどね
{ string s; some_code; } { string s; some_code; }
使い終わった時点で不可視になるべき…と
それは数百行の巨大関数を作る第一歩だろ 中でスコープ切ったりしなくていい程度に関数の長さを抑える方を優先するべき
{ const int ret = ProcessA(); assert( ret == 0 ); } { const int ret = ProcessB(); assert( ret == 0 ); } { const int ret = ProcessC(); assert( ret == 0 ); } こんな感じでブロック分けたりするけど。 A,B,Cで別々の関数に分けるのも意味ないし。
C++をちゃんと解ってる人はC++で20行以上の関数を書くことはめったに無い
でもまぁ、20行を越えると数が減って50行を越えることは殆どないな。
などと妙な事を吹いていた150のその後の行方は誰も知らない。
500行超えるソース見ると、これよく理解出来るよなぁと感心してしまう。 100行超えた辺りからゲンナリして、1000行超えてるとこいつ天才かと思う(悪い意味で
50行も普通に超える。
どんなソースでも20行に軽く収まる。 #include ""
IBMの調査によると、 20行の関数5個より、100行の関数一個のほうがバグが少ない。 コードコンプリートに載ってた。
関数が小さいとユニットテストの効率が高いけど面倒なのよねぇ
結局引数を多数取る関数か 状態を維持するために一回しか使われないクラスが増えるだけなんだよな。
質問です 自分、C,C++で数値計算していたのですが そのソースやヘッダを利用してGUIを組みたいと考えています。 これまでのヘッダやソースをインクルードして GUIを出来ればヴィジュアルエディタのようなもので 生成されたコード中で、同じように使いたいのですが どのようなライブラリを使えばそれが可能でしょうか? 優先順位としては これまでの資産の利用>GUIの開発のしやすさ です。 ご教示お願いします
Qt
Tcl/Tk
163 :
デフォルトの名無しさん :2010/09/23(木) 12:54:38
実行するとメモ帳のカーソル位置から左の英単語を取得してメッセージダイアログにその取得した英単語を表示するコードって書くの難しいですか?何行ぐらいでかけますか?
何でGUIしてもこれまでの資産の利用しやすさは同じだろう
10行
ヴィジュアルエディタってつまり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);を使うとどうなりますか? よろしくお願いします。
関数は絶対20行に収めなきゃとかは思わないけど 長くなってきたら、その仕事が単一になってない兆候ではある
収めなきゃっていうか大体2,3十行もあれば事足りるでしょ そうでない場合はクラス化関数化が下手くそな証拠
20行5つより100行の方がバグが少ないという話があったが 単に関数間の依存関係の切り方が下手くそなだけじゃないのかね
>>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じゃなきゃダメダメダメという人もいるから
そういう場合は文句を言わない。
読んだのだいぶ前で忘れたけど本にもこういうこと書いてあるはずだけど…
おれは常に3だぜ std::ってタイプさせたら俺の右に出る物はいない
stdは単一の名前空間に全部ぶち込んであるから1は変なバグでる要因だよなー
>>135-136 すまん。
boost::arrayには、コピー代入演算子が定義されていると勘違いしていた。
今見たら、メンバーテンプレート関数だった。
****は****の兆候 これ聞きあきた
>>171 常識的に考えてADLが必要な時に2でそれ以外は3だろ。
namespace{ 関数 } これだけで書いてあるコードがあったんですが これじゃ無名名前空間と同じ気がするのですが、何かメリットはあるのですか?
>>154 出来ないことができるからプロを名乗れる。
5000行越えだってOK
単純に無名名前空間を使いたかったのでは?
180 :
177 :2010/09/23(木) 17:02:20
この前38000行を超えているcppを見かけた よくバグを出さないもんだと感心半分呆れ半分
変に注意力ある奴って力技でなんとかできたりするから設計に無頓着な事あるよね
関数やクラスが普通のサイズでかかれてたら、ファイルのサイズは 大きくても問題なくね?
イヤすぎw
188 :
171 :2010/09/23(木) 19:15:17
>>182 そのような感じのクラスが5つ
1万行超えているクラスが24
コメントはほとんど無し(きちんと書かれている場合は2000行前後のクラスのみ)
クラス数が全部で300ほど・・・・
そのアプリのVersionアップ作業。
そして恐怖は他にdllと外部実行ファイルが20程・・・・
>>182 wwwwww
ちょっと直して再コンパイルするのもめんどくさそうだ。
それが全部、一つのクラスのだからってんだったら、逃げ出したくなるなw
>>189 うちも似たようなもんだな
巨大なシステムだとある程度は仕方が無い
193 :
デフォルトの名無しさん :2010/09/23(木) 22:47:59
ファイル分割がきたないと1ファイルより迷惑だ
結構重要な問題だよねファイル分割って boost形式で管理してるけどこれはこれで依存性があっちこっち飛んで混乱する
問題がファイル分割なのか、クラス設計なのか、っていう点もあるんだけどね
一つの関数が一万行オーバーよりすごいものを見た事あるが 素性がバレそうなので書けないw printf()を1行追加してコンパイルかけたら半日つぶれたのは良い思い出
マ板の辞めソーススレに投下してやれよ
全部ヘッダか
199 :
デフォルトの名無しさん :2010/09/23(木) 23:55:37
マ板に昔「全部ヘッダに書くべき(キリッ」って言ってた奴がいた気がするな
機能一つに対して ルート ヘッダー ソース サブフォルダ 複数のヘッダー(ソースなし) こんな感じの構成かな ルートにあるヘッダはサブフォルダの薄いラッパーかtypedefのみのことが多い コンパイル防壁はルートのソースが引き受ける オーバーヘッドが少し気になるけどスッキリするから無理やり気にしない
ルートのディレクトリ名.(a|so)でも作れそうな勢いだな
クラスのテンプレート引数に文字列を渡したいと思い、次のようなコードを書きました。
http://codepad.org/ZUGkKE63 コンパイルエラーが出でいますが、テンプレート引数をString1からextern付きの
String2に変えるとコンパイルが通ります。
なぜなんでしょ?
206 :
204 :2010/09/24(金) 21:48:38
templateに文字列は地雷としか思えない
strがString1に置き換わってるだけだから コンパイル時に解決してるんじゃね?
204は不可解だな 誰か説明してくれんか
アドレスは外部リンケージじゃないとテンプレート引数に使えないとかじゃなかったっけ
const char * String1 = "Hoge";にしたらどうよ。
>>210 あっそうなんだ
最適化が絡んでるのかな?
>>211 それだと今度は別のエラーがでるんじゃね?
>212 どっちかっていうと ODR の方じゃないかな。
ODR (One Definition Rule) "定義は一つ"規則。 プログラム中で、一つの関数は同じただ一つの定義しか持ってはいけない。 一つのクラスは同じただ一つの定義しか持ってはいけない、という規則。 ファイル1で struct X { int x; }; と書いてファイル2で struct X { char x; }; と書いていたら、構造体Xに関するODR違反になります。 一見物凄く当たり前なんですが、template の(部分)特殊化版を使った トリッキーなコードだと、人間の気付かぬ間にODR違反に突入する恐れがあるので、 ちょびっと注意が必要です。
>>214 なるほど。
テンプレートが実体化されたものはリンク時にまとめられるんだから、
アドレスをテンプレート引数にする場合は外部リンケージを持った変数名
じゃなきゃダメだわ。
217 :
デフォルトの名無しさん :2010/09/25(土) 13:50:51
いきなりC++やる前にCを先にやるほうがいいですか?
さらっとC勉強したらC++行けばいいんじゃないの
219 :
167 :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のマクロを勉強することをオススメする
>>220 不完全型とか不透明ポインタってものがあってまぁそのあたりを調べればなんか納得がいくんじゃないだろうか
まとめると翻訳単位は 使うクラスのヘッダーファイルをみて ポインターじゃないデータのサイズが変わっていたら 再コンパイルする。 関数の定義が変わっているのは再コンパイルしない 関数が増えていたら再コンパイルする という理解であってますか?
224 :
デフォルトの名無しさん :2010/09/25(土) 16:11:44
>>223 ヘッダファイルは見にいかない。
再コンパイルn基準は内部最適化コードの差異でしか判断しない。
よって再コンパイルはされる訳がない。
まずはコンパイルn仕様から勉強しないと話にならないよ
ヘッダーファイルの最終更新日時が変わってたら再コンパイルする 定義が変わってようが変わってなかろうが何か修正したらアウト ヘッダーファイルを修正しさえしなければいい 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,´`ヽ;;;、,,,,,,___,) ヽ'-゙'"
(`ー':;;;;;;;;;;;;;;;ノ
``''''''``'''''´
コンパイルが通る と IDEなりmakeなりの動作 がごっちゃになりつつある気がするぜ
まとめると、 翻訳単位は#include Person.hのところに Person.hの内容を書いたのと同じだから、 翻訳単位に書かれている事が変化したかどうか のみで再コンパイルするか決めるという理解であってますか?
229 :
デフォルトの名無しさん :2010/09/25(土) 16:37:48
>>228 なにを言ってるか意味不明
ヘッダファイルに差異があるからコンパイルされるというのは間違いだよ
翻訳単位って言い方がなんか特別なもののように考えているようだけど、 そんなに大仰なものじゃないよ? 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が変更されたか どうか、というその一点にだけかかっている。
C++はメモリを食うからCで作れってゆうのをどこかのブログで読みました C++はC#とかVBみたいな位置にあるのでしょうか?
>>231 ちゃんとC++を解ってれば大したオーバーヘッドはない
逆にC++の機能(templateや継承、ポリモーフィズム)をCで模倣しようとすると手間もコストもC++でやるより増える
OSはCで作られてますがC++で作られてるのってないのはCがいいからですか?
C++とC#、VBは別。 C++はCとほぼ同じ。 無駄のあるコードを書けばメモリ食うだけ。 C++の方が多くの材料がそろっているから使う奴によっては無駄なことをしやすい。
236 :
デフォルトの名無しさん :2010/09/25(土) 17:09:11
>>235 嘘乙
C++の現場にいるけど、C言語しか知らない人は使い物にならないよ。
逆にVBを10年やってましたの人の方がC++のアーキテクチャ詳しかったりするし、
C言語だけ知らない人はコボラー扱い
すいません今C#の勉強をしてますかC#を極めてからC++をやるとスムーズに行こうできますか?
>>236 まあ、メモリを食うとか食わないとかって観点からの話だろ。
>>237 C#やJavaから入ったほうが楽かもね。
>>236 はあ?
そりゃVB10年やってたって他の言語にも詳しいやつだって中にはいるだろうが、
そんな特殊な例あげて、嘘とかって罵るってばかげてるだろ。
C/C++とC#,VBは全く別物。
C/C++はネイティブコンパイラ、後者はマネージドコードという中間言語
のようなものに翻訳する
で、CとC++なら、やっぱりメモリもスピードもCの方が有利。
これはもう言語が面倒みる範囲が全然違うので、しょうがない。
ただし、C++で簡単にできるようなことをCでやろうとするのは、
確かにかなり手間がかかる。
C++で簡単にできることって例えば?
242 :
デフォルトの名無しさん :2010/09/25(土) 17:27:45
>>241 stdとか
あとFlashFLVみたいなストリーミングをネイティブCだけで実装すると
手間がかかるかも知れない。
ポインタの制御だって、C++はかなり楽だけどC言語で行くと地獄を見る
>>241 例えば、文字列、配列の扱い一つとってもそうでしょ。
C++なら、std:stringだけでも、連結したり、伸ばしたりするのは、
ライブラリが面倒みてくれるし、配列もそう。
これだけだってCで自分で実装すればかなり面倒だろ。
C++が、スピード、メモリ食うのは言語のせいではなく STLの実装やコンパイラのせい。質が悪いだけ。 完璧な品質であれば(が作れれば)、大差はないだろ。
むかしはソフトウェアを極限まで早くできないかってやってたけど、 あるときから考えが変わった。 ソフトウェアの動作速度より俺らの給料と休日の方が圧倒的に大事だろう、と。 それ以来 苦情が出るまで高速化に着手しないことにした。
246 :
デフォルトの名無しさん :2010/09/25(土) 17:36:52
>>244 だから昔からC++なんかよりVBの方がよっぽど優秀って言われてきたんだろ?
STLが悪者と逃げる
>>244 はなんちゃってC++技術者なんだなww
>>244 いやあ、そうでもないよ。
やっぱり、C++は言語仕様が安全性などのためにいろいろ要求するからね。
どうしても、生成コードは増えざるを得ないし、それらを実行する負荷ってのは
どうしても発生する。
オブジェクトサイズみても一目瞭然じゃない。
そりゃ人間がみりゃ不要なコードも当然あるから、完璧な最適化が可能であれば、
最終的にCとC++がニアイコールになるけれど、そんなないものねだりしたって
しょうがないでしょ。
適材適所の材料つかえって事だ。
250 :
デフォルトの名無しさん :2010/09/25(土) 17:46:44
>>248 なるほど
専門卒=C
国立大卒=C++
ね
コンパイル時定数計算とか、コンパイル時分岐の最適化とか このへんの高速化はCには真似できないし場合によってはC++のほうが早いんじゃねーの?
>>250 日大卒の俺の友人がC++とか言ってるんだけど彼にC++が使える気がしないw
C++はクソみたいな落とし穴が一杯だから、俺sugeeモードになれる人じゃないと結構苦しんではないかと。
俺?俺は旧帝出身の別の職業に就いている。
ただの趣味グラマだからレベルは高くないけどそんな俺より彼が正直C++を使えるとは思えない。
ってチラシの裏に書けば良いのにここに書いてみる
linusはメッチャC++を嫌ってるな。
>>246 > だから昔からC++なんかよりVBの方がよっぽど優秀
俺は初耳だぞw
VBは中途半端じゃないか。
>>253 LinusはC++だけが嫌いなんじゃなくて、
C++をバカが使うのがいやなんだろうと思っている。
まあ結局 彼自身は頭良いからC言語で十分高度なプログラミングができる、
だからそもそもC++が存在するのがいけねぇんだって
結論になるからC++も嫌いなんだろうけど。
まだVB6が現役だったころ、VC++ vs VBみたいな話になると、 「VBは生産性高い、C++は高度なことができる、使い分けが肝心」みたいな 話になってたけど、VBが生産性高いのは単にVBプログラマがVBしか使えないから だよな。
CをつかうよりもC++のオブジェクト指向の部分だけ使わない方が よくね?
というか、そのころのVC++の生産性が低かったんだろ。
>>253 だってカーネルプログラミングで使えない物を外すとC99だもの
グローバル変数とか手動で処理した方が知能がいりそうだよな
実際の所、C++はパワフル過ぎてほとんどのひとが飲み込まれてるというか、機能に振り回されてるよね
>>258 いや、VB6がよく使われてた業務用のシステムとか、ダイアログに
グレープシティーのコンポーネント貼ったようなのばっかりだったから
VCでも大差なかっただろうし、内部のロジックとかC++のほうが
圧倒的に簡単に書けるでしょ。
VBが生産性高いって、VBしか使えない連中の思い込みだよ。
>>256 10年前くらいだろうけど、当時はネット環境や書籍も貧弱な中で
C++の文法、Win32API、MFCの三重苦だったからな
VBやJavaに流れがいっても仕方なかった
講義でVB使ったときにはあまりに使い辛くて画面に向かい合ってるだけで吐き気がした
>>262 VB6 の頃はだいぶましになってたけど、VB4 あたりでは VC と VB で
生産性はかなり違ったよ。
だから別に VC に移行する必要のない案件は VB のまま継続してただ
けだろ。
なぜVC++はC++と関連性が高いのにVBはBとまるで別物なんだぜ?とか言ってみる
Bといってるのは、Basicなのか、それともCの元になった言語のことか、 と突っ込んでみるw
D言語って何で流行んないの?
新しい言語の出来がどんなによくてもそれだけで流行ってことなんかない 必要性のない言語は消えていく
GCを導入したせいじゃないかな
>>268 俺達が乗り換えないから。
あと、仕様がさだまらないから一度作ったライブラリすら
無効になることが普通にあるらしく、そんなんやってられないじゃん。
Dって完成したのだろうか
それを言ったらCだって完成してるんだかどうなんだか。
C++はともかくCは完成してるだろう
275 :
デフォルトの名無しさん :2010/09/25(土) 21:43:52
完成? 蛇足ばっかりでムカデのような状況だと思う B に型を導入してコンパイラ化するところまでで「成長」はほとんど止まってるだろ プロトタイプや const については 変な話だが C++ スレなのでやめておく
完成ってどういう意味?完成してる言語の具体例は?
ふーむw UNIXのシェルスクリプトくらいかね? awkも完成っていっていいかも。
俺がD触ってたときはver1.0にすらなってなかったので 正式リリースされたのかどうかって意味だ
VBをどうこう言っている連中はVB6とVB.netがまるで別物だってことに気付いているのかね。 VB6は部品を全部自前で用意しているからWindowsの標準的な部品を使おうとすると却って使えない。 VB.netはC#の方言でしかないからVBしかやってこなかった連中が乗り換えやすいと言う宣伝文句以上の意義がない。 要は、VB6までは素人乗りで生産性が上がった気がしている連中の玩具でVB.netはC#を使えない連中の縋る石。 って、スレ違いの話ばかりではなんなのでC/C++についても少々。 実際に既存プログラムの高速化を行なっているが、処理時間の一番のネックになる重要な演算部分は とどのつまりはSSEや並列化を考慮してぎりぎりまで最適化する関係でC/C++の差の出ないコードになる。 その周辺部分はC++で保守性と見通しをよくするか、Cのまま放置するかしばしば悩むことになる。 少なくとも、充分な最適化能力のあるコンパイラを使う限りC/C++で処理時間に大きな差は出ない。
>>280 知ってるから「VB6」って書いてるんじゃないの? > VBどういう言ってる連中
つまり貴方が言いたい事はこういうことですね。 プログラムの大半を書くのが楽なRubyを使って、 効率の必要な場所だけCのコードを呼び出すと。
>>277 何を持って「完成」というかだな
ループカウンタも shell script だけでは回せなくて「完成」というわけだからな
なんで人間の作ったプログラムと人間の作った同世代のコンパイラで差ができるん
>>282 PHPがさんざんやりまくって今更感満点ですが、やりたいのでしたら歓迎します。
それはPythonの十八番
静的型チェックの無い動的型の言語は、大規模プログラム書くには心臓に悪すぎる。
Pythonで書かれた大規模プログラムが無いとな
>>289 つまり、君は、C++なんて使いたくない、と。
少なくともプログラミング言語C++第2版レベルのC++でないといやだと?w
STLとかジェネリックプログラミングなんてとんでもないよな?
静的型チェックなんてないもんな。
え、あるじゃん
?w←これ気持ち悪いからやめてくれ
C++ これもきもい
型推論と動的型の区別がつかないやつは何度か見たけど、 テンプレートと動的型の区別が付いてないやつは初めて見た。
>>291 は無知をさらけ出して自ら羞恥心を煽り興奮するタイプ
C++は完全な静的型ではありません。 ベースクラスのポインタやvoid *が。
俺と同じタイプがもう一人いるとは。 C++っつーか手続き型言語はもうダメだ。飽きたよ。最適化いい加減でとろいし。
いいえコンパイル時には完全な静的型です
void*がどうしたとか、静的動的の文脈の話題じゃないよな。 だいたい「テンプレートは動的ですね」に「いやそうじゃないだろ」って 反論されて「void*とかあるだろ」って言い返すのって、無理やりすぎる。
言い返せないからってレッテル張りとかわろっちwww
>>306 いえ
「テンプレートは動的だ」
↓
「動的じゃないだろ」
↓
「ぼ、void*があるから動的です」
すごいムリがある。
309 :
298 :2010/09/26(日) 11:22:59
馬鹿ばっかりだな C++を馬鹿がさわるのを禁止しよう 選ばれた人間だけが使うべき言語だ
void*もreinterpret_castするなら静的(何が?
Python使いの心臓は強い、まで読んだ
C++は言掛りのつけられやすい言語
だって複雑過ぎてよく分かんねーんだもん
実行するまでわからないエラーばっかりの言語とかマジキチって思うわ。C++最高
テンプレートのエラーも長ったらしい上にああ、そこかーーーってエラーが多いけどね
どこだよーってエラーが多い 誰か何とかして
つstatic_assert
319 :
316 :2010/09/26(日) 11:35:43
なるよ ぜんぜん違う
俺なんて自分で作ったやつ使ってるだけでわけわかめエラーが出るのに… orz
エラーの分かりづらさはあるけど 慣れれば速攻特定できる つまり俺はそれだけエラーを書いてきたってことですよ
C++なんて実行すればSEGVの連投。
>>309 いや
「動的型は大規模開発には向いていない」
↓
「C++も、ぼ、void*があるからだめだね」
でもムリがありすぎだろ
もー基地外は放っておけよ
負けたものをいつまでもグチグチ言ってんな。 「で、でもムリありすぎだろ」って。
C++の一番の問題は、入門書だろうなあ。 ちゃんとした考えが身につく前に使えちゃうからどんどん勘違いする。
スクリプト言語の方がはるかに使えちゃうと思うが
まずPythonで作ってprofilerかけてボトルネックだけC++で作り直す方法で 生産性が30倍になりました
>>328 何でも良いんならそりゃスクリプトに行くでしょうよ
いざC++やらにゃとなった時の話だよ
C++は詳細なコーディング規約を作っ徹底させないとプロジェクトで使い物にならない
コーディング規約程度じゃダメで、この人の方式が最高って人を決めて、とことん合わせないといけない気がする
>>330 C++はあれだけど、動的型の言語は信者が言うほど生産性高くないと思ってる。
静的型の言語+IDEがいい。
C++には広く使われている一つの標準的なコーディング規約もないんだな。
>>334 IDEとか言っている時点でド素人臭しかしない
vimだろうそれでも漢かよ
>>334 動的型だからとかじゃなくてPythonだから生産性が高いんだよ
いまどきソース管理ツールを使ってないと恥ずかしいってのは 常識になってると思うけど、そろそろIDEくらい使わないと 恥ずかしいってのも常識化してもいいころだよな。
vimでもIDEでも生産性なんて変わらねー。でもVCのIDEのが賢いと思う。
マウスに手を伸ばす時点で生産性は悪い(キリッ!
便利だからって理由でC++の機能を使いまくってると絶対破綻するからなあ このへんをきっちり抑えた概念的な入門書とか無いのかな
俺は C++ とスクリプトの両方使うけど簡単な使い捨てはスクリプトばっかりだな ただ、入り組んだものはC++の方が安心感ある ディフェンシブにコーディングしやすいからかな その人次第なんだろうけど
高度なIDEを作りづらいのはC++の言語仕様だよね。 そんな特殊なプラットフォーム挙げてもらってもね〜。
googleの規約って有名だけど割と変わったパターンだよね
つーかスクリプトで生産性が高いってのは 糞長いコンパイルが無いからってのが重要だろ
せやなw
標準機能と言語の寛大さの違いからくるコードの長さの違いじゃないの? boostが標準で初心者に簡単に扱えるなら生産性はぐっと上がると思う。
STLを熟知してないとC++を効率的に使うのは難しい おれゆき
例外の有用な使い方のtipsってないのか? Boost.Exceptionとかあるぐらいだし巷で言われるようなただの糞ってわけでもないと思うんだけど ちょっと調べただけじゃなんか例外はうんことかばっかで「使うな」以外の結論がでてこない
10年前の話かよw
>>349 そうだboostの前にSTLがあった orz
ExceptionalC++だって10年近く前のネタだし もっとこうBoost.Exceptionとか徐々にコンパイラ拡張で入っているC++0xの特性を使った 新しいやり方の例外処理についてのネタとか知りたいと思うわけで
結局、分野によって問題になりやすいバグの種類も違うだろうし(必要になる機能も違うだろうし) 全分野で統一した規約ってのはなかなか難しいのかもね。
もっとも良くできた規約は 「C++の使用を禁止する」というものだ 嘘みたいだけど本当なんだぜ
ばかじゃねーの
言語以前だな 一番良いのはプログラムを書かないこと
こんなクソ職業はドカタにやらせて 自分は就かないってのが一番いいんじゃないかな。
C++は設計からしてマルチパラダイムなんだから コードの書き方の流儀が複数でてきていいと思うんだけどな。
おれは農業とプログラマーを見下す人間を信用しない。
正直向いてないと思うけど今更会社辞められないし頑張るしかないよね
職業がクソなんじゃなくてお前が腐ってるだけだよ。 マより辛い仕事なんて世間には山ほどある。
自殺のリスク考えたら プロアルピニストくらいやばそう
>>362 山ほどあるならとりあえず10個ぐらい挙げてみてよ
ハローワークにあるほとんどの仕事。
>>362 > 職業がクソなんじゃなくてお前が腐ってるだけだよ。
いや俺はマなんて仕事についてないし。
もっともうけの良い職業についている。
どちらかというとマに書かせる方。
マ板でやれ
char a[4]; reinterpret_cast<int&>(a[0]) = 0x11223344; これは何か危険性があったりしますか?
アラインメントの問題があります
(sizeof(char)*4 == sizeof(int))がtrueかは環境依存
strict aliasing rule?
>>371 sizeof(char) == 1
はC++をまともに実装している環境では絶対に成り立つが、
(sizeof(char)*4 == sizeof(int))が成り立つとは限らないのは確かである。
ではコンパイル時分岐させるなどして
(sizeof(char)*4 == sizeof(int))が成り立つ環境においてのみに
話を限定する時、
>>368 は本当にだめだと言い切れるの?
共用体にしとけばいいんじゃね?
*.cppに静的な非メンバ関数が書いてあるのですが、 なぜclassに参加させないのですか
書いた本人にしか意図は分からんが クラスにメンバを書き換えないことを保証できる。
379 :
377 :2010/09/26(日) 20:39:19
>>377 非メンバを禁止すればオブジェクト指向になるというのは妄想。
union { int n; char a[sizeof(int)]; }; こうすればいいのか。まんどくさいな。
>>377 静的メンバ変数を宣言した場合
その実体の定義をクラス定義の外側に記述しなくちゃいけないとか
そういうことをいってるのじゃなくて?
>>381 変換のために使うならエンディアンを考慮すればだけど
>>350 なんで例外使わないなんて結論になるの?
そんなんじゃ new も使えないの?
コンストラクタの失敗どうすんの?
>>381 そんなことしても結果に移植性が無いことに変わりは無いよ。
期待してる動作を素直にビット演算で実装するべき。
newが失敗したら問答無用でアウトなものでしかやったことないんだけど 普通はすべてのnewの失敗例外をハンドリングしてるものなの?
今時の仮想記憶を使った環境でnewが失敗するような状況って エラー処理しても続行できる気がしないよな。
Cでmalloc()のリターン値もチェックする必要ないんじゃね? って言っても 同意してもらったことがない。
>>388 mallocは戻りをチェックする必要がある。
newは例外を投げるので戻りをチェックする必要は無い。例外をキャッチするかは用途に合わせてご自由に。
チェックせずに強制終了するよりも、 メモリが足りませんってエラー出した方が 「よく分からんエラーが出たぞ!!どうにかしろ!!」 って怒られる現実
391 :
デフォルトの名無しさん :2010/09/26(日) 22:49:03
失敗が絶対に許されない案件では まず全量の資源を確保して 話はそれからだな
>>391 全量の資源が確保できなかったら失敗じゃん
そんな状況もnewが例外を投げればプログラムぞっこー可のー
でかいリソース確保するときだけチェックすればいいんじゃないの
397 :
デフォルトの名無しさん :2010/09/26(日) 23:06:14
>>393 仕事を受けてしまってから「ダメでした」というのと
始めから「無理です」というのは違うぞ
>>389 newが例外出すってのは知ってる。
new失敗するような状況でまともなリカバリムリでしょって話の流れで。
あとlinuxとかmalloc()のリターン値をチェックしてもメモリの 確保に失敗したか成功したか分からんって話もあるな。
なんかチェックするかしないかというようなくだらない話をしてる人がいるが、 チェックした結果のエラー通知に例外を使うべきかどうかという話じゃなかったのか?
最初に全部メモリ確保って無駄多すぎてやばいでしょ 失敗する確率増やしてどうすんの
ならば他に途中で絶対に失敗しない手段をあげてみたらどうよ
>>400 いや、newに失敗するような状況で、どうせまともなリカバリできないでしょって話。
>>401 最初にメモリ確保できないような環境はサポート外とすれば何も問題ない。
ようは失敗時どこまで元に戻さないといけないかって問題だな。 戻したい状態に戻せるリソース量と速度の兼ね合いで決まる。
その最大メモリってどうやって計算すんの?
主にロジックに依存するんじゃないの?出したい速度、戻したい状態にもよるけど
最初に確保するって 自前のアロケータ使ったりするの?
アロケータかどうかは知らないけどメモリ管理はするよ。自分でコーディングしたことはないけど。 とくに32bitだったら特殊な管理しないとできなくない?AWEだかPAEだか3文字のなんか。 仮想メモリ使い切るようなロジックを考えるなら最大メモリも計算できないようなロジックを選択 すべきではないと思うけど…
411 :
デフォルトの名無しさん :2010/09/26(日) 23:54:14
>>406 本当は、それの標準化が欲しいところなんだが
メタボ化ばかりにお盛んで(ry
つーかクライアントが使う最大メモリ量なんてわからなくね? 可変長コンテナとかいちいち最大値を定数で持たせて、 すべてのコンテナが最大値をとったと仮定してメモリを取るの? でもこれだとすごい量が必要になりそうだよね
大規模になりそうなロジックはある程度の長さに分割して処理するべきと言ってるだけ。 小さいやつなら何だっていいじゃん別に。
>>412 家庭用ゲーム機などでは本来はすべて上限を設定すべきだけど。
しかし最近の希望的観測プログラマーはやってないことも。
>>412 想定するハードウェアスペックからスワップしない程度のメモリ使用量を決めてその範囲内で動くように設計するけどな。
>>377 普通にその.cpp以外のファイル.cppで使って欲しくないってんじゃない?
ファイルスコープに限定されているって話だよね?
417 :
373 :2010/09/27(月) 00:24:56
>>376 何がなんだか分からな…
いやつまりは
> chBuf[2]のアドレスが奇数に配置されていた
こういうことがあり得るのが問題だ!ってことですか?
>>376 じゃないけどそうなんじゃない?
最近のCPUは知らないけどアラインメントに気をつけないとバスエラーになるのは
インテル以外では結構普通だった。
419 :
373 :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
エンディアン依存だけどアラインメントは問題ないよ
エンディアン依存・・・私の勉強不足です。 すみません! もうreinterpret_castっていつ使うために存在しているんですかね。
組み込みシステムとかなら、整数をアドレス値にキャストするとかあるんじゃない
先生!なんでアラインメントに問題がないのかよく分かりません。
new char [N]はサイズがN以下のすべての型のアラインメントに一致するアドレスを返すって規格があったようななかったような… operator newなら確実なんだけど…
>>399 メモリの遅延割り当ての話?
mallocの時点では実際には確保されずに
メモリに書き込んだ時点で確保するんだっけ。
426 :
421 :2010/09/27(月) 01:05:21
>>425 メモリが欲しいっつってmalloc/newしてんのに
迷惑な話だよな、それ
いつも思うけど
>>427 仮想記憶では普通だとおもう。
物理メモリに割り当ては随時だろうけど、予約だけはされてるんじゃないのかなとか思う?
mallocのmanにはっきりと「バグ」と書いた上に散々扱き下ろされてるし、 普通というわけでもないような
ではWindowsでもmallocで取った新しいアドレスにアクセスしてると途中で突然死んだりするの?
linusが悪いの?
mallocとcallocの引数が異なる件について
>>431 そんなことは起きない。mallocがVirtualAllocを使って実装されてたとすると、物理メモリはアクセスされるまで割り当てられないが、領域は仮想領域に予約されているのでメモリ不足にはならない。
>>431 mallocでちゃんとNULLが返るはず
436 :
431 :2010/09/27(月) 02:15:47
>>432 mallocってCの標準関数でシステムコールじゃないしkernel関係ないんじゃないの?よく知らないけど
>>434 予約するだけじゃプロセスの仮想アドレスが割り当てられるだけで実体はなく、アクセスした際に
仮想メモリ全体の空間がなくなれば同様に落ちるんじゃ…
>>435 それならいいんだけど。
HDD側にもちゃんと領域が予約されてるってことじゃないの
スワップも含めて、本当にメモリ不足になったらOOM killerが発動するんだろうけど、 どのタイミングで走るんだろう。 大きすぎるmalloc要求?それとも遅延割り当てされた領域へのアクセス? mallocの時点でメモリ不足だとわかるなら 割り当てを失敗させればいいだけだから後者なんじゃないかな。
MEM_COMMITをつければ物理領域に割り当てが来るんじゃなかった?物理メモリの割り当てとは別に
>>437 うーん、よくわからない。ページファイルと二重に確保してるってこと?
>>438 なぜだーー前者じゃないの?
>>439 コミット付きなら分かる。予約って言ってたからそれだけだと思った。
441 :
440 :2010/09/27(月) 02:42:28
mallocのVirtualAllocにMEM_COMMITが付くってことならつまり Windowsでは実際に仮想メモリの実体まで確保しているってことだよね。 それならmallocでOOM時NULLを返せると思う。
442 :
440 :2010/09/27(月) 02:54:02
>>438 言っている意味がようやくなんとなく分かった。つまり予約しただけの空間に実体を割り当てたときに
プロセスを落とすケースはいつかって話だったのか。mallocのときはエラー返すだけで済むから
後者だけってことだね。
>>431 ,434,435
Linuxだけどちょっと試してみた。
メモリ1GB。スワップなしのLinux上で
mallocがNULLを返すまで1MBずつ割り当て続けたら
実メモリを越える2.8GBあたりまで割り当てられた。
その後0埋めしていったら、
855MBほど書き込んだところでOOM killerにkillられた。
callocでも試してみたけど、どういうわけか同じ動作。
444 :
431 :2010/09/27(月) 03:44:28
>>443 おお、Linuxで実際に試してくれたんだ。ありがとう。
mallocについては想定どおりの結果だね。プロセスの仮想アドレスの内
ユーザー空間目一杯まで予約できて(32bitですよね?)、仮想メモリの実体の
限界までアクセスできて(確保できて)足りなくなったら落とされる、と。
callocについては知らない。個人的に同じ動作に違和感はないけど。
callocは0埋めあらかじめしてるようなものだから不思議がってるんだろうよ
446 :
440 :2010/09/27(月) 04:08:32
>>437 これの意味もようやくなんとなく分かった。プロセスの仮想アドレスの予約だけでなく、
ページファイルにも確保でなく予約をしているのではないか?ってことか。実際に実体が
必要になったときに物理メモリを確保できればするが、できなければ予約したページ
ファイルの領域を使用すると。サイズ的には確保しているのと同じだけど処理は速く
なって、デメリットもない。WindowsのVirtualAllocが予約の際にそこまでしてくれて
ればmallocでコミットまでしなくてもいいのか。
>>445 初めて知って意味を把握しました。 orz
/dev/zeroを指定してmmap()してるから、メモリにはまだ触ってないということかな
ちょっとcallocしてstraceしてみましたが、mmapで指定されたfdは-1でした。64bitですが。
結局、移植性を確保しつつ安全にメモリを確保する方法ってあるの?
プログラム開始時に必要分mallocして全て0埋めする
>>283 完成=言語として枯れている状態
削除される機能もなければ追加される機能もない状態
Linuxでなら、/proc/meminfoを見れば
その時点でどのくらいまでメモリを割り当てていいかがわかる。
その値に応じてsetrlimitとかで仮想メモリの量を自主規制すれば
mallocがちゃんとNULLを返してくれるようになり、
>>443 のみたいな無茶な割り当てはせずに済む。
>>451 > 完成=言語として枯れている状態
それは短絡的すぎないか。
>>448 MAP_ANONYMOUS を使ってるんだろう。これでもゼロ埋めされた領域になる。
456 :
デフォルトの名無しさん :2010/09/27(月) 19:24:23
template< class T > T Endian( T val ) { char* const byte = reinterpret_cast<char*>( &val ); std::reverse( byte, byte + sizeof( val ) ); return val; } エンディアンを入れ替えるのはこんな感じでいいですか
ダメです
今日は自分がやりたいと考えていた、プログラミングをやっているコードを見つけた 何て最高なんだ
そのコードバグあるよ
応用的な質問なんですが、 囲碁とか将棋には詰め碁とあるじゃないですか? そこで詰めC++を作りたいので ルールがわかりません。 おしえてください。
>>461 >そこで詰めC++を作りたいのでルールがわかりません。
「作りたい」からですよ。「作りたい」と思うのをやめればきっと判ります。
詰めC++が少しだけわかったので報告します。 例 使用できる変数 a b c 使用できる構文のfor3回 while4回 使用できる演算子=3回 +2回を使って 3*24+5を計算しなさい こんな感じでいいでしょうか? 解きたいのでどなたか問題だしてみませんか?
stlのコンテナの要素を別のコンテナに移動したいんですがどうすればいいですか?
ループで代入すか。 だよね。連続してるわけじゃないし。
はじ〜
コピー演算子が使えないとは知らなかった。
class内で配列を初期化したいのですが static const int a[3]={1,2,3}; とか書いてもエラーになります。 どうやって初期化すればいいですか? 環境はvisual studio2008です。
class X { public: static const int a[3]; }; const int X::a[3] = {10,}; こーゆー感じ
静的メンバになってるけど大丈夫なのか?w
ちなみに、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);//開放
>>443 callocで同じなのは、多分初めて使う時に0クリアされるってことなんだろうな
いまどきVC6で開発しなければならない職場ってのは、ポインターも理解出来ないアホがいるわけか。 納得。
__stdcallって言おうとしたらそれ以前の問題か
キャストが思いっきりおかしいし、どこから持ってきたハンドルなんだよとか
operator HINTERNET() もおかしい
そういえば、何で変換関数を明示的に呼び出しているんだよw
フルボッコですな
484 :
475 :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 については、調べている最中です。
>>463 > 使用できる変数 a b c 使用できる構文のfor3回 while4回
> 使用できる演算子=3回 +2回を使って
あのな
詰めxxxにはこういう条件は不要だ
最短手順以外は正解ではないのだ
>>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);
487 :
475 :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);
ぜんぜん。 WinInet以前の問題すぎる。
490 :
475 :2010/09/28(火) 21:17:41
勉強してきます。 ありがとうございました。
別のDLLから持ってきたHINTERNETを渡してるわ、 CHAR *を無理矢理WCHAR *にキャストしてるっぽいわ、 なんの説明もないm_lpclFtpConnectionだのT_FtpPutFileWだの持ち出してるわ、 おかしくない行見つける方が難しいだろ
呼び出し規約が正しくなった。 他は全部退化した気がするが。
std::string は at() や[] でアクセスするとchar&を返すわけですが、 私は std::string& を返す方が良いのではないかと感じてしまいます。 これは、もし私がオリジナルのstring型を作るなら、 string型の値を加工した結果をstring型とすることで 文字処理中に別の型のchar型を意識する必要を無く(減ら)そうとする 設計にするだろうと考えたからです。 しかし、std::stringがそうなっていないのは、 上記の私の考え方が間違っているからだと思うのですが 問題点はどのようなものなのでしょうか?
std::string&を返したとして、str[0] = 'a'はどう処理されるんだ?
そもそも、リファレンスで返すということは、 わざわざオブジェクトを動的に確保しなければならないのか? static変数や一時変数では無理だからな。 で、誰が解放するんだ?
内部にインデックスを保持して []でそれを更新して自分をリターン 代入もオーバーロードして… まあできてもやらんわこんな糞仕様
string s = "hello"; s[2] = "world"; cout << s[2]; ってやると何が出るんだろうなそれ
文字列をコピーする事に伴うオーバーヘッドが気になるなら、 CStringを見習え。
QStringもおもしろ動作するよ
OreStr s = "hello"; s[2] = "***"; // s == "he***lo" s.range(2,5) = "[world]"; // s == "he[world]lo" みたいな
pythonのStringっぽいな
>>503 それ便利だな。
是非そのクラスをboostライセンスで公開してくれ。
配列の先頭と要素数を引数に取るような関数はよく見るけど、 void Hoge(int* array, int num); void Hoge(int array[], int num); どっちが推奨なんでしょうか?
演算子 new, delete のオーバーロードの仕方を教えてください。
509 :
475 :2010/09/29(水) 18:07:13
昨日、皆さんから頂いた情報のおかげで、 解決することができました。 ありがとうございました。
>>508 特定クラスのnewとdeleteのオーバーライトはしっているが、
デフォルトのnewとdeleteのオーバーライトはどうすりゃいいんだ。
おしえてエライ人!!!
#define new NEWでおk
void * operator new (std::size_t size, Arg arg) { ・・・ }; これでいいよ
>>507 どっちも意味は全く同じ
下のほうが「配列の先頭アドレスを渡す」という意図がはっきりする程度
>>513 てことは自前のアロケーターを使いたい場合はこれを書いたヘッダでもインクルードしてやればいいってことか。
>>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をも満たすって相当苦しいよな…。
std::array<int, 5> a; std::array<int, 5> b; // 離れた場所で static_assert(a.size() == b.size()); のようなことをやりたいのですが、a, b は定数式ではないのでコンパイルできませんよね。 size()なんてテンプレート引数をそのまま返すだけなんだから定数扱いしてくれてもいいのに。
>>517 >そうだとしても
> s[2] = "***";
>これが元のsに反映される様なoperator=なんて定義できるんだろうか。
OreCharがOreStrへの参照と位置を持っていればいいのでは?
最近の学生はProxyパターンもしらんのか
>>519 > OreCharがOreStrへの参照と位置を持っていればいいのでは?
確かに−。
そしてそのメンバを読んであげればいいのか。
ありがとう。
>>520 すみません
趣味グラマなもので。
そうなると、Aは行けるから、@とBを両立させる方法だけが残った問題か・・・。
素直にinsertとreplace使えよと
んなくだらねーことにマクロ使うなボケ
stlのコンテナでイテレータが無効になっているかどうかを知る方法ってあるんでしょうか?
>>518 N3126では
constexpr size_type size();
となってるのでコンパイルできると思う
VC++6.0なんてもう無くなってしまえばいいのに
アロケーターというのはSTLの要求を満たしたクラスのことだぞ。
STLの要求を満たしたクラスってなんかもっと言いやすい名前付いてないの?
あ、
>>515 に対してのレスね。
>アロケーターというのはSTLの要求を満たしたクラスのことだぞ。
>>529 「要求」ならば、英語ではrequirementとかconceptなどと言うんだが、
英語でも結局、これらの名詞に対して、「満たす」に該当する動詞を使うわけで、一言で言い表す言葉はないんじゃないか。
その「要求」に対して、アロケーターとかイテレーターとかコンテナーとか名前をつけておいて、
「ある型Tはアロケーターである」などとは言えるだろうけど。
STL compatible とかでいいんじゃね
STL風
STL勢
似非STL
STL臭い
なんでstlのネームスペースがstdなの?気持ち悪い
スタンダードテンプレートライク=>STL
STL like -> STL
stdはSTL専用の名前空間ではないぞ 標準ライブラリ全部 (printfとかiostreamとか全部) の名前空間だ
スタンダードテンプレートライクなんだからstdtにしてほしい
wcscmpがstdの中に無い環境もあるんですけどwcscmpは標準ライブラリ扱いではないんですか?
なかなか準拠度の低い処理系をお使いのようで。
>>541 C++ならstd::wstring使おうぜ
wchar関連は中途半端なんだよ。 charとその文字列をクラス化(typedef)したstd::stringならともかく、 ワイド文字を扱いたかったら各環境独自が用意している文字列クラスを 使った方が結局の所移植性が出て来るという 本末転倒な事態が多い。
std::stl::vector この方が綺麗だったような気もする。 だが、考えようによっては std名前空間内は標準以外もう誰も入れないのだから、 名前の衝突などを恐れなくていいから むしろ無駄にタイプ量を増やす結果になるな。
stdとcstdぐらいは分けろって思った
>>544 結局、wchar_tってのは、規格上で、
「wchar_tは、ひとつのオブジェクトで、その環境で表現可能な任意の一文字を表すことができる」
なんて非現実的な定義がされてるから問題なんだよ。
机上の空論というか、現実を見ていなかったというか。
そんな文字コードの規格、当時はおろか、現代ですら存在しないのに。
namespace STL{ #include <vector> using ::std::vector;}
wchar_t は UNICODE が広まる前に規格制定されたので、許してあげてくださいね。
>>508 やりたいのはどれ?
- 引数を追加した ::operator new のオーバーロードを定義する。
- 特定のクラスとその派生クラスで使われる operator new を定義する。
- デフォルトの ::operator new を再定義して置き換える。
>>510 あぁ
>>550 の最後の奴でいいのか。
グローバル名前空間に void* operator new (std::size_t) を定義すればいいよ。
必要なら対応する void operator delete (void*) throw() もね。
サロゲートペアまでだったら、wchar_tを32bitにすればいいと 思ってたけど、結合文字とかあるからどうしても一文字が 可変長になってしまう。 C#みたいな新しい言語は、length()みたいな長さを返すメソッドは、 物理的な長さじゃなくて文字数を返すようにして、char型は 廃止して、length() == 1の文字列を一文字にすればよかったのに。 現状stringとstringinfoを組み合わせないと、文字列操作が正しく 処理できないとか、中途半端すぎる。 IOのときにはどうせencode, decodeをかますわけだし。
>length()みたいな長さを返すメソッドは、 >物理的な長さじゃなくて文字数を返すようにして、 メモリアロケーション、どうする気?擬似コードだけど memory_alloc( length( string_data) ) みたいにしたいでしょ?
size()!=length()でsize()はバイト数で返すとか。
.NET だと System.Globalization.StringInfo でエレメント単位の処理ができるな。
length() なんて曖昧な名前イクナイ byteLength(), charLength(), codePointLength(), graphemeClusterLength() にしようぜ
長さは要素数でサイズはブロックサイズ。これって常識じゃなかったのか
>>553 文字の操作がstring内で完結してれば物理的な長さを意識する
必要なないのでは。
クラスの内部ではもちろん、物理的な長さと両方もってる必要あるけど。
>>556 文字列クラスにはbyteLength()みたいのはいらないのが幸せだと思う。
IOのときはC#みたいにエンコード、デコードで
string←→バイト列 の変換をかますようにして。
>>557 length: 要素数
size: バイト数(ブロックサイズ?)
常識的にこうなってるってこと?
少なくともC++の常識ではないな。STLとかsizeで要素数だし
別の言語ならそうなっていても不思議ではない
C++標準は色々と常識知らずだからあてにならんw
お前の頭の中の常識はもういいから
『私の頭の常識』 Now Showing
たぶん、strlen、wcslen、sizeofとかにおける語の用法から 脳内で勝手に常識が形成されたんだろうね。
よく宣言と実装は分けろって話がありますが クラスの関数が今後追加する可能性が高い場合 ファイルを分けて記述する(コンパイル時の)有用性は落ちるという考えであってますか (可読性が落ちるというような話は無しで)
分けたほうがビルド時間はお得だよ
566 :
デフォルトの名無しさん :2010/10/01(金) 19:50:43
つまり、クラスに何を持たせるべきで何を持たせるべきでないかがはっきりしてないってことだろ まだ有用性がどうのという段階ではない実験なら原則1ファイルがやりやすいと思う
使いまわす予定のない関数なら、.cppの中に、宣言も実装も両方 書いても問題ないよ。
ただ予定は無くても、ついつい使いまわす事になるからできるなら 初めから考えておいた方が良いと思うけどね
俺が過去のコードを再利用する時は 継承とかテンプレートとかみたいな美しい方法じゃなくて コピペが多いんだけど、みんなもそんな感じ??
美しく書きなおしてから再利用しろよ
コピペとか無いわー
>>569 ライブラリに分類して、そのフォルダーを参照させて使うようにしてる。
574 :
569 :2010/10/02(土) 00:20:36
>>573 結構綺麗じゃん。
あれ?俺だけ??wwww
コードの量や種類にも依るんじゃないか? 小さくて独立してない部分なら俺もコピペする時あるよ ある程度まとまった単位になると(大きさだけじゃないけど) まとまってなければ、まとめることを考える
まず同じ機能が標準ライブラリで実現できるようになっていないか検討するところからだな。
似たような記述があったらそれらをまとめてひとつにするよ。クラス化したりテンプレート使ったり
何でもかんでもまとめりゃ良いってモンじゃない そんなことしてると、何のためにあるのか不明瞭な関数やクラスが量産される
それはまとめ方がヘタクソなんだろう
自分が作ったライブラリを使用したことがない
自分で作ったのは対象ごとに微妙に変わってしまうしな 依存してるもの全ソフトを更新とか無理だし、互換性なんて維持できないし
配布されている良く寝られたライブラリの方が使い勝手もいいしな でも、そういうライブラリが用意しなない特定用途向けの小物は自分でライブラリ化する。 俺ライブラリ化しておけば後に採用したライブラリへの移行時にも役に立つし
そういう小物は小出しにできるほど独立してないと使いにくいので 結局ライブラリにはしないでソースファイル単位で取り込んじゃう。
スターティックライブラリーじゃなくても ダイナミックライブラリーじゃなくても ソースファイルで取り込むのもライブラリーというよ。
うーん、そういう言い方はしてこなかったしコピペとの対比だったからなぁ。
ライブラリファイルにするとウィンドウズでしか使えないじゃん
ライブラリは移植性考えると普通はヘッダオンリーになるよね
移植性なんてそんなに気にする事かいな?
どうせ糞なものは移植する需要もないし
インラインにするかどうかって移植性は関係なくね?
別のプロジェクトにファイルを持って行くことを「移植」と称してると予想してみる
新しい移植の定義がここに生まれました。
趣味プログラマでバージョン管理システム入れてる人居ますか?
質問の意図をちゃんと書け。小出しにするな。
プログラマなら短く書くべきだ
TortoiseSVNでネットワーク接続してるHDD上にリポジトリ作って定期的にコミットしてる 複数の人間からアクセスするにはちょっと怖い使い方だけど、どうせ自宅でアクセスするのは俺だけだし手軽だし
リポジトリの履歴が汚れるとやだなとか考えてしまうような人にはsvnは向かない
>>593 入れてるよ
ある程度コード書くなら必要だよ
ファイル単位の rcs 位でもいいから
>>598 ブランチで細かくコミットして、区切りでマージ、ブランチ削除で問題ない。
個人でもバージョン管理入れとくと便利だし、コミットなんて負担にならないし
>>600 それリポジトリのルートでsvn logすると思いっきり全部見えるよね。
そういうの一切残したくなかったりすと延々とコミットしなくなって無意味状態に。
後からでもコミットを改竄し放題のgitの方が向いてるんだろうけどWindowsだといろいろとアレだし。
それはお前がアレな人間だからじゃ
「Javaよりはまし」
2chで一々句点を打ってるあたりに病的な神経質さを感じる
便利そうだな、俺も入れてみよう
コミットちゃんとしないとすげー怒られる会社思い出す
SVNは便利。
ビルド通らないコードをコミットして放置する人いるよね
そういうときの為のバージョン管理だろうが
ここちょっと弄りたいけど今の状態も残しときたいな的なことにはRCSを併用している
そりゃバージョン管理してもコード書けない人が 書けるようになるわけじゃないからね
なんでstructとclassが今あるような実質まったく違わないものじゃなくて PODかそうでないかにしなかったんですか?
「javaの方がマシ」
>>612 D&E 76ページ。
禿は複数のコンセプトを作りたくなかったとのこと。
曰く、(実際はだいぶ違うから原書読め)
もし、structが「Cとの互換性のため」であり、classが「C++の新機能」であったならば、
プログラマは二分して宗教戦争を始めてただろう
ひとつのコンセプトであれば、伝統的なCスタイルのプログラミングから、
C++スタイルのプログラミングに、容易に移行できる。
0xff000000みたいな数値を256回メモリーに書き込む命令はない?
つーかclassキーワードなんていらなかったよね
自分でも何言ってんだかわかんねぇんだろう。 既存のCのコードはstructを使っている筈で、これはPOD。 新しいコードで非PODならclassを使うのなら対立しようがないが。
格納じゃなくて書き込むだからねぇ writebackを殺すところから始めないとな
>>615 Linux限定でiowrite32_repとか。
無いなら自分で作ればいいじゃない
structとclassのもともとの意味は知らんけど、使い分けはできてるよな。 ただのデータの塊はstruct、抽象を提供するのがclass
データーセット以外でもstruct使いまくるし。TMPで特に 最初はデーターか否かで分けてたけど、今はもうどうでも良くなって 最初の継承かメンバがpublicかprivateかどうかしか見てないわ
なんだその糞設計
設計関係ないしwww
確かに設計以前の問題だ
C互換性以外でstructかclassかで迷う人って何も見えてない間抜けだよね
タイピング量で言ったらclassがラクダよ。
統計的にみて継承はpublicであることが多い だからstructのほうが平均タイプ量で得する
assが打ちにくい
バカじゃねーの
賢かったらPGなんてやってませんよ
#define class struct #define private public #define protected public の3文を入れるのがタイプ量軽減に最強だな。
>>630 でも template は <typename T> じゃなきゃ嫌だ。
template <struct T>はなぜだめなのか
というか、どうして全く同じ意味のキーワードが2つあるのだろう?
とりあえず禿のせいにしておけばいい
>>634 こういうギリギリPGが寄ってたかって味方してくれる訳か。
641 :
368 :2010/10/05(火) 00:22:37
書き込んでから「本当にそうだっけ?」と思って仕様を確認してみたら、 > There is no semantic difference between class and typename in a template-parameter. わざわざ「意味の違いはないよ」と書いてある。 なんで2つ必要なんだ? どこぞのコンパイラが作った既成事実を追認でもしたのか?
正しいかはわからないけど、リファレンスの内部表現はポインタのそれと 違うかもしれないって聞いたけど大丈夫?
>>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
};
>>642 違うかもしれないというより、同じかもしれないという仮定自体が間違い。
>>643 そこは typename じゃなきゃコンパイルできないじゃん。
>>645 TがBならclassでもコンパイルは通る。
647 :
デフォルトの名無しさん :2010/10/05(火) 09:37:00
>>646 なるほど。でもそこであえてclassにする意義ってなんだろう?
C#みたいに型引数に大きな制約をかけられるってんならわかるが、
組み込み型のみ拒否できる意義とは?
なんでC++は型にはこだわるのに修飾子は大雑把なんだぜ?
649 :
デフォルトの名無しさん :2010/10/05(火) 13:32:17
型はCPUの中で決まってるから
やっとポインタ理解した
やっとポインタ理解した(つもり)
理解したと思った瞬間、理解していないことが分かる。
class A { private: int size; public: int size() { return size; } }; Javaだと通るんだけど… "再定義; 以前の定義は 'データ メンバー' でした。"というエラーが出るんだけどC++の仕様? 回避するには、ユニークな名前にしないと、ダメ?
ダメ
>>654 > Javaだと通るんだけど…
C++は異世界です。
名前の勉強をしてください。
Javaには(メンバ)関数ポインタがないから、メソッド名が単独で現れることがないので。
ありがとうございます。 class A { private: int size; public: void setSize(int size) { this->size = size; } int getSize() { return size; } }; みたいにしなければならないんですね。 とりあえず、元のソース書いた人間を恨みます。
かえってJava臭くなったのはなんでなんだぜ。
get set という解決策を作るとはびっくりだ。
アクセさが必要=設計に問題がある とか言い出す輩が登場
本物のプログラマはクラスメンバを隠蔽しない。
ならばJavaや.NETのライブラリ群は全滅だな。 そういえばアクセッサうんぬん厨はいたね。
>>658 とりあえず、
int getSize() const {return size;}
の方がいい
>>664 constつけると、呼んだときに副作用がないことを保障するんだっけか?
うん、setアクセサは引数にconstをつけて、 ついでにメンバ変数名とは違う名前にしといた方が安全。 void setSize(const int value) { size = value; } さあ皆さん、宗教論争の始まりです。
本格的にJava => C++に移植するの初めてなんですよ。 遮蔽や継承するので、アクセサメソッド経由にしたいんです。 C++のリファレンスのような書き方知らないんで… Java臭くなってしまって、ごめんなさい。
sizeをsetできるっていう発想が不気味 少なくとも素直にsizeに代入しただけで終わるはずはないと思う
const修飾子ですね。気を付けます。
>>666 さん
一応、intel C/C++ コンパイラ / MSVC / GCCで確認したのですが、
そのへんの変数のスコープは、大丈夫みたいでしたよ。
>>669 まあそうなんだけど、アクセサを拡張するときに間違いのもとになる。
おそらく、何かのサイズを変更する関数が単なるメンバ変数の書き換えで
済みはしないだろ。機能を追加することになるはずだ。
そのときのための保険をコストなしでかけられるんだから、かけといて
損はないだろ?
const参照戻しって出来ますか。 出来る場合、 const int& test(); って感じでいいんですか? 急いでいます。お願いします。
内部のハンドルを渡す参照はconstで戻さないといけないのは基本だろwwwwwww
>>671 良いけど、
メリットデメリットくらいちゃんと勉強しろ。
特に無効な参照になってないよな?
まさかと思うけどメンバ関数じゃなくて普通の関数でローカル変数への
参照を返しているとかいうバカじゃないよな?
675 :
671 :2010/10/05(火) 18:10:33
いえいえ、かなりのレベルまで達しています。 STLのmapのfindでデータを見つけて、そのイテレータを使って値を返そうと したときにconst参照で返したいなと思っただけです。 mapにデータはあるので、ローカル変数扱いじゃないでしょうから、 消滅してる可能性はないと思ったのでね。 偉そうなこと言って間違ってたらすみません。
676 :
671 :2010/10/05(火) 18:12:09
あ、ありがとうございました。
>>675 > STLのmapのfindでデータを見つけて、そのイテレータを使って値を返そうと
> したときにconst参照で返したいなと思っただけです。
なんでそう思ったのかよく分からん。
まさかイテレータをコピー渡ししたくないなんてバカじゃないよな?
イテレータを戻すくらいなら値の参照戻しの方が100倍マシ。
>>678 それはさすがに勉強不足すぎだろう
いや別にお前の会社が傾くだけだから好きにしてくれていいんだけど。
680 :
671 :2010/10/05(火) 18:25:20
>>677 いや、テンプレートを使ったmapのクラスを作ってるんです。
このクラスは色んなクラスで使って、こいつはそのクラスのメンバとして持たせるつもりです。
その際に、mapに登録したデータを取り出したかったんです。
イテレータがpだとしたら
*pを返り値にしてあげて、そのデータを受け取った側も一応データを変更できないように
constをつけておこうと思った次第であります。
わざわざイテレータを戻すメリットや如何。
682 :
671 :2010/10/05(火) 18:26:57
イテレータを戻すという表現はおかしいですね、イテレータが指し示すデータを戻したいと思いました。 すみません。
683 :
681 :2010/10/05(火) 18:28:39
急いでるんだかなんだかしらんけど自分でちょっと試しにコードかけば分かる問題だろ……
これだけの議論で十分 良いコードが書けたと思うのは 俺だけじゃあるまい
686 :
671 :2010/10/05(火) 18:34:12
>>684 そうでしたね。めんどくさいので良くやってしまいます。すみませんでした。
ありがとうございました。また来ます。
687 :
671 :2010/10/05(火) 18:35:32
>>685 おめでとうございます。頑張って下さい。
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:::::::::::::|
689 :
671 :2010/10/05(火) 18:36:48
それでは、ありがとうございました。
何もしなくても map<...>::value_type::first_type は const の筈だけど
const_iteratorが起き上がりこっちを見ている
http://codepad.org/0R0vN5sg ☆ チン マチクタビレタ〜
マチクタビレタ〜
☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < 値が必要なのにイテレータを戻すメリットまだ〜?
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 愛媛みかん |/
693 :
671 :2010/10/05(火) 19:43:26
>>690-691 const_iteratorの存在をすっかり忘れてました。すみません。
でもconst_iteratorにした場合って、返り値の部分はどうかけばいいんですか?
pがconst_iteratorだとして
int& test()
{
return *p;
}
と値を返した場合、この関数を使用して値を受け取った側はこの値を書きかえれない
ようになっているのでしょうか?
constなしでも書きかえれないようになっているということですかね?
>>692 のリンク先にconst_iterator を返すコードがあるけど、冗長なだけだよ。
695 :
671 :2010/10/05(火) 19:58:57
>>694 すいません。これウイルスだと思ってました。
私がやりたいのはイテレータを返すのではなく、値が変更できないように
const状態で値を返したいんです。
添字でのアクセスじゃなくて、イテレータで(*p)とかで値を返す場合は、
そのイテレータはconst_iteratorだろうが、iteratorだろうが、
かならず戻り値の表記としては、
const int& test()のようにconstは必要なんですか?
それとも、const_iteratorの場合は戻り値にconstという表記はいらないのですか?
>>695 値を返し、かつmapを書き換えられないようにしたいなら、普通に値戻しすればいい。
int test()
{
p->second;
}
という具合。さらに戻した値の変更まで禁止したければconstを付けてもいい。
いずれにしても、関数が戻すのは値のコピーだから、mapは書き換えられない。
697 :
671 :2010/10/05(火) 20:11:37
>>696 ありがとうございます。
すいません。マップなのでp->secondですね。ボケてました。
実は値戻しすると結構大きい構造体を返すときにオーバーヘッドが発生するので
参照を使いたいなーと思ってたんです。
なので参照をつかった場合はどうなるのかと思って質問しています。
よろしくお願いします。
const参照でいいよ
699 :
671 :2010/10/05(火) 20:16:18
>>698 const参照でいいですかね。
ありがとうございます。
MFCで GetFocus() の返り値のCWnd *をdynamic_castして、どの種類のコントロールに フォーカスが行っているかを調べたいと思っています。 エディットボックスを選んでいるかどうかなら CEdit *e = dynamic_cast<CEdit *>(GetFocus()); って感じで、後はeがNULLかどうか調べれば・・・と考えていたんですが、 どうやら常にキャストが失敗しているようなんです(フォーカスがエディットボックスにあっても失敗します)。 原因は何故でしょうか?こういう形でオブジェクトの型を判別するのは不可能なんでしょうか?
MFCのCWnd*からCEdit*のキャストならDYNAMIC_DOWNCASTの方が確実じゃないかな。
ちょっと煽られただけで顔真っ赤とかw
俺なんか煽られてもいないのに顔真っ赤だよ
熱出たかな。
>>700 その手のMFC実装のお陰でC++を間違って理解しかけた初心者の頃の俺を思い出す
MFCはダウンキャストが保証されてる不思議環境だからなぁ CEdit *e = (CEdit*)GetFocus(); だけで普通に動いちゃうと思うぞ
多重継承不許可なんだからダウンキャストがホイホイ出来るのはそれほど不思議な話じゃないと思うんだが
でも親クラスが持ってないメソッドを呼び出したらどうなるん?
デーン
714 :
デフォルトの名無しさん :2010/10/05(火) 22:54:37
型を自分で管理するとか謎の現象が起こっている。
>>710 MFC以外は保障されてないの?
型が分かってればそういうダウンキャストも平気かと思ってたけど。
ほっとけ、ただのマルチだ
720 :
702 :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です。
721 :
700 :2010/10/05(火) 23:14:00
>>720 やっべ間違えた、↑の名前欄の702は700の間違いです
マルチうぜーぞ
>>720 IDC_EDIT1に対応するCEdit型のコントロール変数を追加してみろ。
GetDlgItemの戻り値が変わる。
何を言ってるのか わからねーと思うが(ry
WNDCLASSでEDITやボタン作るしくみ知っていれば不思議な挙動ではない
726 :
700 :2010/10/06(水) 10:36:53
クラス内で関数や変数にstaticをつける意味を教えて下さい。
クラスオブジェクトと深い繋がりが有るケド インスタンスオブジェクト情報は不要な関数や変数に適用します。
意味がよくわかりません。もう少し具体的にお願いします。
インスタンス化しないで使えるってことが大きいのでは
グローバルな変数にstaticをつけて、局所的に使用するのとはまったく意味が違うってことでしょうか?
>>730 インスタンス化しないで使えるっていうのはこういうことでしょうか?
class TEST{
public:
static void tesutodayo()
{
cout<<"あほ!";
}
というクラスがあったとして、このヘッダをインクルードしたファイルがあったら、
TEST Test;
Test.tesutodayo();
ってしなくても
TEST::tesutodayo();
って感じで呼ぶことができるってことでしょうか?
文法的な意味を聞いてたのか
それなら
>>731 で合ってる
スコープがクラス内になってるだけで
いや
>>731 であってるじゃなくて
static 変数みたいなもんって解釈であってる
なんだかよく分からなくなってきたんですが、
ローカル変数にstaticつけて、静的変数にするのと同じって意味ですか?
それともグローバルな変数にstaticつけて、局所的に使用するのと同じってことですか?
あと、インスタンス化しないで使えるっていうのは
>>732 みたいなことで
いいのでしょうか?
>>710 その変換はできるけど、それは保障されていないだろう。
ボタンにフォーカスがあるときにそれを実行したらどうなる?
HWND e = GetFocus();
たとえば定数とかグローバルに放っておくのと
std::function<void()>とかいうコードみたことあるんですが、 このfunctionの使い方について、詳しく説明してるサイトがあったら教えて下さい。
>>743 う、英語ですか。日本語のページがあると嬉しいんですが。
ちなみに0x環境って何ですか?
簡単な説明と使い方を教えてくれてもいいです。
vectorなどのコンテナを制御するクラスをテンプレートを用いて作成した場合で、 その型をユーザ定義型(構造体)などを型にした場合、その型特有の処理をさせることってできますか? たとえば、 template <typename A> class TEST{ typename vector<A> test; }; こういうクラスがあったとして、 このテンプレート引数をある構造体にしたいんです。 このクラスで下のような関数を作って、値を返したいんです。 でもテンプレートクラスを実体化するまで型が決まってないので、 こんな書き方してもコンパイルエラーがでます。 何かいい方法はないでしょうか。 int TEST::call() { return test[0].data }
>>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;
}
>>745 質問の趣旨であろう「その型特有の処理」の意味がわからん
テンプレートの特殊化のことか?
それとコンパイルエラーは関係ない
× int TEST::call()
○ template<typename A> int TEST<A>::call()
部分特殊化しようとしたけどうまく行かんねえ・・・ 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; }
こうしちゃうと重複定義になっちゃうしなあ 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; }
>>747 わかりにくくてすいません。
言い方が悪かったです。その型のメンバを呼び出すが正しいです。
例えば
strucct ABC{
int width;
int height;
};
っていう構造体があるとして、こいつをさっきのクラステンプレートに渡します。
まあ、ここまではうまくいくんですけど、
>>749 の方がやっていただいてる通り、インスタンス化するまでは、
まだ型が決まってないので、このテンプレートクラスの関数には
下記のようにそのメンバのwidthとかが書けないんです。
まだ型が確定してないからだと思います。
template <class A, class B>
B TEST<A, B>::call() // エラー
{
return test[0].width;
}
int型とかだと、そのまま書けば値は一つしかないのでできますが、
構造体になると、構造体の型によってそのメンバって変わってきますよね?
これをクリアする方法をお伺いしたかったのです。
無理でしょうか?
struct A { int x; }; template <class T> struct X { A a; int func(void) const { return a.x; } }; 普通に呼べるよ
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); } };
>>744 boost::functionでぐぐれば日本語も見つかるからそれで頑張れ、ものすごいおおざっぱに言うと関数ポインタみたいなもんだ
0xはc++0xでぐぐればいい、これもすごいおおざっぱにいうとvs2010で使える機能みたいなもんだ
>>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; };
755 :
750 :2010/10/06(水) 20:38:41
できました。皆さんありがとうございました。 絶対無駄にはしません。 本当にありがとうございました!
>>754 やっぱりその手しかないよね
明示的特殊化
Cのキャストは使っちゃだめですか
あれって明示的特殊化なの? explicit instantiationじゃないの?
当然です
だって template <> と書いたらexplicit instantiaionじゃないじゃん
operatorの引数名の定番としてlhsやrhsがありますが、 同様にコピーコンストラクタの引数名の定番はありますか?
コンストラクタの初期化リストでベースクラスのメンバは初期化できない。 ってことで合ってますか?
>>764 そうだよ
初期化リスト中でベースクラスのコンストラクタを呼び出す
こんな感じだな しかし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(); }
標準ライブラリがmoveを使うよ やったねC+ちゃん!
>>754 だと例外的なクラスが増えるたびにTESTを拡張しなければならないから気持ち悪い
>>752 にデフォルトのGetを加えたものが良いと思うな
>>752 程度の回答でよかったのか
構造体内に違う型が混在していてそれをテンプレートでコンパイル時に仕分ける方法を
探しているのかと悩んでしまったぜ
こういう問題にはtraitsを使いなさい メンバ関数の特殊化はおすすめできない コードが汚くなるだけじゃなく部分的特殊化で問題が生じたりしてめんどくさい
>>772 >
>>754 のやり方はコードが汚いし、型が増えるたびに拡張するのはよくないので
> やめました。
そもそもテンプレートとしてなww
>>771 boostの件についてはありがとうございます。
こんなことができるとは。反則ですね。
非常に助かりました。
>>745 の件については、
>>751 のやり方でいきます。
ソースコードはもらっておきます。
変数にstaticつける利点は分かったんですが、 関数にstaticつける利点がわかりません。 これはクラス内での話しですが、クラス内関数にstaticをつける利点に ついて分かりやすく教えてください。
そのクラスのインスタンスがなくても呼べる。
>>776 つまりその関数はpublicで指定するしかないってことですよね?
性的メンバ変数を操作するための関数みたいなもんですよね?
別にprivateでもいいよ 例えばfriendからなら呼べる
あとクラスにコールバック関数を仕込める
みなさん、BSがノーベル賞受賞しました、 ってことになったらどう思う? 同時受賞者もでるのかな?
他のメンバ関数(非static含む)からでも呼べるよ
783 :
デフォルトの名無しさん :2010/10/07(木) 16:19:57
visual C++ 2010 Expを使ってシリアルポートの通信プログラムを 作っていて、BCD構造体という使いたいのですが、 BCDという識別子が認識されません。 これを使うにはどうしたらいいのでしょうか? 作成中のプログラムはwin32コンソールアプリケーションで すべてC言語で書いています。 <stdio.h>、<stdlib.h>、<windows.h>をインクルードしています。 windowsでのプログラミングは初めてなんで見当違いな聞き方かもしれない ですけどよろしくお願いします。
>>783 それを使うのに、必要なライブラリをいれろ
785 :
デフォルトの名無しさん :2010/10/07(木) 16:22:07
なるほどよく分かりました。ありがとうございます。
>>785 知能っていうライブラリだけど君持ってないよね
789 :
デフォルトの名無しさん :2010/10/07(木) 16:27:48
いいえ生きます
なるほど!friendつけるのって、 自分のクラス内にアクセスさせたい関数につけるって考えたほうがいいですね。 たとえば、WinMain関数をクラス内にfriendつけて、宣言しちゃえば、 WinMainからそのクラスのメンバにアクセスできますもんね! なーるほど。
Linuxでwindowsのプログラムが動くwineってソフトがあるんだ。 それに乗り換えれば、やさしいLinux開発者か何でも教えてくれるよ。
795 :
デフォルトの名無しさん :2010/10/07(木) 16:39:55
Effective STL の第39項に「述語を純粋関数にしよう」とあります。 これ自体は容易に納得のいくことなのですが、今日 std::count_if を使いながら ふと思ったのです。 述語をラムダ式で書くとき、変数のキャプチャを行うことが多いと思いますが、 変数のキャプチャを行ったラムダ式は純粋関数と言えるのでしょうか? というか、ラムダ式を述語として安全に使える条件とは?
キャプチャしなくても関数じゃありません
↑afo
ああはいはい、「ラムダ式」じゃなくて「ラムダ式によって暗黙に構築される 関数オブジェクト」と言えば満足ですかね?
C++ではラムダはサポートされてません
C++は関数型言語
術語ってなーに?
ふと気になったんだけど、 C++は、int* array = new int[1024]; とやった時、配列の中身0クリアされている? Cで mallocした時とかは、補償されてないけどさ。
クラスかprimitiveなintとかかによって違うんだよね?
配列 new や malloc ではゼロクリアされない。 STLのコンテナで、要素数を指定できるコンストラクタを持ってる奴なら、 全要素をデフォルトコンストラクタで初期化する。
C++0xで初期化させる配列newとか出来ないの? あとクラスなら MyClass* arr = new MyClass[1024]; これでもデフォルトコンストラクタで初期化されるんだよね?
memset()で0クリアすりゃいいじゃん
値初期化したいなら new T[...]() とすればいい
>>808 YES。
> C++0xで初期化させる配列newとか出来ないの?
むしろ組み込みの配列を使うと警告が出るくらいでいいと思う。
C++は恐ろしい言語やで・・・
>>810 この構文を最初に知ったとき「きめぇ」って思った
良かった。確保後のゼロクリアは無駄じゃなかったのか。 仕様を確認しておかないと…、コードの使い回しや移植を考えると不安だよね。 0クリアされている物と前提しているコードあるらしいし。 意地の悪いlibcでも作って、遊んでみると面白いかも
javaとかだとオブジェクト指向とかばかり言って、 ロジックよりも構造ってイメージがあるわけですが お前らはどう思いますか
819 :
808 :2010/10/07(木) 22:47:56
malloc()やらnew int[]の結果がゼロクリアされてる前提で 書かれてるコードもいやだし、そんなコードを想定して とりあえずゼロクリアしてだましだまし動かしてる状況も悲しいものがあるな。
後半がイミフ
>>819 >double型では困りません?
目的がわからん
Cのcalloc()も単に0クリアするだけだったろ?
そもそもIEEE754準拠なら0クリアで0.0になるし
後からmemset()してもstd::fillかstd::fill_n使ってもいいし
IEEE754準拠なら0クリアで0.0になるのか、知らなかったぜ。 整数型だけかとおもてた
>>817 偉そうなごたくはどうでも良いが、はっきり言って Java で書くのは
C++に比べてかったるい。
主観的かつ実用面だけの意見だが所詮道具だから。
>>824 0の状態で符号ビットを立てると -0.0 という奇妙な数になる
何の役に立つのかわからんけど
そうやっていろんなあり得ない値をポインタ経由で代入してprintf()してみたもんだ
ものすごい長い数字になった事もあるしあれは多分printf()の想定外の数が
入力されたからだろうな
大抵は+NANか-NANになってしまう
>>826 ありがとう。
そういう遊び心がだいじなのか。
すいません。 thisポインタの型ってどんな型ですか。教えてください。 voidとかintとかの表記で表してください。
>>827 大事かどうかは人の価値観次第だけど、今時のコンピュータは大抵何を
やっても壊れない(HDDのフォーマットとかセクタWriteは別だよ)のでC/C++の
内部がどうなっているのが調べて見ると興味が沸いてくる
それとコンパイルしたソースのアセンブリ出力を読んでみるとかな
やっぱりわかったからもういい
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の値ごとに別々の関数が作られることになるのだと思いますが、 関数内部での定数による分岐などは消えてなくなるのでしょうか?
833 :
832 :2010/10/07(木) 23:32:43
ごめんなさい。関数定義に&はいらないっすね。
Cでもswitch文の構文を使って気持ち悪い文はいくらでも書けるしな こういう自由度の高さがウケているんだろうなあ バグの温床でもあるけど
switchをブロックを使わずに書くとひどいことになる
switchとifとforをごちゃ混ぜにしてもコンパイル通るもんなあ
よ〜しパパcaseをはさんでループ書いちゃうぞ。
>>832 最適化の可能性を置いとけば
普通に分岐処理を行うわな
見た目の問題でそうしたんだろう
でも普通はbindにしないかなぁ
てかなんでそういうことしてんのにswitch残したんだろうか 半端だな もっとがんばって消せよ
普通に特殊化でいいよな
単なる分岐のためにindexを使っているならちょっと弱いというか、もったいない。
switch(index) { case 1: 〜; case 2: 〜; case 3: 〜; break; case 4: 〜; } みたいにbreak有り無しが入り乱れてたら特殊化するより楽かも
特殊化するくらいなら別々の関数でよくね? ON_CONTROL_RANGEがイヤになってテンプレートに置き換えてみたとか そういうことじゃないのかな。
ある8ビットのマシン用のCのサブセットのセルフコンパイラが #ifディレクティブがサポートされていなかった。 どうするかというと実行されない文のコードを生成しないので 普通のif文でやるのです。 僕と同じマシンの同じコンパイラが頭に浮かんだでしょうか? 昔のPC板で会いましょう。
847 :
デフォルトの名無しさん :2010/10/08(金) 00:46:56
>>796 引数以外の状態に依存するから純粋関数ではないと思うよ
でもさ、ラムダを使う条件ということだが、純粋関数がどうとか気にする必要ないんじゃないの?
多分ムーブするんだろうから
それに何年も前にboostをはじめとする手法でアルゴリズムに
純粋関数以外のものも突っ込んでいるわけで、
メイヤーズの2000年初頭の頃の指標には例外が存在していることは
認識しておいたほうがいいと思うけどね
メイちゃんはどこでも大人気
>>796 純粋関数は「ある式の評価結果が常に等しく、副作用がない」関数のことだから、
キャプチャしたのが変数の参照でなければ、あるいは参照であっても、
評価期間を通じて値が変化しないことを保証できるなら、
少なくともその評価期間において、そのラムダ式は純粋関数だと考えてよいのでは?
すいません。WIAPIの質問になるんですが、 timeBeginPeriod関数で精度を上げたいと思うんですが、 これを呼び出すタイミングって ゲーム開始時に呼び出しといて、 ゲーム終了時にtimeEndPeriodを呼び出すだけでいいんですか? それともFPS制御をしてる処理部分だけをこれらの関数で囲めばいいんですか?
::new( _NORMAL_BLOCK, __FILE__, __LINE__ ) ていうコードをdefineしてるコードを見たんですが、 これは何をしてるんですか?
>>851 通常の new と比べて追加で3つの引数を持つ new を使うようにしている。
引数の内容から考えて、メモリリークを検出できるデバッグ版の new と
考えられる。
・・・っていうか crtdbg.h のやつか。
>>853 newをオーバーライドしてるってことですか?
いいえ違います
>>846 普通じゃね?
よくマニュアルを読んでみろ、コンパイラとプリプロセッサが別のコマンドはよくあること。
Aていうクラスがあるとして これを動的確保するときに new A()ってやつとnew Aっていう括弧がないやつがあるんですが、 何が違うんですか?
コンストラクタとデストラクタって必ずpublicにする必要ありますか? privateとかにすると、クラスを宣言することすらできないんですが・・・
プライベートでもプロテクテッドでも構いませんよ
>>859 privateにしてもいい
単に可能ってだけじゃなくて、わざとそうすることもある
どういう時かはぐぐれ
でもprivateにするとアクセスできませんって言われるんですが。。。
友達の彼女のマンコに直接指を入れることは出来ないだろ それと同じだ
で、できればもうちょっとわかりやすく説明してほしいです。。。
直接彼女の友達になれば入れられる
言いたいことは分かるがその理屈はおかしいwww
そのクラスにpublicでstaticな関数を作ってそこでnew してポインタ返すとか firendつかって別のクラスとかで作れるようにしたりとか そういう方法で作ったりできる
彼女のfriendになればセックスできるということでしょうか?
やってみれば分かる
フォームアプリケーションのテキストボックスの値を cppファイルの方から参照するにはどうすればいいの?
ある基底クラスをfriend使って、あるクラスのお友達にしたら、 その基底クラスを継承してる派生クラスからもアクセスできてしまうってことないよね?
スマートポインタはmallocの返すポインタでも使えますよね?
freeを呼ぶデリータを指定すればいいだけ
>>872 boostやC++0xのshared_ptrみたいなカスタムデリータを
指定できるスマポでなら使える
>>873 それどうすれば良いんですか?
コード例クレクレださい
ggrks
mallocで得たポインタをshared_ptrに渡すのは特別な場合以外では 全くお勧めできない。デリータ指定し忘れてもコンパイル通るから ましてや既に提示された情報からググることも出来ない人には正しく 使うことはぜったいムリムリムリムリかたつむりよ
なつかしいなかたつむり
stl用のアロケーター自作したいんですが、これってオブジェクトは空じゃないとダメですか?
>>880 空でも無くてもいいよ。
アロケーターで確保したメモリは、確保したのと別のインスタンスのアロケーターでも開放できなければならない。
よって空の実装が多くなるね。
>>881 別のインスタンスでも開放できないといけないって初めて知りました
どうもサンクスです
おい、嘘を教えるなよ。
ほんとだよ
正直質問の意味が分からないからどっちでもいいや
「アロケーターで確保したメモリは、確保したのと別のインスタンスのアロケーターでも開放できなければならない」 どこに書いてあるんだよ? こんなこと
ggrks
class A{ protected: int a,b; }; class B : public A{ }; っていう二つのクラスがあったとして、 クラスBのインスタンスを二つ作った場合、aとbは共有されますか?
もちろん
>>889 new A() ; は初期化子として()を記述している。よって値初期化される。
new A ; は初期化子を省略している。よってデフォルト初期化される。
>>888 共有?
staticメンバ変数ならば共有されるけど、非staticなら別々でしょ
どこが嘘なんだよ
まずPODなのか非PODなのか明かせ
非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; }
staticメンバ変数って絶対初期化する必要あるんですか?
>>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;
}
C++0xでPODの定義変わるんだよね。。。
>>901 ありがとうございます。
PODってのはよく分からないですが、VCでやったらゼロ初期化されませんでした。
PODなら()をつけたらゼロ初期化されると覚えておきます。
>>881 Allocator requirementsを読んで出直してこい。
>>897 結果だけでモノを言うんじゃない。
>>902 定義は変わっても意味は同じ。
単に細分化されただけ。
>>903 だから規格票読めって
PODは()を付けた時のみゼロ初期化
それ以外は何もしない(領域のみ確保)と覚えておけばよい
もちろん非PODでデフォルトコンストラクタが定義されていた場合はそれが実行される
サンプルコードでPODはどこ?
907 :
デフォルトの名無しさん :2010/10/08(金) 23:18:02
staticメンバ変数って絶対初期化する必要あるんですか?
>>907 staticストレージの有効期間を持つ(あまり馴染みのない言い方だが)オブジェクトは、
あらゆる初期化の前に、必ずゼロ初期化されると保証されている。
使わなければ初期化しなくてOKですよ
ありがとうございます。 初期化するときってグローバル領域でする必要があるじゃないですか。 そこで初期化しなかった場合実体が作られないんですよね? その後実体を作るには普通にクラス内で値を入れれば実体化されるんですか?
>>906 ほらよ
class A {
int i;
public:
A() {}
A(int j) : i(j) {}
void print() const {
std::cout << i << std::endl;
}
};
struct B {
int i;
};
↓続く
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; }
用語がめちゃくちゃだな。意味もあやふやだし。 なんだよ「グローバル領域」とか「実体化」って。 staticストレージ上に構築されるオブジェクトは、プログラムの開始からすでに存在している。
すいませんでした。気をつけます。ありがとうございました。
>>905 これマジかよって思ってideoneでコードを書いて確認してみたら、
ゴミが入らなくてどっちも0で確認できなかった。
codepad使え
>>915 そりゃdeleteしてすぐnewしても同じ領域が割り付けられるとは限らないからな
ガチガチの処理系依存だよ
どこに?なのかが?
stlアロケーターの要求してるinit_page_size()って何に使うんですか? これって4Kbyte固定でいいんですか?
多分これだろ §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.
なにが?なのか説明しる
ポインタ型(あるいはそれを模したイテレータやスマートポインタなどの型)の変数から *演算子で値を得る行為をなんと呼べばいいでしょうか。 「デリファレンス」だと思っていたんですが、実際口にしてみたら通じなかったもので…… どういう言い方が一般的なんでしょうか。 int x = 100; int *px = &x; int y = *px; // ← ココ
dereferenceが唯一のただしい言葉だ。 「デリファレンス」は所詮、鮨をSushiと記述するのと同じぐらいの正しさでしか無い。
>>927 一般的には「ポインタの値をとる」とかいっちゃうかな?
ポインタの値とかいうと、アドレス値をさしちゃいそうな気もするけれど、
Cでプログラム書く場合、アドレスがいくつであるかってのは基本的に気にしないから、
それで通じちゃう。
ま、デリファレンスで通じないのも辛いところだがw
便乗するけど、int *px = &x; この行為は何という? "reference" でいいのかな。
間接参照?
>>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; }
>>933 C++0xを使う。
C++0xならば、関数内クラスをtemplate argumentに渡すことが許されている。
C++03では、関数内クラスはtemplate argumentに渡すことができない。
#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; }
936 :
935 :2010/10/09(土) 10:07:25
>>935 ですが、
このソースでクラスBを継承したCから、その静的メンバであるaのdisp関数に
アクセスできません。
Bを継承したCからなら、protected領域にあるaにアクセスしてその
disp関数にもアクセスできると思ったのですが、できないのでしょうか?
>>934 ありがとうございます。
そうですか…ちょっと検討してみます。
>>936 お前は何を言っているんだ。
当たり前じゃないか。
そのコードでは、A::dispにアクセスしているのはmain関数だ。
class Cじゃない。
そのコードを通したかったら、class Aに
friend int main(void) ;
という宣言が必要だ。
940 :
935 :2010/10/09(土) 10:48:54
>>939 そういえば、そうですね。
friendの定義を勘違いしていました。
友達にした関数から呼べるって意味でしたね。ありがとうございます
941 :
935 :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; }
942 :
935 :2010/10/09(土) 10:55:32
クラスC内の関数からa.disp()を呼び出すことができるんですが、 何故でしょうか? 友達にしてるのはクラスBなのですが、クラスCの関数内からクラスAのdispが 呼べてしまってます。
943 :
935 :2010/10/09(土) 10:59:54
すいません。わかりましたのでいいです。 勘違いしてました。
>>937 は
>>933 への回答?
それでよさげだけど
dereferenceは「参照剥し」とか言われてた時代がなかったっけか?
いや、今でも参照剥がしって言うよ。
ふつう、参照先取得だろ。
>>947 参照剥がしってしっくり来るし必殺技ぽくってかっこよくね?
「参照剥がし」だとコピーが行われているって感じが出ない。 あとなんか、「剥がす」っていう言葉を聞くと羅生門の情景が目に浮かぶ。
参照剥がしたら実態が行方不明になっちゃうイメージ 実体化とかがいいと思う
実体化じゃ、インスタンス化と区別つかんと思うが。
c++ って ちんこぷらぷらの略ですか?
サブクラス Application* Application::self() { return (Application*)KApp; } スーパークラス static KApplication *KApp; self()は安全ですか?
スーパークラス、サブクラスの用語の使い方が間違っていると思うが…
安全とかいう以前に、インスタンスが作られない。
957 :
954 :2010/10/09(土) 14:17:21
安全じゃないです
>>954 の内容をエスパーするに、
class Applcation : public KApplication の定義がどこかにあるんだろう。
960 :
954 :2010/10/09(土) 17:37:44
>>960 普通に考えるというか、好意的に解釈してやれば、というところか。
KApplicationはサブクラスだろ。
dynamic_cast汁
/*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というエラーが出て進めません。 どこを書き直せばいいですか?
&lfが違う
scanf
>>968 C++とC言語って別の言語だから、Cオンリーのコードなら
C言語スレに行った方がいいよ。
理由:
1. せっかく専用スレがあるから。
2. C言語はほぼC++に取り込まれているが、だからといってC++スレで
聞いたからにはC++にしか通用しない文法や標準ライブラリやクラスで
で返されても仕方ないことだから。
親クラスに無理矢理Cスタイルのキャストでダウンキャストして 存在しないメンバ関数呼び出したらエラーダイアログが出て来たorz
親クラスにダウンキャストって何言ってるの?
template classを使うときはTest<ClassName> t; <ClassName>は絶対に必要なんですか?
言いたい意味がわかっているか不安だが、必要ない たとえば template <class T> T sqr(T x){ return x*x; } int n(30); cout<<sqr(n)<<endl; みたいなので OK 試せばすぐわかる
それは関数テンプレートや。
>>975 必要ない。C++は賢いから推論で自動的に最適なClassNameにしてくれる
一々指定するって馬鹿らしい
979 :
975 :2010/10/10(日) 00:14:58
boostって広く使われているんですか? パッケージ管理システムを調べると、boost関連のパッケージが全くインストールされていません
うーん… OSSで広く使われているか、と言われると、どうだろう? そもそもOSSだとC++で書かれているものが少ないので、その中でboostを使っている、 となれば、さらに少なくなるな。 ちなみにFedora13で依存関係を調べてみたところ、boostに依存しているものは一つも なかったw でも、boostはテンプレートライブラリで、外部ライブラリを必要としないものも多いので、 実態はソース全部調べてみないとわからんけどw
boostを嫌う人は結構いる 主な理由は「俺が分からん」「依存するライブラリが増えるのが嫌」「テンプレート重い」など
プラットフォームによってライブラリのファイル名が違っていて 可搬性のあるMakefileが書けないとかいう話は聞いた
>>983 boostの中身のヘッダー名では書かなくてもいいだろう。3カ月おきにfullメイクすればすむことだし
ヘッダじゃなくてライブラリって書いたんだが・・・
ライブラリのことだったか。boostはincludeするだけで自動でライブラリファイル名のリンク指示してしてくれたはずだけど もしかしてVCだけ?
うん
VC以外は書かなくっちゃいけないのか。 可搬性考えなくてもあんな長ったらしいらいぶらり名書くの大変じゃん。デバッグ版とかリリース版とか
そんな程度の事を理由として「使わない」という判断するような無能 が俺の近くに寄ってきませんように(祈
使いたいけどコンパイラの問題で使えなかったりするわ
誰でも便利さのわかる BOOST_FOREACH あたりから徐々に混入させていくんだ。
shared_ptr スマポ良いよスマポ
まず、scoped_ptrだろ。 あとはtupleとか。 それから、lambda便利だぞ
ヘッダだけのライブラリにしちゃえばいいのにねぇ。 lambdaは現実に仕事で使っているやつがいたら うらやましいけどおいおいってなる。
boostって使うのは簡単でいいんだけどさ 個人使用でないもので実際に使うとなると知識不足が気になっちゃうんだよね なんというかただ使うだけだと速度とのトレードオフが見えないというか かといってコード見て使ってると得した気分にならんし
うちは VS2010 に切り替えたから、ラムダ使い放題だよ。 むしろ高階関数があるのにラムダがなかったのが異常だったんだ! 今はまだ俺しか使ってないけどさ。
>>991 0xが策定されたら淘汰される急先鋒では
boostなー、ただでさえtemplateはリンク長くなるから注意しないといけないので、なかなか厳しい 0x実用化してくれたら良いんだが、だいぶ先だろうなあ
わ〜次スレ〜
FCDが出たはずなのにガンガン仕様に手が入れられてるんですけどー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。