C++相談室 part58
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001v(^・^)v
2007/09/26(水) 03:41:13ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>2-15 付近参照
前スレ(実質 part57)
C++相談室 part56
http://pc11.2ch.net/test/read.cgi/tech/1185377587/
0002v(^・^)v
2007/09/26(水) 03:41:45[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003v(^・^)v
2007/09/26(水) 03:42:22amazon.com C, C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
C++ Coding Standards
ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
0004v(^・^)v
2007/09/26(水) 03:42:53Effective 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/
0005v(^・^)v
2007/09/26(水) 03:44:42[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache STDCXX http://incubator.apache.org/stdcxx/
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://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0006v(^・^)v
2007/09/26(水) 03:45:132 ttp://pc.2ch.net/tech/kako/996/996640937.html
3 ttp://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 ttp://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 ttp://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 ttp://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 ttp://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 ttp://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 ttp://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 ttp://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 ttp://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 ttp://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 ttp://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 ttp://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 ttp://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
16 ttp://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 ttp://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 ttp://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 ttp://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 ttp://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 ttp://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 ttp://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 ttp://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 ttp://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 ttp://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 ttp://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 ttp://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 ttp://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 ttp://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 ttp://pc5.2ch.net/test/read.cgi/tech/1084030770/
0007デフォルトの名無しさん
2007/09/26(水) 03:57:30(すた☆らき)
 ̄ ̄\| ̄
http://www.freewebs.com/premiumtv/?X3/?STV=%E3%82%89%E3%81%8D+%E3%81%99%E3%81%9F
0008v(^・^)v
2007/09/26(水) 04:08:1132 ttp://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 ttp://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 ttp://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 ttp://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 ttp://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 ttp://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 ttp://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 ttp://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) ttp://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) ttp://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) ttp://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 ttp://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 ttp://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 ttp://pc8.2ch.net/test/read.cgi/tech/1133007604/
46 ttp://pc8.2ch.net/test/read.cgi/tech/1136690107/
47 ttp://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 ttp://pc8.2ch.net/test/read.cgi/tech/1142423595/
49 ttp://pc8.2ch.net/test/read.cgi/tech/1146185570/
50 ttp://pc8.2ch.net/test/read.cgi/tech/1149427282/
51 ttp://pc8.2ch.net/test/read.cgi/tech/1153079297/
52 ttp://pc8.2ch.net/test/read.cgi/tech/1156525695/
53 ttp://pc11.2ch.net/test/read.cgi/tech/1159340181/
54 ttp://pc11.2ch.net/test/read.cgi/tech/1162215248/
55 ttp://pc11.2ch.net/test/read.cgi/tech/1164951094/
56 ttp://pc11.2ch.net/test/read.cgi/tech/1170343752/
56 (実質57) ttp://pc11.2ch.net/test/read.cgi/tech/1170343752/
0009v(^・^)v
2007/09/26(水) 04:08:43多すぎ。とりあえずスレタイ C++ で検索して。
以下、スレタイで見付からなさそうな関連スレ。
Boostを語れゴラァ part4
http://pc11.2ch.net/test/read.cgi/tech/1175663346/l50
GCCについて part7
http://pc11.2ch.net/test/read.cgi/tech/1145357824/l50
Cygwin + MinGW + GCC 相談室 Part 3
http://pc11.2ch.net/test/read.cgi/tech/1177944767/l50
0010v(^・^)v
2007/09/26(水) 04:10:150011デフォルトの名無しさん
2007/09/26(水) 04:38:060012デフォルトの名無しさん
2007/09/26(水) 04:38:46で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
0013デフォルトの名無しさん
2007/09/26(水) 07:30:25環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0014デフォルトの名無しさん
2007/09/26(水) 07:31:09とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0015デフォルトの名無しさん
2007/09/26(水) 10:56:040016デフォルトの名無しさん
2007/09/26(水) 11:17:020017デフォルトの名無しさん
2007/09/26(水) 11:35:060018デフォルトの名無しさん
2007/09/26(水) 12:00:4610M超えたりするんでしょうか?
0019デフォルトの名無しさん
2007/09/26(水) 12:07:370020デフォルトの名無しさん
2007/09/26(水) 12:15:08今作ってるものがboostをヴァリヴァリに使っているので
それと比較すればどれぐらいバイナリサイズは肥大するのかがちょっと気になります
0021デフォルトの名無しさん
2007/09/26(水) 12:25:320022デフォルトの名無しさん
2007/09/26(水) 12:28:210023デフォルトの名無しさん
2007/09/26(水) 12:33:21>827 名前:デフォルトの名無しさん 投稿日:2007/09/22(土) 23:20:47
>emacsでc++開発をするときの環境に関するサイトってないでしょうか?
flymake
http://d.hatena.ne.jp/pyopyopyo/20070715/p1
0024デフォルトの名無しさん
2007/09/26(水) 19:15:43何そのトートロジー
0025デフォルトの名無しさん
2007/09/26(水) 20:27:10ポインタを固定して表示させる処理とポインタを変化させて表示させる処理の2つ作成しなさい
この内容がわからないので教えて下さいお願い致します
0026デフォルトの名無しさん
2007/09/26(水) 20:31:330027デフォルトの名無しさん
2007/09/26(水) 21:52:110028デフォルトの名無しさん
2007/09/27(木) 00:22:22有用なサイトを手っ取り早く見つける方法...
それはテンプレを見ることだ。
0029デフォルトの名無しさん
2007/09/27(木) 00:22:33int i = 0;
while(*p++ != 999) std::cout << *p << std::endl;
while(*(p + i) != 999) std::cout << *(p + i) << std::endl;
0030デフォルトの名無しさん
2007/09/27(木) 01:55:532つ目のループ前にpを初期化しないといけない
0031デフォルトの名無しさん
2007/09/27(木) 09:48:490032デフォルトの名無しさん
2007/09/27(木) 10:00:160033デフォルトの名無しさん
2007/09/27(木) 10:00:50boost/regex.hpp
0034デフォルトの名無しさん
2007/09/27(木) 10:25:060035デフォルトの名無しさん
2007/09/27(木) 10:57:19て定義すると蹴られるんだけど、なんでかわかる人いますか?
0036デフォルトの名無しさん
2007/09/27(木) 11:09:590037デフォルトの名無しさん
2007/09/27(木) 11:14:19Hoge1クラス:メインウィンドウになるクラス
Hoge2クラス:継承元となるウィンドウを持ったクラス
Hoge3クラス:Hoge2クラスを継承したクラスでHoge1ウィンドウのボタンを押したときに表示されるウィンドウを持ったクラス
Hoge2クラスはWinProcをstaticでクラス内に入れています。クラスの登録やウィンドウを生成する関数はprivateとして存在します。
Hoge3クラスも同じような構成です。
で、Hoge3クラスで不用なメッセージ処理はHoge2のウィンドウクラスに回してやりたいのですが、
その方法がいまいちわかりません。手順・・がいまいちです。
Hoge3クラスの登録をする前に、Hoge2クラスのウィンドウを登録する必要があると思い、
WNDCLASSEXを使ってウィンドウの登録をする?と思いきや、横取りするHoge2にあるプロシージャとかも指定しないといけないわけですよね?
でもこの段階だと、Hoge2クラスの存在すら誰も知らないわけで・・・この辺りがよくわかりません。
ボタンのスーパークラス化と同じようなイメージでいるのですが、ボタンの場合は
ウィンドウズが予めその存在を認識しているからGetClassInfoExを使って情報を取得する
ことができますが、自作ウィンドウクラスの場合はそれができなくて・・・
0038デフォルトの名無しさん
2007/09/27(木) 11:16:33俺のエスパー能力が、環境がx86なPCであると言っている。
さらに、かなりの確率でWindowsであると言っている。
さらに、俺のエスパー能力はこう言っている。
コンパイラ「スタック足りねーよボケッ!」
ttp://www.google.com/search?&q=8+*+3000+*+3000+byte
0039デフォルトの名無しさん
2007/09/27(木) 12:15:58配列が大きすぎてスタック領域が足りてない。と思われる。
巨大な配列を宣言するときは new するか static にするべき
0040デフォルトの名無しさん
2007/09/27(木) 12:28:43そのかわり実行時にスタックオーバーフロー
そういうオプションでもあるの?
0041デフォルトの名無しさん
2007/09/27(木) 12:34:20誰に蹴られるって?
0042デフォルトの名無しさん
2007/09/27(木) 12:38:23金色のファルコ
0043デフォルトの名無しさん
2007/09/27(木) 21:58:29必要ないのに無駄にnewなんか使うなよ。
どうしてもSTLは使いこなせないってことなら話は別だが。
0044デフォルトの名無しさん
2007/09/27(木) 21:59:281. 静的メンバ関数となっているHoge2のウィンドウプロシージャから
仮想関数にしたウィンドウプロシージャを呼ぶようにして、
Hoge3でそれをオーバーライドする。
Hoge3では新たなウィンドウクラスを登録しない。
2. Hoge2のWinProcをprotectedにして、Hoge3のウィンドウプロシージャでは、
DefWindowProcの代わりにHoge2::WinProcを呼ぶようにする。
Hoge3では新たなウィンドウクラスを登録する必要がある。
俺は1をよくやる。2こそはスーパークラス化だな。
ウィンドウプロシージャの仮想関数化はここが参考になる。
http://techtips.belution.com/ja/vc/0009/
http://www.google.com/search?q=cache:http://techtips.belution.com/ja/vc/0009/
0045デフォルトの名無しさん
2007/09/28(金) 00:17:35スタックじゃサイズ足らないって理由だけでnewすんのもSTL使うのも大差ないだろ
004637
2007/09/28(金) 01:30:59そこは何度も見てるのですが・・・。そこに書いてあるクラスは、
それを継承させると簡単にサブクラス化できたり元に戻せたりする
クラスってことですよね?
0047デフォルトの名無しさん
2007/09/28(金) 02:05:57>で、Hoge3クラスで不用なメッセージ処理はHoge2のウィンドウクラスに回してやりたいのですが、
>その方法がいまいちわかりません。手順・・がいまいちです。
Hoge3 クラスは Hoge2 クラスを継承してるんだから、ただ単に継承元クラスのメンバ関数を呼ぶだけでいいのでは
ムダに難しいこと考えてない?
Windows に登録するウィンドウクラスと C++ のクラスが一致してる必要はないよ
C++ のクラスを継承してるからってウィンドウクラスをスーパークラス化したりサブクラス化したりする必要はない
0048デフォルトの名無しさん
2007/09/28(金) 07:38:080049デフォルトの名無しさん
2007/09/28(金) 08:10:150050デフォルトの名無しさん
2007/09/28(金) 09:32:02大差なくはない。vector使え。
例外安全な上に組込配列よりずっと便利だ。
0051デフォルトの名無しさん
2007/09/28(金) 10:11:224
16
256
65536
4294967296 * sizeof(double) = 8589934592b = 8192MB
0052デフォルトの名無しさん
2007/09/28(金) 10:15:48005337
2007/09/28(金) 10:45:46「ウィンドウ作成データとして、CWinBase クラスの派生クラス CxxxWnd オブジェクトを指定することを忘れないで下さい。」
が、何を指しているのかわからないです。どこにCxxxWnd オブジェクトを指定するのでしょう?
005437
2007/09/28(金) 10:50:39しろとあるけど、指定するものを自分自身のWinProcを指定してやり
Attachを呼べばいいのかな?
0055デフォルトの名無しさん
2007/09/28(金) 11:00:24それは、CreateWindowExの最後の引数。
CxxxWnd wnd;
CreateWindowEx(..., &wnd);
こういう感じ。CreateWindow(Ex)の引数は
WM_CREATEまたはWM_NCCRAETEでCRATESTRUCTとして全て参照できる。
いつもこうしなければならないだから、
CreateWindowExもクラスのメンバにしてこの処理はしばしば隠蔽される。
そろそろスレ違いが近付いているぞ。
005637
2007/09/28(金) 11:29:40今そこ調べてました・・・
ttp://nomina.petit-archives.mydns.jp/tests/old/gecko012/nmnConsoleControl.cpp
ttp://www7a.biglobe.ne.jp/~lshen/EternalWindows/WinBase/Window/Window08.html
>>そろそろスレ違いが近付いているぞ。
もうすこし付き合ってください・・
その最後の引数に&wndを渡して自身のメンバ変数や関数にアクセス
する場合、が微妙です。
WM_CREATEで
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam
というところはOKです。ここから自分のメンバにアクセスする方法が
いまいちです。
0057デフォルトの名無しさん
2007/09/28(金) 11:33:18005837
2007/09/28(金) 11:33:38pWnd = (Hoge3*)(((CREATESTRUCT*)lp)->lpCreateParams);
こんな感じか?な?
0059デフォルトの名無しさん
2007/09/28(金) 11:36:24006037
2007/09/28(金) 11:37:44できますた。ありがとうございます!
あとは54なんですが・・・これがまた・・・orz
0061デフォルトの名無しさん
2007/09/28(金) 11:38:160062デフォルトの名無しさん
2007/09/28(金) 11:42:22Win32API質問箱 Build57
http://pc11.2ch.net/test/read.cgi/tech/1189255282/
0063デフォルトの名無しさん
2007/09/28(金) 12:11:35そこでstaticはやめとけ。
>>60
Hoge2::WinProcに相当するのが、44の指したページで言うCWndBase::WindowMapProc。
006437
2007/09/28(金) 12:38:27public:
BOOL InitInstance( HINSTANCE hInstance );
private:
//オーバーライドしたWndProc
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
};
使うとき、
Hoge hoge;
hoge.InitInstance(hInstance);
InitInstanceの中ではウィンドウの登録、作成をする
WNDCLASSEX wcex;
:
wcex.lpfnWndProc = (WNDPROC)BaseWnd::WindowMapProc;//WndProc;
:
RegisterClassEx(&wcex);
で、CreateWindowする。最後の引数はthisを渡す。
こうすると、メッセージは、まずWindowMapProcで処理されて、
BaseWndのWndProcへ飛んできます。が、オーバーライドした自分のWndProcには飛んでこない
です。CreateWindow後のAttachとか呼んでみたのですが、変わらずです。
なんか、おしい気がするのですが、ぜんぜんですかね?
0065デフォルトの名無しさん
2007/09/28(金) 12:43:20それでオーバーライドになってると思ってるのか?
0066デフォルトの名無しさん
2007/09/28(金) 12:48:3244のページを良く見ろ。
WindowMapProcはstaticで、WndProcはvirtualだ。
静的メンバ関数で多態的なオーバーライドは不可能だ。
0067デフォルトの名無しさん
2007/09/28(金) 12:49:18006837
2007/09/28(金) 13:29:59ばかり気にしてたので、普通につけちゃいました。
で、取ったらコンパイラ エラー C2555が出て、「そんなの聞いてませんが何か?」
とか思いつつ、調べること数分、どうにかメッセージを受信するとこまで
できたようです。
今は、慣れてないのにいろんなことやってしまった(気でいる)ので、
これから1つ1つ整理して、ちゃんとしたものを作っていきます。
みなさまありがとうございました。
0069デフォルトの名無しさん
2007/09/28(金) 14:22:210070デフォルトの名無しさん
2007/09/28(金) 14:33:430071デフォルトの名無しさん
2007/09/28(金) 15:26:420072デフォルトの名無しさん
2007/09/29(土) 08:31:08int a[10];
public:
}
0073デフォルトの名無しさん
2007/09/29(土) 08:34:44class A{
int a[10];
public:
int *get_a(){return a;}
}
int main(){
int *p;
p = get_a();
for(int i = 0; i < 10; i++){
p[i] = ...
... = p[i];
}
return 0;
}
このようなコードってカプセル化を壊してますか?
0074デフォルトの名無しさん
2007/09/29(土) 08:40:45007573
2007/09/29(土) 08:45:150076デフォルトの名無しさん
2007/09/29(土) 08:48:460077デフォルトの名無しさん
2007/09/29(土) 10:23:230078デフォルトの名無しさん
2007/09/29(土) 12:03:520079デフォルトの名無しさん
2007/09/29(土) 12:37:280080デフォルトの名無しさん
2007/09/29(土) 17:31:27int get_a( int i ){return a[i];}
0081デフォルトの名無しさん
2007/09/29(土) 21:08:110082デフォルトの名無しさん
2007/09/29(土) 21:12:06int& get_a(int i) { return a[i]; }
int get_a(int i) const { return a[i]; }
0083デフォルトの名無しさん
2007/09/29(土) 21:22:130084デフォルトの名無しさん
2007/09/29(土) 21:44:16っっていうか全部ネタだろ。
0085デフォルトの名無しさん
2007/09/29(土) 23:56:290086デフォルトの名無しさん
2007/09/29(土) 23:58:29流れ嫁よ
0087デフォルトの名無しさん
2007/09/30(日) 08:55:39class hoge {
public:
virtual double CalcF1(Double_t r) const throw(std::exception);
}
hoge.cxxの中で
double hoge::CalcdF1dr(Double_t r) const throw(std::exception)
{
}
としてるんだけど、g++でcompileしようとすると
src/hoge.cxx: In member function 'virtual double hoge::CalcdF1dr(Double_t) const':
src/hoge.cxx:87: error: expected primary-expression before ';' token
と怒られます。どこが書き方間違ってるんでしょうか。
0088デフォルトの名無しさん
2007/09/30(日) 08:56:33class hoge {
public:
virtual double CalcdF1dr(Double_t r) const throw(std::exception);
}
でした。
0089デフォルトの名無しさん
2007/09/30(日) 08:57:57スルーして下さい。
0090デフォルトの名無しさん
2007/09/30(日) 18:33:43VC2005でリンクすることは不可能なんですか?
0091デフォルトの名無しさん
2007/09/30(日) 20:19:13class X {
template<typename T> class Y {};
template<> class Y<int> {};
};
のようなコードは、VC++(2003/2005)ではコンパイルできますが、g++3/4では
error: explicit specialization in non-namespace scope ‘class X’ というエラー
になってしまいます。
Y<int>をXの中ではなく、名前空間スコープで
template<> class X::Y<int> {};
と書けばg++でもVC++でも問題なく特殊化できることは知っているのですが、
なんとかg++で、特殊化されたクラスの定義をXの中に書く方法はないでしょうか?
Y<T>とY<int>の定義が離れた場所にあると、コードが読みにくいと思うのです。
boost(特にmpl)の使用は歓迎です。
よろしくおねがいします。
0092デフォルトの名無しさん
2007/09/30(日) 20:27:59クラス末尾にセミコロンがありませんでした。ごめんなさい。
とちゃんと書こうYO!
0093デフォルトの名無しさん
2007/09/30(日) 20:42:48定義位置を近づけたいなら、両方クラス外に書けばいいんじゃね?
009491
2007/09/30(日) 20:45:33ああ、たしかにそうですね。他に案がなければそうしたいとおもいます。
ただ、Y<T>とY<int>を両方クラス内に書けると、宣言と定義の位置も離れない(定義だけになる)ので、
より読みやすいと思っています。
というわけで、引き続きお願いします。
0095デフォルトの名無しさん
2007/09/30(日) 20:54:22規格ではネストされたクラス内での明示的特殊化は禁止されているけど
部分特殊化はOKなので、
class X {
template <typename T, class U = void> class Y {};
template <typename T>
class Y< T
, typename boost::enable_if<
typename boost::is_same< T, int>
> > {};
};
のようにenable_ifとis_sameを使って書くといいっぽい(初心者スレから一部拝借w)
VCでコンパイル可能なのはmsの独自拡張でgccの方が正しいとのこと
009691
2007/09/30(日) 20:57:38(下記の2行めがエラーになる)、
class X {
template<typename T> void foo(T x) {}
template<> void foo<int>(int x) {} // error
};
下記方法でごまかしています。
#include <boost/type.hpp>
class X {
void foo_(int x, boost::type<int>) { /* specialized */ }
template<typename T> void foo_(T x, ...) {}
public:
template<typename T> void foo(T x) { foo_(x, boost::type<T>()) ;}
};
0098デフォルトの名無しさん
2007/09/30(日) 21:00:46私はC++初心者ですが、>>93さんと同意見です。
>>95さんの言うようにgccの方が正しい(つまり規格どおりということですよね)ならば、
なおさらそう思います。
それに、Xクラスの定義を見たいときには、むしろYは外にあった方が見やすいのではないでしょうか?
0099デフォルトの名無しさん
2007/09/30(日) 21:06:58この手法も名前があったと思うけど思い出せない
使うなら適当にローカルなメタ関数を専用の名前空間に自作して階層を浅くする工夫が必要だね
使ってればわかるけど、凄く見にくくなるから
0100デフォルトの名無しさん
2007/09/30(日) 21:10:120101デフォルトの名無しさん
2007/09/30(日) 21:43:54>>99 名前があるならソレをコメントに書いておけば良いかも。
0102デフォルトの名無しさん
2007/09/30(日) 22:00:44読みやすいかどうかは読み手にもよるし、あまり>>91や>>94はよい聞きかたではなかったですね。
C++のコードを自動生成するツール(自作)の都合でX内に定義を書けると嬉しい、というのが実際の事情です。
0104デフォルトの名無しさん
2007/09/30(日) 23:06:47> あ、::type付けわすれた…
検索エンジン経由で来るひとのために、一応訂正版貼っときますね。
#include <cstdio>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
struct X {
template<typename T, typename U = void> struct Y {
Y() { std::printf("genecic\n"); }
};
template<typename T> struct Y <T, typename boost::enable_if<boost::is_same<T, int> >::type> {
Y() { std::printf("specialized for int\n"); }
};
};
class Z {};
int main() {
X::Y<Z> a;
X::Y<int> b;
X::Y<float> c;
}
実行結果は、
genecic
specialized for int
genecic
です。
010591=104
2007/09/30(日) 23:31:30#include <cstdio>
namespace b00st {
template <bool B, class T = void>
struct enable_if_c {
typedef T type;
};
template <class T>
struct enable_if_c<false, T> { /* NO TYPEDEF! */ };
template <class Cond, class T = void>
struct enable_if : public enable_if_c<Cond::value, T> {};
template<bool b> struct bool_ {
static const bool value = b;
};
template<typename T, typename U>
struct is_same : bool_<false> {};
template<typename T>
struct is_same<T, T> : bool_<true> {};
}
using namespace b00st;
struct X {
template<typename T, typename U = void> struct Y {
Y() { std::printf("genecic\n"); }
};
template<typename T> struct Y<T, typename enable_if<is_same<T, int> >::type> {
Y() { std::printf("specialized for int\n"); }
};
};
そろそろウザいとおもうので、これで打ち止めにします。ありがとうございました。
0106デフォルトの名無しさん
2007/09/30(日) 23:40:100107デフォルトの名無しさん
2007/10/01(月) 00:01:020108デフォルトの名無しさん
2007/10/01(月) 00:04:13うん、俺の感想なんかどーだっていいってのは承知。
0109デフォルトの名無しさん
2007/10/01(月) 02:02:08enable_ifの関数テンプレへの適用で質問。ある条件で2つの関数を呼びわけたいときは、こんな感じにすればいいみたいだけど、
template<typename T>
static void foo(T t, typename boost::disable_if<boost::is_same<T,int> >::type* = 0) {
}
template<typename T>
static void foo(T t, typename boost::enable_if<boost::is_same<T,int> >::type* = 0) {
// intへの特殊化版
}
3つ以上を呼びわけるにはどうすれば? たとえば、
template<int V>
static void boo(typename boost::enable_if_c<V == 0>::type* = 0) { }
template<int V>
static void boo(typename boost::enable_if_c<V == 1>::type* = 0) { }
template<int V>
static void boo(typename boost::disable_if_c<V == 0 || V == 1>::type* = 0) {
// default
}
とかだと、default caseな関数の引数が大変なことになってしまうような。
boostスレのほうがいいのかな。。
0110デフォルトの名無しさん
2007/10/01(月) 02:51:44mpl::if_< ...,
mpl::if_< ...,
> >::type::call();
0111109
2007/10/01(月) 03:23:49すみません、それはどこに書くコードなんでしょうか?
call() とは一体。。
0112109
2007/10/01(月) 03:28:24template<int V>
static void boo(typename boost::enable_if_c<V == 0>::type* = 0) {}
は、
template<int V>
static void boo(typename boost::enable_if<
boost::is_same<
boost::mpl::int_<V>,
boost::mpl::int_<0>
>
>::type* = 0) {}
であり、さらに
template<int V>
static void boo(typename boost::enable_if<
typename boost::mpl::lambda<
boost::is_same<
boost::mpl::_1,
boost::mpl::int_<0>
>
>::type::apply<boost::mpl::int_<V> >::type
>::type* = 0) {}
だから、この数値0-Nでlambdaしたのをmpl::listで抱えて、特殊化版はlistのat<i>したのでenable_ifして、default版はこれらをandでfoldしたのにdisable_ifすればいいと思うんだぜ?
・・・絶対方向が間違ってる。
0113デフォルトの名無しさん
2007/10/01(月) 03:37:53boost/smart_cast.hppが参考になるかも
0114デフォルトの名無しさん
2007/10/01(月) 03:44:43私は、単に boo(0); boo(1); boo(2); とだけ書くと、呼び先の関数がコンパイル時に決まるようにしたいと
思っているんですが、>>110は、このbooを *呼ぶ側* をif_で工夫しろということ?
まぁ、boo()でif_を使って、適切なboo_()を呼ぶようにしてもいいのかもしれませんが、
委譲してしまうとタグディスパッチと大差ないようにも思うし。。
なんか勘違いしてたらすんません。smart_castは早速見てみます。
0115デフォルトの名無しさん
2007/10/01(月) 04:37:09複雑な条件を書かずに済ますことは不可能だと思う
0116109
2007/10/01(月) 05:41:56enable_ifが使いたいわけでは無くて、
1.メンバ関数テンプレートの特殊化(相当のこと - オーバーロードでもいい)を行いたい
2.特殊化の定義は、クラス内に書きたい (>>91と同じく, 見た目の問題で)
3.メンバ関数を呼ぶ側はあまり難しいことを考えたくない
4.タグディスパッチのような別関数への処理の委譲は、できれば避けたい (これも見た目の問題で)
という条件で、Pという場合と!Pという場合の処理の振り分けだったら、
enable_ifを使ったオーバーロードでOKとわかった(>>109)が、P, Q, (!P && !Q)
の3関数に振り分けたい場合にこの4条件を満たすようなのないですかね?
というのが質問です。ちゃんと書かずにすみません。コンパイラはgccです。
0117デフォルトの名無しさん
2007/10/01(月) 05:47:44自分で書いた>>109が満たしてると思うんだが
0118デフォルトの名無しさん
2007/10/01(月) 05:58:35おっしゃる通りなんですが、>>109は、V==0やV==1という条件が
繰り返し登場してしまい、メンテナンス性がいまいちかなと思いまして。
実際はenumとか扱いたいので。
109の繰り返しになりますけど、条件1-4をみたし、かつdefault case
template<int V>
static void boo(typename boost::disable_if_c<V == 0 || V == 1>::type* = 0) { /* default */ }
を綺麗にかけないですかね。
template<int V> static void boo(...) { /* default */ }
とかが通れば最高なのに。
0119デフォルトの名無しさん
2007/10/01(月) 06:02:23としてenable_ifに渡すとか
0120デフォルトの名無しさん
2007/10/01(月) 09:08:090121デフォルトの名無しさん
2007/10/01(月) 09:54:53こんな感じ
enable_if< my_conditionA<V> >
まあディスパッチすべきだな
enable_ifはこの場合必要ないから
0122デフォルトの名無しさん
2007/10/01(月) 11:56:27ばらばらに clone() 関数をとりつけるよりも
ひとつ Clonable クラスを作って、そのクラスから
継承したほうがよいでしょうか?
0123デフォルトの名無しさん
2007/10/01(月) 12:34:460124デフォルトの名無しさん
2007/10/01(月) 17:41:510125デフォルトの名無しさん
2007/10/01(月) 18:16:100126デフォルトの名無しさん
2007/10/02(火) 21:42:40using namespace boost::numeric::ublas::inner_prod;
VC++2005EEの環境でビルドすると、
error C2867: 'boost::numeric::ublas::inner_prod' : は名前空間ではありません。
というエラーが出ます。
エラーの原因は何ですか?
0127デフォルトの名無しさん
2007/10/02(火) 22:08:580128126
2007/10/02(火) 23:00:22http://sealsoft.jp/namespace.html このサイトの
> usingを使って、ある識別子をグローバルな名前空間に持ち上げることができる。こうするとその後は大域解決演算子を使う必要がない。
> using namespace seal::foo;
> // 関数fooを呼び出す
> int a = foo();
ここ見てできると思ったんですけど、このサイト間違ってますか?
0129デフォルトの名無しさん
2007/10/02(火) 23:27:47代わりといってはアレだが、その他の識別子一般には、using宣言が使える。
using boost::numeric::ublas::inner_prod;
0130126
2007/10/02(火) 23:49:25なるほど、そうなんですか。
http://msdn2.microsoft.com/ja-jp/library/6f133eff(vs.80).aspx
ここを勘違いして見てました。(classの中のusingとは別物なんですね)
クラスの中でnamespace内の関数をusingしたい場合、
class A {
using boost::numeric::ublas::inner_prod;
};
エラーになってしまうのですが、クラス中でnamespace内の関数をusingするのは無理ということですか?
0131デフォルトの名無しさん
2007/10/03(水) 00:09:31なお、型名だけはtypedefで代用できる。
0132126
2007/10/03(水) 00:14:050133デフォルトの名無しさん
2007/10/03(水) 01:54:49#define macro( name )\
const char *x = "name##__LINE__";
とかやってもできません。
こんなことは可能ですか?
0134デフォルトの名無しさん
2007/10/03(水) 02:05:02で、定数を文字列にするのは単純なマクロじゃ厳しいと思うけど・・・
おとなしく関数にしたほうがよさそう
0135デフォルトの名無しさん
2007/10/03(水) 02:07:38#define macro( buf, name ) sprintf( buf, "%s%d", "name", __LINE__);
0136デフォルトの名無しさん
2007/10/03(水) 02:10:53#define NUM2TEXT(n) NUM2TEXT_(n)
#define macro(name) \
const char *x = name ## NUM2TEXT(__LINE__)
0137デフォルトの名無しさん
2007/10/03(水) 02:43:41std::cout << "test" << std::endl;
で (a) "test" << std::endl; が先に評価されて、次に std::cout << (a) が評価される、という事態にはならないんですか?
0138デフォルトの名無しさん
2007/10/03(水) 03:26:560139デフォルトの名無しさん
2007/10/03(水) 04:07:200141デフォルトの名無しさん
2007/10/03(水) 08:46:050142デフォルトの名無しさん
2007/10/03(水) 09:44:47多重定義されている場合、通常の関数と同様、
呼出の直前に副作用完了点が現れるので心配は要らない。
<<は左結合だから、まずstd::cout << "test"から取り掛かる。
これは多重定義されているので、std::cout.operator <<("test")という関数呼出に相当。
関数呼出の直前には副作用完了点が来るので、ここまでにstd::coutと"test"が評価される。
と言っても、共に副作用を持たないので何も起きないが。
仮に副作用を持つ式だった場合、通常の関数呼出同様に
<<の左側と右側のどっちのオペランドが先に評価されるかは決まっていない。
std::cout.operator <<("test")の戻り値をrとすると、
次にr << std::endlの評価に掛かる。以下同じ。
0143デフォルトの名無しさん
2007/10/03(水) 11:51:51> 16.3.2 The # operator
> 16.3.3 The ## operator
0144デフォルトの名無しさん
2007/10/03(水) 13:50:35#define XY(X,Y) X##Y
#define MAKENAMEXY(FX,LINE) XY(FX,LINE)
#define MAKENAME(FX) MAKENAMEXY(FX,__LINE__)
というマクロで連結させている例がある。
評価順その他の関係で、間に一段置かないとならないらしい。
0145デフォルトの名無しさん
2007/10/04(木) 00:31:45コンパイラの仕様かな?
0146デフォルトの名無しさん
2007/10/04(木) 00:36:580147デフォルトの名無しさん
2007/10/04(木) 00:45:12クラスBaseを基底とするクラスDerivAやクラスDerivBがあるとして、
そこからインスタンスを作成するとすると、
Base* pA = new DerivA;
Base* pB = new DerivB;
となると思います。
そこから、pAもしくはpBから新たなインスタンスpCを作りたいと思っているのですが、
どうしたらいいでしょうか?
単にpA(DerivA)だけであれば、DerivA *pC=*pAだけでいけるのですが、
pAとpB(最終的にはBaseを基底とするクラス全部)にも対応できるものを作りたいので、
どうか力をお貸しください。
0148デフォルトの名無しさん
2007/10/04(木) 00:53:05public: virtual Base *NewInstance() = 0;
};
class DerivA : public Base {
public: virtual Base *NewInstance(){ return new DerivA; }
};
class DerivB : public Base {
public: virtual Base *NewInstance(){ return new DerivB; }
};
Base *pA = new DerivA;
Base *pB = new DerivB;
Base *pC = pA->NewInstance();
Base *pD = pB->NewInstance();
0149デフォルトの名無しさん
2007/10/04(木) 00:53:41Base* pB = new DerivB();
0151デフォルトの名無しさん
2007/10/04(木) 01:04:17DerivA::NewInstanceはDerivA*を返し、
DerivB::NewInstanceはDerivB*を返し、
という具合に、そこは共変にしてほしいな。
0152デフォルトの名無しさん
2007/10/04(木) 01:06:08なんかの本にかいてあったが忘れた
0153デフォルトの名無しさん
2007/10/04(木) 01:15:57boostにはなんて名前で入ってたっけ
0154デフォルトの名無しさん
2007/10/04(木) 01:18:23pAはDerivA*と分かっているとき、
DerivA* pA2 = static_cast<DerivA*>(pA->NewInstance());
のようなキャストを型安全性を損なうことなく排除できる。
0155デフォルトの名無しさん
2007/10/04(木) 02:07:150156デフォルトの名無しさん
2007/10/04(木) 02:08:250157デフォルトの名無しさん
2007/10/04(木) 02:29:39BOOST_PP_STRINGIZE
0158デフォルトの名無しさん
2007/10/04(木) 08:19:17Base *pC = new DerivC;
0159デフォルトの名無しさん
2007/10/04(木) 08:20:10Base *pC = new DerivC(pB);
0160デフォルトの名無しさん
2007/10/04(木) 21:28:42それだと余計な負荷がかかる。
0161デフォルトの名無しさん
2007/10/05(金) 01:29:04目的:最終的にlinuxで動かせるようにしないといけないけどVisual Studio捨てれない
winxpにvmwareいれてゲストOSとしてubuntu7を入れる
ubuntuの/home/srcをsambaで共有できるようにしてホストOSのwinxpからみれるようにする
/home/src = \\ubuntu\src
の下にVisual Studioのプロジェクト作成
makefileはeclipse/CDTで自動生成
あとはemacsでメインのコードの編集するけど、flymakeとか使いつつ
インテリセンスも使えてeclipse/cdtのリファクタリング機能も使える環境のできあがり
0162デフォルトの名無しさん
2007/10/05(金) 04:20:160163デフォルトの名無しさん
2007/10/05(金) 08:18:160164デフォルトの名無しさん
2007/10/05(金) 12:27:410165デフォルトの名無しさん
2007/10/05(金) 12:59:49速度が速い以外のメリットがないなら、もう乗り換えれない
0166デフォルトの名無しさん
2007/10/05(金) 15:23:45違うの?
0167デフォルトの名無しさん
2007/10/05(金) 17:36:55includeしたソースが複数ある(各ソースではincludeガードが起きずに展開される)
場合も単一の存在となるんでしょうか?
それとも別々の独立した変数となるんでしょうか?
0168デフォルトの名無しさん
2007/10/05(金) 17:41:000169デフォルトの名無しさん
2007/10/05(金) 18:02:52あれ,でもクラス変数などは単一なんですよね?
うーむ,基本の理解が全然出来ていない.
0170デフォルトの名無しさん
2007/10/05(金) 18:26:17class A{
static int x;
};
int A::x; // <-- これ
2個以上のソースファイルで定義したら、定義が重複してるってリンクエラーになる。
static でない普通のグローバル変数と同じあつかい。
0171デフォルトの名無しさん
2007/10/05(金) 20:36:510172デフォルトの名無しさん
2007/10/06(土) 00:19:53くっつけるというのはちょっと違う。単にインクルードするだけ。
0173デフォルトの名無しさん
2007/10/06(土) 03:48:00ファイルスコープの static はクラスメンバやローカル変数の static とは全然
意味が違う。これは理解するとかじゃなくて覚えておく必要がある。
0174デフォルトの名無しさん
2007/10/06(土) 12:08:540175デフォルトの名無しさん
2007/10/06(土) 13:25:34HTMLのtableタグを抜き出して2次元配列化するのに簡単な方法ありますか?
0176デフォルトの名無しさん
2007/10/06(土) 13:38:01表の大きさがあらかじめ分かってるなら楽、わかってなくても確保すりゃできる。
0177デフォルトの名無しさん
2007/10/06(土) 13:43:540178デフォルトの名無しさん
2007/10/06(土) 14:04:10大丈夫、Lynx辺りのソースを見れば書いてあるはずだ。
# 簡単とは思えないが。
0179デフォルトの名無しさん
2007/10/06(土) 19:44:49最後の行にだけ colspan 書いてあったり?
0180デフォルトの名無しさん
2007/10/06(土) 19:55:070181デフォルトの名無しさん
2007/10/07(日) 22:00:290182デフォルトの名無しさん
2007/10/08(月) 01:04:43簡単なやつならシンボルの重複が発生してリンカのエラーになるよ。
0183デフォルトの名無しさん
2007/10/08(月) 01:15:15重複しても怒られないんだよね.....
0184デフォルトの名無しさん
2007/10/08(月) 07:47:240185デフォルトの名無しさん
2007/10/08(月) 14:08:29ただクラスを作って使うだけでもCよりは使いやすいよね、これ。
0186デフォルトの名無しさん
2007/10/08(月) 14:10:020187デフォルトの名無しさん
2007/10/08(月) 14:12:060188デフォルトの名無しさん
2007/10/08(月) 14:14:400189デフォルトの名無しさん
2007/10/08(月) 14:21:37関数型や今時のLLの真似をしようとすると
すぐに泣くことになるけどな
0190デフォルトの名無しさん
2007/10/08(月) 14:55:310191デフォルトの名無しさん
2007/10/08(月) 16:51:26#include <boost/regex.hpp>
int main()
{
boost::regex re("^(..)*\\xA4");
}
(ひらがなを含むEUCコードの文字列の正規表現)
コンパイル/実行環境:
i686, linux-2.6, gcc-4.1.2, boost-1.34.0, -O3オプション
ia64、-O2オプションでも試しましたが、その場合は問題は発生しませんでした。
私はこれ以上調べる知恵を持たないのですが、GCCのバグなのでしょうか?
0192デフォルトの名無しさん
2007/10/08(月) 17:17:20boostのバグかもしれんよね。
0193デフォルトの名無しさん
2007/10/08(月) 17:43:330194191
2007/10/08(月) 18:07:48原因は恥ずかしくて言えません。あまりにも下らないミスでした。
スレを汚して申し訳ありません。
0195デフォルトの名無しさん
2007/10/08(月) 21:55:590196デフォルトの名無しさん
2007/10/08(月) 22:02:02恥ずかしがることないじゃないか、減るもんじゃなし。
このまま消えたらそれこそスレ汚し。質問に対して考えてくれた人に対して礼を欠く事になるぞ。
0197デフォルトの名無しさん
2007/10/08(月) 22:17:260198191
2007/10/09(火) 00:44:29後者の存在はこの問題を解決するまでは知りませんでした。
自分のboostを使うときは-lboost_regex-gcc41としなければならないのですが、
-lboost_regexと間違えていました。
管理者の用意したboostと何事もなくリンクしてしまうのでミスに気付かなかった。
GDBの出力に /usr/lib... という文字列を見つけて始めてミスに気付きました。
あれ? でもおかしいな。違うboostをリンクしたらそれはそれでうまく動くんじゃないんでしょうか?
0199デフォルトの名無しさん
2007/10/09(火) 01:01:52「違うboost」の何が違うのか調べないと、原因はわからんな。
0200デフォルトの名無しさん
2007/10/09(火) 01:09:37しかし管理者か。
自分の視野外からバグが入り込むとはまるよな。
0201デフォルトの名無しさん
2007/10/09(火) 01:29:34標準ライブラリではないとは思うのだけど、それなら、
boostを使って記述すると、環境依存(バージョン依存)物とか言って怒る人います?
0202デフォルトの名無しさん
2007/10/09(火) 01:32:430203デフォルトの名無しさん
2007/10/09(火) 02:15:23原因は措いておくとして。
自分がスーパユーザじゃなくて自前でインストールした
ライブラリとかを利用するときは、-I でインクルードパスを明示するのと、
リンク時には -L でライブラリパスを明示するのを習慣付けておいたほうが
良いで。
0204デフォルトの名無しさん
2007/10/09(火) 02:22:30実行時のLD_LIBRARY_PATHも忘れずに。
それが面倒なら、boostの場合は、.soでなく.aのほうをリンクしてしまうのも手だ。
-lを使わず、/home/mona/lib/libboost_regex.a とフルパスを書いてしまう。
0205デフォルトの名無しさん
2007/10/09(火) 12:33:320206デフォルトの名無しさん
2007/10/09(火) 17:23:06クラスを作ってメンバ関数として使うのと
どちらがパフォーマンスがいいのだろうか?
0207デフォルトの名無しさん
2007/10/09(火) 17:32:11どちらも同じコンパイル単位内に関数の実体があると仮定していいなら、後者の方がインライン展開されやすいので
パフォーマンスが高い可能性がある。但し、コンパイラによっては全く同じになる可能性も高い。
0208デフォルトの名無しさん
2007/10/09(火) 17:48:35ありがとう!
つまり、ソースの読みやすさを優先すればいいって事ですね?
0209デフォルトの名無しさん
2007/10/09(火) 19:04:01(自分流でも)オブジェクト指向に沿って考えたら自然と決まるもんじゃないの?
それともC++のクラスってオブジェクト指向以外の用途も一般的?
0210デフォルトの名無しさん
2007/10/09(火) 19:33:220211デフォルトの名無しさん
2007/10/09(火) 19:45:350212デフォルトの名無しさん
2007/10/09(火) 19:51:390213デフォルトの名無しさん
2007/10/09(火) 20:02:24構造化にしろオブジェクト指向にしろ、ソースのメンテナンス性を上げるための物だと理解してます
グローバルな関数にした方が使い勝手が良ければグローバル関数で処理するし
クラス化した方が使い勝手が良ければクラスを使います
使い勝手というのが、ある場面ではパフォーマンスであったり、ある場面ではメンテナンス性であったりするわけですが
また、メンテナンス性は、ソースの可読性に大きく左右されるので、パフォーマンスが同等であるならば、ソースの可読性を優先するのは自然だと思います
0214デフォルトの名無しさん
2007/10/09(火) 20:42:41void func() {}
}}
struct hage2 {struct hoge2 {
static void func() {}
};};
int main() {
hage::hoge::func();
hage2::hoge2::func();
}
どちらでも階層を実現できるけど
class struct を使う方法ならアクセス指定もできる
よって選らぶなら後者?…なわけないな
0215デフォルトの名無しさん
2007/10/09(火) 20:44:08○選ぶ
らぶ
0216デフォルトの名無しさん
2007/10/09(火) 20:48:47なるほど、C++初心者だけどOOPに慣れてるから、まずOOがあるものとして考えてたよ
ただ、
> ソースの可読性を優先するのは自然
って考えた時に、オブジェクトとして捉えられる物はクラス化した方がいい場合があるのは当然として、
そうでないものをクラスにまとめることもあるのかな?ってのを疑問に思ったの
名前空間とクラスのどっちを選ぶかは目的の持っている意味で分けられて、
それで結果的に可読性が向上すると思ってるから
0217デフォルトの名無しさん
2007/10/09(火) 23:08:42とか書いといて走らせると、hogeがちゃんと確保されないんだけど、
これって当然なんでしょうか。
100*100とかだと大丈夫。
アクセスするとseg faultしちゃう。
newしてやるとちゃんと確保される。
gcc + Linux or OS X
0218デフォルトの名無しさん
2007/10/09(火) 23:11:370219デフォルトの名無しさん
2007/10/09(火) 23:22:40ああ、そういうのがあるんですか。
newしてポインタがNULLかを調べるほうが普通?
0220デフォルトの名無しさん
2007/10/09(火) 23:27:350221デフォルトの名無しさん
2007/10/09(火) 23:29:530222デフォルトの名無しさん
2007/10/09(火) 23:31:530223デフォルトの名無しさん
2007/10/09(火) 23:35:580224デフォルトの名無しさん
2007/10/10(水) 01:55:150225デフォルトの名無しさん
2007/10/10(水) 21:01:39もちろん、スレちがいだかんね。
0226デフォルトの名無しさん
2007/10/10(水) 21:13:13SomeClassのコンストラクタの処理が凄い思いとする。
この重い処理中、p は NULL? 非NULL? どちら??
処理系の実装依存なのかな。
0227デフォルトの名無しさん
2007/10/10(水) 21:53:050228デフォルトの名無しさん
2007/10/10(水) 21:56:43あれの動作は特殊だからねぇ〜
0229デフォルトの名無しさん
2007/10/10(水) 22:01:040230デフォルトの名無しさん
2007/10/11(木) 12:10:34ってやれば、一応失敗すればヌルポを返す
0231デフォルトの名無しさん
2007/10/11(木) 13:19:460232デフォルトの名無しさん
2007/10/11(木) 15:03:470233デフォルトの名無しさん
2007/10/11(木) 18:40:500234デフォルトの名無しさん
2007/10/11(木) 19:52:030235デフォルトの名無しさん
2007/10/11(木) 20:08:31あれで構造体が「truncated」ってなって設定できないんだけど、何で?
教えてくださいエラい人。
0236デフォルトの名無しさん
2007/10/11(木) 23:13:27例外を使ったことない人が、例外を使いたくなくてひっかかる勘違いだな。
0237デフォルトの名無しさん
2007/10/12(金) 05:59:42クラスのインスタンスの比較で
operator==
使ったんだけどおれは今まで
bool(最悪でもint)を想定してコードを書いてきたんだ。
そしたら、
返された型がUBool = signed char
だったんだ・・・
UBoolってboolっぽいから盲点だったよ。
pimplでラップしろとのお告げなのだろうか・・・
std::cout << o1 == o2 << std::endl;//で判明
0238デフォルトの名無しさん
2007/10/12(金) 08:08:010239237
2007/10/12(金) 09:12:42冗談かと思ったら散々な結果・・・
比較演算子の型は不明?w
std::cout << typeid(1.0==1.0).name() << std::endl;//VC6(int),VC7.1(int),VC8(bool),GCC3.4.4(bool)
std::cout << typeid(1==1).name() << std::endl; //VC6(long),VC7.1(bool),VC8(bool),GCC3.4.4(bool)
結論:boolは関数オーバーロードしない。または、明示的に呼び出す。
0240デフォルトの名無しさん
2007/10/12(金) 09:22:22これまじで?
もうVC6とかVC7.1は使わないから、いまさらどうでもいいんだけど。
0241デフォルトの名無しさん
2007/10/12(金) 10:58:30規格では組み込みの比較演算は全部 bool になる。
VC の比較演算か typeid がバグってるんだろ。
0242デフォルトの名無しさん
2007/10/12(金) 18:07:19#include "hoge.h"
#endif
と、hoge.h内で
#ifnedef HOGE_H
#define HOGE_H 1
class hoge{
};
#endif
ってするのはどっちにどういう長所短所があるんでしょうか。
0243デフォルトの名無しさん
2007/10/12(金) 18:18:110244デフォルトの名無しさん
2007/10/12(金) 18:22:11あざっす。
数十種類の色んな環境でmakeできるソフト読んでたんで、
前者はそういうとこで念のために使う感じですね。
0245デフォルトの名無しさん
2007/10/13(土) 15:06:26コンパイル速度上げるための小細工。hoge.h の中で #ifndef してると、当然
hoge.h を読み込んでプリプロセッサが解析するコストがかかるが、前者だと
ファイル開く必要がない。
ちなみに #pragma once 使える環境なら、そっちの方が良い。
0246デフォルトの名無しさん
2007/10/13(土) 15:27:50# pragma once
#else
# ifndef XXX_IS_INCLUDED
# define XXX_IS_INCLUDED
/* */
# endif
#endif
こうですか?わかりません><
0247デフォルトの名無しさん
2007/10/13(土) 15:34:47gcc は #pragma once 使わなくてもインクルードガードのパターンを認識して
同等の処理をしてくれるらしい。
つまり #pragma once しか使えない環境なら付けといたほうがいいかも、って感じ。
0248デフォルトの名無しさん
2007/10/13(土) 17:35:03未知の#pragmaは無視してくれるんじゃなかったっけ?
0249デフォルトの名無しさん
2007/10/13(土) 17:44:390250デフォルトの名無しさん
2007/10/13(土) 17:45:42コンパイラによっては同じ名前でも違う意味だったりする可能性もあるから
#pragma はたちが悪い。
0251デフォルトの名無しさん
2007/10/13(土) 22:36:500252デフォルトの名無しさん
2007/10/14(日) 04:02:26void fh() {
try {
throw;
} catch(int) {
printf("1\n");
} catch(bool) {
printf("2\n");
}
}
int main() {
try {
throw true;
} catch (...) {
fh();
}
return 1;
}
これってhack? これ許されるなら、TypeListの
要素全てをcatchするなんてのも出来そう。
0253デフォルトの名無しさん
2007/10/14(日) 04:20:38なにがうれしいのかよくわからん。kwsk.
0254デフォルトの名無しさん
2007/10/14(日) 07:28:46ttp://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.9
に idiom として載ってるくらい普通。
と、言っておきながらつい最近までこういうのが可能だと知らんかったけど。
0255デフォルトの名無しさん
2007/10/14(日) 09:05:190256デフォルトの名無しさん
2007/10/14(日) 10:42:59C++つかってもう直ぐ10年だが初めて知ったorz
> 253
template <typename TL,typename T>
struct Catch {
void do_catch() {
try { throw ; } catch (T) {
/*何か処理*/
} catch (...) {
Catch<mpl::pop_front<TK>::tyep,mpl::front<TL>::type>::do_catch();
}
}
};
こんな感じにすればTypeList全要素のcatchもできそう。
パフォーマンスわるそうだけど。
ほかにも工夫すればあれやこれが(うひひ
0257デフォルトの名無しさん
2007/10/14(日) 11:04:08あと、例外指定との相性もわかんねえし
0258デフォルトの名無しさん
2007/10/14(日) 11:17:110259デフォルトの名無しさん
2007/10/14(日) 15:55:410260デフォルトの名無しさん
2007/10/14(日) 15:56:480261デフォルトの名無しさん
2007/10/14(日) 16:03:25おもしろそうだ。
0262デフォルトの名無しさん
2007/10/14(日) 16:04:40「パターンを認識」って具体的には何よ?あいまいすぎて水伝みたいだとオモタ
0263デフォルトの名無しさん
2007/10/14(日) 16:08:42ファイル内のコード全体が #ifdef で囲まれてて、その中の先頭で対応するマクロの定義が
ある、ってパターンを認識するんじゃないか?
gcc の話だから、確実なところが知りたいんなら実験してソース読んだほうがいいな。
0264デフォルトの名無しさん
2007/10/14(日) 16:17:400265デフォルトの名無しさん
2007/10/14(日) 16:44:09ですね。二度目以降はファイルがopenされなくなるという最適化。
0266デフォルトの名無しさん
2007/10/14(日) 18:08:280267デフォルトの名無しさん
2007/10/14(日) 21:39:570268デフォルトの名無しさん
2007/10/14(日) 21:43:030269デフォルトの名無しさん
2007/10/15(月) 01:09:41callbackのoperator()をconstにしていい理由がよくわかりません。
A::foo()がconstではないのに、なぜoperator()はconstでいいんでしょうか?
struct A { void foo() /* const */ {} };
template <class T, void (T::*F)()> class callback {
public:
callback(T& t) : object(t) {}
void operator()() const { (object.*F)(); }
private:
T& object;
};
int main() {
A a;
callback<A, &A::foo> cb(a);
cb();
}
メンバ変数objectが、値でなく参照だから?
おしえてくださいませ。
0270デフォルトの名無しさん
2007/10/15(月) 01:11:500271デフォルトの名無しさん
2007/10/15(月) 01:13:050272269
2007/10/15(月) 01:15:58結構長いことC++もconstも使ってきたつもりだったけど、しらんかった。ありがとー
0273デフォルトの名無しさん
2007/10/15(月) 01:43:280274デフォルトの名無しさん
2007/10/15(月) 01:46:45とか
const T& object;
にすればいいだけでは?
0275デフォルトの名無しさん
2007/10/15(月) 01:47:14public:
ccallback(T& t) : object(t) {}
(あとは一緒)
でも作って、そっち使えばいいんでない? >>273
0276デフォルトの名無しさん
2007/10/15(月) 01:47:550277デフォルトの名無しさん
2007/10/15(月) 20:26:42それぞれにコンストラクタを作用させる方法ってありませんか?
class A{・・・};
int main(){
A* a;
a=new A[10]←ここでコンストラクタは使えない?
}
アホですいません
0278デフォルトの名無しさん
2007/10/15(月) 20:59:43new[]では、デフォルトコンストラクタしか呼べない。
ほかのコンストラクタを使いたければ、今はおとなしく
std::vector<>でpush_backするなどしかない。
0279277
2007/10/15(月) 21:21:480280デフォルトの名無しさん
2007/10/15(月) 23:09:10なんて出来ないのか。
デフォルトコンストラクタしか呼べないのには
何かしらの理由あるの?
0281デフォルトの名無しさん
2007/10/15(月) 23:42:17変換「できる」って書いてるんだよね。
つまり、変換するかどうかは処理系定義ってことなのか・・・。
うちの環境じゃその下の浮動小数点昇格が行われないみたいだし、
処理系定義臭いな・・・。
0282デフォルトの名無しさん
2007/10/15(月) 23:49:52うまい文法が思いつかなかったんじゃねーの。
A * p = static_cast<A *>( ::operator new (sizeof(A) * 10) ) ;
std::uninitialized_fill_n(p, 10, A(/*初期値*/) ) ;
A *iter = p ;
A * const end = &p[10] ;
for ( ; iter != end ; ++iter )
{ iter->~A() ; }
::operator delete(p) ;
うん、自分でやるのは、果てしなく面倒だな。
0283デフォルトの名無しさん
2007/10/15(月) 23:54:23現行の規格では無理だね。
文法としては↓で問題ないような気がするんだけど。どうなんだろ。
a = new A[10] { ... };
0284デフォルトの名無しさん
2007/10/15(月) 23:57:51実際にどこで汎整数昇格が実行されるべきかどうかが別途規定されている。
処理系定義じゃないよ。
0285デフォルトの名無しさん
2007/10/16(火) 00:02:45お、そうなのか。安心した・・・。
0286デフォルトの名無しさん
2007/10/16(火) 00:11:25ここでしか昇格は行われないという認識でいいのかな?
#include <iostream>
using namespace std;
void Hoge(float ) { cout << "float " << endl; }
void Hoge(double) { cout << "double" << endl; }
int main() {
Hoge(0.0f + 1.0f);
}
で float が出力されるのは別にいいというわけね?
0287デフォルトの名無しさん
2007/10/16(火) 01:24:41は出来るのにな
0288デフォルトの名無しさん
2007/10/16(火) 01:37:01a = new A[size] { ... };
として、... にはどう書くよ?
0289デフォルトの名無しさん
2007/10/16(火) 01:38:15↓と同じでいいだろ。
A a[] = { ... };
0290デフォルトの名無しさん
2007/10/16(火) 02:10:06size が動的に決まる場合どうするのよ
0291デフォルトの名無しさん
2007/10/16(火) 02:28:36new する。
っていうか、それ初期化の話と関係ない。
0292デフォルトの名無しさん
2007/10/16(火) 03:39:33size の値によって { ... } の ... に書くべき要素の数が変わるじゃん。
0293デフォルトの名無しさん
2007/10/16(火) 03:40:220294デフォルトの名無しさん
2007/10/16(火) 03:53:47それ考えたら構文とか以前にコンパイルが必要な言語という時点で無理だね。
new しない配列と同じ制約のうえで初期化子が使えるって感じが考えられるかも、
もっと考えていったら、やっぱりやめようってことになるのかね?
禿が「組み込み配列なんか使うな」で済ませたことも考えられる。
あとは std::initializer_list にがんばってもらおう。
0295デフォルトの名無しさん
2007/10/16(火) 04:23:51new してるのに動的じゃない場合を考えるって何て矛盾。
0296デフォルトの名無しさん
2007/10/16(火) 04:25:52{ ... } を使う時点で動的じゃないっつーことだ。
0297デフォルトの名無しさん
2007/10/16(火) 09:54:55各演算子のとこに書いてあるよ。
たとえば + は両オペランドに通常の算術型変換を施すけど、>>はしない。とかがわかる。
0298デフォルトの名無しさん
2007/10/16(火) 12:43:03初心者の漏れはどやって調べればいいんだああ
0299デフォルトの名無しさん
2007/10/16(火) 12:45:26リークしていることが確実なのならば、全てのmalloc()/newからのロジックを追えばいい。
0300デフォルトの名無しさん
2007/10/16(火) 13:07:49_CrtSetBreakAlloc();
0301デフォルトの名無しさん
2007/10/16(火) 13:16:00井の中の蛙乙
0302300
2007/10/16(火) 13:43:46うぜー
じゃあ
boundschecker
valgrind
で満足したか?
0303デフォルトの名無しさん
2007/10/16(火) 13:44:50恥の上塗り乙
0304デフォルトの名無しさん
2007/10/16(火) 13:48:39環境依存スレじゃないんだから、環境依存の手法をいくら提示してもダメでしょ。
まして、>298は環境を明示していないんだから。
>>298
つーことで、愚痴じゃないなら該当スレでどうぞ。その節は環境を明示することをお忘れなく。
つーか、該当環境スレで聞いたほうが早いかな。
0305デフォルトの名無しさん
2007/10/16(火) 14:45:090306デフォルトの名無しさん
2007/10/16(火) 15:09:30Windows環境の知識しかないなら、あってんじゃないの?
尤も、>300は>302で井の中のみならず多少の外界の知識もあることを披露している訳だが。
因みに、「井の中の蛙」と言った場合、通常は「井の中の蛙、大海を知らず」と言う意味で使う。
更に「されで空の青さを知る」などと付け加えてしまうのは無粋と言うものだと思う。
まぁ実際、>302で「うぜー」とか「満足したか」なんて言っているようではやはり、>300は井の中の蛙だと思うんだ。
0307デフォルトの名無しさん
2007/10/16(火) 15:10:09s/されで/されど/
0308デフォルトの名無しさん
2007/10/16(火) 15:16:10適当にダンプしてみる。
もし、普通に使うメモリが数十MBなのに、数百MBも使っているとすれば、
かなりの確率で、リークしているメモリをダンプすることが出来る。
あとは特徴的なビット列なり、なんなりで、何のメモリかを特定すればよい。
0309デフォルトの名無しさん
2007/10/16(火) 15:16:120310デフォルトの名無しさん
2007/10/16(火) 15:36:22たぶんこの辺りからがしつこいと思うよ。
0311300
2007/10/16(火) 16:05:080312デフォルトの名無しさん
2007/10/16(火) 16:59:19やっぱ必死だなw
0313デフォルトの名無しさん
2007/10/16(火) 17:47:13やっぱ必死だなw
0314デフォルトの名無しさん
2007/10/16(火) 20:19:12x*x+5*x+10+sin(x)
のような関数を読み込んで、
この関数を実行時に作成するような方法ってありますか。
double func(double x){
return x*x+5*x+10+sin(x);
}
↑こんなイメージの関数を実行時に作りたいと考えてます。
文字列を式として認識するようなこと自体難しいと思いますが、
それを仮にクリアしたとして、
とにかく引数を与えたときにその式の値を得る方法を知りたいです。
いい方法をご存知の方がいたら、ご教授いただきたく。
0315デフォルトの名無しさん
2007/10/16(火) 20:24:59tccというコンパイラのライブラリを使うと実行時に文字列からコンパイルできる。
0316デフォルトの名無しさん
2007/10/16(火) 20:29:180317デフォルトの名無しさん
2007/10/16(火) 20:38:21web検索かければサンプルコードも沢山あるから
比較的楽に実装できると思うよ
0318デフォルトの名無しさん
2007/10/16(火) 20:48:300319314
2007/10/16(火) 21:12:53こんな短時間に色々ありがとう。
とりあえず、試してみます。
この前boost入れたんで、まずspiritっての使ってみようかと。
しかし上記のアルゴリズムを自分で書こうとしたらどうなるのか気になりますね。
0320デフォルトの名無しさん
2007/10/16(火) 21:15:020321デフォルトの名無しさん
2007/10/16(火) 21:15:18これか。
ttp://neugierig.org/software/c-repl/
C REPL
0322デフォルトの名無しさん
2007/10/16(火) 21:38:54トークン解析してひたすら関数オブジェクトを合成するような感じでしょう。きっと…
インタプリタなら関数(オブジェクト)になんかしなくていいわけですし…
0323デフォルトの名無しさん
2007/10/17(水) 01:24:38自作するならPEGがお勧め。
結局spiritだけどな
0324デフォルトの名無しさん
2007/10/17(水) 09:20:12#include </dev/tty>
0325デフォルトの名無しさん
2007/10/17(水) 13:18:210326デフォルトの名無しさん
2007/10/17(水) 17:27:41引数付きのオブジェクト型の配列についてなのですが
Object **obj = new Object*[N];
for( int n = 0; n < N; n++ )
obj[n] = new Object( 0 );
こんなんがweb上に乗ってたんですが、
オブジェクト型の配列の添え字数分コンストラクタを呼びたいとき
もっと簡単の書き方はありますでしょうか?
0327326
2007/10/17(水) 17:28:590328デフォルトの名無しさん
2007/10/17(水) 21:11:44C++で割り込み処理(ex.ctrl+Dが入力されるまで永遠ループ)はできますか?
c=getchar() != EOF とかですと毎回止まってしまうので駄目です。
「C++ 割り込み処理」などでぐぐりましたが、ちょっとわかりませんでした。
CUIでやりたいのでVC++のみで可能ですと終わります。。
0329デフォルトの名無しさん
2007/10/17(水) 21:19:280330デフォルトの名無しさん
2007/10/17(水) 21:37:13signalって標準だったのか・・・
0331デフォルトの名無しさん
2007/10/17(水) 22:09:45class base{};
class super1:public base{};
class super2:public base{};
という風になっていて
base *s1 = getClass("super1"); // base *s1 = new super1(); と等価
base *s2 = getClass("super2"); // base *s2 = new super2(); と等価
ってのをやりたいです
事前にこんなので登録して、ここから呼び出したいのですが…
なにかうまい方法は無いでしょうか
map<string, ???> classmap;
classmap["super1"] = super1;
classmap["super2"] = super2;
0332デフォルトの名無しさん
2007/10/17(水) 22:17:16ありがとうございます。同一の方ですか?
signalを調べてみようと思います!
0333デフォルトの名無しさん
2007/10/17(水) 22:18:380334デフォルトの名無しさん
2007/10/17(水) 22:25:55関数ポインタでも使ってみる?
class derived1;
base* create_derived1(){return new derived1();}
class derived2;
base* create_derived1(){return new derived2();}
map<string,base* (*)()> classmap;
classmap["derived1"] = create_derived1;
classmap["derived2"] = create_derived2;
0335sage
2007/10/17(水) 22:31:24だ、だめか・・・
すいません。ありがとうございます!
0336デフォルトの名無しさん
2007/10/17(水) 23:03:440337デフォルトの名無しさん
2007/10/18(木) 00:06:30vector<int>のイテレータを
vector<int>::iterator p = .....;
と記述してるのですが、なんで、vector<int>::としなければならないのですか?
自分としては、なんとなく(iteratorがclassなら)
iterator< vector<int> > p = ....
と記述するのが普通じゃないのかと思うのですが
0338デフォルトの名無しさん
2007/10/18(木) 00:08:41単なるポインタの typedef ということもありうる
0339デフォルトの名無しさん
2007/10/18(木) 00:27:50なんてお呼びでない。
0340デフォルトの名無しさん
2007/10/18(木) 02:17:06vector<int>::iteratorがint*な実装がある。BCCがそうだし…
でもlist<int>::iteratorはまた別物で
list<int>の内部構造にあわせたクラスにしてある。
大事なのはiteratorという同じ型を使うのではなくて
iteratorという型を通して同じように要素を操作できることだから…。
型名::型名 が分らないのならば
vector<int>::iterator の vector<int> はコンテナクラスの型であると同時に
名前空間名でもあります。
クラスの名前空間とかインナークラスで探せば説明サイトが見つかると思う。
0341デフォルトの名無しさん
2007/10/18(木) 02:21:17それも考えたんですけど、100個ぐらいあるから関数を作るのが面倒なので…
boost使って自動化できたり出来ないですかね…
0342デフォルトの名無しさん
2007/10/18(木) 07:20:06boost::function, boost::lambda::constructor を組み合わせれば、道が開けるかも。
0343デフォルトの名無しさん
2007/10/18(木) 07:22:22どこが難しいと思ってるの?
0344326
2007/10/18(木) 11:05:17すみません、3行目は
obj[n] = new Object( n ); でした。
理解していないわけではないのですが、
ただ単にオブジェクト型の配列として定義したときに
カウンタとして用いているnをコンストラクタの
引数として用いたいのです。できればnewを用いずに。
配列宣言で引数付きコンストラクタを呼び出すことは
できないのでしょうか?
レベルが低くて申し訳ありませんm(__)m
0345デフォルトの名無しさん
2007/10/18(木) 11:47:55Object がコピーコンストラクタでコピーできるクラスなら。
std::vector<Object> obj;
for( int n = 0; n < N; n++ )
obj.push_back( Object( n ) );
これなら delete も要らなくて簡単。
0346デフォルトの名無しさん
2007/10/18(木) 11:52:270347326
2007/10/18(木) 11:53:56早いご回答ありがとうございます!
やってみます!
0348デフォルトの名無しさん
2007/10/18(木) 12:26:05std::vector<Object> obj( N, Object(n) );
0349デフォルトの名無しさん
2007/10/18(木) 12:31:270351デフォルトの名無しさん
2007/10/18(木) 14:26:320352デフォルトの名無しさん
2007/10/18(木) 20:22:31template<class T> base* create_derived(){return new T;}
classmap["derived1"] = create_derived<derived1>;
classmap["derived2"] = create_derived<derived2>;
boostなんて必要ないですね…orz...
0353デフォルトの名無しさん
2007/10/18(木) 22:10:19#define REG(name) classmap[ #name ] = create_derived<name>
までやれば最強?
0354デフォルトの名無しさん
2007/10/19(金) 00:39:31struct Vec3
{
union {
struct {
float x;
float y;
float z;
};
float v[3];
};
// オペレータ群
・・・・
};
これを、
Vec3 v0, v1;
v0.xy = 1.0f;
v1.xyz = 1.0f
v0.xz = v1.zx;
みたいな使い方をしたいのですがどのようにすればいいのでしょうか?
よろしくお願いします。
0355デフォルトの名無しさん
2007/10/19(金) 01:33:31struct proxy
{
float & r1 ; float & r2 ;
public :
proxy(float &r1, float & r2)
: r1(r1), r2(r2) { }
proxy(proxy const & p)
: r1(p.r1), r2(p.r2) {}
proxy const & operator = (float f) const
{
r1 = f ; r2 = f ;
return *this ;
}
} ;
struct Vec3
{
float v[3] ;
public :
proxy xy(void)
{ return proxy(v[0], v[1]) ; }
proxy xz(void)
{ return proxy(v[0], v[2]) ; }
proxy yz(void)
{ return proxy(v[1], v[2]) ; }
} ;
int main()
{ Vec3 v ; v.xy() = 1.0f ; v.xz() = 1.0f ; v.yz() = 1.0f }
0356デフォルトの名無しさん
2007/10/19(金) 02:07:47ありがとうございます。
参考にしていろいろ弄ってみます。
0357デフォルトの名無しさん
2007/10/19(金) 02:40:44とりあえず作ってみた。これで「v0.xz = v1.zx;」のような表記ができるよ。
完全にするにはSxy,Syz,Szx,Sxz,Szy,Szx,Sxyzの実装を網羅する必要がある。
struct Sxyz {
float x,y,z;
Sxyz & operator = (float f) { x=y=z=f; return *this; }
};
struct Sxy;
struct Sxz;
struct Szx;
struct Sxy : public Sxyz
{
Sxy & operator = (float f) { x=y=f; return *this; }
};
struct Sxz : public Sxyz
{
Sxz & operator = (Szx r);
};
struct Szx : public Sxyz {};
Sxz & Sxz::operator = (Szx r) { x=r.x; z=r.z; return *this; }
// つづく
0358357
2007/10/19(金) 02:42:19struct Vec3
{
union {
struct {
float x, y, z;
};
float v[3];
Sxy xy;
Sxz xz;
Szx zx;
Sxyz xyz;
};
Vec3() : x(0.0f), y(0.0f), z(0.0f) {}
Vec3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {}
};
int main()
{
Vec3 v0, v1;
v0.x = 1.0f;
v0.xy = 2.5f;
v1.xyz = 4.0f;
v0.xz = v1.zx;
}
0359デフォルトの名無しさん
2007/10/19(金) 02:59:16この発想はなかった。
でもunionってこんなことできるのかなと調べてみたら、やっぱり規格違反だった。
unionのメンバにクラスは使えるんだけど……。
>An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor
>(12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an
>array of such objects.
というか、union自体がメンバ関数とか、コンストラクタやデストラクタ持てたんだ。
規格読んで今初めて知ったよ。
0360357
2007/10/19(金) 03:00:300361359
2007/10/19(金) 03:09:28疲れてるみたいだ。もう寝よう。
0362デフォルトの名無しさん
2007/10/19(金) 03:11:37おおっ!私のやりたかったことできるみたいですね!
参考にさせていただきます。ありがとうございます。
0363357
2007/10/19(金) 04:04:00すまん、訂正です。
「v0.xz = v1.zx;」はv0.x=v1.z, v0.z=v1.xという意味だろうから、以下のように直して。
(ついでに引数はconst参照の方がいいと思うので。)
Sxz & Sxz::operator = (const Szx &r) { x=r.z; z=r.x; return *this; }
>>359, 361
>でもunionってこんなことできるのかなと調べてみたら、やっぱり規格違反だった。
>>An object of a class with a non-trivial constructor (12.1), a non-trivial copy constructor (12.8), a non-trivial destructor
>>(12.4), or a non-trivial copy assignment operator (13.5.3, 12.8) cannot be a member of a union, nor can an
>>array of such objects.
>あ、間違えた。copy assignment operatorだったorz
面白そうだから作ってはみたけど、実は規格とか良く理解せずにいました。
non-trivial copy assignment operator というのはコピー代入演算子ということで
Sxz & Sxz::operator = (Sxz) ということでしょうか。
Sxz & Sxz::operator = (Szx) ならば問題なしという認識であっていますか?
0364デフォルトの名無しさん
2007/10/19(金) 05:20:010365デフォルトの名無しさん
2007/10/19(金) 06:38:100366デフォルトの名無しさん
2007/10/19(金) 08:10:57#include <iostream>
#include <map>
#include <string>
class human{
private:
std::string name;
int age;
public:
human(std::string name, int age){ this->name=name; this->age=age; }
int getAge(void){ return age; }
std::string getName(void){ return name; }
};
typedef std::map< char* , human > clsmap_t;
int main(void){
clsmap_t clsmap;
human yosida("吉田", 21), mitui("三井", 20);
char buf[100];
clsmap.insert(clsmap_t::value_type("よっちゃん", yosida));
clsmap.insert(clsmap_t::value_type("みっちゃん", mitui));
std::cout << "あだ名を入力して下さい : ";
std::cin.getline(buf, sizeof(buf));
clsmap_t::iterator n = clsmap.find(buf);
if( n == clsmap.end() ) std::cout << buf << " not found." << std::endl;
else std::cout << n->second.getName() << " " << n->second.getAge() << std::endl;
return 0;
}
0367デフォルトの名無しさん
2007/10/19(金) 08:19:58http://pc11.2ch.net/test/read.cgi/tech/1190860744/586
0368デフォルトの名無しさん
2007/10/19(金) 08:28:360369デフォルトの名無しさん
2007/10/19(金) 08:34:24ってマルチかよ
0370デフォルトの名無しさん
2007/10/20(土) 10:31:32friendな関数
どう使い分けたらいい?
0371デフォルトの名無しさん
2007/10/20(土) 10:53:03friend 友達
0372デフォルトの名無しさん
2007/10/20(土) 11:22:26だれがうまいこと(ry
0373デフォルトの名無しさん
2007/10/20(土) 11:31:07C++3rdでは、friend、static、無印、の3つのメンバ関数を、こう分類してる。
メンバ関数の特性には次の3つがあって、
(1) 関数がクラス宣言の非公開部にアクセスできること
(2) 関数がクラススコープに含まれること
(3) オブジェクトを対象として関数を実行しなければならないこと(thisポインタを持っていること)
無印は(1)〜(3)、staticは(1)〜(2)、friendは(1)だけを持っている。
だから使い分けを考える時も、ここから出発するのがいいんではないかと。
どーしても(3)で困るならstatic、さらにどーしても(2)で困るならfriend、みたいな。
まぁ俺だったら、friendはよほどのことが無い限り使わないけど・・・。
0374デフォルトの名無しさん
2007/10/20(土) 11:42:06トンクス!
0375デフォルトの名無しさん
2007/10/20(土) 11:54:56void Class::Delete()
{
delete this;
}
は禁則事項?
0376デフォルトの名無しさん
2007/10/20(土) 11:56:460377337
2007/10/20(土) 13:21:52相変わらずよく分からずですが、そのクラスで用いるiteratorを
typedefでクラス内で定義しているのからだろう程度の理解で、C++の勉強を
先に進めるこすますた。
0378デフォルトの名無しさん
2007/10/20(土) 13:32:22std::vector<int> v;
boost::range_iterator<BOOST_TYPEOF(v)>::type iter;
0379337
2007/10/20(土) 15:11:20boost::range_iterator<BOOST_TYPEOF(v)>::type iter;
のtypeもやっぱtypedefされてるから
boost::range_iterator<BOOST_TYPEOF(v)>::が付くのですか?
0380デフォルトの名無しさん
2007/10/20(土) 15:48:49それがboost::range_iterator<>の中で宣言された物だから。
typedefされたものかどうかは問題ではない。クラスや関数やその他いろいろなものでも同じ。
0381デフォルトの名無しさん
2007/10/20(土) 16:25:20だから>>380の意味が解りません><,orz
0382380
2007/10/20(土) 16:35:59氏ね
0383デフォルトの名無しさん
2007/10/20(土) 16:42:240384デフォルトの名無しさん
2007/10/20(土) 16:43:08自作自演乙
0385デフォルトの名無しさん
2007/10/20(土) 16:53:49バカじゃないのなら(頭良いなら、サクッと)
宣言、定義の解説汁
0386デフォルトの名無しさん
2007/10/20(土) 16:57:14http://pc11.2ch.net/test/read.cgi/tech/1192866305/
0387デフォルトの名無しさん
2007/10/20(土) 17:04:38この相談スレは終了です。
*************** 相談スレ 終了 ***************
これよりC++雑談スレになります
C++談話室 part1
0388デフォルトの名無しさん
2007/10/20(土) 17:06:210389380
2007/10/20(土) 18:35:292chで初めて騙られたw
まあ381はへこまずに、基本をちゃんと勉強すべきだ。
とりあえず宣言や定義について書いてある入門書くらいは読むこと。
0390デフォルトの名無しさん
2007/10/20(土) 20:42:380391デフォルトの名無しさん
2007/10/20(土) 20:46:53class X {
public:
void *operator new(size_t n);
void operator delete(void *p);
};
0392デフォルトの名無しさん
2007/10/20(土) 23:29:25ただの事務職の経験しかなく、勉強しはじめたものの、正直申し上げてさっぱりわかりません。
みなさんはどうやってだんだんと使えるようになっていきましたか?
コツコツと努力が必要なのは重々承知しておりますが、
努力の方向を誤らないよう、先人のたどった道がどんなものかを教えていただければと思います。
0393デフォルトの名無しさん
2007/10/20(土) 23:51:21俺の場合、少なくとも初期の頃は、本を読んで、ソースを書いて、何か疑問を持ったらネットで調べる、
というのを、その時その時の好奇心のままに続けてきただけだから、
教えるべき「道」なんてものがあるのかどうか、そこからしてわからない。
「握力を鍛えるにはどうすればいいですか?」→「何か握ってれば?」くらいシンプルな問答に思える。
嫌々この道に入らざるを得なかった人の回答を待ったほうがいいね。
0394デフォルトの名無しさん
2007/10/21(日) 00:00:08金とって開発してる組織でそんなことしてたらほとんど詐欺だな。
0396デフォルトの名無しさん
2007/10/21(日) 00:02:38それとSTLを一通り使えるようにしとけば、まぁ問題ないだろ
そこからexceptionalとかいってもまぁ一般的な理系学部卒程度の素養があれば半年もかからないさ
0397デフォルトの名無しさん
2007/10/21(日) 00:07:31基礎はしっかり身につけたほうがいいだろうね。
まずは入門書を読みながら、実際に書いて動かすこと。
読んで理解したつもりになってるだけでは、実際はほとんど身についていない。
書いてあるままを試して終わりにするのではなく、新しく習ったこれについて
こう変えてみたらどうなるか、などいろいろ試してみること。
本を写したつもりでもきっとどこか間違えるから、コンパイルエラーとか動作がおかしいということが
発生するだろうから、それを解決することで何が間違いかを学んでいくこと。
独学だと問題に行き詰ったときに大変だから、誰か身近に教えてくれる人がいると良いね。
業務でやるんだから、先輩とかに聞けば教えてくれるはず。
…その先輩が平均程度には良心とか責任感があるなら。
0398デフォルトの名無しさん
2007/10/21(日) 00:08:50それに、プログラミングは合わない人は全く習得できないからなあ
0399デフォルトの名無しさん
2007/10/21(日) 00:10:07好きでやろうが嫌々やろうがやることは一緒じゃないかな。
適当な入門書から入って真似して試して考えて調べて、、、
初心者にアドバイスしたいことは、
情報源は複数持つこと。一人の言うことを鵜呑みにせず、本やnetも並用すること。
何かに取り組むとき、現在の知識だけで何とかしようとするな。きっとより良い解決方法がある。
理解するまでは使うな。たまたま動いただけかも知れぬ。
0400デフォルトの名無しさん
2007/10/21(日) 00:21:58趣味でC++やる/エキスパートを目指すなら必須だと思うけど。
0401デフォルトの名無しさん
2007/10/21(日) 00:23:500402デフォルトの名無しさん
2007/10/21(日) 00:30:29勉強していくうちに、単に正しく動くものが書けるというだけではなく、保守性だとか
論理的な正しさとかに気を配るようになったり、自分なりのより良いと思えるスタイルができてくる。
でも職場ではそこ独自の理解しがたいルールがあることが多い。
悪い点を指摘して改善するように提案することも効果がある場合もあるけど、
変に我を通さずに協調する(受け入れる・理解する・妥協する)ことも必要。
0403392
2007/10/21(日) 00:56:56とりあえずまともにレスできるところにだけ・・・・
>>393
なるほど、元々のアプローチが違いますからね。
聞かれても困ってしまうかもしれません。
>>394
全くです。金もらってこんなことしてるので、会社に居辛いです。
>>396
学部も文系、職種も文系で、C++に更に種類があることも存じませんでした。
>>397
基礎からみっちりと身につけるつもりでいます。
ただまあ、仕事は待ってくれないという問題はたしかにございます。
今ぶつかっている問題は、例えば、
「参考書のAの項目とBの項目は理解できました。」
「じゃあAとBを組み合わせて使ってください」 → ( ゚д゚ )
という、初歩の部分でも応用が全くできないというところです。
0404392
2007/10/21(日) 00:58:35なんだか入社時の適性ではプログラマ寄りの適性だったらしいのですが、
変数の概念が理解できない時点で色々とダメな気がします。
>>399
なるほど、情報源を複数持つことですね。
今は黙々と入門書とにらめっこしている状態ですが、
入門書を真似する>試す>わからないところが出てくる>考える>やっぱりわからない>調べる>何をどうやって?
でもって、周囲は待ってはくれないので、「そういう風に動くもんなんだ」と自分を納得させてます。
>>402
困ったことに理想を持つ前に、来月自分の机がそこにあるかという現実がありました。
通そうとする我すらありません。
0405デフォルトの名無しさん
2007/10/21(日) 01:00:51そういう種類の C++ があるわけじゃない
どれも、まだ C++ がさっぱりわからない状態では読む本じゃないな
0406デフォルトの名無しさん
2007/10/21(日) 01:07:50Accelerated/Effective/Exceptional C++ 進める奴とか結構いるけどさ
どう考えたって間違ってるだろ
0407デフォルトの名無しさん
2007/10/21(日) 01:11:18ちゃうw
Accelerated C++とEffective C++はC++の種類じゃなくて本ね。
特に、Effective C++はC++使ってるなら知らないとモグリだと言われるくらいの本なので、
いつか辿り付くといいね。
初心者にはちときつい。
0408デフォルトの名無しさん
2007/10/21(日) 01:21:48世のため人のためこのスレのため、仕事を断れ。
0409デフォルトの名無しさん
2007/10/21(日) 02:16:14できるならjava方面にしてもらえよ
つかそれって肩たたきなんじゃねえの
0410デフォルトの名無しさん
2007/10/21(日) 04:06:00Effective C++ って第2版と第3版有るのですが、買うならやっぱり第3版のほう?
あと、C++の趣味グラマーにお薦めの入門書の次に読む本って何かある?
0411デフォルトの名無しさん
2007/10/21(日) 09:23:26自分も最近始めたC++趣味グラマーだが、C++ Primer 第4版を読んでる。
分厚いけど結構おすすめ。他の入門書よりかなり詳しく書かれているから。
1冊目としてはおすすめできないけど。2冊目にはいい。
特にAccelerated C++を読んだ人にはおすすめ。著者も一部共通しているし、
クラスの書き方からではなく、使い方から学んでいくという方針も共通している。
自分もAccelerated C++の後にこれを読み始めた。
今はちょうどPart Iを読み終えたところ。
ここまででやっと300ページ。あと残りページ600ページほど。
0412デフォルトの名無しさん
2007/10/21(日) 09:46:09なかなかないような気がする。なんでだろうなぁ。
今なら一冊目が
やさしいC++ 第3版 http://www.amazon.co.jp/dp/4797343672/ になるのかな。
これだけじゃあ絶対無理だと思うから
二冊目として C++ Primer を読むことになるのかな。
個人的には
標準講座C++ http://www.amazon.co.jp/dp/4881357050/ が
章立てとかよく考えられててよかったなぁと思うけどもう絶版ぽくて
出版社のサイトでもリストから消えてた気がする。
0413デフォルトの名無しさん
2007/10/21(日) 10:15:58小林 健一郎 (著)
http://www.amazon.co.jp/dp/4062129973
自分は読んだことないけど、こんなのはどうなんでしょう。
Accelerated C++、Effective C++を訳した人が自分で書いた本。
0414デフォルトの名無しさん
2007/10/21(日) 10:57:16http://www.amazon.co.jp/dp/479732743X
店頭で立ち読みして検討した結果、これが一番よかった。
ほんとうはBjeane先生の本が一番好きなんだけど難しいからねえ。
0415デフォルトの名無しさん
2007/10/21(日) 20:42:42研究者でデータ集めの道具として2年ほどC,C++を見よう見まねでいじっていました。
VS2005でなんとか自分のデータをいじるプログラムを作る事は出来ていたのですが、
サーバ側でデータをいじる必要がでて来て、LinuxでのC++統合開発環境を物色しています。
ずっと昔はemacs か mule ,少し前だとWideStudio, 最近はeclipse が定番のようですが、
アマチュア向けのC++開発環境としてVS2005から移行するのに今お勧めなのはどれ?
0416デフォルトの名無しさん
2007/10/21(日) 20:45:470417デフォルトの名無しさん
2007/10/21(日) 21:03:080418デフォルトの名無しさん
2007/10/21(日) 21:38:02vi
0419デフォルトの名無しさん
2007/10/21(日) 21:44:410420デフォルトの名無しさん
2007/10/21(日) 21:56:50それとも継続的に開発することになるのかな?
前者で、プラットフォームに依存したコードなんかもいらないなら、
開発は今までどおりVS2005でして、コンパイルだけLinuxですればいいと思う。
0421デフォルトの名無しさん
2007/10/21(日) 22:22:09eclipse以外に、KDEならKDevelopが、GNOMEならAnjutaが定番。
Windowsっぽさを求めるならKDEが無難。
0422デフォルトの名無しさん
2007/10/22(月) 00:23:26もっぱらEmacsで書かれてる。ついでにいうとほとんどPythonで。
0423デフォルトの名無しさん
2007/10/22(月) 01:39:34Cの場合K&Rでいいような気がするけどそれはどうよと突っ込まれる事もある。
0424415
2007/10/22(月) 02:36:46>>420
継続的に必要になります。
今はデータを全部Windowsマシンにコピーしてそれを材料にしながらVS2005でコードを書いて
同じデストリのLinuxを入れたテスト系マシンに移してコマンドラインでコンパイルしなおして
さらに本番系にコピーしてしのいでいるのですが、どうも不自然な気がして....
も能率的なやり方とは思えないので.....
0425デフォルトの名無しさん
2007/10/22(月) 10:57:25WinScpを巧く使えば、ソースをLinux側に置いたままVSでコーディングと事前コンパイルだけすることができるよ。
# 勿論、一時的にWindowsに転送しているのは言うまでもないけど。
つーか、スレ違いなんでほどほどに。
0426415
2007/10/22(月) 11:10:30スミマセン、特定の環境のスレだと擁護者やらアンチやらがいて初心者にとっては
誰を信じて良いか判らなくなりそうだったのでここで聞きました。eclipseはJ系
の人が多そうなので、C++で使っている人の意見を聞きたかったんです。
0427デフォルトの名無しさん
2007/10/22(月) 14:26:370428デフォルトの名無しさん
2007/10/23(火) 00:32:35boost の bind の練習で、rubyのeachのようなものを作ろうとしたんですが
エラーが下のように出てしまってうまくコンパイルできません。どこが問題なのでしょうか。
test1.cpp: In function `int main()':
test1.cpp:32: error: no matching function for call to `Foo::Foreach(boost::_bi::bind_t<void, void
(*)(int, int&), boost::_bi::list2<boost::_bi::value<int>, boost::arg<1> > >)'
test1.cpp:8: note: candidates are: void Foo::Foreach(T&) [with T = boost::_bi::bind_t<void, void (
*)(int, int&), boost::_bi::list2<boost::_bi::value<int>, boost::arg<1> > >]
0429428
2007/10/23(火) 00:35:49#include <iostream>
#include <boost/bind.hpp>
class Foo
{
public:
template <typename T> void Foreach( T& f)
{
for(int i= 0 ; i<10; ++i)
{
f(data[i]) ;
}
} ;
private:
int data[10] ;
} ;
void bar( int& data )
{
data = 1234 ;
}
void hoge( int x, int& data )
{
std::cout << data * x << std::endl ;
}
int main()
{
Foo foo ;
foo.Foreach( bar ) ;
foo.Foreach( boost::bind( &hoge, 10, _1 ) ) ;
return 0 ;
}
0430デフォルトの名無しさん
2007/10/23(火) 00:36:130431デフォルトの名無しさん
2007/10/23(火) 00:39:41ファンクタは値渡しで。
0432デフォルトの名無しさん
2007/10/23(火) 00:43:17またはconst T& なら通るんじゃない?
0433429
2007/10/23(火) 00:54:03ありがとうございます。
値渡し、const T&のどちらでもコンパイルがとおりました。
どうもありがとうございました。
0434デフォルトの名無しさん
2007/10/24(水) 21:03:07関数内でインスタンスごとのstatic変数(=関数内private変数)が欲しい!!
その関数内でしか使わないprivateな変数でもメンバ変数にしないとあかんやん
これって、ソースが膨大になった時ってこのprivate変数はどこでつかわれてるんやろうなって
探した結果、この関数内だけかい!!
って時に欲しくない?
0435デフォルトの名無しさん
2007/10/24(水) 21:27:35関数内 だったら 単なる Auto 変数 ってことじゃないの!?
0436デフォルトの名無しさん
2007/10/24(水) 21:30:240437デフォルトの名無しさん
2007/10/24(水) 21:35:400438デフォルトの名無しさん
2007/10/24(水) 21:42:48class Foo
{
private:
int hoge;
public:
Bar(Foo f): { f.hoge = 99999; }
};
自分はこんなこと出来ちゃうのがちょっと気になる。
クラスごとでなく、インスタンスごとのprivate変数があれば、
こういう操作を禁止できるわけですよね?
0439デフォルトの名無しさん
2007/10/24(水) 21:48:240440デフォルトの名無しさん
2007/10/24(水) 22:02:46testクラスのfriend関数からtestクラスにある
test2クラスのオブジェクトの参照をしようとすると
エラーになります。
class test2{
double d;
public:
test2(){d=10;}
double np(){return d;}
};
class test{
static test2 te;
public:
friend double xxx(double d){return te.np();}
};
これはだめですか?
0441デフォルトの名無しさん
2007/10/24(水) 22:14:27まずはその厚かましさを恥じろ。
test2はxxxを友達だなんて思って(宣言して)ないでしょ?
0442440
2007/10/24(水) 22:24:12>>440のコードそのまま貼り付けたままならビルドできましたが
void main(){
cout<<xxx();
}
のように使うと駄目みたいです。
えーと、本当にやりたいことは
クラスのメンバ関数を関数ポインタに入れられないかと思いまして、
だからと言って、そのままやるとできなかったので、
一旦friend関数か何かを経由してやればできるかなぁと考えました。
無理みたいでしたけど。
(C言語でかかれたコードで、関数ポインタを渡して使う関数があったので、
どうにかしてC++で作ったクラスのメンバ関数を渡せないかと考えてます)
0443デフォルトの名無しさん
2007/10/24(水) 22:53:21friend double xxx(double d){return te.np();}
を呼ぶつもりなら
void main(){
cout<<xxx();
}
は xxx に引数がないようだが?
0444デフォルトの名無しさん
2007/10/24(水) 22:53:32Auto変数じゃなくてstatic。関数を抜けた後も値を保持してるってこと
0445デフォルトの名無しさん
2007/10/24(水) 22:58:11ってことは、C言語の時は関数内でstatic変数を使用したことがないってことですか?
0446デフォルトの名無しさん
2007/10/24(水) 22:59:43もし、そうでしたらC言語の場合はモジュール分割ってことになるんですよね?
0447デフォルトの名無しさん
2007/10/24(水) 23:01:32静的メンバ関数なら普通の関数へのポインタへ変換できる。
こっちから関数への引数を1つくらい
渡せれば、(例えばWinAPIのEnumWindowsのように)
それを使って非静的関数も呼べる。
0448デフォルトの名無しさん
2007/10/24(水) 23:03:36こういうのは不思議に思ったことがあるんだけど
そういうことではないんだよね
0449デフォルトの名無しさん
2007/10/24(水) 23:23:03実行時のアクセス制御になっちゃうけど
0450440
2007/10/24(水) 23:26:25あ、すいません
void main(){
cout<<xxx(0.0);
}
でも駄目です。
error C3767: 'xxx': 候補の関数はアクセス可能ではありません。
1> '.\NNN.cpp(30)' の friend 関数である可能性があります : 'xxx' [引数依存の照合を使って検出される可能性があります]
こんなエラー文になります
0451440
2007/10/24(水) 23:36:07こんなふうにしても駄目でした。
class test;
class test2{
friend test;
double d;
public:
test2(){d=10;}
double np(){return d;}
};
class test{
static test2 te;
public:
static double x;
static double xxx(double d){return x;}
};
void main(){
cout<<test::xxx(0.0)<<endl;
}
変なエラーが出ます。
0452デフォルトの名無しさん
2007/10/24(水) 23:37:00メンバ変数と関数内static変数ではライフサイクルが違うじゃないか
>>434の話と違っている
0453440
2007/10/24(水) 23:51:32変数の再宣言忘れてました・・・
どうも、おつかれさまです
0454デフォルトの名無しさん
2007/10/24(水) 23:55:48そう?
クラス分割のサインって言うのはちょっといいすぎな気が・・・。
もちろん、時と場合によるけど。
ただ、privateなインスタンス変数より、さらにアクセスが厳しくなるんですよ!!
privateなインスタンス変数だとクラス内から使用できるけど、関数内インスタンス変数はその関数内でしか使えない。
よくないかい?
0455デフォルトの名無しさん
2007/10/24(水) 23:58:54C言語でもC++みたいな、すなわちクラスみたいに作成したら結局同じかなっと思ってるんですけど・・・。
私は、C言語でもクラスみたいに書いてたので・・・。
0456デフォルトの名無しさん
2007/10/25(木) 00:08:24関数ポインタでやるんだったら、関数ポインタでやらないと。
フレンドなんか滅多に使うことはないんだから。
関数ポインタがあるってことは、イベントを呼ぶってことでしょ?
そのソースの目的を見失わないようにね
0457デフォルトの名無しさん
2007/10/25(木) 00:27:34うーん……
0458デフォルトの名無しさん
2007/10/25(木) 00:54:27関数が2個以上の場合でも汎用的に使えるし。
0459デフォルトの名無しさん
2007/10/25(木) 01:43:56int v;
public:
Foo(int a = 10):v(a){}
int get(){return v;}
};
class Bar{
static Foo f1;
Foo f2;
public:
friend int func1();
friend int func2(Bar);
};
Foo Bar::f1;
int func1(){return Bar::f1.get();}
int func2(Bar b){return b.f2.get();}
int main ()
{
std::cout << func1();
Bar b;
std::cout << func2(b);
return 0;
}
0460デフォルトの名無しさん
2007/10/25(木) 02:07:49(Effective C++ 第3版の24項と46項を参照)
0461デフォルトの名無しさん
2007/10/25(木) 02:14:59friend によって非メンバ関数になる
第一引数はそのクラスのオブジェクトでないと駄目
0462デフォルトの名無しさん
2007/10/25(木) 02:52:06使用先で関数を推論しているのかと思い同じような事をしてみたんですが、どうにもうま最適なく関数を絞り込めないようです。
0463デフォルトの名無しさん
2007/10/25(木) 02:55:430464デフォルトの名無しさん
2007/10/25(木) 03:24:20iterator vector::begin();
const_iterator vector::begin() const;
↑これが↓こんな感じでオーバーロード解決される。
iterator vector_begin(vector* this);
const_iterator vector_begin(vector const* this);
0465デフォルトの名無しさん
2007/10/25(木) 03:32:490466デフォルトの名無しさん
2007/10/25(木) 05:39:48そうなってくれないとしたら、それは何らかの意味で「違うこと」をやっているのでは。
0467デフォルトの名無しさん
2007/10/25(木) 07:57:100468デフォルトの名無しさん
2007/10/25(木) 10:12:04ごめん。言い方が少し悪かったです。反省します。
staticという言葉は無視してください
まとめると
「関数内でしか使えないメンバ(インスタンス)変数が欲しい」ってことです
なのでもちろんクラスのメンバです。
0469デフォルトの名無しさん
2007/10/25(木) 11:33:13いくらぐぐってもみちかんない……
0470デフォルトの名無しさん
2007/10/25(木) 11:35:46std::istringstream
0471デフォルトの名無しさん
2007/10/25(木) 11:41:11#include <iostream>
#include <sstream>
#include <iomanip>
int main()
{
float f = 3.14f;
std::ostringstream s;
s << std::setprecision(4) << std::showpoint << f;
std::cout << s.str() << std::endl;
}
0472デフォルトの名無しさん
2007/10/25(木) 12:04:3432bit表現の浮動小数点数とは IEEE-754 のことですか?
そういうのは標準関数ではないと思います。
0473デフォルトの名無しさん
2007/10/25(木) 13:32:01そもそもC++にこだわる必要ないんだった……
他スレ行ってきます。
0474デフォルトの名無しさん
2007/10/25(木) 18:27:05float x = 12.34;
ss << x;
でいいんじゃないの?
0475474
2007/10/25(木) 18:27:440476デフォルトの名無しさん
2007/10/25(木) 19:01:54a[0] = new int[3];
a[1] = new int[2];
for(int i=0; i<3; ++i) a[0][i] = i;
for(int i=0; i<2; ++i) a[1][i] = i;
とかやったときに、a[0]行の配列のサイズを知る方法ってありますか?
sizeof()を使ってもうまく出力できません。
0477デフォルトの名無しさん
2007/10/25(木) 19:22:020478aho
2007/10/26(金) 00:16:40int a0_size = 3;
int a1_size = 2;
int ** a = new int*[2];
a[0] = new int[a0_size];
a[1] = new int[a1_size];
.......
printf("size of a0 is %d\n", a0_size);
では、あかんのかね?
これでも十分なきがするけど・・・
0479デフォルトの名無しさん
2007/10/26(金) 18:38:390480デフォルトの名無しさん
2007/10/26(金) 22:03:30どんな方法使ってる?
begin()とend()?
0481デフォルトの名無しさん
2007/10/26(金) 23:56:41/* a.h */
class a{
static type_0 m0;
static type_1 m1;
};
/* a.cpp */
type_0 a::m0(123);
type_1 a::m1(a::m0);//m1はコンストラクタでtype_0の変数を必要とする
プログラムの都合上a::m0はa::m1の前に初期化されている必要があるんですが、
m0がm1の前に初期化されているという保証はあるんでしょうか?
0482デフォルトの名無しさん
2007/10/26(金) 23:57:110483デフォルトの名無しさん
2007/10/26(金) 23:57:17Dos画面がすぐに閉じてしまうのですが
「何かキーを押してください」のような画面を表示して待機するためには
どうするのが普通なのでしょうか
0484デフォルトの名無しさん
2007/10/26(金) 23:58:41VS2005ならCtrl + F5でデバッガに乗せずに実行
デバッガに乗せて実行するなら、<conio.h> _getch()を実行
0485デフォルトの名無しさん
2007/10/27(土) 01:04:35同一翻訳単位であれば定義した順序に初期化される(3.6.2/1)。
ただし、翻訳単位が異なる場合は順序が不定であり、static initialization order fiasco として知られる問題を引き起こす。
ttp://www.parashift.com/c++-faq-lite/ctors.html
の、10.12 以降を参照。
0486デフォルトの名無しさん
2007/10/27(土) 01:28:55フォルダの情報と、
ファイルをドラッグ&ドロップしたときのフォルダの情報が
違うのですが、
どうやって対処したらよいですか
0487デフォルトの名無しさん
2007/10/27(土) 01:33:05そしてそういうのはスレ違いだから二度と質問しないように。
0488デフォルトの名無しさん
2007/10/27(土) 01:33:22俺には力不足だ。
0489デフォルトの名無しさん
2007/10/27(土) 01:34:22ケコ━━━━(・∀・)人(・∀・)━━━━ン
0490486
2007/10/27(土) 01:49:51ドラッグ&ドロップした場合は2番目の引数の文字列に
c:\xxxx\file.txt
ってなるので
c:\xxxx\
の部分だけ抽出して対処しようとしたのですが
もっと普通の方法があると思って質問しました。まあいいや。
c:\xxxx\
を抽出して、そのあとに任意のファイル名の文字列を追加する
いい方法あるでしょうか。
0491デフォルトの名無しさん
2007/10/27(土) 01:53:26とりあえず言えることは、ファイルパスを分離する標準ライブラリはない。
0492デフォルトの名無しさん
2007/10/27(土) 02:08:020493デフォルトの名無しさん
2007/10/27(土) 02:09:48それとも、「自分の頭の中にあるものは、そのままでは相手には見えない」ということに
まだちゃんと納得できていない年齢なのか?
0494デフォルトの名無しさん
2007/10/27(土) 02:28:460495デフォルトの名無しさん
2007/10/27(土) 02:38:05できてないのは起こった問題の説明
0496デフォルトの名無しさん
2007/10/27(土) 04:03:09みたいなことできなかったけ?
0497デフォルトの名無しさん
2007/10/27(土) 04:10:24vector<vector<int> > v;
ならできるが。
0498デフォルトの名無しさん
2007/10/27(土) 04:14:55class A{
int x;
vector<int> y;};
vector<int> z;
0499デフォルトの名無しさん
2007/10/27(土) 04:17:23int x;
vector<int> y;};
vector<A> z;
0500デフォルトの名無しさん
2007/10/27(土) 04:17:450501デフォルトの名無しさん
2007/10/27(土) 04:19:3422秒差・・・
0502デフォルトの名無しさん
2007/10/27(土) 04:34:59だな。やるなら。
0503デフォルトの名無しさん
2007/10/27(土) 04:37:480504デフォルトの名無しさん
2007/10/27(土) 04:43:290505デフォルトの名無しさん
2007/10/27(土) 12:17:57map<int, vector<int> >とかmultimap<int, vector<int> >はどう?
0506デフォルトの名無しさん
2007/10/27(土) 12:29:330507デフォルトの名無しさん
2007/10/27(土) 12:31:44int,
pair<
int,
pair<
int,
pair<
int,
vector<
pair<
int,
pair<
int,
pair<
int,
vector<
int
>
>
>
>
>
>
>
>
>
0508486
2007/10/27(土) 12:52:16できたからいいよ。
とりあえず役立たずの>>493は死んでいいよ
0509デフォルトの名無しさん
2007/10/27(土) 12:59:05たしかに>>493は口が悪いから怒るのも分かるが、>>508の最後の1文も醜い。
やってることは同レベルだ。
つまらない仕返しなどせず、ほっとけ。
それと説明が下手だというのは事実だから、素直に受け止めたほうがいい。
そして俺もスレ汚し。すまそ。
0510デフォルトの名無しさん
2007/10/27(土) 13:37:30なんというリスト構造…
0511デフォルトの名無しさん
2007/10/27(土) 15:22:47”実体化”
というのがわからないんですが、
これは何ですか?
0512デフォルトの名無しさん
2007/10/27(土) 15:23:320513デフォルトの名無しさん
2007/10/27(土) 20:14:29ある程度の年齢に達したお馬鹿さんというのは
「指摘を活かせない人生を送ってきたから今そうしてそこにいる」わけで、
そういう人に指摘しても無駄。イジることに終始してたほうが面白いよw
0514デフォルトの名無しさん
2007/10/27(土) 20:22:250515デフォルトの名無しさん
2007/10/27(土) 20:23:500516デフォルトの名無しさん
2007/10/27(土) 20:25:51cppllは閑古鳥無いてるし
どこか良いコミュニティはないものか
0517デフォルトの名無しさん
2007/10/27(土) 20:28:36スレ違いならずっとあるけど。
0518デフォルトの名無しさん
2007/10/27(土) 20:30:410519デフォルトの名無しさん
2007/10/27(土) 20:44:07hppだよな
0520デフォルトの名無しさん
2007/10/27(土) 23:04:56これって何の略なんでしょか。friendではなさそうだし、fuckもあえりない。
気になってしゃあないっす。。。
0521デフォルトの名無しさん
2007/10/27(土) 23:07:190522デフォルトの名無しさん
2007/10/27(土) 23:10:59Exceptional C++ Style
P.29
>・デフォルトパラメータを持つメンバー関数のシグニチャは、
> 「等価な振る舞いを持つ2つ以上のメンバー関数のシグニチャ」に
> 置き換えても良い。
>・メンバー関数のシグニチャには、追加のデフォルトパラメータが
> 含まれていても良い。
P.30
>つまり、コードの移植姓を保ちながら標準ライブラリのメンバー関数
>へのポインタを生成することは不可能なのだ。
理解できん。ここで教えてくれw
0523デフォルトの名無しさん
2007/10/27(土) 23:11:530524デフォルトの名無しさん
2007/10/28(日) 00:21:38Exceptiol C++ Style は持ってないおれが説明してやるからちょっと待ってろ。
まず、そのルールは規格の 17.4.4.4 にある記述に対応するもの。言い回しや
順番は違うけど同じことを言っている。
0525デフォルトの名無しさん
2007/10/28(日) 00:21:59【実装者A】
うはwwwww
list.clear(int hogehoge = 8)
【実装者B】
おkwwwww
list.clear(bool hige = false)
【使う人】
ちょwww関数ポインタに移植性ナスwwwwwwww
0526524
2007/10/28(日) 00:22:10長くなったからレス2つに分けるよ。
以下のクラス S とそのメンバ関数 foo が標準関数として規定されている場合。
// 規格の表記
struct S {
int foo(int a, int b = 0);
};
以下の実装はどちらも >522 に挙げられた明示的な許可によって、規格に
準拠したものと言える。
// 実装 A
struct S {
int foo(int a) { return foo(a, 0); }
int foo(int a, int b);
};
// 実装 B
struct S {
int foo(int a, int b = 0, c = 1);
};
0527524
2007/10/28(日) 00:22:42規格の表記にある S::foo(int, int) へのポインタを使って、以下のような
コードを書くことが考えられる。
void f(std::vector<int>& v, S& s, int x) {
std::for_each(v.begin(), v.end(), boost::bind(&S::foo, s, x, _1));
}
実装が規格のとおりであればこのコードは問題なくコンパイルでき、意図した
とおりに動作する。
しかし実装 A のように実装されていた場合、 &S::foo では
オーバーロードされた2つの S::foo うちのどちらかコンパイラは判別
できず、コンパイルエラーになる。その場合、コードを以下のように
変更することで問題を回避できる。
void f(std::vector<int>& v, S& s, int x) {
std::for_each(v.begin(), v.end(),
boost::bind(static_cast<int (S::*)(int, int)>(&S::foo), s, x, _1));
}
このコードは規格の表記のとおりの実装と、実装 A の両方に対応できて
いる。
しかし実装 B のように実装されていた場合、 int (S::*)(int, int) に
マッチする S::foo は存在しないので、コンパイルエラーとなってしまう。
現状の規格ではどの実装も規格に準拠したものとされてしまうため、すべてに
対応するような(移植性のある)方法で S::foo へのポインタを使うことは
できない。
0528デフォルトの名無しさん
2007/10/28(日) 01:09:33下のようなScatteredHierarchyクラスを習作で作ってみたんですが、なんとかTypelistを見せないようにしたいんです。
・テンプレート引数にTypelistが必要なScatteredHierarchy
template <class T> struct ScatteredHierarchy ;
template <class T, class U> struct ScatteredHier: public T, public ScatteredHierarchy<U>{} ;
template <> struct ScatteredHierarchy<NullType> {} ;
0529528
2007/10/28(日) 01:12:08○ template <class T, class U> struct ScatteredHierarchy<Typelist<T,U> >
: public T, public ScatteredHierarchy<U>{} ;
0530デフォルトの名無しさん
2007/10/28(日) 01:21:560531デフォルトの名無しさん
2007/10/28(日) 01:24:47C++0xにならないとムリみたい。
とりあえずはboost::mplで我慢
0533デフォルトの名無しさん
2007/10/28(日) 10:39:550534デフォルトの名無しさん
2007/10/28(日) 13:42:41{
IDirectDrawSurface7 * pdds;
// 色々
retrun pdds;
}
上記のようなソースを見たのですが、このメンバ関数を2回以上呼び出すと
最初の同じppdsの値を何回も返したりしないのでしょうか?
0535534
2007/10/28(日) 13:47:24色々のところで初期化(CreateSurface)してました。
0536デフォルトの名無しさん
2007/10/28(日) 13:48:23「//色々」のところを省略されては、答えようがない。
0537デフォルトの名無しさん
2007/10/28(日) 13:52:48なるほどpddsの値は不定ですか
勉強なりますた
0538デフォルトの名無しさん
2007/10/28(日) 14:36:17ありがとう。やっと理解できた。ありがとー
0539デフォルトの名無しさん
2007/10/28(日) 14:44:29template < class T, class T1 > f( T (*p)(T1) ){
typename s<T (*)(T1)>::result r;
}
int F(char){...};
void test(){
typename s< &F >::result r; //エラー
f( &F ); //エラーじゃない
}
こうなるのは何でですか?
0540デフォルトの名無しさん
2007/10/28(日) 15:04:35まず、まともにコンパイルできるものをだせよ。
クラスsのプライマリテンプレートがないし、
関数fに戻り値がない。
関数testはテンプレートではないので、中でtypenameは使えない。
あと、何が疑問なのか分からん。
クラスsのテンプレートパラメータに渡せるのは型だ。
&F ; //これは関数Fへのポインタ、int(*)(char)型への値
int (*)(char) ; // これは関数Fへのポインタの型
0541デフォルトの名無しさん
2007/10/28(日) 17:08:33int main(){ foo<int>::foo a; }
でこれのコンパイルが通ってしまうんですが、理由がわかりません。
::foo のところです。
どなたか教えてください。
0542541
2007/10/28(日) 17:14:30int main() {
bar b1;
bar::bar b2;
bar::bar::bar b3;
}
これも通るんですね。。
何故?!
0543デフォルトの名無しさん
2007/10/28(日) 17:28:49クラス名自身がクラスのメンバとして登録されているから。
メンバになってるクラス名は "injected-class-name" と呼ばれる。
規格の 9 (Classes) p2 より
> A class-name is inserted into the scope in which it is declared immediately after the class-name is seen.
> The class-name is also inserted into the scope of the class itself; this is known as the injected-class-name.
> For purposes of access checking, the injected-class-name is treated as if it were a public member name.
0544デフォルトの名無しさん
2007/10/28(日) 17:32:35ありがとうございます!
0545デフォルトの名無しさん
2007/10/28(日) 17:38:00gccの方が準拠度はいいのか?
0546デフォルトの名無しさん
2007/10/28(日) 17:45:25へえ。VC++はもってないのだが、
typedef struct bar_ {
typedef struct bar_ bar;
} bar;
とか,
struct bar_ {
typedef struct bar_ bar;
};
typedef struct bar_ bar;
とかすれば同じ事ができる?
0547デフォルトの名無しさん
2007/10/28(日) 18:15:12そもそも何のために規格でこんなことを決めているのかわからない。
0548デフォルトの名無しさん
2007/10/28(日) 18:27:06class Base
{
protected :
int value ;
} ;
class Derived : public Base
{
int value
void f()
{
value = 0 ; //どっちのvalueなのかややこしい
Base::value = 0 ;
Derived::value = 0 ;
}
} ;
0549デフォルトの名無しさん
2007/10/28(日) 18:28:560550デフォルトの名無しさん
2007/10/28(日) 18:38:58クラス(構造体)名に限って、同じスコープにある他の型と名前が重複しても
ODR違反にならないため、
int f;
struct f { int i; };
と書ける。このとき、単にfと書くとint型の方が、f::fと書くとstructの方が選ばれる。
int main() {
f a; // [ERROR] int型のfが選ばれるが、「<識別子> <識別子>」という構文はない
f::f b; // [OK] struct fの方が選ばれる
f = 1; // [OK] int型のfに1を代入
return 0;
}
0551デフォルトの名無しさん
2007/10/28(日) 19:00:03gccのバグ
規格の3.4.3.1/1a 見ろ。
0552デフォルトの名無しさん
2007/10/28(日) 19:04:40その場合は struct f と書けばいい。 f::f が必要な理由にはならない。
0554デフォルトの名無しさん
2007/10/28(日) 19:07:00すまんがいま手元に本がない。簡単に何が書いてあるか教えて。
0555デフォルトの名無しさん
2007/10/28(日) 19:10:24> If the nested-name-specifier nominates a class C, and the name specified after the nested-name-specifier,
> when looked up in C, is the injected-class-name of C (clause 9), the name is instead considered to name the
> constructor of class C. Such a constructor name shall be used only in the declarator-id of a constructor definition
> that appears outside of the class definition.
0556デフォルトの名無しさん
2007/10/28(日) 19:13:180557デフォルトの名無しさん
2007/10/28(日) 19:14:51だがしかし。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#318
gcc はこいつを先取りしてる、とか?
0558デフォルトの名無しさん
2007/10/28(日) 19:17:520559デフォルトの名無しさん
2007/10/28(日) 19:22:430560デフォルトの名無しさん
2007/10/28(日) 19:35:34A::A はやっぱり駄目で struct A::A は OK とか、もうさっぱり意味がわからない。
> A::A a; // error, A::A is not a type name
> struct A::A a2; // object of type A
0561デフォルトの名無しさん
2007/10/28(日) 20:54:000562デフォルトの名無しさん
2007/10/28(日) 21:34:060563デフォルトの名無しさん
2007/10/29(月) 23:04:27親クラスの型毎にクラステンプレートの特殊化を定義したいのですが方法がわからないのです
0564デフォルトの名無しさん
2007/10/29(月) 23:06:27無いはず。あるとしたら、多重継承したときにどうなるのかわからない。
0565デフォルトの名無しさん
2007/10/29(月) 23:13:35boost::is_base_ofでenable_ifとかそういう話じゃなくて?
0567デフォルトの名無しさん
2007/10/30(火) 00:17:16調べてみるのはいいが、せめてこれ ttp://www006.upp.so-net.ne.jp/yotto-k/doc/tmp.pdf の60ページ前後まで理解できないとつらいとおもうよ。
0568デフォルトの名無しさん
2007/10/30(火) 00:31:59現在GetValueをオーバーロードすることで
1次元的にも2次元的にもアクセスできるようにしています。
それに加えて添字演算子を使って
[i]で1次元的、[x][y]で2次元的にアクセスできるようにしたいのですが
何かよい方法はないでしょうか?
1次元、2次元どちらかだけ対応させることはできるのですが
両方に対応させる方法が思いつきません。
template<class T> class CArray{
T* m_array;
int m_width;
int m_height;
public:
//中略
//1次元的アクセス
T& GetValue( int i ) {
return m_array[i]; }
//2次元的アクセス
T& GetValue( int x, y ){
return m_array[ y*width + x ]; }
};
0569デフォルトの名無しさん
2007/10/30(火) 00:33:110570デフォルトの名無しさん
2007/10/30(火) 00:34:590571デフォルトの名無しさん
2007/10/30(火) 01:10:00その本買う価値ある?
0572デフォルトの名無しさん
2007/10/30(火) 01:15:17簡単に知ろうと思うなら買っとけ。
0573デフォルトの名無しさん
2007/10/30(火) 03:29:21T** ptr; のとき
ptrをdeleteするとptrが保持してたポインタも一緒にdeleteされてしまいますか?
0574デフォルトの名無しさん
2007/10/30(火) 03:37:07pをdeleteすると、pの示す先(*p)に0が代入されると思いますか?
0575デフォルトの名無しさん
2007/10/30(火) 03:37:370576デフォルトの名無しさん
2007/10/30(火) 04:54:17more effective c++を買った。
該当部分の翻訳:
> そのようなクライアントは、あたかもアラーの神に忠実な本物の生々した2次元配列を使ってプログラムする。
は、いまだに何を言ってるのかサッパリだが、ソースコード部分は(他の節も含め)とても参考になった。
吉川さんが訳してくれればいいのに……。
0577デフォルトの名無しさん
2007/10/30(火) 06:54:21>Such clients program as if they were using real, live, honest-to-Allah two-dimensional arrays.
になってる。honest-to-Allah は「神に誓って」ぐらいで強調でしかないだろうから、
「そのようなクライアントは、まるで本当に本物の2次元配列を使っているかのようにプログラムを書くことになる」
くらいでいいんじゃないかと思う。
0578デフォルトの名無しさん
2007/10/30(火) 07:24:15うーん、やはり原書を買った方がいいな……英語のがはるかにわかりやすい。
>>577ありがとう。やっと決心がついた。
0579デフォルトの名無しさん
2007/10/30(火) 13:08:18#ifndef CLASSA_H_
#define CLASSA_H_
template<class T> class A {
publilc:
void func(T);
};
#endif
////classA.cpp////
#include "classA.h"
template<class T> void A<T>::func(T t) {
//略
}
////test.cpp////
#include "classA.h"
int main() {
A a;
a.func(T); // Tについては略
// 以下略
このときmain内でfuncなんてねーよって怒られるのですが
どう解決したらいいのかわかりません
どなたかご教授を・・・
0580デフォルトの名無しさん
2007/10/30(火) 13:23:200581579
2007/10/30(火) 13:34:140582デフォルトの名無しさん
2007/10/30(火) 14:28:25>>579
////classA.h////
#ifndef CLASSA_H_
#define CLASSA_H_
template<class T> class A {
publilc:
void func(T);
};
- #endif
- ////classA.cpp////
- #include "classA.h"
template<class T> void A<T>::func(T t) {
//略
}
+ #endif
////test.cpp////
#include "classA.h"
int main() {
- A a;
- a.func(T); // Tについては略
// 以下略
0583デフォルトの名無しさん
2007/10/30(火) 14:35:11////classA.h////
#ifndef CLASSA_H_
#define CLASSA_H_
template<class T> class A {
publilc:
void func(T t) {
//略
}
};
#endif
0585デフォルトの名無しさん
2007/10/30(火) 19:28:25組み込みではほとんど使われないと聞いたが
メモリの使用量も同様に増えるもん?
何だかスレ違いですまん
0586デフォルトの名無しさん
2007/10/30(火) 19:45:12そんなことない。
0587デフォルトの名無しさん
2007/10/30(火) 21:15:36実行バイナリのテキスト部分、つまりマシン語のコードの分もメモリ食うから、その分は消費が増えていると言える。
ヒープやスタックを余分に食うかはコードの書き方によるが、ヒープの消費は若干減るケースが多いと俺は思う。
0588デフォルトの名無しさん
2007/10/30(火) 21:38:53仕組みを考えれば分かるだろ
0589587
2007/10/30(火) 21:45:220590デフォルトの名無しさん
2007/10/30(火) 21:56:310591デフォルトの名無しさん
2007/10/30(火) 22:01:37初版や原書持ってないから場所間違ってるかもしれないけど、2版の場合こうなってる。
「そのようなクライアントは、実在する、生きた、本当の2次元配列を使っているかのようにプログラムする」
まあ、割と普通。初版は相当キてるようだね
0592デフォルトの名無しさん
2007/10/30(火) 23:00:57技術書は英語でもスラスラ読めるよね
不思議なもんだ
新聞も読めない
0593デフォルトの名無しさん
2007/10/30(火) 23:04:21十分意味不明な気がするぞ…w
0594デフォルトの名無しさん
2007/10/30(火) 23:05:55とかいらねぇぇぇ
0595デフォルトの名無しさん
2007/10/30(火) 23:11:53これのどこが普通なんだ?
まずクライアントってのが変だろ。どう考えても。
ここは思い切って、「ライブラリを使用する側にとっては」などにしておいたほうが分かりやすいだろう。
「実在する、生きた、本当の」ってのも、くどすぎるだろ。アラーに忠誠を誓うのとあまり代わり映えしてないぞ。
「あたかも、本当に2次元配列であるかのように」などのように、何で出来なかったのか。
あと、「プログラムする」って何か違和感がある。
「プログラミングする」、とか、「コーディングする」という言い回しならそういう違和感も感じないんだが。
ハリポタや戸田奈津子並だな。
0596デフォルトの名無しさん
2007/10/30(火) 23:21:28この業界ではよく使うし
0597デフォルトの名無しさん
2007/10/30(火) 23:23:280598デフォルトの名無しさん
2007/10/31(水) 08:57:44ってどういう意味ですか?
0599デフォルトの名無しさん
2007/10/31(水) 09:44:20ちゃんと書いてあるのに。業界とか何の関係も無いし。
EffectiveC++すら読んでないということだね。
0600デフォルトの名無しさん
2007/10/31(水) 09:49:14デザパタ系の解説記事とかでよく見る気がする
0601デフォルトの名無しさん
2007/10/31(水) 09:49:27筆者は、STLのような「再利用可能な実用的なライブラリ」を書く、という立場で記述している。
つまり、この本での「クライアント」とは、「ライブラリの利用者」のこと(ちゃんとそう書いてある)。
それを前提を知っている人から見れば、>>591はそんなにおかしくはない。
0602デフォルトの名無しさん
2007/10/31(水) 10:26:05書籍や映画の字幕と較べるのは如何なものかと。
# それに、あの脱税社長と較べたら戸田さんが可愛そうだ。
0603デフォルトの名無しさん
2007/10/31(水) 10:34:22じゃあどうすればいいんだ?
A:無視
0604デフォルトの名無しさん
2007/10/31(水) 12:12:07←Neko
←Chorui ←Suzume
←Karasu
このようなクラス階層のオブジェクトをポリモフィズムする場合...
std::vector<Doubutu*> doubutu_;
と保持して、HonyuruiやChoruiに純粋仮想と定義されたメンバ関数を呼び出す時はダウンキャストする。
ダウンキャストするぐらいなら最初から、
std::vector<Honyurui*> honyurui_;
std::vector<Chorui*> chorui_;
と保持する。
どちらがいいのでしょうか?
0605デフォルトの名無しさん
2007/10/31(水) 12:17:240606604
2007/10/31(水) 12:38:09動物に例えたのがまずかったですかね。
HonyuruiとChoruiに共通の部分(仮想関数)がある場合、その部分を別のインターフェイス(Doubutu)として定義し、
継承することによって、HonyuruiやChoruiをDoubutuとして振舞う事も可能になり、便利だと思ったんですけど、
この多重継承事態がまずいですか?
0607デフォルトの名無しさん
2007/10/31(水) 12:42:550608デフォルトの名無しさん
2007/10/31(水) 14:15:17キャストしないほうが安全。いいか悪いかは自分で選べ。
0609デフォルトの名無しさん
2007/10/31(水) 14:42:10好きにすれば…としか。
ダウンキャストするなら、dynamic_cast 使えよ。
0610デフォルトの名無しさん
2007/10/31(水) 17:23:46GCCはGPLがあってだめでした。
BCCはWin32しかコンパイラがなさそうでだめでした。
よろしくお願いします。
0611デフォルトの名無しさん
2007/10/31(水) 17:55:20それを手に入れてどうするつもり?
0612デフォルトの名無しさん
2007/10/31(水) 18:04:050614デフォルトの名無しさん
2007/10/31(水) 20:43:09...のところは何か省略してる?
testは、「char型の要素数3の配列への参照を返す関数」。
違ってたらすまん。
0615デフォルトの名無しさん
2007/10/31(水) 21:13:05GCCのライセンスって、コンパイルしてできた出力には
GPLがかからないなんて例外事項が付いていなかったっけ?
0616デフォルトの名無しさん
2007/10/31(水) 21:37:43char 返し引数に ... を取る関数ポインタの3つの配列の宣言。
0617デフォルトの名無しさん
2007/10/31(水) 21:47:15そう言うならこれは?
0618デフォルトの名無しさん
2007/10/31(水) 21:51:43>char (&test(...))[3]
引数が...で、要素数3のchar配列への参照を返す、test関数……かな
>>617
>char (&test[3](...))
それってコンパイル通るのか?
分からん
0619デフォルトの名無しさん
2007/10/31(水) 22:24:50ふと思ったんだが、そういう例外事項がないと、
GPLなプログラムによって生成されたコンテンツはGPLになるのか?
たとえばエディタとかペイントソフトとか画像処理とか。
0620デフォルトの名無しさん
2007/10/31(水) 22:29:21Cだけど、これは参考になるはず。
598はこうなる(614で既出)。
test is function returning reference to array of char
testはcharの配列への参照を返す関数
>>617
test is array of function returning reference to char
charへの参照を返す関数の配列
関数の配列だから、普通の変数としては存在できそうにないな。
0621デフォルトの名無しさん
2007/10/31(水) 22:31:13このへんかな
http://www.gnu.org/licenses/gpl-faq.ja.html#GPLOutput
0622デフォルトの名無しさん
2007/10/31(水) 22:34:16それは derived work をどう解釈するかという形而上学的論争になるんじゃない?
エディタやペイントソフト程度なら、生成されたコンテンツは派生物にはならないと思うが、
emacs が生成した dump なんかは派生物になるだろうし。
緩める側への例外規定があれば、この論争を避けることができる。
0623598
2007/10/31(水) 22:41:55これboostスレに合ったんだよね
普通関数ポインタ/リファレンスならなら
char (*test[3])(...)とか、char (&test)(...)だよな・・・?とか思って助けてもらおうとおもった。
>>617の
char (&test[3])(...)は通らなかった。
この関数を呼んでる場面もsizeof( test(NULL) )みたいにsizeofに掛けてたから、
>>618の言う通り要素数3のchar配列参照を返すっぽい。
こんな書き方始めてしったよ・・・
0624デフォルトの名無しさん
2007/10/31(水) 22:52:00テンプレートクラス側のメソッドから、
(返り値がテンプレート参照のメソッド)
不正な値を表すnullのような返り値を返したいのですが
その際の「nullのような返り値」をどう定義したものか困っております。
漠然と、const staticで定義した定数の参照を返すか?と考えているのですが
詰めきれていません。
いいやり方はないものでしょうか?
宜しくお願いします。
0625デフォルトの名無しさん
2007/10/31(水) 22:55:13もはやどんな関数ポインタが出ようが理解できるという自信があったのに、
char (&test(...))[3] は理解できなかった。
charへのキャストか? それでoperator & ()をオーバーロードしているのかも、じゃ[3]はなんだ? とか思ってしまった。
まさか配列への参照を返す関数だったとは。
typedef char (&test(...))[3] ;
typedef char ret_type[3] ;
typedef ret_type & same_type(...) ;
int main()
{
std::cout << typeid(test).name() << std::endl ;
std::cout << typeid(same_type).name() << std::endl ;
std::cout << boost::is_same<test, same_type>::value << std::endl ;
}
うーん、人間コンパイラへの道は遠い。
0626デフォルトの名無しさん
2007/10/31(水) 23:07:38ポインタじゃ駄目なの?
>>625
char (&test(...))[3]みたいに出されると、
咄嗟に変数だと思っちゃうからねえ
0627デフォルトの名無しさん
2007/10/31(水) 23:14:02関数ポインタを引数に取る関数を、typedef使わないでってのは前に見たことがあったんだけど。
0628デフォルトの名無しさん
2007/10/31(水) 23:17:04&をいったん*に置き換えて考えてみたら、分かりやすかったんじゃない?
0629デフォルトの名無しさん
2007/10/31(水) 23:19:53今回はテンプレートの練習がてらに組んでる物なので、
テンプレートらしい解決法があればそちらを取りたい次第です
0630デフォルトの名無しさん
2007/10/31(水) 23:23:48うん、まさにポインタの出番だ
0631デフォルトの名無しさん
2007/10/31(水) 23:25:44その問題ってテンプレートは関係なくて、参照型を返すメソッドで
null相当の値を返したい、というのとはどこか違うの?
0632デフォルトの名無しさん
2007/10/31(水) 23:27:59ポインタをあたかも参照のように使えるラッパを書くとか。
で、is_valid()みたいなメンバ関数を付け加えるとか、
あるいは例外を投げるとか。
そもそも、例外投げていいような状況なら、ラッパなんて要らないがw
0633デフォルトの名無しさん
2007/10/31(水) 23:38:26型が決まっていればそれに対しての不正な値をひとつ決めればOKだと思うのですが、
テンプレで複数の型を扱う必要がある場合にどうするか、で悩んでます。
>>632
少し考えてはみたのですが、
そのテンプレがクラスのみではなく、char,int等の型も扱う場合に対処できるのでしょうか?
あと、基本例外はなしで考えてます。
精々printfぐらいで
0634デフォルトの名無しさん
2007/10/31(水) 23:46:550635デフォルトの名無しさん
2007/10/31(水) 23:48:55ポインタを使うのが妥当
不正な値を返すかどうかは実行時に決まるので
テンプレートでできることはない
テンプレートで解決できるのはコンパイル時の問題
0636デフォルトの名無しさん
2007/11/01(木) 00:04:070637デフォルトの名無しさん
2007/11/01(木) 00:04:41boostは触ったことがなかったのですが、
かなり参考になりそうです。
>>635
> 不正な値を返すかどうかは実行時に決まるので
> テンプレートでできることはない
> テンプレートで解決できるのはコンパイル時の問題
なるほど、わかりやすいレスありがとうございます。
テンプレで全部まかなうっていうのは無理がありそうですね。
とりあえず、>>634氏のおっしゃるように、boost::optionalを目指して何か作ってみようと思います。
皆さん、相談にのっていただいてありがとうございました。
0638デフォルトの名無しさん
2007/11/01(木) 00:11:37つ 牛乳
0639デフォルトの名無しさん
2007/11/01(木) 00:21:49なにも保障されていない。
NULL終端されてるシングルバイト文字列か、あるいはマルチバイト文字列かもしれない。
とりあえず人間が読んで、どんな型なのか分かる文字列であることが期待されているだけ。
0640デフォルトの名無しさん
2007/11/01(木) 00:30:25type_info::name()はconst char *を返すことが決まっているから、
その型にあったコーディングさえしていれば、コンパイルはできるんじゃない?
(文字列の内容をどう扱うか、どう表示させるかはともかく。)
636が言う、コンパイラに通すの意味が良く分からんが。
0641デフォルトの名無しさん
2007/11/01(木) 01:27:52「テンプレートらしく」ということなら、不正通知をポリシーに切り出して、組替え可能にするんじゃない?
そうすれば「例外」「ヌルポインタ」「ヌルオブジェクト」「その他」を好きなように切り替えられるようになるし。
0642デフォルトの名無しさん
2007/11/01(木) 01:59:090643デフォルトの名無しさん
2007/11/01(木) 02:34:44あまり使う場面ないけど
0644デフォルトの名無しさん
2007/11/01(木) 06:07:050645デフォルトの名無しさん
2007/11/01(木) 07:40:33これとコンテナテンプレート使えば参照のコンテンが作れる
0646デフォルトの名無しさん
2007/11/01(木) 09:03:44コピペして貼り付けてコンパイル
VC8 でやってみて void (__thiscall type::func)(void) の様なものが現れた時にそれをメンバ関数ポインタの型だと思ってコンパイルに通しても
駄目でしあt
0647デフォルトの名無しさん
2007/11/01(木) 13:17:55ネタにマジレスとかw
0648デフォルトの名無しさん
2007/11/01(木) 14:31:28kwsk
0649デフォルトの名無しさん
2007/11/01(木) 14:57:40typedef int (&foo(...))[3] ;
typedef int (&bar(int))[3] ;
//コンパイルエラー
//typedef boost::function_traits<foo>::result_type ret ;
typedef boost::function_traits<bar>::result_type ret ;
std::cout << typeid(ret).name() << std::endl ; // int [3]
typedef boost::extent< ret > size ;
std::cout << size::value << std::endl ; // なぜか0
0650デフォルトの名無しさん
2007/11/01(木) 15:29:57template<typename T, std::size_t N> inline std::size_t numberof(T (&)[N]) {return N;}
0651デフォルトの名無しさん
2007/11/01(木) 15:57:12その場合retは参照型になるようだ
参照型やポインタの場合boost::extentは0になるのは正しい動作の筈
対策としてはremove_referenceで参照を取り除いてやること
boost::remove_reference<boost::function_traits<bar>::result_type>::type ret
0652デフォルトの名無しさん
2007/11/01(木) 16:07:330654デフォルトの名無しさん
2007/11/01(木) 16:25:11return *array;
}
0655649
2007/11/01(木) 16:27:300656デフォルトの名無しさん
2007/11/01(木) 17:57:40コンパイル通らないよ・・・?
0657デフォルトの名無しさん
2007/11/01(木) 19:03:11特にウヘンチサンショウっていう奴。
C++に限ったことじゃない?
0658デフォルトの名無しさん
2007/11/01(木) 19:13:53右辺値=値
0659デフォルトの名無しさん
2007/11/01(木) 19:21:38const値は?
代入可能な左辺値と単に左辺値と言った場合の違いは?
0660デフォルトの名無しさん
2007/11/01(木) 19:35:42右辺値はそれ以外の全て。
定数であることとは関係ない。
例えば、関数は左辺値。
0661デフォルトの名無しさん
2007/11/01(木) 19:35:53やりたいのはこういうこと?
#include <iostream>
//#include <boost/mpl/identity.hpp>
template<std::size_t N, typename T>
T (&ar(T* array))[N]
//typename boost::mpl::identity<T (&)[N]>::type ar(T* array)と書くほうがまだ分かりやすいと思う
{
return reinterpret_cast<T (&)[N]>(*array);
}
const int N = 1024 * 1024;
class hoge
{
public:
~hoge()
{
std::cout << "~hoge" << std::endl;
}
};
int main()
{
typedef hoge my_array_t[N];
my_array_t& a = ar<N>(new my_array_t);
delete[] &a[0];
}
0662デフォルトの名無しさん
2007/11/01(木) 19:54:30一時オブジェクトもメモリを食ってるけど。
配列型も左辺値だけど変更可能な左辺値ではないよね。
int a[ ] の場合aも左辺値
0663デフォルトの名無しさん
2007/11/01(木) 19:57:240664デフォルトの名無しさん
2007/11/01(木) 20:05:59厳密な定義を考えた事ないや
0665デフォルトの名無しさん
2007/11/01(木) 20:09:53Cならその解釈でいいんだけども。
0666デフォルトの名無しさん
2007/11/01(木) 20:20:45一時オブジェクトは生成の省略が許されているから、
必ずメモリを食うとは限らない。
っていうか必ず食ったら嫌すぎる。
よって右辺値扱いで正解。
0667デフォルトの名無しさん
2007/11/01(木) 20:38:31それともVC7.1がウンコなだけだろうか
0668デフォルトの名無しさん
2007/11/01(木) 20:43:320669デフォルトの名無しさん
2007/11/01(木) 21:22:17関数が左辺値ってどういうこと?
C++に関数という値はないんじゃない?
0670デフォルトの名無しさん
2007/11/01(木) 22:58:22関数が左辺値かどうかは知らないが、
少なくとも、アドレス演算子や暗黙の変換で、関数からは関数へのポインタを得ることが可能。
>>662のように配列と同じく関数は変更不能な左辺値なのかもしれない。
>>667
ウンコ。でも警告レベルを上げれば警告になったはず。
0671デフォルトの名無しさん
2007/11/01(木) 23:12:27それはポインタだから左辺値にもなるし右辺値にもなる
でも>>660には関数が値だと書いてあるのでどういうことだろうと
プログラミング言語の話をするときには関数自体と関数へのポインタは
明確に区別するべきだと思うし
まあ、言葉のあやのような気もするけど
0672デフォルトの名無しさん
2007/11/01(木) 23:20:06C/C++には、そういう意味での関数があると俺は思っている。
関数型のリテラルが書けないとこをつかれたら痛いけど。
0673デフォルトの名無しさん
2007/11/01(木) 23:26:05そこでいう関数は、関数名のことかな。
int a; という変数があるとして、変数名aを左辺に書けばそのオブジェクトを表すし、右辺として評価すればその値は変数の内容。
同様に、関数名を評価した値は関数のアドレスだけど、関数名自身は左辺値になる。まあ代入はできないけど。
0674デフォルトの名無しさん
2007/11/01(木) 23:32:01まぎらわしいが、「左辺値」とは「値」のことではい「式」のことだ。
オブジェクト参照を生成する式とか、結果としてアドレスを割り出せる形になる式のことだ。
0675デフォルトの名無しさん
2007/11/01(木) 23:34:12インターネッツで修行してくる
0676デフォルトの名無しさん
2007/11/01(木) 23:35:32はい → ない
「関数そのもの」と「関数コール」と「関数ポインタ」と「関数名」って
どれも違うことなんだけど難しいねえ
0677671
2007/11/01(木) 23:37:20関数へのポインタ fp があるということは
*fp
は関数への参照、つまり左辺値なんだね
なるほど、わかりました
0678デフォルトの名無しさん
2007/11/01(木) 23:43:14const staticなポインタ変数に初期値を与えてる感じなのかな
0679デフォルトの名無しさん
2007/11/01(木) 23:59:30それ自体は、右辺値で初期化できる参照型の1種であるというだけ。
従来の参照型はもちろん左辺値参照にあたる。
左辺値参照の初期化は左辺値でなければならず、
右辺値参照の初期化は右辺値(左辺値→右辺値変換はだめ)でなければならない。
(というとかなり語弊がありまくりだけど気にしない)
何が右辺値で何が左辺値かはここまで散々議論されてきたので上のほうを見ろ。
右辺値はどうせすぐに消えるのだから、
消える前に中身をぶっ壊してもいいだろというのが右辺値参照導入の動機。
時と場合によって、バカ正直な深いコピーをする必要がなくなる分、高速化に繋がるというわけ。
0680デフォルトの名無しさん
2007/11/02(金) 00:02:14なんだ、すげえ真っ当な仕組みなんだな。
もっとトンデモな仕様想像してたよ俺。
0681デフォルトの名無しさん
2007/11/02(金) 00:08:04内容的にはWEBアプリでこれまでやっていたことを、
クライアントアプリに移すような作業で、製作環境はVisualC++2005になります
そこでお尋ねしたいのですが、C++を使用する場合に、
今の流行として、CLI、MFC、標準ライブラリとSTL、
これらのうち、どれを使用するのが適当なのでしょうか?
0682デフォルトの名無しさん
2007/11/02(金) 00:11:110683デフォルトの名無しさん
2007/11/02(金) 00:11:230684デフォルトの名無しさん
2007/11/02(金) 00:16:02スレ違いだけど
0685デフォルトの名無しさん
2007/11/02(金) 00:16:32T operator+(const T& lhs, const T& rhs) ;
の場合、
T t1, t2, t3;
t1 + t2 = t3 ;
が可能になる。t1 + t2 は一時オブジェクトすなわち右辺値を生成するのに
代入可能なのが気持ち悪い。
0686デフォルトの名無しさん
2007/11/02(金) 00:21:120687デフォルトの名無しさん
2007/11/02(金) 00:28:41>>682
あまり詳しい内容はアレなんですが、何かを登録するシステムで、
画面数が10くらいで、セレクトボックスとテキストボックスがあって、
検索と登録を行うみたいな感じです
クライアントアプリにしてUIリッチにしてオペレータの作業時間を短縮したいそうです
主にドラッグ&ドロップで登録するオブジェクトをぽんぽん追加したいようで
>>683
なんでもアリ過ぎて、腕を取りにいくべきかパウンドで攻めるべきか、
マウントポジション取ったまま悩んでいます
>>684
htaは初耳でした。少し調べてみます
0688デフォルトの名無しさん
2007/11/02(金) 00:29:31「今の流行」を聞いているんだ。
さて、そうだなぁ、MFCなんて昔はやった過去の遺物だろ。
確かに便利ではあるんだが、実装が古臭い。
もちろん、昔はまともなC++コンパイラがなかったから仕方ないんだが。
標準ライブラリとはおそらくはCのことだと思うが、これなんか古すぎて、
ほとんどのものが、いまどきは使用を推奨されないな。
だからVCにはセキュリティを考慮したバージョンが存在するわけで。
STLも、かなり荒削りなんだよね。C++の規格制定のギリギリになんとか作ったわけで、
考慮が足りない部分とか、そもそも未完成なものとかもある。
CLIだが、なんか微妙だよね。
わざわざC#を覚える必要がなくなれたC++の文法で使えるぐらいの利点しか。
あれ、今の流行のライブラリは見つからないな。
0689デフォルトの名無しさん
2007/11/02(金) 00:29:340690デフォルトの名無しさん
2007/11/02(金) 00:31:320691デフォルトの名無しさん
2007/11/02(金) 00:35:25標準ライブラリとはiostreamとかのことを言いたかったのでは?
それならそれで標準C++にとっては標準ライブラリ⊃STLだが。
いずれにせよ、GUIとは関係ない内容で、
681の挙げた他の選択肢とは、排他的なものではない。
0692デフォルトの名無しさん
2007/11/02(金) 00:38:14STL使おうとしてる。
んで、まずは配列の代わりにvector使うのが良いと聞いて、使おうとしてるんだが。
vectorの要素は、メモリ上に連続で並んでいることがわかって
一安心(効率のいいmemcpy使って一気に書き換えられるし)。
だが。push_back()するたびに、メモリの動的確保するってどうなんよ?
目を疑ったわけだが。vectorが使用するメモリ領域を上位で指定するとかして、
動的確保が発生しないようにする方法ってないんかね。
0693デフォルトの名無しさん
2007/11/02(金) 00:40:580694デフォルトの名無しさん
2007/11/02(金) 00:42:51>動的確保が発生しないようにする方法ってないんかね。
あるよ。
std::vectorのメンバ関数をひととおり眺めてみれば?
0695デフォルトの名無しさん
2007/11/02(金) 00:45:07Windowsアプリといっているだけで、なにもGUIのライブラリに限定しているわけじゃないだろ。
GUIのライブラリも重要だが、それ以外にもやることはあるだろ。
0696デフォルトの名無しさん
2007/11/02(金) 00:47:59まあ、普通はメモリが足りなくなったら、
現在のサイズ1.5倍とか2倍とか確保して、
毎回メモリ確保しなくてもいいように実装するんだけどな。
0697デフォルトの名無しさん
2007/11/02(金) 00:54:470698デフォルトの名無しさん
2007/11/02(金) 00:55:05ありがとう、ありがとう。
ちなみにman vectorしてもなにもでてこないのだけど、STLの
APIリファレンスってどうやったら見れるのかな?Linux使ってます。
Webのやつ見てるけれど、イマイチわからないのです。
http://www.wakhok.ac.jp/~sumi/stl/header/vector.html#constructor
reserve()すると、size()で返る要素数がreserve()で指定したものに
なってしまうのかな?
0699デフォルトの名無しさん
2007/11/02(金) 00:59:40resize(), capacity()についても調べてみると幸せになれるよ。
0700デフォルトの名無しさん
2007/11/02(金) 01:00:050701デフォルトの名無しさん
2007/11/02(金) 01:05:25ありがとう!
ちなみに、STLのリストやらキューやらで、要素を追加すると
同じようにメモリの確保が発生するのかな??
0702デフォルトの名無しさん
2007/11/02(金) 01:05:54reserve これで指定したサイズまではメモリ確保がされない
だと思う
0703デフォルトの名無しさん
2007/11/02(金) 01:06:53allocが発生しない、かつメモリコピーも発生しないように
することってできますか?
0704デフォルトの名無しさん
2007/11/02(金) 01:08:08ありがとう!
703の追記ですが、上位で指定した領域をそのままリストにつなぐという
意味です。vectorだとコピーせざるを得ないですが。
0705デフォルトの名無しさん
2007/11/02(金) 01:10:07Object Poolとかでググると幸せになれるかもしれない。
0706デフォルトの名無しさん
2007/11/02(金) 01:11:42listやqueueにはvector::reserve相当の関数はないから、
自前でアロケータを書けばいいのかも。
0707デフォルトの名無しさん
2007/11/02(金) 01:20:53Object Pool検索しましたが、Javaのしかでてきません!
>>706
自前でアロケータ書いて、ごちゃごちゃやるくらいなら、
独自高速版STLもどき作ったほうが、幸せになれるような
気がするなぁ・・・。
0708デフォルトの名無しさん
2007/11/02(金) 01:22:36list についてはあらかじめ作っておいた別の list から splice() でつなぐことができる。
メモリ確保についてはタイミングが変わるだけなんだけどね。
0709デフォルトの名無しさん
2007/11/02(金) 01:24:16標準のSTL自体がそれなりにチューニングして実装されているだろうから
まずはそれで本当に遅いのかを確認したほうが良いのでは?
がんばって独自版を実装してみたものの実は不要だった、なんて
不幸せになるような気がするなぁ…。
0710デフォルトの名無しさん
2007/11/02(金) 01:30:42手軽に済ませたいならboost::poolがあるよ
0711デフォルトの名無しさん
2007/11/02(金) 01:32:46おぉ、シリマセンデシタ。ありがとうございます。
>>709
allocしない、かつコピーを最小限の機能限定STL(自動的にvectorを伸張しない)
とかだったら、アプリによっては数倍の速度になるんじゃないかなぁ。
リストもキューも、本質的には単なるポインタの付け替えなわけだし。
それを渡された要素分、allocしてコピーしてたら速度の違いは歴然
じゃないかな。組み込みでは。
0712デフォルトの名無しさん
2007/11/02(金) 01:45:31大抵の実装がsetやlist等の必然的に細切れになるコンテナ用に
poolを使ったallocatorを用意していたと思うんだけど
0713デフォルトの名無しさん
2007/11/02(金) 01:58:31「じゃないかな」なんてつくようなら、まずは何も考えずに使ってからにしたほうがいいよ。
処理系実装者を一度ぐらい信じてやってもいいでしょ。
allocator をカスタマイズしたり、自作の vector や list を正しく作るのはほんとうに
大変なんだよ。
0714デフォルトの名無しさん
2007/11/02(金) 02:48:09allocの処理負荷を軽減できるというのはわかるけど。
メモリコピーは、そうやっても減らないわけだし。
アプリ処理の2〜3割を、メモリコピーが占めることが
Cですらザラにあるわけで。
0715デフォルトの名無しさん
2007/11/02(金) 02:52:540716デフォルトの名無しさん
2007/11/02(金) 03:26:40コピーの処理時間が問題になっているのがわかってから考えるんだ。
さらに言うと、問題になっている箇所以外は標準コンテナのままでいい。
偉い人も言っている。 "Premature optimization is the root of all evil" と。
0717デフォルトの名無しさん
2007/11/02(金) 03:26:59右辺値参照が理解できん。
0718デフォルトの名無しさん
2007/11/02(金) 03:34:57これでどう?
// 既存の(左辺値参照用)コピーコンストラクタ
vector::vector(vector const& other)
{
allocate(other.size());
// コピーうぜー。けど other は const& だからしょうがないんだぜ。
copy(other.begin(), other.end());
}
// 右辺値参照用コピーコンストラクタ
vector::vector(vector&& other)
{
// other つぶしていいんならメモリ確保もコピーもいらねー。うはwwww
other.swap(*this);
}
0719デフォルトの名無しさん
2007/11/02(金) 10:02:08const 参照は右辺値を参照できるけど、左辺値は参照できない。
vector const& otherのほうが右辺値参照ではないの?
0720デフォルトの名無しさん
2007/11/02(金) 10:09:24reserveはメモリ確保はされるけど初期化はされない
ということじゃないか?
resizeはメモリ確保されて初期化もされるから要素数も変更される
0721デフォルトの名無しさん
2007/11/02(金) 10:40:30これは便利!と思ったけど調べてみたら、これできるのC++0xからなのね。
0722デフォルトの名無しさん
2007/11/02(金) 12:01:12そこらへんやオーバーロード解決のルールも変更されて、右辺値を引数にした場合は
右辺値参照用のほうが優先されるんだろ。
0723デフォルトの名無しさん
2007/11/02(金) 12:06:59一般的に std::ostream の put() は 0 から 127 までしか書き込めませんか?
0 から 255 まで書き込むには std::ostream<unsigned char> を使うのでしょうか?
0724デフォルトの名無しさん
2007/11/02(金) 12:31:46何がしたいのかわからん。
移植性を優先するなら std::ostream に int を出し入れするのがいいんじゃないの?
0725デフォルトの名無しさん
2007/11/02(金) 12:57:35すみません。すでにフォーマットが確定したバイナリデータを書き込むときのはなしです。
フォーマットでは1バイトが8ビット符号無し整数です。
0726デフォルトの名無しさん
2007/11/02(金) 13:15:47typedef unsigned char uint8;
といったようにtypedefしておき、処理系によってこの定義を変える
0727デフォルトの名無しさん
2007/11/02(金) 13:23:14std::ostream<char>は必ずしも8bit cleanではないのではないかってこと?
規格上どうだか、俺は知らないなあ。
charが符号付きであっても、↓が動かないような環境は、見たことが無いけど
#include <iostream>
int main()
{
const char *s = "こんにちは、世界\n";
char c;
while (c = *s++)
std::cout.put(c);
}
0728727
2007/11/02(金) 13:23:450729デフォルトの名無しさん
2007/11/02(金) 13:45:03-128 から 127 のとき
s.put( 200 );
を実行すると 200 がどういう数値変換されるかは処理系定義
だと思っています。
128 以上はすべて 0 に変換される処理系もあるかもしれません。
0730デフォルトの名無しさん
2007/11/02(金) 14:07:06C++ の規格にストリーム出入力の規定はなくて C のライブラリの上に被さってる。
C の規格によるとストリームは character の順序つき列だとされている。
character が char を指すとして、 CHAR_BIT が 8 でない環境で 8 ビット符号なし整数
というバイナリデータを書き出すこと自体が不可能だろう。たぶん。
で CHAR_BIT が 8 だとして符号有り無しの話だけど、 unsigned char の変数を
char* で指して読み出した値を put() すればいいよ。 C/C++ の (signed/unsigned) char* は
任意のバイト列を指すことができるとされているからね。整数変換を通してしまうと
>729 の言うように処理系定義でどうなるかわからない。
0731デフォルトの名無しさん
2007/11/02(金) 14:46:58アクセスしたときはどのような動作になるんでしょうか。
負の整数を2の補数以外で表現する処理系では unsigned char の 255 が
signed char の 0 として取得されるようなことはないでしょうか?
0732デフォルトの名無しさん
2007/11/02(金) 17:24:49vector::vector( vector const &other ){
array_ptr = other.GetArrayPtr();
}
って右辺値参照用コピーコンストラクタと同じ感じじゃないの?
0733デフォルトの名無しさん
2007/11/02(金) 19:32:18#include <dir1/file1.h>
#include "dir2/file2.h"
としたとき、および、dir2/file2.hの中で
#include "dir3/file3.h"
としたとき、それぞれincludeされるファイルの探索範囲・順序は、標準では決められてないのでしょうか?
また、主要コンパイラでの探索範囲・順序などご存じありませんか?
mingw gcc 4.3.2では
<> → includeパス
"dir2/file2.h" → dir0/dir2/file2.h
file2.h中で"dir3/file3.h" → dir0/dir3/file3.h
0734デフォルトの名無しさん
2007/11/02(金) 19:41:58(a) #include <...>は、実装依存の一連の場所(*1)から探す。
(b) #include "..."は、まず実装依存の一連の場所(*2)から探し、その後(a)と同様にして実装依存の場所から探す。
古いCだと、(2)でまず探すのが元ソースのディレクトリになっていた。
C++でもそういう実装が多いと思うけど、決まっているわけじゃない。
ディレクトリの考え自体が実装依存だから、それ以上のことは決まっていないみたい。
0735デフォルトの名無しさん
2007/11/02(金) 21:37:08今でもconst参照は左辺値を参照できるぞ、右辺値「も」参照できるというだけで。
提案では、722の言うとおり718のコードで右辺値を渡すと
const左辺値参照よりも右辺値参照を優先して解決される。
0736デフォルトの名無しさん
2007/11/02(金) 22:09:09勘違いしてた。
非const参照では右辺値を参照できないと言いたかった。
vector&& otherの&が二個あるのが右辺値参照を表してると思っていいの?
初めて見る構文だから
0737デフォルトの名無しさん
2007/11/02(金) 22:39:43そういうこと、&&が右辺値参照を意味する。
C++0xでもconstな左辺値参照は相変わらず右辺値を参照することも可能になっていて、
だから、既存の右辺値参照を考慮していないプログラムの互換性も保てるとされている。
0738デフォルトの名無しさん
2007/11/02(金) 23:25:09なるほど
どんどん仕様は拡張されてるわけね
まだまだおいつかないわ
0739デフォルトの名無しさん
2007/11/02(金) 23:28:39ありがとうございます
VC++やBorland C++ではmingwと違った感じになるか、ご存じでしょうか?
boostライブラリでは、一部は"boost/〜/〜.hpp"みたいにincludeしてることもあるようですから
国際標準で定まってなくても、デファクトなやり方があるのかなと期待しつつ。
0740デフォルトの名無しさん
2007/11/02(金) 23:33:21func(0);
これって規格上通るの?
0741デフォルトの名無しさん
2007/11/02(金) 23:47:37VC++、BCC、GCCなどといったパソコンで動くコンパイラだと、
734の(*1)にあたる場所は、コンパイラオプションや環境変数で指定したディレクトリで、
(*2)はソースファイルのあるディレクトリと思っていて構わない。
0742デフォルトの名無しさん
2007/11/02(金) 23:50:04もちろん問題ない。
funcを呼ぶ側にとっては一時的な右辺値でも、
funcの中の人にとってはfunc内を実行している間ずっと存在し続ける左辺値(constだけど)。
0743デフォルトの名無しさん
2007/11/03(土) 00:07:43それによって初期化された vector が破棄されるときと、other が破棄されるときを考えてみよう。
0744デフォルトの名無しさん
2007/11/03(土) 00:19:34これをint*にキャストしても規格上通る?
0745デフォルトの名無しさん
2007/11/03(土) 07:06:51ならいいと思われる
0746デフォルトの名無しさん
2007/11/03(土) 08:16:29そこから参照剥ししたりしても規格上問題ないはず。
0747デフォルトの名無しさん
2007/11/03(土) 17:51:17にCreateFileなどでファイルの文字列を一気に読んで
それをstrtok_sで分割し、とっておきたいとします。
char* hoge = strtok_s(NULL,delim,&nexttoken);
char* hage = strtok_s(NULL,delim,&nexttoken);
int sage = atoi(strtok_s(NULL,delim,&nexttoken));
そして、読み込み&分割が終わった後に
delete[] buffer
と、後始末をすると、int sageなどはコピーされてるので消えませんが、
hoge hageに関してはポインタなので一緒に消えてしまいます。
コピーをとっておく場合はどうやって書いたらいいんでしょうか?
ちなみに、
char hoge[256];
strcpy(hoge,strtok_s(NULL,delim,&nexttoken));
とか
char hoge[256];
sprintf(hoge,strtok_s(NULL,delim,&nexttoken));
などとやってみたんですが、内容がフフフフの連続のようになってしまいました。
正しくはどうやって書いたらいいですか?
0748デフォルトの名無しさん
2007/11/03(土) 18:00:24strtokよりよっぽど重要だぞ。
第一それ、バッファオーバーフローするだろ。
0749デフォルトの名無しさん
2007/11/03(土) 18:13:330750デフォルトの名無しさん
2007/11/03(土) 18:35:37テンプレート関数はオブジェクトファイルにする時点でテンプレートの部分が実体化(?)している必要がありますが、
もしテンプレート関数を使用するファイルを個々にオブジェクトファイルにしてから結合したい場合、
テンプレートクラスの場合は
template MyClass<int>;
のようにすれば解決できるようですが、テンプレート関数の場合はどのように宣言すればよいのでしょうか?
0751デフォルトの名無しさん
2007/11/03(土) 18:38:20そこって本質ですか?
strtokでもらうのは最初のbufferの中でデリミタに区切られたところのポインタですよね?
当然、後片付けでbufferをdeleteしてしまえば、
そのhoge hageの指し示している先の内容も消されてしまうというのは理解できます。
一方、int sageはatoiでコピーをもらってるので消えません。
要するに文字列の「コピー」をもらいたいんですが、書き方が分かりません。
0752デフォルトの名無しさん
2007/11/03(土) 18:44:57ん?同じことができるでしょ?
やってみたなら、どうやったのかとエラーメッセージをどうぞ。
0753747
2007/11/03(土) 18:58:48public:
int kazu;
char* moji;
void print(){ printf("整数 = %d, 文字列 = %s \n",kazu,moji); }
};
void main(){
HANDLE file = CreateFile(
"test.txt",GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
DWORD size = GetFileSize(file,NULL);//ファイルサイズ
char* buffer = new char[size+1];
buffer[size]='\0';
DWORD read_size;//バッファに一気読み
ReadFile(file, buffer, size, &read_size, NULL);
CloseHandle(file);//ファイルクローズ
char delim[] = ",";
char *nexttoken;
Holder holder;
holder.kazu = atoi(strtok_s(buffer,delim,&nexttoken));
holder.moji = (strtok_s(NULL,delim,&nexttoken));
delete[] buffer;//←deleteしなければうまく動く
holder.print();
}
0754デフォルトの名無しさん
2007/11/03(土) 19:00:03strtokが失敗しているんじゃないか?
C++の質問でも回答でもないけど
0755デフォルトの名無しさん
2007/11/03(土) 19:05:52delete[] buffer;//←deleteしなければうまく動く
holder.print() が参照する先が有効でないといけないだけ
0756デフォルトの名無しさん
2007/11/03(土) 19:06:43header.moji = new char[strlen(s) + 1];
strcpy(header.moji, s);
delete[] buffer;
holder.print();
delete[] holder.moji;
}
0757デフォルトの名無しさん
2007/11/03(土) 19:07:13明示的特殊化の話?
それともexportの話?
0758デフォルトの名無しさん
2007/11/03(土) 19:08:13はい。ですから参照する先を取っておくんじゃなくて
内容をコピーしておくにはどうしたらいいんでしょうか。
0759デフォルトの名無しさん
2007/11/03(土) 19:15:490760デフォルトの名無しさん
2007/11/03(土) 19:21:24必要な文字数を計算した後、strncpy。
\0が無いのでstrcpyは駄目。
0761デフォルトの名無しさん
2007/11/03(土) 19:21:35できたみたいです。ありがとうございました。
>>759
死ね役立たず。
人の足引っ張って楽しいかゴミクズ。
今すぐ死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。v死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
0762デフォルトの名無しさん
2007/11/03(土) 19:23:370763デフォルトの名無しさん
2007/11/03(土) 19:23:480764デフォルトの名無しさん
2007/11/03(土) 19:24:54死ね役立たず。
人の足引っ張って楽しいかゴミクズ。
今すぐ死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。v死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
0765750
2007/11/03(土) 19:25:04>>757
exportの方です。
そもそも、宣言の仕方がはっきりと分からないのですが。。
ヘッダと.ccファイルを別けているので、.ccファイル内で
template (返り値) (クラス名)::(テンプレート関数名)<(テンプレートに適応したい型)>;
でいいのでしょうか?
template Gtk::SpinButton* PController::newParameter<double>;
0766デフォルトの名無しさん
2007/11/03(土) 19:28:04export 関係あるか?
関数テンプレートの明示的特殊化なら引数リストも書かないと駄目だと思うよ。
あと、「いいのでしょうか?」って聞く前に自分で試してほしい。
0767766
2007/11/03(土) 19:28:580768デフォルトの名無しさん
2007/11/03(土) 19:40:33ヘッダー
//sample.h
template<class T> int func(T a);
ソース
//sample.cpp
#include "sample.h"
export template<class T> int func(T a)
{
//定義
}
利用するソース
#include "sample.h"
void widget()
{
//fを呼び出す処理など
}
てな感じになるんでは?
0769デフォルトの名無しさん
2007/11/03(土) 19:43:34マルチ?ちゃんと断ってるだろ。
しかもスレ違いってC++はCも含むだろ。
シネよ基地外。
0770デフォルトの名無しさん
2007/11/03(土) 19:51:36メンバ関数のことかな?
template <class T> Widget { };
template class Widget<int> //クラステンプレートの明示的具現化の宣言
template void Widget<int>::f(int); //メンバ関数A<T>::f()の明示的具現化の宣言
みたいになるかな
template (返り値) (クラス名)::(テンプレート関数名)(パラメータリスト);
かな
あと、関数テンプレートの場合、引数演繹に頼らないで明示的に
パラメータの型を指定するのは呼び出し時じゃね?
0771770
2007/11/03(土) 19:52:37//メンバ関数A<T>::f()の明示的具現化の宣言 ×
//メンバ関数Widget<T>::f()の明示的具現化の宣言 ○
0772デフォルトの名無しさん
2007/11/03(土) 19:52:590773デフォルトの名無しさん
2007/11/03(土) 19:55:04だったらCのスレなんかいらないだろカス
0774デフォルトの名無しさん
2007/11/03(土) 20:21:36Cのスレで「C++にしか含まれない」文法の質問をしたら
スレ違いというのは妥当だが
C++のスレで「Cにも含まれる」文法の質問したからって
スレ違いってことはないだろうよ。
0775デフォルトの名無しさん
2007/11/03(土) 20:37:44C使いのC限定の質問にC++で返答するわけにはいかんだろ。
よってCスレは必要。カスはお前な。
0776750
2007/11/03(土) 20:47:19GCCのg++はexportに対応していないようなので使えませんでした。
>>766
聞き方が良くなかったようです。。
聞く前には当然自分で試行錯誤しています。実は今日一日中試行錯誤しています。。
>>770
クラスは普通のクラスだったので、
template void MyClass::method( double* );
のようにしたらエラーなくオブジェクトファイルが出来ました。
最終的に、>>770でいわれた通りの宣言で明示的実体化したら、
オブジェクトファイル内に実体化されたテンプレート関数が作成されていました。( nm -C で確認 )
何とかこの問題は乗りきれそうです。みなさんありがとうございました。
0777デフォルトの名無しさん
2007/11/03(土) 20:53:38>>775はC++をつかっているが、Cの範囲の質問したんだろ?
じゃあそれはCの質問でCスレいってこいやカスが
0778デフォルトの名無しさん
2007/11/03(土) 21:01:53そういうレベルの子のために
【初心者歓迎】C/C++室 Ver.44【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1194016813/l50
があるんだよ。
こっちは「C++」で、初心者と名の付く向こうが「C/C++」であり「環境依存OK」なのは伊達じゃない。
「問題を分離できないレベルの人はあっちへどうぞ」ということ。
0779デフォルトの名無しさん
2007/11/03(土) 21:27:10>>774を100回くらい声だして読んだら。
>>778
全部お前の勝手な匙加減じゃねーかw
C++はCの文法を含む。事実はこれだけ。
CスレでC++の質問をするのは無理があるが
C++スレで”Cにも”含まれる文法の質問をしたところで問題はない。
0780デフォルトの名無しさん
2007/11/03(土) 21:32:000781デフォルトの名無しさん
2007/11/03(土) 21:34:20勝手な自分ルールを押し付けてそれが一般化したら迷惑だからな。
言うことはきちんと言っておかんと。
0782デフォルトの名無しさん
2007/11/03(土) 21:37:59意味不明な論拠で必死にその質問にいちゃもんつけて排除しようとする回答者っているよな。
自分のプライドを傷つけられたと思うのかなんなのか。
0783777
2007/11/03(土) 22:05:14俺が悪かったよ
だから議論おわってくらさい><
0784デフォルトの名無しさん
2007/11/03(土) 22:06:500785デフォルトの名無しさん
2007/11/03(土) 22:52:42まぁ、確かに「たまに」そういう回答者も現れるけど、
残りの大部分は馬鹿な質問者が逆ギレしてるだけのケースで、
今回も後者のパターンだよ。
0786デフォルトの名無しさん
2007/11/03(土) 22:58:49逆ギレの意味くらい理解してから使えよ。
0787デフォルトの名無しさん
2007/11/04(日) 00:33:500788デフォルトの名無しさん
2007/11/04(日) 02:15:040789デフォルトの名無しさん
2007/11/04(日) 02:57:31頭の出来の悪さをズバリ指摘されて発狂しまくり、超ウケるwww
0790デフォルトの名無しさん
2007/11/04(日) 03:01:340791デフォルトの名無しさん
2007/11/04(日) 03:03:350792デフォルトの名無しさん
2007/11/04(日) 03:10:44スレ違い派: 流儀的観点 「strtok()なんてC++では使いません><」
0793デフォルトの名無しさん
2007/11/04(日) 03:16:320794デフォルトの名無しさん
2007/11/04(日) 03:18:060795デフォルトの名無しさん
2007/11/04(日) 05:18:290796デフォルトの名無しさん
2007/11/04(日) 05:57:120797デフォルトの名無しさん
2007/11/04(日) 06:26:11いや使うだろ?
つうか使ってるんだが。
じゃあ何使うんだ?
普通に聞きたい。
0798デフォルトの名無しさん
2007/11/04(日) 10:17:400799デフォルトの名無しさん
2007/11/04(日) 10:24:130800デフォルトの名無しさん
2007/11/04(日) 10:26:520801デフォルトの名無しさん
2007/11/04(日) 10:27:08つ boost::spirit
つ std::stringstream
つ std::getline
0802デフォルトの名無しさん
2007/11/04(日) 10:38:400803792
2007/11/04(日) 12:24:16まあ、俺が言いたかったのは、C++使いって
better C な使い方する人とか
Cっぽい書き方毛嫌いする人とか (←俺はココ)
どっちの書き方もする雑食な人とか
色々いるよねってことなんだ。strtok()自体がどうこうじゃなくて。
0804デフォルトの名無しさん
2007/11/04(日) 14:30:44子クラスでも同じようにコンストラクタを実装・宣言しなければいけませんか?
class BASE
{
int num
public:
BASE(int)
}
BASE::BASE(int a)
{
num=a;
}
class SUB : public BASE
{
int num; //←これを省略したい
public:
SUB(int) //←これを省略したい
}
SUB::SUB(int b) //←これを省略したい
{
num=b;
}
0805デフォルトの名無しさん
2007/11/04(日) 14:45:37class SUB : public BASE
{
public:
SUB(int);
}
SUB::SUB(int b)
:BASE(b)
{
}
省略は無理。
0806デフォルトの名無しさん
2007/11/04(日) 14:50:48あれ?似たようなプログラムではなぜか通りました。ただし、親クラスの変数宣言の部分はprotected:に変えて、子クラスの変数宣言部は削除しました。。
>SUB::SUB(int b)
> :BASE(b)
こうすればよかったわけですね。
非常に助かりました。
ありがとうございましたm(_ _)m
0807デフォルトの名無しさん
2007/11/04(日) 15:04:09デフォルト引数を使って基底クラスのデフォルトコンストラクタ呼び出しにすれば
派生クラスの初期化リストから省略できる
class BASE
{
int num;
public:
BASE(int = 0);
};
BASE::BASE(int a)
{
num=a;
}
class SUB : public BASE
{
public:
};
0808デフォルトの名無しさん
2007/11/04(日) 15:09:35ありがとうございます。
その場合、
SUB element(10); //numには10がセットされる
という初期化はできず、
SUB elemetnt; //numには0がセットされる
という使用方法のみになりますか?
0809デフォルトの名無しさん
2007/11/04(日) 15:28:480810デフォルトの名無しさん
2007/11/04(日) 16:02:17了解です。
アドバイスありがとうございました.
0811デフォルトの名無しさん
2007/11/04(日) 16:09:38void templateFunc(int a){}
template<typename T, typename U>
struct templateClass{
templateClass(){
struct D{
T first;
U second;
};
templateFunc<D>(0);
}
};
void test(){
templateClass<int, int> tc;
}
これがVC++2005ではコンパイル成功するんですけど
Fedora7付属のg++ 4.1.2だと
test.cpp: In constructor ‘templateClass<T, U>::templateClass() [with T = int, U = int]’:
test.cpp:17: instantiated from here
test.cpp:12: error: no matching function for call to ‘templateFunc(int)’
とエラーになってしまいます。struct Dを関数内じゃなくてtemplateClass内に移動すると、コンパイルは通ります。
これは何が間違ってるのでしょうか?
(g++4.2を試そうとしたんですがうまくインストールできませんでした。)
0812デフォルトの名無しさん
2007/11/04(日) 16:22:352 A type without linkage (3.5) shall not be used as a template-argument for a template type-parameter.
[ Example:
template <class T> class X { /* ... */ };
void f()
{
struct S { /* ... */ };
X<S> x3; // error: local type used as template-argument
X<S*> x4; // error: pointer to local type used as template-argument
}
-- end example ] [ Note: a template type argument may be an incomplete type (3.9). -- end note ]
0813デフォルトの名無しさん
2007/11/04(日) 16:23:43それはVC++2005が間違っています
関数スコープ内で定義されたクラスはテンプレートの引数としては使用できません
次の標準では可能になるように提案は出ていますが
いまはg++の挙動が正しいです
0815デフォルトの名無しさん
2007/11/04(日) 16:42:48横やり質問ですみませんが、具体的にコードのどの部分が文法違反でしょうか?
void test(){
templateClass<int, int> tc;
}
はOKじゃないんですか?
0816デフォルトの名無しさん
2007/11/04(日) 16:45:57ここがだめ
ローカルな型をテンプレート引数に使おうとしている
0817デフォルトの名無しさん
2007/11/04(日) 17:01:29なるほど、リンケージを持たない型はダメってことですね
例えば
struct Widget { }; //構造体スコープにないのでローカルな型ではない
template<typename T, typename U>
struct templateClass{
templateClass(){
struct D{
T first;
U second;
};
templateFunc<Widget>(0); //変更
}
};
とかなら文法的にOKということですね。
0818デフォルトの名無しさん
2007/11/04(日) 18:46:38死ね役立たず。
人の足引っ張って楽しいかゴミクズ。
今すぐ死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。v死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。死ね。
0819デフォルトの名無しさん
2007/11/04(日) 18:46:560820デフォルトの名無しさん
2007/11/04(日) 18:58:000821デフォルトの名無しさん
2007/11/04(日) 19:19:420822デフォルトの名無しさん
2007/11/04(日) 19:22:260823デフォルトの名無しさん
2007/11/04(日) 19:22:570824デフォルトの名無しさん
2007/11/04(日) 19:23:380825デフォルトの名無しさん
2007/11/04(日) 19:34:480826デフォルトの名無しさん
2007/11/04(日) 19:52:240827デフォルトの名無しさん
2007/11/04(日) 20:43:440828デフォルトの名無しさん
2007/11/04(日) 20:53:41まずは「v死ね。」。これはVシネを表すと考えられる。
そして「ね。」。つまり「死がない」。
つまり!
>>818は、しがないVシネマニアなんだよ!なんだってー!おめがおめが!おめが!
だめだコレつまんねえな。一応書き込みしとくけど。
0829デフォルトの名無しさん
2007/11/04(日) 21:21:51あーあ、言っちゃった。
0830デフォルトの名無しさん
2007/11/04(日) 22:42:51クラス内クラスって、そのクラスの属するクラスへのアクセスってどうなるの?
privateにもアクセスできるのは正解?
VC8だとこんなのも通ったんだけど……
class test {
std::string test_;
public:
struct test2 {
void operator()(test& value) {
std::cout << value.test_ << std::endl;
};
};
public:
test(std::string const& value) : test_(value) {};
};
int main() {
test t("test");
test::test2 t2;
t2(t);
};
0831デフォルトの名無しさん
2007/11/04(日) 22:45:28どう考えても正解だろ
アクセス指定子ってクラス外部に対する指定なんだぜ?
0832デフォルトの名無しさん
2007/11/04(日) 22:56:37{
struct B { private: int i; };
struct C { int func(B& b) { return b.i; } };
};
クラス内クラス同士のアクセスってどうだったっけ?
このへん曖昧で、いつかちゃんと理解しとこうと思ってるんだけど。
0833デフォルトの名無しさん
2007/11/04(日) 23:02:43プライベートとパブリックの考え方そのまんまだろ
現実と対して変わらん。
我が家のプライベートな所有物には俺も兄貴も弟もアクセスできる。
でも兄貴のプライベートを俺がアクセスすることはできない。
0834デフォルトの名無しさん
2007/11/04(日) 23:06:08プライバシー・パブリシティの考え方とか
ちょっと欧米的だよな、クラスって
0835デフォルトの名無しさん
2007/11/04(日) 23:10:032003 の改定で内部クラスも「メンバ」であるってことでアクセスできるようになったんだぜ。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45
0836デフォルトの名無しさん
2007/11/04(日) 23:11:24まあいいか、C++09で全部覚えなおせば
0837830
2007/11/04(日) 23:13:20C++STD 9.7.1
The nested class is in the scope of its enclosing class.
つうことね。
0838デフォルトの名無しさん
2007/11/04(日) 23:13:570839830
2007/11/04(日) 23:15:411998とごっちゃになっていたのか……
>836
C++0x準拠の実装が出て来るの、いつになるのかね?
0840デフォルトの名無しさん
2007/11/04(日) 23:18:43それはNGだと思う。
namespaceスコープと同じ挙動になるんじゃない?
0841デフォルトの名無しさん
2007/11/04(日) 23:33:32class E {
int x;
class B { };
class I {
B b; // error: E::B is private
int y;
void f(E* p, int i)
{
p->x = i; // error: E::x is private
}
};
int g(I* p)
{
return p->y; // error: I::y is private
}
};
こうなってる。つまり>>830はNG
見辛くてごめん
0843デフォルトの名無しさん
2007/11/05(月) 00:11:35サンクス。11.8.1ですな。VC++8.0は間違いですな。
取り囲んでいるクラスにfriend追加しとくか。
0844デフォルトの名無しさん
2007/11/05(月) 00:43:36namespace hoge {
template<class T> struct base {
template<class R>
base& operator|(base<R>& r) {
std::cout << "base::operator" << std::endl;
return *this;
}
};
struct tinko_type : base<tinko_type> {} tinko;
struct manko_type : base<manko_type> {} manko;
template<class L, class R>
base<L>& operator|(base<L>& l, base<R>& r) {
std::cout << "hoge::operator |" << std::endl;
return l;
}
} // namespace hoge
template<class L, class R>
L& operator|(L& l, R& r) {
std::cout << "::operator |" << std::endl;
return l;
}
int main(int ac, char** av) {
hoge::tinko | hoge::manko;
return 0;
}
以上のプログラムのコンパイルには成功したのですが、実行結果に納得がいきません
漏れとしては hoge::base::operator| もしくは hoge::operator| が呼び出されると思ってたですよ
そしたら ::operator | が呼び出されてるですよ いったい禿はなにを考えてるですか?????
VC++2005EEとg++3.4.4(cygwin)で確認しました
0845デフォルトの名無しさん
2007/11/05(月) 01:09:540846デフォルトの名無しさん
2007/11/05(月) 01:21:55厳密なルールは確認してないけど、派生クラスから基底クラスへの変換が要る
hoge::base::operator| や hoge::operator| よりも、まったく変換の要らない ::operator | が
優先されるのはそんなにおかしなことじゃないと思う。
0847デフォルトの名無しさん
2007/11/05(月) 01:24:02Koenig Lookup、もといADLが行われるんじゃなかったかな。
しかも修飾してると働かないとかいうルールもあった気がする。
0848デフォルトの名無しさん
2007/11/05(月) 02:17:34を
F( string( "test" ) ); // fail
string s( "test" );
F( s ); // OK
なぜ?
0849デフォルトの名無しさん
2007/11/05(月) 02:20:530850デフォルトの名無しさん
2007/11/05(月) 09:15:32void F( string ){} か void F( const string & ){} にすれば大丈夫
0851デフォルトの名無しさん
2007/11/05(月) 13:05:050852デフォルトの名無しさん
2007/11/05(月) 16:27:070853デフォルトの名無しさん
2007/11/05(月) 20:39:07これって、わかりにくいエラーメッセージが出てもおかしくない気がする。
でも、この程度でそんなことは免罪符にならないけどな。
0854デフォルトの名無しさん
2007/11/05(月) 20:46:36explicit operator string() const;
};
このexplicit指定が許されるようになるらしい。
0855デフォルトの名無しさん
2007/11/05(月) 22:27:02だったらtoStringでいいじゃねえか・・・
0856デフォルトの名無しさん
2007/11/05(月) 22:33:54テンプレート
0857デフォルトの名無しさん
2007/11/06(火) 14:10:18mystr str1="abc";
mystr str2="def";
printmystr(str1+str2); // (str1+str2).print();とか実装するもの?
のような使い方をしたいと思います。
演算子のオーバーロードはこんな感じになると思うのですが、
mystr& operator+(mystr& lhs,mystr& rhs)
{
mystr* temp=new mystr;
temp.add(lhs);
temp.add(rhs);
return *temp;
}
この場合、newしたオブジェクトはどこかでdeleteされるんでしょうか?
0858デフォルトの名無しさん
2007/11/06(火) 14:13:230859デフォルトの名無しさん
2007/11/06(火) 14:16:50普通は
mystr operator+(const mystr& lhs,const mystr& rhs)
{
mystr temp;
temp.add(lhs);
temp.add(rhs);
return temp;
}
のようにする。
0860857
2007/11/06(火) 14:26:37それだと関数抜けた瞬間にtempのデストラクタが働いて、
呼び出し元で、
str3=str1+str2とか、
printmystr(str1+str2)とかができなくならないですか?
0861デフォルトの名無しさん
2007/11/06(火) 14:42:56temp のデストラクタが動く前にコピーコンストラクタが起動して、operator+の呼び出し元にtempがコピーされる。
0863857
2007/11/06(火) 15:25:30上記の場合だとstr1、str2にそれぞれ1万文字入っていたとして、
(1)str1からtempに1万文字コピー
(2)str2からtempの続きに1万文字コピー(計2万文字)
(3)コピーコンストラクタで呼び出し元に2万文字コピー
(4)tempがデストラクタで消える
となるので、
ポインタ渡しと比べて、(3)の分だけ一時メモリとコピーの時間がかかるんですよね?
0864デフォルトの名無しさん
2007/11/06(火) 15:37:06そこでRVOの登場というわけだ
0865デフォルトの名無しさん
2007/11/06(火) 18:20:370866デフォルトの名無しさん
2007/11/06(火) 18:29:16とか出来るんだっけ?
0867デフォルトの名無しさん
2007/11/06(火) 19:36:03Effective C++だっけ?moreの方だっけ?
0868デフォルトの名無しさん
2007/11/06(火) 21:13:23mystr str = str1 + str2 + st3 + str4;
なんかだとコピーコンストラクタの呼び出し(=全文字列のコピー)が何度も呼ばれることになる。
mystr str = str1;
str.add(str2);
str.add(str3);
str.add(str4);
の方が無駄なコピーが発生せずに同じ結果が得られる。
+で繋げるのは直感的でわかりやすいんだけど、
いっそのことoperator+等の二項演算子は実装しない方がいいかと。
0869デフォルトの名無しさん
2007/11/06(火) 21:21:05そう思うのはお前だけ
0870デフォルトの名無しさん
2007/11/06(火) 21:33:37つexpression template
0871デフォルトの名無しさん
2007/11/06(火) 22:45:050872デフォルトの名無しさん
2007/11/06(火) 23:19:44#include <string>
#include <iostream>
struct hoge {
template<class T>
hoge(const T) {}
};
struct hage {
};
static const int i = 1;
struct poge {
static const int j = 2;
static const hoge h1(i); // error C2061: 構文エラー : 識別子 'i'
static const hoge h2(j); // error C2061: 構文エラー : 識別子 'j'
static const hoge h3(hage());
};
int main(int ac, char** av) {
std::cout << i << std::endl;
std::cout << poge::j << std::endl;
poge pooo;
return 0;
}
0873デフォルトの名無しさん
2007/11/06(火) 23:32:08> static const hoge h2(j); // error C2061: 構文エラー : 識別子 'j'
> static const hoge h3(hage());
これはいったいどういう動作を期待しているんだ? ちょっと説明してもらえまいか
0874872
2007/11/06(火) 23:41:570875デフォルトの名無しさん
2007/11/06(火) 23:44:23> static const hoge h1(i); // error C2061: 構文エラー : 識別子 'i'
> static const hoge h2(j); // error C2061: 構文エラー : 識別子 'j'
これは多分 hoge 型の変数の宣言、定義を意図しているんだろうけど
コンパイラからは戻り値の型が const hoge で static なメンバ関数の
宣言に見えている
エラーメッセージにはそんなこと書いてなかった?
0876872
2007/11/06(火) 23:53:17static const hoge h1(int(i));
static const hoge h1(int(j));
にしたらコンパイルできました
エラーメッセージはコメントのだけでした
ありがとうございます
0877デフォルトの名無しさん
2007/11/07(水) 01:18:070878デフォルトの名無しさん
2007/11/07(水) 01:20:190879デフォルトの名無しさん
2007/11/07(水) 01:32:29があったとして派生クラスのポインタ(関数ポインタのように)を取得して
Base* ClassTable[] = {Derive1のポインタ,Derive2のポインタ,...};
Base* p = new ClassTable[0]();
というようなことをしたいのですが
もし可能ならどうしたらいいでしょうか
0880デフォルトの名無しさん
2007/11/07(水) 01:37:49Base *createDerive1() { return new Derive1(); }
Base *createDerive2() { return new Derive2(); }
...
Base *(*classTable[])() = { createDerive1, createDerive2, ... };
Base *p = classTable[0]();
0881デフォルトの名無しさん
2007/11/07(水) 02:11:51クラスの static メンバ変数宣言は、整数型に限って = で初期化子をつけることが
できるだけ。普通に初期化できる変数定義とは違う。クラス型を初期化することは
できなくて、当然コンストラクタも使えない。
>>875 メンバ関数の宣言ならカッコ内は型付の引数リストじゃないといけない。
そうじゃないからコンパイルエラーになってる。
>>876 その変更を加えると、 int(i) が int 型で仮引数名 i の引数になる(余計な
括弧は無視される)ので static なメンバ関数の宣言とみなされてコンパイルが通る。
h3 が最初からコンパイルできてるのもこの理由。
0882デフォルトの名無しさん
2007/11/07(水) 02:13:58派生クラスを追加するたびに
createDeriveXをつくり
classTableにそれを登録しないといけませんよね
追加する際の作業をなるべく減らしたかったのですが
構造体やクラス自身のポインタはやはり得られないようですね
例示いただいたものを踏まえつつ別の案を考えてみます
どうもありがとうございました
0883デフォルトの名無しさん
2007/11/07(水) 02:25:38なんか似たような話をこないだ見たような気がするが。
template<typename T>
Base* new_as_Base() { return new T; }
Base* (*(ClassTable[]))() = {&new_as_Base<Derived1>, &new_as_Base<Derived2>};
Base* p = ClassTable[1]();
0884デフォルトの名無しさん
2007/11/07(水) 12:43:050885デフォルトの名無しさん
2007/11/07(水) 17:49:310886デフォルトの名無しさん
2007/11/07(水) 18:06:02int(i) が int 型で仮引数名 i の引数になる
へぇーそうなんだ 知らなかった 文法エラーではないの?
0887デフォルトの名無しさん
2007/11/07(水) 18:23:36と書いてあるだろう
0888デフォルトの名無しさん
2007/11/07(水) 18:26:10それは規格でそうなっているの?
0889デフォルトの名無しさん
2007/11/07(水) 18:26:55キャストにも見えるんだけど、関数の仮引数のところでは無視されるってこと?
0890デフォルトの名無しさん
2007/11/07(水) 18:27:49余計な括弧が無視されたら inti になってしまうよ
0891デフォルトの名無しさん
2007/11/07(水) 18:31:04仮引数の括弧は無視されるみたい
Effective STLかな?の最も奇妙な解析で見た
メイヤーズ先生も知らなかったらしい
0892デフォルトの名無しさん
2007/11/07(水) 18:32:54return(0) は return0 にならないよね
0893デフォルトの名無しさん
2007/11/07(水) 18:48:06その本持ってるので見てみる まだ読んでないんだ
>>892
たしかに
ということは仮引数にint(i)とあった場合、括弧が無視された結果
は int i と解釈されるということだね
0894デフォルトの名無しさん
2007/11/07(水) 18:52:320895デフォルトの名無しさん
2007/11/07(水) 18:57:52そりゃreturn(ってトークンがないからな
だから字句解析時にreturnと(ってなる
0896デフォルトの名無しさん
2007/11/07(水) 19:14:36/( ゚ )( ゚ )ヽ
/::::⌒`´⌒::::\ でっていうwwwwwwww
| ,-)___(-、|
| l |-┬-| l |
\ `ー'´ /
0897デフォルトの名無しさん
2007/11/08(木) 01:06:41これは、また・・・
0898デフォルトの名無しさん
2007/11/08(木) 08:04:41int *pi = &i;
*pi; //これって式(expression??)?
0899デフォルトの名無しさん
2007/11/08(木) 08:46:280900デフォルトの名無しさん
2007/11/08(木) 09:19:540901デフォルトの名無しさん
2007/11/08(木) 11:52:360902デフォルトの名無しさん
2007/11/08(木) 18:40:52class Base {
static int x;
};
class C : public Base {}
class D : public Base {}
とすると、変数Base::xは派生したすべてのクラスから共通の実体が参照されます。
このとき、派生クラスごとに独立のstatic変数を与えたいのですが、
そのようなことを行う方法はありますでしょうか?
0903デフォルトの名無しさん
2007/11/08(木) 18:56:32派生クラスごとにstatic変数を定義する
0904デフォルトの名無しさん
2007/11/08(木) 19:43:010905デフォルトの名無しさん
2007/11/08(木) 20:00:26ありがとうございます。
テンプレートでクラスごとに実体化するのはなかなかよさそうだったので、これでいってみます。
0906デフォルトの名無しさん
2007/11/08(木) 22:02:59あるオブジェクトをリスト管理しようとしてます。んで、そのオブジェクトは
別のオブジェクトが参照しているバッファ領域みたいなのを保持してる。
だから、そのバッファ領域のアドレスは変えたくない。
STLって、コピー前提のつくりだから、結局Cで使ってたリスト操作ライブラリ
引っ張ってきて使ってる。だっせえなあ、とか思いながら。
なんかいい方法ない?
0907デフォルトの名無しさん
2007/11/08(木) 22:31:30std::vectorならcapacityを超えない限りアドレス変更されない
std::listならそれぞれのオブジェクトのアドレスは変更されない
0908デフォルトの名無しさん
2007/11/08(木) 22:34:17もちろん、shared_ptrか何かを併用。
0909デフォルトの名無しさん
2007/11/08(木) 22:43:03Visual Studio 2005でMFCのアプリケーションをコンパイルすると
上のようなエラーがいっぱいでるのです。
これはどうやって回避すればいいのでしょうか?
0910デフォルトの名無しさん
2007/11/08(木) 22:56:540911デフォルトの名無しさん
2007/11/08(木) 22:57:27http://pc11.2ch.net/test/read.cgi/tech/1194016813/
0912デフォルトの名無しさん
2007/11/08(木) 22:59:14ウソウツ。
0x22ee94
0x22ee94
0x22ee94
0x4f0680
0x4f0690
0x4f06a0
void
insert()
{
int i = 0;
cout << &i << endl;
mylist.push_back(i);
}
int
main()
{
insert();
insert();
insert();
list<int>::iterator itr;
for (itr = mylist.begin(); itr != mylist.end(); itr++) {
cout << &*itr << endl;
}
return 0;
}
0913デフォルトの名無しさん
2007/11/08(木) 23:02:10http://pc11.2ch.net/test/read.cgi/tech/1192866305/
0914デフォルトの名無しさん
2007/11/09(金) 00:42:42、、、、なにしてんの? もしかして検証してるつもり?
0915デフォルトの名無しさん
2007/11/09(金) 00:51:00検証もクソも、STLのソースがメモリ確保して、コピーしてんだよ。
だから、auto変数を登録してもメモリ確保して、コピーされてんだよ。
チネ
0916デフォルトの名無しさん
2007/11/09(金) 00:55:060917デフォルトの名無しさん
2007/11/09(金) 01:00:54なんも知らないなら、ハジメカラソウイエヨ
0918デフォルトの名無しさん
2007/11/09(金) 01:13:16お前が何を検証したいのか良く分からん。
>だから、auto変数を登録してもメモリ確保して、コピーされてんだよ。
auto変数の登録って何だ?
mylist.push_back(i) は i の値をvectorに追加してるんだろう。
iの値を入れた器のアドレスと、i自身のアドレスが異なるのは当たり前だ。
もしかしてauto変数のアドレスを取得して登録でもしたいのか。
まさか、そんなことをしたいと考えるとは思えないが。
0919デフォルトの名無しさん
2007/11/09(金) 01:14:22「iの値を入れた器」はvector上でiの値を入れた器のこと。
0920デフォルトの名無しさん
2007/11/09(金) 01:15:45。。。。。。。。。。。。。。。。。
vectorに追加してるわけじゃないし、vectorだったら
n番目の要素のアドレスが、&myvector[n]と一致していることは、
保証されている。まずはそんくらいしっとけ、
0921デフォルトの名無しさん
2007/11/09(金) 01:28:37copy-in/copy-outであることが問題になるなら>>908のようにポインタでも格納しとけばいいと思う。
>>912で両者のアドレスが一致するようなことがあったら、それこそ病的な挙動だろ
0922デフォルトの名無しさん
2007/11/09(金) 01:31:38>>>912で両者のアドレスが一致するようなことがあったら、それこそ病的な挙動だろ
当たり前のことを理解できない、>>918がいるから説明してるわけで。
0923デフォルトの名無しさん
2007/11/09(金) 01:33:39>std::listならそれぞれのオブジェクトのアドレスは変更されない
これが、ウソダッテコトダケダ
0924デフォルトの名無しさん
2007/11/09(金) 01:40:16「それぞれのオブジェクト」は「リスト内の要素」を指してたと思うんだ。
0925デフォルトの名無しさん
2007/11/09(金) 01:42:45お互いに問題にしていることが違っているまま議論したら食い違って当たり前だろう
0926デフォルトの名無しさん
2007/11/09(金) 01:43:09>>923が
>std::listならそれぞれのオブジェクトのアドレスは変更されない
の意味を勘違いしているだけのように見える。
>>921の後半にだけ反応しているけど、最初の2行はちゃんと読んだの?
0927デフォルトの名無しさん
2007/11/09(金) 01:48:45だから、リストに渡した要素をそのまま保持したりはしないんだって。
リストに渡した要素は、コピーが生成されてリストに保持される。
だからリスト内の要素のアドレスは、とうぜん渡したオブジェクトの
アドレスとは*異なる*。んで、本来は検証もクソもないんだわ。
ソースがそうなってるから。
0928デフォルトの名無しさん
2007/11/09(金) 01:59:480930デフォルトの名無しさん
2007/11/09(金) 02:44:210931デフォルトの名無しさん
2007/11/09(金) 07:56:16おれもそう思う
listの場合追加、削除しても他の要素の反復子に影響はないから
0932デフォルトの名無しさん
2007/11/09(金) 09:15:35なんらかの悪意があるんじゃないのか
0933デフォルトの名無しさん
2007/11/09(金) 20:02:09リファレンスってどこで見れるの?書籍でもWebでもよいのだけど。
「C++標準ライブラリチュートリアル&リファレンス (単行本) 」
がよさそうかなと思ったけど、絶版本で29,800円とかプレミアム
ついてるし。
0934デフォルトの名無しさん
2007/11/09(金) 20:09:460935デフォルトの名無しさん
2007/11/09(金) 20:22:58原著あるよ
0936デフォルトの名無しさん
2007/11/09(金) 20:41:150937デフォルトの名無しさん
2007/11/09(金) 22:02:280938デフォルトの名無しさん
2007/11/09(金) 22:42:32あとは検索性が難だが、JIS X 3014がJISCのWebサイトから見れる。
0939デフォルトの名無しさん
2007/11/09(金) 22:56:01なんかうるさい警告が山ほど出るけど、なんでだろ?
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/allocator.h:
In instantiation of `std::allocator<MyClass*>':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_vector.h:79:
instantiated from `std::_Vector_base<MyClass*, std::allocator<MyClass*> >::_Vector_impl'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_vector.h:110:
instantiated from `std::_Vector_base<MyClass*, std::allocator<MyClass*> >'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_vector.h:142:
instantiated from `std::vector<MyClass*, std::allocator<MyClass*> >'
main.cpp:52:
instantiated from here
class MyClass {
public:
MyClass() {};
virtual ~MyClass() {};
};
vector<MyClass*> myvec;
int
main()
{
MyClass *p;
p = new MyClass();
myvec.push_back(p);
return 0;
}
0940デフォルトの名無しさん
2007/11/09(金) 23:18:00上記の警告を-Weffec++有効にしたままで抑制する方法ってあるんかな。
0941デフォルトの名無しさん
2007/11/09(金) 23:37:020942912
2007/11/09(金) 23:53:17>>907は確かに言葉が足りないと思うが、
安価先のレスを読めば意図を理解できるだろう。
それに比べて君は、君が馬鹿にしている>>906より言葉が足りない。
もう少し、人のいわんとすることを理解しようとする努力と、
人に伝えるための努力が必要だろう。
まぁ、お前こそとっととチネがほんねだけれども。
0943デフォルトの名無しさん
2007/11/10(土) 02:58:41システムヘッダファイルからは警告を出さない、っていうオプションがあったような気がする
0944デフォルトの名無しさん
2007/11/10(土) 10:24:53システムヘッダから警告出さないのがデフォルトで、出せって言うオプションがある。
gcc がバグってたみたい。修正は、 4.2.x ?
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14172
0945デフォルトの名無しさん
2007/11/10(土) 19:41:45template< int N >
class class1
{
public:
void print()
{
std::cout<<"test"<<std::endl;
}
};
template< int N >
class class2 :class1<N>
{
};
int main()
{
class2<42> obj;
obj.print(); //ここでコンパイルエラー
return 0;
}
'class1<42>::print()' はアクセスできないとコンパイラに怒られます。
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19
と似たようなエラーであることは分かったので、
obj.class1<42>::print();とか
(class1<42>)(&obj)->print();とか試してみましたが、やはり怒られます。
どう解決すればよいのか教えていただければ幸いです。
0946デフォルトの名無しさん
2007/11/10(土) 19:46:18private継承だから?
0947デフォルトの名無しさん
2007/11/10(土) 19:47:14あなたが必要なのは
メンバ変数ですか?
それともテンプレートですか?
0948デフォルトの名無しさん
2007/11/10(土) 19:53:45すみません、そうでした。
しばらくjavaしかやってなかったものですっかりpublic継承忘れてました。
>>947
一応テンプレートです。
0949デフォルトの名無しさん
2007/11/11(日) 23:50:02こんなCの関数があって、これは俺が作ったものではないので変更できません。
typedef struct foo{
int a;
}foo;
こんな構造体があって、Cなら
foo *f;
data_get(&f);
こんな風に使います。
C++で今までVisual C++ 2005 で開発してこの関数を使うとき
foo* f;
data_get(reinterpret_cast<void**>(&f));
とやっていて、動作も特に問題が無かったのですが、g++4.1でコンパイルしたところ
warning: dereferencing type-punned pointer will break strict-aliasing rules
と怒られました。
一応この警告の意味とコードが標準に準拠してないことは理解したつもりですが
それでは、data_get関数をC++から安全に使うにはどのようにしたらいいでしょうか?
foo* f;
void** tmp = reinterpret_cast<void**>(&f);
data_get(tmp);
としてもも警告が出てしまいます。
void* tmp;
data_get(&tmp);
foo* f = reinterpret_cast<foo*>(tmp);
これだと警告が出ないのですが、大丈夫でしょうか。
0950デフォルトの名無しさん
2007/11/11(日) 23:52:14void* tmp;
data_get(&tmp);
foo* f = static_cast<foo*>(tmp);
の方がいいんじゃない
0951デフォルトの名無しさん
2007/11/11(日) 23:56:02reinterpret_cast は良くないね。最後のやつを static_cast に変えるのが最善かな。
0952デフォルトの名無しさん
2007/11/12(月) 00:02:30C++なんだから、こっちで多重定義してしまえばいい。
inline foo_data_get(foo*& data)
{
void *p;
data_get(&p);
data = static_cast<foo*>(p);
}
0953949
2007/11/12(月) 00:32:02ところで、void*からのキャストはreinterpret_castもstatic_castも同じだと思ってたんですが
違うんですか?
0954デフォルトの名無しさん
2007/11/12(月) 00:33:34reinterpret_cast は実装依存。 static_cast は foo* → void* への暗黙の変換の逆変換。
どっちも同じになる実装がほとんどだろうけどね。
0955デフォルトの名無しさん
2007/11/12(月) 00:37:090956デフォルトの名無しさん
2007/11/12(月) 02:12:17それだけではないけどね
void* -> T* の暗黙の変換はないけど
これもstatic_castの仕事の一つ
0957デフォルトの名無しさん
2007/11/12(月) 08:10:10__FILE__がtest.cxxになりますが、
#define test.cxx
と同等のことを__FILE__を使ってできませんか?
0958デフォルトの名無しさん
2007/11/12(月) 08:48:00識別氏にピリオドを含むことはできません。定義するマクロ名にマクロ展開の結果は使えません。
0959デフォルトの名無しさん
2007/11/12(月) 22:55:33g++ -fno-strict-aliasing じゃだめ?
0960デフォルトの名無しさん
2007/11/13(火) 01:17:34C++もCと同じだと思うけど、
汎用(void)のポインタへのポインタ型というのは規格上ないはず。
void func(void **);
int *p;
func((void **)&p);
こういうコードは移植性がなく動作は未定義。
正しくは、
void *vp = p;
f(&vp);
p = vp;
なので自分で書いてるとおりvoidポインタを介在させればよい。
foo *f;
void *tmp = f;
data_get(&tmp);
f = static_cast<foo*>(tmp);
でいいんでは?
0961デフォルトの名無しさん
2007/11/13(火) 02:43:06void**という型がないわけではない。
ただ、T**――Tはvoid以外の任意の型(あー、一応関数型も除く)――
とvoid**との間の変換が定義されていないだけ。
0962デフォルトの名無しさん
2007/11/13(火) 03:39:21--- values.cpp ---
int values[] = { 5, 1, 2, 4, ... };
--- values.h ---
extern int values[];
--- table.cpp ---
#include "values.h"
int table[] = { values[0], values[1], values[2], ... };
こんな風に、異なる翻訳単位に2つのグローバル変数
values[] と table[] があって、table[] の初期化が values[] に
依存しているときに、コンパイラはこの依存関係(?)をちゃんと
検出してグローバル変数の定義順序を決めてくれるもんなんでしょうか?
詳しい方おられましたら、よろしくお願いします。
0963デフォルトの名無しさん
2007/11/13(火) 03:44:08table.cppは int table[]... の前に extern int values[]; を展開する。
0964962
2007/11/13(火) 03:44:24--- values.cpp ---
int values[] = { 5, 1, 2, 4, ... };
int get_value(int i) { return values[i]; }
--- values.h ---
int get_value(int);
--- table.cpp ---
#include "values.h"
int table[] = { get_values(0), get_values(1), get_value(2), ... };
0965デフォルトの名無しさん
2007/11/13(火) 03:47:15o宣言した順に
0966デフォルトの名無しさん
2007/11/13(火) 03:47:570967デフォルトの名無しさん
2007/11/13(火) 03:59:33によって変わるということでしょうか。
手元のコンパイラ BorlandC++BuilderX でどちらも試してみましたが、
警告もエラーもなく期待通りに初期化されるようなので、良く分かりません。
table[] の初期化が values[] の初期化より先に行われるようなコンパイラが
あるとすれば、問題が起こるかもと思ったのですが。
0968デフォルトの名無しさん
2007/11/13(火) 08:12:18その場合 values は定数式で初期化されているので静的初期化になります。
table は定数式じゃないので動的初期化になります。非ローカルオブジェクトの
初期化は静的初期化が先で動的初期化が後なので、その例だと問題は起こり
ません。
静的初期化には特に順番というものがありません。動的初期化については
同じ翻訳単位内での順番は定義順と決まっていますが、翻訳単位をまたぐと
順番が定まらなくなりますので、その場合に問題が起こる可能性があります。
0969949
2007/11/13(火) 08:20:18それやったら負けかなと思ってる。
「最適化しても良い」って決まりですし。
>>960-961
ふむふむ、
そういえなvoid**はvoid*とは違って全然汎用ではないですね
0970デフォルトの名無しさん
2007/11/13(火) 08:53:01そりゃそうだ、void **はvoid *へのポインタに過ぎない。
0971デフォルトの名無しさん
2007/11/13(火) 09:41:55実行速度を計測するのと違って、自分の環境でたまたまうまくいけば
それで疑問が晴れる、というものではないから、それは見当違いの反応だよ。
0972デフォルトの名無しさん
2007/11/13(火) 10:15:24>>969
汎用(void)はおかしかった。void**がないわけではなく
”汎用として使えるポインタへのポインタ型はない”
と言いたかった。ここでいう汎用とはあるT型から
の変換とT型への変換ができるということ。
(不完全型へのポインタなので変換できない)
詳しくはCプログラミングFAQ
0973デフォルトの名無しさん
2007/11/13(火) 10:25:43void *vp;
があったとして
*vpのようにデリファレンスすることはできませんが
void** vpp;
があったとして、これを*vppのようにデリファレンスするのはOK
ですよね?(*vppはただのポインタで結果はvoid*となるので)
0974973
2007/11/13(火) 10:27:03(*vppはただのポインタで結果はvoid*となるので) ×
(vppはただのポインタで*vppの結果はvoid*となるので) ○
0975973
2007/11/13(火) 10:40:19void MyMemoryAlloc(void **vpp, size_t n)
{
.
. 詳細は省略
.
*vpp = malloc(n * sizeof(T)); //確保したメモリへのポインタ
}
T *p;
void *vp = p;
MyMemoryAlloc(&vp, 10);
p = vp;
というのはOKですよね?というかよくありますよね?
0976デフォルトの名無しさん
2007/11/13(火) 11:05:02おk
だけど
>>975
T *p;
MyMemoryAlloc(&p, 10);
これでよくね?
ただし、TがPOD型のみ有効。
0977デフォルトの名無しさん
2007/11/13(火) 11:26:560978973
2007/11/13(火) 11:45:20ご説明ありがとうございます。
T *p;
MyMemoryAlloc(&p, 10);
としてしまうと、>>961さんご指摘のように
T** から void**への暗黙の変換が
できないですよね?
(POD型というのが分からなかったのですが。)
0979デフォルトの名無しさん
2007/11/13(火) 14:44:25ありがとうございます。勉強になりました。
>>962のサンプルの場合も、table[] の初期化子 (values[0] など)は
定数式ではない(配列の要素は const であっても定数式にならないん
でしたよね) ので、やはり values が table より先に(静的)初期化される、
と考えて良いんですね。
0980デフォルトの名無しさん
2007/11/13(火) 15:22:00あまり深く考えずに、
template<typename T> T * vp_assign( T * & lhs, void * rhs){
return lhs = static_cast<T *>(rhs);
}
template<typename T> T * vpp_assign( T ** lhs, void ** rhs) {
return vp_assign(*lhs, *rhs);
}
とか作って、それを使えばいいじゃまいか
0981デフォルトの名無しさん
2007/11/14(水) 02:37:14そうだよ。規格の 3.6.2 ね。
0983デフォルトの名無しさん
2007/11/14(水) 02:42:03p = vp はコンパイルできない。 static_cast が必要。
>>976
void** の引数に T** は渡せない。
>>980
意味が分からないから、たぶんやめたほうがいい。
レス数が950を超えています。1000を超えると書き込みができなくなります。