1 :
デフォルトの名無しさん :
2010/06/02(水) 20:20:13
2 :
デフォルトの名無しさん :2010/06/02(水) 20:22:03
相変わらず洋書と訳書ばっk(ry
関数ポインタより関数リファレンスのほうが中の人は最適化しやすいですか?
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
崇り神の格をみて村人の程度を知る。
カンマ演算子って使ってる? Hoge & operator = (const Hoge & h) { if(this == &h) return *this; Hoge(h).swap(*this); return *this; } ↓ Hoge & operator = (const Hoge & h) { return this = &h ? *this : Hoge(h).swap(*this), *this; } みたいな感じで行数減らせるようになって俺としては気持がいいんだけど… あと意味的に連続してるような a = aa; b = bb; c = cc; みたいなばあいは a = aa, b = bb, c = cc; にした方が自然言語っぽくて見やすくない?
> Hoge & operator = (const Hoge & h) { return this = &h ? *this : Hoge(h).swap(*this), *this; } これ , *this 要る? this = &h ? *this : Hoge(h).swap(*this) だけで十分な気が。 > if(this == &h) return *this; > this = &h ? *this : ... 条件が変わってる気が・・・。
一行一動作に慣れてて、カンマで処理増やすと混乱するなぁ。 ブーリアンはやいよブーリアン。
>>9 参照にしとけばヌルチェックが省略できるかもね。
前にも質問した物ですが。 zipの中のzipの中を探索するライブラリないですか? 解凍をせずに直にzipの中のzipを扱いたいのですが。
ファイル名か、ファイルポインタを受け取る部分を、 ファイルの範囲を受け取るように拡張したらいいのですが。自前だと大変です。
時々参照はnullにならないというレスがあるけど void f( int& i ) { printf( "%p\n", &i ); } int *p = 0; f( *p ); VC8, g++3.4.5 で普通に 0 と表示される。 規格ではどうか知らないけど。
>>14 使ってるぜ
while ( c = fgetc(fp), c != EOF )
template<typename T>struct S0;template<typename T>struct S1;template<typename T>struct S2; // 諸々沢山作るつもり template<typename T,typename SX=S0<T>>struct A; template<typename T,typename SX>struct B{ template<typename Tany,typename SXany>B(A<Tany,SXany>const&a); // SX=S0<T>,SXany=S0<Tany> で S0を条件付けるにはどうすればいいんだろう? }; B<int,S0<int>>::B(A<float,S0<float>>const&){} // ok B<int,S0<int>>::B(A<float,S2<float>>const&){} // error B<int,S0<int>>::B(A<int,S1<int>>const&){} // error みたいな感じで
>>22 取り敢えず 8.3.2 -4- 注記に、null参照は well-defined なプログラム中には
存在し得ないとある。
まぁ、機械語に直された後で実行時に存在しないようにするのは無理、
というか不合理だろうね
Intel Threading Building Blocksのバージョン3使っているけと゛ 同士アクセスが65-70くらいからバグるな。 それ以下だと正しいロックしているが。 これはwindowsのせいか?
テストード貼っとくぜ。スレッドが64までは正常動作する。 #include <tbb/concurrent_queue.h> #pragma comment (lib, "tbb.lib") #include <process.h> #include <windows.h> #include <iostream> using namespace std; using namespace tbb; #define N 64 concurrent_queue<int> que; int sum[N]; unsigned WINAPI fnc(void *n) { int x, num=*(int*)n; delete n; while(1) { if( !que.try_pop(x) ) { Sleep(10); continue; } if(x==-1) return 0; sum[num]+=x; Sleep(rand()%5); }} int main() { HANDLE hd[N]; int n; for(n=0; n<N; n++) sum[n]=0; for(n=0; n<N; n++) { int *m=new int; *m=n; hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, m, 0 ,NULL); } for(n=0; n<=10000; n++) que.push(n); for(n=0; n<N; n++) que.push(-1); WaitForMultipleObjects(N, hd, TRUE, INFINITE); for(n=1; n<N; n++) { cout<< "スレッド"<<n <<"の合計 "<<sum[n]<<endl; sum[0]+=sum[n]; } cout<<"総和 "<<sum[0]<<endl; getchar(); }
int *p = 0; ってやった後に *p を参照するのが未定義動作なのか
30 :
28 :2010/06/03(木) 21:33:32
31 :
28 :2010/06/03(木) 21:41:10
Thread Safe Template LibraryはSleep無くすか短くする とデッドロックになりやすい。 TBBでもなったけど、Sleep(1)を一カ所入れたら平気。 安全度はTBB。
スレッドってどういう場面で使うの?
複数CPUを動かすとき HTTP受信が遅いとき
Intel Threading Building Blocksはコンパイラを限定されるのがいやだな。 BCCでは動きそうにない。
なぜassertはASSERTでないのか。小文字のマクロとか気持ち悪いんですけど
WaitForMultipleObjectsをMAXIMUM_WAIT_OBJECTS個以上に使ってるプログラマのせいだろ
そうですか。サンクス。訂正版上げておきます。 #include <tbb/concurrent_queue.h> #pragma comment (lib, "tbb.lib") #include <process.h> #include <windows.h> #include <iostream> using namespace std; using namespace tbb; #define N 100 concurrent_queue<int> que; int sum[N]; unsigned WINAPI fnc(void *n) { int x, num=*(int*)n; delete n; while(1) { if( !que.try_pop(x) ) { Sleep(1); continue; } if(x==-1) return 0; sum[num]+=x; Sleep(1); }} void WaitObject_INFINITE( unsigned int ksu, HANDLE *hd) { for(unsigned int n=0; n<ksu; n+=64) { int k=ksu-n; if(k>64) k=64; WaitForMultipleObjects( k, hd, TRUE, INFINITE); }} int main() { HANDLE hd[N]; int n; for(n=0; n<N; n++) sum[n]=0; for(n=0; n<N; n++) { int *m=new int; *m=n; hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, m, 0 ,NULL); } for(n=0; n<=10000; n++) que.push(n); for(n=0; n<N; n++) que.push(-1); WaitObject_INFINITE( N, hd) ; for(n=1; n<N; n++) { cout<< "スレッド"<<n <<"の合計 "<<sum[n]<<endl; sum[0]+=sum[n]; } cout<<"総和 "<<sum[0]<<endl; getchar(); }
行減らすとき、全角空白まじっちゃったので訂正したのを再うp #include <tbb/concurrent_queue.h> #pragma comment (lib, "tbb.lib") #include <process.h> #include <windows.h> #include <iostream> using namespace std; using namespace tbb; #define N 100 concurrent_queue<int> que; int sum[N]; unsigned WINAPI fnc(void *n) { int x, num=*(int*)n; delete n; while(1) { if( !que.try_pop(x) ) { Sleep(1); continue; } if(x==-1) return 0; sum[num]+=x; Sleep(1); }} void WaitObject_INFINITE( unsigned int ksu, HANDLE *hd) { for(unsigned int n=0; n<ksu; n+=64) { int k=ksu-n; if(k>64) k=64; WaitForMultipleObjects( k, hd, TRUE, INFINITE); }} int main() { HANDLE hd[N]; int n; for(n=0; n<N; n++) sum[n]=0; for(n=0; n<N; n++) { int *m=new int; *m=n; hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, m, 0 ,NULL); } for(n=0; n<=10000; n++) que.push(n); for(n=0; n<N; n++) que.push(-1); WaitObject_INFINITE( N, hd) ; for(n=1; n<N; n++) { cout<< "スレッド"<<n <<"の合計 "<<sum[n]<<endl; sum[0]+=sum[n]; } cout<<"総和 "<<sum[0]<<endl; getchar(); }
ミスった。こっちだった。 WaitForMultipleObjects( k, hd, TRUE, INFINITE); → WaitForMultipleObjects( k, &hd[n], TRUE, INFINITE);
codepad使えよ・・・
^演算子のオーバーロードして、XOR->乗算にしようと思っているのですが、 double operator^( const double lhs, const double rhs ) { return pow(lhs,rhs); } のコンパイルが通りません。 error: ‘double operator^(double, double)’ must have an argument of class or enumerated type というエラーが出てきます。 どうしたら良いのでしょうか?
>>43 なんで引数が二つなの?
一つは自分自身でしょ
>>43 組み込み型の演算は再定義できないよ。 少なくとも一つのユーザ定義型が必要。
組み込みのオペレータ定義できないのはちょっと残念な仕様だよね namespace内のみ定義可能で、ローカルスコープでusingした時のみオーバーロド可能とかなら良かったのに
関数をインラインにする時の目安ってどんな感じにしてますか? ヘッダのクラス定義の中に書いちゃいますか?
inlineの目安は10行以内とはよく言うけど、それってかなりたくさんinlineになっちゃうよね
それ大して意味ないから書かない方が良いよ 異なる箇所から頻繁に呼ばれる関数が多所に分散することで遅くなることもある。
へぇ難しいなぁ
20カ所くらいに埋め込むより、 唯一の関数がレジスタとかにある方が速い。 片っ端に付けまくるとそういった高速アクセスが出来なくなるから遅くなる。 コンパイル時のオプションや実測後に変更すればいい。 はじめから付けると損。
俺は何行でも全部インラインだぜ! たまにpimpl
めんどいので-O2に任せる
フーン
ベンチマークかよ。 ボタン押してから画面に結果が表示されるまでのレスポンスがそんなに変わんのかよ
L1キャッシュだのお前はOSのカーネルでも作ってんのかよと
複数箇所から呼ばれる関数は付けない方が速いことが多い。 埋め込みで効果あるのは、使われるところが一緒のみの場合。 コードの見やすさの為に関数化した場合だけ有効。
通常の関数にinline指定子つけることはまずないかな 以前は小物にはつけるようにしてたけど、ライブラリで間に合う事が多いから そういったものを自分で定義することがなくなった メンバ関数のインラインは通常1行で最大3行くらい。主にアクセッサ。 ただアクセッサを用意する設計はなるべく避けてるのであまり定義することはない 割と初学者やJavaやC#から流れてきた人ほどインラインしたがると思うんだけど偏見かなw
swapとか代入とか templateクラスのメンバとかどうすんべ
ある程度、プログラム経験あれば 最終的なコードサイズが小さい方が速いことは気づくはずだが。 L1でもL2でもメモリでも速い方に収まっていた方が良いに決まってるが。
ただのベンチマーク厨か
JavaやC#など、ハードと密着してない言語だと埋め込んだ方が速いかもね。 C++だとまず遅くなるがな。 メモリに読みに行くより、関数コールと復帰のコストが高い場合。 C++、アセンブラだとそう複雑な手続き無いから、メモリ読む方が遅い。
65 :
デフォルトの名無しさん :2010/06/04(金) 22:35:25
>>62 > 最終的なコードサイズが小さい方が速いことは気づくはずだが。
コードサイズは全く考えず、コードの読みやすさ・保守性だけ考えてます。速さなんぞ二の次
シンプルは速いよ
シンプルなヤツ程強いって承太郎が言ってた
C/C++言語、アセンブラはやるべきではないな。 これは蓄積・経験がないとプログラム出来ないようになっている。 経験少ないやつは太刀打ちできない仕組みになっている。 速度を求めるために書き換えるなら良いが。 第一言語にすべきではない。
C++勉強中のつやつにいいやつ教えてやるぜ。 PHP、C#、HSP。 これだけあれば事足りる。 C言語より生産性は、10倍はいいな。 C言語で1ソフト開発している間に10個は出来る。
>>69 でも10倍遅かったりバグったりしたら元も子もないよね
>>70 10倍遅いくらいなら全然許容範囲。
むしろ、プログラムがシンプルになるのでバグが減る。
>>71 なるほど。
では10倍が許容できない要件の場合はどうするの?
roadsendPHP これつかっとけ。PHP -> C言語 -> バイナリ とコンパイルするコンパイラ。 速度はうまくやればC言語と変わらない。
ほぇ〜。そんなのあるんだ。 使わないけど。
C#をネイティブ化さえできれば。 GUI中心にC++を捨て去れると思うが
ネイティブじゃないからあんなに高機能なんじゃないの?
実行前には、ネイティブ化しているわけだが。 ただし配布できる形にはなっていない。
windowsディレクトリにコンパイルされたイメージが入っているが。 単体のexeではなくて持ち運びが出来ない。
すいません、質問させてください。 外部txtファイルを複数回読み込むfunctionを作っているのですが、二回目以降が上手く読み込めません。 (Header省略) void readfile (string &FileName, ifstream &inFile) { ifstream infile; string FileName; (中略) for (int i = 0; i <3; i++) { cin >>FileName; inFile.open(FileName.c_str()); while (inFile.fail()) { inFile.clear(); cout << "invalid file name, re-enter:"; cin >> FileName; inFile.open(FileName.c_str()); } } }
81 :
79 :2010/06/05(土) 04:54:21
おわあ、途中でエンター間違えて押してしまった すいません。正しくは以下 (Header省略) void readfile (string &FileName, ifstream &inFile) { for (int i = 0; i <3; i++) { cin >>FileName; inFile.open(FileName.c_str()); while (inFile.fail()) { inFile.clear(); cout << "invalid file name, re-enter:"; cin >> FileName; inFile.open(FileName.c_str()); } (中略・各種データ操作) inFile.clear(); } } ソフトはMSVisual Studio2008 これ実行すると二回目以降、ファイルの名前指定すると必ずファイル名が違います言われるんです……何が悪いんでしょう
>>80 unscoped enumは、その宣言されたスコープに、名前を導入するから、
その例のように、グローバル名前空間で、あまりにも簡単すぎる名前だと、
何かと面倒だな。
C++0xから導入される、scoped enumでは、そういう問題もなくなる。
>>81 inFile.close(); してないから。
>>81 違うなら、(中略・各種データ操作)の中にカレントディレクトリを変更する操作があるとか。
C++と他の言語比べて嬉しいのってエラー修正しやすいところだと思う
>>83 最後のinFile.clearの後にinFile.close()入れても上手くいかないです・・
>>84 いや、txtから数列読み取って計算とかするだけでディレクトリ移動とかはしないです
87 :
79 :2010/06/05(土) 06:58:45
100%まったく関係ないところを修正してからrunしなおしたら上手くいくようになりました (coutいくつか追加しただけ) セーブせずにrunしたわけでもないのになんでよ。訳わからん お騒がせしました・・・・
100%無関係なら、そこがバグの原因じゃないわけだから、いつか再発するかもね。
>>87 > 100%まったく関係ないところを修正してからrunしなおしたら上手くいくようになりました
あるあるwwww
GDI+について質問です。 Gdiplus::Graphics* g1 = Gdiplus::Graphics::FromHDC(hdc); Gdiplus::Graphics* g2 = new Gdiplus::Graphics(hdc); Gdiplus::GdiplusShutdown() delete g1; //error delete g2; //error 上記を実行しようとするとdelete部分でエラーが出てきます。 しかし、GdiplusShutdownの前にdeleteするときちんと解放されます。 これはdeleteしなくてもGdiplusShutdownがメモリを解放していると考えていいのでしょうか? それともdeleteしないとメモリリークが発生するのでしょうか?
環境依存の内容はスレ違い。
92 :
デフォルトの名無しさん :2010/06/07(月) 08:09:42
ありがとうございました(´・ω・`)
#define DEF_SP_HOGE(type) void hoge<type>() { ・・・} DEF_SP_HOGE(int) DEF_SP_HOGE(char) DEF_SP_HOGE(short) DEF_SP_HOGE(long) ・・・ #undef DEF_SP_HOGE みたいな感じで局所的に使うマクロを重複させないテクニックみたいなのってありますか? DEF_SP_HOGEが定義されてればDEF_SP_HOGE_で同じことをやって それも定義されてたらDEF_SP_HOGE__・・・みたいな感じで
>>93 局所的なやつはちゃんと #undef する。局所的じゃないやつはライブラリ名とか含めた
プリフィックス付きにする。これで問題ないだろ。
ど忘れしてしまった…… setw(X)中に string + int + string を表示させるのってどうやるんだっけか まぁ具体的には表示の番号割り振りで"[" int "]" みたいな修飾したいだけなんだけど
>>95 setw()とやらの仕様は知らんが、文字列と数値を連結したいのならsprintf()かstringstreamかboost::format辺りではどうか。
# lexical_castでもできるか。
setw(20)で20文字分のスペースを確保じゃなかったっけ? 「cout << setw (15) << "etcetc" << "blah"<<endl;」 すると 「etcetc_________blah」 になるみたいな。 解ると思うけどアンダーバーは空白でヨロ。
つーかsetw(X)でX文字分のスペース、か。 違う数字を同じ例内で使うとかどんだけだ俺。
言いたいことは判ったが説明が下手だな。先ずは入力と出力をはっきりさせろ。
Cでerrnoを文字列で出力するのはperrorだけど C++では何使えばいいの?なんとなくstdio.hはインクルードしたくないんだけど
cstdio
102 :
デフォルトの名無しさん :2010/06/08(火) 20:12:34
iostream を使っていても結局 sync_with_stdio とかあるから一緒 つーか errno は気にならないのか?
>>101-102 ありがとう
LinuxだとSocketつかうとerrnoにエラー設定するのよね
普通にperrorつかいます
class Boo { public: void operator =(const Boo&){} }; みたいに代入がオーバーロードされてるんですが 普通の代入したい場合はどうすればいいんでしょうか?
105 :
103 :2010/06/08(火) 22:26:16
今やってて気が付いたんだけどLinuxはperrorで ソケットのエラー出力してくれるけどWindowsはしてくれないのね Windowsの場合はFormatMessage使って文字列取得するしかない? できるだけコードは共通にしたいんだけど、、
>>104 そのクラスにとってはそれが普通の代入だと思うんだが、明示的にシャローコピーをする方法があるかどうかって話かな。
ま、答えを持ち合わせていないんだけど。
内部でとりあえず普通の代入行ってから 違う箇所を自分で実装したい、という事な気がする 端的に言うと無理なんだが
template<class T> class Boo { public: void ZeroMemory(){memset( a, 0, sizeof(a) );} T a[100]; }; Tがプリミティブ型以外の時にZeroMemory()を読んだらエラーが出るようにしたいんですが可能ですか?
可能です それがいい設計かどうかは別の話
ふつうは特殊化でループ処理も作る
ループ処理?
k
ていうか、PODでも整数型以外をゼロクリアするなよ。
そうだな。0を代入するのが賢いやり方。
ポインタ持っててもPOD?
>>116 え?
Cの構造体にポインタが持てないと
C互換のポインタは当然入れられるとしても メンバ関数・メンバ変数ポインタはPODに入れられるのかな? 入れても問題はなさそうだが。
そも、>113が言いたいのは実数型を0クリアするなってことじゃないの?
>>120 俺には「整数型以外をゼロクリアするな」と読めるんだが。
論理型をゼロクリアしてはダメですか
>>122 ISO C++ (2003) 3.9.1 [basic.fundamental] p7
> Types bool, char, wchar_t, and the signed and unsigned integer types are collectively
> called integral types. A synonym for integral type is integer type.
PODはmemcpyしてもおkな構造体のこと ポインタが入ってたらmemcpyでバグるだろ だからPODはポインタもっちゃダメ
浮動小数点数型とポインタ型は、0.0やヌルポインタの内部表現が全ビット0であるという保証はない。 (ただし、どちらもリテラルの0から変換できることは保証されている) それらを含む集成体も同様。だから「整数型以外」で間違ってないだろう。
誰かPODについてまとめてくれ。ぐぐってもそこかしこで違う定義の仕方されてて困る
>>124 なんか誤解する人が出てきそうなんで突っ込み入れとくね。
POD がポインタを持つことはできる。
ポインタが所有権をあらわすものでない限り memcpy しても問題ない。
memcpy してバグとなるかどうかと POD の要件とは関係ない。
C#での参照型の値渡しみたいなことってC++でできますか? メンバ関数を通してメンバの書き換えが可能だけど、呼び出し元の実体は書き換えられない、という感じです。 valueをmutable、Setをconstにしてconst Test&で受けとれば実現できますが、mutableの使用方法としてはよくないと思いますし。 class Test { int value; public: void Set(int v) { this->value = v; } }; void func(Test& test) { test = Test(); //これは禁止したいけど、 test.Set(1); //これは許可したい。 } void main() { Test test; func(test); } もう一つ。 テンプレートクラスで特定のテンプレート引数の時に呼んではいけない関数が存在するとします。 その時に関数を呼んでしまうと関数内でエラーが起きるので原因がわかりにくいのですが、何かわかりやすくする方法はありませんか? static_ifを利用して無効な時にインスタンス化できない型を引数に取るようにして、 呼び出し元でエラーを起こすなんてことはできますけど、エラーメッセージの意味が若干変わりますよね。
void func(Test & const test) って無理だっけ?
2個目の質問は特殊化して何もしないようにするか、そもそもの設計を見直すかのどっちかで対応できそうに思う。
>>130 C++の参照は、参照先のすげ替えができない。つまり、元々int&はconstであると言える。
従って、int&にconstをつけることはできない。
>>129 何がしたいのかよく解らんけどoperator = をprivateに持っていけば代入は禁止できるよ
回答ありがとう。
やりたいことはC#風のイベントです。
delegateもどきを作ったところまではよかったものの、上記2点で詰まりました。
>>130 ,
>>132 最初に考えましたが、const無視するよという警告がでました。
>>131 delegateの引数の数分オーバーロードしてるので、特殊化クラスが10個になるのとどっちがマシかって話になりますね…
今回の場合は引数が間違っているというメッセージでも大体意味が通るので、とりあえずこれでいきます。
>>133 これもイベントの話なのですが、イベント送信者を受信側で操作できるようにするにはどうすればいいかなと。
代入禁止は別のところにまで影響するので避けたいです。
libtcmallocはかならずしも速くなるとは限らないな。 メモリプールを自動で行うライブラリのような物だが。 標準のメモリ管理(free、newとか)より遅くなることをある。 プールよりstaticやグローバルで確保しておいた方が良いかもしれない。
PHPやJscriptのように任意の型の変化できる変数ないですか。 anyは、たとえばvector<string>入れたら全ての操作可能ですか。resize(n)とか。
C++なめてんのか? 一生スクリプト言語いじってなw
動的型の言語って書いててすごい不安になってくるからC++で一回書いて安心してから移植してるわ。おかげで生産性向上性皆無
>>137 安全にキャストできるから心配すんな
ダックタイピングしたけりゃboost::variant使え
数年前はJavaのこれこれみたいな書き方したいんですけど みたいな質問を時々見たが、最近はスクリプトだな
char* 型の文字列を、wchar*型の文字列に変換するのによい方法はございますでしょうか?
#include <string> std::string wchar2char(const std::wstring x){ int m=x.size(); if(m<=0) return 0; std::string y(3*m,'\0'); m=WideCharToMultiByte(CP_ACP, 0, &x[0], m, &y[0], 3*m, NULL, NULL); y.resize(m); return y; } std::string wchar2char(wchar_t x){ return wchar2char( std::wstring(x,1) ); } // std::wstring char2wchar(const std::string x){ int m=x.size(); if(m<=0)return 0; std::wstring y(m, L'\0'); m=MultiByteToWideChar(CP_ACP, 0, &x[0], m, &y[0], m); y.resize(m); return y;} std::wstring char2wchar(char x){ return char2wchar( std::string(x,1) ); }
サンキュス。
boostのソースみるとoperator==とか<の引数を2個取ってる場合があるけどアレはどういうことなの?
左辺と右辺
namespace boo { static const int BOO = 100; } この場合、staticは付けない方がいいんですか?
質問です。 同一の名のメソッドを持っているインターフェースを、 多重継した場合の記述の方法がわかりません。 それぞれのインターフェースのメソッドには、 別の挙動を記述できたらと思っております。 現在は、下記のように記述したところ、 コンパイルエラーとなっております。 よろしければ記述方法を教えていただけますでしょうか・・・ ヘッダ側-------------------------------------- class interfaceA { public : virtual void exec() = 0; } class interfaceB { public : virtual void exec() = 0; } class C : A, public B { public : virtual void A::exec(); public : virtual void B::exec(); }; ソース側-------------------------------------- public : virtual void A :: exec(){ } public : virtual void B :: exec(){ }
無理っていうかインターフェースの意味からしてそんな設計は早く投げ捨てるべき
>>149 同一名のメソッドはprivateにしてラッパーかませろ
設計段階でそうするべき
後から分かってリファクタリングしても遅い
継承は初心者が思ってるほど便利なもんじゃない 大抵他の方法がある
多重継承なんていらなかったんや
ソース側が間違っていました。 void C :: A :: exec(){ } void C :: void B :: exec(){ } でした。 また、下記のようにヘッダ側に処理を記述した場合はコンパイルはとおりました。 class C : A, public B { public : virtual void A::exec() { //A向けの処理 } public : virtual void B::exec() { B向けの処置 } }; できればソース側に記述したいところです。 C#では別インターフェースの同名メソッドを、 明示的に指定してそれぞれて別の挙動を実装できておりました。 C#の元になったC++では出来るのかなと思い質問してみました。
>>151 A B をそれぞれ private継承し A' B' などのラッパーを作成、
メソッド名は execA や execB などのかぶらない物をを用意しておく。
その A' B' を継承して Cを作成という流れ出よろしいのでしょうか・・・。
158 :
デフォルトの名無しさん :2010/06/11(金) 20:04:49
ヒント: インターフェースは必ずしも継承を使う必要はない
むしろできるなら使わない方が効率がいい
いや使った方がいい
実行効率か、プログラミング効率か、そこが問題だ。
再帰回数がそんなに大きくならないとわかっている関数があったとして(例えば多くても100回) 下のように書いたら関数ポインタを使わずにinline展開してもらえるかな? template <unsigned int N> inline void func_impl(...) { if(再帰するなら) func<N + 1>func_impl(...); else // ... } template <> inline void func_impl<100>(...) { assert(false); } inline void func(...) { func<0>(...); } int main(void) { func(...); return 0; }
>>162 そのコードの意味がよく判らんが、テンプレートでの再帰はきちんと展開するよ。
例えば、階上を計算するテンプレート関数は定数になってくれる。
アセンブリ出力見れば判るべさ。
>>162 停止条件を0にしたほうが楽じゃね?
template<int N>void func()
{
func<N-1>();
}
template<>void func<0>()
{
}
int main()
{
func<100>();
テンプレート相談室になってるな
このようなクラスがあったとき、class Aのメンバ関数から class B のV[n]を参照することは出来ますか? V[n]は自分以外のもので。 class A { public: int n; string s; }; class B { public: vector<A> V; };
public:だから普通にできますよ
アクセス方法が分からないんですが。 クラスの定義の時点で可能ですか? B b;と変数宣言してあればアクセス可能ですが。
Bの中からVにアクセスは出来るでしょ。
サンクス。こんな風にしてやりたいことが出来ました。 #include <iostream> #include <vector> #include <string> using namespace std; class A { public: int ban; string name; A( int a, string b ){ ban=a; name=b; } }; class B; class C { public: B *b; int num; string fullpath(); }; class B { public: vector<A> V; C operator [] ( int n ) { C c; c.b=this; c.num=n; return c; } }; string C::fullpath() { string s; int k=num; do { s = (b->V[k]).name + "/" + s; k=b->V[k].ban; } while( k!=-1 ); return s; } int main(){ B b; b.V.push_back(A(-1,"C:/one")); b.V.push_back(A(0,"two")); b.V.push_back(A(1,"three")); cout<< b[2].fullpath()<<endl; }
なんかoperator[]の実装が自然じゃないぞ。 安易に演算子オーバーロードしても読みにくくなるだけだと思う。
A& operator [] ( int n ) { return V[n]; } としたいところを手を加えたんですよ。 A&から他のAにアクセス出来ないので。
Vの元のクラスB(のポインタ)と位置をリターンすることで、 V[n]のみのリターンでは出来なかったVへのアクセスを実現します。
だから、「他のAにアクセスする」というのは角カッコ演算子の役割ではない、と言ってるの。 普通 b[2]って言ったら2に対応付けられた値だけ返ってくることを期待するでしょうが。
B::operator[](int)とC::fullpath()の機能をまとめて、 string B::path(int n)みたいな関数にしたほうがいいと思う。
そうすることにする []が先の方が良かったけど複雑だしな
operator[]ってプログラマの自己満程度の意味しかないよね こんなもの全くいらないし fortran的に考えて
>>178 オペレーターオーバーロードは、それで記述が簡潔になる場合にしか使わないし。
多次元[]実装するために必死になってtemplateいじってるやつ見ると笑いがこみ上げてくるoperator()とat()でいいのにね
>>181 一次元のコンテナがあれば[]で何次元でも作れるのに?
>>182 それじゃあ生成・破棄の効率がクソ悪いだろ
184 :
129 :2010/06/14(月) 16:23:42
>>135 遅くなったけどありがとう。
いまいち伝わってないというか、上手く説明ができてなかったようなので言い方変えると、
class Test {
int value;
public:
void Set(int v) {
this->value = v;
}
};
void func(Test* t) {
t->Set(1); //これでfunc()の呼び出し元のtest.valueを変更したいけど、
//*t = Test(); //これができると呼び出し元のtest自体が書き変わってしまうので禁止できないか?
}
void main() {
Test test;
func(&test);
}
イベントでいうと以下のようなことをやりたいのですが、Senderの実体を書き換えられるのは困りますよね。
ttp://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-018.html イベントなのでどんなクラスにも対応しなければならず、ラップして代入禁止というのは無理です。
ポインタで渡して実体を書き換えないように気を付けるのが普通なんでしょうか。
Setでも書き変わってるようにしか見えんが・・・
186 :
129 :2010/06/14(月) 17:01:59
>>185 Setでは書き換わってもいいんだけど、*t = Test()で全く別のオブジェクトにはなって欲しくないってことです。
代入しただけでは全く別のオブジェクトにはなりません
188 :
129 :2010/06/14(月) 18:11:57
ああ、全く別じゃなくてメンバ全部コピーしてるだけですね。 そう考えると、やらないように気を付けるでいいのかな。 言い間違いのつもりだったけど、いまいち理解できてなかったのかも。 ありがとうございました。
だから
>>135 はコピーだけ禁止する方法を示してくれてるんだぜ
高級言語から覚える弊害がこれだよ
「const参照渡し」で終わりなんじゃないのか……?
あー、setはしたいのか。
じゃあ代入禁止でおk。boost::noncopyableでもおk
しかし
>>190 が意味不明だ
>>184 void __fastcall TForm::ButtonClick(TObject * const Sender)
194 :
190 :2010/06/15(火) 12:08:46
流れから想像するに代入で参照が切り替わると勘違いしてんじゃねーかなって思ったわけです ちょっときびしいか?
アセンブラ、C or Lisp、C++ とかがよいと思うな。 x86アセンブラのほうが覚えること少なくてらくでしょ。 基本はmovとcmpとjmpだけでよいし。
どこの誤爆?
マって人生誤爆してるよね
最近再びwindowsプログラムやりはじめたんだけどMFCってクソですね
スレチとか脳障害なの?
いやC++にちょっと慣れてきたら改めて思ったっていう独り言です。スレチですねごめんね。。。
逆に何がお気に入りなんだろ。
mfcは設計自体は糞だけど、C++で高速なWindowsプログラムを作成する場合 もっとも、いい選択肢だよ
MFCと速度は関係なくない?
そんなことはない、BCBやQtなんて使ってみなよ 吐き気がする位遅い
MFCでウィンドウズプログラム恐怖症になったがC#で救われた
Qtが遅いのはXwindowだっけ?あれが遅いんじゃないの?
MFCがここ10年くらいの後発の言語や フレームワークより使いにくいのは仕方ないだろ それ以前の負の遺産を引きずってるんだから
質問しようとして検証コード書いたり状況説明を考えてる内に下らないチョンボに気が付いたw 元質問は自己解決したんですが、良く分からなかった事があるので教えてください。 多重継承しているクラスがあります。 class Derive : public Base, public Listener{ で、他の関数にthisポインタを渡そうとしてます。 Derive::func(void){ thread->SendRequest(this, data); } SendRequestはこんな感じです。 void SendRequest(Listener *listener, int data); SendRequestを呼び出す前のthisのアドレスが、 呼ばれたSendRequest内の引数listenerでは+4されていたのは何故でしょうか。 VC++2008です。 すみませんがよろしくお願いいたします。
>>210 多重継承とはそういうもの。
Derive の中には Base部分と Listener部分が含まれている。
おそらく、先頭4バイトがBase部分で、その後にListener部分が続いていたんだろう。
なるほど、ありがとうございます。 確かに class Derive : public Listener, public Base としたら+4されなくなりました。
static_castさんは親切だからね
だが皆から蔑まれてる c style cast さんも親切なのです
ありがた迷惑
struct A { }; void foo(const A* const a) { } void bar() { foo(&A()); } これはまずい? const参照使えば大丈夫なのは知ってるんだが ポインタだとダメ?
何を以てまずいとか大丈夫とかダメとか言っているのかわかりません。
まずい以前にテンポラリオブジェクトのアドレスなど取れないわ
220 :
210 :2010/06/16(水) 23:48:01
ついでなので>216もコンパイルしてみました。 一応コンパイルは通るし、fooの引数aもスタック上のオブジェクトを指してるっぽい。 …でも出来る出来ない以前にちとダサいと思うw
VCは独自拡張でアドレスとれた気がする
222 :
210 :2010/06/16(水) 23:52:29
あ、VC++だったからですか…。
最近、C++の存在意義に悩んでいます・・・。 PC性能が上がってきて、速度とかあんまり気にする必要がなくなってきてる気がして・・・。 あ、趣味グラマです。
ま、趣味ですからね
んなこたーない。速度超重要。
低レベルの方が自分がなにやってるのかしっかり分かって安心できるしバグも見つけやすいと思う
MFCが大きくて遅くて不安定だったのはWin16,Win32s,Win32初期あたりの話だな 当時より大きく遅くなっているが今のハードだと問題にならない
最初に指定要素分配列を確保したら以降は削除するまで要素数が変化しない配列を動的配列といいますか?
秘密です
>>228 reallocしないならば静的確保だというのですか?
ケフィアです。
>>228 /)
///)
/,.=゙ ''"/
/ i f ,.r='"-‐' つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
234 :
デフォルトの名無しさん :2010/06/18(金) 16:50:25
行列の固有値を計算するプログラムをVC++2005とgcc4.4.1でコンパイル実行 すると、全く同じプログラムなのに結果が違う。ちなみにMATLABの結果は VC++の結果と一致している。 2日ほど悩んでいたが... 原因は、何と自作のライブラリファイルで使っていたabs関数に「std::」をつけて いないことだったorz。 xをdouble型の変数としてabs(x)を呼べば関数のオーバーロードによって double abs(double x) が呼び出されると思っていたのにgccではint abs(int i) が呼び出されていて結果が違っていた。xがdoubleであってもintに型キャスト されるため整数部(の絶対値)のみが返ってきていた。 これはC++の数学関数が標準名前空間std内にあることによるのだろうが (ちなみに #include <cmath>としている)、VC++では「std::」をつけなく ても問題なく、double abs(double x) が呼ばれている。 C++の仕様としては、gccとVC++どちらが正しいでしょうか? 「std::」をつけなくてもコンパイルエラーや警告がでず、意図しない 別のabsが呼ばれるgccの方が怖いですけど。
template<uint8_t N> class Hoge : public BasicHoge; BasicHoge * CreateHoge(uint8_t n) { switch(n) { case 0: return new Hoge<0>; case 1: return new Hoge<1>; ・・・ } } int main() { BasicHoge *p = CreateHoge(Rand8()); ・・・; } 上のようなことをしたいんだけど 1〜uint8_tの最大まで書くのがめんどいんだけど うまいこと実行時の整数をコンパイル時の整数にマッピングする方法ってない?
Boost.Preprocessor
237 :
235 :2010/06/18(金) 17:37:20
すいません自己解決しました
>>236 マクロ無しでも余裕でした
>>234 gcc 4.3以降なら-Wconversionで警告出せるよ。
警告出ないと確かに怖いね。
239 :
デフォルトの名無しさん :2010/06/19(土) 01:43:51
Windows上のアプリケーションから、直接システムコールを呼び出して、ヘッダーファイルを インクルードせずにプログラムを作るには、一体どうしたらいいんでしょう? 色々と調べ回ったのですが、大体がLinuxでのことしか書いてないし、Windowsでのもの も、実際にコードにしたら、Windowsから不正だのなんだのと言われて、プログラムが止まってしま うんですが… 例えば、int 21hとか
マシンコードとかアセンブラだろ 常識
>>239 ヘッダーインクルードを忌避する理由は何?
Windows API (Linux のシステムコールに相当) を呼び出すには call 命令を使うが、その
飛び先 (API を提供している DLL のエントリポイント) をリンクするのはアセンブラでは
煩雑と言うか面倒と言うか忘れたと言うか、使用するアセンブラによる。
API を呼び出すのにかかるコストは、C/C++ の関数形式でもアセンブラの call 命令でも
全く変わらない。
せっかく C++ なのだから、素直に windows.h をインクルードするのが吉。
int 21h で有名なのは MS-DOS ファンクションコールだが、Windows アプリでは (デバイス
ドライバを書いて特権を取得しない限り) そもそも int 命令が禁止されていて、MS-DOS
ファンクションコールは一切使えない (プログラムが不正終了するのはおそらくそのせい)。
MS-DOS アプリが動作するのは、MS-DOS ファンクションコールがエミュレートされている
から (64bit OS では 16bit アプリをサポートしないため MS-DOS アプリは動作しない)。
windowsAPIも最終的にはCPUやGPU命令呼び出すから それを直にやりたいんだろ。 アセンブラ。
APIでできる事を自分でやるって、車輪の再開発をしたいって事?
>>242 その方法を自分で調べられん奴が一体何をするつもりなんだろうね
ヘッダをインクルードしたくないだけなら、必要な宣言をコピーすればいいじゃない
疑問に思ったんですが、関数オブジェクトってどういう使いどころがあるんでしょうか。 STL以外での使い道に心当たりがある方お願いします。
DOS時代なら特権レベルとかなかったから好き放題だったんだけどねえ 今はintとかin/outとかhaltとか好きに呼べない ま、安全のためだから仕方がないが
自作のコンテナのイテレーター作るときに気を付けること(iterator_tagの設定など)をまとめたサイトってありますかね?
>>248 STLで足りない理由を明確にすることかな
251 :
デフォルトの名無しさん :2010/06/20(日) 06:28:27
C++で #define YAMA 0 #define KAWA 1 #define HAIRETUNOKAZU 20 とかを使いまくってるのですが、これは話にならないくらいの糞コードなんでしょうか? static const HAIRETUNOKAZU = 20 みたいにするのが業界標準なんでしょうか?
252 :
デフォルトの名無しさん :2010/06/20(日) 06:35:44
他にも関数作成時は void kansuu(int number); みたいに書きまくってるけど void kansuu(const int number); for文も for( a=0 ; a<10 ; a++ ) みたいに書きまくってるけど for( a=0 ; a<10 ; ++a ) if文も if( n=10 ) と書きまくってるけど if( 10=n ) と書かないと業界では鼻で笑い飛ばされて帰っていいよと言われる糞コードなんでしょうか?
for文に限ってはほんのほんのほんお少しだけ当てはまる 他については決してそんなことはないというか、 void kansuu(const int number) ってのは void kansuu(int number) と同じシグネチャだから 逆に混乱を招きかねないって意見も多くあるし、 if ( 10 == n ) についても同じ
254 :
デフォルトの名無しさん :2010/06/20(日) 06:49:13
なるほど、ありがとうございました。 for文は++aのがデータのメモリ間のコピーだかなんだかの処理がa++より一回少なくて高速だと聞いたのですが、 それほどその程度の速度を意識したことなかったし、大抵の初心者サイトで最初に教えられるのはa++だから惰性で続けてました。 ほかにも構造体を関数へ渡すときは kansu(KOUZOUTAI) void kansu(KOUZOUTAI) kansu(&KOUZOUTAI) void kansu(*KOUZOUTAI) kansu(KOUZOUTAI) void kansu(&KOUZOUTAI) みたいないろんなやり方があって自分は2番目を常用してますが、これは好みでしょうか? DirectxのSDKなどでは2番目で使用する前提の関数が多く用意されてるのでこれがプログラマ達の標準だと思ってました。 他の方でも知っておられたら教えてください。
++aがいい。組み込み型なら別に気にしなくてもいいけど、用がなければ前置でいい。 10=nというその例のようなミスを防ぐためにはいいのかもしれないけど、それは強制しないし n=10と書いても警告が出るからn=10を推奨。10=nは逆に禁止したいぐらい。 値を変更するなら3番目、kansu(*KOUZOUTAI)のtypoだよね? 変更しないならconst参照で受けるのがいい。 鼻で笑い飛ばして帰っていいよとは言わないけど、上記のようなことを説明をしつつ伝える。
OpenCVのC++インターフェースとかは入力パラメータがconst参照渡し、出力パラメータが非const参照渡し Googleのコーディング規約では入力パラメータがconst参照渡し、出力パラメータがポインタ渡しになってるな。 どっちにしろ値を渡す目的ではconst参照渡しを使うのがいいと思う。
257 :
デフォルトの名無しさん :2010/06/20(日) 08:00:54
なるほどありがとうございました。 自分で組んでる分にはわざわざconstなんて付けないし、 人との共同でも値変更があるかはプログラム設計書に明記してりゃいいやと思ってたけど、 安全で安心ではありますね。
コンパイラが勝手にconstチェックしてくれるなんて使わなきゃ損だね
>>255 1番目は値渡し(コピー)。
2番目はポインタ渡し。
3番目は参照渡し。
のつもりじゃないだろうか。
たまに他言語使ってconst参照相当の物が無いと不安になって心が押しつぶされそうになる
C#使っていると、constのような最小限のチェック機構が無いのは何でだろうと悩んでしまう。
勉強しろw
Immutable保証するやつはないだろ そもそもメソッドのパラメータとして記述できるのはparamsとrefとoutだけじゃね
c#の参照渡しで書込み保護できないとか危険卓
まぁC#はC++と違って何もつけなくても間接参照できるし ref使うのは特殊なケースだろう 間接参照でImmutable保証出来ないのはJavaにしろPythonにしろ同じだし
ポインタが無効かどうか知るには管理者からboost::weak_ptrを渡してもらえばいいですか?
すまん、const参照渡しって概念は何となく分かるんだが、 const参照渡しが推奨される理由が分からないorz constポインタ(?)とかじゃダメなの?
参照ならNULLが無い const参照ならテンポラリオブジェクトも取れる そしてクライアントの手間が省ける
>>259 あわわ。寝ぼけてたみたいでorz
指摘ありがとうです。
>>257 でちゃんと伝わってたようで安心した。
リソースが限られてる組み込みとかって、 templateよりdefine関数の方が一般的?
272 :
デフォルトの名無しさん :2010/06/20(日) 18:50:47
と公言していた某プロジェクトが今どうなったか知らぬのか # defineは関数ではない
確かにdefine関数っていうのはおかしいか マクロ展開
まあ関数型マクロと呼ぶし、 プリプロセッサにとっての関数とも言えるので いいんじゃない
ですね
引数付きマクロのことかい
278 :
デフォルトの名無しさん :2010/06/21(月) 00:09:08
>>241 ヘッダーインクルードを忌避しているわけではなくて
>>243 が言っている通り、車輪の再開発をしたいのです。
まだ学生の身なので、よりハードウェアに近いところを勉強したくて…
CPUをスーパーバイザモードで動かせば、メモリの好きなアドレスに書き込みが出来るかな、と思って、
ハードウェア直叩きで映像を表示出来れば、DirectX等のコンポーネントを使う時も理解が深まると
>>245 関数プロトタイプ宣言を用意してみても、実体が無い関数だからリンクが出来ないと言われております
へえ
>>271 template が何か実行時のリソースを浪費するとでも思ってるのか?
ループがあると関数はinline展開されない事が多いな
>>280 exeが大きくなるぶん消費量は増えるのでは
浪費というとおかしいけど。
>>282 マクロだと「exeが大きく」ならないの?どうして?
>>283 >>280 は流れをみれば、defineはリソースを浪費するが、templateは浪費しないだろ、って論調じゃん
そうじゃなきゃそのレスにはならない
defineとtemplateってどっちが肥大化すんの? defineの方が大きくなりそうといえばなりそうなんだけど。
>>284 そんなことは言っていない。それに、質問してるだけなのに「論調」とか言われても困る。
>>278 残念ながら、Windows は抽象化というものを行っており、デバイスドライバを除くすべての
ソフトはスーパーバイザモードに移行できず、従ってハードウェアに近いコードを書く事は
できない。
ただし、抽象化というのは全く異なるハードウェア上で同一のバイナリが実行できるという
点で歓迎すべきものと同時に、ユーザーモードのアプリに下手な動作をさせずシステムを
クラッシュさせないという安定性の確保の観点から重要なもの。
どうしてもハードウェアを直叩きしたいという場合にはデバイスドライバを書くしかないが、
それはシステムの安全を考慮した高い品質のコードを慎重に書かねばならない上、それ
をするにはそもそもハードウェアの仕様を知らなければならないが大抵の場合メーカーは
ハードウェアの仕様を公開していないため事実上不可能 (メーカーの提供するデバイス
ドライバをリバースエンジニアリングして仕様を解析するという手段も無いではないが、それ
はそれでプログラミングとは別のスキルが要る)。
Windows 上で普通にプログラミングしている限り、ハードウェアに直接触れる事はできない
し、意識する必要も無い。
せいぜいが DirectX を利用したらハードウェアに近い事をした、と思っておく程度。
ミドルウェア・ファームウェア開発者を目指すのでなければ、それ以上の知識は不要だし、
邪魔になる事もある。
これ以上の話はスレ違いかな?
そしたらアセンブラにCPU命令があるのはなぜだ。
>>288 おまえはOSの勉強からはじめろよ。
あとにどとくんな。
>>288 アセンブラは基本的に全ての命令をサポートしてるよ。ただそれだけ。
そうじゃなければOSのコア作る人はどうすればよいのかと。
Linuxつかったほうがいいんじゃね?
>>288 今流行のマルチコアを活用したプログラムとかSSE2/SSE3/SSE4をバリバリ
使ったプログラムを書くにはインラインアセンブリしかあるまい。
そういう意味ではx86-64でC言語でインラインアセンブリを禁止したのはおかど
違いだと思う
> 残念ながら、Windows は抽象化というものを行っており、ハードウェアに近いコードを書く事はできない。
> Windows 上で普通にプログラミングしている限り、ハードウェアに直接触れる事はできないし、意識する必要も無い。
お断りします。
特権レベルを知らない馬鹿はスルーしておけば良い
302 :
デフォルトの名無しさん :2010/06/21(月) 21:28:38
>>292 インラインアセンブリなんてもともと曲がったものだからな
アセンブラで書く必要のあるものは割り切ってアセンブラで書くべきで
それをまだ asm が予約語だからとしがみついてるアフォが板杉
それだといちいち何らかのジャンプが発生するだろ 効率悪い
304 :
デフォルトの名無しさん :2010/06/21(月) 21:45:44
間に C++ を介在させるからだよ 命令シーケンスの連続性に意味があるコードに高級言語を混ぜる書くアフォは氏んでいい
触っちゃいけない子だったか
306 :
デフォルトの名無しさん :2010/06/21(月) 21:50:00
ノーアンサー?
WinUSBやったことありますか?
クラスの依存でつまずきました… orz class AbstractHoge { (略) }; class A : public AbstractHoge { public: B toB(); }; class B : public AbstractHoge { public: A toA() { }; これが通らないのは、仕様?
うん。
うん。class B;ってClass Aの前に書くといいよ。
>>285 templateは型ごとに関数が個別に作られる
マクロはその場に展開
後は分かるな?
templateがインライン化されるような状況だと どちらでも変わらないかもね 普通は#defineの方が肥大化するだろうけど
どっちともいえないな。 複数箇所へ埋め込んだらdefineがおおい。 メンバ関数が多くあれば使わない部分まで生成されるテンプレートが大きい。
いや、使わない部分は生成されないぞ
gccでテンプレートが展開された後のコードを見ることってできますか?
>>271 組み込みの場合、引数付きマクロはテンプレートの代りに
用いられるわけではなくて、レジスタやメモリマップドI/Oへの統一的な
アクセスを提供するためとかじゃないかね
他には既存Cシステムからの流れからというのもあるだろうね
それとメーカーの提供してるサンプルがCだったりすることも影響してると思う
functionつかえ。 defineは複数箇所に展開されたらかさふえる。 サイズがでかくなって良い場合はdefine。 しかし単一箇所にコードがあった方が速度上がるだろうから define使う利点無し。
void Foo( int x ){ Boo( x ); } みたいな関数でもインライン展開しない方がいい?
何を気にしてるんだかさっぱり分からん
現在、windows 7でレジストリのアクセス許可の設定を行っているんですが、 SeSecurityPrivilegeが有効になっていないためエラーになります。 そのコードがC++からコマンドラインを呼び出して設定しているという形になっています。 コマンドラインで使用しているツールはsubinaclです。 SeSecurityPrivilegeを有効にするための関数などC++であったら ヒントでもいいので教えていただきたいのですが 何卒よろしくお願いします。
演算子のオーバーロードがややこしいのは俺だけ?
ややこしいからgoogleだと禁止
operator= もだめなのか
>>323 関数オブジェクトとかコピーコンストラクタとかfriendなoperatorとか、お前のノーミソはパニックだろw
ぶっちゃけそんなにややこしいとは思わないけど 交換則が成り立たない加法演算子とか、反対称則の成り立たない比較演算子とか定義して、 テンプレートあたりで意図せず使ってしまい、破錠しないかってのはすごい気になる……。
演算子の文法で呼び出せるだけで、何をするかはユーザーの勝手だ。
>>327 おまえはC++をちゃんと勉強してきたのか?
>>327 overloaded operators for classes should behave like operators for builtin types
spiritがなかまになりたそうなめでこちらをみている
>>327 が言いたいのは
>>329-330 > overloaded operators for classes should behave like operators for builtin types
shouldなだけで守られるとは限らないじゃないか。
stdのiostreamを思いだそう!
ってことじゃないのかな?
そして
>>327 が言う問題って、Conceptさんの力があれば解決できるの?
C++0xはよーしらんのだが。
>>327 int+hoge が hoge::operator+(int)に一致するようなことを危惧してるの?そんなことはないから。
>>333 int+hoge
hoge+int
が同じにならない可能性があることを危惧しているのではないのか
>>332 Yes
iostreamをはじめ、std::string、boost::format、spiritはいわずもがな。
便利だから使うけど、C++って
>>330 のようなコンベンションが黙殺される傾向にあるのは確かで……
まぁそれだけなら問題ないわけだが、呼び出す関数側で交換法則が成り立つと思って処理したら
結果は未定義になってしまうんじゃないか?
Conceptはこういうメソッドを持ってるということは認識できるけど、
「正しく」実装されているかについては知ることはできないし、不可能だと思うよ。
std::chrono::system_clock::now() で現在時刻を取得した後に、年、月、日、時、分、秒、m秒 をそれぞれ取得するにはどのクラス or 関数を使用するれば良いのでしょうか
>>335 そう、同じにならないのなら別々の定義にするか、片方だけ定義すればいいのになぜ危惧してるのか疑問に思った。
それが一方の定義だけで自動で両方対応すると思ってるのかと思った。
>>338 なんか意図が汲み取れないが、交換法則が成り立たないのをよしとしている?
>>339 +演算子をオーバーロードするときは交換法則が成り立つのが理想だと思うけど、
>>327 は何を危惧してるのかが掴みきれない。
342 :
デフォルトの名無しさん :2010/06/23(水) 23:01:45
operator+ は終わってる
"a"+"b"="ab"みたいなのは許さないってことじゃ
他の言語でも文字列の連結とか普通にやってるけど そんなにやばいの?
演算子のオーバーロードってSTL使うときとベクトルクラスとかにしか使わないな。 他にどんな用途に使ってるの?
コンパイラが交換法則を勝手に適用した最適化をして”ba"になることを危惧してるのか?そんなことおきないけど
>>343 確かに文字列の連結は交換則成り立たないな
あまり意識していなかったが
348 :
332 :2010/06/23(水) 23:14:11
あ、意味が分かった。
要するに
>>327 は、テンプレート作っているやつが
template<class T>
void foo(const T& a, const T& b)
{
a+bでなきゃならない部分まで
b+aと特に注意しないで書いちゃう
}
ってのを心配しているのかな!!
そんなこと言ってたら何だってありえると思うけど
演算子に限った話じゃないな
この混乱見るとやっぱ演算子のオーバーロードは禁止すべきだな 特に自分がクラスを作る場合
>>351 混乱する人が演算子のオーバーロードを使わなければいいだけの話。
中には必要としている人もいるのだから俺様的価値観を押しつけるな。
C#は = のオーバーロードをさせるべきである!
STLのstd::vectorを使う利点って何? もしかしたら自前で可変長配列作ったほうがいい場合ってあるの?
標準ライブラリとして存在しているので直ぐに使うことが出来ます。 またイテレーターを使用しての繰り返し作業や、ソートなどがとても楽に行えます。 てか自前コンテナなんて作ってんじゃねーよカス。 いちいちオレオレコンテナを読む身になれよクソが!
>>354 むしろ使わない利点って何?
組み込みとかDSソフト開発とか以外で。
いい場合?ねーよ
演算子を作れるようにすれば***streamとかstringとかformatとかは多少マシになるかも しれないが、場合によってはさらなる混乱を生むかもな
ユーザ定義リテラルだけでもさんざん紆余曲折のすえ糞仕様に落ち着いたんだから、 ユーザ定義演算子なんざ考えるまでもない。
STLのmapとかとlistとかとvectorの順繰りアクセスの速度実測したいんだけど、 なんか気を付けること有る? こうやるとコンパイラが最適化しちゃう、とか。
ユーザー定義リテラルは、たぶん真面目に実装するコンパイラないんじゃないかな。
>>360 何のためにそんなことするのかわからないけど
普通は最適化もSTLを利用するアプリケーションコードもコミコミでの実測だし
何も気にせずプロファイラかければいいよ
何もしないループが最適化されて消えちゃうってやつは イテレータ使ってるとそうそう起きないのかな?
>>360 最適化せずに実測する意味がないと思われ
>>364 期待はしてるけど、どこまで最適化されるのかな、と
テンプレートで実装丸見えだから最適化されるのが普通なのかね
ごちゃごちゃ考えずに実際のアプリケーションでプロファイルするか、ポイント間で時間測れ。
なんで拡張メンバー関数のイディオムはしばしば|を使うんですか?
パイプ演算子の模倣じゃないの?
>>368 本来の意味と違う演算子の使い方をするので、こんな条件が必要でしょう。
なんとなく意味が伝わる。
あまり使われない演算子。
副作用や変な罠が無い。
悪い演算子オーバーロード ^演算子をべき乗演算子にしちゃうぞ 凝りすぎの演算子オーバーロード <- 逆アロー演算子を作りました。
逆アロー演算子の方が本当はオブジェクトにメッセージを送ると 読めるのでよりOOPらしいと思うんだよね。 でもC++はあくまでもCの後継パワーアップ言語なので、アロー演算子-> を使わないと行けず、最初は「メッセージの向きが逆じゃないか」と 頭が混乱していましたが、もうOOPとかそういう考え方をするのを やめて「こういう物なんだ」と諦めてから楽になりました。
<- 逆アロー演算子 なんてどうやって作るの? operator < (l, r) に単項演算子operator -を使うのか!?
・演算子と×演算子が欲しいなあ
APLモドキにでもするつもりかw
配列定数はExcelをOLEで貼るのね
>>372 C++はSmalltalkを参考にしてないから
メッセージとかそういう概念はないよ
Smalltalkを参考にしたのはObjective-Cだが あの文法は酷い
Objective-Cの部分は敢えて別言語っぽく見えるように作られてるので 2つの言語が混在しているような違和感がある
CLL/CLIって何が酷いの?
寝ぼけてた。C++/CLIね。
>>382 >>381 っぽくいうと、
マネージド部をあえてを同じ言語っぽくしてぜんぜん混在できないところ
>>384 よく分からないな。 どういう形に実現していれば良いことになるの? JNIみたいにC/C++のI/F用意しました、なら良いってこと?
DLLで十分じゃなイカ
boost::pythonみたいだったら良かった?
テンプレートが全く理解できないんだけど、お前らはプログラミングで使ってるの?
普通に使うよ 最初はとまどったけど参考書も結構でてるし、boostっていう無料で質量最高のサンプルもあるし勉強はしやすい
テンプレートのないC++はintしかないCみたいなもん
391 :
388 :2010/06/27(日) 09:25:47
テンプレートって黒魔術じゃないんですか?
黒魔術上等、テンプレートは必須科目だね。
template禁止なC++なんて魅力半減ですわ。
>>388 その理解できないというテンプレートって何?
spiritだったら許す
テンプレートライブラリはよく使用するけど 自分ではあまり定義したりしないかな
traitsの概念を理解するのが難しかったな
もうBoostは当たり前なのか。
個人的には当たり前だけど、仕事ではboostは禁止されている STLの使用も最初は禁止されていて、俺が熱弁を振るってようやく 使用許可が出た位だ
つーかshared_ptrがtr1に入ってよかったわ これがないとスマポをコンテナに入れられない カタワになっちまう
>>322 返信遅れて本当に大変申し訳ない。
わざわざ誘導ありがとうございました。
新規格にはテンプラテク用途に使えそうなものも多いし黒魔術どころか順標準といっもよくなってきた感じはする
「禁止されていた」と書いてあるが
google先生もSTL禁止だな
万一 STL にバグがあっても特定できないし。
万一 コンパイラにバグがあっても特定できないし。
万が一 OSにバグがあっても特定できないし。
万が一 HWにバグがあっても特定できないし。
万が一地球にバグがあっても特定できないし。
HWのバグは経験したことないけどOSのバグとかライブラリのバグは特定できるでしょ
散々悩んだ挙句にな
ジョークにマジレスする男の人って…
横マジレスすると、テンプレートも理解できない糞職場だからだろうな
PHP C++で共通に使えるシリアライズありますか
415 :
414 :2010/06/27(日) 20:02:32
php関数 serialize unserializeを C++で読み書きする方法でもいいです。
あきらめました。 そのつど独自形式で読み書きします。
その間10分wwww
>>417 phpは型とデータを一緒にシリアル化して、ロードに動的に変数確保出来るけど。
C++はそれができないからあきらめた。
phpはどんな型でもserialize関数に渡せるけど、C++でその復元が無理。
配列の添字って0からsize-1じゃなくて1からsizeのほうがアルゴリズム書きやすくね?
for(n=0; n<size; n++) A[n];
>>419 その1が添え字のずれを生じさせて面倒なんだよな。
配列の添字だけならそうかも知れないが、ポインタとの兼ね合いを考えると0からのほうがいい
> ここで剰余の問題に行き着きました. > 1-origin で 1, 2, 3, 4, 5 だと,5 の剰余をとると 1, 2, 3, 4, "0" になってしまいます. > この不整合には困りました… こんな問題もあるってさ
0からsize-1の場合、 for( int i = 0 ; 1 != size ; ++i ) A[i] ; !=で終端を判断できるというのは、イテレーターを汎用化させるために一役買っているんじゃないか。
ん?バッファオーバーランの実演?
配列を後ろから走査するときが不便
配列の場合はrbegin()とrend()とbase()がないからな
428 :
デフォルトの名無しさん :2010/06/27(日) 21:39:41
逆順の場合イテレータのように考えると-1との比較だけど添字は普通非負整数だから困るよね
>>427 boost::Arrayの出番ではないの?
イテレータ反転させると一つズレるってのが設計者のあたまおかしい
>>430 そうしないとfor文を書き換えなければならず、余計な思考が必要になる
>>427 int a[] = { 1, 2, 3, 4, 5 };
typedef std::reverse_iterator<int*> rit;
rit begin(a + _countof(a));
rit end(a);
for (rit it = begin; it != end; ++it) {
std::cout << *it << std::endl;
}
>>431 それ以前に、有効なイテレータが作れないんだよね
ずらさないと、対応するrendに対応するイテレータが無くなってしまう
プロフェッショナルは皆やってるけどdoubleをイテレータにすればいいよ 負も持てるし符号無しlongよりながいし整数程度の精度なら誤差もない
おれはつられないぞ
Luaとかインデックスも含めて数値は全部実数だよね 気持ち悪いけど解決法と言えないことはないかもね
WindowsでPHP to C++ するやつ作ってくれ。 C++は既に時代後れ気味。 PHPを主流にした方が良い。 C++をアセンブラを弄くるみたいな立場に持っていく。
そんなに好きならPHPでそのコンバータを書けばいいじゃない こんなところで乞食するよりよっぽど早く完成するぞ
時代遅れというのになぜコンバータを使ってまで使う。それは使う価値があるからだろ。
これwindowsに対応させてくれよ。
PHPをC++に変換して高速化する「HipHop for PHP」をFacebookが公開
過去6年間にわたって、PHPが提供する高速な開発ペースによって多くを成し遂げてきました。
プログラミング言語としてみると、PHPはシンプルです。
簡単に習得し、簡単に書き、簡単に読み、簡単にデバッグする事ができます。
HipHopにより私たちはページによっては、Webサーバー上で約50パーセントのCPU使用量を削減できました。
CPUの使用量の少なさは、サーバー台数の削減につながり、それはより少ないオーバーヘッドを意味します。
私たちはHipHopがウェブに大きな利益をもたらすと感じ、
オープンソースとしてリリースしPHPによる大規模WEBサイトのスケーリングに新たな方向性が提示されると期待します。
HipHopはあなたのPHPのソースコードをC++に最適化された形に機械的に変換します。
HipHopコード変換機は、PHPランタイムの再実装であり、また多くのパフォーマンス向上の為のPHPエクステンションを書き直したものです。
http://blog.candycane.jp/archives/275
なんだ、モノはすでにあるのか、C++で書かれてるみたいだが。 じゃぁ自分でビルドすればいいじゃない、 凄く問題が簡単になったね!
PHPのスレでやれば問題ないでしょう。
簡単に作れて動くことがスクリプトとしての価値だからな もしスクリプトがC++と同じ使い勝手だったら 誰もスクリプトなんか使わないよね
簡単に作れてC++と同等の速度なら だれもC++使わないよね。
たしかにな
ぶっちゃけスクリプトよりC++のほうが生産性高くね? 他の言語に比べてC++ってエラー修正がしやすいから結局スクリプトで書くより早く出来上がることが多い気がする
>>449 プログラマ全員から「どこがやねん!」というツッコミあるで〜
C++をずいぶん使える代わりにスクリプト言語初心者なんだろう。 それなら十分ありえる
スクリプトだと適当なコードでも動いてしまうのが怖い 規模が大きくなると特に
C++だって適当なコードで動く。 だからバッファオーバランがそこら中で起こってパッチが出まくっている。 規模が大きくなると特にな。
constや型チェックを性的に解決できるかは大きな違い。
>>453 そのためにPHPをコンパイルできるようにする。文法エラーなどは動かす前に判明出来る。
適当に書こうと思えば、どんな言語でも適当に書ける。 一所懸命に一つ一つ違いを挙げていったところで、根本的な事実は変わらないよ。
>>457 動作しないコードが混じっていても、
スクリプトはそこが実行されなければ正常動作する。
C++は文法エラーや範囲チェックなどあって実行しなくてもエラーになる。
>>458 だから、言語によって個々の仕様はあるんだから利点欠点はいくらでもあるだろう。
その事実を踏まえた上で、
「適当に書こうと思えば、どんな言語でも適当に書ける。」
と言っているんだが、日本語が通じないのか?
適当に書いけるのはどれだってそうだけど、その内のどれだけを見逃さずにエラーあるは警告にしてくれるかってことだろ その点では当然C++のが賢い
だめだ話が通じない。
phpは文法的なエラーがあっても動くとでも勘違いしてるんじゃねーの
そもそも「適当に書こう」なんて考えるのがなにかおかしい
互いの利点や欠点を無視して、特定分野の表面的な仕様を薄っぺらく主張することに何の意味があるんだろう? 両方の有用な部分と駄目な部分を考えていくならともかく、 自分の主張する部分のみをひたすら押し通そうとする姿勢で望む意味が分からない。
そもそも用途が違う。 駄目な奴に書かせたC++のCGIとPHPのプログラム、 どっちが怖いかと言ったらC++の方が怖い。 よい子は目的に応じて使い分けろ。
開発の主流をPHPに移行させるべき。 スクリプトでもコンパイルも可能で、GUIや3Dも出来るようにする。 ホットスーププロセッサーでさえ、GUIや3Dが出来るんだ。 PHPに出来ないわけがない。 開発者がいるかどうだ。
やりたければ自分で開発すればいい。 なんでお客様目線なんだよ。
>>460 それはC++がではなくて、コンパイラが、じゃないのか?
>>468 C++のコンパイラなんだから、C++がということに他ならん
言語としての仕様とコンパイラの仕様は別だろ。
ローカル型nameはテンプレート引数に使用できません とエラー出るんですがVC++2008では通ります。 どっちが正しいですか? template <typename T> void f(T); int main() { struct X { int x; } x = { 0 }; f(x); //<<< エラー }
エラー
>>468 ほとんどの警告やエラーは標準C++の仕様で決まってるやつだろ?
とするとC++が賢い、で合ってる
何故どうでもいい話を必死に主張するんだろう?
今度は標準仕様に準拠していないコンパイラがあるのはC++の仕様が悪いからだという話になって、 コンパイラが悪いだけで仕様は別問題になって、 以下どうでもいい話がぐるぐる回るのか?
>>471 ローカルな構造体やクラスをテンプレート引数に渡すのは、現標準(C++03)までは対応してない、
つまりコンパイラ依存。
次期標準では対応するらしい
>>476 そんな事を言い出すとC++0xはなおさらしんどくなるんだが?
質問!これって何ソート?? template<class FwdIt> void Sort(FwdIt Fst,FwdIt Lst){//O(N*((1+N)/2))?? for(FwdIt i=Fst; i != Lst; i++){ for(FwdIt j=i; j != Lst;j++){ if((*i)>(*j)){ std::iter_swap(i,j); } } } return; }
スワップソートだよ。
選択(selection)ソートだろ
>>480-482 どれだろう。
ウィキペディア検索してみたら、バブルソートが同じっぽい実装になってた。
というわけでバブルソートということにしておきます。
回答感謝!
本当のこと教えんなよw
自分で作ったソフトウェアに、JscriptやVBSを組み込む方法ありますか。 スクリプトを実行する互換DLLやLIBなど配布されてますか。
EmedtorとかマクロでJscript使えますがこれはwindowsの Jscript.DLLを起動しているんですか。
>>486 やった事はないがその手の記事はCodeZineあたりで見た事があったと思う
たしかCOMベースだったような
それとスレ違いだからWin系のスレに移動しろ
依存しているヘッダファイルをまとめて一ファイルにする方法ないですか?
>>490 includeするincludeファイル
>>490 プリプロセッサの出力をファイルに保存。
493 :
デフォルトの名無しさん :2010/06/30(水) 12:50:01
互いに依存するヘッダファイルをばらのまま放置するとお仕置きされるんだが
まあね
495 :
490 :2010/06/30(水) 22:23:23
サンクス。 ヘッダファイル一枚化できました。 こんなパラメータです。 g++ -E -P -nostdinc -nostdinc++ a.cpp > a.txt
496 :
490 :2010/06/30(水) 22:25:33
ヘッダをお互いに依存するようにする実装設計こそ責められるべきじゃ…
親子構造なモデルだと多発しますけどね。 親は子を、子は親を知りたがるし。
ですね
500 :
デフォルトの名無しさん :2010/07/01(木) 20:31:22
<new> や <typeinfo> まで禁止かよ
501 :
490 :2010/07/01(木) 21:59:04
defineはそのまま残して一枚化できますか。
そのままうめ込まれると、あとでユーザーが標準で使われる#defineを 使えなくなるんですが。 有効な#defineだけを抽出するコマンドもあるのですが それを使うと別のコードに影響でます。
1個にする意味がわからないんだが。。
インポートライブラリでは成功するんですが スタティックリンクにすると次のエラーが出ます。 このなおし方分かりますか。 error.obj : error LNK2001: 外部シンボル "__imp__***" は未解決です。
505 :
デフォルトの名無しさん :2010/07/02(金) 05:21:57
うわぁ…
>>505 予想ではインポートライブラリには、__imp__関数名になっていて
スタティックライブラリは関数名だと思うんですが。
シンボルの強制に__imp__いれても直せないんです。
環境依存OKなスレで聞きなおすよろし 使用コンパイラとライブラリも明記した上でな
mo
te
510 :
504 :2010/07/02(金) 07:28:06
ソースコードからビルドし直して出来ました。 スタティックライブラリの組み込みは、微妙な型の違いでも動かないらしいので。 他のコンパイラのビルド済みライブラリでは駄目かと思います。(の場合もあるかと思います)
次からはチラシの裏へ書くように
_,. -‐1 ,. - ‐:‐:‐:‐:‐- 、 _,. -‐:'´: : : : : | , :'´::.::.::.::.::.::.::.::.::.::.::.::.丶 ,.イ ,.-:'´: : : : : : : : : : : ! /::.::.::.;.ィ::; ヘ::.::.::.::.::.::.::.::.::.:\ /: ∨: : : : : : : : : : : : : : :l'/l:/::./ ,':/ i::.:ト、::.l、::.:!::.::.::.::.', ,. -:' : : : : : : : : : : : : : : : : : : : -┴-'.._l/ l:| i::| i::l::.::.::.::.::i ー‐ァ: : : : : : : : : : : : : : : : : : : : : : : : : : :`ーァ l| l| l:|::.::.::.::.::| /: : : : : : : : : : : : : : : : : : : : : : : : : : : : :/ ー‐‐---、!ヘ::.::.::.::| ,': : : : : : : : : : : : : : : : : : : : : : : : : : : : :/ ┬--、 }::.:/::.! ! : : : : : : : : : : : : : : : : : : : : : : : : : : ;.イj {辷リ ′/::/!::/ここは貴方の日記帳じゃないわ。 ノ: : : : : : : : : : : : : : : : : : :.:.:.:.:.. : :、/ ; /〃ノ:/ ´. .:.:.:.:.:.:.:.: : : .:.: : : .:.:.:.. : : :.:.:.:.:.:.:__:.:.ヽ r―-, /-:'´::;′ チラシの裏にでも書いてなさい。 `ー---;.:.:.:..:.:.:.:.:..:.:.:.:.:.:.:.:...:.:.:.:.:.:.:.V ̄`ヽ、 `ー‐' ィ;、:::∧:{ /:.:.:.:._:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.|'´ヽ rく` ト、. -‐'´ | `:く ` ね! 厶-‐'´ |:.:.:.:.:.:.:.:.:.:.:.:.:ト、:.:.:.| _,.-‐! \ __,,. -‐''´ }‐:、 _l;.ィ´ヽ:./ヽ:|'´ ,>‐'´: : く ∨ > \ _,r{`7  ̄{ ̄} ̄¨`‐く__ヽ_;,: -‐; :\ _,.-:'´: : : : : :>、 ,.イ | 〉´ ̄ ̄ ̄:  ̄`ー‘v'´>‐_く : : : \___,,. -‐:'´: : :ト-、_;,.-'´ ヽ r'l ! ,し′: : : : : : : : :}_ノ/ __,,.ヽ: : : : : : : : : : : : : : V l ,Jー'´: : : : : : : : : : :`辷'_,,、 '; : : ∧: : : : : :_; -'´ | l´: : : : : : : : : : : : }´ l l`ー':.:.:`ー:.'"´:〈 v'
マングリングってコンパイラ依存だったような
伝達関数の零点と極を求めたいのですが、 ・分母分子の多項式を因数分解する方法 ・複素数を次々に代入して分母分子の値がそれぞれ0になる点を探す方法 これ以外に良い方法があれば教えてください。
何でそれじゃいかんの?
聞き方が悪かったです 領域総当たりよりは多項式を解く方法を使いたいので、 複数の係数から解く方法があれば教えていただきたいのです。
そもそもそれを何故このスレで聞くのかがわからん。
数学板とかそっち行った方がいいんじゃね
ようするにn次方程式を(複素数の範囲で)解く方法だろ? 俺は知らないけどありそうなもんだけどね
私は真に驚くべくプログラムコードを発見したが、 それを書くには最大行数が少ない
ガウスザイデル法などの反復法しかないんでわ? 他にもあるかもしれんがMATLABを持ってないのでわからん
Mathematica オススメ
まあね
class Number { private: int num; public: Number(int n){num = n;} //変換コンストラクタ operator int(){return num;} // 変換関数 この変換コンストラクタってただint型の値を渡してNumberクラスの データメンバnumに値を代入してるだけに見えていまいち理解出来ていません。 これはどういう解釈?で見たら良いのでしょうか? 説明がよく分からないと思いますがエスパーの方お願いします
>>525 見えてるとおりだけど。
まずNumberというクラスの役目は何か調べてみ。
だけ、だよ それともどういう場面で呼ばれるのかが分からない?
>>526-527 見えてるとおりでしたか。
ただやっぱりどういう状況で使うものなのかよく分からないので
助言どおりちょっともう1度参考書見直してみます。
ありがとうございました!
int型をラップしたクラスを作りたかっただけだと思う。
Number n = 100; って出来る奴?
>>530 Yes
Number n(100);と等価ではないので注意
えっ?
>>514 方程式を解く方法は二分法とかニュートンラフソン法とか色々あるけど、解析的に一発で答えが求まる方法はないはず。
参考
www.mech.kumamoto-u.ac.jp/Info/lab/ape/mori/dark/others-j.files/others.files/non.ppt
ただcomplex.hのままではコンパイラに怒られる
int型の値をNumberクラスの値に型変換って時点でいまひとつ理解できてない気がします。
なので結局今まで使ってきた引数1つのコンストラクタとの違いが分からなくて
>>530 と
>>531 の違いがよく分からない。
int型をfloat型にキャスト変換するとかなら利用用途も分かりやすいんだけど。
>>534 ToHexStringを作ってみたいとか、NULL許容型のように動作させたいとか。
>>535 自分にはまだ早い気がしてきたw
取りあえず勉強します。ありがとう!
>>531 横からすみません
Number n = 100;
と
Number n(100);
はどちらも変換コンストラクタによるNumberオブジェクトの初期化ではないのでしょうか?
n生成後に
n = 10;
だと一時オブジェクトが生成されて変換が生じてnに代入される
と思ってましたが違うのですか?
一時オブジェクトが生成されて代入されるってのが等価でない点だろう?
>>537 前者はexplicitがついているとエラーになるのが違う
どちらもコンストラクタによる初期化だから等価
>>538 代入じゃねぇ。コピーコンストラクタによる初期化だ。
>>537 前者はコピーコンストラクタが private だとエラーになる。
>>525 が等価に見えるのは、コンパイラが自動的にコピーコンストラクタを作っているから。
>>544 を見れば、Number n2 = 222に対して、コンストラクタとコピーコンストラクタが呼ばれているのが分かると思う。
ん〜。 Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland Numberオブジェクト生成 コンストラクタ num=11 コンストラクタ num=222 一時オブジェクト生成後に代入 コンストラクタ num=3333 代入演算子 num=3333 変換演算子による出力 変換演算子 num=3333 3333
Copy Elisionだっけか
-fno-elide-constructors
VC4、6も
>>546 と同じだた
VC4は #include <iostream.h>、//using namespace std; にしないとコンパイル通らないけど
そんなことせんでもabout押せばオプションまでみんな載ってるページに飛べる
charとstringって何が違うの? 全く同じ使い方に見えるんだが
お前がそう思うならそうなんだろう(ry
文字列は基本的にchar配列 stringはchar配列の操作を楽にするためのクラス 配列の再確保とか自動でやってくれる(はず) ところでstd::string使ったこと無いんだけど、 strcpyとかに渡す方法あるの?
c_str() で渡せる。しかし、 strcpy()…そんな関数は使う必要がねーんだ。
あ、書込み元じゃなくて書き込み先ね。 >strcpy()…そんな関数は使う必要がねーんだ。 Windowsしか経験無いけど、APIが生きてるうちは 必要だと思う。
Windows依存コードならStrCpyやlstrcpyならともかくstrcpyの出番は無いな
>>557 Windows の人ならなおさら使えないだろうに。バッファサイズが云々で警告出るだろ。
>>559 古いコンパイラ使ってるから警告出たことはないなぁ。
最近のコンパイラだと XX_s 系を使えって出るのかな?
例としてstrcpyって書いたけど、実際はstrncpyか
memcpyを使ってる。
もちろん必要の無いときは使ってないけどね。
>>557 コピー元だろうと先だろうとそんなもんは要らぬ
>>557 ,560
なぜなら、オレや、オレたちの仲間は、
そんな関数を頭の中に思い浮かべる前には!
std::string::operator=(char const*) を使って、もうすでに書き終わってるからだッ!
だから使った事がねェーッ。
>>560 string内のバッファに自分で書き込みたいとか無理な注文よ
C++03まではそもそもvectorと違って連続してる保証ないから
APIで使う構造体なんかにテキストデータを設定する必要があるので、 std:stringのオーバーロードだけで完結するのは不可能。
>>564 そういうこともあるよね。やっぱり strcpy() は要らないんだけど。
>>563 string のバッファの連続性が保証されるのは次の規格改定 (C++0x) から。
vector のバッファの連続性が保証されたのが C++ 2003 から。
↓strncpyもmemcpyも要らん
while(*s != NULL) *t++ = *s++; *t = NULL; 書いていて思ったけど、危険なコードだ。
それが危険と思わなくなったらまたおいで
>>568 この場合は NULL と書かないほうがいい。
char *s, *t; ならば \0 とか、あるいは 0 とか。
nullptrは?
572 :
デフォルトの名無しさん :2010/07/06(火) 22:45:58
友人から「ファイルが読み込めない〜」って渡されたプロジェクトを、家に帰って実行してみたら vcprojから立ち上げた場合は、ファイルが読めてないもののプログラムの実行は出来て、 slnから立ち上げた場合は、プログラムの途中でWindowsによってブレークポイントが発生するんだけど、どういうこと? どうやら友人宅のPCでも同じ動作になる模様 調べて出てくるものは、大体二重deleteが原因って書いてあるんだけど、そのプログラムでは deleteキーワードすらないので、関係無いだろうし、slnファイルが壊れているのかも、と新規作成してみても 結局同じ動作になってたんだけど…
お前はスレタイも読めんのか
コールスタックくらい書けよ
やだ
Win32APIとGUIが使いたい windowsでC++という前提で、、、 MFCは古いし、C++/CLIは酷いし みんなはどうしてる?
Qt(キュート)ってのがある
ほう
WTLだろ
メンバテンプレートを特殊化するときクラススコープに宣言できない仕様になったのは どうしてですか?VC はできますが。 class X { template<class T> void f(T); template<> void f(int); // NG }; template<> void X::f(int); // OK
581 :
デフォルトの名無しさん :2010/07/07(水) 00:05:11
InkscapeってGTK+だっけ
正確にはgtkmmだろ って何の役に立つのこの糞アンケート
586 :
576 :2010/07/07(水) 08:44:03
みんなd それにしても色々あるな Qt そういう手があるかぁ。 MSの選択肢しか見てなかった… WTL 今まで詳しく見てなかったが、これWin32API+GUIにぴったしなんだね ATLやWPFあたりは調べたが、WTLは見落とし wxWidgets こんなのもあるのか、しかしそこまで手が回るかワカラン Win32API+GUIを使った初学者向けサンプルプログラムを書いているが、 MFCやC++/CLIは敷居が高いので困っていた
で?
const int a[] = { 0, 1, 2, 3, 4, 5 }; のような長さを明記しない配列宣言を const boost::array<int,?> b = { { 0, 1, 2, 3, 4, 5 } }; みたいにboost::arrayでやる方法はありますか?
男ならwin32API直叩き
>>588 ムリダナ
配列を作って、それとは別に
その配列を操作するためのラッパクラステンプレートでも作るといい
>>588 template <typename T, std::size_t N>
boost::array<T, N> & array_cast(T(&a)[N])
{
return reinterpret_cast<boost::array<T, N>&>(a);
}
template <typename T, std::size_t N>
const boost::array<T, N> & array_cast(const T(&a)[N])
{
return reinterpret_cast<const boost::array<T, N>&>(a);
}
int main()
{
const int a[] = {0, 1, 2, 3, 4, 5};
const boost::array<int, sizeof(a)/sizeof(a[0])> b = array_cast(a);
for (std::size_t i = 0; i < b.size(); ++i)
std::cout << b[i] << std::endl;
}
array_cast(T(&a)[N]) 何なんだよこの謎の書式。どの参考書買えばこれ載ってるんだよ。
>>592 & を取っ払って解釈→& をつけて参照、か。
仕様書読めば載ってるよ。
typedef int (* (&type)[10])(int (*)(void)) ;
やっぱブーストライブラリーってやっといた方がいいんですか?
>>519 今さらですが、そういうことです。
ここで聞くにはそういう聞き方をするべきでしたね。
すみません。
どなたかよろしくおねがいします。
>>597 分母のn次多項式=0を解きたいのなら、ニュートン法を使う。
>>597 4次まではあるが、5次かそれより大きいものについては、一般解というものは存在しなかったはず。
>>599 公式はないけど、どこかに解はあるわけで、
それを数値的に求めるアルゴリズムはないか・・・って話じゃなくて?
というかいくつか上に答え出てるけどな
>>521 とか
>>533 とか
代数的解法はないっていうだけ。
因数分解したいとかいってるから、解析解も出せるなら出したいようだ
へえ
いずれにせよ板違い
C++でメイン処理作ってGUIだけ別にする。 Win32xx C# HSPなど。
GUI だけ別にする場合ってプログレスバーとかどうすんの? GUI 側から処理用プロセスを起動するとして、 その起動中の処理用プロセスから情報(=進行度)を取得って何使うの?
たとえば総合アーカイバDLLみたいにつくればいいんでは。 圧縮中に進行状況取得出来る。
いくらC++スレとはいえ度肝を抜かれる質問であった
template< class T > class ArrayAccessor { public: template< int N > explicit ArrayAccessor( T(&a)[ N ] ) : array_( a ), size_( N ){} T& operator []( int index ){ return this->array_[ index ]; } private: T* const array_; const int size_; }; int temp[] = { 8, 5, 7, 3, 6 }; ArrayAccessor<int> aa( temp ); こんな感じで配列のラッパクラス作ったんですが これを二次元配列に拡張するのはどうすればいいですか?
>>609 そこまで出来れば十分だ。こうすればいい。
ArrayAccessor<ArrayAccesor<int>>> a;
a[1][2]=3;
int temp[][3] = { { 0, 1, 2 }, { 0, 1, 2 }, { 0, 1, 2 }, { 0, 1, 2 }, }; ArrayAccessor<ArrayAccesor<int>>> a(temp); 初期化がうまくいきません。
template<typename T> class array1d { public: template<int N> explicit array1d(T (&x)[N]) : p_(x), n_(N) {} array1d(T * p, int n) : p_(p), n_(n) {} T& operator [] (int i) { return p_[i]; } private: T * p_; const int n_; }; template<typename T> class array2d { public: template<int N, int M> explicit array2d(T (&x)[N][M]) : p_(*x), n_(N), m_(M) {} array1d<T> operator [] (int i) { return array1d<T>(p_ + m_ * i, m_); } private: T * p_; const int n_, m_; }; 作ってみたものの、気持ち悪いな テンプレート引数で次元を設定して――とかやるのは面倒そうだし
ファイル入出力をしたときに、扱ったファイル名をcoutで出力するにはどうしたら良いでしょうか? fout.open( "hogehoge.dat" );の直後に「hogehoge.datに出力しました」というのをcout<<"hogehoge.dat"<<endl;としないで直前に扱ったファイル名を出力できる形式にしたいのです。
質問です。 BidirectionalIteratorで走査するSTLコンテナを自作するとき、 cont.back() == *--cont.end() を保証するべきでしょうか?
どうやっても無理なので諦めろ という揚げ足取りはともかく言いたいことは分かる 保証してくれないと困るだろう
>>612 > テンプレート引数で次元を設定して――とかやるのは面倒そうだし
任意個のテンプレート引数ってC++0xで導入されるんだっけ?
その場合、簡単にできるのかな?
617 :
614 :2010/07/12(月) 20:47:53
>>615 どうもです。
もっと正確には、cont.begin() != cont.end() のとき --cont.end() が有効な要素を指すイテレータでなければならないか?
ということなのですが、検索した情報を読むかぎり「end() は終端要素+1の位置を指すイテレータを返す」という説明が多かったので、
やはり --cont.end() は有効なイテレータになるべきなんでしょうね。
>>617 sizeが0のコンテナだったらどうなると思う?
static bool isProxyError() *.cppにこれが書いていて、*.hには書いてありませんでした 何がしたいんですか?
*.cppの中だけで使う時にそうする。
621 :
619 :2010/07/12(月) 21:46:02
622 :
614 :2010/07/12(月) 23:32:31
>>618 >cont.begin() != cont.end() のとき --cont.end() が有効な要素を指すイテレータ
cont.begin() == cont.end() の場合は、 *--cont.end() は未定義でしょう。
ろくに読まずに横レスします。
>>618 イテレータクラスの
operator--()
のオーバーロードについて一切言及がない以上、
任意の実装が成されていても問題ないと考えられるため、
> --cont.end() が有効な要素を指すイテレータ
というという期待をしては行けないってのが
C++の考えなんじゃないでしょうか。
624 :
623 :2010/07/13(火) 13:02:49
Exceptional C++ 読むと、--cont.end() がコンパイルできるとは限らない (実装がイテレータとして生ポインタを返す場合)とあるね。
だから > イテレータクラスの > operator--() > のオーバーロードについて一切言及がない以上、 > 任意の実装が成されていても問題ない なんじゃね?
reinterpret_castは無理やりキャストできるそうですが、 どんなメリットがあるのですか?
キャストはメリットがどうとかで使うものじゃないだろ
>reinterpret_castは、愚直なキャストである。 >reinterpret_castは、値を保ったまま、型情報だけ変えることのできるキャストである。 >だから、int *からfloat *とか、some_class *からother_class *などといった、お互いに継承関係になく、ユーザー定義の型変換関数もない型のポインターやリファレンスにも変換できる。 >これは、変換するというより、型だけ変えるというべきである。値はそのまま保持される。
>>627 ポインタをWPARAMやらLPARAMやらに渡したり、逆に受け取った側でポインタに戻したり
こうしてみるとWindowsがC++に与えた影響は大きいな LinuxとかUNIXだけだったらC++もCのような簡素な物になっていたかも
単に
>>630 が環境依存かどうかという区別がつかないアホの子なだけだろ。
>>632 つか、お前が勝手に環境依存の問題だと勘違いしてる馬鹿な子だと思うが。
実例として相応しくないというなら、お前が挙げれ
じゃあ説明してやる。 reinterpret_castにできること。 ・ポインター型と整数型の間の型変換 int *型からintとか、int型からint *など。 ・異なるポインター型の間の型変換 int *からfloat *とか。 ・異なる参照型の間の型変換 int &からfloat &とか。 ・異なるメンバーポインターの間の型変換 説明が面倒なのでコード例 struct A { int value ; } ; struct B { int value ; } ; int B::* ptr = reinterpret_cast<int B::*>(&A::value) ; ・異なる関数ポインター型の間の型変換 これも説明が面倒なのでコード例 void f(int) {} void (*ptr)(short) = reinterpret_cast<type>(&f) ; これ以外の型変換はできない。
>>634 >・ポインター型と整数型の間の型変換
>int *型からintとか、int型からint *など。
これが正に
>ポインタをWPARAMやらLPARAMやらに渡したり、逆に受け取った側でポインタに戻したり
でしょうに。。
>int *型からintとか、int型からint *など。 intが32bitになっている64bitコンパイラでは通らないけどね。
なんで整数型といえば済むところに、 ある特定のプラットフォームのSDKのヘッダーの中で宣言されているtypedef名を持ち出すんだ? 例としてあげるにしても、まず一般的な説明をしろよ。 それから、通るか通らないかは、実装ごとに異なるので、どうしようもない。 あくまで例だ。
>>637 ん、整数型とポインタが変換できる?
そのメリットは?
ってなるから、実例を挙げてるだけじゃないの?
別にどっちの答えが正しいとかじゃないと思うけど。
そして、どっちの回答が悪いと言うわけでもない。
WPARAMって何?って人には伝わらない例は悪い例だろ。 特に環境依存の話がスレ違いになるここじゃ。
Winしか経験ない奴はそれがすべてだと思ってたりするから
>>641 何が言いたいのか知らんが暴論だよ。
俺も基本的にはWindowsしか経験が無いが、WPARAMやLPARAMで
パラメータを渡す古臭いAPIを良いとは全く思ってねーし
reinterpret_castの説明には適してないとわかる、というかそれ以前に
VCだと古い形式のキャストでWPARAMにポインタ渡しても警告なんて出ないと記憶してるんだが。
reinterpret_castの変換自体が処理系定義だからな…
決まってることはいくつかあるけどね。たとえば
"ポインタ型から十分大きい整数型に変換し、元のポインタ型に再変換すると、変換前と変換後のポインタ値は一致する(ポインタ値と整数値は一致するとは限らない)"とか
"定数0をポインタ型に変換すると空ポインタになる(変数0はそうなるとは限らない)" とか
"空ポインタを別のポインタ型に変換するとやっぱり空ポインタになる" とか
Windowsな人はVSスレで、Linuxな人はGCCスレで質問するのがいいと思う
あとどこから引用したか知らないけど
>>629 はウソ情報じゃね?
参考までに規格書草案
http://www.kuzbass.ru/docs/isocpp/expr.html#expr.reinterpret.cast
>>642 いや、そんな話じゃないんだけど
俺が言いたいのは、Winしか知らない奴は、他人もWinを知ってて当然で、
いきなりWPARAMとか言っちゃっても通じると思ってたりするって事だ
645 :
643 :2010/07/14(水) 21:39:17
">あとどこから引用したか知らないけど
>>629 はウソ情報じゃね?
(処理系によってはウソとは限らない)" だわ……すまん
> アホの子なだけだろ。 無闇に煽るとこんな流れになるよな
どのようなときにreinterpret_castを使うのですか? と本当は聞きたかったんじゃないかと俺は思う
長いクラス名は嫌がられるのでしょうか?
例えば
>>650 80字以下ぐらいにしとけばいいんじゃない?
名は判りやすいのがいい 長くても判りやすければいいかと
たとえばクラス名の一部にPerformanceという言葉を使う場合、Perfと略すのも普遍的であると思います これをわざわざPerformanceという正式なものをクラス名に採用するということです
採用しろ
略に普遍性などない。 慣習に擦り寄っているに過ぎない。 必ずグレーな単語にブチ当たって己を苦しめる事になるであろう。 はっはっは
一番上がいちばん遅い。 #include <iostream> #include <string> #include <time.h> using namespace std; string fnc1() { return string(1<<16, '\0'); } void fnc2(string &s) { s=string(1<<16, '\0'); } void fnc3(string &s) { s.assign( 1<<16, '\0' ); } int main() { int c,n, N=100000; string s; c=clock(); for(n=0; n<N; n++) s=fnc1(); c=clock()-c; cout<<c<<endl; c=clock(); for(n=0; n<N; n++) fnc2(s); c=clock()-c; cout<<c<<endl; c=clock(); for(n=0; n<N; n++) fnc3(s); c=clock()-c; cout<<c<<endl; getchar(); return 0; }
3番がかなり速いが、これはメモリの生成が少ないからだな。
1バイトめがchar型で、2、3、4、5バイトめがfloat型のファイルから読み込むときに、 ifs >> buf_1 >> buf_4f; と ifs.read ((char*)&buf_1, 1); ifs.read ((char*)&buf_4f, 4); で結果が違うのですが、そういうものでうか? >>を使うと不正な値(例えば0)が読み込まれます。 readを使うと正しい値が読み込めます。
>>657 1番目と2番目の違いはコンパイラによっては最適化で消えるし。
あとわざとかもしれないけどゼロメモリを確保してもOSによっては実際には確保されないし。
>>659 ストリームオペレータはテキストファイルを読み書きするものだし。
>>657 Embarcadero C++では1≒2で3が1の半分を少し下回った
MinGW(gcc4.5.0)では1≒2≒3で3が少し速かった
VC10ではECCと似た傾向だが約2倍速い
処理系によって差が出るね
当たり前だけど
VC10でfstreamでファイル書き込むとビッグエンディアンになるみたいなんだけど、どういうバグだろう???
663 :
662 :2010/07/15(木) 16:20:51
あ、やっべ勘違いしてるかもしれん。 アラインメント関係のような気がしてきた。すまぬー。
664 :
662 :2010/07/15(木) 16:33:17
ビットマップの書き込みしてたんだけど、 アラインメントが4バイト境界だったのでファイルに落としてもおかしな形式になってたのでした。 いた汚してごめんなさい。 手当たりしだい#pragma packを突っ込んで解決した。
Windowsアプリケーションのソースですが class TextClass : public exception { public: void Release(); // リソースの開放 private: LPTSTR message; void SetMessage(LPCTSTR message); }; void TextClass::SetMessage(LPCTSTR message) { // クラス変数にコピー this->message = (LPTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlen(message) + 1) * sizeof(TCHAR)); lstrcpy(this->message, message); } 外部からSetMessage()を2回呼ばれると 1回目に確保したメモリがリークしませんか? 「すでにメモリ割り当てを行っていたら開放してから再割当て」 という処理を書く必要があると思うのですが それを調べる方法はあるのでしょうか? 制御用の変数を新たに作って制御する必要がありますでしょうか?
>>665 コンストラクタの段階でmessageにNULL突っ込んどいて、
SetMessageが呼ばれた段階でNULLなら初回呼び出し、NULLでなければ2回目以降と言う判断はできるかな。
色々便利だから、メモリの長さも保持しとくといいよ。
>>666 なるほどなるほど。それでできそうですね。
ありがとうございました。
668 :
665 :2010/07/15(木) 18:24:05
ふひひひひ。 Visual Studio 2010のデバッガは NULLで初期化したポインタの値を 強制的に0xccccccccに書き換えるらしい。 なので挿入するIF文は if (this->message != NULL && this->message != (LPTSTR)0xcccccccc) が確実っぽいです。
669 :
665 :2010/07/15(木) 18:45:39
>>668 なんだそりゃ、おせっかいにもほどがあるなぁ。Windowsの罠か!?
NULLで初期化したじゃなくてNULLで初期化してないの間違いじゃない? 初期化してない場合は不定値になるんだから0xcccccccでも問題ないと思うけど
NULLで初期化して0xccccccccに書き換わるわけないだろ。
明らかに未初期化ポインタですw
>>668 ,、‐ " ̄:::゙:丶、
,r::::l3゙::::::::/ハヽ:ヽ::::、:ヽ
{::://:::::::// ヽ\ト、:::::::!
ヾ l:::::::/ 丶 `ヾ ィ、:::|
|;:r::| O` 'O ゙ハ| < ないない
ヽハ :.:. :.: レ
´\ r‐--‐、,ノ
r、 r、/ヾ ̄下ヘ
ヽヾ 三 |:l1、_ヽ/__ .ィヽ
\>ヽ/ |` } n_n| |
ヘ lノ `'ソ l゚ω゚| |
/´ /  ̄|. |
\. ィ ___ | |
| ノ l | |
| | i:| |
675 :
665 :2010/07/15(木) 20:33:45
そうです、勘違いしてました。忘れてください。 オーバーロードしたコンストラクタから、デフォルトコンストラクタを呼び出そうとして TestClass(); と書いたのですが、これは別オブジェクトを生成してることになり、そこで混乱が生じました。
this->とか
そういやthis->って書いたことないな
夏だなぁとか夏だなぁ厨とか言われますが実際に夏にはこうなるものです
(this->*func)(); でよく使う。
それは良くないスタイルだ。
あ? ディスってんのか?
いえ。呆れてるだけです。
VS2010ならnullptr使えと思った
フフフフフフフフ
メモリアロケートなしでプライベートメンバーをソースファイルに隠蔽したい場合は配置newで無理やりやるしかないの?
意味がわかんね
pimplを動的確保なしでやりたいんじゃね?
配置構文new
グーグル先生がSTLのコンテナ使わないのってなんで? boostの方使えってこと?
>>689 C++標準化委員会よりスキルが上な自信があって、さらに彼らが信用できないと考えてるから
We do not allow variable-length arrays or alloca(). ってあるけど可変長配列のことじゃないんか。
gccの独自拡張だろ? こういうやつ void f( std::size_t size ) { int buf[size] ; // 定数でなくても良い } だいたい、書いてあるじゃないか。 >Variable-length arrays and alloca are not part of Standard C++.
ああ、考えて見れば、C99の機能だったな。
-ansiオプションを常に付ける癖を付けとくといいよ C99機能が当たり前のように慣れて他のコンパイラに移行する妨げになるのを防ぐ
今時C99に対応してないコンパイラなんてあるわけないだろw
あるから困る。具体的な話はスレ違いになるので割愛。
C99とかクソだし。
そのクソだというc99で当たり前のように使える可変長配列(これはSTLで事が足りるが)もrestrictもないC++
C99は全く支持されていないし、C++スレだし。
>>696 VC10はどうなの?C++0xの修正は入って来たけどC99なんて皆無だぜ?
一番よく売れているコンパイラとちゃうん?
>>699 可変長配列はC++のようにライブラリで組み込み感覚で使えるような対応ができないから言語仕様で対応するしかないからだろう。
ライブラリーだとスパース配列とか特定用途で効率のいい配列とか簡単に対応できる。
restricは普通のコンパイラはベンダ拡張で装備されてるしな。
>>701 皆無? ほんとに? c99で拡張されたprintf()の"%lf"も使えないの?
> VC10はどうなの?C++0xの修正は入って来たけどC99なんて皆無だぜ?
>>703 2008→2010でC++0xに少し対応したけどC99の対応は変わってない
ってことじゃないの?
もしそれに関して詳しく知ってるなら教えてくれない?
そろそろswitchでstring使えるようになったか?
>>706 ハッシュ値でswitchすればいいんじゃね?そのほうが速いだろうし。
C99は死産だったと思った方がよい C++かC++0xがこれからの時代のトレンドですよ だいたいC99なんてスレ立ってないでしょ?
>だいたいC99なんてスレ立ってないでしょ? ひどい2ch脳
今時C99なんかよりD言語の方が余程使われているよ
いまさら動的配列だけじゃメリットないしな。
STLのヘッダってインデントが不自然なんだけどなんであんなふうになってるんですか
>>712 書いた人の癖かヘッダジェネレータの出力がああなっているとしか
gccのなら8タブで見てみたらいいと思う。 それでも不自然な部分は書いた人のくせではなく、GNUのインデントスタイルのせいかと。
VC6で動いていた以下のテンプレートクラス内のstaticメンバの宣言がVS2010ではエラーとなってしまい class などの語を混ぜたりして弄ってみたのですが、うまくコンパイルできずにいます。 最近のC++コンパイラではどのように書けばよいのでしょうか? template <typename T> class a { public: class b { }; static b x; ///< これを宣言したい }; template <typename T> a<T>::b a<T>::x; ///< ここがVS2010でエラー
>>715 これでよくね?
template <typename T> a::b a::x
template <typename T> typename a<T>::b a<T>::x;
>>715 その場合a<T>::bは型であることを明示する必要がある
template <typename T> typename a<T>::b a<T>::x;
>>716-718 ありがとうございます
>>717-718 で正常にコンパイルできました
VS2010の出していたwarning 「依存名は型ではありません。'typename' を持つプレフィックスは型を示します。」の意味がやっとわかりました
ほんと助かりました
ありがとう!ありがとう!
2008までは typename なくても動いてたってのがおかしい話なんやで
VC6じゃね
>>719 日本語の意味がやっと判ってよかったね。
std::unique_ptr<int> Get() { return std::unique_ptr<int>( new int ); } std::unique_ptr<int> a; std::unique_ptr<int> b; a = Get(); a = b; a = Get();は通って a = b;の方はエラーになるんだけどなんで?
エラーメッセージくらい読めないの?
>>723 a=Get();は右辺値参照なのでムーブが行われるから通る。
a=b;はコピーなんでエラーになる。
int&& ってのは右辺値参照って言うのか。 C++0xの機能を知らないうちに使ってたわけね。
&&以前にunique_ptrが既にそうだw
>>726 右辺値参照は知らなくても恩恵にあずかれるのが凄い。
その分ライブラリ書く人は大変だけどな。
class T { public: boost::ptr_list<T> list; class I { public: boost::ptr_list<T>::iterator i; boost::ptr_list<T>::reverse_iterator r; }; }; reverse_iteratorでエラーになるんですけど何故でしょうか?
>>729 >>715-719 と同じで
typename boost::ptr_list<T>::iterator i;
typename boost::ptr_list<T>::reverse_iterator r;
とする必要がある
まて、
>>728 の T はクラス名であってテンプレート引数ではない。
733 :
732 :2010/07/19(月) 19:58:04
staticな関数ではなく、staticなクラスはどうやって作るんですか? C++ではシングルトンパターンにするしかないんですか?
普通にstatic変数で。intと同じ。 シングルトンはstaticじゃないよ。
全部名前空間につっこんどけばいいんじゃない
737 :
デフォルトの名無しさん :2010/07/20(火) 20:58:16
邪婆の数学ライブラリみたいなのは勘弁
なんでクラス使うの嫌なのかね
740 :
デフォルトの名無しさん :2010/07/20(火) 23:24:42
世の中には普遍的でどんな属性も持たない概念がたくさんある ・・・というメタな主張で相容れないものを感じるのさ
class Base{}; class Sub : public Base{}; class P { public: virtual ~P(){ delete base; } template<class T> void Create(){ base = new T(); } template<class T, class ARG0> void Create(ARG0 arg0){ base = new T( arg0 ); } private: Base* base; }; P p; p.Create<Sub>(); ユーザーにnew演算子を使わせたくないんで、テンプレートでnewを隠蔽するのは設計的にアリですか?
有名なデザインパターンです。
いや、auto_ptrはもう使うな。 unique_ptrを使え。
使える環境なら、な。
使えない環境なんてないな。
お前がそう思うんなら(ry
>>745 C++0xでないとムーブしようとするとコンパイルエラーが出る
ムーブ出来ない環境で使っても意味がない
unique_ptrなんて当然無いし、boostの一部も使えない環境だわ。
boost::scoped_ptrで代用しよう
自分で実装すりゃいいじゃん
ifstream でテキストファイルを読み込んで 文字数を取得 文字データをバッファに格納 をしたいのですが seekgみたいに文字列を末尾までカウントしたり readみたいに文字列をバッファに文字数分格納したり することができる関数ってありますか? それとも他になにかいい方法ありますか?
istreambuf
class Foo { public: template< int N > Foo(){ printf( "%d\n", N ); } }; どうすればFooのコンストラクタを呼び出すことが出来ますか。
テンプレートをclass Fooの方へ持って行くだけ。
staticの付いたものはいつ作られるんですか? 初めに呼び出されたときですか? Windows 7です
>>753 seekg(), read() を使えばいいんじゃないの?
>>757 関数ローカルなら初めて実行されたとき、そうじゃなければ main() 開始の前。
だいたいこんなところ。
signとunsignの数値を比べようとしましたって何? どうやって防ぐの?
勉強しなおせこのカス
for(int i = 0; i < v.size(); ++i)
>>765 > for(int i = 0; i < v.size(); ++i)
そのシチュエーションで出て来るのか。
VCつかってると警告出るよ。
キャストすればいんでね?
>>765 v.size()の戻りはstd::size_tだ。
for(std::size_t i = 0; i < v.size(); ++i)
でおk
static_cast<int>(v.size()) でもいい
前者の方がより正しいコードではあるな。 int振り切るsizeとか64bitだとありえるんだよなー。すげーなー。
ウザイよね。 いい加減に signed 側が負にならないことが明らかなシチュエーションでは黙ってて欲しい。 if (0 <= i && i < v.size()) とか。
for (unsigned int i = 0; i < v.size(); i++) なんてやってた
>>769 ,773
中途半端だな。
型を合わせるんなら size_type 使わないと。
こういうときに decltype(v.size()) が欲しくなるのかな。
イテレータ使えよ
BOOST_FOREACH() 使えよ
そうは言ってもループの中でインデックスを使いたいことがけっこうあるんだよね
C++で手っ取り早く、HTMLをDOMでパースして編集し、出力するには、どのライブラリがオススメ? libxml2でもいいんだが、クラスっぽく動くライブラリがあったらなぁと。
リバースする時は日本薬局方「吐根」がオススメ
>>778 HTMLは行儀よくかかれている物ばかりじゃないからDOMでパースするのは無理だとおもわれ。
>>774 X::size_typeは非負の整数型と規定されてるのでunsigned intで受けてもいいんじゃないかな
sizeof(X::size_type) != sizeof(unsigned int) な処理系のためにわざわざ地雷を埋め込む理由が分からない
イテレータ使えよ
>>782 地雷じゃねーだろ。
比較は、大きい方の型に拡張して行われるんだから。
「素人には地雷に見えることが問題」というならわからんでもないが。
あーごめん。 v.size() > UINT_MAXのケースを想定して 地雷ということか。
んー、でも、その点まで考慮して、というならば 配列の添え字にintを使っているコードは 全て地雷ということになるな。 sizeof(int) != sizeof(size_t) な環境(現実的には大抵の64bit環境)であれば。
そうだろ?
実際64bit環境なら大抵size_typeが8バイトでunsigned intが4バイトっしょ
まあ782がそんなところまで考えていたとは思えないけどな
環境依存で悩む場所じゃないだろこんなの。 size_type size() const;なんだからsize_typeで受けるのが当たり前。 size_tはまだ許せるとして、なんでintやunsignedを持ち出すの?
vectorの添え字にintを使うべきではない なんて、最低だね
規格としてそうなっているから、それに従うべき と言っている点に文句は無い。 問題はそうやってどんどんとっつきにくくわかりにくくしていく 言語仕様(ライブラリ含む)が、どうしようもなくドロドロだということ。
google先生はunsingedは使うな言うしどうすればいいのー
>>791 sizeof(Array) / sizeof(Array[0]) はsize_t型になるのだから
Arrayの添え字には、size_tもしくはptrdiff_tを使うのが当たり前ってことかね?
size_t size() constだと思ってた 今度確認してみよう… もしかしてVC++だから?
797 :
デフォルトの名無しさん :2010/07/25(日) 02:03:55
>>791 auto が「ない」状況では仕方あるまい
このネタ定期的にループするな
forはループ命令だしね。
auto があれば for (auto sz = v.size(), i = 0u; i < sz; ++i) {} とでも書けばいいか
auto 使えるんならイテレーターにするわ
でも数学的な実体 (行列, 数列, etc.) を 扱うなら iterator よりも index の方が 普通は慣れてることもあって使い易いよ。
>>800 >auto があれば
すでにあるよね?auto int i = 0;とか書けるじゃん
>>803 そのautoじゃなくてC++0xのautoでしょ
ネタにマジレス
>>790 VC++もターゲットが64ビット環境ならsize_tは64ビットですよ。
boost::format に対する std::format みたいなのありますか?
C++の常識はプログラミング言語の非常識
yLib1.a を利用する MyLib2.so を作ります。 このときアプリからは MyLib2.so のみをリンクすれば使えるようにしたいです。 MyLib1.a を MyLib2.so の中に埋め込むにはどうすればいいでしょうか?
>>810 お使いの環境を確認して専用スレへどうぞ。
VC++ で std::vector<int> a; typeof(a)::iterator b; みたいなことってどうやったらできる? 一行目がvectorだったりdequeだったりしても二行目を書き換えずに済ませたい
std::vector<int> a; auto b = a.begin();
>>812 typedef std::vector<int> container;
container a;
container::iterator b(a.begin());
必要に応じてtypedef宣言をdequeに置き換えればいい
というかすでにdecltypeを実装してるだろ。
>>808 じゃあ教えてくれ、以下のようなことをやるのにイテレータを使って
どうやればいい?
for (unsigned int i = 0; i < n; i++) {
for (unsigned int j = i; j < n; j++) {
if (i != j) {
v[i][j] = v[j][i];
v[j][i] = 0;
}
}
イテレータだとループ中、現在位置が分からないというのが最大のネック
>>818 なんでベクター限定のコード書いてイテレータがどうとか言ってんの?
ベクター限定なんだからそのままのコードでいいじゃん。
全然関係ないけどそのコード自体見直した方がいいよ。
「私は劣化プログラマです」って言ってるようなものだよw
コンテナや使い方によるけどイテレータ使うのは要素全部に処理するときがほとんどだなぁ 逆順イテレータとか使いにくそうじゃない?
>>819 unsigned int使ってるって言ったの俺だよ。
劣化プログラマですっていうのは受け入れます。
元々unsigned int使わざるおえなくなったのは上のvectorの
場合なんだ。
イテレータ万能というように言う人が結構いたので、
あらためて質問という意味で書かせてもらった。
これはイテレータ使わないよね?
あと、間違えがあって、
× v[i][j] = v[j][i];
○ v[i][j] += v[j][i];
イテレータを使わないとしたら、
インデックスになると思いますが、インデックスは
unsigned intではなかったら何を使うと良いでしょう。
さらに、このコードがクソ過ぎると思われた方は、
根本的に添削していただけると助かります。
>>820 別に無理して使うものではないんだよ。価値を感じる(理解)人が使えばいい。
コンテナであればベクターであろうがリストあろうが同じコードで処理できるんだよ。
こういう抽象化に興味がない人には無用の長物。
コンテナを逆順に走査する必要があったときにリバースイテレータを使えば、
正順と全く同じコードで逆順が実現できる。
この辺の意味がわからん人が無理して使うような物でない。
>>821 いや、そうじゃなくてさ
for(std::size_t i = 0; i < v.size(); ++i)
の例に「イテレータ使えよ」と言っただけなのに
なんで
>>818 みてーな例だして噛み付いてきてんの?アホなの?
>>823 すまん。C++始めて2週間なのです。アホです。
どんな場合でもイテレータは使えるのかと本気で期待しました。
が、数値計算的なことには無力と分かって良かったです。
>>822 もっと抽象的な処理で有効ということですね。
ありがとうございます。
>>821 >イテレータ万能というように言う人が結構いたので、
多分意味を取り違えてる。
>これはイテレータ使わないよね?
やりたいことはベクター(配列)であることが絶対条件だし、
配列のインデックスでアクセスしたいんだから、素直にインデックスでアクセスしろよ。
>根本的に添削していただけると助かります。
if 文使う必要もないでしょ。普通のプログラマなこんなコードは書かない。
>>824 >が、数値計算的なことには無力と分かって良かったです。
全然理解できてないぞw
>>822 そうだね。まあListなら使うしかなさそうだけど。
stlのバグ見つけたときから過信して何でも使わないようにしてる。
>>818 現在位置ならstd::distanceで求めれば?
ここまで、unsigned int ついてツッコミなし
>>829 ありがとうございます。STLは奥深いですね。
勉強します。
>>830 気になるのでどの辺がつっこみどころなのか教えてくれませんか
unsignedが出てきたら間違い
>>833 気にしない方がいいよ。
>>830 は size_type を使うように誰かに教わって、それが全てだと思い込んでいるのだろうw
830はsize_typeの人ではなく、 彼自身も知りたがってるとは考えられないのか?
>>818 イテレータで…という質問の答えにはならないけどこうかな
// boost-ublas
auto u = triangular_adaptor<decltype(v), upper>(v);
auto su = triangular_adaptor<decltype(trans(v)), strict_upper>(trans(v));
auto value = u + su;
確かにイテレータは行列や四元数なんかのアクセスには適当じゃない
行列は行列で別の抽象化の技法があるのでそっちを使えばいいんじゃないかな
イテレータだろうが添え字だろうが要は道具なんだから使い方次第
イテレータ知らないから使えない(´・ω・`)
イテレータって[]←これだよね
生配列を使わなくなって何年も経つ。
C++0xではテンプレートメタでenum判断できますか?
nullと0を分けてくれませんか?
nullならをそういうふうに定義すればいいだけでは?
>>846 おお、こんな関数がありましたか。
ちなみに0x以前にもあります?
queueとstackとvectorの使い分けの例をよろしくお願いします
vectorで作ってたら前から挿入したくなってムラムラしてdequeにした、みたいな?
adaptor
スタックはたぶんインデックサが無い。 ベクタはメモリが一本だから、旧来のファイル等のAPIに使える。 キューは順番が必要なとき使う。 デキューは上記のとき意外で使う。 俺は特に制約が無いときはデキュー使ってる。 細かくアロケートしてメモリ効率よさそうだからな。
855 :
デフォルトの名無しさん :2010/07/31(土) 14:01:34
C++で文字コードをunicodeで やるにはどうしたらできますか?
wstring
VCならオプションで文字セットをUnicodeに設定して wchar_t a = L"あいうえお"; std::wstring b = L"かきくけこ"; wprintf(L"%s %s\n",a,b.c_str()); とかやればいいんじゃないの
文字を入れるにはどうやるんですか?
すみませんMINGW(GCC)なのでわかりません。 教えてください。
UNICODEてなんだよ
GCCでそのLをつけた書き方はどうやりますか?
TCHAR、_T()マクロ使えばいいんじゃね?w
メンバー変数を持つ抽象クラスの書き方を教えてください。 ID番号を持たせたいです。
std::tr1::regex を使って "あああああ"を"(1)(2)(3)(4)(5)" のようにマッチする度に値を変化させて置換する方法ってありますか?
class Interface { virtual int id = 0; } のようなこと
virtual int id() = 0;
インターフェースっていうのは
お断りさせていただきます
やはり言語のバグか 策定に私を参加させなかったのが裏目に出ましたね
普通にclass書いてコンストラクタをprotectedにでもしとけ
const int func(); …… case func() : // コンパイルできない …… なぜcaseのところにfuncが入らないのでしょうか?
定数式でないから constじゃなくconstexprを付けないとだめ
なぜわざわざconstとconstexprで分けられているのでしょうか?
↓wikipediaから引用 int GetFive() { return 5; } int some_value[GetFive() + 5]; // 10 要素の整数配列を作りたいが、C++ では不正。 GetFive() + 5 が定数式でないため、これは C++ では不正となる。 実際には GetFive は実行時に一定値を返すが、 コンパイラにそれを知らせる方法がないのである。 理論上、関数はグローバル変数に影響を与える、 実行時に結果が変わる他の関数を呼ぶ、などの理由がある。
問1 constにconstexprの機能を持たせた場合予想される弊害を答えなさい。
>>877 どこにつけるconstについてか述べなさい
constexprが何か知らない俺が困る
880 :
デフォルトの名無しさん :2010/08/01(日) 13:29:53
case の比較順序が未規定だから switch(x) { case func1(): goto L1; case func2(): goto L2; } goto L3; L1: //func2() が実行されたかどうかわからない L2: //func1() が実行されたかどうかわからない L3: # 配列やグローバルの話に飛ぶ必要はない
switch(...) { case func(): ... // a.cpp const int func() { return ...; } // a.h const int func(); constが付いていてもコンパイル時定数ではないのでNG
>>880 >ほにゃららが実行されたか分からない
分からなくていい場合は?
>>881 >constが付いてもいてもかくかくしかじか
コンパイル時定数ではなくてもいい場合は?
C++より自由に何でも書けてプログラマーの思考を阻害することなく、そのまま表現できる言語ないですか?
コンパイル時定数ではなくてもいい場合は別にいいんじゃね ただしcaseラベルはコンパイル時定数でなければならない
>>882 C++にこだわりがないのなら、RubyとかPythonとかを使えばいいじゃない
C++を勉強中でEffective、ExceptionalやD&Eを読んで 今はModern C++ Designを読んでるけど、なにこの変態言語… みんなC++の言語仕様を全部理解して使ってるの?
886 :
デフォルトの名無しさん :2010/08/01(日) 16:49:47
/dev/nullみたいな、空のストリームを作ることって簡単にできますか?
理解してないよ!
>>885 C++0xでぐぐるともっと幸せになれるよ!
仕様が巨大過ぎるからコーディング規約で使う機能を絞ってる。
890 :
デフォルトの名無しさん :2010/08/01(日) 20:07:37
>>882 わからなくていいかどうかを、コンパイラに通知する方法を思いついたら禿にでも相談してみては?
> >ほにゃららが実行されたか分からない > 分からなくていい場合は? if文使えばいいでしょ。バカなんじゃないの?
>>892 お前のところはなんでもありでやってるのか
規約とか決めるからあんな便利な機能あるのに使えないって場面が増えるんだろw 新しい機能使うときは当然慎重になるべきだが規約で縛る必要はないと思う。
Google先生ですら規約で機能制限してるのに アホプログラマーが好き勝手にやらかすのを黙って見てるのはもっとアホだろ。
機能追加には慎重になるべきだと言っている文盲がw 規約を定期的に見直す作業するならいいけど、 そんな余裕はないだろうから規約制限しない方がいいと思ってる。
なんか言ってることがおかしい。 ・制限しない方がいい ・定期的に見直すべきだ ・新しい機能使うときは当然慎重になるべき 全部矛盾してるぞ。
コード規約は正しい記法を奨励し、正しくない記法を拒絶するようにするべき
オマエ文網だなwww 第一義的には制限するべきではないが機能追加には慎重になるべき。 稼動実績ないわけだから当然だよなw 仮に定期的に規約見直すならば、制限してもいいかなといっている。
なんで規約があるのかわからないから「あんな便利な機能があるのに使えない」とか言っちゃう
規約制限しない結果、バグだらけになったりするかもな。 慎重になるかどうかはプログラマーによるわけで、慎重にならないバカなプログラマーが出ないように規約で制限してんだろ。
>第一義的には制限するべきではないが機能追加には慎重になるべき。 だめだこりゃ。なんで規約があるのかを考えろよ
個人レベルで慎重になるとかありえないだろwww リーダーが責任を負うレベルでの話だよwww
規約といってもいろんな規約があるわけで、今は機能追加に関して話してんだろ?w 規約の意味とか論理飛躍も甚しすぎるんだがwww
徐々にwが増えるんだな。 どのレベルでとか誰が判断するんだ? ひとつの問題あって、それが個人レベルかリーダーレベルか。 そういうどうでも良い問題を避けるためにも規約は必要。 定期的に規約を見直すのは必要なことだが、出来ないなら規約はいらないというのは根本が間違っている。
むしろそろそろスレチなので止めるべき
バグで客に迷惑かけたら責任を取る、そのレベルw ぶっちゃけプログラマなんて何の責任もないんだがw 問題起きたらプロジェクトリーダーが全て責任を追わなきゃいけないのは当然だろw オマエはそのレベルの立場の人間じゃないのか? 規約の見直し作業を仕事に組み込む余裕なんてないから無理だろって言ってるんだけどな。 なんか話がまとまらないしスレチ言われたからもうやめる。
お前がアホだということはみんなに充分伝わったから安心しろよ
言っていることめちゃくちゃだな。 規約なきゃプログラマーは好きな機能というか自分の使いやすい機能を使うんだぜ? その機能のせいでバグが発生したとして、リーダーに責任取れと? そうならんように規約で制限したりして、確実なコーディングをするようにしているんだろ? リーダーが機能追加に慎重になったって、規約がないんだからプログラマーが機能追加に慎重になる保証はないじゃないか。 そういう慎重にならないバカなプログラマーが出ないように規約で制限しているといっているんだが。 > ぶっちゃけプログラマなんて何の責任もないんだがw 責任を取らないやつがルール無用で好き勝手しないようにってのが理解できないのかな?
ルールってのはぶち壊すためにあるんだよ
仕事してたらたまにいるだろ、バカプログラマーって。 一応戦力なんだが、すき放題やらせたら周りに悪影響が及ぶから そういうのを未然に防ぐためにはある程度規約が必要
>>910 アニキかっけーっす!
マジリスペクトっす!
ちょっと我慢出来ない。 規約がいらないと言ってるんじゃなくて、機能を制限するような規約がいらないと 言っている。 文盲共そこを間違えるな>< 要は良い機能があったとき使わせてくれる環境にしろと言ってんだよ。 そのときに慎重になるべきでリーダーレベルで責任をとれと言ってるんだ。 俺の文章力のなさは悪いと思うがそういうことだ。
914 :
デフォルトの名無しさん :2010/08/01(日) 22:29:32
なんとかとハサミは使いよう …「上の人」はこれができなきゃダメ コーディング基準は一切なしというのも極論すぎるが それでモグラ叩きが終わりになると思ってる奴はもっとダメ
周りが文盲なんじゃなくてお前の文にセンスがないだけだろ。 > 要は良い機能があったとき使わせてくれる環境にしろと言ってんだよ。 それには同意できるが、 > 機能を制限するような規約がいらない 追加する機能がどんな機能で、また追加したことによってどういうメリット、デメリットがあるか。 そういう調査や確認もせずに「利用してしまうプログラマー」がいるから規約として制限している。 本当に良い機能を持ってきて、なぜ追加できないのか、そんな制限取っ払えというのは理解できるが それが良い機能だとだれが証明してくれるのか。場合によっては重大な欠陥を引き起こさないとも限らない。 他のプログラマーが知らなかったことで、インターフェイスの違いによって誤動作を起こす可能性だってある。 プログラマーの能力の問題ではあるがプロジェクトとして複数の人間でやるのなら協調してやらないとだめだろ。 リーダーに良い機能を紹介説明しても取り合ってもらえないのなら、規約ではなくリーダーを責めろよ。 キミは「良い機能」だけを見て規約で制限することの間違いを説いているが、「悪い機能」も存在していることも忘れてはならない。 客に納品するのに、「良い機能を制限して効率を落とす」のと、「悪い機能を制限して欠陥を取り除く」のを天秤にかけるべき。 基本的には「悪い機能を制限して欠陥を取り除く」を行い、「良い機能を例外として取り扱う(規約上での使用を認める)」というのがベストではないだろうか。 キミは「良い機能を例外として取り扱う(規約上での使用を認める)」ことが出来ないなら、「悪い機能を制限して欠陥を取り除く」こともするべきではないと言っているんだ。 その間違いに気付いて欲しい。
std::numeric_limitsで任意のビットフィールドの最大値が取れないずお。
>>915 「悪い機能を制限」したらバグが減るのかい?
どうやって制限違反を検出するの?
制限内の機能を使ってもバグは出るだろう?
>>886 作ったことは無いけど、空のストリームイテレータなら作れるような気がする
>>917 原因が特定しにくくなるようなバグを未然に防ぐために規約があるんだ
多少の不便を強いてでも出したくない(特定困難な)バグがあることぐらいわかるだろ
規約っていうと例えばどんなのかね? 昔オレの会社では例外は禁止とかハンガリアンで書けとかあったなw
多重継承禁止とか、生配列禁止とか?
そろそろマ板でやってくんない?
newとdelete禁止
>>917 > 「悪い機能を制限」したらバグが減るのかい?
「悪い機能」なんだから、悪い影響を与えるに決まっていると思うが。
> どうやって制限違反を検出するの?
検出できないなら、制限せずに認めてあげるのっておかしいよ。
仕事の怠慢が発見されないなら、それが正当化されるわけではない。
> 制限内の機能を使ってもバグは出るだろう?
ヒューマンエラーなら、制限内かどうかは関係ない。出るときは出るし出ないときは出ない。
機能に依存したバグ(その機能が内在しているバグ)なら、その機能の使用を改めるべき。
何度も言うが、制限するのは「規約にない機能だから」ではない。
一律に制限するのは「悪い機能の可能性がある」から。
それが良い機能だといえるならリーダーに掛け合えば良い。
それでも利用できないならそれはリーダーの問題であって規約の有無は関係ない。
リーダーに決定権がないなら、決定権のある者の問題だな。
>>924 > 機能に依存したバグ(その機能が内在しているバグ)なら、その機能の使用を改めるべき。
たとえば何のことを言ってるの?
検出もできない、制限したってバグは出る。それなら余計な文書やリーダーに掛け合うだのいう
手間が増えてるだけじゃないか?
全部まとめてバグ出さなけりゃいいんだろ?
バグが無いことを証明するのは不可能なんて話もありましたね
927 :
デフォルトの名無しさん :2010/08/02(月) 00:26:37
多重継承や生配列の現場視点での議論はここのネタだろ、マ板でなく
動けば良いんでしょは動かなかった時に全員共倒れするから仕事では通用しない
本当に実用的なら「基本的にはダメだけど、こういう使い方に限ってはOK」とかやるよな 別に効率悪くするために規約つくってるわけじゃないし 「そんなコーディングしたらミスがでやすいですよ」っていう先人のアドバイスだと思う
>>925 > たとえば何のことを言ってるの?
>>917 の「制限内の機能を使って出たバグ」でその機能に内在しているバグのこと。
実際にあるかどうかは分からないが、そもそも話自体が抽象化したものなんだから具体例を挙げることは出来ない。
もし、そんな機能はないというなら、「悪い機能」はないというだけのこと。
が、悪魔の証明は不可能。
> 全部まとめてバグ出さなけりゃいいんだろ?
そんなのは不可能に近い。
というか、作る際にバグが出ないようにするのは間違いではないが、そんなことが出来るなら苦労はしない。
> 検出もできない、制限したってバグは出る。それなら余計な文書やリーダーに掛け合うだのいう手間が増えてるだけじゃないか?
その手間を惜しんで、ひどいバグを作り多大な損失を生むかもしれないというリスクとの天秤。
なんどもいうが、客に出した後、バグが発見されるよりは手間が増えるほうが結果的に労力は少なくて済む。
「余計な文書やリーダーに掛け合うだのいう手間」を惜しむ人間は共同作業はむかないと思う。
>>928 でも大半の現場はそんなもんじゃね?
スケジュールいっぱいいっぱいだから作り込む時間がなかったりしてさ。
でも約束してるからどうしても作らなきゃいけない状況とかほんと悲惨。
とりあえずお前ら gets() 禁止な
大丈夫だよ。 もう名前すら思い出せなくなっている。 ダンディ坂野だっけか。
あぁ、俺も忘れてたわ。
>>930 具体例を挙げることは出来ない?
そんな状態なのに、「何らかの」制限をかけて直近の手間を増やしたほうがいいのは確信しているの?
意味がわからん。
>>935 労力と損失(リスク)との天秤だよ。
そのどちらを取るかということ。
自分なら労力をとる、というだけの話。
そりゃ世の中には直近の労力惜しむ会社もあるだろう。
降水確率の意義って知っているか?
それと似たようなもの。
>>936 労力とではないだろw
安心とリスクの天秤だろwww
>>937 「余計な文書やリーダーに掛け合うだのいう手間」->労力
「ひどいバグを作り多大な損失を生む」->損失
>>936 具体的なリスクとして何を想定してるのか説明してくれないと話にならんな。
まぁスレ違いだし、このまま終わってもいいんだけど。
>>939 そういう想定が出来ないから、規約なんていらないとか言えちゃうんだよな。
>>938 新機能を入れるとその2つが出るってことだよね。
天秤の使い方がおかしいと思うけどw
今時規約も作らないで新機能ホイホイ入れちゃうようなバカプロジェクトあんの?
今時わざわざ規約で縛り付ける前提でC++選ぶようなバカプロジェクトあんの?
規約で縛り付ける(笑) C++関係ないし何を言ってるのか。
>>941 元は規約の話だろ。
規約による制限があるかないか。
その制限を超えるための労力 <-> 制限無しで使わせ発生する損失
つーかそんなことも分からないのか?
とりあえずC++限定でいいから制限する機能の具体例を挙げてくれよ。 何のつもりでしゃべってるのかさっぱりわからん。
ルールを決めてコーディングするなんて当たり前のことなのに こんなシンプルな事がわからない輩がいるのかよ。 何が新しい機能を縛ることによる損失じゃあ
機能追加なんて新技術の出現に伴って考えることが多いだろう。 そのときに柔軟に対応してくれるといいよね。
>>927 確かにそうだね
でもこの議論から(10年前にはその議論は終わっているという意見は置いといて)多重継承の使用の是非に関して結論は得られるか?
というと、多重継承に関して "何がよくて何がよくないのか?" とか "代替手段はなにがあるのか?" とかっていう議論を行うには
そのための下地の構築に失敗してるように見える
下地の無いままわいわいやってもいいけど、何も得られないんじゃないかな?
それに "下地の無いままわいわいやる" 用の板が隣にあるんだからそっちに移動したらいいと思う
まぁVIPとかに移動してもらってもいいけど
export とか例外仕様のことなのかな?
exportと例外仕様はC++0xで非推奨になるから使用禁止でいいだろう。 そもそもコンパイラが対応していなければ使いようがないが。 多重継承に関してはデータメンバを持たないインタフェースクラス以外の 多重継承は禁止でいいのでは?
テンプレート禁止
制限することで問題を解決するなんて実にナンセンスだ
例外仕様ってthrow()に限っては有用な気がしてるんだけど、どうなの
956 :
732 :2010/08/02(月) 13:59:57
throw() に限り noexcept 指定とシグネチャを同じに扱うとか、一応便宜は図られてるっぽい。
質問です。 template<class T, class U> U func(T x); のような関数を作りたいのですが、このままでは Foo x; Bar y = func<Foo, Bar>(x); のような書き方をしなければなりません。 templateパラメータUを引数から推測させ Foo x; Bar y = func<Bar>(x); とするためにはどう記述すれば良いのでしょうか。
>>956 おお、そんなキーワードが追加される予定なの?
その中ではnoexceptなメソッドのみしか呼び出せないとかできるとよりよいな。constメソッドみたいに。
>>957 template<class U, class T> U func(T x);
このスレはレベルが高くてついてけないよ
後ろは省略可能なの?
引数から推論されるんでね?
元の質問者ではないのですが、これって class U, class T の順番変わっただけだと思うのですが これでよくなるのはどういうルールがあるのでしょうか
テンプレートのことが分かってないんだったらもう一回勉強しなおすことをオススメする 理解するまで大して時間がかかる問題でもないし
>テンプレートのことが分かってないんだったらもう一回勉強しなおすことをオススメする 相談室の意味ねぇ!
だから自分で調べたほうがいいという答えを教えたんだよw
全部の質問それで終わるだろ!
語るに足る問題じゃないんだもんw 調べればすぐ分かる問題は自分で調べろよ。 その習慣をまず身につけてからの相談室だ。 こんなこと言ってる時間あればもう理解できると思うが。
お前が簡潔に説明できないだけだろがクズいいわけしてんな
もういいよ、呆れてものも言えないw
やめて私のために争わないでwwwwwww
にちゃんではよくあること
ある出来上がったアプリケーションのコードにconstを付けてもコンパイルできるところ全てに付けたら物凄い数になった。 何も指定しない方のデフォルトをconstにした方がいいレベルだぞ
const char* const p974 = "aho";
976 :
デフォルトの名無しさん :2010/08/02(月) 22:19:51
> 何も指定しない方のデフォルトをconstにした方がいいレベルだぞ struct をデフォルト public にせにゃならんようなのと同じしがらみだな
モタモタしてたD言語が全部悪い
Hogeクラスのデータメンバ int array[] にアクセスするのに以下の関数を用意しましたが、コンパイルが通りません。 const int& Hoge::at( const int pos ) const{ return array[pos]; } int& Hoge::at( const int pos ){ retrun static_cast<int&>( static_cast<const Hoge*>(this)->at(pos) ); } どこが間違っているのしょうか?
int& Hoge::at( const int pos ){ retrun array[pos]; } でいいだろ。
980 :
978 :2010/08/02(月) 23:48:48
>>979 >>978 はあくまでも例です。
実際は const int& Hoge::at( const int pos ) const
で色々処理をしてから return をしています。
その処理部分は int& Hoge::at( const int pos ) と共通ですので
非cont関数からconst関数を呼ぶようにしたいと思いました。
>>978 static_cast -> const_cast
>>981 const_cast -> const_const
>>958 そういうチェック機能は規格には入ってないよ。できて警告どまり。
これも昔の const と似た状態なんだけどね。
984 :
デフォルトの名無しさん :2010/08/03(火) 21:09:26
(´・ω・`)あつくて精子が全部しにそうだ
(*´ω`*)
4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlconv.h(757): warning C4995: 'wcscpy': 名前が避けられた #pragma として記述されています。 4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlconv.h(768): warning C4995: 'wcscat': 名前が避けられた #pragma として記述されています。 4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\cstringt.h(295): warning C4995: 'vsprintf': 名前が避けられた #pragma として記述されています。 4>C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\cstringt.h(667): warning C4995: 'vswprintf': 名前が避けられた #pragma として記述されています。 こんな警告が出ちゃうんですが修正する方法ありますか?
それは、VCの警告なのでスレチだと思う とりあえず、 1. wcscpy_s wcscat_s vsprintf_s vswprintf_s を使う 2. 可能な限り早く、 (たとえば、stdafx.hの先頭で) #define _CRT_SECURE_NO_WARNINGS する など
追加 3. 可能な限り早く、 (たとえば、stdafx.hの先頭で) #pragma warning( disable : 4995 ) する など だが、いずれにせよスレ違いだろう
すいませんVCと勘違いして投稿してしまいました. ありがとうございます.
では埋めますね.
次スレ立つ前に埋めるなボケ
つまりどういうことです?
次スレ立てて誘導しろっつーんだカス その前に埋めるんじゃねえ
では埋めますね.
埋め荒らしで通報します
,. -‐- 、 . // `ヽ、 . く. / ,. -―‐- 、', > . |/ヘ∧/\/レヘ/ __|__ゝ | _|_ |_ ―ー- . | | | O O || | | | | -ー―-、 . | | |、 r.┐ || / ̄:| ̄\ | __| __|_ ) . | | | `ー┴┴ '| | (_ノ ヽ l (__ノ ̄ヽ (_ノ ヽ / . |∧∨ ヽ /.ヘ| |ヽ _ / | | ∨ .| | i ___ ぃ l__ ぃ l / / 〈 〉 .〈 〉.|、 / ノ | \ | | / . / / |`′ Y | `~` ''ー- 、 ( | / |/ . / ./ .| l | ./ \ ノ ノ o / ./ ̄`ー-−-、. | .| / .( 二 ) ̄`ー、__ `l .|、 / /〈, , ,ノ `ー-| l、 `ヽ / . ( 二 ) 〉 // . 〈 , , ,}´ // / //
997 :
デフォルトの名無しさん :2010/08/04(水) 11:36:46
次スレ
誰もいないから1000はもらった
早く次スレ立てろ
(´・ω・`)1000だお
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。