C++相談室 part43
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2005/08/15(月) 22:51:19ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ part41(実質42)
http://pc8.2ch.net/test/read.cgi/tech/1120190961/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002v(^・^)v
2005/08/15(月) 22:52:342 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003v(^・^)v
2005/08/15(月) 22:53:1417 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0004v(^・^)v
2005/08/15(月) 22:54:0132 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
0005v(^・^)v
2005/08/15(月) 22:54:58[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0006v(^・^)v
2005/08/15(月) 22:55:40amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0007v(^・^)v
2005/08/15(月) 23:02:58Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0008v(^・^)v
2005/08/15(月) 23:03:47[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[STL]
STLport http://www.stlport.org/
SGI-STL http://www.sgi.com/tech/stl/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://www.moderncppdesign.com/
LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0009v(^・^)v
2005/08/15(月) 23:04:44[他]
ACE http://www.cs.wustl.edu/~schmidt/
Blitz++ http://www.oonumerics.org/blitz/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
http://www.trumphurst.com/cpplibs/cpplibs.phtml
(日本語) http://www.kmonos.net/alang/cpp/lib.html
0010v(^・^)v
2005/08/15(月) 23:05:37【C++】template 統合スレ -- Part6
http://pc8.2ch.net/test/read.cgi/tech/1101384692/
C/C++の宿題を片づけます 49代目
http://pc8.2ch.net/test/read.cgi/tech/1123661447/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc8.2ch.net/test/read.cgi/tech/1095442366/
0011デフォルトの名無しさん
2005/08/15(月) 23:27:140012デフォルトの名無しさん
2005/08/15(月) 23:28:17俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0013デフォルトの名無しさん
2005/08/15(月) 23:30:000014デフォルトの名無しさん
2005/08/15(月) 23:31:55とかいうエラーが出るんだけどこれってどうすればいいの?
0015デフォルトの名無しさん
2005/08/15(月) 23:33:26後氏ね。
0016デフォルトの名無しさん
2005/08/15(月) 23:47:39嘘は言ってないな。
0017デフォルトの名無しさん
2005/08/15(月) 23:48:57言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0018>>1-10
2005/08/15(月) 23:53:07乙
後半(>>6-10)は携帯から書き込んだわけだが…スレ立ての時に限っては
もうちょっと連投規制を緩くして欲しいな。
0019デフォルトの名無しさん
2005/08/16(火) 01:27:43乙
0020デフォルトの名無しさん
2005/08/16(火) 04:27:22どうしたらよいでしょうか。
0021デフォルトの名無しさん
2005/08/16(火) 04:59:51ま た お ま え か !
0022デフォルトの名無しさん
2005/08/16(火) 07:28:03先頭から順番にチェックしていくしかない。
0023デフォルトの名無しさん
2005/08/16(火) 09:51:560024デフォルトの名無しさん
2005/08/16(火) 11:15:25普通にインデックスとればそれが文字位置。
あとwstringはワイド文字で格納されているので
あえて言うなら全部sizeof(wchar_t)バイト文字。
その文字がマルチバイト文字に変換して何バイトかっていうのなら
エンコードによるし。UTF-8で日本語なら3バイトが多いとか。
0025デフォルトの名無しさん
2005/08/16(火) 12:41:32エンコードがUTF-16だった場合。
0026デフォルトの名無しさん
2005/08/16(火) 13:00:48色々調べてみましたが結局詰まってしまったのでご助言をお願いします。
以下描画部分(メッセージ処理の一部)を書きますが、それ以外で必要な部分があれば言ってください。
case WM_CREATE:
SetLayeredWindowAttributes(hWnd, RGB(255, 0, 255), 0, LWA_COLORKEY); //紫を透明に
SetTimer(hWnd,1,100,NULL);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
ExtFloodFill(hdc, 1, 1, RGB(255, 255, 255), FLOODFILLSURFACE);
hbmp = (HBITMAP)LoadImage(hInst, "BITMAP1",IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hdc_mem = CreateCompatibleDC(hdc);
SelectObject(hdc_mem, hbmp);
StretchBlt(hdc, POSX, 0, 100, 100, hdc_mem, 0, 0, 100, 100, SRCCOPY); //POSXは変動
EndPaint(hWnd, &ps);
break;
--続く
0027デフォルトの名無しさん
2005/08/16(火) 13:01:52case WM_TIMER:
hdc = BeginPaint(hWnd, &ps);
ExtFloodFill(hdc, 1, 1, RGB(255, 255, 255), FLOODFILLSURFACE);
hbmp = (HBITMAP)LoadImage(hInst, "BITMAP1",IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hdc_mem = CreateCompatibleDC(hdc);
SelectObject(hdc_mem, hbmp);
StretchBlt(hdc, POSX, 0, 100, 100, hdc_mem, 0, 0, 100, 100, SRCCOPY); //POSXは変動
EndPaint(hWnd, &ps);
break;
紫を透明色にし、ウインドウのメニュー・枠線を消して画像だけを表示させることをしようとしています。
WM_TIMERは何度も通っているのを確認、POSXの値は変わっています。
一度WM_PAINTで描画するとどうやってもウインドウ内の位置は変わらないようです。
環境はWindowsXP VC++.NETです。
0028デフォルトの名無しさん
2005/08/16(火) 13:07:41とりあえずatとかsubstrでn文字目を取り出すことができるっぽいことは発見しました。
実は簡単なテキストエディタを作ろうと思っているのですが、
折り返し部分(ウィンドウ幅に合わせて自動で折り返したい)やカーソルの指している部分が
何バイト文字で先頭から何ドット目であるかなどを調べて、
その部分で文字列を分けたり挿入したりしたいです。
結局そういったことをするにはテキストを何型で持ってればよいのでしょうか。
あちらを立てればこちらが立たずという感じでワケがわからなくなってきました。
0029デフォルトの名無しさん
2005/08/16(火) 13:09:00スレ違い、なんだけども、誘導先のスレがわからない。
↓これでいいか?
★初心者にVisual C++を教えるスレ★ Part20
http://pc8.2ch.net/test/read.cgi/tech/1120222322/
0030デフォルトの名無しさん
2005/08/16(火) 13:12:30誘導ありがとうございます。
そちらに書いてきます。
0031デフォルトの名無しさん
2005/08/16(火) 13:16:50wstring で持ってて「こちらが立たず」という例は、どれだ?
003226-27
2005/08/16(火) 13:56:420033デフォルトの名無しさん
2005/08/16(火) 13:58:49WM_PAINTに応答するとき以外はBeginPaint, EndPaintを呼んでは駄目だ。
どうせ更新領域が空でなにも描画されてないんだろ。
003428
2005/08/16(火) 14:19:15もちろん私が知らないというだけできちんと方法はあるのかもしれませんが、
例えばマウスクリックした位置にエディタのカーソル(キャレット)を移動し、
そこに文字列を挿入したいとします。
マウスの座標を取得し「その座標の位置にある文字が何文字目であるか」が
取得できればinsertとか使えると思うのですが、
wstringの場合、文字列の先頭から1バイト文字かマルチバイト文字かを判断し
1バイトなら8ドット、2バイトなら16ドットのように足していって
座標値を割り出すことができないのでマウス座標との判定ができなそう、、、など。
あとはIMEで漢字変換したとき、WM_CHARが連続して流れてくるみたいなんですが、
WPARAMをwstringの文字列に突っ込んでもうまくいかないようで、
文字化けしたようになってきちんと表示できませんでした。
stringの場合はそのまま突っ込んでもきちんと表示できていたので、
じゃあstringを使おうかなと思ったのですが、
これだと今度はマルチバイト文字を使った時に「文字単位」で操作できないし、、、
などです。
0035デフォルトの名無しさん
2005/08/16(火) 14:26:47そんなことしなくともテキストエディタ作ってやればいいんじゃないかな?
SetDlgItemTextで貼り付けてやって、そいつを編集後、
GetDlgItemTextで取得
テキストエディタなら入門本にいくらでもある
それとも、テキストエディタじゃ駄目なのかな?
003628
2005/08/16(火) 14:31:16ゲーム作ろうと思ってるので、それほど高度なものは必要ないのですが、
Windowsのコントロールの貼り付けとかせずに自前のものを作りたいのであります。
0037デフォルトの名無しさん
2005/08/16(火) 17:59:07っていうかGetTextExtentPoint32使えばいいんじゃね?
GetCharWidth32とかも使えるんじゃね?
0038デフォルトの名無しさん
2005/08/16(火) 18:20:24配列を、ある地点から降順で検索するときの、「スマートな」書き方があれば教えて頂けないでしょうか
(ある地点が0(先頭)の場合もあります)
003938
2005/08/16(火) 18:29:21なんか上手い人ならfor文だけでできそうな気がするんです
if( a_position == 0 ) //a_position : インデックスのある地点
hoge( *array );
else
for( int i = a_position; i >= 0; --i ) hoge( array[i] );
0040デフォルトの名無しさん
2005/08/16(火) 18:42:060041デフォルトの名無しさん
2005/08/16(火) 18:43:210043デフォルトの名無しさん
2005/08/16(火) 20:09:32リバースイテレータ
0044デフォルトの名無しさん
2005/08/16(火) 20:40:57バイト数で文字幅が決まるとは限らない。
そうなるように設計されたエンコーディングと描画処理を使ってるなら別だが。
WM_CHAR はマルチバイトシーケンスが1バイトずつ送られてくるから、
チェックとバッファリングが必要
ってこのサイトに書いてあったよ。
http://www.google.co.jp/search?q=WM%5FCHAR+Multibyte
0045デフォルトの名無しさん
2005/08/16(火) 20:41:29高度なものが必要ないなら、なおさらOSやライブラリに任せるべきじゃないの?
0046デフォルトの名無しさん
2005/08/16(火) 21:16:25これって条件分岐に何の意味があるん?
004728
2005/08/16(火) 21:19:40GetTextExtentPoint32とか調べてみたのですが
描画もフォント作成もDirectXをつかうのでhdcを渡さないといけないのが何か。。。
なのでやはり先頭から順にバイトで調べる方法が使える型の方がいいのかなーとか
考えてるんですが整理できないです。
>>44
文字の大きさ指定して等幅フォントつかったとしても
バイト数だけでは判断できるとは限らないって事でしょうか?
例えば2バイト文字でも半角幅の文字がある、とか。
>>45
機能面で高度なもの(アンドゥとかコピペとか)はいらないのですが、
DirectXと標準コントロールを混在させると画面がちらついたり
するらしいし、見た目も気に入らないのでちょっと自作に拘りたいのです。
0048デフォルトの名無しさん
2005/08/16(火) 22:31:13文字を自前描画しているなら、wcharのあるコードポイントが
何ドットを占めているかは簡単に調べられるだろう。
あとは、だんだん延ばして(減らして)いって変換するだけではないのか?
004928
2005/08/16(火) 22:51:35よくわからないのですがwcharってwstringみたく半角アルファベットとかでも
マルチバイトで持ってるんじゃないんでしょうか?
簡単に調べられるというのは具体的にどうやって調べればよいでしょうか。
自前描画といっても、フォントと文字サイズを指定してconst char*を渡すと
勝手に書いてくれるDirectXの関数を使っているだけなのですが、、、
0050デフォルトの名無しさん
2005/08/16(火) 22:59:58あとはスレ違いだからあっち逝け
http://pc8.2ch.net/test/read.cgi/tech/1122031254/l50
0051デフォルトの名無しさん
2005/08/16(火) 23:12:15さんざん言われてるキーワード「エンコーディング」ぐらい調べてから出直せ。
005228
2005/08/16(火) 23:23:06自前描画してるなら〜と言われたので、
描画はただDXの関数使ってるだけだしそれがドット数調べたいのと
何の関係があるのかなーと思いつつ説明しただけでして、
あとはDirectXは標準コントロールを使えない理由として
挙げただけですからDirectXスレは全然関係ないと思うのですが。
>>51
エンコーディングって言うと文字コードの話でないでしょうか?
型の事とはまた少し別なような気がするのですが。。。
0053デフォルトの名無しさん
2005/08/16(火) 23:27:06つかって描画をしている。その(部分)文字列の長さがほしい。
なら、当然DirectXスレか、3歩譲って、Win32APIスレだろ。
0054デフォルトの名無しさん
2005/08/16(火) 23:29:02何が関係が有るのか無いのか判断できるほどオマエは賢くない。
もう一度言うが、まずはここで言われたことを自分で調べて、理解し、
それでもC++に関する質問が残っていればまた来い。
005528
2005/08/16(火) 23:31:09別に描画に何を使おうが関係ない話だと思うんですが。
0056デフォルトの名無しさん
2005/08/16(火) 23:33:380057デフォルトの名無しさん
2005/08/16(火) 23:37:38これでいいのか?
005828
2005/08/17(水) 03:49:09気に入らないなら見なきゃいいじゃないですか。
0059デフォルトの名無しさん
2005/08/17(水) 04:45:19日本語の読み取り能力とコミュニケーション能力を養え
0060デフォルトの名無しさん
2005/08/17(水) 05:48:48それどころか質問の意図すら汲み取れず
しまいにゃ意味不明な逆切れで全然関係ないスレに誘導。
0061デフォルトの名無しさん
2005/08/17(水) 08:09:30負け犬の言い訳はいつも同じだな。
0062デフォルトの名無しさん
2005/08/17(水) 08:35:01>wstringの場合、文字列の先頭から1バイト文字かマルチバイト文字かを判断し
>1バイトなら8ドット、2バイトなら16ドットのように足していって
>座標値を割り出すことができないのでマウス座標との判定ができなそう、、、など。
もちろんその方法では出来ない。
wchar_tの幅(ピクセル数)を得る標準的な方法は存在しない。
よってスレ違い。
>あとはIMEで漢字変換したとき、WM_CHARが連続して流れてくるみたいなんですが、
>WPARAMをwstringの文字列に突っ込んでもうまくいかないようで、
>文字化けしたようになってきちんと表示できませんでした。
IME、WM_CHAR、WPARAMと言っている時点で当然スレ違い。
>stringの場合はそのまま突っ込んでもきちんと表示できていたので、
>じゃあstringを使おうかなと思ったのですが、
>これだと今度はマルチバイト文字を使った時に「文字単位」で操作できないし、、、
>などです。
できないのではなく、やりにくいだけ。
マルチバイト文字をどう判別したらいいかはエンコーディングや環境に依存する。
よってスレ違い。
このようにスレ違いのオンパレードにもかかわらず、多くの人が親切にもヒントを与えてくれている。
>>28はもう少し自分で考え、分からない事を明確にした上でもう一度質問してくれ。
どうやるか迷っているのは分かるが、決めるのはあなただ。
0063デフォルトの名無しさん
2005/08/17(水) 08:37:370064デフォルトの名無しさん
2005/08/17(水) 11:54:37それは〜の話だって言われてもググりもせずに関係ないとか言って無視してるし。
0065デフォルトの名無しさん
2005/08/17(水) 12:38:53どっちにしてもatとかfindは機能しなくない?
0066デフォルトの名無しさん
2005/08/17(水) 12:51:030067デフォルトの名無しさん
2005/08/17(水) 13:00:58適していると思うデータ構造を自分で選んで使いなさいw
0068デフォルトの名無しさん
2005/08/17(水) 13:03:570069デフォルトの名無しさん
2005/08/17(水) 13:21:54いつもユニコードに変換してCStringとかBSTRで処理してるから
標準ライブラリ使ってる人はどうしてんのかと思っただけ
0070デフォルトの名無しさん
2005/08/17(水) 13:37:47UTF-8は普通UCSに戻して処理するだろ。
SJISは場合によっては16bit化してwstringにつっこむこともある。
007165
2005/08/17(水) 14:00:220072デフォルトの名無しさん
2005/08/17(水) 14:13:44007328
2005/08/17(水) 17:05:29ということだったのでとりあえずそれを使うことにしました。
あと文字幅を調べるのは教えていただいたGetTextExtentPointを使って調べる事にしました。
これはhdcを作ったりDirectXに渡すのと同じフォントを重複して作るのが
気持ち悪くてなんとなく使うのが嫌だったのですが、
これだと太文字使っても文字幅とれるみたいで予想外に便利でした。
長々とお世話様でした。
0074デフォルトの名無しさん
2005/08/17(水) 17:22:27マルチバイト文字を操作する場合、対応するイテレータ
( Readable ( Forward or Bidirectional ) Traversal Iterator)
を最初に作成しておくと楽。
特に MS系コンパイラのマルチバイト文字列を扱う関数なんかは、
1文字を int で要求することが多いので、dereference で int を返すようなモノを
作成しておくと、後々便利なことも多い。
0075デフォルトの名無しさん
2005/08/17(水) 17:25:050076デフォルトの名無しさん
2005/08/17(水) 19:14:100077デフォルトの名無しさん
2005/08/17(水) 19:37:070078デフォルトの名無しさん
2005/08/17(水) 20:11:32はやくDXスレに行って下さい。
0079デフォルトの名無しさん
2005/08/17(水) 20:14:00ならばお前もだな
0080デフォルトの名無しさん
2005/08/18(木) 00:27:14Unicodeもマルチバイトだって事を知らないの?
0081デフォルトの名無しさん
2005/08/18(木) 09:09:09Bidirectionalって可能なの?
……一文字戻るのに定数時間で終わらなくてもいいなら可能かな?
0082デフォルトの名無しさん
2005/08/18(木) 09:28:45UTF-8 なら、1文字進めるのとほぼ同コストで可能。
SHIFT_JIS なら、MSコンパイラには _mbsdec がついてくるけど、
文字列の先頭位置へのポインタを要求するので、こちらは線形時間が必要。
0083デフォルトの名無しさん
2005/08/18(木) 09:42:25thx.
0084デフォルトの名無しさん
2005/08/18(木) 10:17:40SJISでも先頭からではなく、遡るアルゴリズムならかなり改善されるけど_mbsdecはどうなんだろ。
0085デフォルトの名無しさん
2005/08/18(木) 10:43:42CRTのソースを見る限り遡ってるみたいよ。
2バイト前がマルチバイト文字1バイト目でなければ、前の文字は確実に1バイト文字なので、1バイト戻る。
以降、マルチバイト文字1バイト目でないものが奇数バイト前に見つかれば、2バイト戻る。
偶数バイト前に見つかれば、1バイト戻る。
0086デフォルトの名無しさん
2005/08/18(木) 16:04:39class House{
struct Hage{
};
class Oil{
public:
Hage* hage_generator();
};
Oil oil;
public:
void hoge(){
Hage* wonderful_hage = oil.hage_generator();
}
};
Hage* House::Oil::hage_generator(){
return new Hage;
}
クラス内クラスなんですが、これはコンパイル通りませんでして、解決には
hage_generatorをclass内で記述するか、Hageの宣言をHouseの外に出せば良いわけですが、
それ以外の方法でどうにかならないでしょうか
Houseでしか使えないHageを、出来ればHouseの外に出したくないんです
0087デフォルトの名無しさん
2005/08/18(木) 16:06:19ワロス
0088デフォルトの名無しさん
2005/08/18(木) 16:08:49House::Hage* House::Oil::hage_generator(){
^^^^^^^
0089デフォルトの名無しさん
2005/08/18(木) 16:10:09return new House::Hage;
^^^^^^^
書き忘れ。ここも。
0090デフォルトの名無しさん
2005/08/18(木) 16:12:55お付き合いありがとうございます
実はそれも試したのですが、Hageはprivateだからダメよと窘められまして
もしかしてコンパイラのせいなんですかねぇ、規格斜め読み中です
0091デフォルトの名無しさん
2005/08/18(木) 16:18:54おお、そちらはやってませんでした
やっぱり通らないのですが、恐らく>>89氏の環境では通っていると思いますので
うちのコンパイラが古いせいっぽいですね
重ねて感謝です
0092デフォルトの名無しさん
2005/08/18(木) 21:35:330093デフォルトの名無しさん
2005/08/18(木) 21:51:47friend class House;
//以降全てprivate
private:
・
・
・
>Houseでしか使えないHageを、出来ればHouseの外に出したくないんです
つりか・・・
0094デフォルトの名無しさん
2005/08/19(金) 12:50:510095デフォルトの名無しさん
2005/08/19(金) 15:20:30派生クラスのコレクション(list<Base*>型)から削除するのが問題で、どのように書いたらいいのか困っています。
// 考えてみた方法1(Baseにコレクションを持たせるのはどうか?)
class Base {
public:
virtual ~Base()=0;
virtual void F()=0;
static list<Base*> obj_;
};
class Derived : Base {
public:
void F() {
obj_.erase(find(obj_.begin(), obj_.end(), this));
}
};
009695
2005/08/19(金) 15:22:03class DoSomething {
public:
void Unregister(Base*);
void Action() {
obj_.push_back(Derived<DoSomething>(&DoSomething::Unregister));
//以下略
}
private:
list<Base*> obj_;
};
template <class Manager>
class Derived : Base {
Derived((typename Manager::*Unregister)(Base*)) : Unregister_(Unregister) {}
void F() {
(*Unregister_)(this);
}
private;
void (typename Manager::*Unregister_)(Base*);
};
どういう設計が良いのでしょうか?
0097デフォルトの名無しさん
2005/08/19(金) 15:34:270098デフォルトの名無しさん
2005/08/19(金) 15:48:210099デフォルトの名無しさん
2005/08/19(金) 16:00:59何がしたいかわからんが、Baseに任せた方がいいんじゃない?
class Base {
public:
virtual ~Base() { obj_.erase(find(obj_.begin(), obj_.end(), this)); }
virtual void F()=0;
static list<Base*> obj_;
};
class Derived : Base {
public:
void F() { delete this; }
};
010095
2005/08/19(金) 16:23:41すみません、仮想デストラクタをDerivedクラスでオーバーライドした場合でも、基底クラスのデストラクタはちゃんと呼ばれるんですか?
やりたかったことですが、
本来、list<Base*> obj_は継承階層にあるクラスとは関係ないクラスが持つもので、
継承階層にあるクラスからobj_へのアクセスが、循環依存?になるんじゃないかと設計に困りました。
010195
2005/08/19(金) 16:33:01list<Base*>::iterator it = find(obj_.begin(), obj_.end(), this);
delete *it;
obj_.erase(it);
じゃないとだめですね。
0102デフォルトの名無しさん
2005/08/19(金) 16:33:31仮想デストラクタはもちろんトップレベルまで順次呼ばれる
循環依存? まだ何を問題にしているのかわからん
010395
2005/08/19(金) 16:42:21>> 仮想デストラクタはもちろんトップレベルまで順次呼ばれる
なるほど
>> 循環依存? まだ何を問題にしているのかわからん
まず、>>95の例は、Baseがstaticでコレクションを持つことに疑問を感じます(ポリモフィズムを利用するクラスが持つべき)。
ポリモフィズムを利用するクラスがコレクションを持つことになると、>>100の最後の1行。
そこで考えたのが>>96の例です。
0104デフォルトの名無しさん
2005/08/19(金) 16:43:36うーん、そういう設計の問題って、ソースに現れるようなものだけを提示しても仕方ないと思うよ。
0105デフォルトの名無しさん
2005/08/19(金) 16:55:43格納されるオブジェクトは何なのか(なぜ派生するのか)
どういうときに削除したいのか
その辺を説明して欲しいな
0106デフォルトの名無しさん
2005/08/19(金) 16:58:58delete thisは避けて
listを持っているクラスが中のインスタンスもろとも消すのが適当だと思う
たとえばbool delete_meとかいうフラグを立てておくとか、
list経由でアクセスされる関数において削除要請を意味する値を返すとか。
0107デフォルトの名無しさん
2005/08/19(金) 17:41:39ならowner(listを持っているオブジェクト)に削除メソッドDeleteを持たせ
格納されたオブジェクトはownerへのポインタを持って、owner->Delete(this);
だろうなあ。
ただこれを呼んだ後returnするまでが危ないっていうなら、Delete()では
list_からdelete_list_に移し変えるだけにして
各オブジェクトの呼び出しが終わったらdelete_list_を一括deleteとかかね
参照カウントで同様の結果を得る方法もあるな
010895
2005/08/19(金) 20:53:19なるほど、理にかなってると思います。
>>107
Ownerクラスのあるメンバ関数内ではDerived::F()の呼び出し。
Derivedクラスのあるメンバ関数内ではOwnar::Delete()の呼び出し。
両方のクラスに、相手クラスの関数名を記述しあうことになり、気持ち悪さを感じるんですが、
その辺は、気にしなくてもいいことなんでしょうか。
「listへ格納するクラス」に削除フラグを返す関数を書いて、「listを保持・使用するクラス」から削除する事にします。
レス下さった方、ありがとうございました。
0109デフォルトの名無しさん
2005/08/19(金) 21:43:08終わったみたいだけど
>両方のクラスに、相手クラスの関数名を記述しあうことになり、気持ち悪さを感じるんですが、
直接参照するのがいやなら、インターフェイスとなる抽象クラスを間にかませば良いんじゃない?
0110デフォルトの名無しさん
2005/08/19(金) 22:23:510111デフォルトの名無しさん
2005/08/19(金) 22:39:53Microsoft VisualC++6.0にて開発しています。
ファイルの読み込みについてなんですが
fstream経由で読み込むのと完全にC流で読み込むのではC流で読み込んだ方が
早い気がするんですが常識ですか?
0112デフォルトの名無しさん
2005/08/19(金) 22:54:24ライブラリ次第。
VC6.0付属のやつはfopen系使って実装されてるので
fstreamのオーバーヘッド分遅くなる。
0113デフォルトの名無しさん
2005/08/20(土) 00:21:58HDDのアクセス速度 >> fstreamやfopenのオーバーヘッド
であるのだろうけどね。
0114デフォルトの名無しさん
2005/08/20(土) 00:36:46Aを継承したBというクラスを作ろうとして、
B.hのファイルでclass A;というプロトタイプ宣言をしたのですが、
コンパイラ エラー C2504
'class' : 定義されていない基本クラスが宣言されています。
と言われ、コンパイルできません。継承の対象クラスは実体を宣言しないとだめなのでしょうか?
0115デフォルトの名無しさん
2005/08/20(土) 00:44:20そのとおり
クラスが'定義'されていないと継承できない
0116111
2005/08/20(土) 00:45:18>>113
即レスありがとうございました
fstreamとfopen両方の関数を適時つかえるようにするといった対処をすることにします
0117114
2005/08/20(土) 00:52:03即レスありがとうございます。
ではそういう場合どのようにコーディングするのですか?
同じファイルに継承したクラスを記述するしかないのでしょうか。
0118デフォルトの名無しさん
2005/08/20(土) 00:54:14class Aなら a.hに書いて b.hでinclude "a.h"じゃろ
0119デフォルトの名無しさん
2005/08/20(土) 01:08:56たしかにその方法でできるのですが、
そうなるとmain.hのほうで宣言していた
#include "a.h"
#include "b.h"
のところで
コンパイラ エラー C2011'identifier' : 'type' 型の再定義
識別子が既に type として定義されています。このエラーは、タイプ ライブラリを同じファイルに 2 回以上インポートした場合にも発生します。
のエラーがでてしまいます。これはb.hだけインクルードすればよいのですか?
0120デフォルトの名無しさん
2005/08/20(土) 01:12:110121デフォルトの名無しさん
2005/08/20(土) 01:12:38#endif
0124デフォルトの名無しさん
2005/08/20(土) 02:28:09文法上 どうかけばいいのかわかりません。
現在
CGame
{
public:
static void Test();
};
vector< void (CGame::*)() > g_vFuncTable;
g_vFuncTable.push_back( &CGame::Test );
と コンパイルしてみたところ コンパイルエラーがでます。
代入が悪いのか、宣言が悪いのか、教えてもらってもいいでしょうか?
0125デフォルトの名無しさん
2005/08/20(土) 02:35:110126デフォルトの名無しさん
2005/08/20(土) 02:45:15メンバ関数の型は static かどうかで変わる。
その例だと、 CGame::Test の宣言が悪い( static が要らない)可能性が高いな。
0127124
2005/08/20(土) 02:46:49上記のソースコードをコンパイルしたところ
g_vFuncTable.push_back( &CGame::Test );
のところで
以下のエラーがでました。
error C2664: 'push_back' : 1 番目の引数を 'void (__cdecl *)(void)' から 'void (__thiscall CGame::*const & )(void)' に変換できません。 (新しい機能 ; ヘルプを参照)
理由: 'void (__cdecl *)(void)' から 'void (__thiscall CGame::*const )(void)' へは変換できません。
この変換が可能なコンテキストはありません。
エラー内容が理解できないので、対処ができません。
0128124
2005/08/20(土) 02:58:55CGame::Test の static 修飾子をはずしたら無事コンパイルできたのですが、
g_vFuncTable.push_back( &CGame::Test );
の次の処理
g_vFuncTable.at(0)();
の部分で
error C2064: 関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。
という コンパイルエラーがでてしまいました。
g_vFuncTable 変数を使って 代入した CGame::Test メンバ関数を呼びだしたのですが
どう書けばいいのでしょうか?
2重質問すいません
0129デフォルトの名無しさん
2005/08/20(土) 03:09:310130デフォルトの名無しさん
2005/08/20(土) 03:10:22普通の関数とクラスのメンバ関数ではポインタの型が違う。
ただの関数だとアドレスはひとつに決まるが、
クラスのメンバ関数だと
CGame dq;
CGame ff;
って二つあったとしたらどっちのTest関数やねんって感じ。
んで当然エラー。
>>128
んでC++ならあまりメンバ関数のポインタなんて使わない
そーゆーときは
interface ITest {
virtual void Test() = 0; //インタフェースの定義
};
class CGame : public ITest { //インタフェース継承して
virtual void Test(); //インタフェースの実装
};
vector<ITest*> g_InterfaceTable;
とでもする。
眠いのでもう寝るけど適当にググってHP探すか
いろいろC++の解説本でも読んでください。
0131デフォルトの名無しさん
2005/08/20(土) 03:10:460132124
2005/08/20(土) 03:30:56どうもありがとうございました。
0133デフォルトの名無しさん
2005/08/20(土) 19:14:480134デフォルトの名無しさん
2005/08/20(土) 19:46:49できる
0135デフォルトの名無しさん
2005/08/20(土) 20:13:180136デフォルトの名無しさん
2005/08/20(土) 20:19:390137デフォルトの名無しさん
2005/08/20(土) 20:30:33意味不明
ここは貴様のチラシの裏じゃない
0138デフォルトの名無しさん
2005/08/20(土) 23:42:240139デフォルトの名無しさん
2005/08/21(日) 18:18:24のように構造体が宣言されているとき、あるブロックで
using ns::X;
と using 宣言するのと
typedef ns::X X;
のように型を定義するのでは何か違いがでるでしょうか?
0140デフォルトの名無しさん
2005/08/21(日) 18:26:240141デフォルトの名無しさん
2005/08/21(日) 18:32:31理由は不明だが int X; って追加してコンパイルしてみると
using が通って typedef が通らない。
0142デフォルトの名無しさん
2005/08/21(日) 18:59:22MSVCだと、どっちでも通る。
// OK
namespace ns { struct X; }
using ns::X;
int X;
// NG
namespace ns { struct X; }
int X;
using ns::X;
だめだ。 using を使いこなす自信が無い。
0143デフォルトの名無しさん
2005/08/21(日) 19:22:320144デフォルトの名無しさん
2005/08/22(月) 00:28:52X hoge ;//<-型はどっちになるんだろう?
0145デフォルトの名無しさん
2005/08/22(月) 00:36:530146デフォルトの名無しさん
2005/08/22(月) 00:39:26ボケてた。
0147デフォルトの名無しさん
2005/08/22(月) 00:52:27int i;
A(int x) : i(x) {}
A() {}
};
struct B : public A {
B(int x) : i(x) {}
};
で、Bのi(x)でエラーが出るのはなぜですか?
Aの i がそのままBに継承されると思ったのですが・・・・
0148デフォルトの名無しさん
2005/08/22(月) 00:57:39それができるなら
B(int x) : A(0), i(x) {}
こんな場合に i の初期化が2通り存在してしまう。
0149デフォルトの名無しさん
2005/08/22(月) 01:47:0214882:2003§12.6.2.2.当たりでしょうか。
If a mem-initializer-id is ambiguous because it designates both a direct non-virtual base
class and an inherited virtual base class, the mem-initializer is ill-formed.
言われてみれば確かにそうです。Bの初期化リスト中にAのコンストラクタを
呼び出すようにするのが正しいようです。曖昧さを持たせないようにします。
ありがとうございました。
0150デフォルトの名無しさん
2005/08/22(月) 03:58:14JAVAはでっかいライブラリのページがあって
googleで使いたいメソッドの名前を予想したりして
打ってメソッドからメソッドへ(またはクラス)リンクで飛べてすぐに探せたのですが、
C++では探すのに結構苦労しています。
普段どのように探してるのか教えてください。
compilerとしてvisual studioを使ってます。
0151デフォルトの名無しさん
2005/08/22(月) 04:45:40MSDN
ってか、割れですか?
0152デフォルトの名無しさん
2005/08/22(月) 08:03:37一行目から既に意味不明
0153デフォルトの名無しさん
2005/08/22(月) 11:23:35関数の詳しい説明を、
1) ヘッダファイルの関数宣言部分に書く
2) 関数の実装部に書く
このどちらがいいんだろう?
例えばhoge()があった場合、
(hoge.h) // 1)の場合の例
/*
hogeする関数。
[param]
a : hogeのa用
*/
void hoge( int a );
(hoge.cc) // 2)の場合の例
/*
hogeする関数。
[param]
a : hogeのa用
*/
void hoge( int a )
{
hogehoge(a);
}
ライブラリと言っても、ほとんど自分専用で変更も多いので
.libファイルとかにまとめない予定。
おまいらならどうする?
0154デフォルトの名無しさん
2005/08/22(月) 12:13:36ちゃんと整備する気があるなら、利用者にソースを公開しない可能性を考えてインクルードファイルに書くのがいいのでは?
で、できればDoxygenスタイルに統一するといいかも。
あくまでも自分専用だと言うなら、使い方まで書きゃしないだろうから実装に書いた方がいいかも知れないけど。
0155デフォルトの名無しさん
2005/08/22(月) 12:47:42実装部に書いてるな。
関数の使われかた(インタフェース)に関するコメントであって、実装
に関するコメントではないと考えるのならヘッダーファイルに書くのも一理あると思う。
どのみちDoxygenでドキュメントを生成するならどちらに書いても同じかもしれない。
ここ数年Doxygenというか、javadocスタイルでコメントを書いているけど
自分だけだったらソースを直接見た方が早いのであまりドキュメントを生成していなかったりする。
というか、コーディング規約スレか?
0156デフォルトの名無しさん
2005/08/22(月) 13:09:530157デフォルトの名無しさん
2005/08/22(月) 15:47:040158デフォルトの名無しさん
2005/08/22(月) 17:43:08//
// Function: regex_replace
// -------------------------------------
// 正規表現置換を行う。
// -------------------------------------
// Parameters:
// rex - 正規表現パターン
// src - 置換対象文字列
// rep - 置換文字列
//
// Returns:
// 置換された文字を返す。
//
string regex_replace( regex const & rex, string const & src, string const & rep )
{
...
}
ソースだけ見ても分かりやすい。
0159デフォルトの名無しさん
2005/08/22(月) 18:39:33長い…
0160デフォルトの名無しさん
2005/08/22(月) 22:52:01関数やクラスの名前、はたまたプロジェクトやソフトウェアのいろいろな名前、
名前は飾りですか?
それとも、その機能(特徴)を的確に表し 短く覚えやすい名前をつけますか?
いざ名前をつけるとなると、自分の場合悩んで決めあぐねて困っています
私はこう付ける等のアドバイスやヒントを教えてください。お願いします。
0161デフォルトの名無しさん
2005/08/22(月) 22:59:431行空け読みづらいな。しかも飾りですかって煽りですか
というかスレ違い
0162153
2005/08/22(月) 23:11:50NaturalDocsよさげだな。
JavaDocでドキュメントを作ったことがあるんだが、
コメント形式が好きじゃないんでコメントからドキュメント作成は諦めてた。
ドキュメントが作れるならどっちに書いてもいいと思うんで、
なるべくヘッダを見やすくしたい俺は実装部に書くことにしました。
>> 160
名前は長くてもわかりやすいのを付けるようにしている。
といってもまだ学生で、プロジェクトに参加したことがないので
どんな形がいいのかよくわからないのですが。。。
0163デフォルトの名無しさん
2005/08/22(月) 23:25:32関数やクラスはその機能にあった名前をつける(というか、それ以外どうしろと)
ソフトの名前は、趣味で勝手に汁
0164160
2005/08/23(火) 00:24:25煽りではないです 読みづらいのはすみません。
>>162 163
二人のレスをよく呼んで気づかされたんですが、 私が悩んでいたのは
関数やクラス名ではなくて、ソフト・プロジェクト名だったようです。
機能にあったわかりやすい名前を関数・クラスに付けるのは当たり前ですね。
さて、いよいよスレ違いくさくなってきたのでこれで最後のレスにします。
>>ソフトの名前は、趣味で勝手に汁
この言葉結構参考になりました。
0165デフォルトの名無しさん
2005/08/23(火) 00:45:50おまえキモイ
0166デフォルトの名無しさん
2005/08/23(火) 00:50:130167デフォルトの名無しさん
2005/08/23(火) 01:48:41return *this;
と書けば希望通りに動作してくれるのでしょうか?
自分で試したいけど、PCぶっ壊れて試せない(;´Д`)
0168デフォルトの名無しさん
2005/08/23(火) 01:50:030169デフォルトの名無しさん
2005/08/23(火) 09:22:55operator=の戻り値の型をきちんと参照型にしておけよ?
0170デフォルトの名無しさん
2005/08/23(火) 12:19:590171デフォルトの名無しさん
2005/08/23(火) 12:52:210172デフォルトの名無しさん
2005/08/24(水) 20:54:13そういうものなの?
templateを多用されてるから?
0173デフォルトの名無しさん
2005/08/24(水) 20:59:10Firbirdのコンパイル(gcc3.3のコンパイル含む)に12時間かかった漏れに喧嘩売ってますか( ^ω^)
PHPやApacheのコンパイルも1時間以上余裕でかかるorz
つミP54C-133
0174デフォルトの名無しさん
2005/08/24(水) 21:53:250175デフォルトの名無しさん
2005/08/24(水) 23:01:54マシン余ってるならdistccを使おう
0176デフォルトの名無しさん
2005/08/24(水) 23:09:14稼働可能機がEPSON PC-286V-STDしか‥‥(;^ω^)
0177デフォルトの名無しさん
2005/08/25(木) 15:39:40サイトや書籍があったら教えて頂けないでしょうか。
172氏じゃないですが、どうもその辺が下手なせいで、コンパイル時間が長い気がしてなりません。
今のところ、ヘッダには、インラインを使う必要が無い限り、なるべく他のヘッダをincludeしないで
型宣言だけで済ます…くらいしか工夫をしていません(これ自体も良いのか悪いのか…)。
0178デフォルトの名無しさん
2005/08/25(木) 15:42:170179デフォルトの名無しさん
2005/08/25(木) 15:48:17プリコンパイルヘッダとか活用汁
0180デフォルトの名無しさん
2005/08/25(木) 15:53:08コンパイル時間を減らすことはオブジェクト指向言語として、
最大の目標といっていい。
0181デフォルトの名無しさん
2005/08/25(木) 16:03:00やってはいるのですが、どうも…マシンが非力なせいもあるのですが
>>180
なるほど、コツとか近道は無くて、結局設計の腕を上げるしか無いと言うことですか
お二人ともありがとうございます
0182デフォルトの名無しさん
2005/08/25(木) 16:34:49お前がアフォ
0183デフォルトの名無しさん
2005/08/25(木) 16:53:48( ゚ Д゚) …
0184デフォルトの名無しさん
2005/08/25(木) 17:33:17どうしてもコンパイルが遅くなる。
苦肉の策としてVCはプリコンパイル済みヘッダという仕組みで早くしているけどね。
D言語とかうらやましい。
0185デフォルトの名無しさん
2005/08/25(木) 18:07:53class bind_t
{
...
#define BIND_RETURN return
#include "bind/bind_template.hpp" // <- スクリプトでつくった実装ファイル
#undef BIND_RETURN
};
のような事が出来なくなっちゃうので モジュール読み込み形式と、
テキスト展開方式の2パターンが欲しいところ。
0186デフォルトの名無しさん
2005/08/25(木) 18:23:270187デフォルトの名無しさん
2005/08/25(木) 18:45:09設計というより、実践寄りのものとして
大規模C++ソフトウェアデザイン
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894711249/
ビルドに1週間かかるシステムとかそういうものに対して、
徹底的に依存関係を減らす方法を説明してある。
0188デフォルトの名無しさん
2005/08/25(木) 19:14:430189デフォルトの名無しさん
2005/08/26(金) 12:34:04とかやってた事のある奴挙手
0190デフォルトの名無しさん
2005/08/26(金) 14:43:56ってやると16進数での100の表示が出ますが、
この結果をchar配列に詰めたいときはどうすればいいんでしょうか。
文法的には間違ってますが、
イメージとしては
char[10] buf;
buf << hex << 100;
みたいな感じ。
0191デフォルトの名無しさん
2005/08/26(金) 14:50:40stringstream
0192デフォルトの名無しさん
2005/08/26(金) 14:56:090193デフォルトの名無しさん
2005/08/26(金) 15:03:570195デフォルトの名無しさん
2005/08/26(金) 20:07:06template <class T>
class Hoge{
typedef vector<int> Array; //新しい型の定義
static Array staticData; //定義した型の静的メンバ変数を使う
};
//cppファイルで静的メンバ変数の実体を
template<class T>
vector<int> Hoge<T>::staticData;
ならOKですが
template<class T>
Hoge<T>::Array Hoge<T>::staticData;
とやってもHoge<T>::Array型を作る事ができずエラーになってしまいます。
この場合の書式はどのようにすればいいのでしょうか?
コンパイラはVC2003です。
0196デフォルトの名無しさん
2005/08/26(金) 20:13:36template<class T>
typename Hoge<T>::Array Hoge<T>::staticData;
0197デフォルトの名無しさん
2005/08/26(金) 20:53:04なるほど、typenameですか。
どうもありがとうございました。
0198デフォルトの名無しさん
2005/08/26(金) 20:56:40class hoge {
private:
static const string name[3];
};
とあって、hoge.cc内に
const hoge::name[0] = "aho1";
const hoge::name[1] = "aho2";
const hoge::name[2] = "aho3";
とやると
error: conflicting types for `const std::string
hoge::name[1]
と怒られます。
member内のstatic constに配列は扱えないのですか?
0199198
2005/08/26(金) 21:09:18で出来ました。スレ汚しスマソ。
0200デフォルトの名無しさん
2005/08/26(金) 21:55:56メンバの宣言と定義をわけて書く場合は、下のような感じでいいんでしょうか。
(これが一般的でしょうか、という意味です。試行錯誤でコンパイルが通るようになった結果がこれです)
template <class T> class A{
public:
A(T t){ }
template <class S> void f(S s);
};
template <class T> template <class S> void A<T>::f(S s)
{
}
「template <class T>」「template <class S>」の位置はこれでいいのかな、と。
たとえば「const C&」と「C const&」が同じ意味を持つように、上の例でも
他の書き方があったりしますか?
0201デフォルトの名無しさん
2005/08/26(金) 22:56:34なぜ typename が必要かわかってるのかなあ?
>>200
template<typename T> template<typename S> void A<T>::f(S s)
って、およびでない?
0203デフォルトの名無しさん
2005/08/27(土) 19:06:21自前のclassですが、基本はC標準のread()とwrite()を使ってのやり取りです。
Win 2kのハイパーターミナルで通信するのに比べると、
FC2でreadする動作速度が遅いようです。
何かreadを高速化させる方法と言うのがあるんでしょうか?
タイミングの問題でしょうか。
0204デフォルトの名無しさん
2005/08/27(土) 20:35:52UNIXプログラミング質問すれ Part6
http://pc8.2ch.net/test/read.cgi/tech/1116908090/
0206デフォルトの名無しさん
2005/08/27(土) 23:18:31した場合、その反復子はコンテナの最後の要素を示すようになるのでしょうか?
0207デフォルトの名無しさん
2005/08/27(土) 23:21:05そのコンテナのイテレータが ForwardIterator なら、大丈夫。
標準コンテナならすべて大丈夫。
0208デフォルトの名無しさん
2005/08/28(日) 00:57:26ということは std::list のようなノード型コンテナはダミーのノードを内部に持っているのでしょうか?
もしくは反復子の内部にノードのポインタ以外の情報も持っているのでしょうか?
0209デフォルトの名無しさん
2005/08/28(日) 01:03:03std::list なら実装がヘッダファイルに書いてあるはずだから、それを見るといいよ。
0210デフォルトの名無しさん
2005/08/28(日) 01:45:130211デフォルトの名無しさん
2005/08/28(日) 01:50:52Bidirectional iteratorsの間違い?
0213デフォルトの名無しさん
2005/08/28(日) 08:08:54ttp://www.comeaucomputing.com/
0214デフォルトの名無しさん
2005/08/28(日) 16:26:51以下のようなプログラムを作り、g++でコンパイルして動作確認をしました。
//////// ここから////////
#include <iostream>
class Test {
public:
void print(char *msg) {
std::cout << msg << std::endl;
}
};
int main() {
Test t1; t1.print("First print()");
Test().print("Second print()");
(new Test)->print("Third print()");
return 0;
}
//////// ここまで ////////
質問内容は次のレスに続きます。
0215デフォルトの名無しさん
2005/08/28(日) 16:36:58続かねーよバーカ。
0216214
2005/08/28(日) 16:44:20うまく動いて当然であり、なんら疑問はありません。
main関数内3行目は、
Test *pt = new Test;
という記述が使えることと、operator newがポインタを返すことから
(new Test)が新しいTestオブジェクトへのポインタであると予想して
記述しました。結果は予想どうりうまく動きましたが、本当に
この予想はあっているのでしょうか?
一番の疑問点はmain関数内2行目で
コンストラクタは返り値が無いはずなのにTest()があたかも
オブジェクトそのものである様に働いている点です。
いったいこれはどういう理屈なのでしょうか?
本屋で立ち読みして答えを探そうとしたのですが、
キーワードが分からずどこを探せばよいのか分かりませんでした。
もしよろしければ、何か手掛かりになるものを教えてもらえないでしょうか?
0217デフォルトの名無しさん
2005/08/28(日) 17:01:05new Test については、予想も何も「新しいTestオブジェクトへのポインタ」を返すのが new の仕様。
予想はあっているが、予想して使うものではない。
あと、一般的には new で得たポインタは後で delete できるように扱うべき。
Test() は Test 型のテンポラリオブジェクト(一時オブジェクト)を作る式。
つまり Test() はオブジェクトそのものとみなせる。
0218デフォルトの名無しさん
2005/08/28(日) 17:03:56そのTest()はコンストラクタじゃなくて一時オブジェクト。
0219デフォルトの名無しさん
2005/08/28(日) 17:05:020220デフォルトの名無しさん
2005/08/28(日) 17:05:13>結果は予想どうりうまく動きましたが、本当に
>この予想はあっているのでしょうか?
合ってる。
>一番の疑問点はmain関数内2行目で
>コンストラクタは返り値が無いはずなのにTest()があたかも
>オブジェクトそのものである様に働いている点です。
>いったいこれはどういう理屈なのでしょうか?
Test()は一時オブジェクトの明示的生成。
Test().print("Second print()")
という式全体の評価が終わったあと自動的に解体される。
0221220
2005/08/28(日) 17:06:100222デフォルトの名無しさん
2005/08/28(日) 17:09:09でかいオブジェクトを一時オブジェクトで作ると、スタックいっぱい消費する?
0223デフォルトの名無しさん
2005/08/28(日) 17:13:03スタックに配置される処理系なら、そうなる
(そうでない処理系は使ったことないが)
0224214
2005/08/28(日) 18:15:46みなさん解説有難うございます。
つまり、例えば
Test t = Test();
これだと、一時オブジェクトを引数としてコピーコンストラクタが
呼ばれるということですね?
ところで、今回の「一時オブジェクト」はどの程度のレベルの本になら
書いてあるのでしょうか?中〜上級ぐらいの本でしょうか?
0225デフォルトの名無しさん
2005/08/28(日) 18:20:30プログラミング言語C++でも読んどけ。
0226デフォルトの名無しさん
2005/08/28(日) 18:32:070227デフォルトの名無しさん
2005/08/28(日) 18:35:04STL本だと結構使うから、さらっと説明される。
0229デフォルトの名無しさん
2005/08/28(日) 21:56:32感動したPDSやソースコードを紹介していただけますか?
0230デフォルトの名無しさん
2005/08/28(日) 21:57:260231デフォルトの名無しさん
2005/08/28(日) 21:57:450232デフォルトの名無しさん
2005/08/28(日) 22:23:13これ読んだ前後でC++観が変わった
0233デフォルトの名無しさん
2005/08/28(日) 23:30:11どうもありがとうございます。
コツコツみていきます。
0234デフォルトの名無しさん
2005/08/29(月) 00:42:450235デフォルトの名無しさん
2005/08/29(月) 00:45:03{
sprintf("%%%02X", (unsigned char)moji);
}
0236デフォルトの名無しさん
2005/08/29(月) 00:45:390237デフォルトの名無しさん
2005/08/29(月) 01:06:31kekkaを使ってないし、sprintfの引数おかしいし。
0238デフォルトの名無しさん
2005/08/29(月) 01:18:31{
sprintf(kekka, "%%%02X", moji);
}
0239デフォルトの名無しさん
2005/08/29(月) 01:48:030240デフォルトの名無しさん
2005/08/29(月) 03:18:430241デフォルトの名無しさん
2005/08/29(月) 12:51:330242デフォルトの名無しさん
2005/08/29(月) 13:03:03{
std::ostringstream oss;
if (moji == ' ')
oss << '+';
else
oss << '%' << hex << setw(2) << static_cast<int>(moji);
return oss.str();
}
こんなのとか(動作確認なし)
0243デフォルトの名無しさん
2005/08/29(月) 13:53:09std::string urlEncode1(const char * str)
{
std::ostringstream oss;
while (str[0] != '\0') {
if (str[0] == ' ') {
oss << '+';
} else {
oss << '%' << std::hex << std::setw(2) << static_cast<int>(str[0]);
}
++str;
}
return oss.str();
}
std::string urlEncode2(const char * str)
{
std::string rtn;
while (str[0] != '\0') {
if (str[0] == ' ') {
rtn += '+';
} else {
char tmp[4];
sprintf(tmp, "%%%02x", str[0]);
rtn += tmp;
}
++str;
}
return rtn;
}
0244デフォルトの名無しさん
2005/08/29(月) 17:42:59struct Map {
int x;
int y;
//などなど
};
Map g_Map[4096*4096]; //もっと広いかもしれない
とかいう馬鹿でかいデータの確保に挑戦して失敗した場合
例外をキャッチするのは無理なのでしょうか?
どこかの関数内で動的に確保したほうがいいのかな。
0245デフォルトの名無しさん
2005/08/29(月) 17:45:42そこは一般にヒープではないし、起動に失敗するだけで例外は飛ばないかと
0246デフォルトの名無しさん
2005/08/29(月) 18:01:240247244
2005/08/29(月) 18:27:340248デフォルトの名無しさん
2005/08/29(月) 18:40:290249デフォルトの名無しさん
2005/08/29(月) 19:09:22関数内でとるのもいいけど、あんまりでかいデータを自動変数にすると、
スタックオーバーフロー起こす可能性があるから、ヒープに領域確保しておけ。
std::vector<Map> map( 4096 * 4096 ); みたいに。
0250デフォルトの名無しさん
2005/08/29(月) 19:20:13おとなしくvectorにしておきます。
ところで馬鹿でかい領域でもvectorのメモリアドレス連続性は保障されているのでしょうか?
std::vector<Map> map( 4096 * 4096 );
memset( &map[0], 0, sizeof(Map) * map.size() );
とやっても大丈夫でしょうか?
0251デフォルトの名無しさん
2005/08/29(月) 19:23:26一応現在は保障されているが
Mapがclassでデフォルトコンストラクタが定義されているなら
vector<Map>の構築時に全要素分呼ばれるので
Mapのコンストラクタでゼロ初期化するようにしとけばいい
0252デフォルトの名無しさん
2005/08/29(月) 19:28:49Mapがゼロクリアを保証できるならいいが、そうでないならstd::fill()を使うのが無難。
0253デフォルトの名無しさん
2005/08/29(月) 19:35:46(自分または継承元が仮想関数を持つなどでRTTI情報、vTblを持つ場合、
及びそういうオブジェクトをメンバとして一つでも持つ場合)
Mapがそれに該当するならmemsetだろうとfillだろうと危険ですな
0254250
2005/08/29(月) 19:40:20とにかくセル数が多くvTblのバイト分も馬鹿にならないので
継承や仮想関数は禁止でやってますが、
おとなしくコンストラクタで0クリアしておきます。
どうもありがとうございました。
0255デフォルトの名無しさん
2005/08/29(月) 19:48:20vector<T> a(n);は、T()で一時オブジェクトを作って
それを全要素分コピーコンストラクタで塗るので
通常のコンストラクタが全要素数分呼ばれるわけではないな
0256デフォルトの名無しさん
2005/08/29(月) 19:58:420257デフォルトの名無しさん
2005/08/29(月) 20:21:18それは悪い意味でのCの慣習だ
0258デフォルトの名無しさん
2005/08/29(月) 20:52:08スレ違いですねすいません
0259デフォルトの名無しさん
2005/08/29(月) 22:23:32コンストラクタでHeapCreateしてデストラクタでHeapDestroyするAllocatorを作ってみようかなと思案している。
0260デフォルトの名無しさん
2005/08/29(月) 22:55:11うわ!
>デストラクタでHeapDestroyするAllocator
うわわわわ!!
0261デフォルトの名無しさん
2005/08/29(月) 22:56:08fill()は代入だよ。
0263デフォルトの名無しさん
2005/08/29(月) 23:07:120264デフォルトの名無しさん
2005/08/30(火) 01:10:23標準のコンテナに渡す場合、 non-static データメンバを持つ allocator は使えない。
0265デフォルトの名無しさん
2005/08/30(火) 12:29:17そうですか。
ではHeapCreate〜HeapDestroyはシングルトンにすることにします。
0266デフォルトの名無しさん
2005/08/30(火) 13:24:35class CNode {
public :
NodeArray* GetChileNode();
}
このように書くと、「1行目でCNodeが見つからないよ」とコンパイラにはじかれてしまします。
CNode内のメソッドでNodeArray型を使用したいので、CNodeの前にNodeArrayを宣言したい。
しかし、CNodeの前にはNodeArrayが宣言できない。
という状態なのですが、どのようにすればこの状態を解決できるでしょうか?
アドバイスよろしくお願いいたします。
0267デフォルトの名無しさん
2005/08/30(火) 13:27:56とだけ宣言したらどうだろう。
0268デフォルトの名無しさん
2005/08/30(火) 13:34:07ありがとうございます。
先頭行に、「class CNode;」の宣言を入れたら、コンパイルが通りました。
クラス宣言を2回以上しても大丈夫な事を知りませんでした。
勉強になりました。
0269デフォルトの名無しさん
2005/08/30(火) 13:35:43一応
クラス宣言
class Hoge;
クラス定義
class Hoge { ... };
宣言と定義は違うってことで
0270デフォルトの名無しさん
2005/08/30(火) 13:40:00なるほど。
そういう扱いになる訳ですね。
ありがとうございました。
0271デフォルトの名無しさん
2005/08/30(火) 13:42:20定義は宣言でもあるってことも忘れてはいけない。
あと、クラス宣言、クラス定義については歴史的に混乱があるようなので、
古くからC/C++を使ってきた人と話すときは明確な区別をあてにしないほうがいい。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#379
0272デフォルトの名無しさん
2005/08/30(火) 13:54:29定義は宣言を含むってのは
関数定義がプロトタイプ宣言を含むのと同じだね
0273デフォルトの名無しさん
2005/08/30(火) 14:04:51struct X {};
typedef X * Handle;
typedef const Handle HandleA;
typedef Handle const HandleB;
上記定義において、
HandleA と HandleB の型が同一であることは規格で保障されていますか?
0274デフォルトの名無しさん
2005/08/30(火) 16:24:59もちろん。
そこで並べる順番は関係ない。
0275273
2005/08/30(火) 18:35:28ありがとうございます。
const Handle が、const X * に、
Handle const が、 X * const にそれぞれ展開されるんじゃないかと
悩んでいたのですっきりしました。
0276デフォルトの名無しさん
2005/08/30(火) 21:02:21どうやっても上手くいきません。仮想関数では無理なのでしょうか。VC6使ってます。
#include <iostream>
using namespace std;
class Base
{
public:
virtual void Foo()
{
cout << "Base::Foo" << endl;
};
};
class Bar : public Base
{
public:
virtual void Foo()
{
cout << "Bar::Foo" << endl;
};
};
int main()
{
Bar *pBar = new Bar;
void (Base::*pFoo)() = pBar->Base::Foo;
(pBar->*pFoo)(); // pBar->Base::Foo()
delete pBar;
return 0;
}
0277デフォルトの名無しさん
2005/08/30(火) 21:16:20おまいは、メンバ関数ポインタの定義の仕方をちゃんと調べたのかと(r
0279デフォルトの名無しさん
2005/08/30(火) 21:37:43初期化子が変
それから、仮想関数へのポインタはvtblの先頭からのオフセット
0280デフォルトの名無しさん
2005/08/30(火) 21:40:39thisどこ?
0281デフォルトの名無しさん
2005/08/30(火) 21:51:48何が言いたい
0282276
2005/08/30(火) 21:57:57(pBar->*pBaseFoo)();
void (Bar::*pBarFoo)() = Bar::Foo;
(pBar->*pBarFoo)();
デバッガで追ってみましたがどちらも最終的にBar::Fooに。
Baseにキャストしても元がBarなんで、結局Bar::Foo
やっぱり無理なんですかねぇ...
0283デフォルトの名無しさん
2005/08/30(火) 21:58:01void (Base::*pFoo)() = &Base::Foo;じゃないとコンパイルが通らないと思うが。
そうしてメンバへのポインタを使ったところであれだ。自分で試してみろ。
0284デフォルトの名無しさん
2005/08/30(火) 21:58:59そりゃそうだ。じゃなきゃ仮想関数の意味がない。
0285デフォルトの名無しさん
2005/08/30(火) 22:00:590286276
2005/08/30(火) 22:17:32↑のように直接記述したり、virtual外せば問題ないのにな。
融通きかないみたいなんで別の方法考えます。
お騒がせしました。
0287デフォルトの名無しさん
2005/08/30(火) 22:20:10メンバへのポインタで仮想関数が適切に呼ばれないほうがよっぽど融通きいていないだろ。
0288デフォルトの名無しさん
2005/08/31(水) 01:13:460289デフォルトの名無しさん
2005/08/31(水) 01:47:500290デフォルトの名無しさん
2005/08/31(水) 02:48:020291デフォルトの名無しさん
2005/08/31(水) 10:51:070292デフォルトの名無しさん
2005/08/31(水) 11:41:14もちろん関数を越えてジャンプできるのは凄いけど。
0293デフォルトの名無しさん
2005/08/31(水) 11:42:30そのとおりだけど、それを言うとあらゆる制御構造がifとgotoのシンタックスシュガーだな。
0294デフォルトの名無しさん
2005/08/31(水) 11:48:00でも他の制御構造は一応条件を判断する要素は残ってるでしょ?
C++の例外処理機構はそういうのすら画しちゃってるから。
0295デフォルトの名無しさん
2005/08/31(水) 11:58:55言いたいことがよくわからない。
例外処理の場合はソース中には分岐の条件が明示されないけど、
実際には分岐が行われる。
0296デフォルトの名無しさん
2005/08/31(水) 12:48:16例外 or setjmp/longjmpそれ自体は分岐じゃねーだろ。アフォ?
0297デフォルトの名無しさん
2005/08/31(水) 12:50:190298デフォルトの名無しさん
2005/08/31(水) 12:53:100299デフォルトの名無しさん
2005/08/31(水) 13:21:39どのcatchに捕捉されるかの分岐があるだろ。
0300デフォルトの名無しさん
2005/08/31(水) 13:29:13更に遡るときローカル変数のデストラクタを呼んでいくのを忘れるな。
0301デフォルトの名無しさん
2005/09/01(木) 04:15:26それは例外処理とは別の話
0302デフォルトの名無しさん
2005/09/01(木) 14:30:490303デフォルトの名無しさん
2005/09/01(木) 16:44:300304デフォルトの名無しさん
2005/09/01(木) 17:01:15はあ、それをするのが例外処理の重点のひとつじゃないか
何言ってんの
0305デフォルトの名無しさん
2005/09/01(木) 17:16:25例外処理機構だけが特別になにかするわけじゃないっ話だよ
筋読め
0306デフォルトの名無しさん
2005/09/01(木) 17:17:030307デフォルトの名無しさん
2005/09/01(木) 17:38:38関数がreturnするときのスタックの調整
(大昔からの用語だと思われる)
stack unwinding (C++の定義)
tryからcatchに移るときにデストラクタが自動で呼ばれるプロセス
(標準文書で、例外が"return"中のときのいろんな制限の説明のために
用意された用語。7ヶ所出てくる)
wikiの定義で語っている多くの本が間違っていると思われる。
wikiの定義で語るならreturnの説明のときにするべきだから。
0308デフォルトの名無しさん
2005/09/01(木) 17:43:50言語の「例外処理」機能が話の主題のはずだか、
スタックの巻き戻しが無関係とかいってる奴はそこいら変を勘違いしてる
0309デフォルトの名無しさん
2005/09/01(木) 18:38:16setjmpとlongjmpのようなものだよ派
|
+- stack unwinding について触れる派
|
+- 掲示板で難しい話はしない派
catch節にgotoでジャンプするようなものだよ派
|
+- 関数を越えてジャンプできるのは凄いよ派
|
+- if や goto と全く同じだよ派
0310デフォルトの名無しさん
2005/09/01(木) 19:58:55誰もそこはごっちゃにしてないと思うが
0311デフォルトの名無しさん
2005/09/01(木) 20:13:10Cでできることばっかりじゃないか、たいしたことないね」、
と言って何も学ぼうとしない前職の上司(44歳、Cとawkしか
使えないので役に立たない)を思い出した。
0312デフォルトの名無しさん
2005/09/01(木) 20:19:33じゃあ、何で例外処理機能の話をしてるのに、「stack unwinding は関係ない」という話が出てくるんだ?
勘違いしてるとしか思えん
0313デフォルトの名無しさん
2005/09/01(木) 21:20:440314デフォルトの名無しさん
2005/09/01(木) 21:28:170315デフォルトの名無しさん
2005/09/01(木) 21:31:05http://ja.wikipedia.org/wiki/%E7%B3%96%E8%A1%A3%E6%A7%8B%E6%96%87
0316デフォルトの名無しさん
2005/09/01(木) 21:36:19setjump〜longjumpでデストラクタが呼ばれないのはどうお考えで?
0317デフォルトの名無しさん
2005/09/01(木) 21:46:58重箱の隅つついてどうでもいい話引き伸ばすなっての
0318デフォルトの名無しさん
2005/09/01(木) 22:06:56これが元の話と何の関係もないのは言うまでも無いが、どうでもいい話というのは同意
0319デフォルトの名無しさん
2005/09/01(木) 22:10:07「ほとんど同じ」ことは出来るので、シンタックスシュガーと言えるかもね。だから何>>292
となると次に興味が沸くのはなぜC++には例外が導入されたか、
どのように使い分けるのが良いか、といったところかな。
0320デフォルトの名無しさん
2005/09/02(金) 15:31:21access_violation
break_point
derived_by_zero
page_error
stack_overflow
の各種例外を定義するとき、
それぞれどの標準例外クラスから派生するのが妥当でしょうか?
stack_overflow は std::overflow_error、
derived_by_zero は logic_error かなと考えていますが。
皆さんの意見を聞かせてください。
0321デフォルトの名無しさん
2005/09/02(金) 15:40:040322デフォルトの名無しさん
2005/09/02(金) 18:37:060323デフォルトの名無しさん
2005/09/02(金) 18:59:340324320
2005/09/02(金) 19:01:57正しくは divide_by_zero です。
access_violation は runtime_error
break_point は domain_error
divide_by_zero は logic_error
page_error は runtime_error
stack_overflow は domain_error
今のところ、上記のような感じで考えてますけど、
厳密に区分けするのは面倒なので、>>322 さんの言うとおり
全部 exception から派生させるのもひとつの手かも。
0325デフォルトの名無しさん
2005/09/02(金) 19:05:31OSかエミュレータでも作ってるん?
stack_overflowはruntime_errorっぽい気はするが
0326デフォルトの名無しさん
2005/09/03(土) 13:41:11class Test
{
private:
int value_;
public;
Test()
{
//Javaだとここにthis(150)と書けば↓のコンストラクタが呼べる
}
Test(int value) : value_(value)
{
}
}
0327デフォルトの名無しさん
2005/09/03(土) 13:46:370328326
2005/09/03(土) 13:50:58ということは
Test(int a, double b, std::string c, T d, … U w) : a(a), … w(w)
{
//長ったらしいいろんな初期化処理(数十行)
}
というコンストラクタがあって
Test(int a, double b, std::string c, T d, … U w, V x)
というコンストラクタを作りたくなったら
処理は全部コピペするしかないということですね…
やっぱC++は設計が古いんだな…
0329デフォルトの名無しさん
2005/09/03(土) 13:53:17C++オブジェクトモデルでは、オブジェクトのライフタイムが
コンストラクタが完了した時点で始まると定義されている。
コンストラクタからコンストラクタが呼び出せるとすると、
オブジェクトのライフタイムが定まらない。
例えば this(150) のあと、 Test() の続きで例外がスローされた場合に
デストラクタが実行されるかどうかが定まらなくなる。
0330デフォルトの名無しさん
2005/09/03(土) 13:53:360331デフォルトの名無しさん
2005/09/03(土) 13:55:150332デフォルトの名無しさん
2005/09/03(土) 14:06:090333デフォルトの名無しさん
2005/09/03(土) 14:17:21初期化メソッド作れ
0334デフォルトの名無しさん
2005/09/03(土) 14:19:18代入と初期化の違いはわかってて言ってるのか?
0335デフォルトの名無しさん
2005/09/03(土) 14:26:04そのあたりは設計の妥協点
0336デフォルトの名無しさん
2005/09/03(土) 15:06:270337デフォルトの名無しさん
2005/09/03(土) 15:59:14それができるんだったら、そもそもメンバ初期化リストの意味がないんじゃない?
: value_(value) は value_ = value; とは違う。
初期化はそのオブジェクトの一番最初の構築を意味するわけで、
コンストラクタからコンストラクタを呼べたら二回メンバ変数を初期化する事になってしまう。
そもそもJavaでは : value_(value) とは書けないので、その例でJavaでは呼べると言っても意味がないと思うけど。
コンストラクタの持つ意味自体がC++とJavaでは少し違っているんじゃないのかなぁ。
いつメンバが初期化(最初の構築)されるのかとか。
Javaはメンバとなるオブジェクトを基本型以外は参照型で持つし、
C++ほど定数性にこだわっていないから、その辺の違いから来ているのかもね。
0338デフォルトの名無しさん
2005/09/03(土) 17:22:44そのクラスをインターフェイス・クラスと内部実装クラスに分離して、インターフェイスが内部実装を非公開継承もしくはメンバとして持つという手段もある。
インターフェイスの各コンストラクタで共通する部分を内部実装のコンストラクタに落とし込むわけだ。
0339デフォルトの名無しさん
2005/09/03(土) 19:05:590340デフォルトの名無しさん
2005/09/03(土) 19:34:190341デフォルトの名無しさん
2005/09/03(土) 20:03:540342デフォルトの名無しさん
2005/09/03(土) 20:09:01評価基準による。自分に合った評価基準で言語は選ぶものだ。
っていうか総合的って何だ。っていうか釣りだろ。
0343デフォルトの名無しさん
2005/09/03(土) 20:10:430344デフォルトの名無しさん
2005/09/03(土) 20:35:160345C初心者です
2005/09/03(土) 21:18:09NT系のOSってノートパッドに書き込める容量は制限されて無いみたいなんですけど、
Meってノートパッドに書き込みすぎるとメモリ不足って言う表示がでてしまい、それ以上書けなくなってしまいます。
そこで、Meで動作する容量の制限されないノートパッドをC言語で作ってるんですけど、イマイチ作れません。
だれか作り方教えてください。お願いします。
0346デフォルトの名無しさん
2005/09/03(土) 21:21:36ここもスレ違い。タイトルを読むってことはできないのか?
0347デフォルトの名無しさん
2005/09/03(土) 21:23:31おまいがやりたいのはCでメモ帳もどきを作ることなのか、
容量制限のないメモ帳を使いたいのかということ。
前者なら自分で勉強しろとしか言えん。つかその程度のことを調べられないのなら
根本的にプログラミングは向いていない。
Win32APIとか、Windowsプログラミングでググればいくらでも参考になるページは出てくるから。
後者なら、んなものいちいち自作しないで既存のエディタ使え。
秀丸でもEmEditorでもxyzzyでもTeraPadでも、メモ帳とは比較にならない
レベルのエディタが腐るほどあるから。
0348C初心者です
2005/09/03(土) 21:28:03そうですか。回答ありがとうございます。
ちなみに、容量制限のないメモ帳をVCなど使わないで作りたかっただけです。
0349デフォルトの名無しさん
2005/09/03(土) 22:50:18【初心者歓迎】C/C++室 Ver.21【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1125743714/
ただ、あまりにも質問が漠然としてるからそのままじゃまともなレスは期待できないだろうな。
0350デフォルトの名無しさん
2005/09/03(土) 23:43:150351デフォルトの名無しさん
2005/09/04(日) 07:55:110352デフォルトの名無しさん
2005/09/04(日) 11:27:310353デフォルトの名無しさん
2005/09/04(日) 11:29:170354デフォルトの名無しさん
2005/09/04(日) 11:57:420355C初心者です
2005/09/04(日) 12:08:12>>349
もうちょっとソース組み立ててから相談します。
>>350
BCCでコマンドプロントを使ってコンパイルしてます。
>>351
説明間違えてました、C++で作ってます。
0356デフォルトの名無しさん
2005/09/04(日) 13:17:57最近は構造体や関数もあるらしいよ
0357デフォルトの名無しさん
2005/09/04(日) 13:38:180358デフォルトの名無しさん
2005/09/04(日) 13:46:01って、昔は構造体も関数もなかったのかよ!
よくそんなもんを使おうと思う人間がいたものだ。
0359デフォルトの名無しさん
2005/09/04(日) 17:35:410360デフォルトの名無しさん
2005/09/04(日) 20:05:440361デフォルトの名無しさん
2005/09/04(日) 22:44:38環境C++6.0 windowsxp
今、ハードディスクやCDの容量を調べるプログラムを組んでいます。
GetDiskFreeSpaceExをつかって、ハードディスクの使用量と空き容量は入手できたのですが、
焼かれたCDの空き容量が0になってしまうのです。マイコンピュータのCDドライブのところから、
プロパティを開くと空き容量が表示されるのですが、プログラムでそれを入手することが出来ないのです。
基本的な質問ですが、知恵をお貸し願えませんでしょうか?
よろしくお願いします。
0362デフォルトの名無しさん
2005/09/04(日) 22:51:38http://pc8.2ch.net/test/read.cgi/tech/1122723009/nの次スレが立ってからそちらへどうぞ。
0363デフォルトの名無しさん
2005/09/04(日) 23:05:510364デフォルトの名無しさん
2005/09/05(月) 02:22:31class Map {
struct Cell {
};
friend class Cell;
int WorldWidth; //世界の大きさなどはMapクラスが管理
int WorldHeight;
Cell* pCell; //格CellへのアクセスをMapクラスが抽象化する。
};
ここでCellクラス内のメンバ関数が親のMapクラスの情報が欲しいとなれば
void Hoge(Map* pMap)
{
pMap->WorldWidth;
}
と、関数の引数にもらってthisポインタのように使う以外に何かいい方法ありますか?
MapクラスへのポインタをCellクラスのメンバ変数に持たせるのはメモリの無駄遣いだと思うし、
静的メンバ変数などにすると複数のMap、(裏の世界とか、夢の世界とか)に対応できないような気もします。
関数の引数でアクセスするのが一番素直なようにも思うんですが、
Cellのメンバ変数が再帰しまくったときにスタックに積みまくるのもなんか無駄なような気がしてます。
なんかこう書くとエレガントだとか、効率的だとかあればご教授お願いします。
0365デフォルトの名無しさん
2005/09/05(月) 03:55:05訂正
>Cellのメンバ変数が再帰しまくったときに
Cellのメンバ関数が再帰・・・
です。
0366デフォルトの名無しさん
2005/09/05(月) 04:41:06CellがMapを関知しちゃイカンだろ
CellにはMap側で計算済みの値を渡すべき
0367デフォルトの名無しさん
2005/09/05(月) 04:55:46基本的に>>366の言うとおりだし、
そもそもスタックが気になるほど再帰しまくるならデータ構造から見直すべき。
しっかりした構造なら大抵は再帰の深さなんてせいぜいlog(セルの個数)程度のオーダーだと思われ。
それを超えるなら簡単に再帰を使うべきではない。
つまり引数にすること自体は問題なし。
0368デフォルトの名無しさん
2005/09/05(月) 17:23:26stringstreamのポインタ操作が機能しません。
具体的には下記のコードでp0とp1が共に0を返し
seekpが機能しません。
結果"abcdefgh"と出力されます。
strstreamの場合正常に機能します。
なぜでしょうか?
std::stringstream stream( std::ios::out );
const std::ios::pos_type p0 = stream.tellp();
stream << "abcde";
const std::ios::pos_type p1 = stream.tellp();
stream.seekp( -3, std::ios::cur );
stream << "fgh" << std::endl;
0369320
2005/09/05(月) 18:19:26非常に遅くなりましたけど、
Win32 の構造化例外を、C++ の例外に変換する際のはなしです。
普通は華麗にスルーするところですが、どうしても捕捉しておく必要があったので。
0370デフォルトの名無しさん
2005/09/05(月) 20:48:09STLPortのバグ
VC6.0ならともかくVC7.1なら付属のほう(dinkumware)がむしろ安定してるからそっち推奨
0371デフォルトの名無しさん
2005/09/05(月) 21:42:34嘘つくなタコ。std::ios::outを指定すると、:ostream iteratorが
指定されるだろ。これはramdom access iteratorではないので、
シークができないし、現在位置も知る事ができない。
従って、tellp()をすると、std::string::nposが返る。
正しく動かすには、std::stringstream stream( std::ios::out | std::ios::in );
としないとだめ。
むしろ、このまま正しく動くような動作をするdinkumwareの方が糞だろ。
少なくとも俺の環境でVC7.1+STLport4.6.2では、上のようにフラグを指定
すれば正しく動作する。
0372デフォルトの名無しさん
2005/09/05(月) 21:44:31×std::string::npos
○std::ios::pos_type(-1)
0373370
2005/09/05(月) 22:11:07370は撤回させてくれ。371のとおり。
0375デフォルトの名無しさん
2005/09/05(月) 23:48:480376デフォルトの名無しさん
2005/09/06(火) 00:03:070377デフォルトの名無しさん
2005/09/06(火) 00:04:260378デフォルトの名無しさん
2005/09/06(火) 00:24:33今環境無いから試せないけど。VC++限定で
template< typename T > bool is_valid_pointer( T const volatile * p )
{
__try{ (void)(*p); }
__except( EXCEPTION_EXECUTE_HANDLER ) { return false; }
return true;
}
0379デフォルトの名無しさん
2005/09/06(火) 00:26:15俺ならスマートポインタを素直に使ってそんな状況そのものを発生させないが
#include<set>
template<typename T>
struct valid{
static std::set<const valid*>check;
valid(){check.insert(this);}
~valid(){check.erase(this);}
static bool isValid(const T*p){return check.count(p)!=0;}
};
template<typename T>
std::set<const valid<T>*> valid<T>::check;
こんな風に定義して
//有効か確認機能付の構造体
struct X:valid<X>{};
X::isValid(p);//pが有効か確認
0380デフォルトの名無しさん
2005/09/06(火) 00:41:020381デフォルトの名無しさん
2005/09/06(火) 00:51:270382デフォルトの名無しさん
2005/09/06(火) 00:52:49#include <stdio.h>
void main( void )
{
double x = 2.0, y = 3.0, z;
z = pow( x, y );
printf( "%.1f to the power of %.1f is %.1f\n", x, y, z );
}
0383デフォルトの名無しさん
2005/09/06(火) 00:59:34お二方ありがとうございました
0384364
2005/09/06(火) 02:12:33おっしゃるとおりだと思いますが、
元々の形はすべてのCellで共通のデータをstaticとして持つでした。
しかしstaticで持ってしまうと、複数のマップ対応に拡張できない。
ということで364の形式、MapクラスはCellクラスからなる、
Cellの共有データはMapクラスが管理ということで
Map Omote_no_sekai;
Map Ura_no_sekai;
というように書けるようにしてみました。
今のところCellがMapを関知することのデメリットはよく分かりません。
静的メンバ変数に比べると関数引数で受け取る必要があるので面倒ですが・・・。
>>367
確かにlogのオーダーなので、それほど問題ないようならこのままいってみます。
蛇足になりますが、静的メンバ変数をあるグループごとに複製したい場合
テンプレートのを使うのは邪道でしょうか?
つまり
template<int WorldSize, int MapType>
class Cell
{
static int arekore;
};
として
Cell<256, 0> Omoteno_sekai[256*256];
Cell<256, 1> Urano_sekai[128*128];
Cell<128, 2> Yume_no_sekai[128*128];
としてしまう手です・・・。
0385デフォルトの名無しさん
2005/09/06(火) 02:56:05> std::ios::outを指定すると、:ostream iteratorが指定される
これ、何の話?さっぱりわからない。
「:ostream iterator」って何?
何に「:ostream iterator」が指定されるの?
> std::stringstream stream( std::ios::out | std::ios::in );
これはつまり std::stringstream stream こうしとけばいいってことだな。
0386デフォルトの名無しさん
2005/09/06(火) 03:28:14テンプレートのを使うのは邪道でしょうか?
その方法はあまりいいものとはいえない。
Cellをテンプレートにすると、当然それを含むMapもテンプレートにしなければならなくなる。
すると、そのMap、Cellを引数にするような関数もテンプレートにせねばならない、などと
際限がなくなってしまう。
struct MapInfo{ int nWorldHeight; int nWorldWidth; };
struct Cell
l
void Hoge(const MapInfo* p)
{....}
.};
class Map
{
MapInfo m_mapInfo;
Cell* m_pCellArray;//Cellのコレクションをメンバに持つ。
};
・CellをMapの外に出す。
・friend class はできるだけ使わない。
って感じで、テンプレートを使わない場合はできるだけMapとCellとの癒着をなくす方がいい。
0387デフォルトの名無しさん
2005/09/06(火) 04:23:52自分もちょっとわかりません。
それはC++の仕様なのでしょうか?
それともSTLPortの仕様なのですか?
STLPortのソースを追ってみると
STLPortのstringstreamは、内部にstringとは別の小さいバッファを持っていて
何らかの条件でバッファの中身をstringにフラッシュするみたいです。
tellpが返すポインタはその小さいバッファのものである為
いままで書き込んだ文字列を考慮した位置を返してくれる訳ではないみたいです。
0388デフォルトの名無しさん
2005/09/06(火) 04:24:34先頭の ':' は明らかに typo だろ。
>これはつまり std::stringstream stream こうしとけばいいってことだな。
その通り。それがデフォルト・パラメータになっている。わざわざ std::ios::inを
外したオープンフラグを指定したものだから、std::ostringstreamと同じに
なってしまった。それだけの話だ。
0389デフォルトの名無しさん
2005/09/06(火) 04:25:26反復子(iterator)について勉強し直せ。自然と理解できる。
0390デフォルトの名無しさん
2005/09/06(火) 04:31:15basic_ostringstreamはbasic_ostreamの派生クラスですよね?
そのbasic_ostreamのメンバであるtellpが
basic_istreamを派生することによって使えるようになるなんて
なんか解せないんですが、それが正しい動作なんですか?
0391デフォルトの名無しさん
2005/09/06(火) 04:45:19basic_ostringstreamがbasic_ostreamのメンバアクセスに制限があるという
資料は見つけられませんでした。
basic_stringのiteratorはランダムアクセスイテレータですから
実装不可能だとも思えません。
やっぱりSTLPortのせいだと思うんですが・・
0392デフォルトの名無しさん
2005/09/06(火) 04:49:59それは勘違い。std::basic_ostreamの反復子は出力反復子(ostream iterator)のため、
tellp()、seekp()メンバ関数の意味を正しくインプリメントできないのだ。
同様にして、std::basic_istreamの反復子は入力反復子(input iterator)のため、
tellg()、seekg()メンバ関数の意味を正しくインプリメントできない。
tellp()、tellg()、seekp()、seekg()は、前方反復子(forward iterator)でのみ、正しい
本来の意味のある値を返す。この前方反復子を備えているクラスは、std::basic_fstreamと
std::basic_stringstreamだけだ。
>>371の、random access iteratorというのは間違い。そこまで厳しい要件を必要と
しない。しかし、おっしゃる通り、std::basic_ostreamとstd::basic_istreamを継承した
クラスでないと、tellp()〜seekg()メンバ関数が使えない。従ってstd::vectorのような
ストリームを継承したのではないくコンテナは、それらの特別なメンバ関数がない。
当然std::listのような双方向反復子(bidirectional iterator)を備えたクラスでも、
seek?()、tell?()が使えない。
0393デフォルトの名無しさん
2005/09/06(火) 04:51:38寝なければならないので。
0394デフォルトの名無しさん
2005/09/06(火) 06:32:04typo だとは思うが、あまりにも脈略が無いんで何を打とうとしたのか想像できない。
std::ostringstream と同じになったと言われても、 std::ostringstream の
tellp() が 0 を返す理由になるとは思わない。
(>371,372 が正しければ -1 が返るらしいが、 >368 では 0 が返ると言われている)
>>389
うーん。 iterator はよく知っているつもりだけど、 >371 の意味は理解できない。
>>392
「std::basic_ostream の反復子」の時点で意味不明なわけだが。
std::basic_ostream::iterator のようなメンバは存在しない。
>>393
今までは何を根拠に言ってたんだ?
0395デフォルトの名無しさん
2005/09/06(火) 06:44:05以下のコードで 'abfgh' が出力された。
やっぱ STLport のバグじゃないの?
>370,373 は、なんで >371 で納得したんだろう?
#include <sstream>
#include <iostream>
int main()
{
std::stringstream stream( std::ios::out );
const std::ios::pos_type p0 = stream.tellp();
stream << "abcde";
const std::ios::pos_type p1 = stream.tellp();
stream.seekp( -3, std::ios::cur );
stream << "fgh" << std::endl;
std::cout << stream.str() << std::endl;
return 0;
};
0396デフォルトの名無しさん
2005/09/06(火) 09:04:37じゃあ、curses ってなんて読むの
0397デフォルトの名無しさん
2005/09/06(火) 09:21:540398デフォルトの名無しさん
2005/09/06(火) 10:08:34辞書に載ってないから聞いたんだ〜!!
ちなみに、cygwin も皆さんは何て読んでいるのですか?
0399デフォルトの名無しさん
2005/09/06(火) 10:14:30http://pc8.2ch.net/test/read.cgi/tech/1056173956/
0400デフォルトの名無しさん
2005/09/06(火) 11:25:26> basic_iosのメンバ関数 fail()がtrueを返すと、tellp() は、
> pos_type(off_type(-1))を返して失敗を伝えます。
> それ以外の場合は、rdbuf()-> pubseekoff(0,cur, out)を呼び出して、
> 出力シーケンスのカレントの位置を返します。
よって tellp の実装は、streambuf の実装に依存する。
basic_stringbuf の seekoff の実装は、
> オープンモードがin | outの場合、
> 入力、出力両方のシーケンスのストリーム ポジションを変更します。
> オープン モードがinのときは、入力シーケンスのストリーム ポジションのみ変更し、
> outのときは出力シーケンスのストリーム ポジションのみ変更します。
> 新しいポジションは、off(ずれ)とway(参照ポイント)の2つのパラメタを組み合わせて計算します。
> 位置変更前にシーケンスのカレントの位置が無効の場合、
> オペレーションは失敗し、pos_type(off_type(-1))が返り値になります。
> それ以外の場合は、カレントの新しい位置を返します。
とあるから、>>368 は STLport 側の問題のような気もする。
0401デフォルトの名無しさん
2005/09/06(火) 17:36:30片方で定義しているrealが他のライブラリでも定義されてしまっているらしく、
error: `typedef double real' redeclared as different
というエラーが出ます。片方の名前をreal2とかに変えれば解決しそうなんですが、
もっと良い解決方法があったらおしえてチョ!
0402デフォルトの名無しさん
2005/09/06(火) 17:42:040403デフォルトの名無しさん
2005/09/06(火) 17:42:21namespace A
{
#include <A.h>
}
namespace B
{
#include <B.h>
}
0404デフォルトの名無しさん
2005/09/06(火) 17:54:21そうして、Aのtypedef double realを使いたくて
using namespace A;
とやると、B.hのなかの他の定義ファイルは使えなくなってしまうんですよね?
B.hの他の定義は使いたいんだす。
0405デフォルトの名無しさん
2005/09/06(火) 18:05:08A::real って書けばいいじゃん。
0406デフォルトの名無しさん
2005/09/06(火) 18:11:33君もC++プログラマなら聞き分けたまえ。
0407デフォルトの名無しさん
2005/09/06(火) 18:23:340408401
2005/09/06(火) 18:24:170409デフォルトの名無しさん
2005/09/06(火) 20:25:51いやだからさ、俺のVC7.1+STLportでは、0を返さず、ちゃんと正常に-1を
返すわけよ。>>368と結果が違うというのはどういう事なのかと。
0410デフォルトの名無しさん
2005/09/06(火) 20:52:11STLportのインストール方法が違うとか。DLLでビルドしたか、
ビルドせずに使っているかで結果が違うとか。
0411デフォルトの名無しさん
2005/09/06(火) 21:07:10知らん。俺はビルドして使ってるけど正常動作した。それを言いたいだけ。
ビルドせずに使ってて不具合起きたんなら、同じビルドせずに使ってる奴に聞け。
0412デフォルトの名無しさん
2005/09/07(水) 00:09:34現在、ビットマップ画像を読み込んで画像処理をした後に保存するプログラムを作成中なのですが、
ビットマップを表示させるところまでは出来たのですが、再描画ができません。
そこで画像処理をした画像をビットマップに保存して、再描画されるようにしたいのですがどうしたらいいでしょうか?
以下にソースを載せます。(環境はVC++6.0です)
0413デフォルトの名無しさん
2005/09/07(水) 00:11:010414デフォルトの名無しさん
2005/09/07(水) 00:12:40長くなりそうだし…。
0415デフォルトの名無しさん
2005/09/07(水) 00:13:07void CWallChangerDlg::InitializeBitmap()
{
SaveBitmap.DeleteObject();
CRect ClientRect;
GetClientRect(ClientRect);
m_height = ClientRect.bottom-90;
m_width = ClientRect.right-10;
CClientDC dc(this);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
SaveBitmap.CreateCompatibleBitmap(&dc,m_width,m_height);
MemDC.SelectObject(&SaveBitmap);
MemDC.PatBlt(0,0,m_width,m_height,WHITENESS);
}
初期化したSaveBitmapに読み込んで画像処理したものを保存したいのです。
(その後OnPaintで呼び出します。)
0416デフォルトの名無しさん
2005/09/07(水) 00:15:280417デフォルトの名無しさん
2005/09/07(水) 00:16:290418デフォルトの名無しさん
2005/09/07(水) 00:19:22申し訳ない。書き込んでから気づきました。
あと補足。
ダイアログベースで、読み込んだ画像がダイアログ中央に出てきます。
それをSetPixel等を使って2値化 ・・・までは出来ました。
でも再描画されない・・・orz
0419デフォルトの名無しさん
2005/09/07(水) 00:20:35イヤマテ勘違いしてる、ソースを貼るのがどうこうじゃなくて、>>417だ
0420デフォルトの名無しさん
2005/09/07(水) 00:22:40スレ違いだったのですか・・・。板で質問するの初めてだったのでわからず、スミマセン。
0421デフォルトの名無しさん
2005/09/07(水) 00:24:070422デフォルトの名無しさん
2005/09/07(水) 01:27:180423デフォルトの名無しさん
2005/09/07(水) 01:29:300424デフォルトの名無しさん
2005/09/07(水) 06:33:090425デフォルトの名無しさん
2005/09/07(水) 06:56:40順番が逆だ。まず童貞を捨ててからC++をやれ。そうすれば立派に禿げる。
0426デフォルトの名無しさん
2005/09/07(水) 08:36:12名無しで「俺」とか言われても誰だかわからん。
tellp() が -1 を返すのが正しいと言う根拠は何?
0427デフォルトの名無しさん
2005/09/07(水) 10:58:20http://itpp.sourceforge.net/latest/
をMKLなしで使う方法ないでしょうか?
0428427
2005/09/07(水) 10:59:240429デフォルトの名無しさん
2005/09/07(水) 21:00:17出来るのでしょうか?
0430デフォルトの名無しさん
2005/09/07(水) 21:13:18分かりにくい表現をしてるが、ごく普通のメンバ関数ポインタのことか
呼べなかったら意味ないね
0431429
2005/09/07(水) 21:23:48やりたいことは、クラスのメンバ関数ポインタに、生成されたオブジェクトのメンバ関数を入れたい。
class A;
class B {
public:
void (A::*func)();
};
class A {
public:
void print() {
printf("hoge\n");
}
};
int main() {
A a;
B b;
b.func = a.print;
(b.*func)();
return 0;
}
0432デフォルトの名無しさん
2005/09/07(水) 21:27:34C#でいうトコの delegate でそ?
それはただのメンバ関数ポインタでは無理。
boost::function 使えば出来ると思う。
まぁ単に A* と A:*func のペアを保持しといて p->(*func) とするのが、
(格好は良くないが)シンプルだと思うけど。
0433デフォルトの名無しさん
2005/09/07(水) 21:36:56× p->(*func)
○ (p->*func)
0434デフォルトの名無しさん
2005/09/07(水) 21:56:50#include <cstdio>
#include <boost/function.hpp>
#include <boost/bind.hpp>
using std::printf;
class A;
class B {
public:
boost::function<void ()> func;
};
class A {
public:
void print() {
printf("hoge\n");
}
};
int main() {
A a;
B b;
b.func = boost::bind(&A::print, a);
b.func();
return 0;
}
0435429
2005/09/07(水) 22:13:36ありがとう。なんとか動きました。
うーん、回りくどいことになっているのは、私の設計に問題があるらしいですね。もう一度見直してみます。
0436デフォルトの名無しさん
2005/09/08(木) 11:24:30単なる予想として、インタフェースを導入してBはそれを持つのがいいような。
class Func {
public:
virtual void exec() = 0;
};
class A : public Func {
public:
virtual void exec() { … }
};
0437デフォルトの名無しさん
2005/09/08(木) 11:53:53unsigned long field[4];
という、128ビット長の整数配列 field をもとに、
std::bitset<128> を構築する場合、どのようにするのが良策でしょうか?
今のところ、以下のように構築してますが、ほかにいい方法はありませんか?
bitset<128> y =
( bitset<128>(field[3]) << 96 ) |
( bitset<128>(field[2]) << 64 ) |
( bitset<128>(field[1]) << 32 ) |
( bitset<128>(field[0]) );
0438デフォルトの名無しさん
2005/09/08(木) 16:24:37考えたけど、あまり良い方法が思い浮かばん
#include <bitset>
#include <string>
#include <limits>
template<typename T>
std::string binary(T t)
{
std::bitset<std::numeric_limits<unsigned char>::digits*sizeof(T)> b(t);
return b.template to_string<char, std::char_traits<char>, std::allocator<char> >();
}
int main()
{
unsigned long field[4] = { 1, 1, 1, 1 };
std::bitset<128> y( binary(field[3]) +
binary(field[2]) +
binary(field[1]) +
binary(field[0]) );
std::cout << y << std::endl;
}
0439デフォルトの名無しさん
2005/09/08(木) 18:24:57下記�@の(int)sizeof(*pBmp)では、構造体のバイト数40が返ってくるので実際にアロックされたバイト数がしりたいのですが…。
/* 定数・変数定義 */
#define MAP_MAXSIZE (50L*1024L*1024L)
/BITMAPINFOHEADER *pBmp;
map *pMap;
// メモリ獲得処理
if ((pBmp = (BITMAPINFOHEADER*)VirtualAlloc(NULL, MAP_MAXSIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL) {
return (-1);
} else {/* ----- �@ここで割り当てられたバイト数を知りたい ----- */
sprintf(logMsg, "メモリリソース獲得後: pointer = BITMAPINFOHEADER %x / size = %d", pBmp, (int)sizeof(*pBmp));
pMap = (map *)pBmp;
}
/* 構造体定義 */
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tag_map {
BITMAPINFOHEADER biInfo;// Bitmap Info Header
BYTE bData[1];// 実際には約10MB分
} map;
0440デフォルトの名無しさん
2005/09/08(木) 18:27:13/* 定数・変数定義 */
#define MAP_MAXSIZE (50L*1024L*1024L)
BITMAPINFOHEADER *pBmp;// ←頭のスラッシュが余分でした。�A
map *pMap;
// メモリ獲得処理
if ((pBmp = (BITMAPINFOHEADER*)VirtualAlloc(NULL, MAP_MAXSIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL) {
return (-1);
} else {/* ----- �@ここで割り当てられたバイト数を知りたい ----- */
sprintf(logMsg, "メモリリソース獲得後: pointer = BITMAPINFOHEADER %x / size = %d", pBmp, (int)sizeof(*pBmp));
pMap = (map *)pBmp;
}
/* 構造体定義 */
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tag_map {
BITMAPINFOHEADER biInfo;// Bitmap Info Header
BYTE bData[1];// 実際には約10MB分
} map;
0441デフォルトの名無しさん
2005/09/08(木) 18:40:060442デフォルトの名無しさん
2005/09/08(木) 18:44:02こんなんどうよ
template <int N>
std::bitset<32*N> make_bitset(unsigned long const(&ar)[N])
{
std::bitset<32*N> result;
for (int i = 0; i < N; i++)
(result <<= 32) |= ar[i];
return result;
}
int main()
{
unsigned long field[4] = { 1, 3, 7, 15 };
std::bitset<128> y( make_bitset(field) );
}
0443デフォルトの名無しさん
2005/09/08(木) 19:17:170444デフォルトの名無しさん
2005/09/08(木) 19:26:56>>442
ありがとうございます。
とりあえず、以下のようにしました。
// VC++7.1 のエラー回避用
template< typename T > struct bsizeof
{
static size_t const value = sizeof(T) * CHAR_BIT;
};
// inline bitset< sizeof(T) * CHAR_BIT * N > bitset_from_vector( ... )
// と記述するとエラーする。どうして?
template< typename T, size_t N >
inline bitset< bsizeof<T>::value * N > bitset_from_vector( T (&x)[N] )
{
typedef bitset< bsizeof<T>::value * N > bset_t;
bset_t b;
size_t i = N;
while( i != 0 )
( b << bsizeof<T>::value ) |= bset_t( x[--i] );
return b;
}
いつもオーダーで混乱するので間違ってたら指摘してください。
0445デフォルトの名無しさん
2005/09/08(木) 19:55:50まあ typo だとは思うが
× ( b << bsizeof<T>::value )
○ ( b <<= bsizeof<T>::value )
0446デフォルトの名無しさん
2005/09/08(木) 20:09:06VirtualQueryでは駄目だった。
VirtualFreeでもサイズは自分で入れなきゃいけないし
システムではサイズの把握までやってないんじゃないの?
だから自分で算出でいいと思うけど。
ページサイズで切り上げ( ページサイズで切り捨て( 開始アドレス ) + サイズ )
0447デフォルトの名無しさん
2005/09/08(木) 22:49:11宣言した時、クラス1のsampleのアドレスを、クラス2のsampleに代入して、クラス2で string a = *sample[abc] とするのは
可能でしょうか?
0448デフォルトの名無しさん
2005/09/08(木) 22:51:36可能です
0449デフォルトの名無しさん
2005/09/08(木) 23:04:50(*sample)[abc]だな。
0450デフォルトの名無しさん
2005/09/08(木) 23:07:31ありがとうございます。
しかし、何度やっても”型変換が間違っています”というメッセージがでてうまくいきません。
mapをポインタとして持つこと自体が間違っているのでしょうか?
それとも、クラス2で、string a = *sample[abc] という書き方が間違っているのでしょうか?
0451デフォルトの名無しさん
2005/09/08(木) 23:11:580452デフォルトの名無しさん
2005/09/08(木) 23:24:48みなさんありがとうございました。
ご指摘どおり型変換に問題があったのですね。
早速明日再度試してみたいと思います。
本当にありがとうございます。
0453デフォルトの名無しさん
2005/09/08(木) 23:31:360454デフォルトの名無しさん
2005/09/09(金) 00:19:45それってべたcデハ?
0455デフォルトの名無しさん
2005/09/09(金) 01:27:2910^xを計算したいんだけど
0456デフォルトの名無しさん
2005/09/09(金) 01:28:19累乗演算子はC++にはないよ。
代わりにpow関数を使う
0458デフォルトの名無しさん
2005/09/10(土) 09:03:58例えばある基底クラス内でprotectedなメンバ変数を宣言して、そのクラスを継承した場合
このprotectedなメンバ変数は、派生クラスのメンバ変数としてpublic指定をしたとほぼ同意になりますか?
それとも、privateで宣言したようなものですか?
手持ちの入門書だと継承先で使用できるとしか書いてなくて迷っています。
0459デフォルトの名無しさん
2005/09/10(土) 09:19:57試せよ。人に聞くよりそのほうが覚える。
0460デフォルトの名無しさん
2005/09/10(土) 09:23:16そのとおり継承先のクラスからでしか使えないから。前者の意味はpublicで十分だろ。
class B
{
public:
B(int n) : hoge(n) {} //OK
int get() const {return hoge;}
protected:
int hoge;
};
class D : public B
{
public:
void set(int n) {hoge = n;} //OK
};
int main()
{
D obj(5);
std::cout << obj.hoge << std::endl; //エラー
std::cout << obj.get() << std::endl; //OK
}
0461デフォルトの名無しさん
2005/09/10(土) 09:25:24元々protectedだったメンバは絶対にpublic扱いにならないし、元々privateだったメンバは絶対にprotected扱いやpublic扱いにならない。
「: protected」をしたら継承されたメンバは絶対にpublic扱いにならないし、「: private」をしたら継承されたメンバは絶対にprotectedやpublicにならない。
0462デフォルトの名無しさん
2005/09/10(土) 09:56:44手を動かさないからいつまで経っても成長できないんだよ。
0463デフォルトの名無しさん
2005/09/10(土) 10:06:000464デフォルトの名無しさん
2005/09/10(土) 10:07:530465デフォルトの名無しさん
2005/09/10(土) 10:24:18using
0467デフォルトの名無しさん
2005/09/10(土) 15:12:39文字配列のアドレスじゃなくて文字列を表示するのはなぜなんですか?
0468デフォルトの名無しさん
2005/09/10(土) 15:15:09そういうオーバーロードが用意されているから、としか答えようがない。
アドレス値を表示させたければキャストすればいい。
char *p = 〜;
std::cout << static_cast<void *>(p) << std::endl;
0469デフォルトの名無しさん
2005/09/10(土) 15:15:180470デフォルトの名無しさん
2005/09/10(土) 15:20:47なるほど
0471デフォルトの名無しさん
2005/09/10(土) 15:28:410472デフォルトの名無しさん
2005/09/10(土) 16:54:58馬鹿を晒さなくていいから。
0473名無しさん@そうだ選挙に行こう
2005/09/10(土) 17:18:200474名無しさん@そうだ選挙に行こう
2005/09/10(土) 18:31:25どうマズいのか教えてくださいー
0475名無しさん@そうだ選挙に行こう
2005/09/10(土) 18:44:24アクセス権限なんてusingで自由自在
0476名無しさん@そうだ選挙に行こう
2005/09/10(土) 18:48:38いや、usingでは隠すほうに持っていけない。
0477名無しさん@そうだ選挙に行こう
2005/09/10(土) 18:59:37あ、どうも。usingってnamespaceの省略以外にも使い道があるんですねぇ。
0478名無しさん@そうだ選挙に行こう
2005/09/11(日) 07:39:560479デフォルトの名無しさん
2005/09/11(日) 09:08:09いや、namespaceの話じゃないから
0480デフォルトの名無しさん
2005/09/12(月) 14:53:28疑問があるのですが、ここで質問してもいいですか?
0481デフォルトの名無しさん
2005/09/12(月) 14:57:40質問していいか質問するなんて行為は辞めれ
いきなり本題でok
0482デフォルトの名無しさん
2005/09/12(月) 14:58:16http://pc8.2ch.net/test/read.cgi/tech/1091198276/l50
0483デフォルトの名無しさん
2005/09/12(月) 15:45:53しかし同時に、デバック表示用に人が読める形で出力するoperator<<関数も欲しいんですが
どう作り分ければ良いですか?
std::ostream& operator<< ( std::ostream& stream, const ClassA& a ) const;
これでは被ってしまいます。
0484デフォルトの名無しさん
2005/09/12(月) 15:48:54マクロで置き換え
0485デフォルトの名無しさん
2005/09/12(月) 15:59:55Visual Studio .NET 2005 + intel C++ compiler ver.9 の環境に下記の様にビルドしました。
bjam -sTOOLS=intel-win32 "--prefix=C:\Program Files\Intel\Compiler\C++\9.0\IA32" "-sINTEL_PATH=C:\Program Files\Intel\Compiler\C++\9.0\IA32" "-sINTEL_BASE_MSVC_TOOLSET=vc-7_1" install
インテルコンパイラ用にビルドしたつもりですが、
vc-C++ bin\boost\libs\wave\build\libboost_wave.lib\intel-win32\release\threading-multi\cpp_re.obj cpp_re.cpp
とvc-C++でコンパイルしていきました。これでよいのでしょうか?
ここでビルドしたライブラリをiclで使用する予定です。
0486デフォルトの名無しさん
2005/09/12(月) 16:10:01マニピュレータ
0487デフォルトの名無しさん
2005/09/12(月) 17:00:13ちと理解できたか自信ないので質問です。
こんなクラスと関数があったとして…
struct A {};
struct X {
const A* p;
X(const A& a) : p(&a) {}
};
X xget(const A& a) { return X(a); }
void xtest(const X& x) {
// ここで *(x.p) を使うとします
}
以下のようになるという理解であってますか?
これはok
xtest(xget(A()));
これもok
const A& a = A(); xtest(xget(a));
これもok
const A& a = A(); const X& x = xget(a); xtest(x);
これはダメ!
const X& x = xget(A()); xtest(x);
0488デフォルトの名無しさん
2005/09/13(火) 01:27:54挙げている例はあってるけど、「ダメ」の理由を自分で説明できないと、
ちゃんと理解したかどうかは判別できないだろう。
0489デフォルトの名無しさん
2005/09/13(火) 02:10:57ややこしいかもしれないが、一番下のはダメともいいきれない。
0490489
2005/09/13(火) 02:12:320491デフォルトの名無しさん
2005/09/13(火) 02:32:15A* p = &A();
これって、pの参照先はこのスコープが閉じるまで保持されるの?
0492デフォルトの名無しさん
2005/09/13(火) 04:38:33これはダメじゃね?
すぐにデストラクトされるような気が
0493デフォルトの名無しさん
2005/09/13(火) 05:43:23それがconst参照の束縛かと
0494デフォルトの名無しさん
2005/09/13(火) 12:51:27>>492 されない。
0495デフォルトの名無しさん
2005/09/13(火) 13:39:250496デフォルトの名無しさん
2005/09/13(火) 17:05:340497デフォルトの名無しさん
2005/09/13(火) 17:35:340498デフォルトの名無しさん
2005/09/13(火) 18:05:190499デフォルトの名無しさん
2005/09/13(火) 19:21:00char s1[80], s2[80];
cout << "Enter two strings : ";
gets( s1 );
gets( s2 );
strcat( s1, s2 );
cout << s1 << "\n";
で、一回目の gets( s1 );
でなぜか入力の状態にならず
勝手に NULL が入ってしまいます。
cin だと問題ないのですが
違いは何なのでしょうか?
0500デフォルトの名無しさん
2005/09/13(火) 20:55:27・gets()は過去との互換性が必要な場合を除いて使うべきではない。
・NULLは入るはずがない。NULキャラなら勿論入るが。
・>>499に書かれたロジック以前に入力は行なっていないか? その場合空読みするべき。
0501487
2005/09/13(火) 21:23:20一時変数の束縛は、それが参照されとぃるかどうかではなく、
あくまでその一時変数を含む式の最後まで保持されるに過ぎない、
ということを確認したかったのですが、規格書の 12.2-3 に
書いてありました。
規格書には「full-expression を評価した最後まで」みたいな表記
だったので、full-expression ってどこまでじゃーと思ってさらに
検索したら 1.9-12 に「別の expression の subexpression でない
ものが full-expression」とかあって何だか騙されたような気分に。
とりあえず関数呼び出しは expression なんで、一時オブジェクト
を使って関数呼び出しを何度行おうが、それが一つの式である限り
一時オブジェクトは有効、ということですね。一番最後の例は最初
の文の後で A() は破棄されてしまうのでダメ、と。
0502デフォルトの名無しさん
2005/09/13(火) 21:27:42ios::sync_with_stdio() は呼んでますよね
0503デフォルトの名無しさん
2005/09/13(火) 21:33:44> ・gets()は過去との互換性が必要な場合を除いて使うべきではない。
調べていたらバッファオーバーフローの原因になるので使わないようにと
いろんなサイトに書いてました・・・・。
fgets() というのを使うようにします。
> ・NULLは入るはずがない。NULキャラなら勿論入るが。
すみません。まだまだよくわかってないんですが、
自分でも何が言いたかったのかよくわかんないんですが
文字が入ってない状態ってことを言いたかったんです。
ヌル文字は入りますね。
> ・>>499に書かれたロジック以前に入力は行なっていないか? その場合空読みするべき。
>>499 のコード以前に cin で入力させていました。
これを消してやってみたら、問題なく動きました。
どういう動きをしてこういうことになるのかとか
細かいことはまだまだよくわからないんですが
これから勉強続けていけばわかってくるかなということで
今回はこれでよしとします。
ありがとうございました。
0504デフォルトの名無しさん
2005/09/13(火) 21:47:22すみません、呼んでません。
っていうか全然わかりません。
翔泳社の標準講座C++で勉強してるんですが
640ページ近くあるうちのまだ145ページぐらいしか読めてないので
難しいことはまだ全然わかりません。
でもちょっと調べてみます。
ありがとうございました。
0505デフォルトの名無しさん
2005/09/13(火) 22:38:12ストリームバッファとstdioが別々の実装になっていても、常に中身を同じく
するのがstd::ios::sync_with_stdio(bool b = true)。
但し、デフォルトで最初からtrueなので、今回の件とは関係ないと思う。
0506デフォルトの名無しさん
2005/09/13(火) 23:05:45一般的に、 std::cout が問題なく使える環境なら
iostream と cstdio は混ぜる必要が無い。(混ぜないほうがいい)
さらに言えば、文字列操作も std::string を使ってしまえばいい。
今回の例で行くと、 s1 に40文字、 s2 に40文字入力された場合、
strcat() で配列サイズ超えた書き込みが起こってしまう。
string s1, s2;
cout << "Enter two strings : ";
cin >> s1;
cin >> s2;
s1 += s2; // or s1.append(s2);
cout << s1 << "\n";
これでバッファオーバーフローも配列オーバーも起こり得ない。
ただし cin >> s1 はDOS攻撃を許してしまう
セキュリティホールだと捉える場合もある。
istream::getline() などを使うといい。
0507デフォルトの名無しさん
2005/09/13(火) 23:08:36はい。その理解で問題ないですよ。
あとはこんな話とか。
http://jbbs.livedoor.jp/bbs/read.cgi/computer/5651/1075539833/35
0508デフォルトの名無しさん
2005/09/14(水) 01:35:28以下の2つの宣言は、同じ意味を持ちますか?
CPen* Pen1;
CPen *Pen2;
基本的なことの質問ですが、回答お願いいたします。
0509デフォルトの名無しさん
2005/09/14(水) 01:39:39前者はCPen*型の変数Pen2を宣言している
質問の意図を察するに同じ意味でオッケー。
0510デフォルトの名無しさん
2005/09/14(水) 01:41:24上の宣言はC++コンパイラを使うように指示する
下の宣言はCコンパイラを使うように指示する
0511デフォルトの名無しさん
2005/09/14(水) 01:56:520512デフォルトの名無しさん
2005/09/14(水) 01:57:37んじゃ CPen * Pen3; はどうなるの?教えてちょぶだい。
0513デフォルトの名無しさん
2005/09/14(水) 02:04:300514デフォルトの名無しさん
2005/09/14(水) 02:27:390515デフォルトの名無しさん
2005/09/14(水) 02:44:35Cωコンパイラ
0517デフォルトの名無しさん
2005/09/14(水) 04:14:570518デフォルトの名無しさん
2005/09/14(水) 06:58:56>>511以降の展開見れば察しはつくだろ。
察しがつかないなら2chを利用するのは止めとけ。
0519デフォルトの名無しさん
2005/09/14(水) 07:19:560520デフォルトの名無しさん
2005/09/14(水) 08:35:400521デフォルトの名無しさん
2005/09/14(水) 09:43:54try {
throw (int);
} catch (int a) {
printf("%d\n", a);
}
とした場合、
aには何が入るかは決まってますか?
0522デフォルトの名無しさん
2005/09/14(水) 09:47:13マジレスしとくよ。一応。お前思いっきり釣られてる。
0523デフォルトの名無しさん
2005/09/14(水) 09:48:020だろ。
0524デフォルトの名無しさん
2005/09/14(水) 09:50:04お前、それコンパイル通ったか?
0525デフォルトの名無しさん
2005/09/14(水) 09:51:08コンパイルできませんよ。
0526デフォルトの名無しさん
2005/09/14(水) 09:58:10もしかして、型だけthrowするのってできないんですか?
0527デフォルトの名無しさん
2005/09/14(水) 10:01:040528デフォルトの名無しさん
2005/09/14(水) 10:23:090529デフォルトの名無しさん
2005/09/14(水) 10:27:34とやったら通りました。
型を返す時は暗黙的に一時オブジェクトを返すということですか?
0530デフォルトの名無しさん
2005/09/14(水) 10:33:24int()はどんな文脈でも0と同じだが。
0531デフォルトの名無しさん
2005/09/14(水) 10:34:07intの暗黙のコンストラクタは0をセットするんでしょうか。
(というかこの理解であってますか?)
0532デフォルトの名無しさん
2005/09/14(水) 10:34:25言っている意味がよく分からんが、それは throw int(0); や throw 0; と書いているのと同じ。
型を返しているのではなく、int型の値(オブジェクト。内容は0)を投げている。
0533デフォルトの名無しさん
2005/09/14(水) 10:37:24意味違ってましたか。
型だけをthrowしたいんですが、どうすればよいですか?
(どっかの解説サイトに型またはオブジェクトをthrowできるとあったので)
0534デフォルトの名無しさん
2005/09/14(水) 10:42:14それは嘘だ。 throw できるのはオブジェクトだけ。
サイト晒せ。
0535デフォルトの名無しさん
2005/09/14(水) 10:45:38そうでしたか。
すいません。
Javaのサイトだったかもしれません。
たしかgoogleで throw 例外 式 とかで検索して出てきたサイトです。
0536デフォルトの名無しさん
2005/09/14(水) 10:51:49それも嘘だ。おまえの勘違いだろ。
0537デフォルトの名無しさん
2005/09/14(水) 10:53:40ここです。
ttp://www.mars.dti.ne.jp/~torao/program/cpp/exception.html
>何をなげるか
>例外処理の throw では、int, char*, double, 構造体など、どんなデータ型でも投げられます。
(中略)
>また、例外はクラス定義されたオブジェクトもなげることができます。
0538デフォルトの名無しさん
2005/09/14(水) 10:58:01読み返したら、自分の勘違いだったみたいです。
型を投げるではなく、〜型のデータを投げるという文脈みたいですね。
でも、まぎらわしいですよね。
0539デフォルトの名無しさん
2005/09/14(水) 11:09:420540デフォルトの名無しさん
2005/09/14(水) 11:12:47そのサイト、筆者の知識が曖昧だな。鵜呑みにしないほうがいい。
0541デフォルトの名無しさん
2005/09/14(水) 12:33:32C++にはまだリフレクションが装備されてないぞ。これから先もずっとからかも。
0542デフォルトの名無しさん
2005/09/14(水) 13:30:45……の認識で合ってますか?
0543デフォルトの名無しさん
2005/09/14(水) 13:59:49class A
{
public: void f(int n);
};
のf()呼び出しは
sturct A
{
};
void A_f(int n, A*)
;のA_f()呼び出し
と本質的に変わらん。
0544デフォルトの名無しさん
2005/09/14(水) 14:05:460545デフォルトの名無しさん
2005/09/14(水) 14:08:35としたとき、
(1) "hoge"で初期化された一時オブジェクトが生成される
(2) sに一時オブジェクトの参照が代入される
という認識であっていますか?
またこの場合、sの有効期間はどうなりますか?
0546545
2005/09/14(水) 14:12:41解決しました。
0547デフォルトの名無しさん
2005/09/14(水) 14:20:01便乗だけど、非仮想だったら
a->b->c->d->func()
でも同じことが言える?
0548デフォルトの名無しさん
2005/09/14(水) 14:34:56newでclassの配列を生成する際、それぞれのclass生成時のコンストラクタ引数は指定できないんでしょうか?
例えば。
String *str;
str = new String [5] ("デフォ文字列");
という感じにできるのが理想です。
(Stringというのは説明のためにデッチあげたクラスです)
もちろんこれはコンパイルとおらないのですが…。
0549デフォルトの名無しさん
2005/09/14(水) 14:36:520550デフォルトの名無しさん
2005/09/14(水) 14:37:04無理です。
0551デフォルトの名無しさん
2005/09/14(水) 14:40:45おやまぁ…。
これは結構困り者ですね。
0552デフォルトの名無しさん
2005/09/14(水) 15:03:36設計ミスじゃないぞゴラ。
0553デフォルトの名無しさん
2005/09/14(水) 15:20:09こんな重要な事項、設計ミス以外の何があるってんだ。言って見ろ。
0554デフォルトの名無しさん
2005/09/14(水) 15:51:420555デフォルトの名無しさん
2005/09/14(水) 16:52:120556デフォルトの名無しさん
2005/09/14(水) 17:08:300557デフォルトの名無しさん
2005/09/14(水) 17:51:54演算子は後から追加されたものらしいから(§10.3、P270)、その時、初期化の
書式との整合性を取るのを”うっかり”忘れたのかねえ。
俺には何か理由があってわざと取り入れなかったような気がしてならないんだが。
0558デフォルトの名無しさん
2005/09/14(水) 19:30:19代わりにその型へのポインタをnew []して、その中に個々の要素をnewで入れたり、
あるいはstd::vectorを使って、個々の要素をpush_back()で入れていったりする。
0559デフォルトの名無しさん
2005/09/14(水) 19:38:15それやと、boost::shared_ptrか、boost::ptr_vector使わないと、deleteが
面倒やねえ。
0561デフォルトの名無しさん
2005/09/14(水) 20:11:010562デフォルトの名無しさん
2005/09/14(水) 20:13:240563デフォルトの名無しさん
2005/09/14(水) 20:27:480564デフォルトの名無しさん
2005/09/14(水) 20:31:510565デフォルトの名無しさん
2005/09/14(水) 20:44:48558の前者のようなやり方になる。つまり参照をnew []して、個々の要素をnewする。
ただ初期化できるんだけどね。
0566デフォルトの名無しさん
2005/09/14(水) 20:53:50cygwin g++ なら、-ansi -Wall オプションつけても、それ通るよ。
動作も期待通り。
他の処理系のg++ は試してないからわからんけど。
0567デフォルトの名無しさん
2005/09/14(水) 20:54:55いけない場合、どのように実装する?
今は、BOMを見てマルチバイトだった場合は1行読み込む毎にwchar_tに変換〜てな感じでやっている。
しかし、なんか効率悪くて思えて仕方が無いんだけど・・・。
0568デフォルトの名無しさん
2005/09/14(水) 20:58:04それGCCの独自拡張だったような
0569デフォルトの名無しさん
2005/09/14(水) 21:00:570570デフォルトの名無しさん
2005/09/14(水) 21:43:160571デフォルトの名無しさん
2005/09/14(水) 21:45:310572デフォルトの名無しさん
2005/09/14(水) 21:49:42逆にgcc独自拡張がC99に取り入れられたものもある。
0574デフォルトの名無しさん
2005/09/14(水) 22:46:19読み込むファイルを全部ワイドバイトにしてしまえばいい。
で、別途コンバータを提供する。
って、そういう問題じゃないか・・・。
0575デフォルトの名無しさん
2005/09/14(水) 23:35:360576デフォルトの名無しさん
2005/09/14(水) 23:48:02wide-byte の検索結果 約 630 件中 1 - 50 件目 (0.40 秒)
0577デフォルトの名無しさん
2005/09/15(木) 00:31:49× sに一時オブジェクトの参照が代入される
○ sが一時オブジェクトへの参照として初期化される
0578デフォルトの名無しさん
2005/09/15(木) 12:52:49超少数派だね
0579デフォルトの名無しさん
2005/09/15(木) 16:24:460580デフォルトの名無しさん
2005/09/15(木) 16:28:14std::hash_map 但しSGI STL
0581デフォルトの名無しさん
2005/09/15(木) 17:39:07template <int X>
struct INT { enum { type = X }; };
としたとき、INT<100>::typeは定数値(100)になるのだろうか?
というのはどうやって確かめればいいですか?
0582デフォルトの名無しさん
2005/09/15(木) 17:43:490583デフォルトの名無しさん
2005/09/15(木) 19:44:41定数式かどうか確認したいなら typede char array[定数式]; とか。
任意の bool 式のコンパイルチェックは
template <bool> struct static_assert;
template <> struct static_assert<true> { enum { value }; };
static_assert<(100 == 100)>::value; とか。
0584デフォルトの名無しさん
2005/09/15(木) 19:46:270585デフォルトの名無しさん
2005/09/15(木) 19:56:26「#defineマクロとstatic const intではなり、const intやstatic const doubleではならない」
ものって即値と呼ぶのだっけ。定数だとconstでしたごめんなさい。
コンパイル時に固定の数値として評価される値、例えばnumeric_limits<int>::min()など。
このように、コンパイル時に評価されていることを確認するのは、どうすればいいのだろう?
0586デフォルトの名無しさん
2005/09/15(木) 19:59:21パフォーマンスにそれほど深刻な影響がなければ、別にコンパイル時評価にこだわる理由はない
というのはよくわかっております。
コンパイルタイムプログラミングしているつもりで、実は実行時に展開されてたら寂しいというだけの理由です。
0587デフォルトの名無しさん
2005/09/15(木) 22:35:25VCならデバッグモードで確認できるし、gccなら-Sオプションつけてコンパイルしてもいいけど。
0588デフォルトの名無しさん
2005/09/15(木) 22:47:34………
0589デフォルトの名無しさん
2005/09/15(木) 23:08:41何が不満なんだ?
0590デフォルトの名無しさん
2005/09/15(木) 23:12:500591デフォルトの名無しさん
2005/09/15(木) 23:13:230592デフォルトの名無しさん
2005/09/15(木) 23:32:580593デフォルトの名無しさん
2005/09/16(金) 00:38:19勉強してるんだけど、全然要領得ないんです。
原因は複雑な設計だったり、極端に略されたメンバ名だったりするんで
なんだかやる気が起きません。
やっぱりC++使ってたらこれらが使えないと一人前とは言えないですかね?
0594デフォルトの名無しさん
2005/09/16(金) 00:51:14少なくとも自分はstream系が役に立ったことは無い。
0595デフォルトの名無しさん
2005/09/16(金) 00:56:16試したら、ホントにバグってたな
やっぱりあの次期のコンパイラのSTLって過信しないほうがいいのか
0596デフォルトの名無しさん
2005/09/16(金) 01:01:06使いにくいから
I/Oクラスが必要なときは自分で作ってる
0597デフォルトの名無しさん
2005/09/16(金) 01:02:430598デフォルトの名無しさん
2005/09/16(金) 01:03:44>I/Oクラスが必要なときは自分で作ってる
馬鹿ハケーン。ま、個人レベルで何をやろうが個人の買ってだが、俺の会社に
こういう香具師が面接にきたら、一番最初に落とす。
0599デフォルトの名無しさん
2005/09/16(金) 01:04:25○勝手
0600デフォルトの名無しさん
2005/09/16(金) 01:12:450601デフォルトの名無しさん
2005/09/16(金) 01:13:37cin cout cerr に出力するサンプルの動作だけを妄信する奴って多いからな
(サンプルがそういうの多いからか)
ここ1年、fstream sstream の実用的な使い方を知って、結構目から鱗状態だったよオレ
0602デフォルトの名無しさん
2005/09/16(金) 01:34:52ダメな部分も使わなくちゃいけなくて大変だねえ
0603デフォルトの名無しさん
2005/09/16(金) 01:48:40うちのプロジェクトなんてコンテナにSTL使わないで
MFCのコンテナ満載だよ
どうやって、こいつらにSTLを啓蒙させようかと悩み中
0604デフォルトの名無しさん
2005/09/16(金) 01:50:110605デフォルトの名無しさん
2005/09/16(金) 01:57:490606凶笑面
2005/09/16(金) 02:16:17みんな、見ようぜ。 原作は新潮文庫から出てるよ。
俺はドラゴン桜を見るからビデオに撮るけどな。
0607デフォルトの名無しさん
2005/09/16(金) 04:16:04このライブラリ乱立状態をなんとかしろ
0608デフォルトの名無しさん
2005/09/16(金) 04:19:340609デフォルトの名無しさん
2005/09/16(金) 07:25:43それに皮かぶせてMFCを売りつけた他社が
余計で中途半端なコンテナクラス(CStringを含む)
をオマケで付けた弊害が蔓延してるって構図かな
0610デフォルトの名無しさん
2005/09/16(金) 08:39:39std::string、std::wstring、AnsiString、WideString、CString、char*、wchar_t*が入り交じってて収拾つきません⊂(。Д。⊂⌒`つ
0611デフォルトの名無しさん
NGNG実用的な使いかたって?
0612デフォルトの名無しさん
2005/09/16(金) 12:08:34class A
{
protected:
Ctype foo;
};
template<class Ctype>
class B : public A<Ctype>
{
void bar()
{
foo = 0;
}
};
こんな感じな事をやろうとすると、
error: ‘foo’ was not declared in this scope
と怒られてしまいます。
Aの継承をintなどで限定するとこのエラーは出ませんでした。
Ctypeのまま継承するにはどうしたらいいでしょうか。
0613デフォルトの名無しさん
2005/09/16(金) 12:31:060614デフォルトの名無しさん
2005/09/16(金) 12:32:21template<class Ctype>
class A
{
protected:
Ctype foo;
};
template<class Ctype>
class B : public A<Ctype>
{
void bar() {
Ctype::foo = 0;
}
};
0615デフォルトの名無しさん
2005/09/16(金) 12:38:12しかし、なんかしっくりこないなー。C++の謎は深い。。
0616デフォルトの名無しさん
2005/09/16(金) 13:15:27キーワードは
"dependant name"
"unqualified lookup"
"point of definition"
"point of instantiation"
0617もこな
2005/09/16(金) 14:19:14それで まずIEのように とりあえずプログラムを起動したら
MSNやYahooのようなサイトのトップが表示され普通に使える物を作りたいです。
それで作ろうとしたのですが、eVcにはCHtmlViewがサポートされていないようなのでどうしたらよいのか迷ってます。
メニュー → 表示 −> ClassWizard → 関数追加 → OnInitialUpdate関数の追加 → Navigate2(_T("適当にURL"),NULL,NULL);
上記をしたら error C2065: 'Navigate2' : undeclared identifier
とエラーが出てしまいました。
何故でしょうか。。。??
といいますか、IEを作るにはどうしたら良いでsしょうか。
お願いします
0618デフォルトの名無しさん
2005/09/16(金) 14:26:360619デフォルトの名無しさん
2005/09/16(金) 15:03:08グローバルロケールの影響受けない文字列型ない?
0620デフォルトの名無しさん
2005/09/16(金) 15:38:41Windows関連スレか初心者スレ、或いはeVcとやらのスレへどうぞ。
0621デフォルトの名無しさん
2005/09/16(金) 22:41:21i/o/iostreamクラスに限って言えばは単にCのFILE *のラッパのような感じだよ。(<<と>>以外は)
0622デフォルトの名無しさん
2005/09/17(土) 18:06:48"doubleに変換"みたいな事が出来る関数ってありませんでしょうか?
自分で書くしか無いんでしょうか。。
0623デフォルトの名無しさん
2005/09/17(土) 18:08:26doubleに変換→boost::lexical_cast
頭のスペース削る→boost::regex
0624デフォルトの名無しさん
2005/09/17(土) 18:09:59少なくとも後者はstringstream使うと楽にできる。
前者はそのままでも可能。
0625デフォルトの名無しさん
2005/09/17(土) 18:11:06頭のスペースはfind_if+erase
0626デフォルトの名無しさん
2005/09/17(土) 18:12:34#include<sstream>
double toDouble(const std::string&s){
double ret;
return std::stringstream(s)>>ret,ret;
}
boost::lexical_castを使う方がより良いけど
0627デフォルトの名無しさん
2005/09/17(土) 21:28:39double conv2double(const std::string foo) {return std::atof(foo.c_str());}
// 頭のスペースを削る
std::string cutSpaces(const std::string foo) {return /* すまん、後を頼む */}
0628デフォルトの名無しさん
2005/09/17(土) 21:34:36std::string cutSpace(const std::string & foo){
return std::string(find_if(foo.begin(),foo.end(),std::bind2nd(std::not_equal_to<char>(),' ')),foo.end());
}
0629デフォルトの名無しさん
2005/09/17(土) 21:36:58×find_if
○std::find_if
0630デフォルトの名無しさん
2005/09/17(土) 21:39:48ttp://www.codeproject.com/vcpp/stl/stdstringtrim.asp
0631デフォルトの名無しさん
2005/09/17(土) 22:33:30VisualC++のスレッドで間違えて聞いてしまいましたが
皆様にC++スレで聞けと仰られたので、、、
0632デフォルトの名無しさん
2005/09/17(土) 22:35:41>>5
0633デフォルトの名無しさん
2005/09/17(土) 22:41:35ありがとう、早速注文したよ、AMAZONで
0634デフォルトの名無しさん
2005/09/18(日) 00:01:270635デフォルトの名無しさん
2005/09/18(日) 00:09:26boost::regex を試してみましたが、うまく動いてくれませんでした。
0636デフォルトの名無しさん
2005/09/18(日) 00:10:21http://www.google.co.jp/search?hl=ja&c2coff=1&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA&lr=lang_ja
0637デフォルトの名無しさん
2005/09/18(日) 01:03:56たかがこれだけの事で写真まで載せるあたりがアメリカンだね
0638デフォルトの名無しさん
2005/09/18(日) 01:04:04鬼車、これ最強。
0639デフォルトの名無しさん
2005/09/18(日) 01:22:23CodeProjectのAuthorはアメリカ人じゃない人の方が多いけどな
0640デフォルトの名無しさん
2005/09/18(日) 01:29:590641デフォルトの名無しさん
2005/09/18(日) 02:39:373 xxxx
10 aaaaa
3 qqqqq
3 aaaaaaa
こんな感じのデータを保存していきたいんですが、
データを取り出すときに、同じ数字のデータごと集めて出したいんです。
(1のデータはaaa,bbb,ccc。3はddd...といった感じで)
vectorやmapで保持すると、取り出すときに数字を一々確認するような形になってしまうのですが、
より良いデータの保持、取り出し方法はありませんでしょうか。
0642デフォルトの名無しさん
2005/09/18(日) 03:08:280643デフォルトの名無しさん
2005/09/18(日) 06:14:37全部文字列にしたいときってみんなどうしてる?
std::stringstream s;
s << fi.rdbuf();
std::string result(s.str());
0644デフォルトの名無しさん
2005/09/18(日) 06:30:49std::istreambuf_iterator<char> begin(fi),end;
std::string result(begin, end);
0646デフォルトの名無しさん
2005/09/18(日) 11:37:53欲しいねぇ。flipcodeも閉鎖(Readonly化)しちゃったし・・・
0647デフォルトの名無しさん
2005/09/18(日) 14:31:15実行するとファイル名は入力してファイルができるのですが文字が書きこめません。
解かる方教えていただけないでしょうか?
0648デフォルトの名無しさん
2005/09/18(日) 14:32:470649デフォルトの名無しさん
2005/09/18(日) 14:39:53const char* const str = "test";
const char[] str = "test";
0650デフォルトの名無しさん
2005/09/18(日) 14:43:41すいませんでした。
0651649
2005/09/18(日) 14:55:42文字列定数定義する場合
const char* const str = "test";
const char[] str = "test";
より
static const char* const str = "test";
static const char[] str = "test";
の方が効率いいというのは本当ですか?
0652デフォルトの名無しさん
2005/09/18(日) 15:21:33こんな書き方C++で出来たっけ?
0654デフォルトの名無しさん
2005/09/18(日) 15:27:22これじゃなんでだめなの?
0655649
2005/09/18(日) 15:32:56独自拡張だったようです。const char* constの方を使う事にします。
staticの方は関数内では付けた方がいいんでしょうか?
0656デフォルトの名無しさん
2005/09/18(日) 15:33:47俺んとこで試したら main 関数がないってエラーがでたよ。
0657649
2005/09/18(日) 15:36:08const char str[] = "test";
ですよ?
const char[] str = "test";
ではなく。
0658デフォルトの名無しさん
2005/09/18(日) 15:36:31const char[] str = "test";
>>649
いくらか効率に違いが出るかも知れんが、そんな些細な効率化を意識するよりstaticやchar*、char[]の使い分け方を理解しろって。
状況によって使い分けるものを一緒くたに語ってもしょうがないだろ。
0659649
2005/09/18(日) 15:38:29const char str[] = "test";
int main()
{
using namespace std;
cout << str << endl;
return 0;
};
これそのままコピペしたら通ると思います。
結局どっちがいいんでしょうか?
0660デフォルトの名無しさん
2005/09/18(日) 15:39:120661デフォルトの名無しさん
2005/09/18(日) 15:39:21const char[] strとか自分で書いてました。
const char str[]が正解です。
0663デフォルトの名無しさん
2005/09/18(日) 15:42:23const char str[] = "test";
最適化すれば、この二つって意味的に同じ物になる?
0664デフォルトの名無しさん
2005/09/18(日) 15:43:510665デフォルトの名無しさん
2005/09/18(日) 15:45:13どういうときに?ポインタのアドレスを取るようなコードがないとしたらどう?
0667649
2005/09/18(日) 15:51:50cl -G7 -O2 -GF -FAs test.cpp
で吐かせました
0668デフォルトの名無しさん
2005/09/18(日) 15:57:36で、メモリ効率の良し悪しは?
0669デフォルトの名無しさん
2005/09/18(日) 15:59:170670デフォルトの名無しさん
2005/09/18(日) 16:00:51後者は存在意義自体疑問
0671デフォルトの名無しさん
2005/09/18(日) 16:02:58なんで?
0672デフォルトの名無しさん
2005/09/18(日) 16:04:37解説キボンヌ
0673デフォルトの名無しさん
2005/09/18(日) 16:07:43>>669
0674デフォルトの名無しさん
2005/09/18(日) 16:09:08が最強
最適化されるコンパイラ多数
Cでも使える
0675デフォルトの名無しさん
2005/09/18(日) 16:43:57{
const char* const str0 = "test";
const char str1[] = "test";
static const char* const str2 = "test";
static const char str3[] = "test";
#define str4 "test"
std::cout << str0;
std::cout << str1;
std::cout << str2;
std::cout << str3;
std::cout << str4;
return 0;
}
これだと、
str4 = str3 > str2 > str0 > str1
0676デフォルトの名無しさん
2005/09/18(日) 17:11:17int _tmain(int argc, _TCHAR* argv[])
{
const char* const str0 = "test";
const char str1[] = "test";
static const char* const str2 = "test";
static const char str3[] = "test";
#define str4 "test"
std::cout << str0;
std::cout << str1;
std::cout << str2;
std::cout << str3;
std::cout << str4;
return 0;
}
void sub()
{
puts(str4);
}
#defineキモッ
0677デフォルトの名無しさん
2005/09/18(日) 17:51:16本当だよ。
関数ローカルでの
const char str[] = "test";
は、
・ローカルなメモリ領域(一般的には関数のスタックフレーム内)
・初期化するためのデータ(この場合では"test")
・初期化するためのコード(この場合ではmemcpyとか)
を必要とする。
それに対して
static const char str[] = "test";
なら "test" の実体を静的に用意すればいい。
0678デフォルトの名無しさん
2005/09/18(日) 18:02:000679デフォルトの名無しさん
2005/09/18(日) 21:42:22size_t size;
void *data;
};
のdataが指し示すsizeバイトのヒープメモリを解放するには、
どうすりゃいいんですか?
適当に、delete[size] (char*)data;とやってみたら、コンパイルは通ったけど、
違う?
0680デフォルトの名無しさん
2005/09/18(日) 21:44:40素直に考えればインターフェースに分離するかテンプレートだと思うが。
0681デフォルトの名無しさん
2005/09/18(日) 21:45:26new char [...]で確保したことが確実なのならまあそれでいいんだが
それ以外の確保の可能性があるのなら(mallocやnew 他の型)駄目
0682デフォルトの名無しさん
2005/09/18(日) 21:47:010683デフォルトの名無しさん
2005/09/18(日) 21:48:340684679
2005/09/18(日) 21:53:30hoge h;
h->data = new Apple;
h->size = sizeof(Apple);
みたいな感じです。
0685デフォルトの名無しさん
2005/09/18(日) 21:55:530686デフォルトの名無しさん
2005/09/18(日) 21:58:35virtual ~Object(){}
};
struct hoge{
size_t size;
Object*data;
};
とかにして使う型をObjectから派生させちゃ駄目ですか?
0687デフォルトの名無しさん
2005/09/18(日) 21:59:040688デフォルトの名無しさん
2005/09/18(日) 22:06:300689デフォルトの名無しさん
2005/09/18(日) 22:07:44それとも単なるコレクション?
0690デフォルトの名無しさん
2005/09/18(日) 22:11:07今は反省している
0691デフォルトの名無しさん
2005/09/18(日) 22:43:44new・mallocとdelete・delete[]・freeの
どの組み合わせでもリークしないんだが
そういうもん?
0692デフォルトの名無しさん
2005/09/18(日) 22:48:050693デフォルトの名無しさん
2005/09/18(日) 22:50:52たまたまnewとmallocのメモリの確保方法が同じであればリークはしないな。
そんなコード書くやつは死んでくれた方がありがたいがな
0694679
2005/09/18(日) 23:27:35結局、派生させました。
0695デフォルトの名無しさん
2005/09/18(日) 23:48:47これリークしない?
#include <stdlib.h>
struct hoge {
int* p_;
hoge() : p_(new int[16777216]) {}
~hoge() {delete[] p_;}
};
int main() {
hoge* p = new hoge();
free(p);
}
0696デフォルトの名無しさん
2005/09/19(月) 00:01:560697デフォルトの名無しさん
2005/09/19(月) 00:15:430698デフォルトの名無しさん
2005/09/19(月) 00:31:46ほい
std::vector<std::string> * p = (std::vector<std::string> *) malloc( sizeof (std::vector<std::string>) );
0699デフォルトの名無しさん
2005/09/19(月) 00:36:14たしかにVCのoperator new/new[]/delete/delete[]()はmalloc/freeを呼ぶ実装になっている。
だからと言って混同して良いものではないし、コンストラクタ・デストラクタが絡むとやばい。
0700デフォルトの名無しさん
2005/09/19(月) 00:45:52deleteなら基底クラス/各オブジェクトのデストラクタを呼んでくれる。
0701デフォルトの名無しさん
2005/09/19(月) 01:11:04class A;
A* a = new A;
a->~A();
free(a);
0702デフォルトの名無しさん
2005/09/19(月) 01:34:21だからfree()はやめろとあれほど
0703デフォルトの名無しさん
2005/09/19(月) 01:42:10delete [] data;
とやるだけでnewしたときの分がちょうど開放されるわけではないの?
malloc/freeの組み合わせも同様で。
どのコンパイラだか忘れたけど、動的確保したバイト数を、newで返るアドレスの手前に保存するのがあったはず。
まあコンパイラの実装方法は多々あるのかもしれないが、newした分のバイト数は内部でしっかりとっておかないと、普通に素直なnew/deleteしたときも困らないか?
標準を知る者求む。
0704デフォルトの名無しさん
2005/09/19(月) 01:44:31hoge h;
h.data=new hoge;
0705703
2005/09/19(月) 02:19:11あぁ、そういうことか。でも
h.data = new hoge; なら delete h.data;
h.data = new hoge[size]; なら delete [] h.data;
のどちらかしか使わないことように徹底した場合はどう?
まあそんな保守性低いもの書くくらいなら>>679みたいなの書かない方がいいわけだけど。
とりあえず、動的確保した大きさが内部で保存されてるってのは標準で保証されてるのかどうかが疑問点。
0706デフォルトの名無しさん
2005/09/19(月) 03:00:010707デフォルトの名無しさん
2005/09/19(月) 03:37:07これのこと?
これならVCでは駄目だったなぁ。
struct A
{
char* a;
A(){ a = new char[100];}
~A(){ delete [] a;}
};
struct B
{
void* a;
};
{
B b;
b.a = (void*)new A;
delete b.a;
}
0708デフォルトの名無しさん
2005/09/19(月) 03:51:240709デフォルトの名無しさん
2005/09/19(月) 04:03:430710デフォルトの名無しさん
2005/09/19(月) 09:47:420711デフォルトの名無しさん
2005/09/19(月) 12:21:160712デフォルトの名無しさん
2005/09/19(月) 16:35:07class A {
public: B method() { return B(); }
};
class B: public A {}
みたいな循環した宣言って無理?
0713デフォルトの名無しさん
2005/09/19(月) 16:41:18無理だろうな。
基底クラスが派生クラスを知っているという状況は、一般的におかしい。
0714デフォルトの名無しさん
2005/09/19(月) 16:43:240715デフォルトの名無しさん
2005/09/19(月) 16:45:190716712
2005/09/19(月) 17:04:42Object a, b, c;
a[0] = b;
c = a[0]
こんな感じの振る舞いをするクラスが必要になったので、最初は以下のようなコード
class Assigner {
nbsp;nbsp;nbsp;nbsp;...
nbsp;nbsp;nbsp;nbsp;operator=(Object obj) { /* setter */ }
nbsp;nbsp;nbsp;nbsp;operator Object() { /* getter */ }
};
class Object {
nbsp;nbsp;nbsp;nbsp;...
nbsp;nbsp;nbsp;nbsp;Assigner operator[](int i) { return Assigner(this, i); }
};
を書いたんだけど、これだと
a[0].method();
などが動かないので、AssignerをObjectの派生クラスにしてしまおうと
考えたんだけど…。
識者の方、何か良い方法があったら教えてください。
0717712
2005/09/19(月) 17:07:12class Assigner {
...
operator=(Object obj) { /* setter */ }
operator Object() { /* getter */ }
};
class Object {
...
Assigner operator[](int i) { return Assigner(this, i); }
};
0718デフォルトの名無しさん
2005/09/19(月) 17:13:21Assigner の意味がわからない。
0719デフォルトの名無しさん
2005/09/19(月) 17:23:310720デフォルトの名無しさん
2005/09/19(月) 17:30:44>>176-717を見ていなかったときの俺ならこう答えた。
template <typename T>
class A {
public:
T func() {return T();}
};
class B : public A<B> {};
0721デフォルトの名無しさん
2005/09/19(月) 17:38:46AとBの継承関係が無理やりすぎ
0722デフォルトの名無しさん
2005/09/19(月) 17:45:100723デフォルトの名無しさん
2005/09/19(月) 18:21:22略しすぎて訳わかんないな。ごめんなさい。
急にコードが具体的になって申し訳ないんだけど、
PythonのC拡張を書く関係で、Pythonのオブジェクトを表すPyObjectのwrapperを書いてる。
で、Pythonオブジェクトの属性の取得/代入を[]演算子で行いたい。
value = obj["attr_name"];
obj["attr_name"] = value;
こんな感じで。なお、属性はPyObject_{Get|Set}AttrString()で可能。
class PyObjectWrapper
{
public:
PyObject* mObj;
PyObjectWrapper() {}
PyObjectWrapper(PyObject* obj): mObj(obj) {}
class Assigner
{
public:
PyObject* mObj;
string mKey;
Assigner(PyObject* obj, const string& key): mObj(obj), mKey(key) {}
operator PyObjectWrapper()
{
PyObject* pobj = PyObject_GetAttrString(mObj, (char*)mKey.c_str());
return PyObjectWrapper(pobj);
}
0724デフォルトの名無しさん
2005/09/19(月) 18:22:46void operator=(const PyObjectWrapper& pobj)
{
PyObject_SetAttrString(mObj, (char*)mKey.c_str(), pobj.mObj);
}
};
PyObjectWrapper operator[](const string& key) const
{
return Assigner(mObj, key);
}
};
このコードで値の取得/代入はできるが、
obj["name"].PythonObjectのメンバ();
はできないので、AssignerをPythonObjectの派生クラスに…と考えたのです。
0725デフォルトの名無しさん
2005/09/19(月) 18:34:12class PyObjectWrapper {
PyObject& operator[](const string& key);
};
0726デフォルトの名無しさん
2005/09/19(月) 18:39:14質問をぶった切ることになるけど、 boost::python でも見るといいんじゃないかな?
勉強じゃないなら、そのまま使うとか。
0727デフォルトの名無しさん
2005/09/19(月) 18:41:56アドホックな解決策として、Assignerで
PyObject *operator->() const {
return mObj;
}
としておけば、
obj["name"]->メンバ();
は使えるようになるんじゃまいか。
boost::python使うのが一番手っ取り早いだろうけど。
0728デフォルトの名無しさん
2005/09/19(月) 20:33:000729デフォルトの名無しさん
2005/09/19(月) 20:47:02つ [ http://find.2ch.net/?BBS=ALL&TYPE=TITLE&STR=COM&COUNT=50 ]
0730デフォルトの名無しさん
2005/09/19(月) 21:14:15i = new int[x];
動的に確保した配列の数(x)をどうやって算出するのか
おしえてください。
0731デフォルトの名無しさん
2005/09/19(月) 21:16:43別変数に個数を保存しておくか、vectorのように配列のサイズを知ることができるコンテナを使う。
0732デフォルトの名無しさん
2005/09/19(月) 23:48:23gcc4.0で上のファイルがコンパイルできなくて困っています。
gcc3.2や3.3(とそのlibstdc++)ではコンパイル出来るみたいなんですが、
どこが悪いのでしょうか。
0733デフォルトの名無しさん
2005/09/19(月) 23:56:45エラーが出るならエラーメッセージぐらい貼れ。
あと、内容によっては↓こっちかもしれない。
http://pc8.2ch.net/test/read.cgi/tech/1121146723/
0734デフォルトの名無しさん
2005/09/20(火) 01:01:39すいません。
g++ .... -c mqodrawer.cc -o mqodrawer.o
material.hh:22: error: ‘Vector4’ has not been declared
material.hh:22: error: expected ‘,’ or ‘...’ before ‘<’ token
material.hh:23: error: ‘Vector4’ has not been declared
material.hh:23: error: expected ‘,’ or ‘...’ before ‘<’ token
material.hh:24: error: ‘Vector4’ has not been declared
material.hh:24: error: expected ‘,’ or ‘...’ before ‘<’ token
...
こんな感じのエラーです。
0735デフォルトの名無しさん
2005/09/20(火) 01:29:43そのまんまじゃねーか。
↓これだろ。
//#include "vector.hh"
#include "texture.hh"
namespace bkl {
#include "vector.hh"
Vector4 が ::bkl::bkl::Vector4 になってる。
::bkl 内で Vector4 では見つからない。
こんなことになるから、 namespace の中で #include するな。
0736デフォルトの名無しさん
2005/09/20(火) 01:40:59すいません。それはnamespaceの外でincludeしても同様のエラーが出ます。
元々外のコメントアウトされたものだけだったんですが、見つからんと言われたので
色々書き換えてたのが残ってしまっていました。
#include "vector.hh"
#include "texture.hh"
namespace bkl {
//#include "vector.hh"
このようにしても、エラーコードはかわりませんです。。
0737デフォルトの名無しさん
2005/09/20(火) 02:21:57手元の 3.4@cygwin では、その修正で問題なくなる。
エラーメッセージが変わらないわけ無いとおもうんだが。
もう一度試しても、本当に >734 のエラーになるか?
エラーメッセージはそのままコピペしてるか?
0738デフォルトの名無しさん
2005/09/20(火) 02:33:25はい、全く同じエラーになります。自分の環境(FedoraCore4)のgcc3.2でも通ります。
が、gcc4では通りません。。
0739デフォルトの名無しさん
2005/09/20(火) 03:28:29だとしたら死んでも償いきれないぞっ!!
0740デフォルトの名無しさん
2005/09/20(火) 08:27:07名前空間を直接指定してスコープ解決すればいいのはわかっていますが、
小手先の方法として、あるひとつのシンボルを優先して解決するような方法はいまりすでしょうか。
本当はそうならないように設計すべきだということはわかっているのですが……
お願いします。
0741デフォルトの名無しさん
2005/09/20(火) 08:41:17いまりません。
0742デフォルトの名無しさん
2005/09/20(火) 09:45:020743デフォルトの名無しさん
2005/09/20(火) 12:05:00同じディレクトリにあるヘッダですし、
他のファイルからもincludeされているヘッダなのでそれはないです。
何故出来ないんだろう。。
0744デフォルトの名無しさん
2005/09/20(火) 12:34:500745デフォルトの名無しさん
2005/09/20(火) 12:43:550746デフォルトの名無しさん
2005/09/20(火) 12:48:21逆に、どうやってstd::freopen()を使ってstd::coutをファイルにするのか聞きたい。
0747744
2005/09/20(火) 12:50:57リダイレクトってOSの?それでは駄目だ。
>746
ごめん。std::freopenではなくて、Cのだ。
0748デフォルトの名無しさん
2005/09/20(火) 12:58:33後から切り替えができるようにするもんじゃないか
0749デフォルトの名無しさん
2005/09/20(火) 13:03:12メンバ関数のアドレスを取得しようとすると
「仮想関数のアドレスを取ろうとしました」って言われる
CGame *game;
game = new CGame;
&(game->Main); // エラー
こんな感じ
なんで仮想関数?
0750デフォルトの名無しさん
2005/09/20(火) 13:07:12CGame::Mainが仮想関数なんじゃないの?
0751デフォルトの名無しさん
2005/09/20(火) 13:09:35ソース全部検索したけどvirtualって文字列は
CWinAppの派生クラスに1コだけだった
0752デフォルトの名無しさん
2005/09/20(火) 13:14:39それはVC++の意味不明なエラーメッセージで混乱してるだけ。g++でコンパイルしてみ。
「ISO C++ではそのようなアドレス取得は認められていません」って出るから。
0753デフォルトの名無しさん
2005/09/20(火) 13:18:00game->Main(); ではないかと釣られてみる。
0754デフォルトの名無しさん
2005/09/20(火) 13:18:37どうしても手動でメモリ確保しつつ関数のアドレスが欲しかったんだけど
教えてくれてサンクス
0755デフォルトの名無しさん
2005/09/20(火) 13:19:59&(CGame::Main);じゃなんでダメなの?
0756デフォルトの名無しさん
2005/09/20(火) 13:20:48ただしstaticにしないとコールはできないよ。
コールしたい場合はstd::mem_funか、boost::functionを使うと吉。
0757デフォルトの名無しさん
2005/09/20(火) 13:22:07「'&' に左辺値がありません」って言われる
その&じゃないってのに
>>755-756
ちょっと考え直してみる
0758デフォルトの名無しさん
2005/09/20(火) 13:25:27ていうか何でエラーが出るか理解してるか?
C++のクラスでは、オブジェクトがいくつあったところで関数の実体は1つしかなくて
その関数に暗黙にオブジェクトのポインタ(thisポインタ)が渡されるのは知ってるよね?
ということは、オブジェクトAの関数F をポインタで表現しようとなると、
オブジェクトAのアドレスと関数Fのアドレスを両方管理しなきゃいけなくなって
1つのポインタじゃ表現できないからエラーになる。
だから結局、関数だけのアドレスを取得するか(&CGame::Main)、
両方を管理できるmem_funのようなクラスを使う必要があるってだけ。
用途に応じて使い分ければいい。
0759デフォルトの名無しさん
2005/09/20(火) 13:27:36それらのメイン関数をまとめて実行したい
だからメイン関数のアドレスを集めようとしてた
>C++のクラスでは、オブジェクトがいくつあったところで関数の実体は1つしかなくて
>その関数に暗黙にオブジェクトのポインタ(thisポインタ)が渡されるのは知ってるよね?
すいません実は・・・
0760デフォルトの名無しさん
2005/09/20(火) 13:28:32this->*pFunc
0761デフォルトの名無しさん
2005/09/20(火) 13:28:52こんな感じで。
#include <iostream>
#include <fstream>
int main()
{
std::ostream* fsp;
int i;
std::cout << "1: std::coutに出力 2: 'test.txt'に出力? ";
std::cin >> i;
if (i == 1)
fsp = &std::cout;
else if (i == 2)
fsp = new std::ofstream("test.txt");
else
return 0;
(*fsp) << "出力\n";
if (fsp != &std::cout)
dynamic_cast<std::ofstream*>(fsp)->close();
}
0762デフォルトの名無しさん
2005/09/20(火) 13:33:00boost::signalを調べてみれば?
そこまで複雑なものじゃなくてもいいなら、ちょっと工夫すれば自作できるだろうし
0763デフォルトの名無しさん
2005/09/20(火) 16:47:03下のやり方だとreadが一回多くなってしまいます。
上手いやり方があったら教えて頂けないでしょうか。
#include <fstream>
int main(){
int writed_count=0, read_count=0;
std::ofstream ofile( "hoge", std::ios::binary );
for( int i=0; i<5; ++i ){
ofile.write( (const char*)&i, sizeof(int) );
++writed_count;
}
ofile.close();
int array[10] = {0};
int pos = 0;
std::ifstream ifile( "hoge" );
while( ! ifile.eof() ){
ifile.read( (char*)&array[pos], sizeof(int) );
++read_count;
++pos;
}
printf( "write count = %d\nread count = %d\n", writed_count, read_count );
return 0;
}
0764デフォルトの名無しさん
2005/09/20(火) 16:52:48while (!ifile.eof()) がおかしい。
C/C++はBASICとは違い、一度読んでみて初めてEOFかどうかわかる。
0765デフォルトの名無しさん
2005/09/20(火) 16:57:49という順序が正解ですな。
たとえば、条件文のところをwhile (1)にした上で、ifile.read()の直後にeof()をチェックして
真だったらbreakするとか、
条件文の中に読み込む式とeof()をカンマで並べるとか。
0766デフォルトの名無しさん
2005/09/20(火) 16:58:40ありがとうございます、おかげで良く分かりました
この場合はreadの後にeofで終了判定すべきなんですね
0768デフォルトの名無しさん
2005/09/20(火) 18:05:52どうすれば効率よく取れますか?
it = list.end();
--it;
はマズイですよね?
0769デフォルトの名無しさん
2005/09/20(火) 18:09:53std::listのイテレータはBidirectionalIteratorだからまずくない。
0770デフォルトの名無しさん
2005/09/20(火) 18:22:25--list.end()でしたね。
ありがとうございました。
0771デフォルトの名無しさん
2005/09/20(火) 19:33:120772デフォルトの名無しさん
2005/09/20(火) 19:50:54そいつが返すのはreverse_iteratorじゃないのか?
0773デフォルトの名無しさん
2005/09/20(火) 22:15:12list::iterator が builtin type であることはないから
問題ないのでは?
0774デフォルトの名無しさん
2005/09/20(火) 23:27:12boost::anyでいけるかと思ったけど
メンバ関数を実行しようとすると「boost::anyのメンバではありません」とか言われる
0775デフォルトの名無しさん
2005/09/20(火) 23:30:07メンバ関数が実行できる、とは、型がある、ということだ。
型に共通のメンバ関数を括りだしてインターフェースにするか、
Object型にしてInvoke(COMMAND,...)とか、RTTIで型の列挙、
みたいな話になってくるが。
0776デフォルトの名無しさん
2005/09/20(火) 23:36:15[io]?strstream
だけがtemplate化されてないのって何か理由あるのかな?
0777デフォルトの名無しさん
2005/09/20(火) 23:40:13basic_[io]stringstream<>ならあるけどな。
0778デフォルトの名無しさん
2005/09/20(火) 23:41:09諦める。・゚・(ノД`)・゚・。
0779デフォルトの名無しさん
2005/09/20(火) 23:42:49strstream類は過去との互換性のためだけに存在するから。
逆にstringstream類はテンプレートになっている。
0780デフォルトの名無しさん
2005/09/20(火) 23:45:02少なくともX3014:2003には附属D.7にstrstream類が載っている。
0781デフォルトの名無しさん
2005/09/21(水) 00:57:20boost::anyにoperator->を付け加えてやればできるのではないかと。
試してないけど。
0782デフォルトの名無しさん
2005/09/21(水) 00:59:560783776
2005/09/21(水) 01:11:35>>777
basic_iostream<...>->strstream
>>779
そのような歴史的経緯?もあり、
配列ベースの入出力のようなので今後はあまり使わない方がよさそうですね。
0784デフォルトの名無しさん
2005/09/21(水) 01:51:110785デフォルトの名無しさん
2005/09/21(水) 03:01:440786デフォルトの名無しさん
2005/09/21(水) 03:40:53微妙に使いどころに苦しむ。
オブジェクトに互換性がないんじゃ、混ぜて書けるメリットが無いと思うんだが。
つか、むしろC++ベースでCocoaをサポートしてくれ
0787635
2005/09/21(水) 16:47:08情報ありがとうございました。鬼車の c++ ラッパーを作って、ruby-like な gsub とか
scan ができるようになりました。日本語の正規表現も問題なしです。
0788デフォルトの名無しさん
2005/09/21(水) 16:57:05日本語で問題があったならwregexだとどうだったんだろうか。
0789デフォルトの名無しさん
2005/09/21(水) 18:18:15よろしくお願いします。
c++で作られたソフトをダウンロードしたのですが
文字が一部「・」とか「・・」と表示されていて
読めません。
どうすれば日本語に戻りますか?
0790デフォルトの名無しさん
2005/09/21(水) 18:25:20コードの書き方に違いが出るだけで
やってることはおなじと考えていいんですか?
0791デフォルトの名無しさん
2005/09/21(水) 18:28:46そそ。
0792デフォルトの名無しさん
2005/09/21(水) 18:54:150793デフォルトの名無しさん
2005/09/21(水) 18:57:16*static_cast<hoge*>(NULL)
まぁ自分もNULLが来ないことを前提にコード書いてるけどね
0794デフォルトの名無しさん
2005/09/21(水) 19:43:11自分がそのプログラムのソースコードを修正する気でもない限り、ここは板違い。
恨むならエスパースレでお前にここに行けと答えた奴を恨め。
0795790
2005/09/21(水) 20:15:18よくわからなかったままだったんですが、
今回勉強し直してたらおんなじなんじゃないかとおもいまして
お聞きしました。
すっきりしました。
さんくすです。
0796デフォルトの名無しさん
2005/09/21(水) 20:19:58メンバータイプでぐぐると異様に件数が少ないんですが・・・
0797デフォルトの名無しさん
2005/09/21(水) 20:21:42EUCかUTF-8かSJISかいろいろ試せ。
0798635
2005/09/21(水) 23:02:51gcc with boost::regex (wregex) だと、正規表現自体に日本語を含むケースでまともに
動きませんでした。原因は良く分かりませんが・・・。
0799デフォルトの名無しさん
2005/09/22(木) 03:57:41クラス内で定義されたクラス型なら
"nested class" 「ネストされたクラス」っていう呼び方があるけど、
typedef だと特に用語も無く「クラス内の typedef 」とか言えばいいと思う。
0800デフォルトの名無しさん
2005/09/22(木) 05:50:42class AAA
{
public:
operator int&()
{
return & m_i;
}
int m_i;
};
という具合に自分のメンバのm_iのポインタを返せばいいのですか?
正しい方法を教えてくださいませ。
0801デフォルトの名無しさん
2005/09/22(木) 07:30:05参照とポインタは違う。やればすぐ判ることを一々聞くな。
そもそも、メンバを返すのが適当な設計かどうかは一概には言えんぞ。
それと、constメンバ関数にしておいた方がいいかも知らん。
0802初心者
2005/09/22(木) 13:20:24現在、ボーランドでプログラムを作っているのですが、
TransparentBlt()関数が読み込めないらしく、
Error: 外部シンボル 'TransparentBlt' が未解決
と出てしまいます。
何かをインクルードし忘れているからでしょうか?
windows.hだけをインクルードしているのですが。
0803デフォルトの名無しさん
2005/09/22(木) 13:40:02Win32API質問箱 Build35
http://pc8.2ch.net/test/read.cgi/tech/1125850096/
0804デフォルトの名無しさん
2005/09/22(木) 13:42:18使ってくれるのですが、$(OBJS)を生成するときは、g++が使われてしまいます。拡張子ルールか何かがまちがっているのでしょうか?
どなたかご教授をよろしくお願いします。
環境は、Red Hat(R) Enterprise Linux AS 2.1
/************* Makefile ****************/
CC = /opt/intel_cc_80/bin/icc
DEBUG = -g
CFLAG = -c $(DEBUG)
OFLAG = -o
IPOFLAG = -ipo
IPFLAG = -ip
LFLAG = -lm
# ソースファイルの宣言
SRCS = Main.cpp HelloWorld.cpp
OBJS = ${SRCS:.cpp=.o}
# 実行ファイルの宣言
EXE = Ocean
$(EXE) : $(OBJS)
$(CC) $(OFLAG) $(EXE) $(IPOFLAG) $(OBJS) $(LFLAG)
.c.o :
$(CC) $(CFLAG) $(IPOFLAG) $<
Main.o : HelloWorld.h
HelloWorld.o : HelloWorld.h
0805デフォルトの名無しさん
2005/09/22(木) 13:51:09.cpp.oはデフォルトでどう定義されているのか見てみるがよろし。
0806初心者
2005/09/22(木) 13:55:17どうもです。
行ってきます。
0807804
2005/09/22(木) 13:56:20c++のプログラムでしたので、
.c.o => .cpp.o
と、変更したら解決できました。ありがとうございます。
ほんとしょうがないミスで申し訳ありません。
0808デフォルトの名無しさん
2005/09/22(木) 13:56:29.cpp から .o を生成する規則を追加汁
0809デフォルトの名無しさん
2005/09/22(木) 21:50:36ウィドウに、文字を書き込んでいるのですが、
一定の処で、改行したいのですが、
どうも、区切り場所の文字が、変になります。
バイト数を求めるには、どうすればよいのでしょうか
string hh;
hh = strtok(NULL,"\t");
while(1){
if(strlen(hh.c_str())>=25){
TextOut(ps.hdc,105,takasa,hh.substr(0,24).c_str(),
strlen(hh.substr(0,24).c_str()));
hh = hh.substr(24,hh.length());
takasa +=20;
}else{
TextOut(ps.hdc,105,takasa,
hh.substr(0,hh.length()).c_str(),
strlen(hh.c_str()));
break;
}
}
0810デフォルトの名無しさん
2005/09/22(木) 21:58:25意外と簡単だから
0811デフォルトの名無しさん
2005/09/22(木) 22:05:34ってずいぶん斬新なコードだなぁ、
0812デフォルトの名無しさん
2005/09/22(木) 22:21:430813デフォルトの名無しさん
2005/09/22(木) 22:26:49何度かんがえてもわかりません。
上のコードでは、最後の文字が半角なら
失敗しす。
だから、最後の文字が半角かどうか判断して、
コードを変えようかと思ったのですが、
もっと簡単な方法があると考えてよいのでしょうか。
そうならば、もっと考えて見ます。
>>811さん、全く読みにくいコードをあげてしまいすみません。
c も c++もまったくしらず、vc++からはじめたので、
charのポインターつかうか、stringクラスつかうか、
あるいは、この関数がどっちの関数なのか、
整理が全くできてない状態です。
0814デフォルトの名無しさん
2005/09/22(木) 22:28:59string 使うと、メモリの心配しなくてすむのかなと思ったのですが、
malloc とか、使わなくてすむと・・・
0815デフォルトの名無しさん
2005/09/22(木) 22:34:08こいつは大物になるぜ。
0816デフォルトの名無しさん
2005/09/22(木) 22:35:50std::string.length()のこともたまには思い出してあげてください。
0817デフォルトの名無しさん
2005/09/22(木) 22:36:480818デフォルトの名無しさん
2005/09/22(木) 23:40:07目から鱗が落ちた。
0819デフォルトの名無しさん
2005/09/22(木) 23:45:590820デフォルトの名無しさん
2005/09/22(木) 23:49:010821デフォルトの名無しさん
2005/09/22(木) 23:58:28激しく和露他
0822デフォルトの名無しさん
2005/09/22(木) 23:58:29ところで皆に聞きたいんだが、クラスのメンバである配列の初期化ってどうやってる?
自分のやり方むちゃくちゃな予感なんで定石を聞きたいんだが。
0823デフォルトの名無しさん
2005/09/23(金) 00:00:30むちゃくちゃなやり方知りたいので書いて
0824デフォルトの名無しさん
2005/09/23(金) 00:00:40普通のCスタイル配列じゃコンストラクタ関数の先頭で、とか無理だから
別にないと思うよ。
0825デフォルトの名無しさん
2005/09/23(金) 00:07:540826822
2005/09/23(金) 00:08:53union {
float color[4];
struct {
float c1;
float c2;
float c3;
float c4;
};
};
Color(void) : c1(0.0),c2(0.0),c3(0.0),c4(0.0) {};
Color(float* c) : c1(*c),c2(*(c+1)),c3(*(c+2)),c4(*(c+3)) {};
};
こんな感じでやってる。
0827デフォルトの名無しさん
2005/09/23(金) 00:13:23float4つだからAltiVecかSSEのコードかと思った。
0828デフォルトの名無しさん
2005/09/23(金) 00:19:00組込型なら、そういう場合は割り切ってコンストラクタの中で記述するのがいいかと。
0829822
2005/09/23(金) 00:25:380830デフォルトの名無しさん
2005/09/23(金) 20:13:01strを単なる文字型の配列として使っていたら最後が'\0'で終わってるとは限らないから有効なんじゃ、と
一瞬思ってしまったorz
'\0'で終わってなかったらstrlen使えないよな。sizeofならともかく。
0831デフォルトの名無しさん
2005/09/24(土) 01:20:450832デフォルトの名無しさん
2005/09/24(土) 01:41:16必要なライブラリにリンクしてても出るんなら
あんただけ。
0833デフォルトの名無しさん
2005/09/24(土) 12:42:26それともイテレータは基本的に複数要素に順番にアクセスするために
あるのであって、単にコンテナ内の一つの要素のアドレスを
長期間保持して好きなときに要素にアクセスしたいだけ(ptr++等のポインタ演算も行わない)
の場合、生ポインタを保持しておいたほうがいいの?
0834デフォルトの名無しさん
2005/09/24(土) 12:42:56演算子のオーバーロードは継承した場合引き継がれないのでしょうか。
クラスで演算子のオーバーロードをしました。
class CBase{
(略)
void operator =(CBase*);
};
で、その後CBaseを継承したクラスを作成
class CMain : public CBase{
(略)
}
void main(){
CMain a;
a = new CBase();
}
としたところコンパイルエラーなのです。
ためしに
class CMain : public CBase{
(略)
void operator =(CBase*);
}
としてみたところ、コンパイルがとおりました。
つまり演算子のオーバーロードは継承されないのかなと感じたわけです。
これはそうなのでしょうか。
0835デフォルトの名無しさん
2005/09/24(土) 12:46:26内容書けや
0836デフォルトの名無しさん
2005/09/24(土) 12:52:35イテレータは、ポインタの概念を大きく拡張したもの。
君の言っているポインタは、random access iteratorの事だと思うが、
C++ STLのコンテナや、ストリームは、自由にあちこちをアクセスできない
物がある。
イテレータをそれぞれの属性を持った物として定義する事により、その
コンテナやストリームの意味を逸脱しない範囲でアクセス出来るように
なっている。
それから、長時間保持するとあるが、コンテナのメンバ関数にはイテレータ
を無効にする物があるので、保持しても無意味。
0837デフォルトの名無しさん
2005/09/24(土) 13:03:19イテレータが無効になるタイミングを把握しているのなら、
長期間保持してもいい。
イテレータとしての操作が不要であれば、
生ポインタのほうがサイズや処理効率の面で
パフォーマンスがいいこともある。
>>836
map や list などのイテレータは、
指してる要素の削除以外では無効にならないんで、
長期間保持するのはよくあることだよ。
0838デフォルトの名無しさん
2005/09/24(土) 13:09:19演算子のオーバーロードも継承される。
ただし代入演算子の場合はうまくいかない。
同じクラスの代入用 T& operator = (T const&) はクラスを定義ごとに必ず宣言される。
ユーザーが宣言しなくても、コンパイラが自動的に宣言する。
前者のケースではコンパイラが自動的に追加した宣言によって
CBase の operator = が隠れてしまっている。
0839デフォルトの名無しさん
2005/09/24(土) 13:25:25あらー、代入演算子だけはダメなんですか。
ありがとうございます。
いちいち代入演算子のオーバーライドに長々プログラム書くのはアレなので、
CBaseにInsert()という関数を作ってそれを呼ぶようにします。
void operator =(CBase* p){
insert(p);
}
>>835
失礼しました。
error C2679: 二項演算子 '=' : 型 'class Image *' の右オペランドを扱う演算子は定義されていません。(または変換できません)
でした。
0840デフォルトの名無しさん
2005/09/24(土) 13:47:41そんなことするぐらいなら、全部 Insert() 使ったほうがいいぞ。
ただ便利だからと言うだけの理由で
組み込み型と意味の違う代入演算子を作るのはよくない。
さらに、 >834 の例だと a = 0 なんてコードもコンパイルが通る。
new の戻り値を生ポインタで受け取るのも危ない。
0841デフォルトの名無しさん
2005/09/24(土) 14:18:16例えばstd::mapが赤黒木で構成されているとして、挿入後回転や二重回転
が起きてもイテレータは全部有効なのか?
insert()が挿入後の新しいイテレータを返すようになっている仕様は、そういう
意味だと思っていたが。
0842デフォルトの名無しさん
2005/09/24(土) 14:18:19>ただ便利だからと言うだけの理由で
>組み込み型と意味の違う代入演算子を作るのはよくない。
なるほど、確かにその通りですね。
じっくり考えてみます。ありがとうございます。
0843デフォルトの名無しさん
2005/09/24(土) 14:54:15なるほど。そういう感じで使い分ければいいのですか。
ありがとうございます。
>>841
ISO/IEC 14882:1998
23.1.2 Associative containers
-8-
The insert members shall not affect the validity of iterators and references to the container,
and the erase members shall invalidate only iterators and references to the erased elements.
なので>>837さんが正しいです
0844デフォルトの名無しさん
2005/09/25(日) 07:39:18やるにはTotalViewとかを導入するしかないですか?
フリーのデバッガでMPIプログラムのデバッグをやるのに
便利なツールがあれば教えて下さい。
0845デフォルトの名無しさん
2005/09/25(日) 09:42:09スレ違い。>1くらい読んでくれ。
0846デフォルトの名無しさん
2005/09/25(日) 14:31:15ありがと。
ライブラリにリンクするの忘れてた。
オレが糞なだけだったよー。
0847デフォルトの名無しさん
2005/09/25(日) 18:12:55仮想関数も基底クラスで定義したものに変わるの?
0848デフォルトの名無しさん
2005/09/25(日) 18:16:500849デフォルトの名無しさん
2005/09/25(日) 18:18:050850デフォルトの名無しさん
2005/09/25(日) 18:18:560851デフォルトの名無しさん
2005/09/25(日) 18:30:320852デフォルトの名無しさん
2005/09/25(日) 19:12:060853デフォルトの名無しさん
2005/09/25(日) 23:11:50Visual C++6.0なんですけど
struct 1_t {int s ;
int t ;
int u ;
} ;
struct 2_t {int A[N][N] ;
int B[N] ;
int C[Y] ;
int D[Y] ;
} ;
struct 3_s {struct 1_t 1_s ;
struct 2_t 2_s ;
int E[2] ;
} 3_t[V][W] ;
って感じで構造体配列をヘッダで生成して、Mainで
struct 3_s *p = 3_t ;
ってやってポインタ代入するんですが、新しい動作:
C2440エラーってのが出ます。
色々試してみると、1次元配列にするとエラーが
出ないようなのですが。
0854デフォルトの名無しさん
2005/09/25(日) 23:15:30struct 3_s *p = 3_t[0];なら代入はできるだろう
0855デフォルトの名無しさん
2005/09/25(日) 23:21:46早速の回答ありがとうございます。
試してみたところエラーは無くなりました。
以前そういう記述を読んだ記憶がわずかにあるの
ですが今手元に参考書が無いので確認できません。
とにかくありがとうございました。
0856デフォルトの名無しさん
2005/09/25(日) 23:54:22標準では、名前は非数字から始まらなくてはならないと規定されているから、そんな名前は避けること。
0857デフォルトの名無しさん
2005/09/26(月) 01:31:10struct 3_s (*p)[W] = 3_t; でもいけるだろ。こちらは二次元配列風にアクセス
できる、配列へのポインタとなる。
0858デフォルトの名無しさん
2005/09/26(月) 22:59:42皆様、いろいろご指導ありがとうございました。
mblenを使って解決いたしました。
0859デフォルトの名無しさん
2005/09/27(火) 03:22:25暗黙のキャストが行われている箇所を明示的なキャストに変更する事によって、
処理速度が遅くなるといったことはあるのでしょうか?
0860デフォルトの名無しさん
2005/09/27(火) 03:23:530861デフォルトの名無しさん
2005/09/27(火) 03:42:03暗黙のキャストを明示しただけなら、遅くなることは無い。
だが明らかに、そんなことはしないほうがいい。
0862デフォルトの名無しさん
2005/09/27(火) 03:46:140863デフォルトの名無しさん
2005/09/27(火) 03:46:59釣ってくる
0864デフォルトの名無しさん
2005/09/27(火) 03:48:50式の可読性のために明示することはあるけどね。
0865859
2005/09/27(火) 03:51:09>>861
明らかにそんなことしないほうがいいというのは、
そもそもキャストする必要がないようにコードを書き直すべき、
という意味でしょうか?
0866デフォルトの名無しさん
2005/09/27(火) 04:09:22typedef struct {
int i;
} foo;
typedef struct {
foo foo;
} bar;
gcc 3.3.5 でコンパイルしたときに下記のようなエラーが出てしまいます。
error: declaration of `foo <無名 struct>::foo'
error: changes meaning of `foo' from `typedef struct foo foo'
定義を変えずにこれを回避するにはどうすればよいのでしょうか?
(上記の定義は C のコードとして書かれたもので、私が書き換えることはできません)
書き換えることができるなら bar の定義を次のようにすれば良いのですが...
typedef struct {
foo foo_;
} bar;
0867デフォルトの名無しさん
2005/09/27(火) 08:08:260868デフォルトの名無しさん
2005/09/27(火) 08:42:04typedefを取れ。
0869デフォルトの名無しさん
2005/09/27(火) 08:43:21struct foo {
int i;
};
struct bar {
foo foo;
};
0870デフォルトの名無しさん
2005/09/27(火) 08:54:44書き換えない前提だとさ。
0871デフォルトの名無しさん
2005/09/27(火) 10:18:07そうだよ。
>>864
そんなのあるっけ?どんなとき?
0872デフォルトの名無しさん
2005/09/27(火) 10:30:16>>864じゃないけど、オーバーロードの絡む場合。たとえば、
unsigned char *addr;
std::cout << "addr = " << (void *)addr << "\n";
とか。
0873デフォルトの名無しさん
2005/09/27(火) 10:42:39それは可読性のためじゃなくて、望みの動作をさせるために必要なんだろ。
0874デフォルトの名無しさん
2005/09/27(火) 10:46:190875デフォルトの名無しさん
2005/09/27(火) 10:51:250876デフォルトの名無しさん
2005/09/27(火) 11:19:430877デフォルトの名無しさん
2005/09/27(火) 11:31:40ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
こんな話で規格がごたごたしている現状では無理だな。
0878デフォルトの名無しさん
2005/09/27(火) 11:35:16typedef struct foo {
int i;
} foo;
typedef struct {
struct foo foo;
} bar;
こういう混乱を避けるため、Cのコード書くときは
・無名の struct/unon/enum は使わない。
・struct/union/enum を省略するためだけの typedef は避ける
というガイドラインを実施したほうがよさそう。
0879デフォルトの名無しさん
2005/09/27(火) 11:37:010880デフォルトの名無しさん
2005/09/27(火) 13:24:54コンパイラ換えるか、そこだけでも C(not C++)にするか…
>>866
いずれにせよ、書き換えることができない、という前提自体が間違いなので、
お好きにすれば、としかならないなあ。
0882デフォルトの名無しさん
2005/09/27(火) 18:06:13元のヘッダをlegacy.hとして
$ cat legacy.h
#ifndef Legacy_H
#define Legacy_H
typedef struct {int i;} foo;
typedef struct {foo foo;} bar;
#endif
$ cat bar.h
#ifndef Bar_H
#define Bar_H
#ifdef __cplusplus
extern "C" {
struct bar;
struct foo;
#else
# include "legacy.h"
#endif
struct Bar {bar *bar_;};
struct Bar *init_bar (struct Bar *p);
int *access_foo_i (struct Bar *p);
#ifdef __cplusplus
}
#endif
#endif
(続く)
0883デフォルトの名無しさん
2005/09/27(火) 18:06:44#include "bar.h"
#include <malloc.h>
struct Bar *init_bar (struct Bar *p)
{
p->bar_ = (bar *)malloc (sizeof (bar));
return p;
}
int *access_foo_i (struct Bar *p)
{
return &p->bar_->foo.i;
}
$ cat test.cpp
#include <iostream>
#include "bar.h"
using namespace std;
int main ()
{
Bar b0;
init_bar (&b0);
*access_foo_i (&b0) = 10;
cout << *access_foo_i (&b0) << endl;
return 0;
}
$ gcc -c bar.c
$ g++ -o test test.cpp bar.o
$ ./test
10
でどう?
0884デフォルトの名無しさん
2005/09/27(火) 19:09:41> (上記の定義は C のコードとして書かれたもので、私が書き換えることはできません)
て書いてあるからifdef __cplusplusマクロなんぞも追加できないだろう
0886デフォルトの名無しさん
2005/09/27(火) 21:42:54ID:0……まさかと思ったが本気のつもりでこんなコードを……
まあくそみたいな前提にはそれにふさわしい例がつくという見本として……
0887デフォルトの名無しさん
2005/09/27(火) 22:26:45ID:00888デフォルトの名無しさん
2005/09/27(火) 23:03:33ライブラリかなんかなんでしょ?
くそみたいなってのには違いないけど
0889デフォルトの名無しさん
2005/09/27(火) 23:15:48つ >>880
>>888
「ライブラリかなんか」でも無条件に書き換えられないわけではあるまいに。
どっちにしてもくそみたいなもんだが。
つか、とことん無意味に前提や条件をとり違えて問題点を見失っとるわけだが。
0890866
2005/09/28(水) 00:05:44有効打はなさそうですね...
ありがとうございました。
0891デフォルトの名無しさん
2005/09/28(水) 19:07:21operatorのオーバーライドで、
int n;
CHoge c;
n = c;
という式を処理させたいのです。
どうにかintへの=をオーバーライドする術はないものでしょうか。
0892デフォルトの名無しさん
2005/09/28(水) 19:13:190893デフォルトの名無しさん
2005/09/28(水) 19:36:59お返事ありがとうございます。
ただすいません、operator int() というのがどういうものなのか分かりません。
オーバーライド系の解説サイトはロベールさんのところをはじめ、あっちこっち見たのですが。
もしよければそれについて詳しいサイトを教えていただけませんでしょうか。
0894デフォルトの名無しさん
2005/09/28(水) 19:55:030895デフォルトの名無しさん
2005/09/28(水) 20:05:31自分で検索する癖を付けろ
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csref/html/vcwlkuser-definedconversionstutorial.asp
0896デフォルトの名無しさん
2005/09/28(水) 20:08:070897デフォルトの名無しさん
2005/09/28(水) 20:09:20続けるなら初心者スレへどうぞ。
0898デフォルトの名無しさん
2005/09/28(水) 20:13:140899デフォルトの名無しさん
2005/09/29(木) 06:00:300900デフォルトの名無しさん
2005/09/29(木) 15:00:22ttp://www1.kcn.ne.jp/~robe/
0901デバッグ生活6週間目
2005/09/30(金) 14:19:11考察の足りない小手先の修正をして事態を悪化させることがある。
最近デバッグ中に、某ソフトウェア・ハウスへ数年前に外注したコード中で
この例の反面教師となるようなダメかつ姑息なコードを見つけて
唖然としたので晒しておく。
まずは背景解説。
class A {
public:
A(void) {;}
//...(omit)
virtual void v(void)=0;
//pure virtual function
};
class D : public A {
D(void) : A() {v();}
// pure virtual function is called!
//...(omit)
void v(void) {/* anything */;}
};
こういうコードはC++では実行結果が不定になる。
(分かりやすく言うと書いちゃだめ。)
仮想関数のセットアップはコンストラクタの実行の
どの段階で行われるか規格は敢えて厳密には決めていないからだ。
仮想関数をコンストラクタ中で呼び出すことはそもそも微妙だが、
特に純粋仮想関数の場合は深刻で、結果は不定だと明示されている。
気の利いたコンパイラなら上掲のコードについてエラーを報告するだろう。
(余談だがJavaのコンストラクタは根本的にC++と動作が違うのでOK。)
0902& ◆uJ1hK4x8zw
2005/09/30(金) 14:20:21で、エラーを出されたからといってその意味を深く考えないで:
class A {
public:
A(void) {;}
//...(omit)
virtual void v(void)={throw new NotCallException();}
//Non pure virtual function in the appearance only.
};
とかやって見かけ上だけ小手先で回避しようとするのはよくない。
本当に仮想関数をコンストラクタ内で呼び出す必要があるのかどうか、
もしあるならどういうタイミングでどの関数が呼び出されるか
じっくり考えてみるべきだ。
0903デバッグ生活6週間目
2005/09/30(金) 14:22:14まして:
class A {
public:
A(void) {;}
//...(omit)
virtual void v(void)=0;
//pure virtual function
protected:
void bypass(A* a) {a->v();}
};
class D : public A {
D(void) : A() {bypass(this);}
// Ooops!! pure virtual function is called!
//...(omit)
void v(void) {/* anything */;}
};
などとやってコンパイラを出し抜こうと考えるのは
以ての外である。
これはコンパイラが検出可能だったシンプルな問題を
ロジックをスパゲティ化することで
コンパイラにも人間にも
見つけにくい実行時エラーに変えて
隠蔽したに過ぎない最低のコードになる。
0904& ◆uJ1hK4x8zw
2005/09/30(金) 14:26:38以上、こういうコードは真似しないようにしようというお話。
以下これを見つけた私がどう思ったかは愚痴スレでw
ぐち0x12 〜底なし沼はなお深く〜
http://pc8.2ch.net/test/read.cgi/prog/1116475364/
0905デフォルトの名無しさん
2005/09/30(金) 17:38:480906デフォルトの名無しさん
2005/09/30(金) 18:13:12誘導される前に自己誘導&自粛したってことで。
0907デフォルトの名無しさん
2005/09/30(金) 20:44:40自分で分かるような事を偉そうに書いただけになるんだが。
0908デフォルトの名無しさん
2005/09/30(金) 23:10:120909デフォルトの名無しさん
2005/10/01(土) 00:48:25全部自作自演って落ちなんだろ?
0910デフォルトの名無しさん
2005/10/01(土) 05:52:26コンストラクタ内で仮想関数を呼び出したときの動作については
規格中に記述があるよ。 12.7.3 がそう。
D(void) : A() {v();}
ここでは D::v() が呼び出される。
そして D::v() は純粋仮想関数では無いので、
呼び出し自体に問題は無い。
偉そうな長文が間抜けだな。
0911デフォルトの名無しさん
2005/10/01(土) 17:16:300912デフォルトの名無しさん
2005/10/02(日) 02:05:03typedef void(*ClassName::Func)();
Func* f;
のFunc*をtypedefを使わずに定義したいんです。
単なるメンバ関数のポインタなら
void(ClassName::*f)();
でいいんですが....
0913デフォルトの名無しさん
2005/10/02(日) 02:09:44みずらくなるからやめれ
0914デフォルトの名無しさん
2005/10/02(日) 05:03:17これを数字として扱って加減乗除するにはどうすればいいですか?
0915デフォルトの名無しさん
2005/10/02(日) 07:33:08std::string s = "2.5";
double x;
std::sscanf(s.c_str(), "%lf", & x);
0916デフォルトの名無しさん
2005/10/02(日) 07:44:26いい加減Cの呪縛から逃れろ。
>>914
boost::lexical_cast<double>(str)を使うか、std::stringstream s(str); s >> d;
などどやる。
0917デフォルトの名無しさん
2005/10/02(日) 08:42:15C流でやるならせめてstd::atof(s.c_str())にしてくれ。
0918デフォルトの名無しさん
2005/10/02(日) 09:31:40俺もそのままtypedef使えとは思うが、こういう手段を知っていても損はないと思う。
#include <iostream>
#include <typeinfo>
class ClassName {};
typedef void (*ClassName::Func)();
int main()
{
std::cout << typeid (Func *).name() << std::endl;
}
0919デフォルトの名無しさん
2005/10/02(日) 09:54:02C++は両方とも糞重いのが難点
まあlexical_castも中でstringstream使ってるから当たり前だけど。
0921デフォルトの名無しさん
2005/10/02(日) 10:50:130922デフォルトの名無しさん
2005/10/02(日) 10:51:290923デフォルトの名無しさん
2005/10/02(日) 11:24:32sscanfは使わないけど。。
0924デフォルトの名無しさん
2005/10/02(日) 18:06:18配列で一気に確保するのと、ちまちま一つずつnewしていくのでは、どちらが確実なのでしょうか。
速さは問いません。
配列の方が無駄が無さそうですが、
素人目にはしかし、連続したメモリ空間が無いと失敗しちゃいそうなイメージがあります。
0925デフォルトの名無しさん
2005/10/02(日) 18:13:54どっちかと言うと、ちまちま一つずつのほうが成功しやすいだろうな。
ページングの効く環境であれば、物理メモリの
フラグメンテーションによる危険性はほとんど無視できるんで、
あんまり差は無いと思うよ。
0926デフォルトの名無しさん
2005/10/02(日) 18:29:15単に好みとしてC++の標準ライブラリだけを使いたくなるものジャン。
でもC++でatoiみたいなことするにはstrstreamに対して<<とか使うんでそ?めんどい
0927デフォルトの名無しさん
2005/10/02(日) 18:31:22じゃあなんでstdネームスペースがあるんだよって言いたくなる
0928デフォルトの名無しさん
2005/10/02(日) 18:38:07The return value is 0 if the input cannot be converted to a value of that type.
だれじゃこんな糞仕様にしたのは
0929デフォルトの名無しさん
2005/10/02(日) 18:41:210930デフォルトの名無しさん
2005/10/02(日) 18:42:060932デフォルトの名無しさん
2005/10/02(日) 19:25:070933デフォルトの名無しさん
2005/10/02(日) 19:39:43少なくともJIS X3014:2003では<c〜>もその他のヘッダも全く同列に扱われている。
もっとも<c〜>のほとんどはCの<〜.h>と同じと書かれているが。
0934デフォルトの名無しさん
2005/10/02(日) 19:43:09そんでもってstrstreamはほかとは別扱いで附属書D 互換性に載せられている。
0935デフォルトの名無しさん
2005/10/02(日) 20:19:020936デフォルトの名無しさん
2005/10/02(日) 20:31:15文句があるなら>930。
私ゃ妥当な仕様だと思うがね。
0937デフォルトの名無しさん
2005/10/02(日) 23:44:16標準規格が決まっていて、strstreamは使わないでください、みたいな
事が書いてあったな。でもこれを使ってるプログラムはたくさんあるわけで、
過去との互換性に残すんでしょ?
0938デフォルトの名無しさん
2005/10/02(日) 23:47:09んだからstrstreamを使ってるプログラムはほとんどないんじゃない?
0939デフォルトの名無しさん
2005/10/02(日) 23:52:020940デフォルトの名無しさん
2005/10/03(月) 00:01:27ISO/IEC 1482:1998の通り、標準規格が決まったのは1998年の事で、C++自体は
1985年頃からあるわけで、その13年間でdeprecatedなプログラムが書かれた可能性
はどうかな?
あ、そうか、STLそのものは1993年にC++への組み込みが提案され、1994年に正式
に取り入れられる事が決まったので、たった4年ほどしかstd::strstreamを安心して
使える時期はなかったんだね。
0941デフォルトの名無しさん
2005/10/03(月) 11:34:47その動作は10年前から知ってる。
…だからわざわざ絶対にまずい純粋仮想関数の場合と分けて
「微妙だ」と書いたんだが。
仮想関数がコンストラクタ内でだけは通常のようなオブジェクトの動的な型ではなく、
静的な型に従って呼び出されるというのは決して直感的に分かりやすい動作とは思えない。
(その呼び出しそのものは確かに動作として安全ではあっても、
その仮想関数からさらに仮想関数が呼ばれたりRTTIが利用されたりした場合の
動的な型と静的な型がどうなっているか考えると頭が痛くならないか?
多分このようにコンストラクタ内でだけ仮想関数の動作が「特別扱い」される仕様は
古いC++コードとの互換性のために残ってしまった仕様ではないかと思う。
そしてこの微妙な仕様のせいで純粋仮想関数をコンストラクタ内で呼ぶのは
呼ぶ相手がなくなるために具合が悪いわけだ。
純粋仮想関数のほうが歴史的には後でできた仕様だったからこうなったのだろうが。)
・・・なので絶対に必要なとき以外はやはり書かないに越したことはにと思うのだ。
(もっともその「絶対に必要な例」は中々思いつけないが。)
というわけで例に挙げたコードのように論理的には純粋仮想関数であるべきものを
コンパイルエラー回避目的でエラー例外を投げる仮想関数に書き換えるのは
決して必要に迫られて熟慮した結果というよりはやっぱり性質の悪い小手先の誤魔化しだと思う。
0943デフォルトの名無しさん
2005/10/03(月) 12:47:27>こういうコードはC++では実行結果が不定になる。
>(分かりやすく言うと書いちゃだめ。)
>仮想関数のセットアップはコンストラクタの実行の
>どの段階で行われるか規格は敢えて厳密には決めていないからだ。
>仮想関数をコンストラクタ中で呼び出すことはそもそも微妙だが、
>特に純粋仮想関数の場合は深刻で、結果は不定だと明示されている。
>気の利いたコンパイラなら上掲のコードについてエラーを報告するだろう。
・初心者も読むスレッドでこういう嘘を平気で書き、なおかつ指摘されても訂正もしない
・他人のミスとも言えないようなミスはことさらに(誤りを含んだ)長文で指摘する
・しかも多分スレ違い。
0944デフォルトの名無しさん
2005/10/03(月) 12:57:50たぶん、得意げになりたかっただけだろ。
スルーで勘弁してやってくれ。
0945デフォルトの名無しさん
2005/10/03(月) 13:43:37恥をかきたくなかったら、最低でも、規格書のどこを読めば
そんな動作をするか、リファレンス先を書いておけ。
ま、この場合完全な嘘だから、リファレンス先などありはしないがな。
0946デフォルトの名無しさん
2005/10/03(月) 14:39:13D&E読め。
コンストラクタで仮想関数呼び出しでは派生クラスでオーバーライドしたほうの関数が呼ばれない理由がちゃんと書いてある。
ようするに派生クラスでオーバーライドした仮想関数の実装が
その派生クラスのコンストラクタが行われていることに依存していたら、
派生クラスのコンストラクタが呼ばれる前(== 基底クラスのコンストラクタの中)で、
派生クラスでオーバーライドされた仮想関数が呼ばれたらまずいことになる、
だからはコンストラクタでの仮想関数呼び出しでは派生クラスでオーバーライドした関数は呼ばれない仕様にしたと書いてある。
0947デフォルトの名無しさん
2005/10/04(火) 00:53:48この動作がいかに(マシンにとって)自然であるか理解していないのなら、
10年もの間、誤解していたことになるな。
0948デフォルトの名無しさん
2005/10/04(火) 00:57:100949デフォルトの名無しさん
2005/10/04(火) 01:27:040950デフォルトの名無しさん
2005/10/04(火) 01:44:150951デフォルトの名無しさん
2005/10/04(火) 03:12:060952デフォルトの名無しさん
2005/10/04(火) 03:31:200953デフォルトの名無しさん
2005/10/04(火) 08:32:320954デフォルトの名無しさん
2005/10/04(火) 11:12:110955デフォルトの名無しさん
2005/10/04(火) 17:54:10俺はもう長くは無いだろう
まで読んだ
0956デフォルトの名無しさん
2005/10/04(火) 18:38:450957デフォルトの名無しさん
2005/10/04(火) 18:42:410958namahage
2005/10/04(火) 20:55:240959デフォルトの名無しさん
2005/10/04(火) 21:07:370960デフォルトの名無しさん
2005/10/04(火) 21:21:57別のとこで答えて損した。
0961950
2005/10/05(水) 00:08:400962デフォルトの名無しさん
2005/10/05(水) 00:40:190963950
2005/10/05(水) 02:52:590964デフォルトの名無しさん
2005/10/05(水) 07:31:330965デフォルトの名無しさん
2005/10/05(水) 20:20:490966デフォルトの名無しさん
2005/10/05(水) 21:01:39立てた
C++相談室 part44
http://pc8.2ch.net/test/read.cgi/tech/1128512737/
0967デフォルトの名無しさん
2005/10/06(木) 01:00:48乙
0968デフォルトの名無しさん
2005/10/06(木) 01:08:07相手が違うw
0969デフォルトの名無しさん
2005/10/06(木) 01:15:07乙
0970デフォルトの名無しさん
2005/10/06(木) 04:44:46そんなに感謝されたいのか。
>>967
乙
0971デフォルトの名無しさん
2005/10/06(木) 09:01:21乙
0972デフォルトの名無しさん
2005/10/06(木) 15:20:030973デフォルトの名無しさん
2005/10/06(木) 16:01:110974デフォルトの名無しさん
2005/10/06(木) 17:41:090975デフォルトの名無しさん
2005/10/06(木) 17:44:320976デフォルトの名無しさん
2005/10/06(木) 17:45:31誰もソース読もうとしない
さみしい
凄いですね、オブジェクト指向ですねっておまえらバカにしてるだろ……
0977デフォルトの名無しさん
2005/10/06(木) 18:12:24これ実行したらどうなるの?
0978デフォルトの名無しさん
2005/10/06(木) 18:15:440979デフォルトの名無しさん
2005/10/06(木) 18:16:210980デフォルトの名無しさん
2005/10/06(木) 18:25:190981デフォルトの名無しさん
2005/10/06(木) 18:27:050982デフォルトの名無しさん
2005/10/06(木) 20:42:330983デフォルトの名無しさん
2005/10/06(木) 20:45:300984デフォルトの名無しさん
2005/10/06(木) 20:46:23983を職安に連れて行くぞ!
0985デフォルトの名無しさん
2005/10/06(木) 20:52:360986デフォルトの名無しさん
2005/10/06(木) 20:53:52一緒にこたちょの実況やろうぜ!
0987デフォルトの名無しさん
2005/10/06(木) 20:54:030988デフォルトの名無しさん
2005/10/06(木) 21:52:570989デフォルトの名無しさん
2005/10/06(木) 23:14:530990デフォルトの名無しさん
2005/10/06(木) 23:25:200991デフォルトの名無しさん
2005/10/06(木) 23:32:040992デフォルトの名無しさん
2005/10/06(木) 23:44:200993デフォルトの名無しさん
2005/10/06(木) 23:53:07http://pc8.2ch.net/test/read.cgi/tech/1128512737/l50
一応張っておく。
0994デフォルトの名無しさん
2005/10/07(金) 00:26:520995デフォルトの名無しさん
2005/10/07(金) 00:27:390996デフォルトの名無しさん
2005/10/07(金) 00:27:560997デフォルトの名無しさん
2005/10/07(金) 00:32:510998デフォルトの名無しさん
2005/10/07(金) 00:35:410999デフォルトの名無しさん
2005/10/07(金) 00:39:021000デフォルトの名無しさん
2005/10/07(金) 00:42:12頭の上にマッサージ器あてて死ぬほどナデナデしたら
「ファー…ブルスコ…ファー…ブルスコ…ファ-」ってなった。
最初は面白かったんだけど、なんかキモくなったので首元を横から思い切りチョップしたら
「モルスァ」みたいなこと言いながらすごい勢いで飛んで行った。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。