C++相談室 part74
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/10/25(日) 00:22:58ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part73
http://pc12.2ch.net/test/read.cgi/tech/1254746834/
0002デフォルトの名無しさん
2009/10/25(日) 00:37:530003デフォルトの名無しさん
2009/10/25(日) 00:42:39クソレス
0004デフォルトの名無しさん
2009/10/25(日) 01:13:39環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0005デフォルトの名無しさん
2009/10/25(日) 14:31:42言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0006デフォルトの名無しさん
2009/10/25(日) 15:24:33や、やめろ
このスレは真面目なスレだぞ
0007デフォルトの名無しさん
2009/10/25(日) 15:26:06チンパンジー恐るべし
0008デフォルトの名無しさん
2009/10/25(日) 15:53:28cやc++でガーベジを使わずにやるときに配列に一度newで値を入れて、今度は別にnewで入れたときに、
初めにいれたどこからの参照されないnewのデータはどうなるでしょうか?
そのまま開放されればガーベジの意味がありませんし、だからと言ってnewで入れ替える前にdelete[]を使用してその後にnewを使って入れるのはdeleteが配列の中身を消せても、配列自体を
消すことができないと言うことになりますし。どうも解けません。
0009デフォルトの名無しさん
2009/10/25(日) 16:06:05deleteは配列の中身を消すわけじゃありません
0010デフォルトの名無しさん
2009/10/25(日) 16:06:24CやC++の仕様にガベジコレクションはない。
メモリはフラグメンテーションを起こすし、
解放されないメモリは死蔵されてシステムに緩やかな死をもたらす。
0011デフォルトの名無しさん
2009/10/25(日) 16:10:15後で調べたら多量(数十万回〜)のnew/delete濫用によるメモリのフラグメンテーションだったようだ。
C++ではこんな事もあるから面白いよね。
0012デフォルトの名無しさん
2009/10/25(日) 16:39:400013デフォルトの名無しさん
2009/10/25(日) 19:39:39ttp://codepad.org/cXkLu4rt
0014デフォルトの名無しさん
2009/10/25(日) 19:42:00とりあえずどの環境でどれだけ速くなったのかぐらい示せ。
0015デフォルトの名無しさん
2009/10/25(日) 19:54:470016デフォルトの名無しさん
2009/10/25(日) 20:03:000017デフォルトの名無しさん
2009/10/25(日) 20:34:58STLportのNODE_ALLOCATORでイナフ
0018デフォルトの名無しさん
2009/10/25(日) 20:50:32XP SP3
AMD Athron 64 X2 Dual 1.8GHz
BCC5.5
最大で65%以上高速化しました。
0019デフォルトの名無しさん
2009/10/25(日) 20:58:280020デフォルトの名無しさん
2009/10/25(日) 21:03:570021デフォルトの名無しさん
2009/10/25(日) 21:06:380022デフォルトの名無しさん
2009/10/25(日) 21:11:54無くなるんじゃないか?中身なんか入れないと実際のコードの参考になる
かわからんのでは。
あと、bcc ってあまり使わんから icc, g++ 位で比べて欲しい。
0023デフォルトの名無しさん
2009/10/25(日) 21:13:59「何に対して」なんて誰も聞いてないんだが。
あとな、高速化ってのは問題の処理全体のうちのどれだけを高速化できるかが大事なんだ。
仮に new/delete の処理時間が 65% 短縮できたとしても、それが全体の 0.65% ぐらいである
ことだってよくあること。「何の」 65% かってのは本当に大事。
ちなみに、サイズ固定のアロケータなら segregated storage と呼ばれる手法がほぼ最適。
おそらく >>13 のコードより速い。
0024デフォルトの名無しさん
2009/10/25(日) 21:55:26char a[256];
EASY_ALLOCATOR( Hoge )//new,deleteの宣言マクロ
};
int main(){
for(int j=3;j--;){ //3回ループしてみる
unsigned int time = timeGetTime();
for(int i = 0;i < 100000000;i++){ //1億回
volatile Hoge* h = new Hoge();
delete h;
}
time = timeGetTime() - time;
cout << time << endl;
}
return 0;
}
上記コードをVC++2008で最適化効かせて実行してみたところそれぞれ下のような平均が出ました。
アロケータON: 3500
アロケータOFF: 20900
なんか、最初は軽い気持ちで張ったのに、ムキになっちゃいました・・・。
あとsegregated storageは初めて知りました。自分のとはちょっと趣旨違うけど面白いですね。
スマポの次はアロケータにハマるかも
0025デフォルトの名無しさん
2009/10/25(日) 22:05:42segregated storage は趣旨が違う?
固定サイズの高速アロケータってことで、まったくいっしょじゃないの?
0026デフォルトの名無しさん
2009/10/25(日) 22:11:050027デフォルトの名無しさん
2009/10/25(日) 22:15:06ほんとだ。ちゃんと読んでみたら、同じですね。これは完敗だ。すごいです
皆さん、詳しいんですね・・・。精進せねば
0028デフォルトの名無しさん
2009/10/25(日) 22:16:520029デフォルトの名無しさん
2009/10/25(日) 22:20:43いい経験を積んだね。こういう経験は後に役立つよ
0030デフォルトの名無しさん
2009/10/25(日) 22:22:28メモリ確保のみで、アプリが動いているわけではない。
たとえ10倍速になったとしても、他がメモリ確保に比べて時間食ってたら意味ない。
0031デフォルトの名無しさん
2009/10/25(日) 22:24:00>>初めにいれたどこからの参照されないnewのデータはどうなるでしょうか?
誰かこの質問に答えてくれませんか?
あとガーベジですがvisualstudioのアレのことです。それを使わずに普通にcやc++でやるとって事です。
deleteは開放すると言うことくらいしか本やネットに書いていなく、詳細なことが書かれたものが見つからなくここで質問しました。
0032デフォルトの名無しさん
2009/10/25(日) 22:26:24宙に浮きます
0033デフォルトの名無しさん
2009/10/25(日) 22:27:06メモリ保持しているポインタに別のnewいれたら、先のやつは手を出せなくなる。
0034デフォルトの名無しさん
2009/10/25(日) 22:27:49誰もポインタを持っていないならそのオブジェクトは、アプリケーションから実質開放不能になります。
0035デフォルトの名無しさん
2009/10/25(日) 22:29:07003630
2009/10/25(日) 22:29:18それで比較するなら良いが、単純にメモリの確保と解放するだけなら価値がない。
0037デフォルトの名無しさん
2009/10/25(日) 22:29:490038デフォルトの名無しさん
2009/10/25(日) 22:29:59とりあえず「ガーベジ」と Garbage collection とをごっちゃにしてるみたいだけど、
「ごみ」と「ごみ集め」とをごっちゃにしてるぐらい迷惑だからやめろ。
0039デフォルトの名無しさん
2009/10/25(日) 22:31:03アレってなんだよ。もしかして.NETフレームワークのソレのことをいってるのか?
ソレならナニだからアレだよ。C++とは関係ない。
0040デフォルトの名無しさん
2009/10/25(日) 22:32:41C++のboostのように中途半端だと、速度面、保守性が悪くなると思う。
メモリリークを発見するツールのいいだろ。
メモリリークしなければboostの処理入れる必要がない。
0041デフォルトの名無しさん
2009/10/25(日) 22:34:47アプリ終了時に開放されないメモリをリストアップしてくれるから便利^^
何度助けられたことか。
でも、そのVC++とも2010でお別れ。
Standardエディションを終了して値段を3倍にするそうなので
もう手が出せません。
0042デフォルトの名無しさん
2009/10/25(日) 22:36:10ちゃんとauto_ptrとshared_ptr使い分ければいいだろ。
手動でdeleteなんて面倒だわ。
あと、リークするのはメモリだけじゃないぜ。
0043デフォルトの名無しさん
2009/10/25(日) 22:36:340044デフォルトの名無しさん
2009/10/25(日) 22:40:02string buf(1000, '\0');と確保すれば自動開放。boostの処理より速いだろ。
0045デフォルトの名無しさん
2009/10/25(日) 22:42:560046デフォルトの名無しさん
2009/10/25(日) 22:43:03つまりメモリーリークを起こさないためにはnewで入れ替える前にdeleteで以前のを開放してからnewを入れるって事でいいのでしょうか?
0047デフォルトの名無しさん
2009/10/25(日) 22:45:51いいえ。 std::auto_ptr や std::shared_ptr を使うのが正解です。
0048デフォルトの名無しさん
2009/10/25(日) 22:45:51初心者はnew使わない方が良い。stringやvectorで確保する方が安全。
関数や括弧を抜けると自動で消されるのが欠点だが、関数や括弧の前に確保しておけばすむ。
0049デフォルトの名無しさん
2009/10/25(日) 22:47:34クラスが複数必要なら、 vector <クラス>にしとく。
0050デフォルトの名無しさん
2009/10/25(日) 22:48:530051デフォルトの名無しさん
2009/10/25(日) 22:49:46メモリリークを起こさないためにはメモリを開放するまで
メモリへのハンドル(すなわちポインタ値)を管理しておく必要があるってことで、
ポインタ(変数)への代入とは無関係だよ。
0052デフォルトの名無しさん
2009/10/25(日) 22:50:280053デフォルトの名無しさん
2009/10/25(日) 22:51:350054デフォルトの名無しさん
2009/10/25(日) 22:52:47TCB見に行けば、スタックかどうかは判別できる。
かなりOS依存になるがな
0055デフォルトの名無しさん
2009/10/25(日) 22:57:53逆だろ
言語を憶える時に、それ自体を使うなってのは無理な話で、
問題点をろくに認識する前から刷り込まれたおまじないを
不適切に使ったり無用な争いを始めるほうが実用レベルではまずい
かつての goto 論争と同じこと
0056デフォルトの名無しさん
2009/10/25(日) 23:05:580057デフォルトの名無しさん
2009/10/25(日) 23:06:57っていうかね。
C#やJavaは配列のメモリを new で確保して要素の参照を保持するけど
CやC++はぜんぜん構造が違うじゃない?
0058デフォルトの名無しさん
2009/10/25(日) 23:07:55ガベコレとかVisual Studioのアレとか
C++に関係のない寝言を書くのもそのせいじゃないかと。
0059デフォルトの名無しさん
2009/10/25(日) 23:24:45以前それを解決するための処理を書いたことがある。
要はnew演算子をオーバーロードしてそこでリストに追加したりする訳だが
かなり重くなると思うんでお勧めはできない。
0060デフォルトの名無しさん
2009/10/25(日) 23:25:06私はjavaやc#はそこそこに慣れてますけど、cやc++は本を読んだ程度です。
C++/CLIなしのものは簡単なものしか作ってません。
0061デフォルトの名無しさん
2009/10/25(日) 23:43:10C#やJavaの配列をCのコードにした場合、
int a, b, c;
int **p = ( int ** )malloc( sizeof( int * ) * 3 );
p[0] = &a;
p[1] = &b;
p[2] = &c;
みたいなイメージになる。だから、free( p ); すると
a, b, c が使ってるメモリはどうなるの?って感じちゃう。
(もちろんこれはランタイムが自動で管理・開放してくれる)。
これがクラスオブジェクトになると厄介で
C#やJavaはオブジェクトを new で確保するので
class C;
C *a = new C;
C *b = new C;
C *c = new C;
C ***p = new C **[3];
p[0] = &a;
p[1] = &b;
p[2] = &c;
みたいな感じになる。
この場合のa, b, cはプログラマが管理するしかないので
delete *p[1], *p[2], *p[3]; の後、delete [] p; をしなければならない。
…CやC++ではこういう「ゲーム」(←メイヤーズ風に^^)はやらない。
0062デフォルトの名無しさん
2009/10/26(月) 01:24:390063デフォルトの名無しさん
2009/10/26(月) 01:36:310064デフォルトの名無しさん
2009/10/26(月) 02:59:18>cやc++は本を読んだ程度
なんて本だ。名前を書いてくれ。
その本を推薦図書スレにあげて
未来永劫手にしてはいけないクソ本として広めるから。
0065デフォルトの名無しさん
2009/10/26(月) 03:10:340066デフォルトの名無しさん
2009/10/26(月) 03:43:55つまりC++がクソ言語ってことだなw
0067デフォルトの名無しさん
2009/10/26(月) 03:51:46またまた冗談を!
Elements of Programming だろ?
0068デフォルトの名無しさん
2009/10/26(月) 03:55:36HTTP HTTPS FTPを簡単に扱えるライブラリはないでしょうか
0069デフォルトの名無しさん
2009/10/26(月) 03:56:05007068
2009/10/26(月) 03:58:33ファイルを書き換えれば対応できるとは思いますが。バグ出る可能性もあります。
CURLは動作が出来ないです。必要DLLが足らないとか出てこれるとバージョン違いで止まります。
依存が少なくwindowsXP以上で動くいいやつないですか。
http://clx.cielquis.net/
0071デフォルトの名無しさん
2009/10/26(月) 04:00:56どのwindowsでも動作するwindowsAPIだけを使うか、必要なものが静的ライブラリで組み込める物が良いです。
0072デフォルトの名無しさん
2009/10/26(月) 04:05:30知ってるところだと、70のCLXくらいです。でもhttps通信はOpenSSL必須です。
あとは巨大なGUIライブラリの一部としての通信機能くらいしか知らないです。
簡単でバイナリでは無いやつは無いんですか。
0073デフォルトの名無しさん
2009/10/26(月) 04:22:47InternetOpenUrlで自分でとってくるか。
InternetOpenUrlはバグがあった気がしててちょっといやなんだがな。
0074デフォルトの名無しさん
2009/10/26(月) 04:27:410075デフォルトの名無しさん
2009/10/26(月) 04:35:22一部だけgetってHTTPのGETの動作を否定してないの?そうでもないの?
0076デフォルトの名無しさん
2009/10/26(月) 04:43:04多くのサーバーで、ダウンロード中断してやり直せたり、部分だけ取り出せる。
0077デフォルトの名無しさん
2009/10/26(月) 04:51:41HTTP/1.1 では、リソースの一部だけを取得できる部分的 GET というものがあります。部分的 GET を使えば、例えば接続途中におけるエラーによって取得できなかったリソースを、その続きから要求するような事もできます。
http://www.studyinghttp.net/body#Range_Units
0078デフォルトの名無しさん
2009/10/26(月) 05:59:06コマンドだけしか付いてない配布形態もある。
Windows SDK for Windows Server 2008 and .NET Framework 3.5
http://www.microsoft.com/downloads/details.aspx?familyid=F26B1AA4-741A-433A-9BE5-FA919850BDBF&displaylang=en
0079デフォルトの名無しさん
2009/10/26(月) 13:12:47C++崇拝者なら何でも自分で作るのが原則です甘えないでください
RFC・W3C・ITU-T・ISO/IEC等で定められた規定や勧告の何万頁にも及ぶ資料の全て熟読し
その仕組みを骨の髄までしゃぶり尽くした極一部のプロフェッショナルだけがそれらの機能を利用することが許されるのです
それがC++の世界です!嫌なら.NETを使って楽をしましょう!.NETなら全てを安価に解決してくれます!!!
0080デフォルトの名無しさん
2009/10/26(月) 13:47:16windowsやlinuxに標準装備の部品を組み合わせたラッパーでいいんです。
ソケット通信から作る必要はないです。
ネイティブで動作して、
ブラウザの様にhttp://やhttps://やftp://を認識して
部分GETが出来たらいいです。
httpget (buf, "http://hoge.jp/hage.zip", 100, 1000);
みたいなやつです。
0081デフォルトの名無しさん
2009/10/26(月) 14:20:260082デフォルトの名無しさん
2009/10/26(月) 14:39:51「無い物は自分で作る」「ある物も自分で作る」
みんなそうやっています 以上
0083デフォルトの名無しさん
2009/10/26(月) 14:43:140084デフォルトの名無しさん
2009/10/26(月) 14:46:350085デフォルトの名無しさん
2009/10/26(月) 14:48:15テーブルの上に置いてあった折り紙で鶴を作り始めるの園児がC#やJava
紙を作るから製紙工場のプラント建設計画を練り始め材木の伐採に旅立ってしまう園児がC++
0086デフォルトの名無しさん
2009/10/26(月) 15:05:32IEコンポーネントでだめか?
0087デフォルトの名無しさん
2009/10/26(月) 15:10:36WinInet
http://msdn.microsoft.com/en-us/library/aa385483(VS.85).aspx
0088デフォルトの名無しさん
2009/10/26(月) 15:22:22ブラウザは一行でエンター押したら出来るのに。
0089デフォルトの名無しさん
2009/10/26(月) 15:26:590090デフォルトの名無しさん
2009/10/26(月) 15:58:52うちなんてスイッチ押すだけでWindowsが起動するぜ
一行でWindowsが起動するプログラムないかな
0091デフォルトの名無しさん
2009/10/26(月) 16:39:540092デフォルトの名無しさん
2009/10/26(月) 16:52:300093デフォルトの名無しさん
2009/10/26(月) 17:07:580094デフォルトの名無しさん
2009/10/26(月) 17:14:110095デフォルトの名無しさん
2009/10/26(月) 17:55:16折り紙に折り目が付いてないから折れないと騒ぐのが(ry
0096デフォルトの名無しさん
2009/10/26(月) 18:22:46https通信が簡単すぎて話題にならないのだろうか
http://www.google.com/search?q=SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS&lr=lang_ja
0097デフォルトの名無しさん
2009/10/26(月) 18:27:13みたいな。
0098デフォルトの名無しさん
2009/10/26(月) 18:31:54ググればなんか誰かが作っているのが見つかりそうな気がするけどなあ。
0099デフォルトの名無しさん
2009/10/26(月) 18:35:520100デフォルトの名無しさん
2009/10/26(月) 18:40:31うpうp
Curl以外で
0101デフォルトの名無しさん
2009/10/26(月) 19:01:520102デフォルトの名無しさん
2009/10/26(月) 19:56:03どこにもバイナリ置いてないぞ
0103デフォルトの名無しさん
2009/10/26(月) 20:31:21ヘタレ過ぎだろう
0104デフォルトの名無しさん
2009/10/26(月) 20:32:430105デフォルトの名無しさん
2009/10/26(月) 20:34:370106デフォルトの名無しさん
2009/10/26(月) 20:39:390107デフォルトの名無しさん
2009/10/26(月) 20:42:04http://www.kmonos.net/alang/boost/classes/asio.html
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace std;
using namespace boost::asio;
int main()
{
// www.boost.org の http サービスに接続
ip::tcp::iostream s( "www.boost.org", "http" );
// 送信
s << "GET / HTTP/1.0\r\n";
s << "Host: www.boost.org\r\n";
s << "\r\n";
s << flush; // バッファに溜めずに確実にネットワーク送信
// 受信
string line;
while( getline(s, line) )
cout << line << endl;
}
0108デフォルトの名無しさん
2009/10/26(月) 20:43:46メジャーどころからドマイナーなのまで最低100種類は取りそろえてコミットしないと
0109デフォルトの名無しさん
2009/10/26(月) 21:24:17string euc[] = {"EUC-JP","euc-jp","x-euc-jp","eucJP-ms","CP51932","cp51932"};
0110デフォルトの名無しさん
2009/10/26(月) 21:30:25char *euc[] = {"EUC-JP","euc-jp","x-euc-jp","eucJP-ms","CP51932","cp51932"};
cout<<sizeof(euc)/sizeof(char*)<<endl;
0111デフォルトの名無しさん
2009/10/26(月) 22:38:07std::stringがポイントなんじゃなかったんかい?
0112デフォルトの名無しさん
2009/10/26(月) 22:47:04まあ、よくあることだけどねw
0113デフォルトの名無しさん
2009/10/26(月) 22:50:180114デフォルトの名無しさん
2009/10/26(月) 22:52:04std::stringってよく分からんSTLもどきなわけだが、
それでもsizeofを使ったそのワザは有効なの?
組み込み型やPOD型に限らず?
0115デフォルトの名無しさん
2009/10/26(月) 22:54:33int number(T a[N])
{return N;}
これじゃいやん?
0116デフォルトの名無しさん
2009/10/26(月) 22:59:45テンプラーにはごく普通のテクニックだけど
まだ一般には浸透してないのかしら?^^
っていうか、ほとんどの人はvectorを使うからかな?
0117デフォルトの名無しさん
2009/10/26(月) 23:06:20何か勘違いしているが、型がPODだろうが非PODだろうが
今回は静的に決定される配列の要素数を取得したいわけだろ?
コンストラクタで中身がどう初期化されようが要素そのものの型レベルの大きさが変わるわけじゃない。
変わるのはstd::stringの中身のポインタが動的に指すメモリ領域だ。
STLを魔法か何かと勘違いしてるみたいだな。
0118デフォルトの名無しさん
2009/10/26(月) 23:06:550119デフォルトの名無しさん
2009/10/26(月) 23:08:310120デフォルトの名無しさん
2009/10/26(月) 23:09:59for(;;) v.push_back(string("死ね"));
0121デフォルトの名無しさん
2009/10/26(月) 23:11:370122デフォルトの名無しさん
2009/10/26(月) 23:14:28vector<string> euc = {"EUC-JP","euc-jp","x-euc-jp","eucJP-ms","CP51932","cp51932"};
が出来ないですか
0123デフォルトの名無しさん
2009/10/26(月) 23:15:240124デフォルトの名無しさん
2009/10/26(月) 23:16:110125デフォルトの名無しさん
2009/10/26(月) 23:16:570x便利そうだなぁはやく使いたい
0126デフォルトの名無しさん
2009/10/26(月) 23:17:41vector 初期化が面倒なのはわかるが、だからと言って >>110 の方が vector
使うより良いとは俺には思えんなぁ。価値基準は人それぞれだろうが。
0127デフォルトの名無しさん
2009/10/26(月) 23:22:37それは要件によるだろ
vector 必要ないところで「念のため」とかやってるアフォには付き合ってらんねーし
0128デフォルトの名無しさん
2009/10/26(月) 23:28:32std::vector<double> vec(arr, arr + sizeof(arr));
まあでもこれと大差ないよな
0129デフォルトの名無しさん
2009/10/26(月) 23:31:130130デフォルトの名無しさん
2009/10/26(月) 23:32:17↑
なんぞ?
0131デフォルトの名無しさん
2009/10/26(月) 23:38:28template <class T, int N> T* end (T (&arr)[N]) { return arr + N; }
double arr[] = {0.0, 1.0, 2.0, 3.0 ,4.0};
std::vector<double> vec(begin(arr), end(arr));
0132デフォルトの名無しさん
2009/10/26(月) 23:52:200133デフォルトの名無しさん
2009/10/27(火) 01:16:110134デフォルトの名無しさん
2009/10/27(火) 01:27:070135デフォルトの名無しさん
2009/10/27(火) 01:30:44accept:gzipのhttpsでIEみたいなことをするのにも
ソケットのライブラリ・httpのライブラリ・暗号復号のライブラリ・圧縮伸張のライブラリ・エンコードのライブラリ
正規表現のライブラリ・キャッシュファイルのライブラリ・cookieのライブラリ・Ajax系セッションのライブラリ・ActiveXのライブラリ
これだけ別々のライブラリが必要になる、馬鹿みたい。
0136デフォルトの名無しさん
2009/10/27(火) 01:36:42よりも
sizeof(arr)/sizeof(arr[0])
のほうがいいと思うんだけど。
0137デフォルトの名無しさん
2009/10/27(火) 01:37:400138デフォルトの名無しさん
2009/10/27(火) 01:41:37そうするメリットは?
0139デフォルトの名無しさん
2009/10/27(火) 02:40:55GET,POST,HEAD,レジュームが一行で出来るやつ教えてください。
windows XPで動かせたらいいです。
0140デフォルトの名無しさん
2009/10/27(火) 02:52:100141デフォルトの名無しさん
2009/10/27(火) 03:53:460142デフォルトの名無しさん
2009/10/27(火) 03:54:21そういうツール使いなよもう
0143デフォルトの名無しさん
2009/10/27(火) 03:57:11一つで2M、3Mとか使って、パソコンに優しくないんです。
0144デフォルトの名無しさん
2009/10/27(火) 03:58:33複数同時にプロセス起動するのが嫌なんです。
exe1つ毎に2M、3Mとか使って、パソコンに優しくないんです。
0145デフォルトの名無しさん
2009/10/27(火) 03:59:52Sの示す文字列の3文字目を表す場合どう表現すればいいんでしょうか?
S[2]と書いたら、それはint型だとか言われました
0146デフォルトの名無しさん
2009/10/27(火) 04:02:450147デフォルトの名無しさん
2009/10/27(火) 06:34:230148デフォルトの名無しさん
2009/10/27(火) 07:08:20ゲームパッドでテトリスオンラインやってるんだけどデフォルトのキー配置が気になってさ
0149デフォルトの名無しさん
2009/10/27(火) 07:09:010150デフォルトの名無しさん
2009/10/27(火) 10:57:15素朴な疑問だけど、vector 使わなくてもいいのでは、という状況もありうるが、
使うのが「アフォ」と貶す程の状況ってどういう状況?
0151デフォルトの名無しさん
2009/10/27(火) 10:58:39いまどき2Mや3Mくらいでけちけち言うな
0152デフォルトの名無しさん
2009/10/27(火) 12:53:06ビット単位で勝負している俺に謝れ
0153デフォルトの名無しさん
2009/10/27(火) 12:54:01i->x + (i+1)->x
だと思ったんですけど違うみたいなのでどうするかわかりますか?
0154デフォルトの名無しさん
2009/10/27(火) 13:06:150155デフォルトの名無しさん
2009/10/27(火) 16:05:47サンクス
0156デフォルトの名無しさん
2009/10/27(火) 19:12:16メモリ使用量を100kから80kへ減らす、所要処理時間を1200msから1180msへ減らす。
いかにもC++崇拝者がやりそうなことだな。
そのためには誰が読んでも処理内容が明白なアルゴリズムを性能だけを考慮してチューニングし始める。
改善の相対量では無く絶対量を理解していない。体感では無に等しい改善の対費用効果を考慮する概念すらない。
コードの運用コストがいくら掛かろうと性能が向上することは良いことだと思い込んでいる。
見えているのはコードだけ、それを利用する人間の笑顔じゃない。
0157デフォルトの名無しさん
2009/10/27(火) 19:15:050158デフォルトの名無しさん
2009/10/27(火) 19:57:40なんでそんなに目の前の相手のキャラクターメイキングに必死なの?
0159デフォルトの名無しさん
2009/10/27(火) 20:01:390160デフォルトの名無しさん
2009/10/27(火) 20:21:121.2秒以内に処理が終わらないと子供の命が危ないんだけど。
0161デフォルトの名無しさん
2009/10/27(火) 21:05:56アホらしい
0162デフォルトの名無しさん
2009/10/27(火) 21:08:290163デフォルトの名無しさん
2009/10/27(火) 21:12:03自信満々に突っかかってるを見てると、こっちが恥ずかしくなってくる。
0164デフォルトの名無しさん
2009/10/27(火) 21:13:180165デフォルトの名無しさん
2009/10/27(火) 21:16:33どこの誰に影響を与えることが出来るんだろう?
無意味すぎる。
0166デフォルトの名無しさん
2009/10/27(火) 21:17:240167デフォルトの名無しさん
2009/10/27(火) 21:18:54そこそこのコンセンサスすら得られないなら書く意味がないだろう。
0168デフォルトの名無しさん
2009/10/27(火) 21:24:280169デフォルトの名無しさん
2009/10/27(火) 21:37:10VC++2008のプロファイラは関数単位しか時間でないだろ? 使いにくいし。たぶん。
こっちは行単位で出るぞ。
0170デフォルトの名無しさん
2009/10/27(火) 21:46:39よくあること。
0171デフォルトの名無しさん
2009/10/27(火) 22:12:35まあ、よほど特殊な状況でない限り161みたいな状況なんてありえないよな
みんながみんな宇宙船や粒子加速器作ってる訳じゃないんだからさ
0172デフォルトの名無しさん
2009/10/27(火) 22:17:12ねぇだろw
0173デフォルトの名無しさん
2009/10/27(火) 22:39:40このレベルで挙げ始めたら、知ってる人は大量に挙げられるんじゃね?
>>161みたいに、「俺の知らないものはこの世に無い」とでも思ってるかのように
自信満々に「アホらしい」とは言えんなぁ、俺は。
0174デフォルトの名無しさん
2009/10/27(火) 22:45:21具体的な例をあげて、それがなぜ1.2秒なら良くて1.21秒だとだめになるのかを簡単にでも説明できないと
0175デフォルトの名無しさん
2009/10/27(火) 22:49:16>>161は何を根拠にアホらしいと断定してるのかも聞きたい。
この世にそんなものはあってたまるかという自信に満ち溢れてるようなので。
0176デフォルトの名無しさん
2009/10/27(火) 23:02:290177デフォルトの名無しさん
2009/10/27(火) 23:03:44常人にはわからない不思議なマッチで火が点いて、引っ込みつかなくなったのでは。
0178デフォルトの名無しさん
2009/10/27(火) 23:09:21例えばで出てきた具体的な物理量をいくら叩いても数学的には何も言えてないだろ
逆に数学的に破綻のある論理でもシステムのライフサイクルとの対比で ∞ に近似できるケースもあるし
結局、基準を「俺ルール」に求めている点で何も変わってない
0179デフォルトの名無しさん
2009/10/27(火) 23:15:43オリンピックの100m走の計測だと9.58と9.57はすごい違いだろ。
後者だと長年歴史に名が残る可能性。
0180デフォルトの名無しさん
2009/10/27(火) 23:17:500181デフォルトの名無しさん
2009/10/27(火) 23:19:090182デフォルトの名無しさん
2009/10/27(火) 23:33:050183デフォルトの名無しさん
2009/10/27(火) 23:35:02車のブレーキ制御ってC++使ってしてるの?
0184デフォルトの名無しさん
2009/10/27(火) 23:44:19面白い例えだと言えばまあそんな気もしてくる。
時速100kmでかっ飛ばしていたとすると
100(km/hr)*(1000/3600)=77.2(m/s)
だから
0.01秒では
0.77m
の差が出る。
まあ子供の命を救えるかどうかは微妙な所。
0185デフォルトの名無しさん
2009/10/27(火) 23:52:010186デフォルトの名無しさん
2009/10/27(火) 23:53:29C++かどうかは知らんが組み込み系な言語でしょう。
(スレチってなら1.21秒な話も同様ですぜ)
>>184
101回目のプロポーズなら死んでたかも知れない。
100km/hは出してないけどさ。
0187デフォルトの名無しさん
2009/10/27(火) 23:54:01だいたい1ms-10ms
ブレーキ制御はペダル入力だけとは限らないからね
>>183
Cだな
C++なんて絶対に使われない
0188デフォルトの名無しさん
2009/10/28(水) 00:28:290189デフォルトの名無しさん
2009/10/28(水) 00:51:54ただし使い方はbetterCだけど
0190デフォルトの名無しさん
2009/10/28(水) 00:52:561bitだか1Byteミスっただけでダメだったって話のアレ?
0191デフォルトの名無しさん
2009/10/28(水) 04:39:320192デフォルトの名無しさん
2009/10/28(水) 04:47:441/60秒以内に処理が終わるかどうか。0.001秒でも遅れたらゲーマーに袋叩きにされるな。
子供も死んじゃうかもしんない
0193デフォルトの名無しさん
2009/10/28(水) 06:05:20> 1/60秒以内に処理が終わるかどうか。
> 0.001秒でも遅れたらゲーマーに袋叩きにされるな。
1/60=0.016666666666666666666666666666667
だぞ。
0194デフォルトの名無しさん
2009/10/28(水) 06:08:00描写速度以上の反応精度はあるだろう。
0195デフォルトの名無しさん
2009/10/28(水) 06:44:430.0166秒以内に終わらせなくてはいけない処理は
0.0167秒かかってはいけない。
わかる?
0196デフォルトの名無しさん
2009/10/28(水) 06:47:41それが何か?
画面更新は垂直同期に合わせることになるから1/60秒という時間制限に0.001秒でも
遅れたら60fpsのゲームが30fpsになる。実際えらい違いになるよ。
0197デフォルトの名無しさん
2009/10/28(水) 09:09:500198デフォルトの名無しさん
2009/10/28(水) 09:14:37なんでそんな中途半端な桁数に?
普通に0.01666……とでも書けば充分伝わるのに。
或いはいっそ、同じ間抜けを晒すならもっと桁数費やせば清々しいものを。
0199デフォルトの名無しさん
2009/10/28(水) 09:15:180200デフォルトの名無しさん
2009/10/28(水) 09:58:140201193
2009/10/28(水) 23:22:14>>198
いや別に、ゲームプログラミングをしたことない俺が
横槍を入れたくなったから入れてみただけだ。
特に深い意図もない。
>>200
おまえ鋭いな。
まあWindows電卓じゃないけど似たような状況。
0202デフォルトの名無しさん
2009/10/29(木) 01:18:300203デフォルトの名無しさん
2009/10/29(木) 01:42:34株価にも影響するんだぜこれ。
http://schiphol.2ch.net/test/read.cgi/gamefight/1256659345/
0204デフォルトの名無しさん
2009/10/29(木) 11:00:14>>152がどういう物を作っているのか純粋に気になる。
>>203
ネットワークプログラミングは今の話題とは別じゃない?
0205デフォルトの名無しさん
2009/10/30(金) 13:55:26高速化の努力なんて無駄w」
で済むプログラムしか書いたことない人は実にお気軽なものですね。
0206デフォルトの名無しさん
2009/10/30(金) 14:14:5220ms余計に時間が掛かることで開発期間と運用コストが5%削減出来るとか、そう言う勘定が出来ないとダメ。
出来ない奴はエンジニアでもビジネスマンでもないよ、ただのプログラミングを趣味にしているだけのおじさん。
0207デフォルトの名無しさん
2009/10/30(金) 14:30:32あらゆるものをC++で書こうとする人間は
適切なソリューションを選択する能力が低いとしか言いようがない
そしてC++が最良の選択肢となるケースはそれほど多くはない
0208デフォルトの名無しさん
2009/10/30(金) 14:45:33ただでさえ書きこみの少ないプログラム板が完全に閑古鳥が鳴いてる
0209デフォルトの名無しさん
2009/10/30(金) 15:18:070210デフォルトの名無しさん
2009/10/30(金) 15:33:10「あらゆるものをC++で書こうとする人間」の相手をしなければ
ならない境遇にあるのですね。
痛み入ります。
0211デフォルトの名無しさん
2009/10/30(金) 15:43:57ってそりゃそうでしょ。
世の中のプログラマーの仕事量で考えれば業務系とか実行
スピードなんてどうでも良いようなのが8割以上だろうから。
そんな事はこのスレに居るC++使いは当然分かってるだろ。
0212デフォルトの名無しさん
2009/10/30(金) 16:52:550213デフォルトの名無しさん
2009/10/30(金) 17:07:050214デフォルトの名無しさん
2009/10/30(金) 23:52:12土方ってそういう基準でなるものか?
0215デフォルトの名無しさん
2009/10/31(土) 00:04:490216デフォルトの名無しさん
2009/10/31(土) 03:09:02http://www.parashift.com/c++-faq-lite/on-line-availability.html#faq-2.2
> ... Learn to use wget instead.
0217デフォルトの名無しさん
2009/10/31(土) 12:23:440218デフォルトの名無しさん
2009/10/31(土) 12:51:590219デフォルトの名無しさん
2009/10/31(土) 13:02:57例外を投げてはいけない関数はそのことも書いてある
>>218
デタラメはやめなさい
0220デフォルトの名無しさん
2009/10/31(土) 13:06:53投げるとか、そういう奴か?
0221デフォルトの名無しさん
2009/10/31(土) 13:10:12少ないわな
手持ちのC++標準ライブラリには標準はvectorとdequeのat()と、
アロケータがbad_allocを投げる事を要求しているに過ぎないと
書いてある
詳しくは規格票のどこかにあると思うが誰か探してくれ
0222デフォルトの名無しさん
2009/10/31(土) 13:11:41そうです。
0223デフォルトの名無しさん
2009/10/31(土) 13:19:11§23.1.1.13
13 The member function at() provides bounds-checked access
to container elements. at() throws out_of_range if n >= a.size().
§26.3.1.6
6 These library functions are permitted to throw a bad_alloc (18.4.2.1) exception
if there are not sufficient resources available to carry out the operation.
Note that the exception is not mandated.
この二つしかない
0224デフォルトの名無しさん
2009/10/31(土) 13:24:440225デフォルトの名無しさん
2009/10/31(土) 13:41:43C++崇拝者は無駄に調べ物が多くて大変ですねwww
ドキュメントさえ整備されていれば本来そのコストは支払う必要の無いものwwwでも現実に整備されていないから浪費wwww
その無駄な時間を生産へ充てた方が賢明ですよwwwww
0226デフォルトの名無しさん
2009/10/31(土) 13:49:210227デフォルトの名無しさん
2009/10/31(土) 13:52:350228デフォルトの名無しさん
2009/10/31(土) 13:53:58アロケータがbad_allocをthrowするってことは、
push_backやinsert内ではどうなってんだろ?
そのまま呼び出し側までthrowしてんのかな?
0229デフォルトの名無しさん
2009/10/31(土) 14:03:31でも仕様が明記されていないから結局内部処理を調べなきゃいけないw実際に動かしてどうなるか確かめて見ないといけないw
生産性を高めるはずの隠蔽の仕組みがすべてが徒となっているww
0230デフォルトの名無しさん
2009/10/31(土) 14:11:210231デフォルトの名無しさん
2009/10/31(土) 14:57:550232デフォルトの名無しさん
2009/10/31(土) 15:14:45ロクに使えもしない癖に文句言うなカス
0233デフォルトの名無しさん
2009/10/31(土) 17:03:40様に普通の人は作るから全く問題なし。
0234デフォルトの名無しさん
2009/10/31(土) 17:23:07うん。C++に限らずJava以外みんなそうだと思う。
0235デフォルトの名無しさん
2009/10/31(土) 17:29:11投げるほうは投げるほうで完結するように例外安全にするのはいいとして
受け取るほうはcatch(...)だけにして、エラーの詳細なんて知ったこっちゃないと捨ててしまうの?
0236デフォルトの名無しさん
2009/10/31(土) 17:34:04なるべく catch しない。
main() とか、根っこには catch(...) とか置いとく。
これでだいだい問題ない。
個別に問題があれば追加の catch を注意深く配置する。
0237デフォルトの名無しさん
2009/10/31(土) 17:41:17不明なエラーと回復不能なエラーはルートまでたらい回しリレーして、
詳細がわかって回復可能なところは個別にいじるのね
なんか例外でなやんでた部分がすっきりした気がする
0238デフォルトの名無しさん
2009/10/31(土) 17:51:550239デフォルトの名無しさん
2009/10/31(土) 17:53:220240デフォルトの名無しさん
2009/10/31(土) 20:29:05作ってるものの性格によってまるで違うだろうしな。
out_of_rangeの場合はまた違うだろうし。あなたなら?握りつぶす?
そういったシステムポリシーに関わる処理をどのレベルで行うのかを
柔軟に選べるようになるのが例外の強力なところだと思う。
汚いif文を大量に掃除した上で。
一掃できることが存在理由
だと思う。
0241240
2009/10/31(土) 20:30:550242デフォルトの名無しさん
2009/10/31(土) 20:51:24> 汚いif文を大量に掃除した上で。
とか言ったところで説得力は無いな。
0243デフォルトの名無しさん
2009/10/31(土) 20:58:04ただし >>240 がそうだったかどうかはわからんがな
0244デフォルトの名無しさん
2009/10/31(土) 20:58:490245デフォルトの名無しさん
2009/10/31(土) 21:23:32は記述量増大は必然的にバグ増大につながる
ってことを敢えて示しているのだと思うYO。
0246デフォルトの名無しさん
2009/11/01(日) 15:33:52こそが男気あふれる例外の使い方
0247デフォルトの名無しさん
2009/11/01(日) 20:39:01クソコードじゃねぇか
0248デフォルトの名無しさん
2009/11/01(日) 21:12:18catch(...){}が一番困る
0249デフォルトの名無しさん
2009/11/01(日) 22:47:50まぁほとんどの場合exception&キャッチしておけば実用上問題ないんだし、気にしたら負けかと。
0250デフォルトの名無しさん
2009/11/01(日) 22:49:200251デフォルトの名無しさん
2009/11/01(日) 23:12:59そう
要求定義がまとまる前に実装については議論できんはず
何がどう困るのか言えん奴を相手にしたら負け、そこは間違いない
コンソールがない環境でコンソール出力を要求するアフォとかな
0252デフォルトの名無しさん
2009/11/02(月) 00:46:580253デフォルトの名無しさん
2009/11/02(月) 00:50:12最近はそういう遊びでも流行ってんのか?
0254デフォルトの名無しさん
2009/11/02(月) 00:57:300255デフォルトの名無しさん
2009/11/02(月) 01:04:41スルーしたらterminateが呼ばれてabortするだけじゃ?
0256デフォルトの名無しさん
2009/11/02(月) 01:09:570257デフォルトの名無しさん
2009/11/02(月) 01:10:43abortさせてコアダンプ吐かせるべき
握り潰して見せかけ上正常終了したら情報が何も得られない
0258デフォルトの名無しさん
2009/11/02(月) 01:11:50コンストラクタで失敗した場合に例外投げるべき?
それとも生成するだけして後で値を設定していくべき?
0259デフォルトの名無しさん
2009/11/02(月) 01:16:230260デフォルトの名無しさん
2009/11/02(月) 01:24:49FAQ すぎる。ずっと気になってるって、どんだけ情弱なんだよ。
0261デフォルトの名無しさん
2009/11/02(月) 01:27:09http://ja.lmgtfy.com/?q=%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF+%E4%BE%8B%E5%A4%96
0262デフォルトの名無しさん
2009/11/02(月) 01:27:38仕事で見るコードはとにかく生成しちゃうやつばかりなんで。
分野とかあるのかしら
0263デフォルトの名無しさん
2009/11/02(月) 01:30:38書いた奴に聞けよ。
まぁ昔の C++ 例外の実装がウンコだったこともあって、それなりに迷信として広まってるから、
そういう状態になってるのはわからんでもない。
0264デフォルトの名無しさん
2009/11/02(月) 16:08:51テンプレートとS-JISソースがまともに扱えるものはありませんか?
今のところg++, vc++を使っていますが、
趣味程度としてもう一つくらい使ってみたいと思っています。
0265デフォルトの名無しさん
2009/11/02(月) 16:36:310266デフォルトの名無しさん
2009/11/02(月) 16:39:18実は次にそれを試したのですが、
テンプレート周りがちょっとアレでした。
0267デフォルトの名無しさん
2009/11/02(月) 16:58:54iccはどう? 試用で1ヶ月は無料だし。
0268デフォルトの名無しさん
2009/11/02(月) 17:04:420269デフォルトの名無しさん
2009/11/02(月) 17:12:26Intel C++ Compiler - Wikipedia
http://ja.wikipedia.org/wiki/Intel_C%2B%2B_Compiler
ですか。
ありがとうございます。
>>268
完全にC++テンプレートの仕様を満たしている必要はありません。
Comeauレベルまで要求もしません。
ただ、g++, vc++と並ぶ程度の仕様満足は欲しいです。
0270デフォルトの名無しさん
2009/11/02(月) 17:23:48TDM-MinGWはどうよ?
EUC変換を掛ければS-JISも化けないぞ(-finput-charset=cp932 -fexec-charset=cp932)
0271デフォルトの名無しさん
2009/11/02(月) 17:24:32すまんちゃんと読んでなかった
0272デフォルトの名無しさん
2009/11/02(月) 19:31:560273デフォルトの名無しさん
2009/11/02(月) 20:16:52やっぱりそうですか。
ありがとうございました。
0274デフォルトの名無しさん
2009/11/02(月) 20:28:32Digital Mars C/C++ Compiler
ってのがあるけど、あれはどうなんだろう?
テンプレートとS-JISソースがまともに扱えるのかな?
0275デフォルトの名無しさん
2009/11/02(月) 20:43:11わからんけどSTLport4.5.3を使っているって随分古いんだね
バグだらけとちゃうか?
0277デフォルトの名無しさん
2009/11/02(月) 21:16:220278デフォルトの名無しさん
2009/11/02(月) 22:04:56誤爆?
0279デフォルトの名無しさん
2009/11/02(月) 22:47:000か、そうでないかについて処理を分ける場合
if(n>0)〜
else***
とすべきか、それとも
if(n)〜
else***
とすべきでしょうか?
可読性的には前者かと思うのですが、速度的には後者ですよね?
どちらがよいのでしょうか?
よろしくお願い申し上げます。
0280デフォルトの名無しさん
2009/11/02(月) 22:52:48可読性を云々するのなら、
> 0か、そうでないか
をそのままコードして
if(n==0)〜
else***
0281デフォルトの名無しさん
2009/11/02(月) 23:02:500282279
2009/11/02(月) 23:09:28それもそうでした。
ありがとうございます。
>>281
> 速度的には後者?後者は比較をしてないと思ってんのかな。
思っていましたが、しているのですか?
コンパイラの最適化があれば同一のコードに行き着く可能性もあるでしょうが。
0283デフォルトの名無しさん
2009/11/02(月) 23:13:26これくらい最適化で同じコードにできなければ、
C++コンパイラとして終わっているだろう。
0284デフォルトの名無しさん
2009/11/02(月) 23:14:170285デフォルトの名無しさん
2009/11/02(月) 23:43:30最適化関係なく、同一のasmコードに落ち着くということか?
そりゃ本当か?
適当なこと言うなよ。
0286デフォルトの名無しさん
2009/11/02(月) 23:44:360287279
2009/11/02(月) 23:49:25ソフトウェアの動作時間に大差ないと思われるので
大丈夫です。
すみません。
ありがとうございました。
0288デフォルトの名無しさん
2009/11/03(火) 05:58:04いかに最適化しようと、最低限必要な比較は省略できないってことだろう。
0289デフォルトの名無しさん
2009/11/03(火) 08:04:53char *p=NULL; クラスではこうかけないのですが。
char *p;
if(p==NULL)cout<<"p=NULL\n";
0290デフォルトの名無しさん
2009/11/03(火) 08:13:59未初期化の非 static なポインタ変数の値は不定。
0291289
2009/11/03(火) 08:21:59コンストラクタがその関数を呼ぶときに未確保を特定できますか。
初期化する関数 syokika()は単独でも使い、コンストラクタでも使います。
0292デフォルトの名無しさん
2009/11/03(火) 08:24:03まずポインタについての初期化と代入を区別して考えること。
そのうえで、ヌルで初期化しろ。
ひととおり動作を確認したら std::auto_ptr か std::vector に置き換えておけ。
0293デフォルトの名無しさん
2009/11/03(火) 08:26:130294デフォルトの名無しさん
2009/11/03(火) 09:59:130295デフォルトの名無しさん
2009/11/03(火) 10:09:03error: expected unqualified-id before '!' token
0296デフォルトの名無しさん
2009/11/03(火) 11:41:55union
{
void (*pfunc)(int);
func_obj* pfuncobj;
};
0297デフォルトの名無しさん
2009/11/03(火) 11:47:42███▀ █████████
███▀ ██ ███▀ ▄███▀
██▀ ▄███▀███▄▄▄███
▄███▄▄██▀ █▀ ▀████
▀▀▀▀███▄ ▄██▀█▄▄
██▀ ███ ██▀ ▀███▄▄
▄████▀▀██ ▄█▀▄▄ ▀█████▄▄
▀█▀▀ █▄▄█▀ ████▄ ▀███▀▀▀
▄ ███ ▀███ ▀▀▀
███ ███ ▀▀
███ ▀ ▀████▄
▀ ▀
0298デフォルトの名無しさん
2009/11/03(火) 14:30:290299デフォルトの名無しさん
2009/11/03(火) 15:53:29firstだけな
0300デフォルトの名無しさん
2009/11/03(火) 17:06:16の補足
keyでソート
0301デフォルトの名無しさん
2009/11/03(火) 17:07:13てか、そのくらいググれカス。
0302デフォルトの名無しさん
2009/11/03(火) 23:10:29███▀ █████████
███▀ ██ ███▀ ▄███▀
██▀ ▄███▀███▄▄▄███
▄███▄▄██▀ █▀ ▀████
▀▀▀▀███▄ ▄██▀█▄▄
██▀ ███ ██▀ ▀███▄▄
▄████▀▀██ ▄█▀▄▄ ▀█████▄▄
▀█▀▀ █▄▄█▀ ████▄ ▀███▀▀▀
▄ ███ ▀███ ▀▀▀
███ ███ ▀▀
███ ▀ ▀████▄
▀ ▀
0303デフォルトの名無しさん
2009/11/04(水) 04:31:27他の最適化が無視できるほど時間食うな
プロファイラ使わないとこれ判らん
ファイルをopenしてcloseするだけ、
ディレクトリの探索開始命令だけで時間くう
小さいファイルなどは、ロード時間よりopenが遅い
0304デフォルトの名無しさん
2009/11/04(水) 04:33:36Cのbserarchとstrncmpをクラス内で使いたいのですが…
その際必要となる、比較関数の関数ポインタを引数に渡す必要があると思いますが、
これをクラスのメソッドにしたいのです。
しかし、関数ポインタは静的でなければならないらしく、メンバを引数に指定出来ません。
何か指定する方法はないでしょうか?
0305デフォルトの名無しさん
2009/11/04(水) 04:39:09staticをつけると文字通り性的になるよ。
ただし、クラスのメンバにアクセス出来ないはずだから、ほぼ無意味。
それくらいなら自分で実装するか、STLにした方が良いと思う。
0306305
2009/11/04(水) 05:04:09比較関数いらないじゃんw
気付かずレスしてる俺もアホだが、
どこぞに誤爆した俺もアホだな。
bsearchは再帰使えば、簡単に実装出来るから
得意ならメソッド内に自前で書いちゃって良いと思う。
苦手なら変なバグ作る前に・・・諦めれ
0307デフォルトの名無しさん
2009/11/04(水) 05:07:45やるならこんなかね。
struct A {
int func(const void* key, const void* obj);
};
struct B {
const void* pKey;
A* pA;
};
int stub(const void* key, const void* obj){
const B* p = reinterpret_cast<const B*>(key);
return p->pA->func(p->pKey, obj);
}
〜〜〜〜
A a;
B b = { key, &a };
bsearch(&b, base, nmemb, size, &stub);
0308デフォルトの名無しさん
2009/11/04(水) 08:15:23メンバ関数でも static 付けてやれば静的になるんで渡せるはずだよ。
0309デフォルトの名無しさん
2009/11/04(水) 09:54:490でないものをひとつひとつ調べるより、
memcmpで一気に32バイトくらいを調べた方が断然速い。
16バイトや4バイト=int型も速くなるけど、いまの設定では32バイトが一番だった。
一度に調べる個数が増え過ぎたら今度は、全部0で無いときの探索が遅くなる。
0310デフォルトの名無しさん
2009/11/04(水) 09:54:54引き数に渡したオブジェクトならプライベートメンバだろうがなんだろうがアクセスできるよ
ちなみにネストクラスとローカルクラスも同様
0311デフォルトの名無しさん
2009/11/04(水) 10:12:58インテルの Parallel Amplifierはすごく使える。
行単位で時間計測してくれて専用コードの埋め込みの必要なし。
経験版あるので使ってみてくれよ
0312デフォルトの名無しさん
2009/11/04(水) 10:14:16インテルのサイト
http://www.intel.co.jp/jp/software/products/intel-parallel-studio-home/amplifier.htm
0313デフォルトの名無しさん
2009/11/04(水) 12:26:09bindしてboost vaultのc_functionに通せば普通の関数ポインタになるよ
でも個人的にはそんなイミフな方法より>>305がおすすめ
>>312
スレチだと思うけど…purifyplusよりいいところある?
0314312
2009/11/04(水) 12:52:15VC2008のプロファイラよりは使える
行単位の計測がいいね。
あとマルチプロセッサー対応。
マルチプロセッサーの為のツールらしいがシングルでもOK
0315デフォルトの名無しさん
2009/11/04(水) 12:55:02staticつけたら静的になるのは分かるが、同一クラスで一つの
データメンバを共有する事になるので、場合によっては使えない
ケースも出てくる
インスタンス毎に別々のデータメンバを持ちたい時とかな
0316デフォルトの名無しさん
2009/11/04(水) 12:56:57引き数がインスタンスへのポインタなら問題ないと思うが。
0317デフォルトの名無しさん
2009/11/04(水) 13:05:430318デフォルトの名無しさん
2009/11/04(水) 13:37:47こういう可視性なんかの細かいルールとか知らない人割と居そうだね
0319デフォルトの名無しさん
2009/11/04(水) 17:04:500320デフォルトの名無しさん
2009/11/04(水) 20:46:290321デフォルトの名無しさん
2009/11/05(木) 01:34:29クラスAは、グローバルのバッファのアドレスを保持しているのですが
代入やvectorのpush_backがされた時には、バッファから必要な部分を抜き出して
実体を保持したいです。
これはオペレータ=を適切に作ればいいのですか。
push_backで呼び出されますか。
0322デフォルトの名無しさん
2009/11/05(木) 01:52:520323デフォルトの名無しさん
2009/11/05(木) 02:18:55return *this;の有る無しでは何が違うんですか?
違いは出ないのですが
class A {
public:
int n;
A(){ n=0; }
A(int k){ n=k; }
A &operator=(const A &x){ n=x.n; return *this; }
};
int main(){
A a(10), b;
b=a;
cout<<b.n;
}
0324デフォルトの名無しさん
2009/11/05(木) 02:26:15リターンと参照無しだとcに代入できませんでした
class A {
public:
int n;
A(){ n=0; }
A(int k){ n=k; }
A &operator=(const A &x){ n=x.n; return *this;}
};
int main(){
A a(10), b, c;
c=b=a;
cout<<c.n;
}
0325デフォルトの名無しさん
2009/11/05(木) 03:45:36インスタンスは引数で渡されるから、まったく問題ない。
0326デフォルトの名無しさん
2009/11/05(木) 03:51:40そんなふうに考えていた時期が俺にもありましたとは。
std::binary_search() の戻り値が bool ひとつだと知るまではね。
かわりに std::lower_bound() + 自前で一回比較すれば bsearch() と同様の
結果が得られる。
320 の std::equal_range() なら自前で比較を書かなくて良いのがうれしいけど、
効率は少し落ちることになりそうだね。
0327321
2009/11/05(木) 04:47:04オペレータ=はnewでメモリ確保してコピーします。
前のデータが破棄されず、次々に生成されるからと思いますが
STL stringなどでは動作すると思いますがどうやったら前のデータけせますか
A x;
for(n) x=p[n];
0328デフォルトの名無しさん
2009/11/05(木) 04:48:110329デフォルトの名無しさん
2009/11/05(木) 06:31:55ほんとにできたのか不安になるレベルだ
0330デフォルトの名無しさん
2009/11/06(金) 03:22:08連想配列のように使えるならmap以外の方法でも構いません。
色々と間違ってる気がしますがお願いします。
0331デフォルトの名無しさん
2009/11/06(金) 03:30:57map::find()
0332デフォルトの名無しさん
2009/11/06(金) 03:46:59ない。
map<int,string>とmulti_map<string,int>を相補的に使うというのはどうか。
0333332
2009/11/06(金) 03:50:460334デフォルトの名無しさん
2009/11/06(金) 04:00:29std:::mapはキーを効率的に検索できるように設計されているので
値は二の次なんでイテレータを回すしかないな
0335デフォルトの名無しさん
2009/11/06(金) 04:11:17分かりました、mapとmulti_map二つ使ってみます。
ありがとうございました。
0336デフォルトの名無しさん
2009/11/06(金) 04:33:030337デフォルトの名無しさん
2009/11/06(金) 04:34:520338デフォルトの名無しさん
2009/11/06(金) 08:38:100339デフォルトの名無しさん
2009/11/06(金) 08:42:51実装クラスを派生させた実装クラスがある場合
ハンドルクラスはそれぞれ作るものでしょうか?
それとも最終派生クラスについてのみ
ハンドルクラスを用意するものでしょうか?
0340デフォルトの名無しさん
2009/11/06(金) 10:06:560341デフォルトの名無しさん
2009/11/06(金) 10:16:050342デフォルトの名無しさん
2009/11/06(金) 12:35:38その状況なら、実装を隠す方法として pimpl よりも、最初から
抽象インターフェース+継承を使ったほうがいいかもしれない。
0343デフォルトの名無しさん
2009/11/06(金) 15:54:030344デフォルトの名無しさん
2009/11/06(金) 16:27:00ん?何を言いたいの?
0345デフォルトの名無しさん
2009/11/06(金) 17:27:13純粋仮想関数を否定したいのか?
0346デフォルトの名無しさん
2009/11/06(金) 18:11:08> 外部クラスに仕様制限
の意味がわからん。
そもそも外部クラスって何を意味したいのかわからん。
0347デフォルトの名無しさん
2009/11/06(金) 18:42:31でも、ポリモフィズムの為のインターフェース継承はそこに不必要な責任を要求するおそれがある
そうだな。さっきの言い方はまったく変だな。訂正しよう
ポリモーフィズムの為のインターフェース継承は、クラス利用者が利用されるクラスに対して、不必要な仕様を要求する可能性がある
だから嫌い。だね。仕様を制限するのはまったく逆じゃないか
0348デフォルトの名無しさん
2009/11/06(金) 18:56:21デザパタ本でも読め
0349デフォルトの名無しさん
2009/11/06(金) 19:08:13色々な団体が作成している各ライブラリ間で互換性がなさ過ぎ
0350デフォルトの名無しさん
2009/11/06(金) 19:09:12それは仕方が無い
C++には多重継承があってついついそちらを利用してしまうんで
インターフェースは避けて通る傾向が強い
0351デフォルトの名無しさん
2009/11/06(金) 19:30:31色々な団体が作成しているって段階でそりゃ目に見えているだろう。
0352デフォルトの名無しさん
2009/11/06(金) 20:36:49class cat : public creature {・・・};
↑これはいい
↓これは残念
struct drawable { virtual void draw() = 0; };
class cat : public creature, public drawable {・・・};
正解はdrawableを継承し、メンバにcreatureへのスマートポインタをもったクラスを作り仲介させること
すると開発の際にはクラス間の独立性が高まり、再利用時には不可解なメンバに遭遇し書き直すはめにあうなどといったことが無くなり精神衛生上たいへんよろしい
ただし、速度を優先したいなどの理由があるなら、本来必要無いはずのインタフェースを継承させ持たせてもよい
0353デフォルトの名無しさん
2009/11/06(金) 20:39:33それは多重継承の欠点を強調しているに過ぎないだろ
0354デフォルトの名無しさん
2009/11/06(金) 20:42:55なぜ「正解」で「独立性が高まる」んだ?
「不可解」とは、何から何を導けないことを言うんだ?
0355デフォルトの名無しさん
2009/11/06(金) 22:02:47最近そういうこと勉強したからって、
ここで披露すんなよ
ほんとにチラシの裏にでも書く内容だろそんなこと
ばかはしねw
0356デフォルトの名無しさん
2009/11/06(金) 22:24:29何を言いたいのかわからないなぁ。
おかしいなぁ、
相当高度な事を言っているのか
それとも。。。
0357352
2009/11/06(金) 22:26:39インターフェースの直接継承の方がアダプタパターンより優れていることを論理的に証明出来なければ、こなまま私の勝ちと言うことになるが宜しいか?
0358デフォルトの名無しさん
2009/11/06(金) 22:29:13おしいぞ
> こなまま
肝心なところでかんじゃうタイプ?
追い詰めるときはきっちりやらにゃ
0359デフォルトの名無しさん
2009/11/06(金) 22:30:28デザパタを覚えたからと言って、多重継承をすぐ否定するなよ
お前Javaやってんじゃないのか?
JavaやC#は多重継承がないからインターフェースを継承するしかないねえ
0360デフォルトの名無しさん
2009/11/06(金) 22:44:27多重継承全てを否定しているわけではなくて、特定少数のクライアントの為だけに提供されたインターフェースを直接継承してできることはアダプタで代用できて、なおかつこちらのはうが害が少ないのだからインターフェースのみの継承は避けるべきだと言っているのです
0361デフォルトの名無しさん
2009/11/06(金) 22:50:18もっと具体的に、できれば >>352 を例に説明頼むわ
0362デフォルトの名無しさん
2009/11/06(金) 22:55:11>こなまま私の勝ちと言うことになるが宜しいか?
この時点でまともな会話できる奴じゃないって気づけよw
話続けても無駄だろ
0363デフォルトの名無しさん
2009/11/06(金) 22:58:20ちょっとファビョり始めたあたり、
関わり合いにならない方が良いか。
0364デフォルトの名無しさん
2009/11/06(金) 23:00:27catはcreatureとdrawableを継承・実装する作りにするけどなあ。
C++だとinterfaceがないからクラスの多重継承になるだけの話。
0365デフォルトの名無しさん
2009/11/06(金) 23:10:47delegationのコードを書き捲らなければならなくなること
が多いからなー。現実のcreatureは食べるだけじゃなくて
動いたりウンコしたりSEXしたり...なんだし。
0366デフォルトの名無しさん
2009/11/06(金) 23:19:17人クラスのクリーチャーインターフェースのしっぽを引っ張るメソッドを呼んだらどうなるのかな
0367デフォルトの名無しさん
2009/11/06(金) 23:29:30あるプロジェクトでそのリストあるいはベクタの参照からポリモーフィズム的にポリラインを描画する命令が必要になったから、コードを書くとする
はたしてそのコードをメンバーに持たせるか、外に追い出すか、どちらが賢いのか?
メンバーに持たせたとして、ほかのプロジェクトでそのリストを再利用したときにDrawメンバーを呼び出す気になるか?
メンバーに持たせるのは賢くないしも、呼び出すのもゴメンだ(むしろそんなメンバーを公開するな)と考えた人が多数派だろう
インターフェース継承はその賢くない選択を派生クラスに強制する
一方でアダプタは派生(する予定だった)クラスには一切の変更・追加を要求しない
ヘッダにもソースにもノータッチで、ファイルを追加するだけで求める動作と同じことがより安全にスマートにできる
これでなぜインターフェースを直接継承するのか?
直接継承する明らかな利点はあるのか?
0368デフォルトの名無しさん
2009/11/06(金) 23:33:020369デフォルトの名無しさん
2009/11/06(金) 23:34:53なんかこのよく分からない口調のレス前も見たことある
0370デフォルトの名無しさん
2009/11/06(金) 23:40:330371デフォルトの名無しさん
2009/11/06(金) 23:41:470372デフォルトの名無しさん
2009/11/06(金) 23:43:02typoよりもその後の言い回しの方がすごいよね
0373デフォルトの名無しさん
2009/11/06(金) 23:43:54しっぽを引っ張るメソッドを設けたことが失敗ですよね。
強いて言えば、何もしないとかしっぽがない例外を投げるとかでしょ。
しかし、それがcreatureがインタフェースではなくクラスだったら
もっとよい方法があると言うのなら、ぜひ教えてください。
0374デフォルトの名無しさん
2009/11/06(金) 23:46:37ちょっとからかってやったら本気でファビョって
一週間ほど粘着された
同一人物とちゃうんか?
0375デフォルトの名無しさん
2009/11/06(金) 23:48:35インターフェースにする場合、しっぽを引っ張るとフーッっていうクリーチャーがいる以上、そのメソッドは必要です。
クリーチャーがインターフェースじゃなくてクラスだったら?
そりゃ、継承してしっぽがあるクリーチャークラスを作るでしょうね
0376デフォルトの名無しさん
2009/11/07(土) 00:00:13俺はてっきり描画可能(=形あるもの)ってことだと思った。
0377デフォルトの名無しさん
2009/11/07(土) 00:02:290378デフォルトの名無しさん
2009/11/07(土) 00:47:57・順序付けられた座標の集合クラス。集合操作に関するメンバのみを持つ。
・ポリラインインターフェイスクラス。描画や結合・分離、変形といった操作をする共通インターフェイスを提供する。
・ポリラインクラス。gdiとかdirectxとか印刷とか描画先にあわせて実装。
ま、論点がポリラインクラスの設計方針にずれるだけだけど。
0379デフォルトの名無しさん
2009/11/07(土) 01:59:28↓
インターフェース継承は嫌い(良くない)
というつながりが謎。
0380デフォルトの名無しさん
2009/11/07(土) 02:04:250381デフォルトの名無しさん
2009/11/07(土) 02:17:14/;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、 / ヽ
/ヽヽ: ://: :!:,X~::|: /;,,;,/: :/ リ!: ::/ノ l`ヽl !: : |: : : :l: :l: リ / そ そ お \
/: : ヽヾ/: : l/::l |/|||llllヾ,、 / |: :/ , -==、 l\:::|: : : :|i: | / う う 前 |
. /: : : //ヾ ; :|!: イ、||ll|||||::|| ノノ イ|||||||ヾ、 |: ::|!: : イ: ::|/ な 思 が
/: : ://: : :ヽソ::ヽl |{ i||ll"ン ´ i| l|||l"l `|: /|: : /'!/l ん う
∠: : : ~: : : : : : : :丶ゝ-―- , ー=z_ソ |/ ハメ;, :: ::|. だ ん
i|::ハ: : : : : : : : : : : 、ヘヘヘヘ 、 ヘヘヘヘヘ /: : : : : \,|. ろ な
|!l |: : : : : : : : :、: ::\ 、-―-, / : : :丶;,,;,:ミヽ う ら
丶: :ハ、lヽ: :ヽ: : ::\__ `~ " /: : ト; lヽ) ゝ
レ `| `、l`、>=ニ´ , _´ : :} ` /
,,、r"^~´"''''"t-`r、 _ -、 ´ヽノ \ノ / お ・
,;'~ _r-- 、__ ~f、_>'、_ | で 前 ・
f~ ,;" ~"t___ ミ、 ^'t | は ん ・
," ,~ ヾ~'-、__ ミ_ξ丶 | な 中 ・
;' ,イ .. ヽ_ ヾ、0ヽ丶 l /
( ;":: |: :: .. .`, ヾ 丶 ! \____/
;;;; :: 入:: :: :: l`ー-、 )l ヾ 丶
"~、ソ:: :い:: : \_ ノ , ヾ 丶
0382デフォルトの名無しさん
2009/11/07(土) 02:22:560383デフォルトの名無しさん
2009/11/07(土) 03:53:06これなに?
0384デフォルトの名無しさん
2009/11/07(土) 05:59:15お前を待っていた!wwww
0385デフォルトの名無しさん
2009/11/07(土) 21:33:27> ポリライン
ワイヤーフレームじゃね?
0386デフォルトの名無しさん
2009/11/07(土) 21:49:090387デフォルトの名無しさん
2009/11/07(土) 22:11:17って書いてあったのでやってみたらマジ速くて
チャールズ・ペゾルド先生らぶ♥って感じ。
0388デフォルトの名無しさん
2009/11/08(日) 12:18:400389デフォルトの名無しさん
2009/11/08(日) 16:00:05しかし逆は必ずしもできません。
では「三項演算子」でできる処理ならとにかく「三項演算子」で書けば
可読性はともかくパフォーマンス的には必ず望ましいと考えてよろしいのでしょうか?
よろしくお願い申し上げます。
0390デフォルトの名無しさん
2009/11/08(日) 16:07:290391デフォルトの名無しさん
2009/11/08(日) 16:14:44実測あるのみ
0392デフォルトの名無しさん
2009/11/08(日) 16:16:30そんなことも自分で考えられないやつが高速化とか言うのは100%間違っているから気にすることはない。
つーか、スレ違いだろ。
0393デフォルトの名無しさん
2009/11/08(日) 16:37:19三項演算子じゃなきゃ記述できないこともあるぞ
enumの定義とか
0394デフォルトの名無しさん
2009/11/08(日) 16:38:32> > 速度的には後者?後者は比較をしてないと思ってんのかな。
> 思っていましたが、しているのですか?
こんなんだぞ
0395389
2009/11/08(日) 17:19:41そういうものですか。
ありがとうございます。
>>393
なるほど。
ttp://codepad.org/5RMC4FxC
こんな感じでしょうか。
0396デフォルトの名無しさん
2009/11/08(日) 17:58:02enumの定義が条件によって変わるなんて気持ち悪いから
考えなくてよい。
0397デフォルトの名無しさん
2009/11/08(日) 18:01:44天ぷらメタプロで普通に使うし
0398デフォルトの名無しさん
2009/11/08(日) 18:10:27>>389の質問に沿ってないんでは。
0399389
2009/11/08(日) 18:27:57ありがとうございます。
TMPのようなコンパイル時処理においては
「三項演算子」でしか無理なものもあるということ
理解致しました。
0400デフォルトの名無しさん
2009/11/08(日) 19:03:22どっからパフォーマンスに繋がるのか。
0401デフォルトの名無しさん
2009/11/08(日) 19:18:310402デフォルトの名無しさん
2009/11/08(日) 19:32:390403デフォルトの名無しさん
2009/11/08(日) 19:49:440404デフォルトの名無しさん
2009/11/08(日) 19:53:330405デフォルトの名無しさん
2009/11/08(日) 19:58:390406デフォルトの名無しさん
2009/11/08(日) 20:30:580407デフォルトの名無しさん
2009/11/08(日) 21:14:290408デフォルトの名無しさん
2009/11/08(日) 21:29:15std::numeric_limits<double>::infinity()
の標準C++で規定されている仕様を知ることができる資料を
無償で閲覧できる方法はありませんでしょうか?
例えば
std::numeric_limits<double>::infinity()*0.0
の演算結果などです。
0409デフォルトの名無しさん
2009/11/08(日) 21:32:57テンプレ見れ・・・と思ったらテンプレ無いのか。
↓ここからどうぞ。
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
0410デフォルトの名無しさん
2009/11/08(日) 21:47:37ダウンロードはできないけど、ここから「X3014」で探せば現行のJIS規格が読める
0411デフォルトの名無しさん
2009/11/08(日) 22:00:02カモノハシじゃなくて
カワウソだったら合格
0412デフォルトの名無しさん
2009/11/08(日) 22:08:140414デフォルトの名無しさん
2009/11/08(日) 22:35:11浮動小数点のあたりってC99との摺り合わせで影響受けてないのかな
0415デフォルトの名無しさん
2009/11/09(月) 01:07:330416デフォルトの名無しさん
2009/11/09(月) 01:14:430417デフォルトの名無しさん
2009/11/09(月) 03:04:44カモノハシの例は確かにそう思う。
けど卵生哺乳類と言えばカモノハシなので別にいいじゃんと思うんだ。
単に魚といえばマサバかヨシノボリか分からないだろう?
0418デフォルトの名無しさん
2009/11/09(月) 03:07:270419デフォルトの名無しさん
2009/11/09(月) 03:08:160420デフォルトの名無しさん
2009/11/09(月) 06:41:34はカモノハシが卵生の哺乳類ということを知らなかったんだろう。
0421デフォルトの名無しさん
2009/11/09(月) 07:34:56char *p = new char[10];とかのpって積み込めない?
固定長配列なら積み込めるのか?
(vector<char>使えってのはなしでお願いします)
0422デフォルトの名無しさん
2009/11/09(月) 07:37:53「積み込む」の意味がわからん。
内容をコピーしたいなら assign() すればいいし、
そうじゃなければ最初から vec・・・配列 new なんか使わなければいいのに。
0423デフォルトの名無しさん
2009/11/09(月) 07:39:21memcpy(&vec[0], p , 100);
なら出来るが、&vec[0]に他所で確保したアドレスだけを渡すのは出来なかった記憶。
0424デフォルトの名無しさん
2009/11/09(月) 07:41:26string(p,N); だと、string型が生成されて、Nバイトのコピーが発生するが
コピーなしで出来ないかと言うことでは。
0425デフォルトの名無しさん
2009/11/09(月) 07:43:12はじめから技巧をすると失敗する 複雑化する。
とりあえずコピー作ってもいいから簡単に済ますべき。
0426デフォルトの名無しさん
2009/11/09(月) 07:43:56なんで vector<char> 使うのは無しなの?
0427デフォルトの名無しさん
2009/11/09(月) 07:45:05C++ で memcpy() なんか使うんじゃありません。
案の定バグってるし。
0428デフォルトの名無しさん
2009/11/09(月) 07:48:31やりたかったのはこんなこと
vec.push_back( p );とか。
vec[0]で、pを取り出しても、配列の長さはどこかに保存してないとダメだよね?->この方法は使えない
って考えは正しい?
0429デフォルトの名無しさん
2009/11/09(月) 07:51:55vec.push_back( string(p,strlen(p)) );
だな。
0430デフォルトの名無しさん
2009/11/09(月) 07:54:06でもおけかもしれないがサイズは指定した方が良い。
\0があっても格納可能。
0431デフォルトの名無しさん
2009/11/09(月) 07:55:110432デフォルトの名無しさん
2009/11/09(月) 07:57:11バイナリデータ載せるんで、strlenとか使えないっすわ・・・
ためしに、
vector< char [100] > v;
とかやっても、コンパイルエラーでました。固定長配列も、コンテナの要素には出来ない?
0433デフォルトの名無しさん
2009/11/09(月) 07:58:58だから、なんで vector<char> ではダメなのかと。
ちなみに struct char100 { char data[100] }; なら vector<char100> できるよ。
0434デフォルトの名無しさん
2009/11/09(月) 08:22:160435デフォルトの名無しさん
2009/11/09(月) 08:28:32ありがと。
Cで、単に今までPOD(でいいのか?)の配列を操作してたものを
C++で書き換えてるんだけど、
単にmemcpyできてたのを、vectorに変えると速度がきになるかなーと。
ほとんどバイナリデータを扱う処理だから、
vectorで書いちゃったあと、速度出ませんでした。ってなるのが怖かった
>>434
バカでさーせん
0436デフォルトの名無しさん
2009/11/09(月) 08:31:25{ char * , unsigned int }のクラス。これならコピーは無いから速い。
0437デフォルトの名無しさん
2009/11/09(月) 08:45:120438デフォルトの名無しさん
2009/11/09(月) 08:53:250439デフォルトの名無しさん
2009/11/09(月) 09:04:100440デフォルトの名無しさん
2009/11/09(月) 09:13:53一度作ってパフォーマンスが悪かったから全部書き換える。
とか、そんな時間あるわけないだろ・・・
つーか、vector使わなかっただけでバカ扱いか。ひどいな
0441デフォルトの名無しさん
2009/11/09(月) 09:16:27計測もしてないのに変に速度を気にして話を面倒にするのは馬鹿と言われてもしかたがない。
0442デフォルトの名無しさん
2009/11/09(月) 09:36:25初めから >>421 では vector 等に組み込めないかとういう話じゃないの?
0443デフォルトの名無しさん
2009/11/09(月) 09:40:330444デフォルトの名無しさん
2009/11/09(月) 09:54:310445デフォルトの名無しさん
2009/11/09(月) 10:06:48こちらは、staticのバッファ持っていて write( char*p, int n);
こちらはバッファを書き出したいのですが write( );
この二つだけからアクセス可能なバッファは作れないですか?
0446デフォルトの名無しさん
2009/11/09(月) 10:08:07たぶんスレ違いだね。
↓こっちへどうぞ。
http://pc12.2ch.net/test/read.cgi/tech/1187922645/
0447デフォルトの名無しさん
2009/11/09(月) 10:08:360448デフォルトの名無しさん
2009/11/09(月) 10:15:39バッファが不定のままになるのをどう対処するかはまた別の問題だが
0449デフォルトの名無しさん
2009/11/09(月) 10:38:540450デフォルトの名無しさん
2009/11/09(月) 10:41:460451デフォルトの名無しさん
2009/11/09(月) 11:21:00B b; のとき、 b[n].fnc();がクラスBのxを使いたいです。
class B {
public:
vector<int> x;
A operator [] ( unsigned int n ) ;
};:
0452451
2009/11/09(月) 11:28:01B b,c;のとき、b[0]もc[0]もクラスAになってしまい、ここからbやcが特定できないので。
良い方法無いですか。
0453デフォルトの名無しさん
2009/11/09(月) 11:32:390454デフォルトの名無しさん
2009/11/09(月) 11:33:17先ずはAの定義を晒せ。つーか、AにBの参照でも持たせておけばいいんじゃね
0455デフォルトの名無しさん
2009/11/09(月) 11:36:56Bの*thisポインタをAのメンバに入れたら出来そうですね。
thx!
0456デフォルトの名無しさん
2009/11/09(月) 12:51:21int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; //ウィンドウモードにする。
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了
int i,a=0,time;
int White;
White = GetColor( 255 , 255 , 255 ) ; // 白色の値を取得
time = GetNowCount() ; // 現在経過時間を得る
DrawFormatString(0, 0, White , "立ち上がってから%d分%d秒", time / 1000 / 60,■■■);//文字列表示
for(i=0;i<100000;i++) //10万回a++;を実行
a++;
time = GetNowCount() - time; //現在の経過時間から先ほどの経過時間を引く
DrawFormatString(0,100, White , "計算時間%dミリ秒" , time);//文字列表示
WaitKey() ; // キーの入力待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
秒をどうやって表示させればいいか、悩んでます・・・
■■■の部分です
0457デフォルトの名無しさん
2009/11/09(月) 12:52:060458デフォルトの名無しさん
2009/11/09(月) 12:57:22あざーーす(゜∀゜)
0459デフォルトの名無しさん
2009/11/09(月) 13:22:540460デフォルトの名無しさん
2009/11/09(月) 13:36:280461デフォルトの名無しさん
2009/11/09(月) 13:48:410462デフォルトの名無しさん
2009/11/09(月) 14:25:53cyclic group?
0463デフォルトの名無しさん
2009/11/09(月) 17:19:26名前空間でnewの切り替えをしようと思ったけどできなかった
こういうことはもとからできないものなん?
0464デフォルトの名無しさん
2009/11/09(月) 18:28:06std::vectorの要素にarray<char, 10>とかboost::shared_array使うのはどう?
0465デフォルトの名無しさん
2009/11/10(火) 02:10:320466デフォルトの名無しさん
2009/11/10(火) 11:14:580467デフォルトの名無しさん
2009/11/10(火) 11:22:35std::vectorに入れて使うよう、あるクラスを作りましたが、
代入演算子を持たない為、push_back()でこけてしまいます。(VC8EEでC2582)
多分そのクラスが参照をメンバに持っている為だと思いますが、どうすればvectorに入れられるでしょうか?
↓こんな感じです。
class A
{
B& b;
A( B& b_ ) : b(b_){}
};
int main()
{
B b;
std::vector< A > v;
v.push_back( A(b) ); // C2582
return 0;
}
0468デフォルトの名無しさん
2009/11/10(火) 11:29:250469デフォルトの名無しさん
2009/11/10(火) 11:36:56早速コピーコンストラクタを作ってみましたが
同じでした。
"c:\program files\microsoft visual studio 9.0\vc\include\xutility(3133) : error C2582: 'operator '=' 関数を 'houz::`anonymous-namespace'::A' で使用できません。"
ってことだけど、operator=は作れそうに無いし・・
これは無理ってことですかね?
0470デフォルトの名無しさん
2009/11/10(火) 11:39:48そういやそれは無理だな
メンバにBへのリファレンスを持っているからこれは初期化でしか
値を結合できない
operator=は初期化子が使えないから無理かも
無理矢理やると次のようになるかも
class B {
public:
void show() const { std::cout << "class B" << std::endl; }
};
class A
{
B& b;
public:
A(B& b_) : b(b_) {}
A(const A& a_) : b(a_.b) {}
A& operator=(const A& a_) {
std::memcpy(&b, &a_.b, sizeof(b));
return *this;
}
void execB() const {
b.show();
}
};
int main()
{
B b;
std::vector<A> v;
v.push_back(A(b)); // C2582
v[0].execB();
}
0471デフォルトの名無しさん
2009/11/10(火) 11:43:46Effective C++ 第2版 p.237 第45項「C++がどんな関数を黙って書き、呼び出しているか、知っておこう」
0472デフォルトの名無しさん
2009/11/10(火) 11:47:20ちょっとずれてるぞお前
今話題にしてるのはリファレンス変数への代入は無理だという事だ
だから標準では無理なので無理矢理memcpyを使ったわけ
0473デフォルトの名無しさん
2009/11/10(火) 11:49:52> 代入演算子を持たない為、push_back()でこけてしまいます。(VC8EEでC2582)
> 多分そのクラスが参照をメンバに持っている為だと思いますが、どうすればvectorに入れられるでしょうか?
↑ここまでわかっててわざわざ質問する意味がわからん。
0474デフォルトの名無しさん
2009/11/10(火) 11:50:50わかってるかもしれないが、未定義動作な。
それでいいんなら最初からポインタにしとけ、と。
0475471
2009/11/10(火) 11:50:55かつらの人に「ずれてる」とかかわいそうだろ。
じゃなくて、>>470へのレスじゃないよ^^
>>467へのレス。ゆっくりしていたら話がちぐはぐになった。
レス番つけなくてすまん。
0476デフォルトの名無しさん
2009/11/10(火) 11:54:26仕方がない
無理を通せば鼻から悪魔、だ
0477デフォルトの名無しさん
2009/11/10(火) 11:55:55>>470の方法でコンパイルは通るようになりました。
ただ、const参照も使っていたせいでconst_castとmemcpyの
ちょっとデンジャーな実装になってしまいました。
未定義動作は困るので、ポインタ配列で作り直そうと思います。
ご対応ありがとうございました。
>>473
対応策があるかないかわからなかったので質問させて頂きました。
0478デフォルトの名無しさん
2009/11/10(火) 12:05:40クラスの定義を変更しないと無理なのに、どこを変えてもいいのか >467 を読んだだけの
こっちにはわからんのだよ。こんどから気をつけてな。
0479467
2009/11/10(火) 12:17:47やる意義はないとは思いますが。
class A
{
B* pb;
B& b;
operator=(B& b_)
{
pb=&b_;
}
A() : pb(0), b(*pb){}
}
>>478
すみません。以後気をつけます。
0480デフォルトの名無しさん
2009/11/10(火) 12:21:22だめだよ
bが変更されてない
バグる
0481デフォルトの名無しさん
2009/11/10(火) 20:58:02利点まったくないぜ?
0482デフォルトの名無しさん
2009/11/10(火) 21:01:05参照をデータメンバーにする事にケチつけるレベルなんだねw
0483デフォルトの名無しさん
2009/11/10(火) 21:07:210484デフォルトの名無しさん
2009/11/10(火) 21:22:440485デフォルトの名無しさん
2009/11/10(火) 22:18:580486デフォルトの名無しさん
2009/11/11(水) 00:00:29データメンバーだぞ?
0487デフォルトの名無しさん
2009/11/11(水) 04:19:18ポインタはこれができないからな。
0488デフォルトの名無しさん
2009/11/11(水) 09:40:510489デフォルトの名無しさん
2009/11/11(水) 12:16:25newしたポインタは必ずdeleteするようにちゃんと管理しろよ
戻り値のエラーコードはちゃんと全部チェックしろよ
4byte以上の型のためにメモリを確保するときはちゃんとアライメント管理しろよ
0490デフォルトの名無しさん
2009/11/11(水) 13:48:56参照先を途中で変えたいときはナマポ
参照先の寿命がクライアント依存ならスマポ
これで完全無欠
0491デフォルトの名無しさん
2009/11/11(水) 20:21:220492デフォルトの名無しさん
2009/11/11(水) 20:50:260493デフォルトの名無しさん
2009/11/11(水) 21:15:040494デフォルトの名無しさん
2009/11/12(木) 02:46:22ありがとうございますo(^-^)o
>>493
適当な事言うな死ね
0495デフォルトの名無しさん
2009/11/12(木) 07:17:090496デフォルトの名無しさん
2009/11/12(木) 08:51:51参照の代わりにポインタを使う、という用途(話の流れから当然だよな)なら
newする必要なんか無いし、
別途存在する実体から得たアドレスで初期化するだけなんだが。
0497デフォルトの名無しさん
2009/11/12(木) 09:07:05お前例え話苦手だろ、アスペにありがちな症状だぜ。 俺もだけど。
0498デフォルトの名無しさん
2009/11/12(木) 09:28:550499デフォルトの名無しさん
2009/11/12(木) 09:33:48map型か(__gnu_cxx::hash_map、std::map類)、
それ以外か(std::vector, std::queue, int, struct Hoge)、
2通りに分ける方法ありませんか?
0500デフォルトの名無しさん
2009/11/12(木) 12:10:130501デフォルトの名無しさん
2009/11/12(木) 12:12:39○std::iterator_traits::iterator_category
0502デフォルトの名無しさん
2009/11/12(木) 12:13:37ここら辺を参考に
0503デフォルトの名無しさん
2009/11/12(木) 12:16:05tenpureto<taipunemu K, taipumenu T> struct izu_mappu<std::map<K, T> >{ enum{ varyu = true }; };
0504デフォルトの名無しさん
2009/11/12(木) 12:18:54でもテンプレートの特殊化は引数に渡されたクラスのテンプレート引数を特定しなくてもできるよ!o(^-^)o
よかったね〜\(^∀^)/
0505デフォルトの名無しさん
2009/11/12(木) 12:20:410506デフォルトの名無しさん
2009/11/12(木) 12:21:210507デフォルトの名無しさん
2009/11/12(木) 17:49:56(^o^)何で自殺しないの?
0508デフォルトの名無しさん
2009/11/12(木) 18:19:33>>502
ありがとうございます。見てみます。
0509デフォルトの名無しさん
2009/11/12(木) 19:39:460510デフォルトの名無しさん
2009/11/12(木) 20:21:490511デフォルトの名無しさん
2009/11/12(木) 21:09:20タイムステップごとに新しいファイルに出力、たとえば
file1.dat、file2.dat・・・filei.dat
みたいにするにはどうしたらいいですか?
ofstream out(filei.dat) のiだけを変える方法がわかりません
0512デフォルトの名無しさん
2009/11/12(木) 21:20:370513デフォルトの名無しさん
2009/11/12(木) 21:25:430514デフォルトの名無しさん
2009/11/12(木) 21:31:56たとえば file名を string にして i も string に変えて
string filename("file");
filename + boost::lexical_cast<string>(i) +".dat";
ofstream out(filename.c_str());
boost 使ったけど、int->string は他にもいろいろ方法あるよ。
0515デフォルトの名無しさん
2009/11/12(木) 21:50:54#include <sstream>
int main(void)
{
using namespace std;
for(int i = 0; i < 10; ++i)
{
stringstream SS;
SS << "file" << i << ".dat";
ofstream OFS(SS.str().c_str());
OFS << "hello!";
}
return 0;
}
0516514
2009/11/12(木) 21:53:04filename += boost::lexical_cast<string>(i) +".dat";
ただ初め二行は
string filename("file" + boost::lexical_cast<string>(i) + ".dat");
で良い。
0517デフォルトの名無しさん
2009/11/12(木) 22:26:33ostringstreamにiを流し込んでメンバ関数str()な
0518デフォルトの名無しさん
2009/11/12(木) 22:27:15○嫌なら
0519デフォルトの名無しさん
2009/11/12(木) 22:51:26C++的にはあまりよろしくないんでしょうか?
オーバーフロー的な問題なら、snprintf()でいいかなーって思うんですが・・・
0520デフォルトの名無しさん
2009/11/12(木) 23:04:050521デフォルトの名無しさん
2009/11/12(木) 23:12:03癖に止めてくれるなら問題ないよ。
例えばメンバ関数内の実装で君が責任を持って処理できるとかなら。
実装に触れなくても大丈夫なようにちゃんとカプセル化してくれるなら。
他人にsnprintf()を要求し始めたらだめだけどさ。
0522デフォルトの名無しさん
2009/11/12(木) 23:58:35いいことを教えてあげよう
世の中にはnを無視して単にsprintfに委譲するだけのクソのようなsnprintfが実在する
0523デフォルトの名無しさん
2009/11/13(金) 00:02:210524デフォルトの名無しさん
2009/11/13(金) 00:09:04クソすぎてワロタが、それはsnprintfを使わない理由としては弱いだろ。
大半のsnprintfの実装はまともなんだから。
まぁboost::format使っとけ。
0525デフォルトの名無しさん
2009/11/13(金) 00:45:440526デフォルトの名無しさん
2009/11/13(金) 02:23:410527メモ
2009/11/13(金) 13:29:040528デフォルトの名無しさん
2009/11/13(金) 16:31:53ofstreamで、テキストファイルに大量のデータを書き出しているんですが、
途中で落ちてしまいます。どうやらデータがすくないとおちずに済むようです。
都合上1行に長々とデータを書き出して行きたいのですが、
1行に書き出せる文字数の制限や、streamで扱えるファイルの大きさなどに
制限はあるのでしょうか?
0529デフォルトの名無しさん
2009/11/13(金) 16:34:160530デフォルトの名無しさん
2009/11/13(金) 16:54:22処理系のバグ
0531デフォルトの名無しさん
2009/11/13(金) 19:17:54windowsならcreatefileWなど。
C言語のラッパーは信用ならん。
0532デフォルトの名無しさん
2009/11/13(金) 19:23:27こんな感じでよいだろう。
write(string s ){
static string buf;
int n=buf.size();
int r=s.size();
buf.resize(n+r);
memcpy(&buf[n], &s[0], r);
if(n+r>(1<<17)) {書き出し buf.resize(0); }
}
0533デフォルトの名無しさん
2009/11/13(金) 19:39:130534デフォルトの名無しさん
2009/11/13(金) 19:54:24write(string s ){
static char *buf = new char [1<<17];
static int bufsize=0;
int r=s.size();
if(r+bufsize>(1<<17)) { bufとsの書き出し bufsize=0; return; }
memcpy(&buf[bufsize], &s[0], r);
buf+=r; }
0535デフォルトの名無しさん
2009/11/13(金) 19:55:240536デフォルトの名無しさん
2009/11/13(金) 19:56:07write(char *p, int size ){
static char *buf = new char [1<<17];
static int bufsize=0;
if(size+bufsize>(1<<17)) { bufとsの書き出し bufsize=0; return; }
memcpy(&buf[bufsize], p, size);
buf+=size; }
0537デフォルトの名無しさん
2009/11/13(金) 19:59:59なぜ書くかと言えば、一行ずつ書き込むと入出力に時間食うからだ。
128KBほど蓄えておけば快適。
あと最後にバッファが残ると書き出されないので注意。
クラスのデストラクタなどと組み合わせると、自動で書き出し、closeできるのでやってみてくれよ
0538デフォルトの名無しさん
2009/11/13(金) 20:12:400539デフォルトの名無しさん
2009/11/13(金) 20:56:360540デフォルトの名無しさん
2009/11/13(金) 21:13:17とりあえず、buf+=sizeとかしてどうするつもりなんだ。
人類の平和のためにお前は2度とコードを書くな。
0541デフォルトの名無しさん
2009/11/13(金) 21:32:35newで確保するのが良い場合もあるな。
ソートなど。
vector<string>のソートはメモリ大移動するけど
vector<string*>はindexだけの入れ替えで済む。
0542デフォルトの名無しさん
2009/11/13(金) 21:43:450543541
2009/11/13(金) 21:51:240544デフォルトの名無しさん
2009/11/13(金) 22:12:27可変長じゃなくても実体もったらコピーだらけだろw
0545541
2009/11/13(金) 22:54:05#include <string>
#include <vector>
#include <iostream>
#include <windows.h>
#include <algorithm>
using namespace std;
bool comp(const string* &l, const string* &r){return (l->compare(*r))<0;}
void timer(){static char c=2, d;static unsigned int cnt=1;static LARGE_INTEGER cl[2];static double cnst;
if(c==2) { QueryPerformanceFrequency(&cl[0]);cnst=1000.0/cl[0].LowPart; c=0; QueryPerformanceCounter(&cl[0]); return; }
d=(char)(1-c); QueryPerformanceCounter(&cl[d]);
cout<<"timer:"<<cnt<<" = "<<(cl[d].LowPart - cl[c].LowPart)*cnst<<endl;c=d; cnt++; }
unsigned int xorshift(void) {
static unsigned int x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
unsigned int t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }
int main(){
unsigned int n,s,t,x;
vector<string> v;vector<string*> w;
string buf(40*16, '\0');
timer();
for(n=0; n<(1<<17); n++) {
for(s=0;s<16*40;s+=16){
x=xorshift();
for(t=0;t<16;t++) { buf[s+t]=(char)('A'+(x&3));x>>=2; }}
v.push_back(buf); }
timer();sort( v.begin(), v.end() );timer();
for(n=0; n<(1<<17); n++) w.push_back( new string(v[n]) );
vector<string>().swap(v);
timer();sort( w.begin(), w.end() , comp);timer();
cout<<"timer2がvector<string>、timer4がvector<string*>のソート\n";}
0546デフォルトの名無しさん
2009/11/13(金) 23:43:34#include <iostream>
#include <windows.h>
using namespace std;
void timer(){static char c=2, d;static unsigned int cnt=1;static LARGE_INTEGER cl[2];static double cnst;
if(c==2) { QueryPerformanceFrequency(&cl[0]);cnst=1000.0/cl[0].LowPart; c=0; QueryPerformanceCounter(&cl[0]); return; }
d=(char)(1-c); QueryPerformanceCounter(&cl[d]);
cout<<"timer:"<<cnt<<" = "<<(cl[d].LowPart - cl[c].LowPart)*cnst<<endl;c=d; cnt++; }
unsigned int xorshift(void) {
static unsigned int t, x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }
unsigned int tt, tx=123456789UL,ty=362436069UL,tz=521288629UL,tw=88675123UL;
unsigned int xorshift2(void) {
tt=tx^(tx<<11); tx=ty; ty=tz; tz=tw; return tw^=(tw>>19)^tt^(tt>>8); }
int main(){
unsigned int n,s=0;
timer(); for(n=0; n<(1<<26); n++) s+=xorshift2();
timer(); for(n=0; n<(1<<26); n++) s+=xorshift();
timer(); for(n=0; n<(1<<26); n++) s+=xorshift2();
timer(); for(n=0; n<(1<<26); n++) s+=xorshift();
timer(); cout<<(s&1)<<endl;}
0547デフォルトの名無しさん
2009/11/13(金) 23:57:16コンパイラ次第でした。
bccだけグローバルが速いです
gccはどちらも遅く、vcはどちらも速いです
0548デフォルトの名無しさん
2009/11/14(土) 00:04:43てか、そんなクソコード入れるとPC壊れるぞ?
0549デフォルトの名無しさん
2009/11/14(土) 01:04:12あとGCCは最近ベクトル化とかもやりだして、最適化はかなりよくなってる(ICCをしのぐこともある)
参考文献 http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf
0550デフォルトの名無しさん
2009/11/14(土) 07:57:30実際、Comeauの次にVC++と並んだ標準準拠度の高さだと思うのは俺だけではないだろう。
0551デフォルトの名無しさん
2009/11/14(土) 08:47:100552デフォルトの名無しさん
2009/11/14(土) 22:30:22これよりいいやり方は無いかな?
#include <iostream>
class CHoge
{
typedef void (CHoge::*MemFunc_t)();
MemFunc_t mMemFunc;
public:
void memFuncA() { std::cout << "CHoge::MemFuncA" << std::endl; }
void memFuncB() { std::cout << "CHoge::MemFuncB" << std::endl; }
void setMemFunc(MemFunc_t memFunc) { mMemFunc = memFunc; }
void memFunc() { (this->*mMemFunc)(); }
};
int main(void)
{
CHoge hoge;
hoge.setMemFunc(&CHoge::memFuncA);
hoge.memFunc();
hoge.setMemFunc(&CHoge::memFuncB);
hoge.memFunc();
return 0;
}
0553デフォルトの名無しさん
2009/11/14(土) 22:40:550554デフォルトの名無しさん
2009/11/14(土) 22:55:49設計にもよりますが
普通に考えて
class CHoge_A : public CHoge;
class CHoge_B : public CHoge;
が自然である状況が多いと思いますよ。
0555デフォルトの名無しさん
2009/11/14(土) 22:58:370556デフォルトの名無しさん
2009/11/14(土) 23:02:250557デフォルトの名無しさん
2009/11/14(土) 23:06:06だから「設計にもよるが」と断りを>>552に書かれているだろう。
0558デフォルトの名無しさん
2009/11/14(土) 23:24:030559デフォルトの名無しさん
2009/11/14(土) 23:35:34そんなもの存在しない、に1カノッサ。
0560デフォルトの名無しさん
2009/11/14(土) 23:47:42その場合は問題自体が存在しないということだ。
0561デフォルトの名無しさん
2009/11/15(日) 00:08:480562デフォルトの名無しさん
2009/11/15(日) 00:11:47is a とか has a とか言う前に
結局何ができればよいのかという what に立ち返ったとき
選択肢はありすぎるほど色々だろうって
0563デフォルトの名無しさん
2009/11/15(日) 00:14:24それ、関数ポインタでやるのと同じ。
0564デフォルトの名無しさん
2009/11/15(日) 00:16:18同じことなら、なおのこと関数ポインタなど持ち出す必要はないということだろ。
0565デフォルトの名無しさん
2009/11/15(日) 00:22:49たして変わらんがな。
とりあえず、質問者はそもそも何がしたいかを言え。不毛なのはお互い損だろ?
0566デフォルトの名無しさん
2009/11/15(日) 00:23:08そしてenum,switch,if-else地獄に突入の予感
0567デフォルトの名無しさん
2009/11/15(日) 01:05:50以下、略。
0568デフォルトの名無しさん
2009/11/15(日) 01:11:250569デフォルトの名無しさん
2009/11/15(日) 01:18:000570デフォルトの名無しさん
2009/11/15(日) 01:18:080571デフォルトの名無しさん
2009/11/15(日) 01:25:04つ入力補完
0572デフォルトの名無しさん
2009/11/15(日) 01:26:23変換テーブルを変えられるようにしたいのと、キーコード(ライブラリヘッダ内の)を隠蔽したいって要求もある
キーボードの入力は
class i_keyboard // ゲームによらず共通
{
public:
virtual bool check_a();
・・・
virtual bool check_shift();
・・・
};
見たいな感じでキーコードと実装が隠蔽されている既存のクラス(これはもう触りたくない)で取得
で、ゲームキーへの変換に
class game_input // Facade、ゲームによって細部がかわるかも(ボタンの数とか)
{
i_keyboard *kb;
public:
bool check_a() { return kb->check_z(); }
bool check_b() { return kb->check_x(); }
bool check_x() { return kb->check_a(); }
bool check_y() { return kb->check_s(); }
bool check_l() { return kb->check_q(); }
bool check_r() { return kb->check_w(); }
・・・
} ;
とやってる
固定キー配置ならこれでいいんだけど、キーコンフィグでゲーム内でのボタンをキーボードの何に対応させるかを変えられるようにしたい
そのためにgame_input::check_XXX()がどのi_keyboard::check_YYY()を呼び出すか、外から切り替えられるようにしたい
一人でどうしようかと悩んだ結果メンバ関数ポインタがましかな?というところに落ち着いたんだけど、ほかにいいアイデアが無いもんかと質問した
0573デフォルトの名無しさん
2009/11/15(日) 01:47:51よくもまぁキーいっこごとに関数なんか作ったもんだ。そこが失敗に違いないんだろうけど、
i_keyboard とやらをほんとうに変更したくなくて、キーコンフィグのためにキー識別子のような
ものを用意しなくて済むのなら、関数ポインタでもなんとかなるかもしれない、みたいな。
0574デフォルトの名無しさん
2009/11/15(日) 02:35:27っ トランポリン関数
0575デフォルトの名無しさん
2009/11/15(日) 02:53:480576デフォルトの名無しさん
2009/11/15(日) 03:07:110577デフォルトの名無しさん
2009/11/15(日) 03:27:470578デフォルトの名無しさん
2009/11/15(日) 03:47:050579デフォルトの名無しさん
2009/11/15(日) 08:12:02まぁ典型的な質問だがな。
0580デフォルトの名無しさん
2009/11/15(日) 10:34:370581デフォルトの名無しさん
2009/11/15(日) 13:38:45テンプレートクラスを型を指定して?継承することってできるんですか?
template<typename T> class Hoge
{
virtual T& Combine(T& other) = 0;
};
// そもそもこんなことできるのか
class Foo : public Hoge<Foo>
{
virtual /*どう書けばいいのか*/ Combine(/*ここもどうすれば*/);
};
教えてください。お願いします。
0582デフォルトの名無しさん
2009/11/15(日) 13:41:06つCRTP
0583581
2009/11/15(日) 14:14:35でも、できるものならほかの方法はないのでしょうか。
Hogeはインターフェースとして使いたいので、もっと単純にできる方法はありませんか?
0584デフォルトの名無しさん
2009/11/15(日) 14:17:12T に Foo を指定してるんだから、 T& だったところを Foo& にすればいいだけだよ。
0585デフォルトの名無しさん
2009/11/15(日) 14:23:02は何がしたいのか分からない。
Combineは何をする関数なんだ?
template<typename T> class Hoge
からすると>>584の通りだと思う
0586581
2009/11/15(日) 15:31:39>>585
返答してくださってありがとうございます。
すんません。質問するためにコードを書きなおして似たようなコードを作ったのですが、分かりづらくしてしまい、申し訳ございません。(-_-;)
>>584
...
virtual Foo& Combine(Foo& other); // 実装は別
...
'Foo' : 抽象クラスをインスタンス化できません。
次のメンバが原因です:
'T& Hoge::Combine(T &)' : は抽象型です
と言われてコンパイルが通りません。
0587デフォルトの名無しさん
2009/11/15(日) 15:33:310588581
2009/11/15(日) 15:34:150589デフォルトの名無しさん
2009/11/15(日) 15:50:09エラー通りだな
0590デフォルトの名無しさん
2009/11/15(日) 15:55:05少なくとも以下のコードなら手元の g++ 3.4.4 で通る。
template<typename T> class Hoge { virtual T& Combine(T& other) = 0; };
class Foo : public Hoge<Foo> { virtual Foo& Combine(Foo& other); };
int main() { Foo x; }
Foo& Foo::Combine(Foo& other) { return *this; }
コンパイルエラーが再現する完全なソースを出してもらわないことにはなんとも。
あるいはコンパイラを特定するとか。
0591デフォルトの名無しさん
2009/11/15(日) 15:59:16べつにどっちでもいい
0592デフォルトの名無しさん
2009/11/15(日) 16:02:470593581
2009/11/15(日) 16:07:27元のソースでの引数の修飾子が間違っており、コンパイルすることができました。
ご迷惑おかけしました。
# ちなみにコンパイラはVC++です。
0594デフォルトの名無しさん
2009/11/15(日) 16:09:46人に相談するときは変にソースやエラーメッセージを省略しないように、今度から気をつけなよ。
0595デフォルトの名無しさん
2009/11/15(日) 16:19:23> 元のソースでの引数の修飾子が間違っており、コンパイルすることができました。
0596デフォルトの名無しさん
2009/11/15(日) 17:36:130597デフォルトの名無しさん
2009/11/15(日) 17:43:40インターフェースであるための要件について、演算子のオーバーロードの有無で何が変わるというの?
0598デフォルトの名無しさん
2009/11/15(日) 20:05:33むしろ普通にありうる事だと思うんだが。
この演算子を持っていてほしいとか
あり得る話だろ。
0599デフォルトの名無しさん
2009/11/15(日) 20:33:520600デフォルトの名無しさん
2009/11/15(日) 20:39:530601デフォルトの名無しさん
2009/11/15(日) 20:46:43boostが禁止されているところ以外では
boostがお薦め。
0602デフォルトの名無しさん
2009/11/15(日) 20:51:190603デフォルトの名無しさん
2009/11/15(日) 20:52:570604デフォルトの名無しさん
2009/11/15(日) 20:59:48そうなの?
0605デフォルトの名無しさん
2009/11/15(日) 21:05:56誰か教えてくれ
0606デフォルトの名無しさん
2009/11/15(日) 21:06:440607デフォルトの名無しさん
2009/11/15(日) 21:59:31standardとかliteとかあんの?
0608デフォルトの名無しさん
2009/11/15(日) 22:21:56それ以前に大抵のライブラリはヘッダだけで足りるだろ。
0609デフォルトの名無しさん
2009/11/15(日) 22:23:09このコードが通りません。
intを取るコンストラクタが2つになることで
ambiguousなオーバーロードとなることが
原因だろうと思い、
ttp://codepad.org/Hu73nqUr
このようにしてみました。
このようなコンストラクタをテンプレートにするというのは
問題がおこりますか?
よろしくお願い申し上げます。
0610デフォルトの名無しさん
2009/11/15(日) 22:29:07べつに。
static_cast が余計なのと explicit は要らんのかというのが気になるぐらい。
0611デフォルトの名無しさん
2009/11/15(日) 22:34:18>static_cast が余計
私もそう思ったのですが、
外すと
ttp://codepad.org/AHK1CSzr
このようにエラーになります。
本来は警告warningだと思うのですが。
> explicit
この場合、C++の教科書的な作法としては
template <typename S>Myclass(const S& arg)
Myclass(const T& arg)
の どちら|両方 に付けるべきなのでしょうか?
0612デフォルトの名無しさん
2009/11/15(日) 22:43:22じゃぁテンプレートのほうには static_cast 付けといたらいいかもね。
T がなんでもアリなら、場合によっては無駄なコードが出そうだけど。
explicit の有無はクラスデザインしだい。それだけのコードじゃ判別不能。
ただし付け忘れて事故ることのほうが多いんで、ひとつも書いてないと気になる。
0613デフォルトの名無しさん
2009/11/15(日) 22:53:34> explicit の有無
わかりました。
ありがとうございます。
0614デフォルトの名無しさん
2009/11/16(月) 04:04:46簡単に言うとコンストラクタをオーバーライドしたい。
0615デフォルトの名無しさん
2009/11/16(月) 06:14:16分岐の数がそれだけあるならしょうがないと思うよ。
分岐の数よりクラスの数のほうが多いってんなら、何やってんだって話になるし。
0616デフォルトの名無しさん
2009/11/16(月) 10:10:370617デフォルトの名無しさん
2009/11/16(月) 21:13:390618デフォルトの名無しさん
2009/11/16(月) 23:18:53ttp://codepad.org/GqFZdsol
suicideが返されてから再利用されないようにしたいのですが、これで十分でしょうか?
0619614
2009/11/16(月) 23:57:05レスありがとう。コードを書くと↓↓こんな↓↓感じなんだけど、
switch文のとこだけ長大になるのだよねえ。
マクロでもなんでもコードレベルでいいんで無くせないかと。
やっぱ無理かな。
while (1)
{
CMode* pMode;
switch (next_mode)
{
case HASEIMODE000:
pMode = new CMode_Hasei000();
break;
case HASEIMODE001:
pMode = new CMode_Hasei001();
break;
・
・
・
}
while (next_mode < 0)
{
next_mode = pMode->Main();
}
delete pMode;
}
0620デフォルトの名無しさん
2009/11/17(火) 00:38:07Boost使えばできそうだな。
0621デフォルトの名無しさん
2009/11/17(火) 01:33:36pMode *allocHasei000() {
class Hasei000: public Base {
...
};
return new Hasei000();
}
等をたくさん用意しておく。
そして、HASEIMODExxxとallocHaseixxxの対応を
HASEIMODEが密ならばテーブルで、そうでなければstd::map等で用意しておく。
(実行時の計算量はswitchと変わらなくなるはず)
実際には#defineと ##を使って
#define Elem(n) { HASEI##n, allocHasei##n, }
struct {
Elem(000),
Elem(001),
} table;
のようなものを用意する。
(疎ならば、それをmapに登録して保持)
という感じでどうだろう。
0622621
2009/11/17(火) 01:35:08まあ、意図は汲んでくれ。
0623デフォルトの名無しさん
2009/11/17(火) 01:40:12そのコードだと無限ループじゃね?
つか継承使う必要があるんだろうか
0624デフォルトの名無しさん
2009/11/17(火) 02:06:01レスどうもです。
例えばミニゲーム集100個のプログラムで、タイトル画面、エラー画面、コンフィグ画面などもあり
入力取得、描画など共通の処理と流れはCModeのMain()でやっているような、派生が凄く活きる
ケースだと思うのだけど。
電源落としたときが終了するとき、というプラットフォームの場合無限ループでよいのです。
仮想関数や消滅部分のスマートさと比較して、結局どこかにずらずらと追加した派生クラスの
newやテーブルなどを書かなければならないクラス生成時のごちゃつき加減の落差。
これをもっとスマートにできないか〜、と思ったのですが、よくよく考えると「因果」というものによって
無理そうな気がしてきました。
(TдT) アリガトウございました。
0625デフォルトの名無しさん
2009/11/17(火) 02:07:160626デフォルトの名無しさん
2009/11/17(火) 02:22:41これでだめなの?
0627デフォルトの名無しさん
2009/11/17(火) 03:38:05switch (next_mode) {
BOOST_PP_REPEAT(100,CASES,a)
}
0628デフォルトの名無しさん
2009/11/17(火) 03:41:53そういうのはスクリプトとかに自動生成させるといい。
それぞれ異なるクラスである以上、
どこかに選択用コードを書かなきゃならないのは間違いないけど、
なにも人間が書く必要はないでしょ。
0629628
2009/11/17(火) 03:41:590630デフォルトの名無しさん
2009/11/17(火) 07:02:29一旦 next_mode を経由して switch する意味がわからん。
pMode->Main() が次の pMode (あるいは pMode を生成する関数)を直接返せば
いいんじゃないか?
0631デフォルトの名無しさん
2009/11/17(火) 10:21:36delete[] a;
は実行時に止まる。
int *a=0;
delete[] a;
は止まらない。
int *a=new int[0];
delete[] a;
も止まらない。
この理由すべてを教えてください。
一番下のやつと上から2番目の奴をを実際のプログラム中で使いたいのですが
使っても安全ですか?
あと、ポインターを使って動的にn次元の配列を作る方法を教えてください。
void *を使ったら配列の添え字がつかえないのでできませんでした。
0632デフォルトの名無しさん
2009/11/17(火) 10:27:32void**
0633デフォルトの名無しさん
2009/11/17(火) 10:31:49ちょっとすみませんが意味が分かりません
delete[]の話でdeleteは関係ないんじゃ・・
void**というのも意味が分かりません。
0634デフォルトの名無しさん
2009/11/17(火) 10:32:47newされた配列の要素数が0であってもそのポインタをdelete[]に渡しても確保した領域を開放してくれる。
n次元の動的配列は任意のa次元目の要素全てがまた同じ要素数の配列を持つなら事前に全次元の大きさを得る事によって
void**ではなくobject*に配列をnewすればできる。ただしoperator []をオーバーロードした糖衣構文を作らなければならない
0635デフォルトの名無しさん
2009/11/17(火) 10:39:26void**はvoid*型ににvoid*型の &aを代入したのと一緒ですか?
要素数が0のときに領域は何が入ってますか
0636デフォルトの名無しさん
2009/11/17(火) 10:40:29ポインタ先は NULL じゃねえ、ポインタが NULL の場合だろうが
糖衣構文なんかいらねー、配列へのポインタを使うだけだ
あの程度で糖衣構文とやらが「必要」な奴は先が思いやられる
0637デフォルトの名無しさん
2009/11/17(火) 10:43:58前述のとおり、こいつは低脳
void** はでたらめだ、忘れろ
0638デフォルトの名無しさん
2009/11/17(火) 10:56:28ソースでもいいです。
0639デフォルトの名無しさん
2009/11/17(火) 11:18:39vector< vector<int> >
0640デフォルトの名無しさん
2009/11/17(火) 11:23:060641デフォルトの名無しさん
2009/11/17(火) 12:06:270642デフォルトの名無しさん
2009/11/17(火) 12:27:25長さゼロの配列はそのまま"要素が一つもない配列" として確保されます
もちろんdelete[]も可
詳しくは規格の5.3.4(expr.new)をあたってちょうだい
動的な多次元配列については素直にコンポジットパターンで作ればいいかと
0643デフォルトの名無しさん
2009/11/17(火) 12:35:460644デフォルトの名無しさん
2009/11/17(火) 12:41:05ありがとうございます。
素直にコンポジットはクラスを3つも作らないといけないのでオーバーヘッドとかが
気になって使いたくないんです。
型を動的に作れればできるとおもうんですが。そんなことC++ではできませんよね。
0645デフォルトの名無しさん
2009/11/17(火) 12:42:08■■■■■■■■ プライバシーは犯罪! 福島県いわき市・秋山隆浩さん(25)を救え! ■■■■■
ヤフオクで車両仕様や走行距離等を偽装した不正出品を指摘した善意の第三者に対して
罵詈雑言を浴びせた上に、暴力団の存在をちらつかせて脅迫するという事件が発生しました。
この事件の首謀者はいまだに検挙されていませんが、福島県いわき市四倉町梅ケ丘在住の秋山通商
秋山隆浩さんが根拠もなく犯人と決め付けられ、卒業文集やアルバムをネット上に晒される被害に遭われています。
秋山隆浩さんの潔白を証明し、いち早く騒ぎの沈静化を図るためにも真犯人の発見にご協力ください。
【プライバシーは犯罪】福島いわき市のDQN秋山通商★71【ボンクラ】 http://gimpo.2ch.net/test/read.cgi/news2/1252767131/l50
【ボンクラ】三年間の思い出のガイドライン http://society6.2ch.net
※※荒らし大歓迎です※※
いつもカキコされてイライラ… コイツは何がしたいのか?
荒らすしかない!
0646デフォルトの名無しさん
2009/11/17(火) 14:32:130647デフォルトの名無しさん
2009/11/17(火) 14:56:15struct aaa{
struct in{};
};
template<typename T, typename U>
int operator +(typename aaa<T>::in, U a){ return 0; } ←ここでテンプレート 引数を 'T' に対して減少する方法を教えてくださいませ
aaa<int>::in() + 0;
0648デフォルトの名無しさん
2009/11/17(火) 15:04:32日本語でおk
0649デフォルトの名無しさん
2009/11/17(火) 15:14:490650デフォルトの名無しさん
2009/11/17(火) 15:44:320651デフォルトの名無しさん
2009/11/17(火) 16:25:550652デフォルトの名無しさん
2009/11/17(火) 17:12:44コンストラクタ初期化子にメンバ変数への参照やポインタを渡すのも問題でしょうか?
class foobar
{
public:
foobar() : x(0), r(x), p(&x) {}
private:
int x;
int &r;
int *p;
};
0653デフォルトの名無しさん
2009/11/17(火) 17:18:30初期化が終わるまで参照されないとはっきり分かってるなら別にいいよ
0654デフォルトの名無しさん
2009/11/17(火) 20:01:54統一された方法(ジェネリックな)で追加はありませんか?
vectorならpush_back、setならinsertとか、
型ごとに分岐させて追加させるしかないの?
0655デフォルトの名無しさん
2009/11/17(火) 20:42:03STLスレ行け、と言いたいところだが…。
Effective STL読めと言っておこう。
0656デフォルトの名無しさん
2009/11/17(火) 20:45:35vectorでもinsert使えるでしょ
insertは(bitset以外の)全部のコンテナで使えるはず
0657デフォルトの名無しさん
2009/11/17(火) 20:49:44統一するメリットが無い
0658デフォルトの名無しさん
2009/11/17(火) 21:20:19int& abc()
みたいな
0659デフォルトの名無しさん
2009/11/17(火) 21:25:31class CHoge
{
int mX;
public:
int &GetX()
{
return mX;
}
{;
CHoge hoge;
hoge.GetX() = 100; // hoge.mXに代入
0660デフォルトの名無しさん
2009/11/17(火) 22:18:470661デフォルトの名無しさん
2009/11/17(火) 22:38:31テンプレート関数の明示的インスタンス生成 - akihiko’s tech note
ttp://d.hatena.ne.jp/aki-yam/20081129/1227982516
これのことを知りたいのかな?
0662デフォルトの名無しさん
2009/11/17(火) 22:44:420663デフォルトの名無しさん
2009/11/17(火) 23:52:18STLのコンテナ(具体的に言うとlist)の操作に対してUndoを実装したいと考えています。
そこで、STLのUndoに対応したライブラリなどがあるのかお聞きしたいのです。
無ければコマンドパターンなどで自前でやるしかないなと思っています。なにとぞよろしくお願い申し上げます。
0664デフォルトの名無しさん
2009/11/17(火) 23:54:52STLコンテナに対する操作はいずれも破壊的セマンティックスなので
原則として元に戻すメソッドは存在しない
自前でやらないと
0665デフォルトの名無しさん
2009/11/17(火) 23:55:19質問文をもう一度書くと
delete thisに相当する処理を行う関数で操作を安全にするためにsuicideクラスを使って
関数を抜けた後にdelete thisのタイミングをずらしているのですが、suicideクラスを返り値として
使っているので、呼び出し側でこのインスタンスの延命やメンバの参照をされないようにしたいと思っています。
そのための実装として上記のsuicideクラスの実装で十分でしょうか?
0666デフォルトの名無しさん
2009/11/17(火) 23:56:060667デフォルトの名無しさん
2009/11/18(水) 00:05:43ありがとうございます。自前でやります。
0668デフォルトの名無しさん
2009/11/18(水) 00:52:45コードがややこしいうえに、やりたいことが意味不明。
「delete this の後ろにコードを書かない」では何か不満なの?
0669デフォルトの名無しさん
2009/11/18(水) 01:32:03そう思ってたんですが、どこかの掲示板で「どうしても心配なら構造体を使って〜」と書いてあったので
使ってみたのですが、心配性過ぎますかね・・・?
関数末尾にthisメンバへのアクセスをするコードが勝手に追加なんて有り得ないとは思うんですが・・・
0670デフォルトの名無しさん
2009/11/18(水) 01:39:37「関数末尾にthisメンバへのアクセスをするコードが勝手に追加」されるのが心配だってこと?
・・・かと思ったけど、有り得ないって思ってるのね。わけわからん。以下 >>668
0671デフォルトの名無しさん
2009/11/18(水) 01:58:500672デフォルトの名無しさん
2009/11/18(水) 02:35:46有り得ない・・・とは思いましたが、もしもその関数の中で
struct X{
Piyo* p;
X(Piyo* p):p(p){}
~X(){p->メンバアクセス;}
}x(this);
とかしたら、アウトですよね?まぁ、もっと有り得ない例ではありますけどね・・・
う〜ん、じゃあ普通にdelete thisでやってみようと思います。ありがとうございました。
>>671
自分を参照している最後のスマートポインタを自らの手で破棄したらdelete thisと同じことになりますよね?
Javaのコードに自分への参照をはずさせるようなコードがあったので、それを再現したかったんです。
0673デフォルトの名無しさん
2009/11/18(水) 12:53:43そうすればいちいちnewしなくていいし、処理の切り替えも簡単だと思うんですが
0674デフォルトの名無しさん
2009/11/18(水) 13:56:18・クラスおよび派生クラス。
・構造体および関数ポインタおよび複数の関数。
・関数ポインタをメンバに持つ一つのクラスおよび複数の関数。
それぞれ特性は違う。
いずれにせよある状況でどの手法にアドバンテージがあるかは状況によって異なるので自分の思った通りにすればいい。
0675デフォルトの名無しさん
2009/11/18(水) 15:04:28struct maze { virtual void make() = 0; int map[10][10]; };
struct maze_a { void make(); };
struct maze_b { void make(); };
struct maze_c { void make(); };
maze *m = maze_fac.create(n); m->make(); ・・・
とやるぐらいなら
void make_maze_a(int (&map)[10][10]);
void make_maze_b(int (&map)[10][10]);
void make_maze_c(int (&map)[10][10]);
int m[10][10]; (*make_maze_table[n])(m); ・・・
とやったほうがいいんじゃないかな、ということだったんですが
継承をつかって処理を振り分ける方法は多くの書籍やWebページで見かけるんですが
おなじ目的で関数ポインタを扱ってるところってあまり見かけないもので
こういうことはC++ではあまりやらないのかな、と思いまして・・・
0676デフォルトの名無しさん
2009/11/18(水) 15:09:43関数は使用者が知っている
継承はobjectは知っている
0677デフォルトの名無しさん
2009/11/18(水) 15:17:26足し算、引き算、掛け算、割り算など
0678デフォルトの名無しさん
2009/11/18(水) 15:18:510679デフォルトの名無しさん
2009/11/18(水) 15:35:520680デフォルトの名無しさん
2009/11/18(水) 15:38:280681デフォルトの名無しさん
2009/11/18(水) 16:18:56std::transform()使って簡単に作れるじゃん
0682デフォルトの名無しさん
2009/11/18(水) 17:38:16禿の新しい本では見捨てられてるしな
たしか巻末に3行くらいしか書かれてなかったような…
代わりにMatrixクラスが紹介されてる
これは禿のサイトでDL可能
0683デフォルトの名無しさん
2009/11/18(水) 17:50:13関数ポインタで充分ならそれでいい。
ただもしその例で10x10でない大きさの迷路も混在させて一括で扱いたいときはどうする?
当然どちらの手法でも対応する方法はある。
しかしさらに加えて複数階層を持つ迷路を扱いたいときは・・・さらに・・・
よく設計されたクラスからの派生は既存のコードを変更せずに機能拡張ができるというメリットがある。
でもそもそも拡張はしない、あるいは必要があれば一から書き直す覚悟があるという状況なら
関数ポインタを使うのでももちろんかまわない、そこは自分の判断に従うだけ。
0684デフォルトの名無しさん
2009/11/18(水) 20:15:370685デフォルトの名無しさん
2009/11/19(木) 02:18:49派生クラスが増えすぎてファイルがカオスになってしまうな・・・
0686デフォルトの名無しさん
2009/11/19(木) 12:16:19ことがありますが、これなんでしょうか?
0687デフォルトの名無しさん
2009/11/19(木) 12:17:450688デフォルトの名無しさん
2009/11/19(木) 12:19:110689デフォルトの名無しさん
2009/11/19(木) 21:45:33たとえば、"日本語"と入れると日本??となります。
きちんと読み取れる場合もあって"教育"と入れると教育と読み取れます。
WindowsでコンパイラはMinGW、入力はUTF-8です。
どのように直せばよいでしょうか。
#include <iostream>
using namespace std;
int main() {
// 日本語を入力すると文字化けする
string japanese;
cout << "input > " << flush;
cin >> japanese;
cout << japanese << endl;
return 0;
}
0690デフォルトの名無しさん
2009/11/19(木) 23:15:21if (count & 1)の意味が分かりません。countは0から3の数字が入ります。
0か1が入るのはfalse、trueというのが分かるのですが、2&1、3&1 もtrueということなんですか?
if(count != 0)とは違うのでしょうか。
0691デフォルトの名無しさん
2009/11/19(木) 23:20:461と3の場合に真、それ以外が偽
00・・・0
01・・・1
10・・・2
11・・・3
最下位ビットが1の場合に真
0692デフォルトの名無しさん
2009/11/19(木) 23:21:320693デフォルトの名無しさん
2009/11/19(木) 23:52:45ありがとうございます。助かりました。
0694デフォルトの名無しさん
2009/11/19(木) 23:56:01環境再現してないからわからんけどwstringつかったらだめ?
0695デフォルトの名無しさん
2009/11/20(金) 00:37:13keyword = value / comment
という形が並んでおり、valueは書式によってdoubleだったりintだったり、
もしくは文字列や複素数だったりします。
File* file = new File::Open("file.xxx");
Header* header = file->GetHeader();
Keyword* keyword->GetKeyword("weight");
double weight = keyword->GetValue();
のような形式で、"weight"を取り出したいと考えています。
=== 質問 ===
Keyword::GetValueの返り値は、doubleだったりintだったりと不定です。
このような場合に、GetValueをどのように実装しておくのが常套手段でしょうか。
valueの型はfloat/double/short/long/bool/std::string/std::complex<double>のみです。
template<typename T> class Keyword;
T <typename T>Keyword::GetValue();
のようにしてしまうのもありなのですが、そうすると
header->GetKeyword("weight")->GetValue()
と書けなくなるので、敬遠しています。
0696デフォルトの名無しさん
2009/11/20(金) 00:42:25locale を設定せよ^^
そして、本当の意味でUnicodeが使いたいなら
coutではなく、APIを利用せよ。
0697デフォルトの名無しさん
2009/11/20(金) 01:31:37boost::variant とか boost::any とか、自作のクラス。
自作のクラスだと、↓こんなのかな。
class Value
{
bool AsBoolean() const;
int AsInteger() const;
std::string AsString() const;
double AsReal() const;
std::complex AsComplex() const;
// ... マジで int と short とか double と float とか区別する必要あるの?
};
header->GetKeyword("weight")->GetValue()->AsReal() って感じ。
0698695
2009/11/20(金) 01:49:05ありがとうございます。
そうすると、値自体はValueのメンバ変数でどう持たせるものですか?
boolもintも持たせておいて、castして全てのメンバ変数に詰めておく?
long/short、double/floatの区別は、
後でデータの統計処理のときに区別する必要があるのと、
ファイルへの再書き込みをするので区別しています。
0699デフォルトの名無しさん
2009/11/20(金) 01:53:23値はファイルから読み取ったままの文字列で持っといて、関数呼び出しによって
期待されてる型がわかった時点で読み取り(変換)を試みる。
失敗したら(変換できなかったら)例外投げとけばいいでしょ。
0700デフォルトの名無しさん
2009/11/20(金) 05:11:240701デフォルトの名無しさん
2009/11/20(金) 10:52:33そのインターフェースにはどんな戻り値の関数が宣言されているのかと。
0702デフォルトの名無しさん
2009/11/20(金) 11:37:15keyword->GetStringValue()
keyword->GetBooleanValue()
とかでいいんじゃない
0703デフォルトの名無しさん
2009/11/20(金) 17:33:00それって、>>695で挙げられたT <typename T>Keyword::GetValue();を定義するのと同じことのように見える。
こっちもGetValue<int>()とか書けるし。
この案の良し悪しは別として。
0704デフォルトの名無しさん
2009/11/20(金) 20:49:18引数で渡された参照に値を詰めるようにすれば
型名省略できるんじゃね?
0705デフォルトの名無しさん
2009/11/20(金) 21:13:15class Foo
{
union Val
{
short sval;
float fval;
operator short () { std::cout << "short" << std::endl; return sval; }
operator float () { std::cout << "float" << std::endl; return fval; }
};
Val val;
public:
void set(short s) { val.sval = s; }
void set(float f) { val.fval = f; }
Val get() { return val; }
};
0706デフォルトの名無しさん
2009/11/20(金) 21:14:01{
Foo foo;
short s;
float f;
foo.set((short)100);
s = foo.get();
foo.set((float)200);
f = foo.get();
std::cout << s << std::endl << f << std::endl;
return 0;
}
0707689
2009/11/21(土) 11:05:43wstringにするとcout, cin, getlineなどの関数が使えなくてコンパイルできなくなってしまうみたいです。
>>696
setlocale(LC_CTYPE, "ja_JP.UTF-8");とやってみましたが結果は変わらずでした。
開発はEclipse CDTで行っていてcin入力はEclipseのコンソール(ファイル、コンソールともにutf-8)から行っていたのですがそのせいかもしれません。コマンドプロンプト(cp932)で起動して入力すると>>689のままでもちゃんと日本語が表示されました。
0708695
2009/11/21(土) 12:19:27ありがとうございます。参考になりました。
結局、boost::anyの簡易版を実装し、
std::string m_key;
MyAny m_value;
std::string m_comment;
をメンバ変数に持つclassを作りました。
keyword->GetValue()->AsBool();
などを実装して、取り出すようにしました。
bool/float/dobule/long/std::string/std::complex<double>/std::complex<float>
と型が少ない数に限られているので、
単純にcastできない型同士はAsBoolなどを特殊化して対応。
# 他の型が来たら、std::string("")を詰めるようにKeywordのconstructorで処理。
0709デフォルトの名無しさん
2009/11/21(土) 15:07:27Windowsのシステムロケールを英語にしろ
0710デフォルトの名無しさん
2009/11/21(土) 17:26:100711デフォルトの名無しさん
2009/11/21(土) 18:44:45ポリゴンを25枚くらいしか表示できない・・・。
ポリゴンの頂点と光源の距離から頂点ごとの明暗(RGB三種類)を計算し、
さらに頂点の平均からポリゴン自体の明暗(RGB三種類)を計算・・・
というふうにやっているのですが、無理がありますでしょうか?
最終的にはこれに簡単な奥行き値を与えたり、
ポリゴンにグラデーション(フォンシェーディング?)を与えたいとも思っています。
ちなみにポリゴンの描写はDXライブラリのDRAXTRIANGLEを使っています。
↓ポリゴンの定義
struct PoliPt{
float x;
float y;
double b_r,b_g,b_b;
};
struct Poli{
PoliPt p1;
PoliPt p2;
PoliPt p3;
double b_r,b_g,b_b;
int ori_r,ori_g,ori_b;
int now_r,now_g,now_b;
};
0712デフォルトの名無しさん
2009/11/21(土) 18:50:040713デフォルトの名無しさん
2009/11/21(土) 18:55:590714デフォルトの名無しさん
2009/11/21(土) 19:01:05C++で分からない事があったらまたおいで^^
0715デフォルトの名無しさん
2009/11/21(土) 21:11:17f( char*, char*, int , char*)
一つ目の引数以外は省略可能にしたいのですが
1番目、4番目だけ入力するとかは出来ないんでしょうか。
2、3はデフォルト値を使いたい場合でも、明示的に指定しないと出来ませんか。
0716デフォルトの名無しさん
2009/11/21(土) 21:16:050717デフォルトの名無しさん
2009/11/21(土) 21:22:53return f(a1, NULL, a4, NULL);
}
0718デフォルトの名無しさん
2009/11/21(土) 21:23:21トンクス
引数は少なめにして対応したいと思います
0719デフォルトの名無しさん
2009/11/21(土) 21:25:14省略されやすいところがわかればそういう方法もありますね
トンクス
0720デフォルトの名無しさん
2009/11/21(土) 23:14:19char aa[100],bb[100],ch[]="aaaa: bbbbb";
sscanf(ch,"%s: %s",aa,bb);
cout<<aa<<endl;
cout<<bb<<endl;
0721デフォルトの名無しさん
2009/11/21(土) 23:16:540722デフォルトの名無しさん
2009/11/21(土) 23:23:080723デフォルトの名無しさん
2009/11/22(日) 08:24:51begin()〜end() までをループさせた場合、得られるイテレータは
かならずキー値昇順でソートされているという保障はあるのでしょうか?
0724デフォルトの名無しさん
2009/11/22(日) 08:38:13template metaprogrammingを使用しているのでマクロでの実現は無理です。
0725デフォルトの名無しさん
2009/11/22(日) 08:43:24デフォルトで昇順、比較関数がある場合は
関数の指定する順にソートされていることは保障されてます。
0726デフォルトの名無しさん
2009/11/22(日) 10:25:24ちなみに、同一のキーに対して複数の値を追加した場合、
hoge.insert(Pair(0, "A"));
hoge.insert(Pair(0, "B"));
hoge.insert(Pair(0, "C"));
それをイテレータで取り出したときには
必ずしも追加した順番で("A", "B", "C" の順番で)取り出されるとは限らないですよね?
0727デフォルトの名無しさん
2009/11/22(日) 10:54:43それは保障されません。
0728デフォルトの名無しさん
2009/11/22(日) 12:41:500729デフォルトの名無しさん
2009/11/22(日) 14:37:48URLに対しても操作を行えますか?
Webサイトからテキストデータ抽出したいんですが
0730デフォルトの名無しさん
2009/11/22(日) 14:53:07と同じ機能のマクロはありますか。
0731デフォルトの名無しさん
2009/11/22(日) 14:54:23つ
boost asio
ならファイルとwebが同じに扱えるらしい
0732デフォルトの名無しさん
2009/11/22(日) 18:36:120733デフォルトの名無しさん
2009/11/22(日) 18:47:390734デフォルトの名無しさん
2009/11/22(日) 19:34:06実行コードが基本的にメモリに常駐しないし、複数使うと個数分だけメモリ消費する
0735デフォルトの名無しさん
2009/11/22(日) 19:50:530736デフォルトの名無しさん
2009/11/22(日) 20:13:18string const& part = whole.substr( 0, 2 );
この const& での受け取りって不正?
string に限った話じゃないんだけど、戻り値の一時オブジェクトの寿命が分からないです。
0737デフォルトの名無しさん
2009/11/22(日) 20:22:30参照受け取りなんて初めて知った。
初めて知ったので知らんけど、消える気がするが。
0738デフォルトの名無しさん
2009/11/22(日) 20:23:57そいつは特別ルールで参照と同じ寿命になる。大丈夫。
0739デフォルトの名無しさん
2009/11/22(日) 20:25:53俺も初めて知ったw
0740デフォルトの名無しさん
2009/11/22(日) 20:30:28auto変数の参照渡しは消えるけど。
なんでこっちは駄目なのに出来るんだろう。
関数抜けるとデストラクタが動いたので間違いなし。
0741デフォルトの名無しさん
2009/11/22(日) 20:32:57特別扱いとは予想外でした。回答thx.
この特別扱いってのは、関数の戻り値に限らず、一時オブジェクトに対して
const 参照があった場合、その参照が無効になるまで寿命が延びるってことでいいのかな。
0742デフォルトの名無しさん
2009/11/22(日) 20:41:25ヒント: コピーコンストラクタ
0743デフォルトの名無しさん
2009/11/22(日) 20:47:180744デフォルトの名無しさん
2009/11/22(日) 21:37:50どのくらいが使いすぎなのかわからないです。
0745デフォルトの名無しさん
2009/11/22(日) 21:43:440746デフォルトの名無しさん
2009/11/22(日) 21:45:08所有権を共有するときに使う。
所有権を共有するわけでもないときに使うのは無駄。
shared_ptr を作るときに必要な参照カウンタのためのメモリ確保や、
コピーや破棄で必要になる参照カウンタ操作のためのロック・アンロックが
パフォーマンスのボトルネックになるようだと使いすぎ。
0747デフォルトの名無しさん
2009/11/22(日) 21:50:35だいたい循環参照のコードを書けない俺は一体w
0748デフォルトの名無しさん
2009/11/22(日) 22:09:34つweak_ptr
0749デフォルトの名無しさん
2009/11/22(日) 22:17:09std::numeric_limits<double>::epsilon()
じゃだめなの?
0750デフォルトの名無しさん
2009/11/22(日) 22:21:27weak_ptrの使い方教えてください。
0751デフォルトの名無しさん
2009/11/22(日) 22:22:470752デフォルトの名無しさん
2009/11/22(日) 22:41:09<>をオペレータで定義すればいいですか
0753デフォルトの名無しさん
2009/11/22(日) 22:44:43templateを使う
0754デフォルトの名無しさん
2009/11/22(日) 22:51:290755デフォルトの名無しさん
2009/11/22(日) 22:56:300756デフォルトの名無しさん
2009/11/22(日) 23:04:24Excel習ってたときに使ったけど、プログラミングじゃ初耳
0757デフォルトの名無しさん
2009/11/22(日) 23:10:33struct A* a;
};
void f() {
struct A a;
a.a = &a;
}
0758デフォルトの名無しさん
2009/11/22(日) 23:11:050759デフォルトの名無しさん
2009/11/22(日) 23:13:140760デフォルトの名無しさん
2009/11/22(日) 23:14:110761デフォルトの名無しさん
2009/11/22(日) 23:17:030762デフォルトの名無しさん
2009/11/22(日) 23:20:11ヘッダファイルでの using namespace std ではなくて、
using そのものを全面禁止?
0763デフォルトの名無しさん
2009/11/22(日) 23:21:54#include<map>
#include <algorithm>
bool cmp(const pair<string, int> &l, const pair<string, int> &r)
{ return l.second > r.second; }
main() {
map<string, int> y;
sort(y.begin(), y.end(), cmp);
}
0764デフォルトの名無しさん
2009/11/22(日) 23:25:34諦めようと思いました。
0765デフォルトの名無しさん
2009/11/22(日) 23:26:14自分が見た限り書いてないです。
>>762
Do not use a using-directive.とだけ書いてあるので、
全面禁止だと思うのですが。
名前空間は使っていいが、usingディレクティブはだめで、
using宣言については書かれていません。
using宣言はOKということでしょうか・・
0766デフォルトの名無しさん
2009/11/22(日) 23:33:43http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
ここ見る限り using-directive について "Forbidden -- This pollutes the namespace" とある。
続けて using-declaration について .cc ファイル内または .h ファイル内の関数内なら OK とある。
「googleのコーディング規約」って、違うの見てるのか?
0767デフォルトの名無しさん
2009/11/22(日) 23:37:39class B{
class C{
void Get(){
...
のような場合だと、C::Getを実装するのにvoid A::B::C::Get()と長くなってしまうのですが
回避する方法ってないのでしょうか?
名前空間?を使えば回避できるものなのでしょうか?
0768デフォルトの名無しさん
2009/11/22(日) 23:37:44あ、ありがとうございます。
ドキュメントの見方がわかっていませんでした・・・
展開すれば解説のってますね・・すみません。
0769デフォルトの名無しさん
2009/11/22(日) 23:41:38ネームスペースで分けた意味がなくなるよな・・・。
といつも思ってるんだけど、なんでみんなusing使うわけ?
0770デフォルトの名無しさん
2009/11/22(日) 23:41:56そのままじゃ無理。
そのクラスのネストが必要なのか、とか見直したほうがいいかもね。
0771デフォルトの名無しさん
2009/11/22(日) 23:42:380772デフォルトの名無しさん
2009/11/22(日) 23:42:48めんどくさいから
0773デフォルトの名無しさん
2009/11/22(日) 23:49:03グローバルは使ってないけど、普遍的な変数・クラス名作ってたりしてるんだが、
色々直すの面倒だから、ネームスペースで隔離しておしまいにしてたんだ。
あんまり展開されちゃうと、しらねぇぞ?ってライブラリを過去に大量に作ってる。
こういう人も居るんで、気をつけてねw
0774デフォルトの名無しさん
2009/11/22(日) 23:49:250775デフォルトの名無しさん
2009/11/22(日) 23:49:35プログラムを読むときに雑音になるから
std::vector<std::complecx<float> > v;
std::find(v.begin(), v.end(), std::complex<float>(0));
より
vector<complex<float> > v;
find(v.begin(), v.end(), complex<float>(0));
の方が自然で読みやすい
ちなみに私は using-directive は関数内で使うことがほとんど
0776デフォルトの名無しさん
2009/11/22(日) 23:55:320777デフォルトの名無しさん
2009/11/23(月) 00:00:00へえー
あんたのような人はうちの会社にはいらんわ
0778デフォルトの名無しさん
2009/11/23(月) 00:01:53ちょw
0779デフォルトの名無しさん
2009/11/23(月) 00:02:56using-declarationはなぜOK?
google的に。
0780デフォルトの名無しさん
2009/11/23(月) 00:08:23vectorもfindも自分で定義してないのにstd::を付ける方が”変”だと思う。
普通、真っ先に思い浮かぶのが標準のものだと思うから。
0781デフォルトの名無しさん
2009/11/23(月) 00:17:57house::key 、 encryption::key や
human::head 、 html::head なんかとは違って
std が理解の助けにならない
0782デフォルトの名無しさん
2009/11/23(月) 00:18:1211 -> 4 -> 3とすればいいですか。
11を消したことで前方の位置に変化は出ませんか
0783デフォルトの名無しさん
2009/11/23(月) 00:20:47は普通に使う
0784デフォルトの名無しさん
2009/11/23(月) 00:21:23using directive は後になって意図しない名前の衝突を起こす可能性がある。
using declaration にはその可能性がない。
0785デフォルトの名無しさん
2009/11/23(月) 00:21:34ヘッダに書く奴は最低だと思う
0786デフォルトの名無しさん
2009/11/23(月) 00:23:48後ろ消して前の奴の位置が変わるわけないだろ。
どうしてそんなことが心配になったの?
0787デフォルトの名無しさん
2009/11/23(月) 00:27:16ああ〜なるほど。
using declarationで統一してれば回避できますね。たぶん。
とりあえず納得。ありがとうございます。
0788デフォルトの名無しさん
2009/11/23(月) 00:37:06後ろ消して前が変わらないとは言い切れない
mapは違うけどな。多分。
0789デフォルトの名無しさん
2009/11/23(月) 00:47:58#include<iostream>
#include<map>
#include<vector>
using namespace std;
#define N (1<<18)
typedef unsigned int UIT;
UIT rnd() {
static UIT
t, x=123456789UL,y=362436069UL,z=521288629UL,w=88675123UL;
t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19)^t^(t>>8); }
int main(){
map<UIT , UIT> x;
map<UIT , UIT>::iterator p;
int n;
cout<< "data作成\n";
for(n=0;n<N;n++) x[rnd()]=rnd();
cout<< "data保存\n";
vector<UIT> y;
for(p=x.begin(); p!=x.end(); p++) y.push_back(p->first);
cout<< "mapの後方削除\n";
p=x.end(); p--;
for(n=0; n<y.size()/2; n++,p--) p=x.erase(p);
cout<< n<<" "<<x.size()<<"\n";
cout<< "比較\n";
for(p=x.begin(),n=0; p!=x.end(); p++,n++)
if(p->first!=y[n]) cout<<n<<"de err\n";
}
0790デフォルトの名無しさん
2009/11/23(月) 00:50:170791デフォルトの名無しさん
2009/11/23(月) 01:12:06map<K, V> m;
// population
map<K,V>::iterator i3 = m.begin(), i4 = m.begin(), i11 = m.begin();
advance(i3, 2);
advance(i4, 3);
advance(i11, 10);
m.erase(i3);
m.erase(i4);
m.erase(i11);
0792デフォルトの名無しさん
2009/11/23(月) 01:14:320793デフォルトの名無しさん
2009/11/23(月) 01:19:26これやると、4バイトと16バイトが出てくる。128bitも使う。
int main(){
int *p;
vector<int>::iterator q;
cout<<sizeof(p)<<" "<<sizeof(q);
}
0794デフォルトの名無しさん
2009/11/23(月) 01:36:18デバッグ用のチェック機能かなんか使ってるだろ。
release ビルドでも試してみた?
0795デフォルトの名無しさん
2009/11/23(月) 01:53:32vcだと8 bccだと16
ともにリリース版
0796デフォルトの名無しさん
2009/11/23(月) 02:09:39VC++ のそれはセキュリティ重視ってことみたい。
http://msdn.microsoft.com/ja-jp/library/aa985965.aspx
#define _SECURE_SCL 0 なら 4 になるんじゃないかな?
0797デフォルトの名無しさん
2009/11/23(月) 11:11:26そんなことできたのか。
0798デフォルトの名無しさん
2009/11/23(月) 13:30:21順序性も常に保たれる。
0799デフォルトの名無しさん
2009/11/23(月) 17:29:53{
const fuga &operator [] (size_t i)
{
if( i < 10 ) return f[i]; else return fuga();
}
private:
fuga f[10];
};
これって規格上でもセーフなの?
0800デフォルトの名無しさん
2009/11/23(月) 17:33:55関数が帰るタイミングでopereetaa []外にfuga()を渡すとopereeetaaaaa []のスタックが破壊されて存在しないconst referenceを返してしまうからだめ。
const referenceで受け取る事のできるテンポラリは破壊されてないスタック内のオブジェクトだけ。
0801デフォルトの名無しさん
2009/11/23(月) 17:41:41ヒドイww
0802デフォルトの名無しさん
2009/11/23(月) 17:46:240803デフォルトの名無しさん
2009/11/23(月) 17:47:41>IDE (VC++など)などの使い方の質問はその開発環境のスレに
>お願いします。
0804デフォルトの名無しさん
2009/11/23(月) 17:51:430805デフォルトの名無しさん
2009/11/23(月) 18:06:010806デフォルトの名無しさん
2009/11/23(月) 18:08:000807デフォルトの名無しさん
2009/11/23(月) 18:11:51コンストラクタをオーバーロードする以外に自動生成が行われなくなる事ってあるの?
0808デフォルトの名無しさん
2009/11/23(月) 18:12:54メンバにデフォルトコンストラクタで済まないやつがいるとき。
0809デフォルトの名無しさん
2009/11/23(月) 18:16:30いちおうメンバクラスは全部デフォルト作ったんですが・・・
0810デフォルトの名無しさん
2009/11/23(月) 18:18:57いっこずつ外して試してみれば?
0811デフォルトの名無しさん
2009/11/23(月) 18:22:05const メンバがあるとコンストラクタ定義しないといけないっぽいですねこれ
そのくせコンストラクタ初期化士でconstメンバ初期化しなくても文句は言われないという不思議
0812デフォルトの名無しさん
2009/11/23(月) 18:28:06const メンバ持ってるぐらいでデフォルトコンストラクタの自動生成が効かなくなることは
無いはずなんだけど、何か勘違いしてない?
まぁ解決したって言うならいいんだけどさ。
0813デフォルトの名無しさん
2009/11/23(月) 18:34:400814デフォルトの名無しさん
2009/11/23(月) 18:36:56その点に対する警告かもしれないとは思うが >811 の三行目なわけで
0815デフォルトの名無しさん
2009/11/24(火) 01:11:03大体、どれくらいのバイト数を持ってたら単純なメンバ変数に実装する方法じゃなくて、
pimplとか考えればいいのかな
ライブラリ作ってるから、そのクラスが実際にどれくらいコピーされるかどうかは分からない。
std::stringみたいなもので、今のアプリで基盤になるクラスを書いてる。
0816デフォルトの名無しさん
2009/11/24(火) 01:14:50pimpl とか使うのはコピーコストを問題にするよりは実装を隠蔽するという目的が先にたつ。
ライブラリ作ってるなら、デフォルトでこっちと考えても問題ない環境が多いと思う。
隠蔽によるオーバーヘッドがボトルネックとして現れるまでヘッダに private メンバ変数を
晒すようなことはおすすめしない。
0817デフォルトの名無しさん
2009/11/24(火) 01:36:08public継承するときに
struct fuga {};
struct hoge : fuga {};
みたいに略すとpublicになってくれるのがうれしい
0818デフォルトの名無しさん
2009/11/24(火) 01:59:14大体みんなどれくらいのサイズでコストを意識してるか知りたかったねん!
0819デフォルトの名無しさん
2009/11/24(火) 02:06:34コピーコストが気になるところでは利用者側でポインタや参照使えばいいんだから、
クラス作成者側の話として意識する意味がわからん。
0820デフォルトの名無しさん
2009/11/24(火) 03:20:45そのレベルの処理コストちゃんと考えてやってるんだな。
そりゃ、線形探索はヤバイから、バイナリサーチするとか
そういうオーダーに多大に影響するレベルになるとやるけど、
そんなコピーコストとか細かいレベルの事はやらんわ。
0821デフォルトの名無しさん
2009/11/24(火) 04:08:51どれが望ましいですか?
std::vector<string>
std::vector<string&>
std::vector<string*>
0822デフォルトの名無しさん
2009/11/24(火) 06:10:13全然関係ないんだけど、面白かった。
typename は何故必要か
ttp://ray.sakura.ne.jp/template/typename.html
そういう理由でこの有名な仕様になっていたのか!。
0823デフォルトの名無しさん
2009/11/24(火) 11:56:39vector3個あってもpimplにしない(唯のstructにする)こともある。
0824デフォルトの名無しさん
2009/11/24(火) 11:59:07二番目は無理。
一番目と三番目は使い道が違う。
0825デフォルトの名無しさん
2009/11/24(火) 13:04:180826デフォルトの名無しさん
2009/11/24(火) 13:06:39基底クラスで何もしなければ影響はない。
0827デフォルトの名無しさん
2009/11/24(火) 13:08:380828デフォルトの名無しさん
2009/11/24(火) 13:12:160829デフォルトの名無しさん
2009/11/24(火) 13:12:50この場合は実行時に何かすると遅くなる、って言う意味だろ
0830デフォルトの名無しさん
2009/11/24(火) 13:30:364つの仮想クラスに分割して実装したら、約15倍ぐらい遅くなったことがあったなあ
まあインライン展開されないなど、作りが悪かったんだが。
0831デフォルトの名無しさん
2009/11/24(火) 13:35:11インラインにしても遅いんですか?
私のやりたいのはiteratorを作っていてstlのiterator構造体を継承したら
遅くなるので自分で実装しようか検討中です。
0832デフォルトの名無しさん
2009/11/24(火) 13:38:00また別の関数を呼ぶとき、以下のどちらの書き方にするとか、ガイドラインありますか?
結構迷うんですけど。
CHoge::Func(int arg) {
m_arg = arg;
::SomethingToDo(m_arg); // argはあくまでもメンバ変数を初期化するためのパラメータであり、それ以上の利用をしない感じ
}
CHoge::Func(int arg) {
m_arg = arg;
::SomethingToDo(arg); // Funcが受けたargをそのまま次に渡すイメージ
}
0833デフォルトの名無しさん
2009/11/24(火) 13:45:46class A : X;
class B : X;
class C : X;
func()
{
A a; B b; C c;
std::vector< X* > v;
v.push_back(&a); v.push_back(&b); v.push_back(&c);
for_each( v.begin() -> v.end() ){ i->func(); }
}
擬似コードで書くけど、べた書きだったのを、
を純粋仮想クラスで↑みたいにしたら、
全然インライン展開されなくて、遅くなったって話。
それだけ。
0834デフォルトの名無しさん
2009/11/24(火) 13:50:10前者はm_argとSomethingToDoの間に依存関係が発生するから
パイプライン止まるんじゃねーの知らねーけど
0835デフォルトの名無しさん
2009/11/24(火) 14:00:23しかし後者はm_argとFuncをメンバに持つ意味があるのかを問われかねない。
0836デフォルトの名無しさん
2009/11/24(火) 14:11:430837デフォルトの名無しさん
2009/11/24(火) 14:16:100838デフォルトの名無しさん
2009/11/24(火) 14:18:00和書でもあればよろしい。
0839デフォルトの名無しさん
2009/11/24(火) 14:19:310840デフォルトの名無しさん
2009/11/24(火) 14:21:170841デフォルトの名無しさん
2009/11/24(火) 18:53:52union func
{
void (*Func)();
ULONG_PTR Address;
};
0842デフォルトの名無しさん
2009/11/24(火) 18:55:04これって何がどう裏技なんですか?
0843デフォルトの名無しさん
2009/11/24(火) 18:58:060844デフォルトの名無しさん
2009/11/24(火) 18:58:290845デフォルトの名無しさん
2009/11/24(火) 19:21:250846デフォルトの名無しさん
2009/11/24(火) 23:19:49どのような方法がありますか?
今は、グローバルオブジェクトをmain前に作ってそのコンストラクタで無理矢理(?)実行しています。
0847デフォルトの名無しさん
2009/11/24(火) 23:27:590848デフォルトの名無しさん
2009/11/24(火) 23:33:50それであってるよ。たとえばMFCがその方式。
gccには独自拡張がある。
0849デフォルトの名無しさん
2009/11/24(火) 23:35:440850デフォルトの名無しさん
2009/11/24(火) 23:55:000851デフォルトの名無しさん
2009/11/25(水) 00:09:110852デフォルトの名無しさん
2009/11/25(水) 01:19:360853デフォルトの名無しさん
2009/11/25(水) 01:21:10コメントで書いてる「感じ」とか「イメージ」が、動作を口で説明しようとした場合と近いほうを選べ。
0854デフォルトの名無しさん
2009/11/25(水) 01:24:22その union 自体は裏技でもなんでもない。
たぶんこうだろうという心当たりはあるけど、おおかた忘れてしまっていい話。
0855デフォルトの名無しさん
2009/11/25(水) 01:29:27ほとんどの場合、グローバル変数と同じ問題を持っている。
さらに C++ では、グローバル変数が本当に必要な場合ならシングルトンなどという
面倒な構造を持ち出さなくても簡単にグローバルな変数・関数を宣言できるので、
意義が薄い。
0856デフォルトの名無しさん
2009/11/25(水) 01:57:50グローバル変数を1個に限定しただけ
複数作れても問題がでないようなクラスなら意味無し。
0857デフォルトの名無しさん
2009/11/25(水) 03:04:51その設計ならこう書いとくべきだろ
CHoge::SetArg(int arg){
m_arg = arg;
}
CHoge::Func(){
::SomethingToDo(m_arg);
}
CHoge::Func(int arg){
SetArg(arg);
Func();
}
0858デフォルトの名無しさん
2009/11/25(水) 07:42:12これでよかったのですか、ありがとうございます
0859デフォルトの名無しさん
2009/11/25(水) 08:09:53使い処を間違っていて単にグローバル変数の代わりとして使われてしまっているところ。
大抵、将来シングルトンでなくなる可能性を考慮していない。
他のデザパタは滅多に口にしないのにシングルトンだけやたら口にしないヤツは信用しないほうがいい。
0860デフォルトの名無しさん
2009/11/25(水) 08:10:530861デフォルトの名無しさん
2009/11/25(水) 08:19:060862デフォルトの名無しさん
2009/11/25(水) 17:15:02struct Hoge { int data; };
const Hoge FooFunc(int data)
{
Hoge ret;
ret.data = data;
return ret;
}
0863デフォルトの名無しさん
2009/11/25(水) 17:18:280864デフォルトの名無しさん
2009/11/25(水) 17:21:260865デフォルトの名無しさん
2009/11/25(水) 17:22:070866デフォルトの名無しさん
2009/11/25(水) 17:22:34FooFunc( x ) = n;
みたいな式を書けなくする効果があるんだったっけか。
0867デフォルトの名無しさん
2009/11/25(水) 17:23:220868デフォルトの名無しさん
2009/11/25(水) 17:24:160869デフォルトの名無しさん
2009/11/25(水) 17:59:210870デフォルトの名無しさん
2009/11/25(水) 18:21:29戻った一時オブジェクトを変更禁止にするときに使う
もちろん、一回別のconstでないオブジェクトに代入したりすれば変更できるようになる
詳しくはEffective C++に書いてある
あと、上のoperator =(T rhs) constのハナシは忘れたほうがいいと思う
0871デフォルトの名無しさん
2009/11/25(水) 18:30:48struct X { int x; };
X f(X i) { return i; }
int main()
{
X a = {1}, b = {3};
f(a) = b; // エラーにならない
}
ってことね。
0872デフォルトの名無しさん
2009/11/25(水) 18:38:52これって
X a = {1}, b = {3};
X __TMP = f(a);
__TMP = b;
a = 1
b = 3
じゃないの?
値は変化すんの?
0873デフォルトの名無しさん
2009/11/25(水) 18:44:23したがって意図不明の式でありエラーになってくれたほうがよい。
→ 戻り値に const をつける。
0874デフォルトの名無しさん
2009/11/25(水) 19:18:310875デフォルトの名無しさん
2009/11/25(水) 20:11:36case1:classA.func();
case2:classB.func();
case3:classC.func();
}
最近cからc++へ勉強を開始しました。上のソースは、元のcでは関数ポインタになっていた所です。
しかし都合上実行されるfuncがクラスの中に入ってしまいまして
元の関数ポインタに近い形にしようと、classAやclassBのポインタを
ポインタ配列に格納して、そこから各funcを実行させようとしたのですが
どうも調べた範囲では、異なるクラスのポインタ配列は作れないらしく、仕方なくswitch文を使っています。
これをswitchを使わずにスマートに書くにはどのような方法が考えられますか?
0876デフォルトの名無しさん
2009/11/25(水) 20:19:140877デフォルトの名無しさん
2009/11/25(水) 20:30:120878デフォルトの名無しさん
2009/11/25(水) 20:36:22{
virtual void func() = 0;
};
0879デフォルトの名無しさん
2009/11/25(水) 21:20:10すみません、各クラスのfuncは完全に共通のものではなく
違ったものです。
だから、funcの機能は重複していないと思います
0880デフォルトの名無しさん
2009/11/25(水) 21:24:20共有ポインタより低いコスト、安全、削除の責任をプログラマに要求しない
こんなことってできませんかね?
0881デフォルトの名無しさん
2009/11/25(水) 21:29:41#include <iostream>
struct iface { virtual ~iface() {} virtual void mfunc() = 0; };
struct impl1 : public iface { void mfunc() { std::cout << "hello" << std::endl; } };
struct impl2 : public iface { void mfunc() { std::cout << "world" << std::endl; } };
int main(void)
{
iface *p[2];
p[0] = new impl1;
p[1] = new impl2;
p[0]->mfunc();
p[1]->mfunc();
delete p[0];
delete p[1];
return 0;
}
0882デフォルトの名無しさん
2009/11/25(水) 21:31:30インターフェイスは同じなんじゃないの?
0883デフォルトの名無しさん
2009/11/25(水) 21:46:53返り値と引数は全部同じです
>>881
ちょっと勉強しながら解読しますね
ありがとうございます
0884デフォルトの名無しさん
2009/11/25(水) 21:48:42わざわざ仮想デストラクタをつける優しさに泣いた
0885デフォルトの名無しさん
2009/11/25(水) 22:23:00直接求められてる答えにはならないけど
boost::ptr_list
0886デフォルトの名無しさん
2009/11/25(水) 23:55:370887デフォルトの名無しさん
2009/11/26(木) 19:16:55Baseはすべてのクラスの基底にしたいのですが、
そのBaseのメンバ関数の中には
Ptrを返すものもあるんですが、循環参照になってコンパイルできません。
だれか循環参照の書き方教えてください・・・
0888887
2009/11/26(木) 19:19:44ヘッダじゃなくてヘッダファイルでした。
// Base.h
#pragma once
#include "Ptr.h"
struct Base
{
virtual Ptr ToPtr();
};
// Ptr.h
#pragma once
#include "Base.h"
struct Ptr : Object
{
/* ... */
};
0889デフォルトの名無しさん
2009/11/26(木) 19:23:02ポインタとか参照とか使う。
Base.h
void ToPtr(Ptr& buf);
Base.cpp
void Base::ToPtr(Ptr& buf) {
buf = XXX;
}
0890デフォルトの名無しさん
2009/11/26(木) 19:25:10// Base.h
#pragma once
struct Ptr;
struct Base
{
virtual Ptr ToPtr();
};
0891887
2009/11/26(木) 19:25:160893デフォルトの名無しさん
2009/11/26(木) 19:33:10Base だろ?
0894デフォルトの名無しさん
2009/11/26(木) 19:33:18>>889は>>890みたいに#include "Ptr.h"を消してstruct Ptr;が必要。
0895デフォルトの名無しさん
2009/11/26(木) 19:35:15Base.cppの方で#include "Ptr.h"が必要
0896887
2009/11/26(木) 19:38:50ありがとうございます。
・・・でもPtrを値で返す関数でもエラーが起きませんでした。
Google先生には「Ptrのサイズが分からないため無理」とあったんですが、、、
Ptr ToPtr(); // エラーか?それとも実行時にクラッシュか??
0897デフォルトの名無しさん
2009/11/26(木) 19:56:050898889
2009/11/26(木) 20:00:19ちょっと勘違いしてたわ
Baseのメンバ変数にPtrが在るとサイズが分からなくてインスタンス化出来ないけど、
メンバ関数の場合はインスタンス化に関係ないから大丈夫みたいね。
0899887
2009/11/26(木) 20:07:04メンバ変数はPImplで実装するので大丈夫だと思います。
0900デフォルトの名無しさん
2009/11/26(木) 20:12:550901デフォルトの名無しさん
2009/11/26(木) 20:37:410902デフォルトの名無しさん
2009/11/26(木) 21:07:280903デフォルトの名無しさん
2009/11/26(木) 23:13:59このコードで、コンストラクタが走って標準出力に文字が表示されるはずだと思っているのですが
実際は表示されません。
何故でしょうか?
また、このコードはDigital Marsではコンパイルエラーになりますが
VC++, g++, Comeauではコンパイルが通るようです。
どちらが標準C++の挙動としては正しいのでしょうか?
0904デフォルトの名無しさん
2009/11/26(木) 23:59:26warning でまくってるけど、コンパイラできるのが正しい。
ClassX xa(ClassA());
ClassX xb(ClassB());
ClassX xd(ClassD());
はすべて関数宣言になっているため、
それでClassXのコンパイラは呼び出されない。
ちなみに、意図どおりに直すと今度は
ClassX xd(ClassD());
がエラーを起こす。
0905デフォルトの名無しさん
2009/11/27(金) 00:04:220906デフォルトの名無しさん
2009/11/27(金) 10:23:20public:
A(){}
A( const A &rhs ){puts( "cctor" );}
template < class U >
A( U &t ){puts( "template" );}
};
int main(){
A t;
A t2 = t; // template
return 0;
}
これで、template引数を取るコンストラクタじゃなくて、コピーコンストラクタを呼ばせたいんですけど、
どうすりゃいいですか?
0907デフォルトの名無しさん
2009/11/27(金) 11:43:45templateの方にexplicitを付ける
0908デフォルトの名無しさん
2009/11/27(金) 12:10:08これ、 template 無しでオーバーロード解決できるのになんで template のほうが優先されてんの?
template が考慮されてるのは通常のオーバーロード解決が失敗したあとじゃなかったっけ?
0909デフォルトの名無しさん
2009/11/27(金) 13:04:280910デフォルトの名無しさん
2009/11/27(金) 13:54:01いいえ。オーバーロード解決はtemplateが実体化した後で行われる。
0911デフォルトの名無しさん
2009/11/27(金) 17:01:45と思ったがこれ特殊化できないのね・・・
0912デフォルトの名無しさん
2009/11/27(金) 17:19:26public:
A(){}
A( const A &rhs ){puts( "cctor" );}
A( A &t ){puts( "template" );}
};
テンプレート引数が解決されて↑こうなるってこと?
じゃあ、const A&とA&どっちが優先されるかの問題になるのか?
0913903
2009/11/27(金) 20:26:22ありがとうございました。
おかげさまで
ttp://codepad.org/mBQsqBcJ
このように解決しました。
ところで、
ClassX xb(ClassB());
はどんな関数のプロトタイプ宣言だと認識されるのでしょうか?
例えば
ClassX xb(ClassB);
でしたら
「ClassB型のオブジェクトをコピーで受け取り、ClassX型のオブジェクトを返す関数」
ですよね?
0914デフォルトの名無しさん
2009/11/27(金) 21:10:55ClassB(*)()を引数にとる、解釈されるのでは。
0915デフォルトの名無しさん
2009/11/27(金) 21:21:270916デフォルトの名無しさん
2009/11/27(金) 21:30:210917デフォルトの名無しさん
2009/11/27(金) 21:35:51詳しい説明はEffective STLを読んでもらうとして、
>>915が書いているとおり、C++のルールでは、
関数宣言と解釈できるものは優先的に関数宣言とみなすことになっている。
で、たとえばint f( int n )のような関数宣言があるとして…
関数「宣言」では、パラメータの変数名は省略できるから
int f( int ) って書けるよね?
それとは別に、宣言子(デクレアレータ)は () でくくっても意味が変わらない
というルールがあるので、
関数宣言の()内(パラメータデクレアレーションリスト内)の
宣言子にも()をつけることができ、つまり、
int f( int (n) )とも書ける。
これに対して「パラメータの変数名は省略できる」というルールを適用して、
int f( int() )とも書けてしまうのだ。よって、
ClassX xb(ClassB());
はClassXを返却値とし、ClassB型のオブジェクトを引数とする関数xbの宣言とみなされる。
ちなみに、識別子(スペシファイア)には()をつけられないので
ClassX xb( (ClassB()) );
と書けば、意図どおり、ClassX型のオブジェクトxbの定義となる。
0918デフォルトの名無しさん
2009/11/27(金) 21:38:59宣言子→定義子(デクレアレータ)
識別子→指定子(スペシファイア)
でした。w
いずれにせよ、詳細はEffective STLで^^
0919デフォルトの名無しさん
2009/11/27(金) 21:47:260920デフォルトの名無しさん
2009/11/27(金) 21:54:44buff=(char *)malloc(1024*sizeof(char));
となっている時に
scanf("%s",buff);
と
fgets(buff,1024,stdin);
はどう違うのでしょうか?(苦笑)
0921デフォルトの名無しさん
2009/11/27(金) 21:55:13スペシファイア → supesifaia
パラメータデクレアレーションリスト → parame-ta-dekureare-syonnonmanko
0922デフォルトの名無しさん
2009/11/27(金) 22:15:41完っっっっっっっ全にCの話だね
0923デフォルトの名無しさん
2009/11/27(金) 22:22:00「・・・はどう違うのでしょうか?ククク」って感じ?
うわーむかつくわ。>>920最低やね。
0924デフォルトの名無しさん
2009/11/27(金) 22:24:180925デフォルトの名無しさん
2009/11/27(金) 22:43:51>>917-918
ありがとうございます。
> ClassX xb(ClassB());
> はClassXを返却値とし、ClassB型のオブジェクトを引数とする
> 関数xbの宣言とみなされる。
しかし
ttp://codepad.org/gHZsSbtK
これではコンパイルエラーになるようです。
http://codepad.org/YR7Xa7f8
これならコンパイルが通ります。
(Comeau C++と手元のg++で確認しました。
codepadではwarningが出ていますが
気にしないでください。)
> ClassB(*)()を引数にとる、解釈されるのでは。
そのようです。
みなさまありがとうございました。
0926デフォルトの名無しさん
2009/11/27(金) 22:46:30std::vector<boost::shared_ptr<char>> strs;
// ここでstrをstrsに代入したい
????
上記の????のところはどのように書けばよいでしょうか?
strs.push_back( str )と書いたらコンパイラに怒られました。
既存の生ポインタをboostのshared_ptrに移すにはどのように書くのでしょうか?
0927デフォルトの名無しさん
2009/11/27(金) 22:48:100928デフォルトの名無しさん
2009/11/27(金) 22:53:42この
ClassX xd=d;
のときに呼び出されるコンストラクタは、
テンプレート版なのですね。
ttp://codepad.org/CLfixUEw
このようにコンストラクタテンプレートが定義されていない場合は
ClassDからClassBへの暗黙の型変換が行われているようで、
その基準が今ひとつわかりません。
引数がきっちり一致しない場合は
暗黙の型変換を用いるより
テンプレートの実体化を行い
それで解決する
と言うことでしょうか?
0929デフォルトの名無しさん
2009/11/27(金) 22:56:46なぜ
vector<char>
ではダメなの?
0930デフォルトの名無しさん
2009/11/27(金) 22:58:10たかが1バイトにどんだけオーバーヘッドかける気だよ
0931デフォルトの名無しさん
2009/11/27(金) 22:59:26あえてやるなら
boost::shared_ptr<char> f(char x) { boost::shared_ptr<char>(new char(x)); }
transform(str, str+256, strs.begin(), f);
こんな感じ?
0932926
2009/11/27(金) 23:01:32>>929
それだと、strを一文字ずつバラして格納することになりますよね?
そうではなくて、確保したstrの先頭ポインタだけをpush_backで追加したいのです。
>>926の記述部は繰り返し呼ばれ、呼ばれる度に文字(の先頭ポインタ)を追加していくことになります。
あと、>>926では例としてnew[ 256 ]と固定値を書きましたが、実際はこの記述部がコールされる度に
変わります。
0933デフォルトの名無しさん
2009/11/27(金) 23:03:45vector<char*>
0935926
2009/11/27(金) 23:10:15それをもとに、
strs.push_back( boost::shared_ptr<char>( new char( str ) ) );
としてみましたが、
error C2440: '初期化中' : 'char *' から 'char' に変換できません。
というエラーが出ちゃいました・・・
0936デフォルトの名無しさん
2009/11/27(金) 23:11:14int f( int (*pf)() )をint f( int pf() )と書き、さらにpfを省略した形。
0937デフォルトの名無しさん
2009/11/27(金) 23:11:26vector<string> strs;
strs.push_back(str);
または
vector<boost::shared_array<char> > strs;
strs.push_back(boost::shared_array<char>(str));
0938デフォルトの名無しさん
2009/11/27(金) 23:23:34実行時には
ClassX(const ClassA& ) // テンプレートから
ClassX(const ClassB& )
ClassX(const ClassD& ) // テンプレートから
の三つのコンストラクタが存在することになる。
オーバーロードでは一番適合する関数が呼ばれることになっているので
ClassX xd=d;はClassX(const ClassD& )を呼び出す。
0939デフォルトの名無しさん
2009/11/27(金) 23:30:22クラスのメンバに他のヘッダで定義されている構造体とかクラス(例えばFILE)を使う場合は
ヘッダファイルのほうにインクルード文を書いたほうが良いのでしょうか?
0941デフォルトの名無しさん
2009/11/27(金) 23:41:59// YourClass.h
class YourClass {
ClassA func( ClassB );
ClassC *pc;
ClassD d;
};
// YourClass.cpp
ClassA YourClass::func( ClassB ) {
ClassE e;
// その他のコード
}
ClassA,ClassB,ClassCはYourClass.h内で前方宣言。
ClassDはYourClass.h内でインクルード。
ClassEはYourClass.cpp内でインクルード。
これで依存性を最小限にできるはず。
0942926
2009/11/27(金) 23:47:46boost::shared_arrayでできました!
boost::shared_array<char> str( new char[ length ] );
vector<boost::shared_array<char>> strs
strs.push_back( str );
ありがとうございました!( ^∀^)
0943デフォルトの名無しさん
2009/11/28(土) 00:55:160944デフォルトの名無しさん
2009/11/28(土) 01:10:50うん。されてる
0945デフォルトの名無しさん
2009/11/28(土) 06:24:130946デフォルトの名無しさん
2009/11/28(土) 06:54:320947デフォルトの名無しさん
2009/11/28(土) 09:42:060948デフォルトの名無しさん
2009/11/28(土) 10:42:00コードの変更無しで動くやつです。
0949デフォルトの名無しさん
2009/11/28(土) 10:45:00ということをかなり詳しく解説した本があったのですが、
名前と著者と出版社をご存知の方いますか?
0950デフォルトの名無しさん
2009/11/28(土) 10:55:53Exceptional C++ かな?
0951デフォルトの名無しさん
2009/11/28(土) 10:57:04Boost C++は?
0952948
2009/11/28(土) 11:06:250953デフォルトの名無しさん
2009/11/28(土) 11:09:330954デフォルトの名無しさん
2009/11/28(土) 11:15:42>更新が頻繁でない
って良い事じゃないんだぞ?
0955デフォルトの名無しさん
2009/11/28(土) 11:22:540956デフォルトの名無しさん
2009/11/28(土) 11:23:460957949
2009/11/28(土) 11:31:51コンパイラがどのようなコードを生成して
どのように動作するのかを
解説した本を探しています。
和書だったような気がします。
0958デフォルトの名無しさん
2009/11/28(土) 11:34:450959949
2009/11/28(土) 11:45:160960デフォルトの名無しさん
2009/11/28(土) 11:47:30そういう意味だったのか。
0961デフォルトの名無しさん
2009/11/28(土) 11:49:35{
template<typename T> MyClass(const T&)(){}
};
このようなコンストラクタは
コンストラクタテンプレート
と
テンプレートコンストラクタ
どっちで呼ぶのが正しいのでしょうか?
(C++標準規格上、です。)
0962デフォルトの名無しさん
2009/11/28(土) 11:51:240963961
2009/11/28(土) 11:52:01ISOでは
template constructor
となっていましたが、JISの規格としての用語を知りたいのです。
>>962
そうなんでしょうか?
0964デフォルトの名無しさん
2009/11/28(土) 11:56:21JISぐらい自分でダウンロードして確認しろよ
0965デフォルトの名無しさん
2009/11/28(土) 11:57:350966961
2009/11/28(土) 12:04:270967デフォルトの名無しさん
2009/11/28(土) 12:28:56例えば
MyClass(){****}
MyClass(int num)
{
std::cout << num << "\n";
****
}
の様に****が共通の場合、MyClass(int num)の中でデフォルトコンストラクタを呼びたくなります。
現行のC++では可能でしょうか?またC++0xでは可能になりますでしょうか?
0968デフォルトの名無しさん
2009/11/28(土) 12:34:19可能でありません。可能になります。
0969デフォルトの名無しさん
2009/11/28(土) 12:34:290970デフォルトの名無しさん
2009/11/28(土) 12:34:57お察しのとおり、C++0x の Delegating constructors で可能になる予定。
0971デフォルトの名無しさん
2009/11/28(土) 12:35:260xではできるようになるから実装が出てくるまで待とう
0972デフォルトの名無しさん
2009/11/28(土) 12:36:080973948
2009/11/28(土) 12:37:030975デフォルトの名無しさん
2009/11/28(土) 12:39:47こんな簡単な事も分からないからって拗ねるなよw
0976デフォルトの名無しさん
2009/11/28(土) 12:57:57{
*************
}
この*************ではi_memberの値を参照しても大丈夫でしょうか?
つまり、i_memberのnumによる初期化は最初に行われると
定められていますでしょうか?
0977デフォルトの名無しさん
2009/11/28(土) 12:59:330978デフォルトの名無しさん
2009/11/28(土) 13:03:53定められている
0979デフォルトの名無しさん
2009/11/28(土) 13:04:03soudayo
0981デフォルトの名無しさん
2009/11/28(土) 14:16:200982デフォルトの名無しさん
2009/11/28(土) 14:17:500983デフォルトの名無しさん
2009/11/28(土) 14:19:15それよか平和的でいいんじゃね?
スレタイ的にも。
0984977
2009/11/28(土) 15:46:34セマフォつかえばよかったです
0985デフォルトの名無しさん
2009/11/28(土) 15:56:590986デフォルトの名無しさん
2009/11/28(土) 16:03:510987デフォルトの名無しさん
2009/11/28(土) 16:26:560988デフォルトの名無しさん
2009/11/28(土) 16:28:20http://pc12.2ch.net/test/read.cgi/tech/1259393258/
0989デフォルトの名無しさん
2009/11/28(土) 16:31:34∧_____
_─ ̄ ̄─_E ̄/ | /⌒ヽ \
_─ ̄ _─<Eニ|. | ( ^ω^ ) | <STLつかうと一気に実行ファイルサイズが10倍NE!
─ニ三 <<Eニ| \| ( っ¶¶o) |
 ̄─_  ̄─<Eニ|  ̄ ̄ ̄ ̄ ̄ ̄|
 ̄─__─ ̄E_\______/
∨
0990デフォルトの名無しさん
2009/11/28(土) 16:33:140991デフォルトの名無しさん
2009/11/28(土) 16:33:390992デフォルトの名無しさん
2009/11/28(土) 16:34:420993デフォルトの名無しさん
2009/11/28(土) 16:35:030994デフォルトの名無しさん
2009/11/28(土) 16:35:16matz
0995デフォルトの名無しさん
2009/11/28(土) 16:41:11_/´ l |'¨| l´ ヽ
ヾ j r.! !---、 l. r}
`l l 「¨|`ヽ | ` i´
__ ! _,.⊥L⊥..」_ l |
/ 冫´ `く ̄ ヽl
_{ / (_) ,r ― 、(_) ヽ. ',
, -―-<. Y / ', ヽ._/ ,. -‐‐、
/ }1 (_) 、 ∴ ノ (_) ,ハ´ __ ヽ
イ _トヽ `ー‐ ´ ノ/'´ `ヽ l 中々趣き深いですー・・・
. l | ハ_ト`ニー_--- --- ―_,.ニ´イ ヽ
. l | {-‐1 __ヽ、,.r,三三、_ ̄_,.-'´ }ム、 ,. -ヽ
. | | / /,r'´_ ヽ r'´ ̄ヽV´,. ―-く `ヽ! / l
| | ,.イrノ/´ ヽ. }/ ニヽ. }}=l,. -- 、 } l l |
| | / Yr')i, --、 ,レ{ --- }}'`T′ `l ヽ l |
| | / rくニヽ レ' `ー‐ '′ !'´l「ヽ / ヽ. l. |
,ハl / j_イ、Y'´ 〉、l|_,.ィ'} ヽ. l |
{.i オ´} rく'^´_,}`} ヾ=ヘVノ ヽ. l |
`Y_ノ `´ `ー'´ ', l ⊥.
l__レ´r, }
0996デフォルトの名無しさん
2009/11/28(土) 16:41:280997デフォルトの名無しさん
2009/11/28(土) 17:03:08| おまえらも |
∩_∩ | .|
(´ー`) < 暇な奴ら .|
( ) | .|
| | | | だなぁ |
(___)__) \_____/
0998デフォルトの名無しさん
2009/11/28(土) 17:04:48(´ー`)
( )
| | |
(___)__)
↓
∩_∩
( ´∀`)
( )
| | |
(__)_)
↓
∧_∧
( ´∀`)
( )
| | |
(__)_)
0999デフォルトの名無しさん
2009/11/28(土) 17:08:38ttp://pc12.2ch.net/test/read.cgi/tech/1259393258/
1000デフォルトの名無しさん
2009/11/28(土) 17:09:2010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。