C++相談室 part52
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2006/08/26(土) 02:08:15ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
テンプレその他 >>1-15 付近参照
前スレ
C++相談室 part51
http://pc8.2ch.net/test/read.cgi/tech/1153079297/
0002デフォルトの名無しさん
2006/08/26(土) 02:08:452 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003デフォルトの名無しさん
2006/08/26(土) 02:09:2617 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
0004デフォルトの名無しさん
2006/08/26(土) 02:09:5932 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/
0005デフォルトの名無しさん
2006/08/26(土) 02:10:3047 http://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 http://pc8.2ch.net/test/read.cgi/tech/1142423595/
49 http://pc8.2ch.net/test/read.cgi/tech/1146185570/
50 http://pc8.2ch.net/test/read.cgi/tech/1149427282/
51 http://pc8.2ch.net/test/read.cgi/tech/1153079297/
0006デフォルトの名無しさん
2006/08/26(土) 02:11:01[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/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
0007デフォルトの名無しさん
2006/08/26(土) 02:11:48amazon.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/
C++ Coding Standards
ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
0008デフォルトの名無しさん
2006/08/26(土) 02:14:17Effective 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/
0009デフォルトの名無しさん
2006/08/26(土) 02:14:49[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
0010デフォルトの名無しさん
2006/08/26(土) 02:15:22多すぎ。とりあえずスレタイ C++ で検索して。
以下、スレタイで見つからなさそうな関連スレ。
Boostを語れゴラァ part2
http://pc8.2ch.net/test/read.cgi/tech/1139313234/
GCCについて part7
http://pc8.2ch.net/test/read.cgi/tech/1145357824/
0011v(^・^)v
2006/08/26(土) 02:17:00過去スレ一覧、 2ch のアドレス貼っても HTML 化されるわけじゃないし、
そろそろ考え直したほうがいいかも。
0012デフォルトの名無しさん
2006/08/26(土) 02:21:13激しく乙。
過去スレのリンクは、datを探してる人(いるのか?)には有益だから、そのままでもいいと思うよ。
あるいは、テンプレサイトか。
0013デフォルトの名無しさん
2006/08/26(土) 02:31:37お前は無知そうだし答えなくていいよ
0014デフォルトの名無しさん
2006/08/26(土) 02:34:030015デフォルトの名無しさん
2006/08/26(土) 02:34:530016デフォルトの名無しさん
2006/08/26(土) 02:36:380017デフォルトの名無しさん
2006/08/26(土) 02:38:491. オーバーフローしないサイズの型を選択する
2. 計算前にチェックする
3. 計算後にチェックする
4. クラスを作ったりする。
F.A.
0018デフォルトの名無しさん
2006/08/26(土) 02:46:030019デフォルトの名無しさん
2006/08/26(土) 02:52:180020デフォルトの名無しさん
2006/08/26(土) 03:04:06例えばNumricクラスを作って四則演算を演算子オーバーロードして、
オーバーフロー時に例外をthrowするようにするとか。これだと簡単でしょ。
でも普通は1.だと思うけど。
0021デフォルトの名無しさん
2006/08/26(土) 03:15:23既にboostとかにありそうな気も。あと基本型のみのoperatorは
できないような。。片方はクラスに入れてとか?
0022デフォルトの名無しさん
2006/08/26(土) 03:20:02するという意味です。
0023デフォルトの名無しさん
2006/08/26(土) 03:23:490024デフォルトの名無しさん
2006/08/26(土) 03:28:40現実的じゃなさそうですし、オーバーフローしそうな箇所のみを特定して
おいてNumeric型にするというのがやはり妥当なんですかねえ。。
0025デフォルトの名無しさん
2006/08/26(土) 03:39:50なって脆弱なプログラムができあがるわけだ
0026デフォルトの名無しさん
2006/08/26(土) 03:43:510027デフォルトの名無しさん
2006/08/26(土) 03:52:40BigIntで検索しよう。がんばって作るんだよ。
0028デフォルトの名無しさん
2006/08/26(土) 03:54:30多倍長整数を扱うライブラリを拾ってくる。
0029デフォルトの名無しさん
2006/08/26(土) 04:03:27今DLLを作っているのですが、例えば文字列を
char *ではなくstring でやりとりするような関数をDLLで作ったとき、
1.そのDLLを利用するアプリケーション側 と
2.DLL側 とで
開発環境が異なっていてstringの実装詳細が違っていたりしたら
実行時エラーとかが起こってしまうのでしょうか?
ご回答よろしくお願いします。
0030デフォルトの名無しさん
2006/08/26(土) 04:10:48stringが規格に則って正しく実装されているなら、
実装の詳細は関係ない。
0032デフォルトの名無しさん
2006/08/26(土) 04:25:16起こってしまいます。
>>30
DLL とのインターフェースではバイナリ互換性が要求される。
規格にバイナリ互換性についての規定は無い。
class string { size_t n; char* p; ... };
class string { char* p; size_t n; ... };
↑の2つの string はどちらも規格に適合した実装となり得るが、
一方の実装が使われた DLL での string を、他方の実装が使われた
プロセスで正しく操作することはできない。
0034デフォルトの名無しさん
2006/08/26(土) 05:09:35変換できない場合NULLが返るということらしいのですが、そうならなくて、代わりにaccess violationが発生します
なぜですか?
0035デフォルトの名無しさん
2006/08/26(土) 05:31:08自分はその症状に遭遇したことないけどこんなの発見した、
ttp://www.s34.co.jp/cpptechdoc/article/newcast/index.html
(抜粋)dynamic_castが適用できるのはポリモルフィック・クラス、
すなわち少なくとも一つのメンバ関数が仮想関数でなくてはなりません。
そして多分この場合bad_cast例外が投げられてるんじゃないかと
0036デフォルトの名無しさん
2006/08/26(土) 05:42:24問題が再現する最小のソースを作ってみよう。
0037デフォルトの名無しさん
2006/08/26(土) 08:48:17RTTIを使用するためのコンパイラオプションを設定していないのではないか?
VC++ 7ではそれを指定しないとRTTIが使えなかった気がする。
>>24
世の中それでパフォーマンスが問題になるほど最適化があほなC++コンパイラばかりでもないぞ。
まあ作業時の方が問題だというのはそうだろうな。
003826
2006/08/26(土) 08:50:46ありがとうございました^^
0039デフォルトの名無しさん
2006/08/26(土) 11:18:32C++でオーバーフローチェックしてるプログラムなどほとんどない。
0040デフォルトの名無しさん
2006/08/26(土) 14:15:32そりゃあらかじめ要素の範囲が解ってる設計してるからじゃないのか?
0041デフォルトの名無しさん
2006/08/26(土) 14:42:24処理の途中で現在の型の範囲を超える値になった時に
その変数の型をより大きな範囲を表現できる型に自動で変更してくれる。
004234
2006/08/26(土) 14:47:21レスありがとうございます。
コンパイラオプションが必要ということはまったく知りませんでした。
ためしに同じソースを家のVC++7だとコンパイルできた。
プロパティーの「言語」の「ランタイム型情報を有効にする」は「いいえ」になっています。
会社のとバージョンが違うのかな。。
もっと調査してみます。
>>35
bad_cast例外ってC++の例外ですよね?Win32例外でしたので。
0043デフォルトの名無しさん
2006/08/26(土) 19:47:52コンパイルは通るよ。
実行時にエラーが出るけど。
0044デフォルトの名無しさん
2006/08/27(日) 02:42:56vectorとかのbegin()は、もし要素がない場合nposを返すのですか?
それとも要素がない場合を判定するにはend()と比較するのですか?
nposと書いたらコンパイルエラーになったもので。
0045デフォルトの名無しさん
2006/08/27(日) 02:45:510046デフォルトの名無しさん
2006/08/27(日) 02:58:390047デフォルトの名無しさん
2006/08/27(日) 03:03:400048デフォルトの名無しさん
2006/08/27(日) 03:30:20vec.size()<1
ループなら
for(int i=0; i<vec.size(); i++){
でOK
文字列std::stringならempty()
0049デフォルトの名無しさん
2006/08/27(日) 03:31:28イテレータ使えよ…
0050デフォルトの名無しさん
2006/08/27(日) 03:40:45Dのautoみたいなのがあればいいんだけど。
0051デフォルトの名無しさん
2006/08/27(日) 03:47:210052デフォルトの名無しさん
2006/08/27(日) 03:54:45次の標準で入ります。
0053デフォルトの名無しさん
2006/08/27(日) 04:42:56#つーか、EffectiveSTLは必読書だと思う。
0054デフォルトの名無しさん
2006/08/27(日) 06:23:44共通のインターフェースで処理を行うことが出来るのが利点の一つだよな。
初心者向けのAccelerated C++にさえ載っている。
0055デフォルトの名無しさん
2006/08/27(日) 08:38:07stringはcontainerじゃないが。
0056デフォルトの名無しさん
2006/08/27(日) 11:02:150057デフォルトの名無しさん
2006/08/27(日) 11:13:13置き換え・挿入などが頻繁に行われるので、いろんなメンバ関数を
持ってる所が他のコンテナと違うけどな。
0058デフォルトの名無しさん
2006/08/27(日) 11:25:42環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
スマン・・・どうしても・・・
0059デフォルトの名無しさん
2006/08/27(日) 11:52:49いいんだ。
俺もそれをいつ入れようかと思っている間にスレ番があっという間に
進んでしまい、躊躇していた。
0060デフォルトの名無しさん
2006/08/27(日) 12:27:14> すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
STL使うのにスタティックリンクかダイナミックリンクで違いが?
0061デフォルトの名無しさん
2006/08/27(日) 12:29:570062デフォルトの名無しさん
2006/08/27(日) 12:34:070063デフォルトの名無しさん
2006/08/27(日) 12:36:54http://pc8.2ch.net/test/read.cgi/tech/1149263630/556
0064デフォルトの名無しさん
2006/08/27(日) 13:28:47粘着にしか見えね
0065デフォルトの名無しさん
2006/08/27(日) 14:15:160066デフォルトの名無しさん
2006/08/27(日) 15:39:460067デフォルトの名無しさん
2006/08/27(日) 17:15:56むしろ変なものを呼んでるけど。
0068デフォルトの名無しさん
2006/08/27(日) 19:36:400069デフォルトの名無しさん
2006/08/27(日) 19:50:4321.3.2 にこんなん書いてあるよ。
"The class template basic_string conforms to the requirements of a Sequence, as specified in (23.1.1).
Additionally, because the iterators supported by basic_string are random access iterators (24.1.5),
basic_string conforms to the the requirements of a Reversible Container, as specified in (23.1)."
0070モンガー
2006/08/27(日) 21:47:56『More C++ Gems』
http://www.amazon.com/gp/product/0521786185/sr=1-2/qid=1156682502/ref=pd_bbs_2/104-6793333-7903963?ie=UTF8&s=books
0071デフォルトの名無しさん
2006/08/27(日) 21:58:15instantiateに成功すればいいってもがC++だからね。
0072デフォルトの名無しさん
2006/08/27(日) 22:04:01古い。
アジソン=ウエズレイの"The C++ In-Depth Series"で、
網羅されていて、しかも内容も新しくなっている。
古文書やD&Eを読む趣味がある人は読んでもいいと思う。
いまだにPDFになってないオリジナルの著名論文も読めるし。
0074デフォルトの名無しさん
2006/08/28(月) 12:30:11むしろ、C++からJVMのバイトコードし、Javaのクラスライブラリが
C++からも利用できれば、C++最強じゃね?とか妄想したり。
0075デフォルトの名無しさん
2006/08/28(月) 18:58:59<<で、連結していくと、どっかでバッファ拡張するようにな仕組みなんかな。
なんとなく重い気がする。JavaでいうStringBuilderみたいなの作った方がよいのかな。
0076デフォルトの名無しさん
2006/08/28(月) 19:13:14結局<<を諦めてstring+reserveでお茶を濁した覚えがある。
0077デフォルトの名無しさん
2006/08/28(月) 19:59:05その辺は、basic_stringbuf が管理してる。
overflow が呼び出されたときに、必要に応じて拡張される。
http://www.io.nara-su.ac.jp/kanrishitsu/manual/FSUNf90/LANG/japanese/C++/stdlib/stdref/bas_3672.htm
ちなみに、VC7.1 付属の stringbuf だと、もとの1.5倍程度になるらしい。
0078デフォルトの名無しさん
2006/08/28(月) 19:59:54領域の確保を一度で済ませるようなコードをポストしていた気がする。
0079デフォルトの名無しさん
2006/08/28(月) 23:25:51void operator = (const T& t) {
a = t.a;
b = t.b;
}
のように1つひとつコピーだと、メンバ変数が増えたときにコード量が多くなってしまいます。
thisを使って一気にコピーしたいのですが、
void operator = (const T& t ) {
*this = t;
}
のように書くと無限ループに陥ってしまいます;
どのように記述すればよいでしょうか?
あと、
T a, b, c;
a = b = c;
のように記述したいときは、
T& operator = ( const T& t )
{
......
return *this
}
でいいですか?
0080デフォルトの名無しさん
2006/08/28(月) 23:28:57そりゃ自分で自分自身を呼び出せば無限ループになるだろう。
基本的にはメンバ毎にコピーするしかない。
0081デフォルトの名無しさん
2006/08/28(月) 23:34:39メンバ変数を代入するだけなら暗黙に定義されるoperator=で十分じゃね。
0082デフォルトの名無しさん
2006/08/28(月) 23:42:23これって何に使うんですか?
メンバ関数にhoge()って一つ用意するよりずっと便利な使い方とかあるんでしょうか
0083デフォルトの名無しさん
2006/08/28(月) 23:43:12データのまとめ方が圧倒的に下手・・・!
class mydata
{
public:
int a,b;
};
mydata data;
void operator = (const T& t ) {
data = t.data;
}
これで万事解決・・・!
0084デフォルトの名無しさん
2006/08/28(月) 23:46:310085デフォルトの名無しさん
2006/08/28(月) 23:46:54全メンバを普通にコピーするだけならデフォルトの方が良い
メンバが増えるたびに書き直す必要がなくなるし、コンパイラの最適化も効く
0086デフォルトの名無しさん
2006/08/28(月) 23:47:40関数オブジェクト(Functor)のありがたさを本当に実感するには、
STLのコンテナにアルゴリズムを適用させるようになってからだろう。
008779
2006/08/28(月) 23:48:29ありがとうございます。
無知なもので、operator=が暗黙的に定義されることを知りませんでした。
やりたいことはメンバ変数の代入だけなので、それで解決しました。
0088デフォルトの名無しさん
2006/08/28(月) 23:52:440090デフォルトの名無しさん
2006/08/29(火) 00:00:55ヒープ領域に実体を持ってて、メンバにはポインタを含んでいそうな
気がするんだけど。
009279
2006/08/29(火) 00:06:07{
myClass t;
for( ;; ) {
}
009379
2006/08/29(火) 00:07:13int main()
{
myClass t;
for( ;; ) {
myClass t2;
t=t2;
break;
}
t.show();
}
で確認したのでおそらく大丈夫かと思われます
0094デフォルトの名無しさん
2006/08/29(火) 00:07:27問題ない。コンテナはデフォルトのoperator=でコピーしても
メモリリークとか二重解放しないように設計されている。
0095デフォルトの名無しさん
2006/08/29(火) 00:07:50自分のクラスのメンバ変数がポインタで、そこに何かを格納している場合、
コピーを作るときは、自分でnewして、そこにポインタの指すメモリ内容を転写するんだよ。
同じものを複数のポインタが見ていて問題ない設計ならOKだが。
0096デフォルトの名無しさん
2006/08/29(火) 00:13:00コピーは適用されなくて、クラスのoperator=を呼び出すんじゃね?
規格書のどこに書いてあるかは忘れたが。
0097デフォルトの名無しさん
2006/08/29(火) 00:16:290098デフォルトの名無しさん
2006/08/29(火) 00:18:050099デフォルトの名無しさん
2006/08/29(火) 00:34:2313 The implicitly-defined copy assignment operator for class X performs memberwise assignment of its subobjects.
The direct base classes of X are assigned first, in the order of their declaration in the base-specifierlist,
and then the immediate nonstatic data members of X are assigned, in the order in which they were
declared in the class definition. Each subobject is assigned in the manner appropriate to its type:
? if the subobject is of class type, the copy assignment operator for the class is used (as if by explicit qualification;
that is, ignoring any possible virtual overriding functions in more derived classes);
? if the subobject is an array, each element is assigned, in the manner appropriate to the element type;
0100デフォルトの名無しさん
2006/08/29(火) 00:39:51「全部 operator= が適用される」で済む話をわざわざ複雑にするな。
0101デフォルトの名無しさん
2006/08/29(火) 00:59:50ありがとうございます。参考になりました
0102デフォルトの名無しさん
2006/08/29(火) 10:32:54{
public:
void hoge() {}
private:
char buf[256];
};
A a1;
A a2 = a1;
a2 = a1;
こういうメンバ変数がPOD型だけのクラスの場合
デフォルトのコピーコンストラクタやoperator=が例外を投げることはあるのでしょうか?
0103デフォルトの名無しさん
2006/08/29(火) 13:25:040104デフォルトの名無しさん
2006/08/29(火) 20:03:57関数内で値をいじるならポインタで、見るだけなら参照だと聞いたんですが
変更する必要がないなら普通に引数として渡せばいいんじゃないですか?
0105デフォルトの名無しさん
2006/08/29(火) 20:11:210106デフォルトの名無しさん
2006/08/29(火) 20:15:53その使い方は C 使いの人が好む流儀。見た目で区別がつくという利点があるが、
その流儀に従わない人もいるので信頼性が微妙。結局のところ全部参照でも問題ない。
普通に引数として渡すとコピーが必要になるので、大きなクラス(構造体)の場合に
処理効率が問題になることがある。値渡しは const 付きの参照で置き換えると
コピーを必要とせずにほぼ同じ効果を得ることが出来るので大きなクラスに限らず
よく使われる。
0107104
2006/08/29(火) 20:24:19ありがとうございました
特に決まった使い分け方があるというわけではないのですね
0108デフォルトの名無しさん
2006/08/29(火) 20:42:45・内部でイテレーションしたいとき。(配列など)
・”無効な値”が渡される可能性があるとき。(所謂ぬるぽ)
・スマートポインタ/生ポインタ互換のインターフェイスを作るとき
・関数ポインタが欲しいとき
・Cとの互換性など
引数の型として値を要求するケース
・そのほうが効率がいいとき
・内部でスワップ技法を利用するとき。
・破壊的コピーなどを期待するとき。
引数の型として参照・const参照を要求するケース
・上記以外
0109デフォルトの名無しさん
2006/08/29(火) 20:45:55operator= の実装で、swap 技法を使うときなどは値渡しが良い。
T operator=( T const & rhs ) { T(rhs).swap(*this); return *this; }
とやるくらいなら、
T operator=( T rhs ) { rhs.swap(*this); return *this; }
の方が分かりやすくてGOOD
0110デフォルトの名無しさん
2006/08/29(火) 20:47:19"C++ Coding Standard"と言う本の
> 25. 値、スマートポインタ、リファレンスのパラメータを適切に使い分けよう。
を読んで。
0111デフォルトの名無しさん
2006/08/29(火) 21:03:430112デフォルトの名無しさん
2006/08/29(火) 21:04:35ごにょごにょ
0113デフォルトの名無しさん
2006/08/29(火) 21:15:07ぬるぽ
0114デフォルトの名無しさん
2006/08/29(火) 21:15:32引数の型としてポインタを要求するケース:
汎用ポインタ(void*)を扱うとき。
>>111
英語版はテンプレに書いてある。日本語版は JIS X3014 で検索。
0115デフォルトの名無しさん
2006/08/29(火) 21:23:25どっちでも変わらんし、実装が宣言に漏れてるみたいで嫌だ。
0116デフォルトの名無しさん
2006/08/29(火) 22:13:02> 英語版はテンプレに書いてある。日本語版は JIS X3014 で検索。
あんと。でもな、
> [JTC1/SC22/WG21 - C++]
> http://www.open-std.org/jtc1/sc22/wg21/
> ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
ここ見たけど、どれをダウンロードすればいいか分からんのやよー。
0117デフォルトの名無しさん
2006/08/29(火) 22:16:16n1905.pdf当たりだろ。
0118デフォルトの名無しさん
2006/08/29(火) 22:30:26ありがとー。ダウンロードできたよー。
0119デフォルトの名無しさん
2006/08/29(火) 23:32:21void foo(char * & p);
などとしてしまうんだが、これって同ですか?
個人的には、見た目が好きじゃないけど、めんどくささがないから使っちゃう。
0120デフォルトの名無しさん
2006/08/29(火) 23:43:58そうですか。
0121デフォルトの名無しさん
2006/08/30(水) 00:12:00ポインタのリファレンスを使わないと、プログラム内で呼び出し元の
関数のポインタの値を変えるにはポインタのポインタが必要となり、
しかもその関数内では余計な*が常に必要となる。
ポインタのリファレンスを使えば、呼び出し元の関数と同レベルで
ポインタを扱えるようになり、頭の切り替えが必要なくなる。
0122デフォルトの名無しさん
2006/08/30(水) 00:32:21その表現イイ!後輩いじめにつかわしてもらうわ。
0123デフォルトの名無しさん
2006/08/30(水) 00:38:42なるほど。漏れもそういう理屈で吹っ切ることにする。
0124デフォルトの名無しさん
2006/08/30(水) 01:04:13void bar(char* &p);
のときに、どちらも
foo(p);
bar(p);
となるので、俺は使わない。
0125デフォルトの名無しさん
2006/08/30(水) 01:25:03それはポインタに限った話じゃないでしょ。
0126デフォルトの名無しさん
2006/08/30(水) 04:01:140127デフォルトの名無しさん
2006/08/30(水) 04:03:23そうでもない。組み込み型は値渡しがほとんどだろうけど、
ポインタはリファレンス渡しも多用される。
0128デフォルトの名無しさん
2006/08/30(水) 04:19:100129デフォルトの名無しさん
2006/08/30(水) 05:34:23俺は市内というだけの話。
0130デフォルトの名無しさん
2006/08/30(水) 07:07:370131デフォルトの名無しさん
2006/08/30(水) 08:31:400132デフォルトの名無しさん
2006/08/30(水) 08:32:240133デフォルトの名無しさん
2006/08/30(水) 08:57:29かえってややこしくならないか?
0134デフォルトの名無しさん
2006/08/30(水) 08:58:41かえってややこしくならないか?
違うものなんだから、普通に使い分けろよ。
0135デフォルトの名無しさん
2006/08/30(水) 09:18:18チームで開発するならルール付けもいるよね。
0136デフォルトの名無しさん
2006/08/30(水) 09:34:400137デフォルトの名無しさん
2006/08/30(水) 09:40:56参照が使えるところでは常に参照を使うべき
constと話は同じだ
0138デフォルトの名無しさん
2006/08/30(水) 09:44:210139デフォルトの名無しさん
2006/08/30(水) 09:50:420140デフォルトの名無しさん
2006/08/30(水) 10:04:00混ざると何か困るのか?
0141デフォルトの名無しさん
2006/08/30(水) 10:08:510142デフォルトの名無しさん
2006/08/30(水) 10:18:11参照はエイリアス。
0143デフォルトの名無しさん
2006/08/30(水) 10:37:59ごちゃごちゃになるのがいやならラッパクラスを作ればいいだけっしょ。
0144デフォルトの名無しさん
2006/08/30(水) 12:52:49foo(a);と書かれた時にaが変更されない保証がされてるほうがいいし
多くのAPIとの親和性にも優れてると思う
0145デフォルトの名無しさん
2006/08/30(水) 13:39:220146デフォルトの名無しさん
2006/08/30(水) 20:50:48{
friend class Foo; // <----
};
template<typename T>
class Foo {};
Fooをfriendにしたいのですが、これではコンパイルが通りません。
friendにしたい相手がtemplateの場合はどう書けばいいのでしょうか?
0147デフォルトの名無しさん
2006/08/30(水) 20:56:46friend class Foo;
0148デフォルトの名無しさん
2006/08/30(水) 21:11:05・Javaはやってる
・ポインタ印* をなくすこと
・文字列はstd::string。Cの汚点は文字列の参照渡しができないとこ
・動的配列はvectorで作って、頑張ればnew、deleteを使わないコードができる
引数 char* c とかやると、関数内で *c とか書くんしょ、バグのもとだよ
0149デフォルトの名無しさん
2006/08/30(水) 21:13:34なるほど。ありがとうございました。
ここでもう一つ疑問なのですが、B<int>のみfriendにしたい場合はどう書くのでしょうか?
class Hoge
{
template<typename T> class B;
friend class B<int>;
};
と書いてみたのですが、この宣言自体は通るけどfriendの効果がありませんでした。
0150デフォルトの名無しさん
2006/08/30(水) 22:11:19Java -> C++という勉強順序だったのかな?
0151デフォルトの名無しさん
2006/08/30(水) 22:15:39それだと最初の宣言が Hoge::B になる。 ::B にしたければ、
class Hoge の前に、外で宣言すればいい。
0152デフォルトの名無しさん
2006/08/30(水) 22:32:05ああなるほど、そういうことだったんですか。
外に出したらコンパイル通りました。
ありがとうございました。
0153デフォルトの名無しさん
2006/08/31(木) 00:10:30ケースバイケースだなぁ。
工場メソッドとかならポインタでやったほうが楽だ。
0154デフォルトの名無しさん
2006/08/31(木) 01:11:150155デフォルトの名無しさん
2006/08/31(木) 03:15:44void hoge( int a ) { ... }
hoge( int( 10 ) );
とかって渡すのと、普通に
hoge( 10 );
って渡すのでは何が違うの?
0156デフォルトの名無しさん
2006/08/31(木) 03:49:20同じ。
0157デフォルトの名無しさん
2006/08/31(木) 04:58:02全部参照にすべきというのは言い過ぎ。
ポインタの方がいいケースも多々ある。
0158デフォルトの名無しさん
2006/08/31(木) 05:20:020159デフォルトの名無しさん
2006/08/31(木) 05:22:390160デフォルトの名無しさん
2006/08/31(木) 12:26:39とかよっぽど紛らわしいと思うんだが
0161Lisper
2006/08/31(木) 12:28:260162デフォルトの名無しさん
2006/08/31(木) 15:24:470163デフォルトの名無しさん
2006/08/31(木) 15:30:56ミ ∠_)
/
/ \\
ウイーン Γ/了 | |
ウイーン |.@| | | ガッガッガッ
| / | . 人
|/ | < >_Λ∩
_/ | //. V`Д´)/ >>162
(_フ彡 /
0164デフォルトの名無しさん
2006/08/31(木) 16:20:470165デフォルトの名無しさん
2006/08/31(木) 19:14:10( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ >>164
(_フ彡
0166デフォルトの名無しさん
2006/08/31(木) 23:21:47送出されるクラスオブジェクトの定義(クラスの定義)って
皆さんはどこに書かれてますか?
クラス(例外で用いられるものではなくて、ごく普通の目的で作るもの)を作る時は
定義をヘッダに書いて実装をcppファイルに書いたりしますが
例外用のクラスはそのヘッダファイルに一緒に書けばいいのか
あるいは単独のヘッダファイルで定義するべきなのか迷っています
0167デフォルトの名無しさん
2006/08/31(木) 23:30:41例外オブジェクトって、std::exceptionの派生とかで作るやつ?
あるクラスが固有に投げる独自の例外ならそのクラスのヘッダに書くかも
そうでなきゃ単独かな
0168デフォルトの名無しさん
2006/09/01(金) 08:45:26迷うくらいだから一緒でいいんじゃないのか?
要するに他の全く独立したクラスからは利用されない例外ってことでしょ?
0169デフォルトの名無しさん
2006/09/01(金) 11:15:31「例外用だから」っていう理由で定義場所の決め方は変えないと思うよ。
0170デフォルトの名無しさん
2006/09/01(金) 11:17:19{
typedef std::list<T> List;
typedef std::map<int, List::iterator> Map;
};
List::iteratorにtypenameを付けないとコンパイルエラーになるのですが
List::iteratorと書いてあるところが多数あり、全てにtypenameを付けるのは冗長な気がして
できれば避けたいです。
typedef typename List::iterator ほにゃらら;
としてしまえばいいんでしょうが、List::iteratorの方がわかりやすいのでこのまま使いたいのです。
何か方法はありませんか?
0171デフォルトの名無しさん
2006/09/01(金) 11:28:12typedef typename List::iterator List_iterator; // typename がウザイんで
0172デフォルトの名無しさん
2006/09/01(金) 11:32:57そんな時はエディターの置換を使おう。
0173デフォルトの名無しさん
2006/09/01(金) 11:47:200174デフォルトの名無しさん
2006/09/01(金) 11:53:20#define でどうやったら解決できるの?
0175デフォルトの名無しさん
2006/09/01(金) 11:59:38typedefは避けたいと書いたのですが…
>>172
書くのが面倒なのではなく、見た目が長ったらしくなるのが嫌なのです。
一箇所でこいつは型だとコンパイラに教える事が出来ればいいのですが…
>>173
それは勘弁
0176デフォルトの名無しさん
2006/09/01(金) 12:03:03typename は避けたいとしか書いてないだろ。
List::iterator というのを一字一句変えるつもりが無いなら無理だ。
0177デフォルトの名無しさん
2006/09/01(金) 12:04:52ゆとり世代か?
List::iteratorのまま使いたいと書いてあるだろ。
0178デフォルトの名無しさん
2006/09/01(金) 12:06:07typenameが必要な理由だって、そのcontext sensitiveな文法から来ているんだし。
0179デフォルトの名無しさん
2006/09/01(金) 12:06:430180デフォルトの名無しさん
2006/09/01(金) 12:08:35だから、それなら無理だっていってんじゃねーか。
typedef が嫌な理由も「List::iteratorの方がわかりやすい」としか書いてない。
で List_iterator なら大差なかろうという妥協案を出した。これが嫌だというなら
一字一句変えたくないんだろう。でもそれは無理だ。
0181デフォルトの名無しさん
2006/09/01(金) 12:10:11それなら何故こんなに馬鹿なのか
0182デフォルトの名無しさん
2006/09/01(金) 12:11:46標準ライブラリでも使われている。
0183デフォルトの名無しさん
2006/09/01(金) 12:12:09ってどんな我が儘だよ。後者で十分だろ。
0184デフォルトの名無しさん
2006/09/01(金) 12:12:47下手な煽りには乗らない方がいい。
0185デフォルトの名無しさん
2006/09/01(金) 12:13:17>typename は避けたいとしか書いてないだろ。
につっこんだんだ。
無理という部分には同意だ。
0186デフォルトの名無しさん
2006/09/01(金) 12:13:570187デフォルトの名無しさん
2006/09/01(金) 12:15:080188デフォルトの名無しさん
2006/09/01(金) 12:20:53と言う事で落着
0189デフォルトの名無しさん
2006/09/01(金) 12:45:45C++ の文法って context sensitive なの?
0190デフォルトの名無しさん
2006/09/01(金) 15:18:44struct T1 {
T1 operator()(int x) { return T1(x); }
int operator=(int x) { return x; }
T1(int) {}
};
struct T2 {
T2(int) {}
};
int a, (*(*b)(T2))(int), c, d, e;
void f()
{
T1(a) = 3;
T2(4);
//std::cout << a << std::endl;
e = (*(*b)(T2(c)))(int(d));
}
int main()
{
f();
}
0191デフォルトの名無しさん
2006/09/01(金) 15:20:53>>190のソース(規格票の中のプログラムに若干手を加えたものです)で、
T1(a) = 3; が何をしているのかわかりますか?
そして、aを出力する行をコメント記号を外すと、"T1に適用できるoperator<<はない"
というようなエラーが出るのです。aってintなのに、どうしてこんなエラーが
出るのでしょうか?
多分T1(a) = 3; と関係があると思うのですが、一晩考えてもわかりませんでした。
よろしくお願いします。
0192デフォルトの名無しさん
2006/09/01(金) 15:40:26>T1(a) = 3;
aはT1型です。グローバルのaと違います。
0193デフォルトの名無しさん
2006/09/01(金) 15:55:25レスありがとうございます。どうしてaがT1型になるのやらさっぱり・・・・
T1(a)というのは、aを引数とするコンストラクタを呼び出して一時オブジェクト
を作って、そこに3をコピーコンストラクタで初期化しているのかと思いました
が、試しにT1(3)とやるとコンパイルエラーになります。
T1(a)の意味がわかりません。
0194デフォルトの名無しさん
2006/09/01(金) 16:24:12と解釈されてるみたいだね。
0195デフォルトの名無しさん
2006/09/01(金) 16:26:09とすると意図通りになる。
0196デフォルトの名無しさん
2006/09/01(金) 16:26:50Aは小文字にして
0197デフォルトの名無しさん
2006/09/01(金) 16:30:25なるほどありがとうございます。という事は 3 には特に意味がないみたいですね。
T1の中には変数もありませんし。<<でT1型のオブジェクトを表示しようにも、
T1が値を持っていませんので表示できませんね。
0198デフォルトの名無しさん
2006/09/01(金) 16:38:33> という事は 3 には特に意味がないみたいですね。
まあintじゃないとまずいけどな。
0199デフォルトの名無しさん
2006/09/01(金) 16:42:29switch文の最初のcase以降のcaseが
「エラー: この case は局所変数の初期設定を迂回しています.」
って言われるんだけど何故?
switch文って何か特別な制限があるんだっけ?
0200デフォルトの名無しさん
2006/09/01(金) 16:46:22そうですね。今まで中にメンバ変数を持たないクラスというのは
関数オブジェクト位しか作った事がなかったので、理解するのに
今回は時間が掛かりました。純粋に文法だけを追っていけば
いいわけですね。
0201デフォルトの名無しさん
2006/09/01(金) 16:48:16最初のcaseでだけ局所変数の初期化をしている。
int a;
switch (〜) {
case X:
a = 1;
break;
case Y:
}
とか。
0202デフォルトの名無しさん
2006/09/01(金) 17:06:08なに!そんな制限があったのか・・・。
CCではコンパイルも通らなかったよ。
素直にifる事にしました。どうもありがとうございます。
0203デフォルトの名無しさん
2006/09/01(金) 19:07:35case A:
int n;
...
case B:
...
みたいなものならまだ良いけど
case A:
std::string str;
...
case B:
だと、Bの時にstrがスコープにあるのに、コンストラクタが呼ばれない
という話のはず。
変数のスコープが、switchの外側にあるとき(>>201)は出ないと思う。
0204デフォルトの名無しさん
2006/09/01(金) 19:31:04case A:
{
std::string str;
...
}
case B:
...
0205デフォルトの名無しさん
2006/09/01(金) 21:31:42T1(3) がコンパイルエラーになるのはおかしい。コンパイラは何を使ってるの?
0206デフォルトの名無しさん
2006/09/01(金) 21:38:46BCC5.82(BDS2006の付属品)です。これ糞コンパイラでしょうか?
0207デフォルトの名無しさん
2006/09/01(金) 21:44:20糞とは言い切れないが、 T1(3) をエラーにしてるのはバグだと思われる。
ちなみにエラーメッセージは?
0208デフォルトの名無しさん
2006/09/01(金) 21:50:20ごめんなさい何か勘違いしていたようです。
今やったらエラーが出ません。
0209デフォルトの名無しさん
2006/09/02(土) 04:45:07ifstreamで3GBくらいのfileがopenできません。
ifstreamで開けるサイズの上限って、どうやって決まってますか?
別にすべてを同時にメモリ上に蓄えるわけではないだろうから、
あんまメモリサイズって必要ない気もするんですが。
0210デフォルトの名無しさん
2006/09/02(土) 05:07:170211デフォルトの名無しさん
2006/09/02(土) 06:39:29_FILE_OFFSET_BITSを64にすれば良いけどね。
これ以上は環境依存だからスレ違い。
0212デフォルトの名無しさん
2006/09/02(土) 14:20:05_FILE_OFFSET_BITS も標準じゃないよ。
0213デフォルトの名無しさん
2006/09/02(土) 14:24:21~~~~~
0214デフォルトの名無しさん
2006/09/02(土) 14:31:270215デフォルトの名無しさん
2006/09/02(土) 14:50:08ふと気になった。
0216デフォルトの名無しさん
2006/09/02(土) 15:18:090217デフォルトの名無しさん
2006/09/02(土) 15:53:120218デフォルトの名無しさん
2006/09/02(土) 15:55:28横書きの吹き出しを意識しているのか!!!
0219デフォルトの名無しさん
2006/09/02(土) 22:12:14その通りです
以上
0220デフォルトの名無しさん
2006/09/02(土) 22:36:26御覧の通りです。
って意味だろ?
0221デフォルトの名無しさん
2006/09/03(日) 01:01:172chじゃ(ry
0223デフォルトの名無しさん
2006/09/03(日) 11:30:40class A;
class B {
A& ref_;
B(A& ref) : ref_(ref) {}
};
class A {
B b;
public:
A() : b(*this) {}
};
みたいに。b に渡される *this は、A 自身の初期化が完了していない状態
で渡されてしまう?
0224デフォルトの名無しさん
2006/09/03(日) 12:48:11そうだよ。
0225デフォルトの名無しさん
2006/09/03(日) 13:20:16どういうケースなんだろ?
0226デフォルトの名無しさん
2006/09/03(日) 13:24:180227デフォルトの名無しさん
2006/09/03(日) 13:59:43つまり、bのコンストラクタでAのstatic以外のメンバ・関数にアクセスしたらヤバイってこと?
0228デフォルトの名無しさん
2006/09/03(日) 14:08:54じつは規格では、メンバの初期化順序まで決まっていて、
すでに初期化されているメンバにアクセスする分には問題なさそうだけどね。
クラスのメンバの初期化順序は、そのまんま、並んでいる順。
initializer listの順ではない。
ただ、それだと、メンバの宣言の位置を変えただけで挙動がおかしくなる、、
奇妙なコードが出来上がる。
0229デフォルトの名無しさん
2006/09/03(日) 14:46:36純粋仮想関数呼んだりしたら、ヌルポ的ヤバさ。
0230こっちも横槍だけど
2006/09/03(日) 14:47:30へぇ、初期化順って決まってたんだ。
基底クラスが先、というの以外は不定だと思ってた…
ということはメンバ変数同士が依存してても
宣言順に気をつけてれば問題ないんだ。
グローバル変数も同一コンパイル単位内では宣言順?
0231デフォルトの名無しさん
2006/09/03(日) 14:48:50純粋仮想関数でも定義部を書けば呼んでもOKなわけだが。
0232デフォルトの名無しさん
2006/09/03(日) 14:53:500233デフォルトの名無しさん
2006/09/03(日) 14:58:06嘘だと思うなら = 0 の関数に定義を外部で書いて呼び出してごらん。
0234デフォルトの名無しさん
2006/09/03(日) 15:09:27クラス内は宣言順。クラス外は不定。従って、グローバルオブジェクト同士が依存する場合は工夫が必要。
0235デフォルトの名無しさん
2006/09/03(日) 15:11:19いや、問題あるない以前に、そんなコードは書くべきではない。
0236デフォルトの名無しさん
2006/09/03(日) 15:11:25やめたほうがいい。
10.4.6
> Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call
> (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor
> (or destructor) is undefined.
0237デフォルトの名無しさん
2006/09/03(日) 15:13:06メンバ変数同士の依存は問題ないだろ。クラス作ったやつの責任。
0238デフォルトの名無しさん
2006/09/03(日) 15:21:57http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#230
0239デフォルトの名無しさん
2006/09/03(日) 15:25:58メンバを宣言する順序を変えるだけで問題が出るコードってどうよ?
0240デフォルトの名無しさん
2006/09/03(日) 15:44:07宣言順に依存しないほうが安全なのは確かだが、それを全面的に禁止すると
依存関係のある2つのオブジェクトをクラスにまとめるというよくあるシナリオが
解決しづらくなってしまう。
理想的には、宣言順と初期化リストの順番が異なっている場合などは
エラーになってくれればいいんだけど、現状はコンパイラの警告だけが頼み。
0241デフォルトの名無しさん
2006/09/03(日) 15:47:04確かに、どうしてもやりたいというときも、たまにあるけど。
メンバや継承のときの、初期化の順序が、
規格できっちりきまっているというのも、
そういう理由があることなのかな。
0242デフォルトの名無しさん
2006/09/03(日) 15:48:00ああコンストラクタやデストラクタから呼ぶって話だろ?メンバ関数から
呼ぶのは全く問題ないよ。
0243デフォルトの名無しさん
2006/09/03(日) 15:51:31コンストラクタが複数書けるんで、コンストラクタ(初期化リスト)の都合に合わせて
初期化順を変えられるということになると、デストラクタで逆順に破棄するために
初期化順をインスタンス内に憶えておく必要があることになる。
0244デフォルトの名無しさん
2006/09/03(日) 15:52:48流れ嫁。
0245223
2006/09/03(日) 18:05:10皆様どうもありがとうございます。危険なことがわかったので、
他の方法を考えます。
0246デフォルトの名無しさん
2006/09/03(日) 18:20:33ワロタ
0247デフォルトの名無しさん
2006/09/03(日) 18:36:36それはそうと久しぶりにデパ地下行きたくなってきた。
0248デフォルトの名無しさん
2006/09/03(日) 18:39:380249デフォルトの名無しさん
2006/09/03(日) 22:36:47void Func1(void)
{
int x = HOGE_SIZE;
....
}
この代入は、アセンブラ レベルでは、
メモリコピー命令になりますか、それとも、定数ロード命令になりますか?
コンパイラ依存になると思いますが、一般にどうなりますか?
0250デフォルトの名無しさん
2006/09/03(日) 22:39:19定数ロードになるのが一番多いんじゃないかね。
そんな些細なことが問題になるなら C++ 使うべきじゃない。
ここで聞いた答えなんか当てにするのも間違い。コンパイラにコード吐かせて確かめろ。
0251デフォルトの名無しさん
2006/09/03(日) 22:59:330252デフォルトの名無しさん
2006/09/03(日) 23:10:22thisの値自体は決定してるぞ。
ポインタをデリファレンスするのは>>228の問題があるだけで。
0253デフォルトの名無しさん
2006/09/03(日) 23:11:03渡した先でいくらでもデリファレンスされる可能性がある。
0254デフォルトの名無しさん
2006/09/03(日) 23:15:20const_cast<int&>(HOGE_SIZE) = 30;
とできるわけだが、こういうコードがあった場合は、最適化しないというようなことを
コンパイラはやっているわけ?
0255デフォルトの名無しさん
2006/09/03(日) 23:26:35そのコードは鼻から悪魔が出るんじゃないのか?
0256デフォルトの名無しさん
2006/09/03(日) 23:26:44それ未定義動作だからコンパイラは面倒見なくていい。
0257デフォルトの名無しさん
2006/09/03(日) 23:28:52>>256 そうなんかい。しらなんだ。
0258デフォルトの名無しさん
2006/09/04(月) 00:20:54memset(b, 0xFF, sizeof(b));
int x = b[0];
このとき x は未定義でしょうか?
0259デフォルトの名無しさん
2006/09/04(月) 00:32:18大抵の実装で 1 が期待できるけど、保証はないだろうねぇ。
0260デフォルトの名無しさん
2006/09/04(月) 00:36:46そうですか。ありがとうございます。
0261デフォルトの名無しさん
2006/09/04(月) 00:43:58ジャンプ命令が生成されるんだよね。たとえば、
if (x==y && y==z && z==w)
だと、2つのジャンプ命令が生成される。
そこで、これを bool の整数への昇格を利用して
if ((x==y) & (y==z) && (z==w))
のように実装したほうが、高速なコードが生成されるのだが、
こういうテクニックって一般的ですか?
0262デフォルトの名無しさん
2006/09/04(月) 00:44:38は
if ((x==y) & (y==z) & (z==w))
の間違い。
0263デフォルトの名無しさん
2006/09/04(月) 01:02:14一般的じゃないだろうね。使うんならコメントが無いと && に「修正」されちゃうよ。
ところで高速だというのは実験したの?
0264デフォルトの名無しさん
2006/09/04(月) 01:16:15マジレスすると、JavaやC#は & にした方が速いが、CやC++では
何とも言えない。
0265デフォルトの名無しさん
2006/09/04(月) 01:24:45ごめんなさい。速いと思ったら、3倍ぐらい遅かった。
9個の || を連結した簡単なテストコードで試してみた。
>>264
情報ありがとう。
0266デフォルトの名無しさん
2006/09/04(月) 01:29:18速度は実測が基本。
やっぱり基本は大事だな。
0267デフォルトの名無しさん
2006/09/04(月) 01:30:38「&」と「&&」の微妙な挙動の差には注意しないとアカンよ。
0268267
2006/09/04(月) 01:31:100269デフォルトの名無しさん
2006/09/04(月) 01:41:27分岐予測の影響も考慮しないといけないし、
何で速くなるのかリスティングファイル見て調べないとな。
0270デフォルトの名無しさん
2006/09/04(月) 01:54:39しまうので、なるべくfalseになる確率が高いと思われる条件式から
先に書くようにすると、速くなりやすい。
0271デフォルトの名無しさん
2006/09/04(月) 02:07:17普通に&&で書く場合、条件を判定するだけで
その結果を整数に直して代入したりはしないから。
ただ、&だとあまり使えないけど
(x != 0) | (y != 0) を (x|y) != 0 というのは
使い物になる場合があるかもね。
もちろんこれも、コメント必須なトリッキーなやり方だから
本当にそこまでする必要がある箇所なのかは、よーく考えるべきだけど。
0272デフォルトの名無しさん
2006/09/04(月) 02:07:42if(a && b && c) で、a式b式c式の間に依存関係が無いなら
if(a&b&c) はパイプラインに上手く乗っかって
判断cのコスト+a&b&cのコスト+アルファ程度で抜けるかもしれない。
だが世の中には分岐予測というものがありましてな。
0273デフォルトの名無しさん
2006/09/04(月) 02:07:450274デフォルトの名無しさん
2006/09/04(月) 02:08:44○ (x != 0) | (y != 0) を (x|y) != 0
だた。
0275デフォルトの名無しさん
2006/09/04(月) 02:10:08ショートサーキットしてもしなくても処理が変わらない状況なら
ショートサーキットを無視する可能性もあるのかな? 最適化で。
0276デフォルトの名無しさん
2006/09/04(月) 02:18:14コンパイラなら、やってくれるのかもしれないなー。
試したわけじゃないが。
そうでなくても大体の状況において、どの組み合わせが最速となるかは
コンパイラ様が知っているでFAだろう。
0277デフォルトの名無しさん
2006/09/04(月) 02:20:15コンパイラの最適化を阻害しないから、
一番いい高速化法なこともあるな。
0278デフォルトの名無しさん
2006/09/04(月) 07:17:59thisの値を保持するだけなら問題ないので>>226は間違い。
0279デフォルトの名無しさん
2006/09/04(月) 07:39:11参照を保持するだけなら問題ないので *this も this も危険性は同じ。
0280デフォルトの名無しさん
2006/09/04(月) 13:44:10オーバフローをする部分があるのですが、
そのオーバフローは一体どのように検知すればよろしいのでしょうか?
たとえば、float型でオーバフローらしきことがおこり、
float f; のとき
if(f<0.0000001) {//オーバフロー処理}
といった感じにしたいのですが、オーバフローした場合、
やはりfloat型では検知できない?みたいなのですが、
こういう場合の対策法を教えていただけないでしょうか。
0281デフォルトの名無しさん
2006/09/04(月) 13:59:36C99 floating point rounding and exception handling
をサポートしているかどうか調べたら?
FE_OVERFLOWとかfegetexceptflag()とかぐぐってみて。
0282デフォルトの名無しさん
2006/09/04(月) 14:08:50最大範囲が100
最初から入ってるのが70
次に加算しようとしてるのが50なら
if 50 > 100-70
return 警告
とか
0283デフォルトの名無しさん
2006/09/04(月) 14:38:060284デフォルトの名無しさん
2006/09/04(月) 16:51:350285デフォルトの名無しさん
2006/09/04(月) 18:30:11char c = (char)wc;
これ以外に方法はない
0286デフォルトの名無しさん
2006/09/04(月) 18:49:56keyword: wchar_t char use_facet
ttp://d.hatena.ne.jp/logion/20060208
ttp://www.tietew.jp/cppll/archive/568
0287280
2006/09/04(月) 18:59:14結局、numeric_limitsでオーバーフロ-や丸め誤差が生じたときに
強引に戻すやり方にしました。
しかし、結局はどこでオーバーフローが生じているのか分からずじまいでした。
難しいものです。
0288デフォルトの名無しさん
2006/09/04(月) 20:53:57>しかし、結局はどこでオーバーフローが生じているのか分からずじまいでした。
デバッガで調べるとかg++なら
ttp://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html#trapFPE
とか参考になるかも
0289デフォルトの名無しさん
2006/09/04(月) 23:57:13このスレの最初の方でもオーバーフローの話し合ったよ
0290デフォルトの名無しさん
2006/09/05(火) 02:54:36処理系によっては浮動小数点例外を有効化するだけで
発生箇所でとっ捕まえられるんじゃまいか。
コプロセッサが搭載されてない環境で
floatがソフトウエアエミュレーションされてるとかでないなら、
浮動小数点演算器の設定変えるだけでOK。
大抵の例外は捕まえられるぞ。
0291デフォルトの名無しさん
2006/09/05(火) 07:46:500292デフォルトの名無しさん
2006/09/05(火) 15:59:15int n = 30;
for(int i=0; i<n; ++i){
a[i] = i*1.4;
if(a[i] != (i*1.4)){
cout<<i<<endl;
}
}
これで出力があるのはどうしてなんでしょうか?
0293デフォルトの名無しさん
2006/09/05(火) 16:11:59処理系によっては配列に格納するとき浮動小数点数の丸めが起こって、
i*1.4 の結果と比較した場合に違う値になったりするかも知れない。
ちなみに、VC6 では特に問題なかった。
0294デフォルトの名無しさん
2006/09/05(火) 16:44:35そういうことなんでしょうか。
ちなみにgcc3.3.2のg++(VineLinux)を使ってます。
iの値によって出力されたりされなかったりっていう状態で、
危険だなぁと思ったもので。
0295デフォルトの名無しさん
2006/09/05(火) 17:11:21#include <cfloat>
の中に入ってる DBL_EPSILON が誤差の最大値だから、
if(abs(a[i] - (i*1.4)) > DBL_EPSILON)
ってすれば回避できるよ
0296デフォルトの名無しさん
2006/09/05(火) 17:15:000297デフォルトの名無しさん
2006/09/05(火) 17:18:4480bit 浮動小数点数に格上げして比較してるのかもね。
0298デフォルトの名無しさん
2006/09/05(火) 17:50:27DBL_EPSILON は 1 に足したとき値の変わる最小値だから、
if(fabs(a[i] - (i*1.4)) > DBL_EPSILON * fabs(a[i]))
みたいにオーダー揃えないとダメだよ。
0299295
2006/09/05(火) 18:03:460301デフォルトの名無しさん
2006/09/05(火) 22:18:26char c;
};
このとき、static_cast で foo* を char* に変換できるようにするには、
どうしたらいいですか?↓こんなことできますか?
template<>
char* static_cast<char*>(foo* p) { return (char*) p; }
0302デフォルトの名無しさん
2006/09/05(火) 22:20:160303デフォルトの名無しさん
2006/09/05(火) 22:21:33それだと foo を char* に変換することになりますよね。
やりたいのは foo* を char* にしたいんです。
0304デフォルトの名無しさん
2006/09/05(火) 22:35:21思いつかないなぁ。
なんでそんなことしたいの?
0305デフォルトの名無しさん
2006/09/05(火) 22:38:20って事?
reinterpret_castじゃだめなん?
0306デフォルトの名無しさん
2006/09/05(火) 22:47:01うーん。理由は聞かないでってのじゃだめ?
>>305
そうそう。reinterpret_cast でもいいけど、
char* に変換可能なことを前提として作られているよ、ということを強調したい。
reinterpret_cast は外道だからね。
0307デフォルトの名無しさん
2006/09/05(火) 23:01:52reinterpret_castを使わざるを得ない状況が外道
つまり>>306、君のやろうとしてることが外道
>char* に変換可能なことを前提として作られているよ、ということを強調したい。
なら、まさにoperator char*が本道
0308デフォルトの名無しさん
2006/09/05(火) 23:02:04static_cast で変換できても、そういう意図は伝わらないと思う。
外道とか正道とか考えるんなら、メンバ関数が正道じゃないか?
0309デフォルトの名無しさん
2006/09/05(火) 23:05:38operatorなりなんなりを作ればいい
使う側は汚いキャストをしなくて済むし
0310デフォルトの名無しさん
2006/09/05(火) 23:10:04伝わらないことないだろ。
>>307 >>309
だからー、foo を char* に変換したいんじゃなくて、
foo* を char* に変換したいの。
foo* pFoo = new foo[100];
char* pChar = static_cast<char*>(pFoo);
0311ららら
2006/09/05(火) 23:11:50> reinterpret_cast自体が外道なのではなくて、
> reinterpret_castを使わざるを得ない状況が外道
それは分かるのら。しかし、
> つまり>>306、君のやろうとしてることが外道
ここの論理的つながりがないのら。
私は reintrepret_cast を使わないようにしたいのら。
0312デフォルトの名無しさん
2006/09/05(火) 23:13:090313デフォルトの名無しさん
2006/09/05(火) 23:15:44中身はreinterpret_castで書いて
0314デフォルトの名無しさん
2006/09/05(火) 23:19:320315ららら
2006/09/05(火) 23:19:50これは、普通の関数で書くということですか?
char* ConvFooToChar(foo* p) { return reinterpret_cast<char*>(p); }
うーん、変換するたびにこれを呼ぶのは、ちょっとなー。
できれば static_cast にしたいなー。
0316デフォルトの名無しさん
2006/09/05(火) 23:22:56どうして自分の意図が伝わると思うの?
全然別の目的で static_cast や C スタイルキャストを使っている template や
マクロの中でもコンパイルが通ってしまうことが考えられる。やめたほうがいい。
0317400
2006/09/05(火) 23:24:120318デフォルトの名無しさん
2006/09/05(火) 23:25:490319デフォルトの名無しさん
2006/09/05(火) 23:27:05あきらめれ。
0320ららら
2006/09/05(火) 23:28:30> 全然別の目的で static_cast や C スタイルキャストを使っている template や
> マクロの中でもコンパイルが通ってしまうことが考えられる。やめたほうがいい。
意味が分からないのら。何がまずいのか分からないのら。
サンプルコードを示してくれないかなのらー。
0321デフォルトの名無しさん
2006/09/05(火) 23:29:00ソースで自分の意図を伝えたいと言い出す前に、
日本語で自分の意図が上手く伝えられそうになってください。
0323デフォルトの名無しさん
2006/09/05(火) 23:31:11そう、えーっと・・・ぬるぽ。
0324デフォルトの名無しさん
2006/09/05(火) 23:31:19ちなみにfoo*からchar*への変換演算子を定義することができないのは、foo*もchar*もポインタという組込型だから。
0325デフォルトの名無しさん
2006/09/05(火) 23:40:57あ?
0326デフォルトの名無しさん
2006/09/05(火) 23:45:18い?
0327デフォルトの名無しさん
2006/09/05(火) 23:52:15Wooooooooooo!!!!
0328デフォルトの名無しさん
2006/09/06(水) 00:01:140330デフォルトの名無しさん
2006/09/06(水) 01:15:23オマエモナー
0331デフォルトの名無しさん
2006/09/06(水) 03:42:510332デフォルトの名無しさん
2006/09/06(水) 19:36:41普通は、>>306 みたいなのは、foo のインターフェイスとして用意しておくべきだろ。
速度面は inline 展開されるから、reinterpret_cast と同等の速度になるはず。
class foo {
template< typename Dest >
friend inline Dest * valid_cast( foo * p ) {
STATIC_ASSERT( boost::is_same< Dest, char >::value );
return reinterpret_cast< Dest * >( p );
}
};
//foo * pSrc;
//char * pDest = valid_cast< char * >( pSrc );
0333デフォルトの名無しさん
2006/09/06(水) 20:03:480334デフォルトの名無しさん
2006/09/06(水) 21:06:460335デフォルトの名無しさん
2006/09/07(木) 01:46:23エスパーなコンパイラ...
欲しいな
0336デフォルトの名無しさん
2006/09/07(木) 06:56:19未定義な操作を検出すると自動的かつ瞬時に上司に報告するコンパイラですか?
0337デフォルトの名無しさん
2006/09/07(木) 14:41:37std::ofstream のインスタンスを作成するときに次のように
std::ofstream ofs("aaa", std::ios::out | std::ios::binary);
std::ios::out フラグを立てているものを見かけるのですが、
何か意味があるのでしょうか?
そもそも std::ios::in フラグとかまで立てられてしまうので、
気持ち悪いです。
0338デフォルトの名無しさん
2006/09/07(木) 14:55:13「同名ファイルを削除しない」って意味らしいが…。
ttp://www.microsoft.com/japan/developer/library/vclang/_iostream_ofstream.3a3a.ofstream.htm
これは標準なのかね。
0339デフォルトの名無しさん
2006/09/07(木) 15:12:48なんか俺根本的に標準ファイルストリームの
フラグについて間違った認識してるのかも。
fopen のフラグとの対応がわからん。
0340デフォルトの名無しさん
2006/09/07(木) 15:32:32fopen()は割りと変態仕様だから、対応で考えない方がいいよ。
0341デフォルトの名無しさん
2006/09/07(木) 16:21:58違う。マイクロソフトの勝手な拡張。
>>339
規格のtable 92に対応が書いてある。
0342デフォルトの名無しさん
2006/09/07(木) 16:49:43std::ofstreamのデフォルトのフラグはstd::ios::out。
バイナリ出力を行うためにstd::ios::binaryとORをとってるだけ。
std::ios::inは立たない。
0343338
2006/09/07(木) 23:25:45まじっすか。
MSってこんなとこまで独自拡張してんのかよ('A`)
企画表実際見てみたら、ios_baseフラグとfopenのモードとの対応表があった。
ios::in | ios::outでは"r+"や"w+"と同じ扱いになるらしい。
>>342
立てられる=受身の意味ではなく可能性があるという意味では。
0344デフォルトの名無しさん
2006/09/08(金) 00:00:06しかしなぁ、r+とw+では動作が異なるのだが。
0345デフォルトの名無しさん
2006/09/08(金) 00:15:260346デフォルトの名無しさん
2006/09/08(金) 00:26:270347デフォルトの名無しさん
2006/09/08(金) 00:33:11ios::in | ios::out = "r+"
ios::in | ios::out | ios::trunc = "w+"
まで書けっていうんかい。
それぐらい自分で確認してくれ。
0348デフォルトの名無しさん
2006/09/08(金) 09:55:18新たにフラグ作るのはいいけど、
既存のフラグに意味を付け足すのはまずいわな。
0349デフォルトの名無しさん
2006/09/08(金) 12:10:17C#でのMS色の具合を見ると、まともになっているわけでもでもないなぁ・・
0350デフォルトの名無しさん
2006/09/08(金) 13:22:220351デフォルトの名無しさん
2006/09/08(金) 13:29:50何やってもいいとかは言いすぎな感じ・・
それも規格になってないjavaは www.jcp.org コミュニティーで慎重に話し合って
合意を取り付けている。
そういうのからすると、だいぶ異色に映る。
0352デフォルトの名無しさん
2006/09/08(金) 13:51:51後はやりたい放題ってのは、
以前からMSがやっている手法です。
オープンだそうですw
0353デフォルトの名無しさん
2006/09/08(金) 16:00:50次世代 Cobol という位置づけを考えると、確かにそれで良いのだろうけど。
0354デフォルトの名無しさん
2006/09/08(金) 16:48:50バイトコードでってのを指して言ってるのかな?
で、俺は何に期待しているかというと、
断然 C++/CLI ちゃん!
0355デフォルトの名無しさん
2006/09/08(金) 16:56:39仕様策定にかかる時間の話。
0356デフォルトの名無しさん
2006/09/08(金) 17:11:26ごめんな、Java の仕様策定のやり方ってのが
全然分かってないや、俺。
0357デフォルトの名無しさん
2006/09/08(金) 17:31:290358デフォルトの名無しさん
2006/09/08(金) 19:41:25独走で唯我独尊を見せつけるか
あなたは、どっちがお好みってことよ♪
0360デフォルトの名無しさん
2006/09/08(金) 20:05:08いっちゃだめ!
0361デフォルトの名無しさん
2006/09/08(金) 20:06:25つ [http://www.jcp.or.jp/]
0362デフォルトの名無しさん
2006/09/08(金) 21:13:42突っ走ってくれればいいんじゃね
0363デフォルトの名無しさん
2006/09/08(金) 21:31:44開発中のデバドラ落ちと混ざって赤紫になっちゃったけどどうしてくれるのよ!
0364デフォルトの名無しさん
2006/09/08(金) 21:39:23はんたーい!
かくめー!かくめー!
かいかくー!
とういつー!
どくそー!
0365デフォルトの名無しさん
2006/09/09(土) 00:00:29class cwindow
{
int kazu;
int x;
public:
HWND * hWnd;
cwindow(int x) :kazu(x){HWND *hWnd = new HWND[kazu];};
void STATIC_screen(HINSTANCE *);
~cwindow(){delete hWnd;};
};
void cwindow::STATIC_screen(HINSTANCE *hInstance)
{
*hWnd = CreateWindow(
TEXT("STATIC") , TEXT("Kitty on your lap") ,
WS_CAPTION ,
100 , 100 , 200 , 200 , NULL , NULL ,
*hInstance , NULL
);
ShowWindow(*hWnd , SW_SHOW);
}
コンパイルはできますが実行するとCreateWindowのところでエラーを起こしてしまいます。
この部分のどこかが間違っているようですが何処が間違っているのかわかりあmせん
Visual C++ 2005 Express Edition
0366デフォルトの名無しさん
2006/09/09(土) 00:07:53cwindow のコンストラクタでメンバの hWnd じゃなくて
ローカル変数 hWnd に new の戻り値を入れているので、
メンバ変数 hWnd の値は不定。そのまま STATIC_screen を
呼び出せば *hWnd が不定なポインタを使うことになって
不正な処理となる。
0367デフォルトの名無しさん
2006/09/09(土) 00:09:38環境依存で初心者はスレ違い。↓逝け。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
0368デフォルトの名無しさん
2006/09/09(土) 00:37:25static list<Test*> s_list;
Test()
{
0369デフォルトの名無しさん
2006/09/09(土) 00:39:16{
static list<Test*> s_list;
Test()
{
s_list.insert(this);
}
}
と書いて別のところで
グローバルにTest のオブジェクト宣言すると
Testのコンストラクタでs_listが出来取らんのでエラーが出ます
どうしたらいいですか?
0370デフォルトの名無しさん
2006/09/09(土) 00:45:56エラーの内容書けよ。
グローバルオブジェクトの初期化順が問題になっているんだろう。
両方ポインタにして、最初に使うときに new で生成するような関数で
ラップするとか?
0371デフォルトの名無しさん
2006/09/09(土) 00:52:34エラーは、ヌルポの予感
順番の問題はわかってるけど
順番って制御できないのかな
Testクラスは、グローバルで気軽に作りたいので
listをshared_ptrとかでやってもいいけどboost入れないといけないし
ぬうう
0372デフォルトの名無しさん
2006/09/09(土) 00:53:55いや、普通のポインタでも auto_ptr でもいい。
むしろ private な static ポインタ変数に shared_ptr 使う意味がわからん。
0373デフォルトの名無しさん
2006/09/09(土) 00:57:280374デフォルトの名無しさん
2006/09/09(土) 01:00:10static list<Test*>& Test::global_list()
{
static auto_ptr< list<Test*> > p;
if(!p.get()) p.reset(new list<Test*>);
return *p;
}
Test::Test()
{
global_list().insert(this);
}
0375デフォルトの名無しさん
2006/09/09(土) 01:07:18auto_ptrでやってみたけど
auto_ptrが作成される前にアクセスしてしまう
auto_ptrは、=で代入できないし(初期のinsert直前でnewで作った物を代入できない)
0376デフォルトの名無しさん
2006/09/09(土) 01:08:15>>374でやってみます。
ありがとうございます
0377374
2006/09/09(土) 01:09:01insert(this) も通らんな。
0378デフォルトの名無しさん
2006/09/09(土) 01:09:54s_list.reset(new ResourceList );
s_list->insert(this);
でいけました。
お騒がせしました。
�dクス
0379デフォルトの名無しさん
2006/09/09(土) 02:25:08static list<Test*>& Test::global_list()
{
static auto_ptr< list<Test*> > p(new list<Test*>);
return *p;
}
もっと言うなら
static list<Test*>& Test::global_list()
{
static list<Test*> l;
return l;
}
じゃ駄目なの?
0381デフォルトの名無しさん
2006/09/09(土) 06:31:46代入演算子とデフォルトコンストラクタが定義されていることだっけ?
0382デフォルトの名無しさん
2006/09/09(土) 09:23:51いや。コピーコンストラクタが使えれば要件は満たす。
代入演算子もデフォルトコンストラクタもいちおうオプションだが、
多くの操作で必要とされる。
0383デフォルトの名無しさん
2006/09/09(土) 09:34:38「一応オプションだが多くの操作で必要とされる」
というのは resize() しようと思ったら、とかいうこと?
0384デフォルトの名無しさん
2006/09/09(土) 09:37:13「コピーコンストラクタを持っている」だけじゃないので注意してね。
t is a value of type T, and u is a value of type const T.
Table 4 -- CopyConstructible requirements
+----------------------------------------------------+
|T(t) t is equivalent to T(t) |
+----------------------------------------------------+
|T(u) u is equivalent to T(u) |
+----------------------------------------------------+
|t.~T() |
+----------------------------------------------------+
|&t T* denotes the address of t |
+----------------------------------------------------+
|&u const T* denotes the address of u |
+----------------------------------------------------+
が必要。
0385デフォルトの名無しさん
2006/09/09(土) 09:40:31T::value_typeがAssignableでなければいけません。
Associative containerのキーもAssignable。
0386デフォルトの名無しさん
2006/09/09(土) 09:50:56今までエラーがでたらエラーはいてるテンプレートの定義を見て
「おお、このテンプレートを特殊化しようとしてエラーか。
じゃ、このメソッド(もしくは演算子)宣言しておかなきゃな」
なんて行き当たりばったりでやってたからなぁ。
「ええい、めんどくさい、無意味に boost::shared_ptr でくるんでやれ」
とか逃げたこともしばしば。
0387デフォルトの名無しさん
2006/09/09(土) 10:54:280388デフォルトの名無しさん
2006/09/09(土) 11:17:25http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1934.html
0389386
2006/09/09(土) 12:14:17なんかスレ違いっぽいんでそっちいきますは。
0390デフォルトの名無しさん
2006/09/09(土) 12:43:380391デフォルトの名無しさん
2006/09/09(土) 12:52:45「これはコンパイラ依存の話だから」
「これは初心者っぽいかなぁ」
とかかんがえるのがマンドイ
0392デフォルトの名無しさん
2006/09/09(土) 12:58:530393デフォルトの名無しさん
2006/09/09(土) 14:17:480394デフォルトの名無しさん
2006/09/09(土) 14:26:000395デフォルトの名無しさん
2006/09/09(土) 15:45:20どんな仕事でC++使うんですか?
0396デフォルトの名無しさん
2006/09/09(土) 15:46:410397デフォルトの名無しさん
2006/09/09(土) 18:14:18昔はC=マイコン系、C++=GUIなイメージだけど
C++=工場系(漏れの仕事もそうだが、工場の機械をWinで操る、組み込みC++も増える希ガス)
スクリプト=プログラマ
ブログ、Wiki、サーバ作る=SE
ネットわからない=ITこんさるたんと
てなると思う。初めHTMLは素人用だったが、いまややこしくなってきたね
0398365
2006/09/09(土) 21:22:47�dクス
0399デフォルトの名無しさん
2006/09/10(日) 00:47:23まずCからちゃんと覚えたほうがいいですかね?
0400デフォルトの名無しさん
2006/09/10(日) 00:57:37時々趣味で自作アプリとかC++(VC++&MFC)で作ってるけど
流石に仕事で使うのは大変そうだなーと思うよ。
とても自分には無理そう。というかC++で仕事してる人尊敬するよ。
0401デフォルトの名無しさん
2006/09/10(日) 01:02:29構造化手法のことはよく理解しといたほうがいいような気がする
0402デフォルトの名無しさん
2006/09/10(日) 01:19:00Rubyなんか楽しくて仕方ないし、PHPは普通にいきなり使えた。まぁスクリプト言語を引き合いに出してもアレだが。
でも高級言語でC++程難解な言語は無いでしょう?
0403デフォルトの名無しさん
2006/09/10(日) 01:46:420404デフォルトの名無しさん
2006/09/10(日) 01:47:14オブジェクト指向アセンブラと思えばどうだろうか。
0405デフォルトの名無しさん
2006/09/10(日) 01:49:46表現しようと思い、以下のようにしてみました。
template <class paramType, class resultType>
class Event {
int type_;
paramType param_;
mutable resultType result_;
public:
// paramType を取るコンストラクタとかもろもろ...
const paramType& Param() const { return param_; }
const resultType& Result() const { return result_; }
void SetResult(const resultType& result) const { result_ = result; }
};
イベントを受け取るハンドラー側は、
void Handler(const Event& event) {
resultType foo;
// ... 処理 ...
event.SetResult(foo);
}
となるのですが、あんまり直感的じゃないですよね。かと言って、
ハンドラーを void Handler(Event& event); とするのは気持ち悪いなぁ
というところで悩んでます。妙案はござらぬか。
0406デフォルトの名無しさん
2006/09/10(日) 01:56:04そもそも戻り値までまとめるところがダメだと思う。
0407デフォルトの名無しさん
2006/09/10(日) 02:45:32なんで無理矢理constにしたいのかが分からん。
Eventは純粋に起きた出来事を記述するだけにとどめるべき、と考えるなら、
template<class eventType, class resultType>
class EventArgs
{
const eventType event_;
resultType result_;
//略
};
void Handler(EventArgs &args)
{
resultType foo;
//処理
args.setResult(foo);
}
くらいじゃダメ?
0408デフォルトの名無しさん
2006/09/10(日) 04:01:57constの前提が全部ぶっ壊れるんだから、クラス外部に影響の出ない本当に一部の例外以外は
使っちゃ駄目ぽだよ。
非constと同じコードが生成されるから、性能面でもまったくメリットないし。
>>407程度でいいと思う。
受け取ったイベントに返り値を運ばせるのは賛否が分かれそうだけど、
イベントの種類によっては、それなりに現実的なんじゃないかな。
実は全部intか、もっと言うとboolで十分だったなんてオチは、いかにもありそうだけど。
0409デフォルトの名無しさん
2006/09/10(日) 08:21:59それはそうと、 const だけで3杯くらいご飯食えるよな。
const のおかげで不用意な代入のバグを回避できたことも多いし。
BOOST_STRONG_TYPEDEF も不用意な代入によるバグを回避するのに
ずいぶん役だってくれたな。実際にはそれをちょっと自分用に
カスタマイズしたマクロを使ってるけど。
とかくと、boost 厨死ね、このクズが、ってののしられるんだろうな。
快感。
0410デフォルトの名無しさん
2006/09/10(日) 08:26:45引数から const を外すなら、そうするしかないですよね、やっぱり。
どうも const に拘りすぎて、const 馬鹿になっていたようです。
>>408
mutable なメンバ変数がインタフェースになってるってのも、確かに
気持ち悪いんですよね。>>407 の方向でやってみます。
0411デフォルトの名無しさん
2006/09/10(日) 08:53:04std::auto_ptr<int> p(new int);
return p;
}
void test(void) {
std::auto_ptr<int> p = func();
}
こうやったとき、new で確保したオブジェクトの所有権は
戻り値用の一時オブジェクトを介して(実際はRVOが働く?)
ちゃんと移動されて test() から抜けた時点で解放されるんですよね?
0412デフォルトの名無しさん
2006/09/10(日) 09:24:420413デフォルトの名無しさん
2006/09/10(日) 09:32:13auto_ptr<T> を戻り値として使えます。
ポインタを生のまま返すと、
「たのむ〜、このポインタ、ちゃんと解放してくれよ」
って祈るしかないし。
0414デフォルトの名無しさん
2006/09/10(日) 10:49:27「最初の$以降の文字列」はstrstrで取り出すとして
「後の$以降の文字列」をそれから取り除くにはどうしたらいいでしょうか?
mbsnbcpy使うのかな?
0415デフォルトの名無しさん
2006/09/10(日) 10:54:43自分で試せ。それ C++ なのか?
0416414
2006/09/10(日) 11:01:02もとの文字列、切り出し後の文字列ともにchar*型ですが
双方unsigned char*にキャストしてmbsnbcpy使うとなぜか
切り出し後の文字列が空文字列になってしまいます。
0417デフォルトの名無しさん
2006/09/10(日) 11:03:33エスパー募集じゃなければソース貼れ。
C++ 関係ないなら別スレに逝け。
0418デフォルトの名無しさん
2006/09/10(日) 11:06:43その辺の話はExceptional C++に詳しく載ってるよ。
全く同じことやってる例がある。
0419414
2006/09/10(日) 11:10:05strcpy(motobun,"あいうえお$かきくけこ$さしすせそ")
char[100] kiribun;
kiribunにmotobunの中の「かきくけこ」を入れるということでお願いします。
0420デフォルトの名無しさん
2006/09/10(日) 11:13:24エスパー募集じゃなければソース貼れ。
C++ 関係ないから別スレに逝け。
0421デフォルトの名無しさん
2006/09/10(日) 11:24:07memcpy(NULL + 6, "abc", 4);
これはどうなりますか?
memcpy(NULL, "abc", 4);
と解釈されますか?
0422デフォルトの名無しさん
2006/09/10(日) 11:29:54解釈されない。
何が起きるか分からない。
0423デフォルトの名無しさん
2006/09/10(日) 11:30:03ヌルポインタ + 6 なら未定義動作。
NULL + 6 は 0 + 6 で、ただの整数 6 になってコンパイルエラーになる。
0424デフォルトの名無しさん
2006/09/10(日) 11:30:04いずれにせよ、不正アクセスであぼーん。
0425デフォルトの名無しさん
2006/09/10(日) 11:31:460426デフォルトの名無しさん
2006/09/10(日) 11:35:00char *p = strchr(s1, '$');
char *q = strchr(p+1, '$);
memcpy(buf, p, q-p);
buf[q-p] = '\0';
0427デフォルトの名無しさん
2006/09/10(日) 11:37:350429デフォルトの名無しさん
2006/09/10(日) 11:40:53C++でNULLが0にdefineされているというのは、実際にはほぼ間違いないけど
規格的にはどうなの?
Cでは(void *)0もアリでしょ。
で、もし、(void *)0な処理系が存在するなら
(void *)0 + 6 という値になって、(gcc以外なら)voidへの演算エラーになるよね。
いずれにしろ、(gcc以外では)>>424にはならない。
もちろん、ほぼ全ての処理系は>>423だろうけど。
0430デフォルトの名無しさん
2006/09/10(日) 11:41:07NULL + 6 は 0 だと言い張るのにmemcpy(0, "abc", 4);が未定義動作だと言う。
もし NULL + 6 が 0 なら、アドレス0x00000000へコピーしようとするよ。
0431デフォルトの名無しさん
2006/09/10(日) 11:41:14425じゃないけど
C++だとNULLは#define NULL 0と定義されているのが普通。
だからNULL + 6 は0 + 6となり、整数畳み込みで6になる。
で、6からポインタへの暗黙の変換は存在しないのでエラー。
ようするに>>423
0432デフォルトの名無しさん
2006/09/10(日) 11:44:10> NULL + 6 は 0 だと言い張るのにmemcpy(0, "abc", 4);が未定義動作だと言う。
だれもそんなこと言ってない。
0433デフォルトの名無しさん
2006/09/10(日) 11:44:49誰がそんな妄言、言い張ってるんだ?
0434デフォルトの名無しさん
2006/09/10(日) 11:46:16C++ では (void*)0 は NULL の中身にはなり得ない。
0435デフォルトの名無しさん
2006/09/10(日) 11:48:320436デフォルトの名無しさん
2006/09/10(日) 11:52:54仕様に書いてある?
0437デフォルトの名無しさん
2006/09/10(日) 11:53:40main(){
char *buf = NULL;
if(何か){
buf = (char*)malloc(8);
}
//ここにif(buf)が必要?
memcpy((void*)(buf + 6), "\r\n", 2);
free(buf);
0438デフォルトの名無しさん
2006/09/10(日) 11:54:37C++ はそれができないから NULL は 0 と定義するしか無いという仕様に変更された。
0439デフォルトの名無しさん
2006/09/10(日) 11:57:07アドレス0x00000006へコピーしようとする の説が正しいように思いました。
0440デフォルトの名無しさん
2006/09/10(日) 11:57:4418.1.3 が NULL マクロについての記述。
"The macro NULL is an implementation-defined C++ null pointer constant in this International Standard (4.10)."
これに注釈で
"Possible definitions include 0 and 0L, but not (void*)0."
と明記されている。
0441デフォルトの名無しさん
2006/09/10(日) 12:00:21>>439 それは気の迷いということにしておけ。
0442デフォルトの名無しさん
2006/09/10(日) 12:02:28ありがとう。
0443デフォルトの名無しさん
2006/09/10(日) 12:02:300444デフォルトの名無しさん
2006/09/10(日) 12:06:13「NULL + 6」と
「(char *)NULL + 6」は
全然違うだろ。
皆、おまえが最初に書いた前者を前提に話していたのに。
最初からそう書けよ。
0445デフォルトの名無しさん
2006/09/10(日) 12:07:08C では (void*)0 がヌルポインタ定数として( 0 と同等に)機能すると特別扱いされている。
そのおかげで、データポインタからの変換が認められていないはずの
関数ポインタも (void*)0 でヌルが設定できたりする。
0446デフォルトの名無しさん
2006/09/10(日) 12:07:55なんだか目の悪いやつがいるようだな。
0447デフォルトの名無しさん
2006/09/10(日) 12:14:05それはおまえのことか?
>>437をちゃんと見てるんだよな?
0448デフォルトの名無しさん
2006/09/10(日) 12:17:100449デフォルトの名無しさん
2006/09/10(日) 12:18:270450デフォルトの名無しさん
2006/09/10(日) 12:37:180451デフォルトの名無しさん
2006/09/10(日) 12:56:200452デフォルトの名無しさん
2006/09/10(日) 13:30:31ポインタに対する整数加算は
ポインタの指す型のサイズ倍のアドレス増加となり
sizeof (void)は得られないので
NULL+6はエラーだが
C++だとNULLは0だからNULL+6は整数6で、ポインタではなくなるな
0453デフォルトの名無しさん
2006/09/10(日) 13:36:390454デフォルトの名無しさん
2006/09/10(日) 13:40:18C でも NULL を 0 と定義するのは可能。
0455デフォルトの名無しさん
2006/09/10(日) 13:47:27てか、ちょっと前のレスで既に何度も言われてることなんですけど。
お前のような奴を知識披露厨と言うんだろうな。
職場等でウザがられてない?
0457デフォルトの名無しさん
2006/09/10(日) 14:16:590458452
2006/09/10(日) 14:24:27だから「確かに」で単にまとめてただけなんだが。必然的に繰り返しになる。
それにこのスレはそもそも殆どの話題が以前出たことがあることばっかりで
繰り返しを楽しむスレなんじゃないの?w
0459デフォルトの名無しさん
2006/09/10(日) 14:28:520460デフォルトの名無しさん
2006/09/10(日) 14:30:180461デフォルトの名無しさん
2006/09/10(日) 14:33:19まとめると言うほどの内容は無いようですが。
0462デフォルトの名無しさん
2006/09/10(日) 14:36:010463452
2006/09/10(日) 14:54:100464デフォルトの名無しさん
2006/09/10(日) 15:05:200465デフォルトの名無しさん
2006/09/10(日) 16:48:360466デフォルトの名無しさん
2006/09/10(日) 17:10:190467デフォルトの名無しさん
2006/09/10(日) 17:45:06そんで、本当にコピーできないことを確認するために、
テストコードを書いて、そのテストを自動化したい。
そんなこと C++ だけでできるぅー?
0468デフォルトの名無しさん
2006/09/10(日) 17:51:29file1.h
file2.h
file3.h
とヘッダを作成し、
--file1--------
#include "file2.h"
--file2--------
#include "file3.h"
--file3--------
#include "file1.h"
--main-------
#include "file1.h"
#include "file2.h"
#include "file3.h"
とインクルードさせるとfile1で宣言した型がfile3でintと仮定されてしまいます。
file1,2,3ともお互いに宣言した型をメンバ内で使っている状態です。
多重インクルードは回避してあります。
なんとなく、型を認識する前に別のファイルでの型が書かれている部分を認識しようとしているのかなぁ…と思うのですが、
これを何とか通したいのですが何か方法があれば教えていただきたいです。
0469デフォルトの名無しさん
2006/09/10(日) 17:52:04コンパイルエラーを捕らえることになるから C++ だけじゃできなさそうだねぇー。
0470デフォルトの名無しさん
2006/09/10(日) 17:54:36C++ では int の仮定なんてしないはず。何を見てそう思ったの?
「宣言した型」ってのもよくわからん。 class か enum か typedef か、とか。
問題が再現するコード貼ってくれると話が早い。
0471デフォルトの名無しさん
2006/09/10(日) 18:04:47結局大きめのファイルを扱うとなると、Cに戻るか、小細工が必要なんでしょうか?
<<演算子による操作自体は、読みやすくて好きなのですが
0472デフォルトの名無しさん
2006/09/10(日) 18:07:01自分で<<を定義し、その中でCのfprintf()とか使えば速くなるじゃん。
sync_with_stdioとか必要になるが。
0473デフォルトの名無しさん
2006/09/10(日) 18:13:060474デフォルトの名無しさん
2006/09/10(日) 18:16:04VS2005を使ってまして、エラーで
[ 型指定子がありません - intと仮定しました。 メモ: C++は int を既定値としてサポートしていません ]
と、出ています。よくみたら>>470さんの言うように仮定してないみたいです。
--file1.h-------
#include "file2.h"
class FILE_1 { void func(FILE_2& _file){ ... } };
--file2.h-------
#include "file3.h"
class FILE_2 { ... };
--file3.h-------
#include "file1.h"
class FILE_3 { ... };
file1でFILE_2が型として認識されていない状態です。
0475デフォルトの名無しさん
2006/09/10(日) 18:23:31型情報が必要な所でエラーになってる
(関数の戻り値の型を書くのを忘れているとか)事が多い
Cの規格では省略時はintとみなされる→C++はダメ
0476デフォルトの名無しさん
2006/09/10(日) 18:28:24参照を使うだけなら、ヘッダのインクルードを前方宣言で置き換えるといい。
- #include "file2.h"
+ class FILE_2;
0477デフォルトの名無しさん
2006/09/10(日) 18:35:47なんだこれ
循環includeで
include guardなし?
どうしてFILE_2を参照してるところに到達できてるんか
0478デフォルトの名無しさん
2006/09/10(日) 18:37:40コードに対してコンパイルエラーが出るってことは、循環 include にはなっていないんだろう。
0479デフォルトの名無しさん
2006/09/10(日) 18:48:40#include "file2.h"をすると
file2でまず多重インクルード防止のdefineでもされてから
(まだclass FILE_2宣言に到達していない)
#include "file3.h"が実行され
その中で#file include "file1.h"が実行され
file1.hの中の#include "file2.h"は
すでにdefine済みということで通過。
class FILE_1に来たときはFILE_2はまだ宣言されてない。
>>476方式で。
直接宣言が嫌なら<iosfwd>みたいに参照のみ用ヘッダ書くってのもありか
0480デフォルトの名無しさん
2006/09/10(日) 18:58:42とエラーになってしまいました。
あーもう、こんがらがってきました('д')
そもそもこんな設計になる時点で良くない気がします。
全部見直してみます。どうもお騒がせしました。
0481デフォルトの名無しさん
2006/09/10(日) 19:04:38それがいいだろうね。
整理し直してヘッダを書き直してみるのが、結果的に一番よさげな希ガス。
0482デフォルトの名無しさん
2006/09/10(日) 19:06:48しないと駄目だよ。
0483デフォルトの名無しさん
2006/09/10(日) 19:09:050484デフォルトの名無しさん
2006/09/10(日) 19:10:46class name::Class_name;
でいい
0485デフォルトの名無しさん
2006/09/10(日) 19:11:40相互依存の排除には interfaceと派生した実装クラスに分離するって手があるよ
今回の場合に当てはまるか分からんけど
ifile2.h:
class IFILE_2 {};
file1.h:
#include "ifile2.h"
class FILE_1 { ... IFILE_2を参照 };
file2.h:
#include "ifile2.h"
class FILE_2: public IFILE_2 {};
0486デフォルトの名無しさん
2006/09/10(日) 19:44:21class FILE_1;
class FILE_2 { ... };
}
FILE_1も同じ name でnamespaceしてます。
こんな感じで前方宣言してたのですが、よろしくないでしょうか?
0487デフォルトの名無しさん
2006/09/10(日) 19:48:23コンパイルできるんならいいんじゃね?
コンパイルできないならエラーメッセージ貼れ。
0488デフォルトの名無しさん
2006/09/10(日) 19:55:51エラーは>>480で怒られたものです。
[ 認識できない型 'name::Class_name ' が使われています。 ]
そして以下のようにすると、
class name::FILE_1;
namespace name {
class FILE_2 { ... };
}
[ 'name' : 識別子がクラス名でも名前空間でもありません。 ]
と怒られてしまいます。
VS使っているのですが、:: でインテリセンス出てくるんですが…
0489デフォルトの名無しさん
2006/09/10(日) 20:02:15つーか、>>482がやり方説明してるだろ。
0490デフォルトの名無しさん
2006/09/10(日) 20:05:40となると、>>486でもコード的には間違いではないと思うのですが。
やっぱり設計しなおしてみます。書き込んでくださったみなさん、お手数おかけしました。
0491デフォルトの名無しさん
2006/09/10(日) 20:09:33そうじゃなきゃ、そんなエラー出るわけないし。
あ、関係ないとは思うけど、
(たぶん今の言語仕様では) typedef名とclass内classは
どうやっても先行宣言できないから。
0492デフォルトの名無しさん
2006/09/11(月) 03:17:08class FILE_1;
}
namespace name2{
class FILE_2{ name1::FILE_1* f1; };
}
namespace name1{
class FILE1{ };
}
上はVC2005でやったら通るけど、こういうことじゃない?
0493デフォルトの名無しさん
2006/09/11(月) 09:21:07> 確かにCだとNULLは(void *)0なので
違う。0です。
(void *)0とすることも可能と併記されている。
0494デフォルトの名無しさん
2006/09/11(月) 09:25:08あなたのは見当違いです。
規格では、
null pointer constant
null pointer value
しかインデックスには出てこない。
null pointer constantの話をしているところに
"null pointer"という単独の単語は出てこない。
NULLマクロとの関係は>>440にある通り。
0495デフォルトの名無しさん
2006/09/11(月) 09:25:410496デフォルトの名無しさん
2006/09/11(月) 09:29:50それで問題ない。VC2005以外でも。
0497デフォルトの名無しさん
2006/09/11(月) 09:30:19もうこれでぬるぽのはなしはおしまいにしてもらえませんか?
http://www.kouno.jp/home/c_faq/c5.html
0498デフォルトの名無しさん
2006/09/11(月) 09:40:59規格上、0です。
(void *)0も可能と併記。
0499デフォルトの名無しさん
2006/09/11(月) 09:46:00だーかーらぁー
0500デフォルトの名無しさん
2006/09/11(月) 09:47:27C99 の定義は以下のとおり。
"An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant."
たとえば 0L も、 gcc の __null もヌルポインタ定数であり、 NULL の中身になれる。
0501デフォルトの名無しさん
2006/09/11(月) 12:17:450502デフォルトの名無しさん
2006/09/11(月) 12:19:420503デフォルトの名無しさん
2006/09/11(月) 20:13:27C でわざわざ 0 に定義する利点も無いし。
0504デフォルトの名無しさん
2006/09/11(月) 20:27:42修行が足りません。
0505デフォルトの名無しさん
2006/09/11(月) 20:49:060506デフォルトの名無しさん
2006/09/11(月) 20:54:38「可能」 って表現に違和感を持たれてるんじゃないか?
たとえば
#undef NULL
#define NULL ((char *)0)
が不能でなければ規格合致処理系ではないということではなかろう
0507デフォルトの名無しさん
2006/09/11(月) 20:59:570508デフォルトの名無しさん
2006/09/11(月) 21:37:56char buf[20];
cout << hex << buf[0];
とやってみたんですが、文字として表示されてしまいます。
intでキャストすれば正の数なら表示されるんですが、負の数になると
0xFFFFFFF と表示されてしまいます(intにキャストしているので当たり前なんですが)
buf[0] = 0xFF;
cout << hex << buf[0]; //FFと表示させたい
0509デフォルトの名無しさん
2006/09/11(月) 21:44:49signed charにキャストすればいいのでは?
0510デフォルトの名無しさん
2006/09/11(月) 21:47:190511デフォルトの名無しさん
2006/09/11(月) 21:49:510512508
2006/09/11(月) 21:57:19char buf=0xFE;
cout << hex << static_cast<unsigned>(buf);
でやってみたんですが、fffffffeと表示されてしまいます
ちなみにVC++2005でやってます
バイナリエディタの様に 00 23 BE FE
みたいな表示はみなさんどうやって出力してます?
printfなら余裕なんですが・・iostream難しい
0513デフォルトの名無しさん
2006/09/11(月) 22:00:21cout << hex << static_cast<unsigned>(static_cast<unsigned char>(c));
バイナリデータはunsigned charで扱う癖をつけておいたほうがいいと思う。
0514デフォルトの名無しさん
2006/09/11(月) 22:00:250515デフォルトの名無しさん
2006/09/11(月) 22:01:43signed charをunsignedにしたって駄目
unsigned charにしてからintに代入しろ。
0516デフォルトの名無しさん
2006/09/11(月) 22:04:06>>514
おぉできますた!
ポイントはunsigned charで扱う事なんですね
ありがとうございました
0517デフォルトの名無しさん
2006/09/12(火) 00:48:31インターフェースクラスをテンプレートクラスにするのはありですか?
template <class T> class Foo
{
public:
virtual voie Hoge(const T&) = 0;
};
template <class T> class Bar : public Foo<T>
{
public:
void Hoge(const T&);
};
って感じにして使うと、コンパイル時に好きなように
インターフェースを決定できるので汎用的に使えると思うのですが、
一方でインターフェースは型も含めて明示しないと他人が使いづらいかとも思うのです。
みなさんはどう思いますでしょうか?
0518デフォルトの名無しさん
2006/09/12(火) 00:49:29デフォルトの型を入れておけば?
0519デフォルトの名無しさん
2006/09/12(火) 01:16:51言語的にはもちろんアリ。
設計の是非については、それだけの情報では検討不能。
0520デフォルトの名無しさん
2006/09/12(火) 01:20:340521デフォルトの名無しさん
2006/09/12(火) 01:36:58たぶんそのメソッド名を仮定したvisitorとかがあるのでは。
0522デフォルトの名無しさん
2006/09/12(火) 02:06:23例えばCOMのIEnumXXXなんていうインタフェイスはそういう感じのが似合ってるような気がする。
template <class T> class IEnumGeneric
{
public:
virtual void Reset(); // 先頭に戻す
virtual bool Next(T* &pNextItem); // 次の1つを取得
};
てな感じか。
あとは C# で多用されてるような ICollection<T> のようなコンテナを抽象化したインタフェイスとか。
「好きなようにインターフェースを決定できる」というよりは、Generic なコンテナが実装/提供
するインタフェイスなので必然的にGenericになってるだけのような気もするけど。
0523デフォルトの名無しさん
2006/09/12(火) 02:27:27「静は動を助く:静的ポリモフィズムを使って動的ポリモフィズムのインターフェースを実装しよう。
たとえば抽象基本クラスCommandがあり、様々な実装を
template</*...*/> class ConcreteCommand : public Command
として定義するとしよう。」
って書いてあるが、いまいち意味がわからん。
複数の型に対して同一のアルゴリズムを提供するつもりでインターフェースをテンプレートクラスにしてるならアリで、
全然違うアルゴリズムに対してインターフェースが似てるからって理由でテンプレートクラスのインターフェースを使うのがナシだと
個人的には思う。
0524デフォルトの名無しさん
2006/09/12(火) 09:17:27Received: from kiyesrbuetekiotlreitbtiorne571671867716.com
(OFSfa-02p5-5.ppp11.odn.ad.jp [61.209.164.5])
Message-ID: 20060911234553.19067mail@mail.kiyesrbuetekiotlreitbtiorne571671867716.com
From: [email protected]
このメールは指名女性のご希望により※再配信※させていただきました。
20歳になったばっかのまいこ姫でしゅ。。
優しい優しいご主人様がほしくて噂のココに辿り着きましたぁぁ★
まいこ姫は見た目はオコチャマだけどぉ一生懸命、ご主人様を満足させるんでお返事下さいなぁ♪
ご主人様の大好きなコスプレで甘い甘いエッチがしたいなりィ★★
恥かしがりやなまいこ姫をリードしてくれる優しいご主人様からのメッセージ待ってましゅ!!
0525デフォルトの名無しさん
2006/09/12(火) 09:44:19ラッシュアワーでぎゅうぎゅう詰めでいらいらしているのに、
一駅ごとに延々としゃべり続ける。同じことを。周りの乗客もうんざり顔。
「毎度ご乗車ありがとうございます。次の停車駅は○○です。車内混み合いまして大変ご迷惑おかけしておりますが、ご了承下さい。
当社では現在、土日祝日もご利用いただける2dayチケットを発売しております。沿線施設の割引入場券としてもご利用いただけますので、
行楽シーズンに、ぜひご利用下さい。なお、各車両にはに優先座席を用意しております。体の不自由な方、体調のお悪い方、妊婦の方、
その他座席を必要とされる方がおられましたら、ぜひお譲り下さい。この列車の前から4両目は女性専用車両となっております。
男性のお客様はご利用いただけませんので、ご了承下さい。あやまってお乗りの男性のお客様がおられましたら、隣の車両にお移り下さい。
また、車内での携帯電話は電源をお切りになるか、マナーモードにしていただき、通話はご遠慮下さい。優先座席付近では、医療機器への
影響のおそれもありますので、必ず電源をお切り下さい。この列車の一番前、および一番後ろの車両は携帯電話終日電源オフ車両です。
座席位置にかかわらず、携帯電話の電源はお切り下さい。なお、車内および駅構内、駅ホームは全線禁煙となっております。
おタバコはご遠慮下さい。当社ではただいまさわやかマナーキャンペーンを実施中です。快適な車内空間作りに皆様のご協力をお願いいたします。
まもなく○○に到着します。お出口は進行方向右側です。ホームとの間が広くあいている場所がございますので、お足下にご注意下さい。
お降りの際は傘などお忘れ物の無いよう、お気をつけ下さい。本日も○○電鉄をご利用いただき、誠にありがとうございました。まもなく○○です。」
これが全駅続く。延々と。もうね、アホかと。うんざり。
0526デフォルトの名無しさん
2006/09/12(火) 17:29:330527デフォルトの名無しさん
2006/09/12(火) 20:36:32ポインタと同じように、ベースクラスの参照に色んなサブクラスの参照を代入して処理を切り替えられないのでしょうか?
#include <iostream>
#include <string>
class Iface
{
public:
virtual ~Iface() {};
virtual void method() = 0;
};
class Impl : public Iface
{
public:
Impl(const std::string& s) { s_ = s; }
virtual void method() { std::cout << s_; }
private:
std::string s_;
};
int main()
{
Impl a("a");
Impl b("b");
Iface& c = a;
c.method();
c = b; // ここで何が起きているのかいまいち分かりません。
c.method();
return 0;
}
0528デフォルトの名無しさん
2006/09/12(火) 20:38:560529デフォルトの名無しさん
2006/09/12(火) 20:41:330531デフォルトの名無しさん
2006/09/13(水) 00:52:13参照はポインタと違って一度設定された参照先を後から変更することはできない。
つまり例文のc = b;はcの参照先aを(cがIface型と宣言されているので)
Ifaceにキャストして、暗黙の代入演算子(operator=(const Iface& rhs))
を呼んでいるのと同じ事をしている。
そしてIfaceにはメンバフィールドが無いので代入演算子は何もしない。
参照先の変更が禁止されているので代入演算子が呼ばれるというのが
>>528の言う暗黙的にアレ。
cがIface型と宣言されているので何もしない代入演算子が呼ばれるというのが
>>529の言うスライシング(による弊害)。
0532デフォルトの名無しさん
2006/09/13(水) 08:59:330533デフォルトの名無しさん
2006/09/13(水) 11:57:01ファイルが開けないときに例外出したりします?
そもそもストリームって何らかの操作に失敗したとき、
フラグで表現するだけ?例外を出すときもある?
0534デフォルトの名無しさん
2006/09/13(水) 12:13:05ストリームライブラリはC++に例外機構が取り入れられる前から広く
使われていた。従ってデフォルトでは例外を送出しない。
しかし、メンバ関数exceptions()を適宜設定する事により、ある状態
フラグが立った時に例外を投げさせる事は出来る。投げる例外は
std::ios::failureである。
後は適当に調べてちょ。
0535デフォルトの名無しさん
2006/09/13(水) 12:16:25ここ辺りが参考になるかも。他にも"exceptions ストリーム"でぐぐればいろいろ
ヒットする。
0536デフォルトの名無しさん
2006/09/13(水) 12:42:260537デフォルトの名無しさん
2006/09/13(水) 15:38:45勉強する価値ありますか?
skypeのアドオンを作るための
++skypeとかいうライブラリーがlokiを使っていて
どうしようかと思ってる
0538デフォルトの名無しさん
2006/09/13(水) 15:42:46イディオムとしては面白いライブラリだけれど、
もはや古臭くて、モダンではない実装をしている。
これからはBoostを学ぶべき。
0539デフォルトの名無しさん
2006/09/13(水) 15:59:22そりゃ学んだ方がskypeのアドオン作りやすいと思うけど、
lokiがどんな風に実装されているかは学ぶ必要ないでしょ。
そんなこと知らなくても実装できるようになっているはずだから。
<loki/AssocVector.h>
<loki/Functor.h>
<loki/Singleton.h>
<loki/SmartPtr.h>
<loki/TypeTraits.h>
<loki/Typelist.h>
<loki/static_check.h>
使っているのはこれだけだね。
まあコンパイラのエラーメッセージを理解するのに、
ちょっと実装を知る必要もあるけどw
0540539
2006/09/13(水) 16:00:240541デフォルトの名無しさん
2006/09/13(水) 22:40:35> それはそうと、 const だけで3杯くらいご飯食えるよな。
昔そんな名前のスレがあったな…
0542デフォルトの名無しさん
2006/09/13(水) 23:15:57Lokiというか、Modern C++ Design読んだことないなら読む価値はあると思う。
日本語でC++メタプログラミング系の本って他に出てないよね…。
0543デフォルトの名無しさん
2006/09/14(木) 01:36:26typedef enumのためなら死ねるってスレもあった気がする。
その結果立ったのが「わたしとC++とどっちが大事なの!?」スレだったりもするわけだが。
0544デフォルトの名無しさん
2006/09/14(木) 17:46:15void test()
{
while(1){
...
if( flag ) throw 0;
}
}
void main()
{
try{
test();
}catch( int e ){
... // 特定の位置
}
}
0545デフォルトの名無しさん
2006/09/14(木) 17:52:230546デフォルトの名無しさん
2006/09/14(木) 18:02:40もう10年くらい使ってない気がする。
goto は一年に数回使ってるのに。
0547デフォルトの名無しさん
2006/09/14(木) 18:08:360548デフォルトの名無しさん
2006/09/14(木) 18:21:36リソースリークが起こりやすい。
0549デフォルトの名無しさん
2006/09/14(木) 19:30:22引数無しコンストラクタの動作がおかしくなってしまいます。
仕様的にできないようなかすかな記憶もあるんですが、
gcc4.1ではwarningも出さないし、(おかしいけど)一応実行はされているようです。
再帰的にコンストラクタを呼ぶのは規格&GCC拡張的にダメなんでしょうか?
それともバグでしょうか?
0550デフォルトの名無しさん
2006/09/14(木) 19:35:34引数無しコンストラクタを呼ぶ、とはどう記述するんですか?
CHoge::CHoge(int)
{
this->CHoge();
}
みたいに書いてみたってこと?
単なるCHoge();は一時オブジェクトを作っておしまいだしなあ
0551デフォルトの名無しさん
2006/09/14(木) 19:47:36ぐは。思いっきりCHoge();でよびだしてました。。
基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。
0552デフォルトの名無しさん
2006/09/14(木) 21:46:57printfかOutputDebugString使って
挙動調べるなりして自分で勉強した方がいいと思うよ
virtualなデストラクタ関連も
0553デフォルトの名無しさん
2006/09/14(木) 21:53:25引数無しコンストラクタを呼ぶなら、new 使わないと駄目だ。
CHoae( Arg arg )
{
new (this) CHoge;
this->member = arg;
}
ただ、デフォルトコンストラクタを持つメンバ変数が合った場合、
なんか微妙なことになりそうな気はする。
0554デフォルトの名無しさん
2006/09/14(木) 22:01:24でもいいらしい。ケースバイケースだけど。
0555デフォルトの名無しさん
2006/09/14(木) 22:06:17class CHogeImpl{CHogeImpl(){...}};
class CHoge : private CHogeImpl {
CHoge(){}
CHoge(int n){}
};
0556デフォルトの名無しさん
2006/09/14(木) 22:11:41コンストラクタ内では、thisは const T *this ではなく、T *this なの?
0557556
2006/09/14(木) 22:12:40T * const thisだね。
だから文法的には問題ない。
0558デフォルトの名無しさん
2006/09/14(木) 22:13:24const属性は付かないよ。やってみ。
0559デフォルトの名無しさん
2006/09/14(木) 22:15:04例外安全などを考えるとあまり好ましくないね。
何も考えないと結果も残らないしw
0560デフォルトの名無しさん
2006/09/14(木) 22:16:23そんな絶対に使っちゃダメな糞コードを晒したらダメだろバカか。
>>551
>基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。
基底クラスだってそれでいけねーよ。
0561デフォルトの名無しさん
2006/09/15(金) 01:26:36C++なら引数なしコンストラクタの実装を
privateメンバ関数にするとかが一般的じゃね。
0562デフォルトの名無しさん
2006/09/15(金) 02:03:22お前らコンストラクタ内からコンストラクタ呼び出すのを
本気で正気なコードだと思ってるのか??
煽りでなくマジで。
組み込み型しか使ってない単純クラスなら
特に問題になることは無いのかもしれんが、
それでも普通は各コンストラクタで共通の初期化部分を
関数としてくくりだして、使いまわすのが普通だろ?
それとも俺の気が狂ってるのか???
0563デフォルトの名無しさん
2006/09/15(金) 02:23:08是非を話し合ってるわけじゃないっしょ
0564デフォルトの名無しさん
2006/09/15(金) 02:25:41TestClass(int a)
{
this.val=a;
}
TestClass() {
this(32);
}
>>562
ってことじゃないか?
0565デフォルトの名無しさん
2006/09/15(金) 02:32:41もちろんまともなプログラミングとは思っていない。作法としても
間違ってる。
ただ、こんな書き方ができるというだけで。お遊び程度。
0566デフォルトの名無しさん
2006/09/15(金) 02:42:53いや、よかった。
俺の気がフれたのかと思って激しく動揺しちまったよ。
0567デフォルトの名無しさん
2006/09/15(金) 03:33:25template <typename CharT>
void hoge(){
// ここで CharT タイプのヌル文字を取得したい
}
0568デフォルトの名無しさん
2006/09/15(金) 03:46:410569デフォルトの名無しさん
2006/09/15(金) 09:07:550570デフォルトの名無しさん
2006/09/15(金) 09:17:16どうもありがとうございましたorz
0571デフォルトの名無しさん
2006/09/15(金) 10:28:59std::char_traits<CharT>::eos()
かね
0572デフォルトの名無しさん
2006/09/15(金) 13:54:58可愛い女子高生の彼女の家に夕食お呼ばれされて彼女と妹さんとお父さんとで話してた
「○○くんは毎日インターネットしすぎだよ」
「うわ、おにいちゃんやらしい!」
「ほほう、なんでネットがやらしいんだ?」
「だってアダルトサイトとか」
「そんなサイトばかりじゃないだろ。というかネットと聞いてすぐそんなサイトを
思い浮かべるおまえのほうが怪しい」
「なっ!……」
「ところでブラウザって閲覧の履歴が残るんだけどさ」
「それがどうしたってわけっ?」
「俺がいない間に勝手に部屋にきてPCいじるのは許すとしても、
ネットの巡回履歴は消しとけよ。特に『あの手』のサイトをみた後くらい」
「ひっ!?ち、違っ、わたしはただその下着の通販サイトを…見てたら…」
「下着……必要なの?おまえの大きさで? ああ補正用とか?ビッグにみせるアレとか?」
「もう!○○くん、女の子にそんな事いっちゃ駄目だよ。でも…まあトップを隠すだけなら
ばんそうこうでも…」
「もうおねえちゃん!! おとうさん何かいってやってよ!」
「下着を買うより牛乳を飲みなさい」
酷い家族だ 助けて(;´Д`)
0573デフォルトの名無しさん
2006/09/15(金) 23:43:07C++でもJavaみたいに参照の参照もただの参照のように扱う方法を教えていただけないでしょうか。
またもしC++でそれが実現できないなら、オブジェクトのやり取りはポインタで行うようにしていくべきですか?
0574デフォルトの名無しさん
2006/09/15(金) 23:44:38そうでもない。
0575デフォルトの名無しさん
2006/09/15(金) 23:47:06template<typename T>
struct ref{typedef T&type;};
template<typename T>
struct ref<T&>{typedef T&type;};
0576デフォルトの名無しさん
2006/09/16(土) 00:13:58char* text(int eventsyurui){
switch (eventsyurui){
case 0:
return "(イベントシーン一つ分のメチャ長い文字列)";
break;
…
}
}
なんてのを作ったんですがC2026エラー(文字列が長すぎて後ろが切り捨てられる)の壁にぶち当たりました。
いい解決法あったら教えてください。
0577デフォルトの名無しさん
2006/09/16(土) 00:16:530578デフォルトの名無しさん
2006/09/16(土) 00:18:03改行毎に分けて配列にでもしたら
0579デフォルトの名無しさん
2006/09/16(土) 00:45:020580デフォルトの名無しさん
2006/09/16(土) 01:08:26書くのってなんか恥ずかしくない?特に>>576とかどうみてもエロゲ
0581デフォルトの名無しさん
2006/09/16(土) 01:10:35"一つ分の"
"メチャ長い文字列)";
って感じで一応回避可能。
あと、戻り値はconst char *にしる。
0582デフォルトの名無しさん
2006/09/16(土) 01:15:50むしろエロゲでこんな作り方はしないだろ。
こういう実装でなんとかなりそうなのは、RPG辺りかと。
……RPGのエロゲ、というのは無しの方向で。
0583デフォルトの名無しさん
2006/09/16(土) 01:24:20つremove_reference
0584576
2006/09/16(土) 01:56:18>>578
以前それやってたんですが
strcpy(text[0],"今日は");
strcpy(text[1],"いい天気だ");
と書いてから気が変わって行を追加したり逆に行を削ったりとかするの
とっても面倒なんです。(特に追加時は以降の全部の行の配列を+1しないといけない)
0586デフォルトの名無しさん
2006/09/16(土) 02:47:32分かっててネタで釣ってるんだろうけど
ここは初心者も見てるだろうし混乱防止のため言って置く。
きみの考え方はかなりVBに影響を受けて毒されている。
char *text[] = {
"今日は",
"いい天気だ",
"イベントシーン",
"一つ分の",
"メチャ長い文字列",
"" /* 終端 */
};
これなら気が変わっても大丈夫だ。
0587デフォルトの名無しさん
2006/09/16(土) 02:53:450588デフォルトの名無しさん
2006/09/16(土) 06:17:22ところでさ、終端ってNULLにしない?
なんかC++というよりCっぽいな・・・
0589デフォルトの名無しさん
2006/09/16(土) 09:00:410590デフォルトの名無しさん
2006/09/16(土) 09:01:160591デフォルトの名無しさん
2006/09/16(土) 09:05:42あ、でも string の実装によっては、
ポインタだけのコピーですむのか??
0592デフォルトの名無しさん
2006/09/16(土) 09:37:230593デフォルトの名無しさん
2006/09/16(土) 09:50:06( ゚д゚)ポカーン
0594デフォルトの名無しさん
2006/09/16(土) 09:54:43string の実装ってまちまちだとおもうんだけど、
リファレンスカウントとかCOWとか使ってるんじゃないの?
0595デフォルトの名無しさん
2006/09/16(土) 10:17:220596デフォルトの名無しさん
2006/09/16(土) 10:18:56基本的にはそう。
>>594みたいな実装はマルチスレッドが絡むとパフォーマンスの低下が著しいので近年ではあまりやらない。
0597デフォルトの名無しさん
2006/09/16(土) 10:18:570598デフォルトの名無しさん
2006/09/16(土) 10:19:530599デフォルトの名無しさん
2006/09/16(土) 10:36:39> 激しくコピーが発生しそうだな。
にポカーンですが…
使い方によるでしょ…
0600デフォルトの名無しさん
2006/09/16(土) 10:40:22マルチスレッドというものを意識したことがなかった。
ファイルやDBのロックはマルチプロセスの話だしね。
string 自体がリファレンスカウントの機能を持たず、
言語としてガベコレの機構を持つ場合にはマルチスレッド
性能の低下は招かないの?たとえばC#とか。
C++ では std::auto_ptr とか boost::sahred_ptr
なんかで受け渡すべき?
0601デフォルトの名無しさん
2006/09/16(土) 10:41:43一時オブジェクトが生成されてコピーが発生しそうだな、
と思いました。RVO がうまく働くのかもしれませんが。
0602デフォルトの名無しさん
2006/09/16(土) 10:46:49それが実際に問題になるまでは気にすることはない。
こういう考えはだめか?
0603デフォルトの名無しさん
2006/09/16(土) 10:49:24パフォーマンス周りは実測を基本とする考え方からしたら間違っていないし、
かといって確実に無駄といえる状況を放置するのは感心しない。
0604デフォルトの名無しさん
2006/09/16(土) 11:31:52> 言語としてガベコレの機構を持つ場合にはマルチスレッド
> 性能の低下は招かないの?たとえばC#とか。
ちょっとチラシの裏借りますね
C#(というか.NET)やJavaの最近の実装は、若いオブジェクトのための
ヒープのようなものをスレッドごとに持つ。
ガベコレが動作しない間はこのヒープ状のものはロックされない。
だからstringを作って足してコピーして・・・なんかを繰り返しても、
他スレッドの動作を(同期機構を使わないという点で)妨げることはない。
ただし、live objectが超大量になると、ガベコレ期間が悲惨なことになる。
大規模アプリ、Eclipseなんかが苦労してる。
一方、C/C++は通常はヒープがスレッドごとじゃないから、new/delete/
malloc/freeするたびにヒープのロックが発生する。複数スレッドが
new/deleteをガンガンやるとひどいことになりかねない。
std::mapをコピーすると結構起こってそうなんだがどうだろう。
スレッドごとに独立していることが保証されているなら、カスタム
アロケータの利用を考えてもよいかもしれない。でも、スレッド間で
安全に受け渡すのが難しくなるという諸刃の剣。素人にはおすすめしない。
オブジェクトのサイズや個数、ライフサイクルなんかに依存しまくる話だから
一般的にこうすべし、というのは言いにくいんだよね。
逆にいうとC#やJavaが取っている手法法は「使いすてオブジェクト多杉」
という一般的な傾向から導かれたものだから、参考にしてもよいと思う。
2年以上前の知識ゆえ間違ってたら指摘夜露死苦
以上、チラシの裏でした。
0605デフォルトの名無しさん
2006/09/16(土) 15:12:18最初の相談を見る限りじゃ絶対やらない方がいい希ガスw
0606デフォルトの名無しさん
2006/09/16(土) 16:09:50class abc
{
public:
virtual void uuu()=0;
}
class def:abc
{
public:
void uuu();
}
abc *po;
def hoge;
po=&hoge;
hoge->uuu();
こんな感じのプログラムなんですが、エラーが出ます
親クラスのポインタが子クラスを示すことはできないんですか?
ttp://d.hatena.ne.jp/kenmo/20050705
このサイトを参考にしたんですが、ここではできてるみたいなんです
0607デフォルトの名無しさん
2006/09/16(土) 16:11:40とりあえずエラーメッセージを晒そうな、な?
0608デフォルトの名無しさん
2006/09/16(土) 16:14:16'type cast' : 'class def *' から 'class abc *' の変換は存在しますが、アクセスできません。
0609デフォルトの名無しさん
2006/09/16(土) 16:28:41class では継承関係もデフォルトで private だよ。
public 付けないと、クラス外からは継承関係を利用できない。
0610デフォルトの名無しさん
2006/09/16(土) 16:29:40そのサイトは間違っている。
コンパイルしてないんだろう。よくあるこった。
class def : public abc
とすればいい
0611デフォルトの名無しさん
2006/09/16(土) 16:30:39class def: public abc {
0612デフォルトの名無しさん
2006/09/16(土) 16:35:08ありがとうございました
0613デフォルトの名無しさん
2006/09/16(土) 16:44:27po=&hoge;
hoge->uuu();
これ意味あんの?
po=&hoge;
po->uuu();
こうじゃないの?
0614デフォルトの名無しさん
2006/09/16(土) 16:48:07書き間違えてました
その通りです。すみません
0615デフォルトの名無しさん
2006/09/16(土) 17:19:02class Cdote
{
public:
Cdote();
void run();
};
class Cmain
{
private:
static Cmain singleton;
static Cdote *pdote;
Cmain();
public:
static void cont()
{
Cdote dotei;
pdote=&dotei;
pdote->run();
}
};
int main(void)
{
Cmain::cont();
return 0;
}
さっきのコードの別の部分みたいな感じなんですが、エラーが出ました
外部シンボル ""private: static class Cdote * Cmain::pdote" (?pdote@Cmain@@0PAVCdote@@A)" は未解決です
0616デフォルトの名無しさん
2006/09/16(土) 17:25:180617デフォルトの名無しさん
2006/09/16(土) 17:33:030618デフォルトの名無しさん
2006/09/16(土) 17:33:41Cmain* Cmain::pdote =
つまりstatic変数はクラス外での定義が必要。
0619デフォルトの名無しさん
2006/09/16(土) 17:43:47'private: static class Cdote * Cmain::pdote' : 再定義されています。異なる基本型です。
またエラーが出たんですが、どうすればいいんでしょうか
0620デフォルトの名無しさん
2006/09/16(土) 17:45:570621デフォルトの名無しさん
2006/09/16(土) 17:47:24public:
Cdote() {}
void run() {}
};
class Cmain {
private:
static Cmain singleton;
static Cdote *pdote;
Cmain() {}
public:
static void cont() {
Cdote dotei;
pdote = &dotei;
pdote->run();
}
};
Cdote* Cmain::pdote;
int main(void)
{
Cmain::cont();
return 0;
}
0622デフォルトの名無しさん
2006/09/16(土) 17:53:16ありがとうございました!
0623デフォルトの名無しさん
2006/09/16(土) 17:58:130624デフォルトの名無しさん
2006/09/16(土) 18:37:43例外のクラスはstd::exceptionです。
0625デフォルトの名無しさん
2006/09/16(土) 18:38:160626デフォルトの名無しさん
2006/09/16(土) 18:40:10答えになっていない答えだけど、そういう機能を持ったデバッガを使うのが簡単。
0627デフォルトの名無しさん
2006/09/16(土) 18:42:42ついているんじゃないか?そういう機能.
直接例外が起こった場所を表示してくれなくても,
スタックをワインドバック(っていうのか?)すれば
わかるだろう.
0628デフォルトの名無しさん
2006/09/16(土) 18:54:43gdbの使い方を調べてみます。
ありがとうございまいた。
0629デフォルトの名無しさん
2006/09/16(土) 21:10:14bt
0630デフォルトの名無しさん
2006/09/16(土) 21:41:11catch してからじゃわからない。
0631デフォルトの名無しさん
2006/09/16(土) 23:38:14当該オブジェクトはデストラクトされるんだっけ?
0632デフォルトの名無しさん
2006/09/16(土) 23:59:080633デフォルトの名無しさん
2006/09/16(土) 23:59:240634デフォルトの名無しさん
2006/09/17(日) 00:03:360635デフォルトの名無しさん
2006/09/17(日) 01:31:560636デフォルトの名無しさん
2006/09/17(日) 02:54:050638デフォルトの名無しさん
2006/09/17(日) 05:56:51安心しろ。
途中で例外が発生して楽に死ねる
0639C++ 入門中
2006/09/17(日) 15:32:04MFCプログラミングはマスターしなくても実務で堪えうる堅牢な
システムを簡単に作れる気がするのですが、
(Windows Application として)
C++を勉強する際には、それもマスターしなければダメなのでしょうか?
0640デフォルトの名無しさん
2006/09/17(日) 15:53:46作成してみたのですが、BMP画像が正常に読み込める場合と
読み取りエラー(?)が発生してtextに"-1"が書き込まれてしまう場合
があります。これはBMPファイルが壊れているのか、
それともプログラムが悪いのか分かりません。何か解決方法があれば教えてください
0641 _
2006/09/17(日) 16:00:55>>640
自分で調べろ
0642デフォルトの名無しさん
2006/09/17(日) 16:02:04仕事で必要なら勉強すればいいし、そうでなくても好きにすればいい。
0643デフォルトの名無しさん
2006/09/17(日) 16:19:44MFCを使わずにMFCと同じだけのことをするプログラムを書く労力より、MFCを覚える労力のほうが大体は少ない。
まあMFCに限った話じゃないが、大抵のライブラリとかツールはそういうもんだ。
0644デフォルトの名無しさん
2006/09/17(日) 16:47:19第2版のあまりの評判の悪さにスルーして第3版を待っているのですが
待ちきれないです
0645デフォルトの名無しさん
2006/09/17(日) 16:49:350646デフォルトの名無しさん
2006/09/17(日) 17:00:39簡単に迅速に業務アプリを作るのが目的なだとすると、
今なら.NET覚えたほうが良くね?
0647 実は 639
2006/09/17(日) 17:27:19実は、C# / VB.net での開発経験は3年程ありまして
.NET環境での一通りの開発は出来ます。
しかしながら、いい加減これらの言語だけをずっと使っておりますので
飽きて参りました。
そういった経緯でC++.netを勉強し始めたのです。
VSを使えばMFCでなくともフォーム回りとかは簡単に
スグ作れるのになぜ参考書等にはなぜかそのMFCを使った
プログラミング手法が解説されている事に疑問を持ったからです。
実務でMFCを使う事ってありますか?
0648デフォルトの名無しさん
2006/09/17(日) 17:30:200649デフォルトの名無しさん
2006/09/17(日) 18:49:020650デフォルトの名無しさん
2006/09/17(日) 19:11:120651デフォルトの名無しさん
2006/09/17(日) 20:18:13EffectiveC++ 第3版でしょ?出版社が変わってピアソンになったよ。
俺はとうの昔に買って読んでる。2色刷りだよ。
0652デフォルトの名無しさん
2006/09/18(月) 03:24:120653デフォルトの名無しさん
2006/09/18(月) 04:04:47だったら2版と3版じゃ全然違う本になってるから
買い「直す」なんてならないよ。そして相変わらず必読。
0654デフォルトの名無しさん
2006/09/18(月) 04:10:41旧2版の方は十分償却してるだろうから、検討しようかな。
ちょっと立ち読みしてくるわ。サンクス。
0655デフォルトの名無しさん
2006/09/18(月) 09:18:43struct A {
void f1() {}
void f2() {}
};
int main() {
typedef void (A::*ptmf)();
ptmf a = &A::f1;
ptmf b = &A::f2;
return a < b; // ←だとNG、return a != b; なら OK
}
コンテナに突っ込んでたら怒られました。g++ 4.0.1 です。
0656デフォルトの名無しさん
2006/09/18(月) 09:25:03比較演算ができること自体も驚きだが
0657デフォルトの名無しさん
2006/09/18(月) 11:14:41実務で全角アルファベットを使うことはほとんどないです
0658デフォルトの名無しさん
2006/09/18(月) 11:18:130659デフォルトの名無しさん
2006/09/18(月) 11:19:38>比較演算ができること自体も驚きだが
出来てないんじゃ?
0660デフォルトの名無しさん
2006/09/18(月) 12:07:23>コンテナに突っ込んでたら怒られました。
Loki::TypeInfoを使ってmapに入れるとか
#include <loki/LokiTypeInfo.h>
#include <utility>
struct A {
void f1() {}
void f2() {}
};
typedef void (A::*ptmf)();
typedef std::pair <Loki::TypeInfo, ptmf> TypeInfo_ptmf_pair;
TypeInfo_ptmf_pair get (ptmf p) {return TypeInfo_ptmf_pair (Loki::TypeInfo (typeid (p)), p);}
int main() {
TypeInfo_ptmf_pair a (get (&A::f1));
TypeInfo_ptmf_pair b (get (&A::f2));
return a.first < b.first; // ←だとNG、return a != b; なら OK
}
0661デフォルトの名無しさん
2006/09/18(月) 12:46:57意味不明。TypeInfoで判定してどうすんだよ。
A::f1とA::f2の型が違うってのか?
>>655
typedef void (A::*ptmf)();
struct Comp{
bool operator()(const ptmf& u, const ptmf& v){
return memcmp(&u, &v, sizeof(u))<0;
}
};
std::set<ptmf, Comp> s;
0663644
2006/09/18(月) 13:25:59勝手に脳内でEffectiveC++第3版にすんな
EffectiveC++第3版ならもう買ってある。読んでないけど
0664デフォルトの名無しさん
2006/09/18(月) 13:37:11addison-wesley本家のサイトでみてみたが
more effective c++は
3rdはおろか2ndもなくて
現行で1st editionみたいなんだけど
0665デフォルトの名無しさん
2006/09/18(月) 13:37:31原書買えばいいじゃねーか。
0666デフォルトの名無しさん
2006/09/18(月) 13:40:03http://www.awl.com/cseng/titles/0-201-63371-X/
0667デフォルトの名無しさん
2006/09/18(月) 13:45:21この度PC上で起きるイベント(作業ウィンドウの変更やウェブページの移動等)を記録するプログラムを作る事になりました。
ネット上等を調べてどうやらSetWindowsHookExという関数を使う事は分かったのですが、具体的なコードの書き方(例題等)が分かりません。
どこか詳しく述べているサイト等を知っている方が居ましたら教えてください。
流れ的には、作業ウィンドウ変更→プログラムが感知(フック)→その内容をテキストに書き込み、という感じにしたいです。
よろしくお願いします。
0668デフォルトの名無しさん
2006/09/18(月) 13:58:500669デフォルトの名無しさん
2006/09/18(月) 14:01:37operator==, operator!=も比較演算じゃろ
0671デフォルトの名無しさん
2006/09/18(月) 20:03:19std::map
0672デフォルトの名無しさん
2006/09/19(火) 23:06:560673デフォルトの名無しさん
2006/09/19(火) 23:08:170674デフォルトの名無しさん
2006/09/19(火) 23:08:490675デフォルトの名無しさん
2006/09/19(火) 23:24:380676デフォルトの名無しさん
2006/09/19(火) 23:35:080677デフォルトの名無しさん
2006/09/20(水) 02:40:03雑談じゃないから続けておk
0678デフォルトの名無しさん
2006/09/20(水) 06:43:29採用されればうれしいけど、さすがにされない気がする
0679デフォルトの名無しさん
2006/09/20(水) 07:11:390680デフォルトの名無しさん
2006/09/20(水) 07:17:22駄目
0681デフォルトの名無しさん
2006/09/20(水) 08:25:04けど提案している中にStroustrupがいるぜ?
Lambda expressions and closures for C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1968.pdf
ちなみに提案されているのは"lambda"だけどな。
いまいちシンタックスが好きじゃないな。
0682デフォルトの名無しさん
2006/09/20(水) 08:46:54vector<int> v ;
char const * str = "elem : " ;
for_each(v.begin(), v.end(),
<>(int x) { std::cout << str << x << std::endl ; }
) ;
やはり邪悪かな。
0683デフォルトの名無しさん
2006/09/20(水) 09:02:170684デフォルトの名無しさん
2006/09/20(水) 09:57:00auto it = v.begin();
while(it != v.end())
{
std::cout << str << it << std::endl;
}
とかの方でなく?
0685デフォルトの名無しさん
2006/09/20(水) 11:26:34std::cout << str << *it << std::endl;
じゃないのか?
0686デフォルトの名無しさん
2006/09/20(水) 12:03:13返り値型指定なしのlambda式の登場で、
またname lookupが複雑になりそう…
0687デフォルトの名無しさん
2006/09/20(水) 13:17:18いや、単に省略できるだけで、
return文を見てコンパイラが決めるだけらしいから。
return文がなければ、voidとみなす。
0688デフォルトの名無しさん
2006/09/20(水) 18:11:590689デフォルトの名無しさん
2006/09/20(水) 22:11:45今やアレ程度のlamda式が無い言語の方が希少なはずだけど。
ひょっとして、<>って部分だけを指していってんのか?
だとしたら単なるアホなんだけど、まさかな。
0690デフォルトの名無しさん
2006/09/20(水) 22:13:210691デフォルトの名無しさん
2006/09/20(水) 22:29:460692デフォルトの名無しさん
2006/09/20(水) 22:33:19というより
<>(int x) ...
この記述は…<>が名前のない関数名を示すみたいな感じなの?
0693デフォルトの名無しさん
2006/09/20(水) 22:45:34そういうことらしい。
tempate <typename T>の<>からの連想だとかだった気がする。
0694デフォルトの名無しさん
2006/09/20(水) 23:23:520695デフォルトの名無しさん
2006/09/20(水) 23:51:22出来ないと嘘だとは思うけど。
0696デフォルトの名無しさん
2006/09/20(水) 23:51:510697デフォルトの名無しさん
2006/09/21(木) 00:17:07提案では、lambda式はジェネリックであってはならないと書いてあるけど。
ジェネリックってのはなんだろ。
こういうのもダメなのかな?
template < typename T >
void f(T x)
{
(<>() extern(x){ std::cout << x << std::endl ; })() ;
}
0698デフォルトの名無しさん
2006/09/21(木) 05:22:59誰かお母さんみたいに優しく教えてくれ。
0699デフォルトの名無しさん
2006/09/21(木) 05:38:18you lose
0700デフォルトの名無しさん
2006/09/21(木) 07:41:58lambda式はテンプレートにはしないと提案に書いてあるのにか?
0701デフォルトの名無しさん
2006/09/21(木) 08:01:540702デフォルトの名無しさん
2006/09/21(木) 08:25:070703デフォルトの名無しさん
2006/09/21(木) 09:27:15でもメンバ関数呼ぼうとしたときは0xの方が分かりやすいかな
0704デフォルトの名無しさん
2006/09/21(木) 13:12:490705デフォルトの名無しさん
2006/09/21(木) 13:28:26っていうか名前考えなくていいだけでありがたい
0706デフォルトの名無しさん
2006/09/21(木) 14:44:18のメソッドポインタを格納できるような配列はどのように書けばよろしいでしょうか?
クラスが違うメソッドのポインタを配列に格納するのは無理なのでしょうか?
#include <stdio.h>
class a{
public:
void test(){printf("a");}
};
class b{
public:
void test(){printf("b");}
};
class c{
public:
void test(){printf("c");}
};
int main(){
a aa; b bb;c cc;
}
0707デフォルトの名無しさん
2006/09/21(木) 15:08:32testという名前が同じであることが大事なら、templateで継承関係を後付けすることができる。
0708デフォルトの名無しさん
2006/09/21(木) 15:19:210709デフォルトの名無しさん
2006/09/21(木) 16:17:48struct ITest { virtual void test() = 0; }
class a : public ITest { virtual void test()
0710デフォルトの名無しさん
2006/09/21(木) 16:20:35struct itest { virtual void test() = 0; }
class a : public itest { virtual void test() { printf("a"); } }
class b : public itest { virtual void test() { printf("b"); } }
class c : public itest { virtual void test() { printf("c"); } }
0711デフォルトの名無しさん
2006/09/21(木) 16:23:140712デフォルトの名無しさん
2006/09/21(木) 16:54:07boost の使用に抵抗が無ければboost::functionが良いと思う。
C# の delegate 並みに楽ちん。
0713デフォルトの名無しさん
2006/09/21(木) 16:56:560714デフォルトの名無しさん
2006/09/21(木) 16:58:540715デフォルトの名無しさん
2006/09/21(木) 17:41:53将来のC++標準入りの可能性は高い。
まあいつのことだかわからないけどね。
0716710
2006/09/21(木) 17:49:51→template/boostの使用は不可(開発環境での制限)
(2)>>710の方法
→ class a,b,cは他人が提供するクラスであり、
void型ということとメソッド名以外は任意となる(仕様)
そのままでは無理ということで、
全く別の方法を考えて見ます
レスありがとうございましたm(_ _)m
0717706
2006/09/21(木) 17:51:000718デフォルトの名無しさん
2006/09/21(木) 18:11:01class test_holder {
public:
virtual void test() = 0;
virtual void ~test_holder() {}
};
#define TEST_HOLDER(c) test_holder_ ## c
#define DEFINE_TEST_HOLDER_IMPL(c, mem) \
class TEST_HOLDER(c) : public aa { \
c& x; \
public: \
TEST_HOLDER(c)(c& obj) : x(obj) {} \
virtual void test() {x.test();} \
}
DEFINE_TEST_HOLDER_IMPL(aa);
DEFINE_TEST_HOLDER_IMPL(bb);
DEFINE_TEST_HOLDER_IMPL(cc);
int main() {
aa a; bb b; cc c;
test_holder* holder[] = {
new TEST_HOLDER(aa)(a),
new TEST_HOLDER(bb)(b),
new TEST_HOLDER(cc)(c),
};
for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i)
holder[i]->test();
for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i)
delete holder[i];
}
0719デフォルトの名無しさん
2006/09/21(木) 19:29:130720デフォルトの名無しさん
2006/09/21(木) 21:13:210721デフォルトの名無しさん
2006/09/21(木) 21:22:19処理系の制限かもよ。俺はそんな処理系知らないけど。
0722デフォルトの名無しさん
2006/09/21(木) 21:37:530723デフォルトの名無しさん
2006/09/21(木) 21:42:070724デフォルトの名無しさん
2006/09/21(木) 21:42:230725デフォルトの名無しさん
2006/09/21(木) 21:43:470726デフォルトの名無しさん
2006/09/21(木) 21:44:410727デフォルトの名無しさん
2006/09/21(木) 21:52:14考えてたんだろ。
0728デフォルトの名無しさん
2006/09/22(金) 00:13:360729デフォルトの名無しさん
2006/09/22(金) 00:37:51漏れの目が悪くなければ、シグネチャは一致していると思うが。
0730デフォルトの名無しさん
2006/09/22(金) 00:59:24クラスが違うだろ。
0731デフォルトの名無しさん
2006/09/22(金) 08:33:320732デフォルトの名無しさん
2006/09/22(金) 08:43:000733デフォルトの名無しさん
2006/09/22(金) 09:26:18クラスが違うとシグネチャも違うよ。
0734デフォルトの名無しさん
2006/09/22(金) 11:12:36the information about a function that participates in overload resolution (13.3): its parameter-type-list (8.3.5) and, if the
function is a class member, the cv- qualifiers (if any) on the function itself and the class in which the member function is
declared. The signature of a function template specialization includes the types of its template arguments (14.5.5.1).
0735デフォルトの名無しさん
2006/09/22(金) 11:50:530736デフォルトの名無しさん
2006/09/22(金) 12:03:340737デフォルトの名無しさん
2006/09/22(金) 12:04:100738デフォルトの名無しさん
2006/09/22(金) 12:43:470739デフォルトの名無しさん
2006/09/22(金) 13:05:08Typelist ( A, B, C, D )
// Typelist 型の戻り値を持ち、
// A, B, C, D の4つの型の引数をとる関数定義
0740デフォルトの名無しさん
2006/09/22(金) 13:25:29どこがまぎらわしいの?
0741デフォルトの名無しさん
2006/09/22(金) 15:19:54「template は将来の為に予約されています」
と載ってた時代を思い出すなあ。
0742デフォルトの名無しさん
2006/09/22(金) 15:21:580743デフォルトの名無しさん
2006/09/22(金) 17:18:06boost/archive/xml_oarchive.hpp
のsample programをそのまま使っても
runtimeの異常な呼び出しで終了しました
とかいうエラーで止まるんですが、なぜ?
includeするだけじゃ動かないのかな
環境はVS2003です
0744デフォルトの名無しさん
2006/09/22(金) 17:21:24boostのホームページにのってるdemoプログラムのことです
0745743
2006/09/22(金) 18:13:01boost_1_33_1\libs\serialization\vc7ide
に入っていたproject fileを使ったらうまく動きました
boostのホームページからコピペしただけでは
動かなかったのは謎です
0746デフォルトの名無しさん
2006/09/22(金) 18:15:43>includeするだけじゃ動かないのかな
ライブラリをリンクする必要がある
0747デフォルトの名無しさん
2006/09/22(金) 23:33:330748デフォルトの名無しさん
2006/09/22(金) 23:41:481.234 => "1.234"
みたいなこと?
0749デフォルトの名無しさん
2006/09/23(土) 00:03:420750747
2006/09/23(土) 00:44:56そのとおりです。
簡単そうで意外と情報が見つかりませんでしたorz
0751デフォルトの名無しさん
2006/09/23(土) 02:03:27charにsprintfしてからstringにすれば良いんじゃね?
0752デフォルトの名無しさん
2006/09/23(土) 02:11:020753デフォルトの名無しさん
2006/09/23(土) 02:12:47Boostを使ってよければlexical_cast使え。
0754デフォルトの名無しさん
2006/09/23(土) 05:04:54使うときには precision に注意すべし。
0755デフォルトの名無しさん
2006/09/23(土) 05:37:05string s = f.to_string();
とか出来るクラスがあったら楽でいいのに。
と思ったけど。
string str_thousand = "1000";
int int_ninety = 90;
int a = lexical_cast<int>( str_thousand );
string s = lexical_cast<string>( int_ninety );
boostっていいね。
boost落として使いたくなったよ。
0756デフォルトの名無しさん
2006/09/23(土) 05:56:47性能要求の厳しいところには、ほんの一部しか持ち込めない場合も…
lexical_castとかはガチで便利だけど、同時にソースの大きさ&生成されるコードのデカさには
吹く事請け合い。
いやまあ、ほとんどの環境じゃ問題にならないとは思うんだけどね。
0757デフォルトの名無しさん
2006/09/23(土) 06:08:18いまは組み込みでも標準ストリームは当たり前なのかな。
俺が組み込みにいた頃は C++ とかあり得なかったけど、
今じゃ C++ も結構使われて居るみたいだし。
0758デフォルトの名無しさん
2006/09/23(土) 06:19:40まあ、そうなんだけどね。
実際そういう環境だと標準ストリームは禁じ手扱いだなー。
IOデバイスが抽象化されてないのでそもそも出番が無いなんてこともあるけど。
あとは例外とRTTI。蛇蝎のごとく嫌われてる。実際負担はでかいにせよ。
CとC++じゃ、相変わらずC++の方が重い局面も多いのだろうけど、
コンパイラ様の性能がこの数年で格段に跳ね上がった感がある。
テンプレートも味方してくれるし、今更Cじゃ辛いからC++というだけでなく、
純粋に性能面から見てもC++のが有利ってのも、今となっては寝言じゃない。
ただ、言語機能的にはまったく問題なくても、ライブラリ類に大幅な制限食らってまで
使うC++が本当にC++なのかと、ふと考えることはある…かも。
0759デフォルトの名無しさん
2006/09/23(土) 06:27:41実際その方がロジックはきれいになることも多いし、
エラーを見逃すことも少なくなる。
RTTIは、boost のいくつかのライブラリが要求するから
コンパイラオプション的には禁止していないけど、
自分が各プログラムでは使いたくない、と言うか、使わない。
C++ のようなアーリーバインディングな言語では
コンパイルが完了した時点で型に関する整合性は
保証されていることが大切だと思っているから。
0760デフォルトの名無しさん
2006/09/23(土) 07:02:20構造上仕方が無い。
>C++ のようなアーリーバインディングな言語では
>コンパイルが完了した時点で型に関する整合性は
>保証されていることが大切だと思っているから。
基本的には同意。
RTTIは、個人的には要らない子に思う。
けど、奴がいないとできない仕事は結構あるしなー。
機構としてのRTTIを言語がサポートしていることには何の不満もないけど
影響範囲をコントロールできないのがムカツク。
素のままだとAll or nothingなんだもんなー。
0761デフォルトの名無しさん
2006/09/23(土) 07:27:46がんがんacceptしてるな
そろそろC++言語が高級言語らしくなってきたよ
0762デフォルトの名無しさん
2006/09/23(土) 07:29:400763デフォルトの名無しさん
2006/09/23(土) 14:18:41class MessagePort
{
public:
typedef List_ mes;
/*
コンストラクタとかメソッドとか
*/
};
struct PlayerMesList
{
typedef int type;
static const int ESCAPE = -1;
static const int MOVE = 0;
static const int WARP = 1;
static const int FIRE = 2;
};
typedef MessagePort< PlayerMesList, Point > PlayerMesPort;
質問です。上のようなクラスがあったとき、私の予想では
int a = PlayerMesPort::mes::WARP;
はコンパイル時に
int a = 1;
に置き換わると思うんですが、何故かG++-3.3.2でリンク時に
undefined reference to 'PlayerMesList::WARP'
と出てリンク出来ません。何故でしょうか…。
BCC(BuilderX)では何の問題も起こらなかったのですが…。
0764デフォルトの名無しさん
2006/09/23(土) 14:50:22こんなん出ました。
http://www.google.co.jp/search?q=gcc+%22undefined+reference%22+static+const
↓
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20547
つまり、これも undefined reference になるってこと。
struct S { static const int N = 1; };
int main()
{
int const& x = S::N;
return x;
}
gcc が正しいのか?
0765デフォルトの名無しさん
2006/09/23(土) 14:51:34>undefined reference to 'PlayerMesList::WARP'
この時点では見えないよ。と、いわれてるのだからどこが悪いか検討つくのでは。
リンクの順序orコンパイラ
0766デフォルトの名無しさん
2006/09/23(土) 14:53:29参照はダメだろう
0767デフォルトの名無しさん
2006/09/23(土) 14:59:20参照で使ってるとこあるの?
0768デフォルトの名無しさん
2006/09/23(土) 15:29:32しかし、それがメモリ上のオブジェクトとしての実体が必要な形で使用する場合、
改めて実体を宣言する必要がある。ってことだよな? もし>>763がどっかで
参照とかポインタに突っ込んでる箇所があるならgccの挙動で正しい。
struct T {static const int n = 3;};
void f( int x){ cout << x << endl;}
void g(const int& x){ cout << x << endl;}
int main()
{
f(T::n); //ok
g(T::n); //NG
return 0;
}
0769デフォルトの名無しさん
2006/09/23(土) 15:34:12ためしに一箇所だけ、
一度int型に格納してから引数に渡すように変更してみたら、
大量のエラーの内一つだけ消えました。^^;
質問時の
「int a = PlayerMesPort::mes::WARP;
はコンパイル時に
int a = 1;
に置き換わると思うんですが」
というのはかなり不適切な言い方でしたね…。
…でもconst int &に数値リテラルなら直接渡せるのに何故?
(クラススコープでのstatic const int定義はコンパイル時解決だったと思うのですが…)
0770769=763
2006/09/23(土) 15:46:040771デフォルトの名無しさん
2006/09/23(土) 16:10:18http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#454
static const な整数型(enum 含む)メンバが初期化子を持つとき、それは
定数式として使えて、 & でポインタ作ったり直接参照を初期化したりしない限り
定義が要らなくなる、という特別扱いがされている。
static_cast<int> や +0 で結果が変わるんだから、混乱してもしょうがないと思う。
定数式として使える整数型変数が右辺値として評価されることにすれば、
みんな幸せになれるだろうか?
0772763
2006/09/23(土) 18:48:56むー…そういうことですか。static const 整数って意外と不便なものなのですね…。( ´ ・ω・ ` )
cppファイル上で定義するなりなんなり、とりあえず別の方法を検討してみます。
みんなありがとう。
0773デフォルトの名無しさん
2006/09/23(土) 19:51:47「enum使えenum」って結論だったな。ってBCCはenumにバグがあるんだっけ?
0774デフォルトの名無しさん
2006/09/23(土) 20:12:47**/config/static_constant.hpp
See Also:
http://boost.cppll.jp/HEAD/more/int_const_guidelines.htm
0775ららら
2006/09/23(土) 20:27:47VC7.1 で以下の Multiply 関数の 2 つめの引数の const を削除してコンパイルすると
"function does not take 2 arguments" エラーになるのらー!
なんでなのらー?どうしたらいいのらー?
template<class T>
class Complex {
public:
typedef T ValueType;
};
template<class T>
class Vector {
public:
typedef T ValueType;
};
typedef Vector<Complex<float> > MyVector;
template<class VectorT>
void Multiply(VectorT* vec, const typename VectorT::ValueType::ValueType a)
{ }
void test()
{
MyVector v;
Multiply(&v, 2.0);
}
0776デフォルトの名無しさん
2006/09/23(土) 20:45:31>>328
ばかはおよびでないのらー
また出たよ……。
0777デフォルトの名無しさん
2006/09/23(土) 20:52:100778デフォルトの名無しさん
2006/09/23(土) 21:25:27Multiply(&v, 2.0);の場合、
1つ目の引数より、テンプレート引数VectorTの型は、
Vector<Complex<float> >だと判断される。
するとtypename VectorT::ValueType::ValueTypeはfloat型になる。
しかし2つ目の実引数の2.0はdouble型になっているのがまずいのだと思う。
2.0fだとどうだろうか。
0779デフォルトの名無しさん
2006/09/23(土) 21:33:09どうやらそういう理由ではないようだ。
>>775
そのソースをVC8でためしたらコンパイルすらされない。
で、
template<class T>
class Vector {public: typedef T Type;};
このように変更したらMultiplyのconstなしがvc7.1とvc8両方でコンパイルされた。
たぶん、vcのバグかな。
0780763
2006/09/23(土) 21:54:56それ使えばconst &へ直接渡せるようになるってワケではないのですね…。
とりあえず定数を使う場合に全て単項の+付けるようにして対応しました。
なんだかなぁ…。( ´ ・ω・ ` )
0781デフォルトの名無しさん
2006/09/23(土) 22:12:42じゃあ、コンパイラがenumでの参照初期化が駄目なのかも。
boost/config/suffix.hppの
// BOOST_STATIC_CONSTANT workaround --------------------------------------- //
// On compilers which don't allow in-class initialization of static integral
// constant members, we must use enums as a workaround if we want the constants
// to be available at compile-time. This macro gives us a convenient way to
// declare such constants.
# ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
# define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }
# else
# define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
# endif
で切り替えてんだけど。
0782デフォルトの名無しさん
2006/09/23(土) 22:14:56OS WinXP
コンパイラ Visual C++
if文を用いたプログラムを作りたいので質問します
最初に[F5]を押し、もしパケットの受信(なんらかの通信)があったなら、5秒後にまた[F5]を押し
もし、パケットの受信がなければ、そこでプログラム停止
というプログラムを作りたいのですが、全くわかりません ある程度のコマンドを表記してもらえれば後は自分で独学するので
使うコマンドだけ教えてくれませんか?
2ちゃんねるの実況などのオートリロードに役立てたいのです(Janeですと、制限があるので…)
0783デフォルトの名無しさん
2006/09/23(土) 22:19:44すまないが、環境依存の話はスレ違いなんだ。
Visual C++のスレとかあるからそっちへ行ってくれ。
0784763
2006/09/23(土) 22:32:22MPW C++、Sun C++、Visual Age (IBM) C++、Microsoft Visual C++の四つだけみたいですね。
(boost/config/compiler/より)
あくまでclass内で直接定義できない場合にenum仕様に分岐するってだけで、
const &に渡すとか、そういう用途は想定してなさそう…。
0785デフォルトの名無しさん
2006/09/23(土) 22:35:480786デフォルトの名無しさん
2006/09/23(土) 22:45:42結局、定数をクラス内enumにするのが
一番トラブルが起きにくいし、読む側も(わかってれば)納得できるんだよね。
0787デフォルトの名無しさん
2006/09/23(土) 22:52:39enum は enum で template 関数に使うと妙なことになるぞ。
#include <algorithm>
struct S { enum { N = 1 }; };
int main()
{
return std::max(S::N, 0);
}
:5: error: no matching function for call to `max(S::<anonymous enum>, int)'
0788763
2006/09/23(土) 23:14:31よく考えてみればそうですね。頭固い763に乾杯。
…ってtemplate関数に使うと 787>> みたくなっちゃうのか…。
別に質問の件ではtemplate関数に渡したりしないから大丈夫だけど、
もうstatic const 整数で定義して、使用時に単項+付けるんでいい気がしてきた…。
0789デフォルトの名無しさん
2006/09/23(土) 23:18:07for(iterator i = begin; i != end; ++i)
「i != end」の部分が気になります。
例えば以下の関数があったとして、
引数endにNULLその他、不適切な値が渡された場合
無限ループになってしまいます。皆さんはどう解決されてますか?
template< typename iterator >
void function(iterator begin, iterator end)
{
for(iterator i = begin; i != end; ++i){ ...}
}
0790デフォルトの名無しさん
2006/09/23(土) 23:19:08定義を追加するのはだめなのか?
undefined referrence っていうんだから、一番まっとうな解決方だと思うが。
使用箇所全部に不気味なコード書くぐらいなら、
実装側に不気味なコードひとつのほうがマシだろ。
0791デフォルトの名無しさん
2006/09/23(土) 23:20:25const int S::N = 1;
0792デフォルトの名無しさん
2006/09/23(土) 23:22:43渡すやつが悪いという理屈が通用しないなら、
function側で、X.end()と生成するしかないだろ。
0793デフォルトの名無しさん
2006/09/23(土) 23:44:33firstとlastを受け取る関数のlastにNULLを渡すなんて
絶対やらないけどな。
0794デフォルトの名無しさん
2006/09/23(土) 23:55:050795763
2006/09/23(土) 23:55:14うーん。そういう記法で統一すればさほど不気味でもないかな、とも思っていたんですが。
(定数リストをテンプレート化するという目的上)cppファイルも増やしたくなかったし。
でもそう言われると悩んできますね…。
0796デフォルトの名無しさん
2006/09/24(日) 00:01:04記法を変える必要は無い。定義を追加すればいいだけ。
0797789
2006/09/24(日) 00:13:56お答えありがとうございました。
渡す奴が悪いで法にすることにします。
確かC#とかだとテンプレート引数に制限かけれるんでしたよね。
C#触る機会があればまた考えることにします。
0798デフォルトの名無しさん
2006/09/24(日) 00:15:46と思ってやってみたら普通に通る。ちゃんと定義が置いてあるみたい。
と思って libstdc++ のソース見たらクラス内で -1 で初期化したうえで、
クラス外に初期化子の無い定義が書いてあった。
めんどくさいけど、これが正解なんだろう。
0799デフォルトの名無しさん
2006/09/24(日) 00:29:030800763
2006/09/24(日) 01:02:52言葉足らずでしたね…。
記法を統一というのは、使用箇所に単項+を追加するという方の意味です。
ていうかもしかして >>796 のは >>798 のことを言っているのかな。
cppファイルが増えるのはいやだけど、
const&に渡せる上にswitch文にも使えて(定数としての性質を失っていない)
一番理想的な動作をしますね。(こういう書き方できたんですね…)
というわけで >>798 の方法を取ることにします。
>>799
STLのクラスに渡していたりするので無理。
0801デフォルトの名無しさん
2006/09/24(日) 01:51:41元が template なら、定義も template になるから cpp は増えないでしょ?
0803デフォルトの名無しさん
2006/09/24(日) 02:59:180804ららら
2006/09/24(日) 03:40:460805デフォルトの名無しさん
2006/09/24(日) 04:05:42void Multiply(VEC<C>* vec,typename C::ValueType a)
{}
これでいいんじゃね?
0806デフォルトの名無しさん
2006/09/24(日) 05:04:27標準では合法なコードなんだから、このスレで話すことはもう無い。
VCスレにでも逝ってくれ。
0807デフォルトの名無しさん
2006/09/24(日) 13:30:15たとえば
15 -> 16
16 -> 16
17 -> 32
みたいな感じです。切り捨てるには
n = n / 16 * 16でいいのですが…
0808デフォルトの名無しさん
2006/09/24(日) 13:32:410809デフォルトの名無しさん
2006/09/24(日) 13:33:00n = (n + (16 - 1)) / 16 * 16;
0811デフォルトの名無しさん
2006/09/24(日) 13:45:54これなら0値でも16になるぜ!!
0812デフォルトの名無しさん
2006/09/24(日) 14:12:06↓
http://mitty.jp/up/src/up1962.cpp
プログラムの
pwork = pchar = new char[size + 1];
の部分で、pcharとpworkにメモリ割り当てをしているのはなんとなくわかるんですが
Cの時はmallocの戻り値がvoid*型なのでキャストして、一つのポインタ変数に
一つずつメモリをわりあてていたのですけど
C++では、まとめてメモリをわりあてることができるのでしょうか
あと、本では、pcharしか解放してないんですが、pworkの方は解放しなくて良いのでしょうか
それと、蛇足ですが、このような知識が手に入るC++の読むべき本てあるのでしょうか。
最後の本については、スレ違だと思いますので、できれば、前者のnewにかんする部分を
教えていただけないでしょうか
0813デフォルトの名無しさん
2006/09/24(日) 14:15:49n = (n + 15) & 0xfffffff0;
0814デフォルトの名無しさん
2006/09/24(日) 14:22:03「土地を取得して、その住所をpwork君とpcharさんに教えてあげた」
ということ。
確保されたのは new char[size + 1]; だけ。
pworkとpcharは同じ場所を指している。
0815デフォルトの名無しさん
2006/09/24(日) 14:27:37それをmallocを使って書いたらpwork = pchar = malloc(size + 1);になる。
ただ代入演算子を並べているだけ。
0816810
2006/09/24(日) 14:37:59かっこいいです!
使わせていただきます。
その他の人も本当にありがとうございました
0817デフォルトの名無しさん
2006/09/24(日) 14:41:30さらに2のべき乗以外の丸めができないし
コメントつけても「(本当に大丈夫か?)…ああ、大丈夫だ」と逡巡すると思われ
止めておけ・・・忠告はしたからねっ!
0818デフォルトの名無しさん
2006/09/24(日) 15:53:20nが32bit integerじゃないと破綻する。
0819デフォルトの名無しさん
2006/09/24(日) 16:08:50それはキミへの宿題だってこった
0820デフォルトの名無しさん
2006/09/24(日) 16:09:330821デフォルトの名無しさん
2006/09/24(日) 16:41:250822(^-^) ◆MONSOON/qo
2006/09/24(日) 16:49:460823デフォルトの名無しさん
2006/09/24(日) 16:52:25それ言語に寄らない機能モデルだよね
そしてそれくらいなら小学校で習うことだよね
というわけで
つ たのしい算数
0824(^-^) ◆MONSOON/qo
2006/09/24(日) 16:57:01桁数が多い場合でもループ使わずに出来ますか?
0825デフォルトの名無しさん
2006/09/24(日) 17:00:57なんでループが必要になるのかがわからん。
とりあえず一通り算数を学んでからコードを書いてみろ。
自分で書く前に人に聞くな。
書いた後で相談する時は、スレを適切に選んでソースを貼れよ。
0826デフォルトの名無しさん
2006/09/24(日) 17:01:52その機能モデルと、機能の実体を中途半端に混ぜるのはやめておいたほうがいい
そもそもループ使うかどうかなんて決まってないじゃんか
ついでに言えば進数もわからないし
頭にある前提条件を残さず書き下してから、そういうのを考えようね
0827(^-^) ◆MONSOON/qo
2006/09/24(日) 17:05:190.0350119なら四捨五入して0.035012
とかです 有効桁5桁を残して四捨五入するということです
0828デフォルトの名無しさん
2006/09/24(日) 17:11:12exeが一瞬しか表示されないのですがなぜでしょうか。。
たぶん、プログラムじゃなくて漏れのPCが原因だと思うんだが・・
よかったら誰か教えてくれ・・・
http://www.uploda.org/uporg526158.zip.html
0829デフォルトの名無しさん
2006/09/24(日) 17:15:41exeが一瞬ってのは実行したら
一瞬Hello World!ってでてプログラムが終了してしまう・・
Developer使って実行したらちゃんと閉じる押すまで閉じることはないんだが
なぜなんでしょうか。。。?
0830デフォルトの名無しさん
2006/09/24(日) 17:15:460831デフォルトの名無しさん
2006/09/24(日) 17:20:37環境依存な話はスレ違い。そういうのはこっち。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
0832デフォルトの名無しさん
2006/09/24(日) 17:21:58(;゚д゚)ァ.... どうも、スレ汚してすみませんでした。(_ _(--;(_ _(--; ペコペコ
あと、URL d(゚Д゚)☆スペシャルサンクス☆( ゚Д゚)b
0833(^-^) ◆MONSOON/qo
2006/09/24(日) 17:24:18printf("Hello World!\nキー押してね");
int a=getchar();
に変更してみて
0834デフォルトの名無しさん
2006/09/24(日) 17:29:48糞コード
0835デフォルトの名無しさん
2006/09/24(日) 17:30:340836デフォルトの名無しさん
2006/09/24(日) 17:49:13カスに向かって説教するのがどれだけ無駄か理解しろ。
0837デフォルトの名無しさん
2006/09/24(日) 17:56:56動的に配列を割り当てたいんですけど
oya = new Child*[n];
for(int m = 0;m < X;m++)
oya[m] = new Child[X];
とやればできるのかな?と思ったらコンパイル出来なかったんです。
oya = new Child*[n];
for(int m = 0;m < X;m++)
oya[m] = new Child[X];
ならコンパイルはできたけど、当然エラーでました(当たり前ですよね)
多分、やり方が悪いだけできっと何かしら方法があると思うんです
ご教授願えませんでしょうか?お願いします
0838デフォルトの名無しさん
2006/09/24(日) 18:05:04上の例と下の例に違いが見つからないが
0839デフォルトの名無しさん
2006/09/24(日) 18:12:55oya = new Oya*[n];
for(int m = 0;m < X;m++)
oya[m] = new Child[X];
とやったらコンパイルは出来たっていうのが正しいです。打ち間違えてすいません
0840デフォルトの名無しさん
2006/09/24(日) 18:18:55相談するときはエラーの内容を忘れずに。
0843デフォルトの名無しさん
2006/09/24(日) 18:22:26有効桁数は数値からは分からないよな、したがって有効桁数と数値の組を扱わなくちゃならない
(10と10.00000000000の違い)
まぁ、ここまでくれば問題ないとおもうので略
0844デフォルトの名無しさん
2006/09/24(日) 18:25:56oya = new Oya*[n];
for(int m = 0; m < n; m++)
oya[m] = new Child[X];
でいける。
0845(^-^) ◆MONSOON/qo
2006/09/24(日) 18:32:29普通の意味のとは違うんです
その数字が、数字として意味を持つ上位5桁ということです
0846デフォルトの名無しさん
2006/09/24(日) 18:33:33エラー内容ですが、VC++(環境依存で申し訳ないですが)だと、
メモリ0x00373164でハンドルされていない例外が発生しました。:0xC0000005 場所 0xffffffffを読み込み中にアクセス違反が発生しました
と出ます
このとき、変数の状態を見てみると、oya[0]にはChildクラスのオブジェクトが割り当てられており、本来はoya[0][0]にChildクラスが割り当てられていて欲しいのですが、そうなっていなくて、oya[0][1]へアクセスしようとすると失敗するようです
>>844
そのやり方でできなかったのでご相談しているのですが・・・
ひょっとして、これって一次元配列のやり方として正しいっていうことでしょうか?
さっき配列とだけ書いたので良くなかったですね
僕がしたいのは二次元配列として扱う場合なんです
0847デフォルトの名無しさん
2006/09/24(日) 18:36:29無駄に解りにくいな。
要するに
class Child : public Oya
だとしても
Oya *oya = new Child[X];
はやっちゃ駄目。
配列をポリモーフィックに扱うな
0848デフォルトの名無しさん
2006/09/24(日) 18:39:42まとめてくれてありがとうございます。
配列を扱ってはいけないんですか?
理由がよくわかりませんが・・・
そういうことができるのがオブジェクト指向だと思っているのですが・・・勘違いでしょうか?
0849デフォルトの名無しさん
2006/09/24(日) 18:49:37いい加減にしろ
うざいんだよ
入門書読み直せ糞がき
0850デフォルトの名無しさん
2006/09/24(日) 19:01:07array[i] = *(array + i)
ポインタの加算
sizeof(Oya)とsizeof(Child)
0851デフォルトの名無しさん
2006/09/24(日) 19:23:46なるほど。そういうことだったんですね
ん〜・・・
そうなると、こういう風に二次元配列で派生クラスがいろいろ並んでいる状態を作るってC++ではできないんですか?
Javaだと普通に出来たので、C++でも出来ると思ったのですが
0852デフォルトの名無しさん
2006/09/24(日) 19:29:59ポインタの二次元配列を使え。Java だって参照使ってるんだから同じことだろ?
0853812
2006/09/24(日) 19:35:49>>815さん
わかりやすい説明ありがとうございました
いままで、malloc()でpwork = pchar = malloc(size + 1);のような使い方
をしたことがなく、知識不足でした。
解釈がまちがってたらすいませんが、片方をdeleteしたら、両方のポインタ変数君の居場所
は無くなると思っておきます。
0854デフォルトの名無しさん
2006/09/24(日) 20:06:54用語はちゃんと理解するようにしたほうがいいよ。
この先、本や他の人の話を聞いて勉強するためにも。
>>853が「ポインタ変数君の居場所」をどういう意味で使っているかは分からないが、
ポインタとかポインタ変数というのが pworkと pchar。
ポインタのアドレス(ポインタがメモリ上のどこにあるか、つまり居場所)は &pwork, &pcharで得られる。
deleteで削除するのはポインタ変数の居場所(&pwork, &pchar)ではなく、
ポインタ変数に格納していた値が指す領域(= malloc()で確保した領域)。
>>812の
>pcharとpworkにメモリ割り当てをしているのはなんとなくわかるんですが
これを見ると勘違いしているっぽいが、
mallocするかどうかに関係なく、pcharとpworkはサイズを持った変数としてメモリ上に存在する。
malloc()で確保した領域はこれらとは全く無関係の領域で、その領域の場所を
たまたまpcharとpworkに入れただけ。
絵を描いてみるといいよ。
0855854
2006/09/24(日) 20:09:43書く必要ないと思うけど念のため。
mallocした領域はfreeで、newした領域はdeleteで解放して。
0856デフォルトの名無しさん
2006/09/24(日) 20:11:05かまちゃだめだ。この人、おかしい人なんだからさ。
0857デフォルトの名無しさん
2006/09/24(日) 21:43:150858812
2006/09/24(日) 22:58:57ご忠告ありがとうございます。
malloc()は、C言語で構造体で線形リストや、双方向リストを作るときに
構造体のメンバのポインタ変数に対してや、構造体ポインタにのみにしか使ってなく
まだまだ、経験知識不足でした。
もう一度C言語で抜けている知識を再確認して勉強し直します。
0859デフォルトの名無しさん
2006/09/24(日) 23:03:500860デフォルトの名無しさん
2006/09/24(日) 23:38:180861デフォルトの名無しさん
2006/09/25(月) 00:07:030862デフォルトの名無しさん
2006/09/25(月) 13:01:56char** pchar = new char*[3];
for (int i=0;i<3;i++) pchar[i]= new char[3];
とかで、ヒープに3×3の配列つくると、
pchar[0][0]〜pchar[0][2]は、連続するアドレスに領域確保されますが、
pchar[0][2]と、pchar[1][0]の間は、かなり空きが生じます。
このような空きは、やっぱり、ヒープ領域で非効率な無駄になっているのでしょうか。
別に9個の連続する配列つくっといて、そのアドレスを1次元配列のポインタに代入して
3×3の配列つくったほうが、効率的なんでしょうか。
普通はあんまり気にしなくていいものなんでしょうか?
0863デフォルトの名無しさん
2006/09/25(月) 13:08:14かなり無駄。
0864デフォルトの名無しさん
2006/09/25(月) 13:09:30それよりも分かりやすさ/読みやすさを優先する。
俺は。
0865デフォルトの名無しさん
2006/09/25(月) 13:11:490867デフォルトの名無しさん
2006/09/25(月) 13:17:31実際のプログラムでは、配列はcharでなく、40byteくらいのオブジェクトで、
40×250くらいの配列になります。
0868デフォルトの名無しさん
2006/09/25(月) 13:25:02char** pchar = new char*[3];
pchar[0] = new char[9];
for (int i=0;i<3;i++) pchar[i] = pchar[0] + 3 * i;
たいていの場合、無視出来る無駄。好きにしたら。
0869862
2006/09/25(月) 13:31:01ヒープならあんまり無駄を気にすることもないんですね。
みなさんのご意見参考になりました。
ありがとうございました。
0870デフォルトの名無しさん
2006/09/25(月) 13:58:00p[0 * 0] ~ p[3 * 3]とアクセスすることにすればいいだろ。
0871デフォルトの名無しさん
2006/09/25(月) 14:11:50でもさすがにそれだと読みにくさが勝るですね。
0872デフォルトの名無しさん
2006/09/25(月) 14:16:53inline
T & at(T * p, int len, size_t i, size_t j)
{
return p[i * len + j] ;
}
0873デフォルトの名無しさん
2006/09/25(月) 14:27:08class array_adapter
{
0874デフォルトの名無しさん
2006/09/25(月) 14:28:16class array_adapter
{
public:
T *operator[](int i)
{
};
0875デフォルトの名無しさん
2006/09/25(月) 14:33:57class array_adapter
{
T *array;
public:
array_adapter(T *a) : array(a) {}
T *operator[](int i)
{
return array + X * i;
}
};
0876862
2006/09/25(月) 14:41:00勉強してきます。
0877デフォルトの名無しさん
2006/09/25(月) 22:31:09お勧めの参考書は>>8
0878デフォルトの名無しさん
2006/09/25(月) 23:39:130879デフォルトの名無しさん
2006/09/26(火) 01:59:42今までデストラクタやswapにthrow()と書いていたんだけど、
unexpectedするだけでさほど意味ないんじゃないかと思うようになって。
0880デフォルトの名無しさん
2006/09/26(火) 02:06:30手に入れる方法はございませんか??
参考書等についていたりしませんか??
そういった参考書をお知りでしたら、教えてください。どうかお願いします。
0881(^-^) ◆MONSOON/qo
2006/09/26(火) 02:11:40本屋で探せば見つかるだろうけど
ネットを開通した方が安いし困ったときも便利
0882880
2006/09/26(火) 02:27:37お勧めのサイトありますか??
もう一度がんばってみたいです。
ここで、これを諦めたらだめな気がします。
0883(^-^) ◆MONSOON/qo
2006/09/26(火) 02:31:57無料のコンパイラはVisual Stdioだとおもうよ
これなら書籍でも付いてるとおもう
http://www.microsoft.com/japan/msdn/vstudio/express/
0884880
2006/09/26(火) 02:34:26この中のvisual C++でいいのですか??
0885(^-^) ◆MONSOON/qo
2006/09/26(火) 02:38:38それでいいけど
書籍を購入する程度の入門レベルだと
BCC Developer(とボーランドc++)がお勧めだよ
0886デフォルトの名無しさん
2006/09/26(火) 02:40:400887(^-^) ◆MONSOON/qo
2006/09/26(火) 02:40:51BCC Developerはここ
サイズも小さいし教科書、入門書どおりのプログラムがそのまま動く(Visual C++はそうではない)
http://www.hi-ho.ne.jp/jun_miura/bccdev.htm
0888880
2006/09/26(火) 02:55:26やはりできませんでした・・・。cpadもどこなのかわからないし・・・orz
なんでだろう・・・。本買って始めた方が効率よさそうです・・・。
883にはってある物はどうやってうごかせばいいのですか??
0889(^-^) ◆MONSOON/qo
2006/09/26(火) 02:57:34ちょっと待ってて直リン貼り付けるから
0890880
2006/09/26(火) 03:00:02ほんとうにすいませんorz
0891(^-^) ◆MONSOON/qo
2006/09/26(火) 03:00:24上から順にインストールすれば完了
ftp://ftp.borland.co.jp/pub/cppbuild/freecommandlinetools2.exe
ftp://ftp.borland.co.jp/pub/cppbuild/freecommandlinetools_update.exe
http://www.cmagazine.jp/download/setbcc15b.exe
http://www.hi-ho.ne.jp/jun_miura/download/bccdev1221.lzh
0892デフォルトの名無しさん
2006/09/26(火) 03:04:370893(^-^) ◆MONSOON/qo
2006/09/26(火) 03:04:55http://www.geocities.co.jp/SiliconValley-SantaClara/1908/files/182a/NT2Setup_multi.zip
0894880
2006/09/26(火) 03:11:46ただいま、デスクトップにすべてインストールいたしました。
この次はどうすればいいですか??
0895(^-^) ◆MONSOON/qo
2006/09/26(火) 03:13:09ダウンロードしたって事?
そのあとfreecommandlinetools2.exeなどをクリックして実行
0896880
2006/09/26(火) 03:15:000897(^-^) ◆MONSOON/qo
2006/09/26(火) 03:16:09そのままでいいけど
問題があれば変更も可
0898880
2006/09/26(火) 03:20:26解凍?できました。
次は何をすればいいですか??
0899(^-^) ◆MONSOON/qo
2006/09/26(火) 03:21:52bccdev1221.lzhは解凍して
c:\Program Filesの中にディレクトリ付きで入れる
そのあとBccDev.exeを実行してツール→環境設定でコンパイラを設定すると完了
0900(^-^) ◆MONSOON/qo
2006/09/26(火) 03:22:29setbcc15b.exeまでいきましたか?
0901(^-^) ◆MONSOON/qo
2006/09/26(火) 03:24:40setbcc15b.exeを実行するとディレクトリの中にsetbcc.exeがあるはず
これを実行して指示に従ってください
0902880
2006/09/26(火) 03:25:390903デフォルトの名無しさん
2006/09/26(火) 03:31:31C++とかVBとかC#とかいう以前に、
PCのことある程度知らないとPCのプログラム書くのは無理。
0904(^-^) ◆MONSOON/qo
2006/09/26(火) 03:31:42ディレクトリ = フォルダ
黄色い書類入れのようなアイコンのやつです
0905880
2006/09/26(火) 03:32:03setbcc15bを実行し設定はそのままで実行しましたが
setbccはあったのですが、exeがついてませんがこれでよかったですか??
0906(^-^) ◆MONSOON/qo
2006/09/26(火) 03:35:18それでいいです
0907880
2006/09/26(火) 03:38:31これであとはBccDev.exeとやらを実行すればいいのですか??
あと、こちらのファイルはどこにありますか??
0908デフォルトの名無しさん
2006/09/26(火) 03:40:180909880
2006/09/26(火) 03:46:43すいません。
0910デフォルトの名無しさん
2006/09/26(火) 03:47:110911(^-^) ◆MONSOON/qo
2006/09/26(火) 03:47:18最後にbccdev1221.lzh
(WindowsXPならクリックすると中が見られるはず、違うなら解凍ソフトが必要)
を解凍して>>899の通りに設定すれば完了
>>908
Visual C++2005はコードも(教科書にあるような)普通のが通らないし色々と難しい
0912880
2006/09/26(火) 03:53:45このネジのようなやつですか??
0913デフォルトの名無しさん
2006/09/26(火) 03:56:23この前提がそもそも間違ってる気がするんだがどうよ。
具体的にどんなコードが通らないんだ。
どの本のコードが通らないかがわかるだけでもいいぞ。
0914(^-^) ◆MONSOON/qo
2006/09/26(火) 03:58:54そう、
そしてツール、環境設定、コンパイラの所を
C:\bcc5.5\Bin\bcc32.exe (フォルダが違うかもしれないけど)に設定すればOK
0915880
2006/09/26(火) 04:03:02なんとか環境設定まではできたのですが
今まで使っていたものと違うのですが
どこに文字というか、言語をうてばいいのですか??
0916(^-^) ◆MONSOON/qo
2006/09/26(火) 04:03:37↓これが通らん
#include <stdio.h>
main(){
printf("Hello World!\n");
}
fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?
0917(^-^) ◆MONSOON/qo
2006/09/26(火) 04:07:20ファイル→新規作成→プロジェクト名を適当につける→
再び、ファイル→新規作成→
C/C++ファイルのファイル名で****(適当なファイル名).cpp
を入れてOK
0918デフォルトの名無しさん
2006/09/26(火) 04:07:22まあ、VSのIDEのデフォルトの設定でやると自動的にプリプロセッサが有効になるので通らんな。
というかそのコードはC++として通らないけど。
いくらCでおkったってそういう暗黙の了解の下に成り立っているコードは嫌いだ。
0919デフォルトの名無しさん
2006/09/26(火) 04:07:330920(^-^) ◆MONSOON/qo
2006/09/26(火) 04:11:26いつも使ってたやつがいいならこちらをダウンロードしてください
CPad for Borland C++Compiler
http://www.vector.co.jp/soft/win95/prog/se141451.html
0921880
2006/09/26(火) 04:19:50ほんとなにからなにまでありがとうございました。
あと、スレ違いでしたら本当にすいませんでした。
しかしいつも通りHello,worldを実行しようとしたらエラーがでてしまいましたorz
0922デフォルトの名無しさん
2006/09/26(火) 04:23:42こんなのまでログに残すのか?
0923デフォルトの名無しさん
2006/09/26(火) 04:23:50情報を小出しにしてはいかん。
大抵の場合、見る人が見れば一発でわかるエラーだったりするもんだ。
そんなんで蹴躓くなんてもったいないだろう?
スレ常駐のベテランの手を借りるんだ。
あの変なコテはベテランじゃねーっぽいので放置の方向で。
0924デフォルトの名無しさん
2006/09/26(火) 04:38:470925880
2006/09/26(火) 04:45:03int main(void)
{
printf("Hello, world");
return 0;
}
エラー F1009 c:\documents and settings\\my documents\0\a\aa.cpp: 入力ファイル 'c:\documents and settings\\my documents\0\a\aa.cpp' をオープンできない
*** 1 errors in Compile ***
** error 1 ** deleting Debug\aa.obj
Compile End !! (Elapsed time 0:00.078)
環境はBCC Developerです。
えっと・・すいませせん。なんででしょうか??
0926デフォルトの名無しさん
2006/09/26(火) 04:48:23今は1から10まで全部教えて貰って、やっとの事で環境構築したわけだが。
たかが環境構築で躓く段階で、何も調べる能力が無いことが明らか。
断言してもいいが、このままじゃおまえさんは何も出来はしないぞ。
インスコしたbccだって無駄になるだけだ。
自分の作りたいものに関して、1から100まで全て他人に質問して済ませるつもりか?
0927(^-^) ◆MONSOON/qo
2006/09/26(火) 04:50:54> \\my documents\ ← ここの\\が怪しい
同じような症例がここに
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2035273
0928デフォルトの名無しさん
2006/09/26(火) 04:52:150929880
2006/09/26(火) 04:55:31最初から1〜10まで教えてもらっていたわけではありません。
最初はいろんなホームページを探し回って、きときとさんだったかな??
そのcpadつかっていろいろやってましたが、
途中からエラーがとまらなくなって
また新しくインストールしようと思ったらできなくて
どうしたらいいかわからなくなっていたのでorz
すいません。
0930880
2006/09/26(火) 04:57:05そうです。書き込むのにさすがに本名入ってるのはどうかと思いまして・・・
0931(^-^) ◆MONSOON/qo
2006/09/26(火) 04:59:40日本語が入ってるとBCCがコンパイル失敗する模様
日本語が入ってない場所に保存するとOK
ファイル→新規作成 で日本語でないディレクトリ名に変更する
0932デフォルトの名無しさん
2006/09/26(火) 05:08:180933デフォルトの名無しさん
2006/09/26(火) 06:43:320934デフォルトの名無しさん
2006/09/26(火) 07:09:530935デフォルトの名無しさん
2006/09/26(火) 07:53:25>921で過ちに気付きながら何故未だ居座る。いい加減、BCCスレなりに逝け。
>>931
おまえもだ、この馬鹿珍。
0936デフォルトの名無しさん
2006/09/26(火) 09:19:52イテレータクラスを定義する為のテンプレートって用意されているのでしょうか?
また独自のコンテナもどきのライブラリを作ったときにイテレータを用意する為に
使える便利なテンプレートってあるのでしょうか?
0937デフォルトの名無しさん
2006/09/26(火) 09:47:32>◆MONSOON/qo
>◆MONSOON/qo
>◆MONSOON/qo
>◆MONSOON/qo
0938デフォルトの名無しさん
2006/09/26(火) 09:51:39boost::iterator_facade, boost::iterator_adaptor
本当に何も頼らず1から作るならstd::iterator。最低限必要なtypedefをしてくれるだけ。
0939デフォルトの名無しさん
2006/09/26(火) 09:58:55_, ._
( ゚ Д゚)?
>◆MONSOON/qo
>880
>◆MONSOON/qo
>880
>◆MONSOON/qo
_, ._
( ゚ Д゚)…
0940デフォルトの名無しさん
2006/09/26(火) 10:03:230941デフォルトの名無しさん
2006/09/26(火) 11:09:070942デフォルトの名無しさん
2006/09/26(火) 11:35:270943デフォルトの名無しさん
2006/09/26(火) 11:38:070944デフォルトの名無しさん
2006/09/26(火) 11:56:09operator bool() や operator unspecified_bool_type() としているようですが
このunspecified_bool_typeがメンバ関数のポインタなのはなぜなのでしょうか?
あと、VC++ではoperator unspecified_bool_type()の方が使われましたが
operator bool()でも同じことが出来るようです。
operator unspecified_bool_type()を採用する理由はなんなのでしょうか?
0945デフォルトの名無しさん
2006/09/26(火) 12:22:50(1 + sp) がコンパイルできたら困るだろ。
0946デフォルトの名無しさん
2006/09/26(火) 12:43:40あ、なる。そういう理由だったんですか。
ありがとうございました。
0947デフォルトの名無しさん
2006/09/26(火) 14:25:04これで自作コンテナクラスもどきも
一人前にイテレータを持つことができます。
立派になったもんです。
0948デフォルトの名無しさん
2006/09/26(火) 20:50:54public:
A(){};
};
A *a = new A();
A *b = new A;
この違いってありますか?
0949デフォルトの名無しさん
2006/09/26(火) 21:16:560950デフォルトの名無しさん
2006/09/26(火) 21:27:470951デフォルトの名無しさん
2006/09/26(火) 21:48:430952デフォルトの名無しさん
2006/09/26(火) 21:53:04A A(); のことだろ。
0953952
2006/09/26(火) 21:55:07×:A A();
○:A a();
0954デフォルトの名無しさん
2006/09/26(火) 22:08:11たしかコンパイラがそんな感じの間違いをすることがあるっけ。
0955デフォルトの名無しさん
2006/09/26(火) 22:08:24それと>>951になにか関係あるのか?
A()と全然形が違うじゃないか
0956デフォルトの名無しさん
2006/09/26(火) 22:43:24亀レスだが
例外処理
http://pc8.2ch.net/test/read.cgi/tech/1142667446/
0957デフォルトの名無しさん
2006/09/26(火) 22:45:34組込型なんかでは0初期化をするかどうかという違いがあったはず。
コンストラクタで初期化がないクラスのメンバにも同じことが適用された気がする。
0958デフォルトの名無しさん
2006/09/26(火) 22:54:22でも、この雰囲気好き。
偉そうな文体で、「それくらいしっとけ」みたいな書き込みばっかりで
肝心な質問に対しての答えをかかない、別スレとは大違い。
0959デフォルトの名無しさん
2006/09/26(火) 22:58:300960デフォルトの名無しさん
2006/09/26(火) 23:16:02>>948の場合は(クラスなので)違いはないが(クラス以外だと>>957)
A a; // A型のオブジェクトaの宣言(と定義)
A a(); // Aを返す引数なしの関数aの宣言
のような全く別のものなので、newする時の感覚で常に()をつけていると
(特に他言語から入った人が)たまに間違えたり、
コンパイルエラーが出たりする、ということを言いたいのでしょう。
0961デフォルトの名無しさん
2006/09/26(火) 23:47:23>>957が言ってるのは
class A
{
int i;
};
A *a = new A(); or A;
でiが0初期化されるとか?
0963デフォルトの名無しさん
2006/09/27(水) 00:29:52下記のソースコードを実行しても
ファイルがカキコミできません。
どなたか、ファイルが書き込みできない理由を
教えてください。
void CXfile_MotionReaderDlg::OnButton1()
{
CFileDialog *dlgFile;
dlgFile = new CFileDialog(
TRUE, // 種類 TRUE : FileOpen
_T("jpg"), // デフォルトの拡張子
_T("*.jpg"),// 初期ファイル名
OFN_FILEMUSTEXIST, // ダイアログの設定フラグ:既存のファイル
_T("Wave(*.jpg)|*.jpg|全て(*.*)|*.*||")// フィルタ
);
if(dlgFile->DoModal() == IDOK)
{
CStdioFile fout( "file.text", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary );
fout.WriteString( dlgFile->GetPathName() );
fout.Close();
}
delete dlgFile;
}
0964デフォルトの名無しさん
2006/09/27(水) 00:42:48多分、カレントディレクトリがCFileDialogのダイアログを操作したことで移動してる。
どっかのディレクトリに"file.text"が出来てると思うよ。
0965964
2006/09/27(水) 00:46:26■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0967デフォルトの名無しさん
2006/09/27(水) 01:10:14std::string の c_str() に関してです。
---------------------
std::string str = "hogehoge";
WNDCLASSEX wcex;
wcex.lpszClassName = str.c_str();
……(中略)
RegisterClassEx(&wcex);
上記のような内容で、RegisterClassEx に失敗しました。
ところが、str の内容を変更するだけで、登録に成功したりしなかったりします。
そこで私は、c_str() で渡されたポインタが RegisterClassEx の段階で有効である保証がなく、
上記のような渡し方は間違っている、とのように考えました。
解決法として、char 型の配列に一旦文字列をコピーしています。
ところが、API に string を渡すときなどは、
HogeHogeAPI(str.c_str());
などのように、c_str() の戻り値を直接渡しているサンプルをよく見かけます。
この場合は、返されるポインタが有効であることは保証されるのでしょうか。
また、最初の例のような場合は、char の配列などにコピーする方法は正しいのでしょうか?
よろしくお願いします。
0968デフォルトの名無しさん
2006/09/27(水) 01:18:15string インスタンスが生きてて、変更を加えない限りは有効。
有効なうちに API に渡していれば、 API が内部でポインタを
保存するような仕様でない限り、問題無い。 char 配列へのコピーは不要。
RegisterClassEx() が失敗した原因は GetLastError() で調べるように。
0969デフォルトの名無しさん
2006/09/27(水) 01:22:17その辺りは、APIの実装に大きく依存することになるので詳細はAPIスレでどうぞ。
要は、そのAPIが必要としているものは何かが微妙に異なるのだろう。
0971デフォルトの名無しさん
2006/09/27(水) 10:16:42しかし、プログラムを実行する方法が
VisualC++の開発画面上でコンパイルする方法しか解りません
Windows上でアイコンをクリックして普通のアプリケーションとして起動させるには
どうすればいいのでしょうか?
0972デフォルトの名無しさん
2006/09/27(水) 10:25:32C++ 関係ない。スレ違い。↓こっち逝け。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
その質問内容でそのまま移動しても
「アイコンクリックすればいいんじゃね?」で終了なので、
「やりたいこと」と「やったこと」と「どうなったのか」を全部
正確に書くように。
0973デフォルトの名無しさん
2006/09/27(水) 12:21:460974デフォルトの名無しさん
2006/09/27(水) 12:55:140975デフォルトの名無しさん
2006/09/27(水) 13:24:250976デフォルトの名無しさん
2006/09/27(水) 13:39:49パが正解な気がする
0977デフォルトの名無しさん
2006/09/27(水) 14:13:320978デフォルトの名無しさん
2006/09/27(水) 14:38:420979デフォルトの名無しさん
2006/09/27(水) 14:42:25もしかしなくてもフランス語、
僕の大好きなクラリネット〜♪
って曲の歌詞の一部
0980デフォルトの名無しさん
2006/09/27(水) 14:44:01どういう意味?
0981デフォルトの名無しさん
2006/09/27(水) 14:52:00名詞: 踊り
助動詞: 否定
camarade
名詞: 仲間
0982デフォルトの名無しさん
2006/09/27(水) 14:53:27ttp://www.frmusique.ru/texts/divers/jaimeloignonfrit.htm
0983デフォルトの名無しさん
2006/09/27(水) 14:54:060984デフォルトの名無しさん
2006/09/27(水) 14:57:34I like onion fried with oil
I like onion when it is good.
I like onion fried with oil
I like onion when it is good.
I like onion fried with oil
I like onion when it is good.
I like onion fried with oil
I like onion when it is good.
With the step comrades,
the step comrades,
the step, the step, the step!
With the step comrades,
the step comrades,
the step, the step, the step!
With the step comrades,
the step comrades,
the step, the step, the step!
With the step comrades,
the step comrades,
the step, the step, the step!
One will bore the side to them
One will bore the Rantanplan side to them draws lira Rantanplan
One will bore the side to them Which we will laugh
0985デフォルトの名無しさん
2006/09/27(水) 15:01:420986デフォルトの名無しさん
2006/09/27(水) 15:05:56ここに考察あり
ttp://homepage3.nifty.com/kazano/diary9906b.html
0987デフォルトの名無しさん
2006/09/27(水) 15:34:14タマネギなのかよ!!!!!
あれほど大騒ぎしたその結末が、
タマネギなのか!!!!
もう、絶望した。
0988デフォルトの名無しさん
2006/09/27(水) 15:57:48C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0989デフォルトの名無しさん
2006/09/27(水) 15:59:53CreateFileとかCopyFile等の動作チェック用です。
自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので、探しています。
よろしくおねがいします。
0990デフォルトの名無しさん
2006/09/27(水) 16:00:43まあいいか、お疲れ様です。
0991デフォルトの名無しさん
2006/09/27(水) 16:02:040992デフォルトの名無しさん
2006/09/27(水) 16:02:220993デフォルトの名無しさん
2006/09/27(水) 16:02:370994デフォルトの名無しさん
2006/09/27(水) 16:02:570995デフォルトの名無しさん
2006/09/27(水) 16:03:200996デフォルトの名無しさん
2006/09/27(水) 16:03:400997デフォルトの名無しさん
2006/09/27(水) 16:03:460998デフォルトの名無しさん
2006/09/27(水) 16:03:480999デフォルトの名無しさん
2006/09/27(水) 16:03:571000デフォルトの名無しさん
2006/09/27(水) 16:04:2210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。