C++相談室 part48
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2006/03/15(水) 20:53:15ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
→ テンプレその他 >>1-15 付近参照 ←
前スレ
C++相談室 part47
http://pc8.2ch.net/test/read.cgi/tech/1139931895/l50
0002v(^・^)v
2006/03/15(水) 20:54:042 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003v(^・^)v
2006/03/15(水) 20:54:4817 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/03/15(水) 20:56:1532 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/
46 ttp://pc8.2ch.net/test/read.cgi/tech/1136690107/
0005v(^・^)v
2006/03/15(水) 20:56:48[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://public.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0006v(^・^)v
2006/03/15(水) 21:00:04amazon.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/ (翻訳)
0007v(^・^)v
2006/03/15(水) 21:04:57Effective 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/
0008デフォルトの名無しさん
2006/03/15(水) 21:05:38[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
0009デフォルトの名無しさん
2006/03/15(水) 21:09:55【初心者歓迎】C/C++室 Ver.25【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1140963340/l50
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
C/C++の宿題を片付けます 62代目
http://pc8.2ch.net/test/read.cgi/tech/1141363718/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/
C++/CLI について語ろうぜ Part2
http://pc8.2ch.net/test/read.cgi/tech/1142147319/l50
くだすれC++/CLI(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1142144110/l50
ATL/WTL Part4
http://pc8.2ch.net/test/read.cgi/tech/1134388951/
【雑談】C/C++【その1】
http://pc8.2ch.net/test/read.cgi/tech/1098817686/l50
0010デフォルトの名無しさん
2006/03/15(水) 21:10:260011デフォルトの名無しさん
2006/03/15(水) 21:59:56環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0012デフォルトの名無しさん
2006/03/15(水) 22:02:360013デフォルトの名無しさん
2006/03/15(水) 23:10:25すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
0014デフォルトの名無しさん
2006/03/15(水) 23:11:08とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後氏ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0015デフォルトの名無しさん
2006/03/16(木) 00:18:06というかVSすれに行ってくらはい。
0016デフォルトの名無しさん
2006/03/16(木) 01:40:12新参者を発見しますた。(・∀・)ニヤニヤ
そういやもう春休みの時期かぁ。
0017デフォルトの名無しさん
2006/03/16(木) 07:24:29某厨房板の地鎮祭みたいなものか?
0018デフォルトの名無しさん
2006/03/16(木) 11:22:380019デフォルトの名無しさん
2006/03/16(木) 11:40:190020デフォルトの名無しさん
2006/03/16(木) 12:41:45いいんでしょうか?
サブ関数をまとめたクラスを作って使用もとでフレンド宣言とかでしょうか?
アドバイスよろしく
0021デフォルトの名無しさん
2006/03/16(木) 12:50:47サブ関数とやらは全部適当なnamespaceに放り込んどけ。
0022デフォルトの名無しさん
2006/03/16(木) 12:53:58てけとーなクラス作って、
public static な関数にしてしまえばいいんじゃない?
まぁ >>21 みたく namespace でもいいけどさ。
0023デフォルトの名無しさん
2006/03/16(木) 14:42:17namespace math {
// 数学関係の関数
}
namespace graphics {
// 画像関係の関数
namespace io {
// 画像関係の入出力
}
}
namespace utility {
}
....
}
のようにしてる。適当なnamespaceの中に、用途別のnamespaceがある感じ
002420
2006/03/16(木) 17:09:21家に帰たら挑戦してみます。
0025デフォルトの名無しさん
2006/03/16(木) 18:38:10Javaじゃないんだからw
0026デフォルトの名無しさん
2006/03/17(金) 21:33:22http://pc8.2ch.net/test/read.cgi/tech/1139931895/998
で、ある特定のライブラリ「boost」がその実装を想定していなかったとして
ケツを持ち込む相手は?
# あんた、K さんだろ?
0027デフォルトの名無しさん
2006/03/17(金) 21:38:21亜ふぉで素か?
0028デフォルトの名無しさん
2006/03/17(金) 22:06:54# はー、つまんね
0029デフォルトの名無しさん
2006/03/17(金) 22:34:39いや、俺だって。俺、俺!
0030デフォルトの名無しさん
2006/03/17(金) 23:01:110031デフォルトの名無しさん
2006/03/17(金) 23:11:320032デフォルトの名無しさん
2006/03/18(土) 06:50:08デリートしたオブジェクトポインタは直後にNULLにしといた方が初心者には何かと安心かい?
0033デフォルトの名無しさん
2006/03/18(土) 06:52:020034デフォルトの名無しさん
2006/03/18(土) 06:55:43バグ発覚の可能性を除去するなんて勿体無いとおもう。
0035デフォルトの名無しさん
2006/03/18(土) 07:34:06左辺が、意図したデータを持ってる時の代入か、はたまた初期化の時の単なるゴミデータか判別できませんもんね。
ゴミの時にメソッドなんか呼ぼうもんなら終了ですもんね。
以上、今日の日記。
0036デフォルトの名無しさん
2006/03/18(土) 11:02:56あるいは前置++, --演算子の後置に対する効率上の違いを知ったとき等、
人は十字軍になるものなんだろう。Effective C++にも書いてあるけれど。
何事も行き過ぎはよくないという一例だな。
0037デフォルトの名無しさん
2006/03/18(土) 16:18:16>たいていバグ
じゃなくて、明らかなバグ
でも、delete 後 NUL代入する「信仰」は後を絶たない
何故だろう??
即落した方が、遥かに有用だと思うのだが
0038デフォルトの名無しさん
2006/03/18(土) 16:26:340039デフォルトの名無しさん
2006/03/18(土) 17:05:06delete 自体は問題なくてもデストラクタが複数回呼ばれちゃいかんだろ?
で、デストラクタがあるオブジェクトかどうかでNULLは代入したりしなかったりするのはナンセンスだろ?
0040デフォルトの名無しさん
2006/03/18(土) 17:46:15たとえば、T型へのポインタの配列へのポインタT** ptrをメンバに持ち、要素をクリアするメソッドを定義すると
void clear() {
if (ptr) {
for (int i = 0; i < size(); ++i) delete ptr[i];
delete[] ptr;
ptr = 0;
}
}
このclear()は、もしptrに0を代入していなければ、二度呼び出された時点で不正になる。
要素が存在する場合に限ってclear()を呼び出せるような仕様にするより、
いかなる場合でもclear()は要素をクリアするような仕様の方が、見通しがいいと思う。
if (!my_container.empty()) my_container.clear(); // 要素が空かのチェックつき。こう書くより
my_container.clear(); // こう書けば、要素のあるなしに限らずクリアしてくれる方が、私は嬉しい
ただし、最初のdeleteループでは、各要素に0を代入したりはしない。
すぐ次のdeleteで、各要素にアクセスできなくなるからね。
0041デフォルトの名無しさん
2006/03/18(土) 17:51:57void clear() {
if (empty()) return;
0042デフォルトの名無しさん
2006/03/18(土) 17:59:42代入時にはコピーコンストラクタが呼び出せないのは
簡単にわかるのにっておもいました。
以上C++学習中の今日の日記
0043http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 18:16:580044デフォルトの名無しさん
2006/03/18(土) 18:22:21if(!foo) delete foo;
は
delete foo;
で良いって話。
つまり重複開放も問題ない気がする。
0045デフォルトの名無しさん
2006/03/18(土) 18:26:360046デフォルトの名無しさん
2006/03/18(土) 18:27:53恐ろしい勘違いをしているぞ。
0047デフォルトの名無しさん
2006/03/18(土) 18:30:29ちとMSを尊敬
0048デフォルトの名無しさん
2006/03/18(土) 18:44:13MS のせいだな。 >>45 とか SAFE_〜() とか。
みんな auto_ptr() 使えばこんな議論も要らないのに。
スコープから外れる直前のポインタを delete したときはヌル埋めは不要。
スコープに残ってるポインタを delete したときはヌル埋めは有効。
auto_ptr() がうまく働いてくれる。
0049デフォルトの名無しさん
2006/03/18(土) 19:01:060050デフォルトの名無しさん
2006/03/18(土) 19:04:47結果はきれいさっぱり忘れてしまったが
0051デフォルトの名無しさん
2006/03/18(土) 19:11:44全部インラインで実装できるからパフォーマンスに影響は無いはずなんだけど。
実測して言ってるの? >49
0052デフォルトの名無しさん
2006/03/18(土) 19:13:040053デフォルトの名無しさん
2006/03/18(土) 19:17:120054デフォルトの名無しさん
2006/03/18(土) 19:20:13だから遅くなるかもしれないことは避けるんだお
0055デフォルトの名無しさん
2006/03/18(土) 19:24:07インラインで実装「できる」ことと
インラインで実装「しなければならない」ことは
ちゃんと区別しないと、どこへ行っても文盲扱いされるぞ
0056デフォルトの名無しさん
2006/03/18(土) 19:34:31そんなこと言ってたら標準のテンプレートも boost もほぼ全滅だな。正気か?
0057デフォルトの名無しさん
2006/03/18(土) 19:40:56そういうところでは boost なんてもってのほかだお
0059デフォルトの名無しさん
2006/03/18(土) 19:47:00速度は実測が基本。
原因が明らかになる前にコードを劣化させるなんてもってのほか。
0060デフォルトの名無しさん
2006/03/18(土) 19:47:19一律 delete 並べれば良いだけだから。
0061デフォルトの名無しさん
2006/03/18(土) 19:50:59それも auto_ptr のほうがいいだろ。
0062デフォルトの名無しさん
2006/03/18(土) 19:51:46誰かやれよ
0063デフォルトの名無しさん
2006/03/18(土) 20:06:32> delete 自体は問題なくてもデストラクタが複数回呼ばれちゃいかんだろ?
一つのインスタンスに対してデストラクタが
複数回呼ばれるロジック自体がおかしい、直すべきだと思う
>>40
>>41の通り、あんまし理由になっていない希ガス
>>60
> まあ、deleteの話に戻るが、例外処理で判定すんのが面倒だからNULL代入してるだけ。
ごめん、意味判らない
0064デフォルトの名無しさん
2006/03/18(土) 20:58:11もうそのコードは間違っているという認識だけどな
Boostでdeleteを検索すると
ptr_containerさえ一個もなかったりする
0065デフォルトの名無しさん
2006/03/18(土) 21:06:40もうそのコードは間違っているという
のと同じ論法だな
0066デフォルトの名無しさん
2006/03/18(土) 21:09:46むしろそっちのほうがまだ納得できる理屈なんだが
0067デフォルトの名無しさん
2006/03/18(土) 21:41:21せいぜい、間違ったコードでレスしてくれたまえ
0068デフォルトの名無しさん
2006/03/18(土) 22:15:580069http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 22:29:13もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
そういや64bitにネイティブ対応している2chブラウザてありましたっけ?
0070デフォルトの名無しさん
2006/03/18(土) 23:49:02間違っているような気が……
まあ、パフォーマンス気になる部分をクラスに切り出して、その中でチューニング
するのが程良い妥協案じゃない?
0071デフォルトの名無しさん
2006/03/18(土) 23:50:45それすら嫌なら自分で作れば?
0072デフォルトの名無しさん
2006/03/18(土) 23:52:28数値を取るようなテンプレートを用いたクラスを作成し、継承して利用します。
たまたま2箇所で同じ数値を渡して特殊化した場合、staticメンバが
共有されるのはしょうがないことですか?
文章だけだとわかりにくいので例で。
サイズをTで渡すと、継承したクラスのインスタンス数をカウントし、
そのメモリ容量を返す以下のクラスを考えます。
template <int T> class Count{
public:
static int num;
Count(){num++;}
~Count(){num--;}
static int getmem(){ return num * T;}
};
template <int T> int Count<T>::num = 0;
0073デフォルトの名無しさん
2006/03/18(土) 23:52:45A,Bはサイズが同じ。
class A : public Count<8>{
int i,j;
};
class B : public Count<8>{
long long l;
};
class C : public Count<16>{
long long l,m;
};
int main(int argc,char** argv){
A a1,a2,a3;
B b1,b2;
C c1,c2,c3,c4;
printf("A = %d\n",A::getmem()); //8*3=24を期待
printf("B = %d\n",B::getmem()); //8*2=16を期待
printf("C = %d\n",C::getmem());
}
0074デフォルトの名無しさん
2006/03/18(土) 23:52:51Aは3つ、Bは2つインスタンスがあるので、printfした時は24,16が
表示されて欲しいのに、ともに40が表示されてしまいます。
このような現象を防ぐ方法はありませんか?
(Countが<int T>をとるのではなく、<class T>として<A>や<B>、<C>で特殊化し、
getmemではnum*sizeof(T)なら対応できるのはわかるのですが、
今回はこのCountに相当する部分がライブラリで変更できない)
0075デフォルトの名無しさん
2006/03/19(日) 00:01:57...
++bar;
...
}
void foo2(int hoge){
...
bar*=hoge;
...
}
上記のように、一部分だけ違う関数が必要なんです。
引数が変わり、また非常に多く呼び出される関数なのですが、
重複したコードを書かないようにする、コストの低い良い方法ってないでしょうか?
0076デフォルトの名無しさん
2006/03/19(日) 00:03:02Count が変更できないなら無理。
そのライブラリの設計ミスか、そのライブラリが
想定していない使い方をしてるんだろう。
0077デフォルトの名無しさん
2006/03/19(日) 00:06:44void foo_first(int& bar);
void foo_last(int& bar);
void foo1() { int bar; foo_first(bar); ++bar; foo_last(bar); }
void foo2() { int bar; foo_first(bar); bar*=hoge; foo_last(bar); }
first をコンストラクタ、 last を
007877
2006/03/19(日) 00:08:05first をコンストラクタ、 last をデストラクタとし、
int bar をメンバとするクラスを作るといいかも。
0079デフォルトの名無しさん
2006/03/19(日) 00:14:110080デフォルトの名無しさん
2006/03/19(日) 00:30:04ネストの深い所にあって、前後を分割できないんです・・・
>>79
引数の数や型が違う場合に上手く出来たでしょうか?
ちょっとやってみます。
0081デフォルトの名無しさん
2006/03/19(日) 00:37:48boost::bindなんかを使って引数の数などを揃える。
0082デフォルトの名無しさん
2006/03/19(日) 01:27:58> auto_ptrのパフォーマンスを気にするのなら、そもそもc++を選択しているのが
> 間違っているような気が……
その理論だと、すべて「アセンブラでかけ」という結論になっちゃうよ。
極論房はこれだからダメなんだよ。
ソフト開発に極論はありませんがな。
0083デフォルトの名無しさん
2006/03/19(日) 01:41:180084デフォルトの名無しさん
2006/03/19(日) 01:45:06auto_ptrのパフォーマンスを論じてんのが極論なんだろ。
0085デフォルトの名無しさん
2006/03/19(日) 01:54:24ライブラリが必要なんですね。
とりあえずコピペで行きます。。
0086デフォルトの名無しさん
2006/03/19(日) 01:56:49話はそれからだ
0087デフォルトの名無しさん
2006/03/19(日) 02:00:38てかパフォーマンス以外にもautoptr使いたく無い場面ってあるある
0088デフォルトの名無しさん
2006/03/19(日) 02:01:540089デフォルトの名無しさん
2006/03/19(日) 02:04:48使いたくないって・・どんなんやねん?
0090デフォルトの名無しさん
2006/03/19(日) 02:06:31そんな微妙な最適化などすべきじゃないだろう。
ソースコードを最適化して、
アセンブラレベルで見たら、加算命令がひとつ消えていました。
最適化は成功したようです。
これは違うだろ?
009170
2006/03/19(日) 02:10:38直後の2行は無視ですか。そうですか。
auto_ptrて、標準C++ライブラリでもかなりオーバーヘッドの少ないクラスだよね?
そのオーバーヘッドが気になるなんて、どういうデータ構造にしているんだろう?
プログラムの大半がポインタアクセスになるようなプログラムでもないかぎり、
そんなにひどいことにはならんと思うけど……
#流体シミュレーションとか有限要素解析とか、そっち系かな?
0092デフォルトの名無しさん
2006/03/19(日) 02:15:15http://hp.vector.co.jp/authors/VA022575/c/e/smtptr2.html
http://boost.cppll.jp/HEAD/libs/smart_ptr/smarttests.htm
0093デフォルトの名無しさん
2006/03/19(日) 02:16:09まぁ確かにautoptrの挙動で困る場面ならautoptr使えないようになってるけどな。
0094デフォルトの名無しさん
2006/03/19(日) 02:19:16C++にはいろいろな選択肢がある、というだけだし
0095デフォルトの名無しさん
2006/03/19(日) 02:20:57標準C++ライブラリと比較してオーバーヘッドを語られてもなぁ。
そんな話は意味ないだろ。
0096デフォルトの名無しさん
2006/03/19(日) 02:32:22そっち系なら、生ポインタ推奨なのかな
特殊用途だとは思うけど
0097デフォルトの名無しさん
2006/03/19(日) 02:33:450098デフォルトの名無しさん
2006/03/19(日) 02:34:34業務には使えないが
0099デフォルトの名無しさん
2006/03/19(日) 02:36:10010070
2006/03/19(日) 02:46:09auto_ptrのオーバーヘッドがどの程度か示さずに語られてもなぁ。
そんな話は意味ないだろ。
>96
でしょうね。普通、データ数が物凄いことになるから、データにアクセスするときの
オーバーヘッドがバカにならない……
チューニングの最後の方には変わりないけど、そこまで踏み込まなきゃいけない
ことが多々あるようですね。
0101デフォルトの名無しさん
2006/03/19(日) 02:57:25http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/memory-source.html
0102デフォルトの名無しさん
2006/03/19(日) 07:03:49auto_ptrなんて、生のポインタを使うのとまったく同じなわけだが。
まさか今日び、テンプレートをサポートしていながら、
インライン展開をサポートしていないコンパイラも珍しい。
0103デフォルトの名無しさん
2006/03/19(日) 07:23:32010470
2006/03/19(日) 12:36:24ポインタ自体のオーバーヘッド(ポインタごしのアクセス / 直接アクセスの違い)と
ごっちゃにしていたよ。
auto_ptrとしてのオーバーヘッドはポインタのコピー(移動)ぐらいか。
0105デフォルトの名無しさん
2006/03/19(日) 12:50:540106デフォルトの名無しさん
2006/03/19(日) 12:57:09変わんないんじゃない?
どっちかというと、テンプレートの欠点は
・コンパイル時間の増加
・(externを実装したものが少ないので)ヘッダーに実装詳細まで
含まれるのでゴチャゴチャする
のような気がする
0107デフォルトの名無しさん
2006/03/19(日) 13:23:180108デフォルトの名無しさん
2006/03/19(日) 13:35:16鸚鵡返しは、低能の証だと何度言ったらわかるんだ?
010970
2006/03/19(日) 13:50:15で、auto_ptrのオーバーヘッドってなに?
0110デフォルトの名無しさん
2006/03/19(日) 13:59:38馬鹿
0111デフォルトの名無しさん
2006/03/19(日) 14:01:23禿同。あれをsmart_ptrと名付けなかった連中を誉めたい。
011270
2006/03/19(日) 14:11:56auto_ptrはauto_ptrでsmartだと思うけどね。
あれのおかげでRAIIとか所有権の明確化/移動がやりやすい。
確かに気を付けないと大怪我するけど、それは「C++だから」ということで。
0113デフォルトの名無しさん
2006/03/19(日) 16:37:200114デフォルトの名無しさん
2006/03/19(日) 19:09:58smartっていうなら、boostのshared_ptr見たいなやつだろう。
こっちは、確かにオーバーヘッドがあるけど、目的が違うしね。
0115デフォルトの名無しさん
2006/03/19(日) 19:35:330116デフォルトの名無しさん
2006/03/19(日) 19:57:530117デフォルトの名無しさん
2006/03/19(日) 20:06:22template <template <int> class apply, int n>
struct applier {
enum { value = apply<n>::value }; };
template <int n> struct add {
template <int m> struct result {
enum { value = n + m }; }; };
template <int n, int m>
struct applier_add {
enum { value = applier<add<n>::result, m >::value }; };
int main() { std::cout << applier_add<2,3>::value << std::endl; }
これが VS.net のコンパイルできて g++ 3.4.4 でコンパイルできないのは何ででしょうか?
また、これを g++ でコンパイルできるようにするにはどうしたらよいでしょうか?
g++で出るコンパイルエラーは↓です
main.cpp:11: error: type/value mismatch at argument 1 in template parameter list
for `template<template<int <anonymous> > class apply, int n> struct applier'
main.cpp:11: error: expected a class template, got ` add<n>::result'
0118デフォルトの名無しさん
2006/03/19(日) 20:10:53add<n>::template result
0119デフォルトの名無しさん
2006/03/19(日) 20:20:15add<n>::resultがテンプレートであることは実体化させてみるまで分からない。
だから、「型でもテンプレートでもないもの」と推定される。
型やテンプレートを期待している場合は、それぞれtypenameとtemplateキーワードが必要。
0120119
2006/03/19(日) 20:21:210121デフォルトの名無しさん
2006/03/19(日) 20:32:03おお!通りました!ありがとうございます。
>>119-120
分かりやすい説明、本当にありがとうございます。助かりました。
0122デフォルトの名無しさん
2006/03/19(日) 23:28:49このACDKのコアライブラリがJavaっぽいクラスライブラリで、(acdk::lang::StringBufferとか)
なかなか使えるんじゃないかとおもってるんですが。
0123デフォルトの名無しさん
2006/03/20(月) 09:34:290124デフォルトの名無しさん
2006/03/20(月) 12:56:570125デフォルトの名無しさん
2006/03/20(月) 14:23:320126デフォルトの名無しさん
2006/03/20(月) 15:10:34>C++使いにはJavaっぽいと言われて良さそうだと思う人は少ないのではないかと思う。
それもそうだ。了解です。
0127デフォルトの名無しさん
2006/03/21(火) 03:39:05参照で,アンパサンド 「 & 」 で宣言して
かつ、初期化が必要と知ったのですが
この参照という行為自体
何か、特別な意味合いがあるんでしょうか
学習していくうちに、必要性が出てくるのなら覚えておきたいですが
あまり必要性が無いなら、軽い知識として覚える程度で良いのでしょうか
あと、C言語なら、ポインタなら%pを使ってアドレスがみれて
%xなら16進数等、それぞれの変数に対する表現方法
があるのは自明の理だとおもいますが、C++では、また別の
構文が有るのでしょうか、初心者なので、屁みたいな質問かもしれませんが
できれば教えて頂きたいです
0128デフォルトの名無しさん
2006/03/21(火) 04:05:12ポインタと参照で、おそらく一番違う点は、参照は「常にオブジェクトを指している」ことだ。
この制限があるので、より安全に使えることが期待できる。
int i = 1; // 整数型
int* ptr = &i; // 整数型へのポインタの初期化
int& ref = i; // 整数型への参照の初期化
*ptr = 2; // ポインタを介したアクセス
ref = 3; // 参照を介したアクセス
int* qtr; // qtrの指す先は不定
qtr = 0; // qtrはオブジェクトを指さない(ぬるぽ)
int& ref2; // エラー。参照先が指定されていない
int& ref3 = 0; // エラー。何も指さない参照は許されない
int& ref4 = *qtr; // 酷い例
上記例のように、参照の場合、初期化やアクセスの際に*や&などの記号がつかない。
参照元の完全な別名として扱うことができ、コードがすっきりする。
また、C++では関数は値渡しがデフォルトだが、効率の観点で関数呼び出し時にコピーを作りたくないことがある。
この場合、定数参照渡しが「非常に良く」登場する。
void func(const int& ref) { return ref*2; }
後半の構文云々はprintfの書式指定子のことかな?
出力ストリームへの書式指定は、C++ではマニピュレータを使う。
cout << setw(3) << hex << 25 << endl;
0129デフォルトの名無しさん
2006/03/21(火) 06:59:47そう思っていた時期が俺にもありました
0130デフォルトの名無しさん
2006/03/21(火) 07:10:05そう思っていた時期が俺にもありました
0131デフォルトの名無しさん
2006/03/21(火) 07:31:11にもかかわらず、参照が TCPL の初版からあったのは "強い理由" があったからに他ならない
0132デフォルトの名無しさん
2006/03/21(火) 08:38:24C++には動的配列拡張するCのreallocに対応する関数ってある?
0133デフォルトの名無しさん
2006/03/21(火) 08:48:29new で確保した領域を拡張する操作は無い。
かわりに std::vector を使うのが正解。
0134デフォルトの名無しさん
2006/03/21(火) 08:55:28int x;
struct Y {
int y1, y2;
} y;
int z;
};
こういう構造体があるとき、C *p; に対して
printf("%d\n", p->x);
printf("%d\n", p->y.y1);
printf("%d\n", p->y.y2);
printf("%d\n", p->z);
を for 文で書けないでしょうか?
0135デフォルトの名無しさん
2006/03/21(火) 09:03:03いちおう書けるよ。余計なものがいっぱい付いてくるけど。
0136デフォルトの名無しさん
2006/03/21(火) 09:04:470137135
2006/03/21(火) 09:05:370138デフォルトの名無しさん
2006/03/21(火) 09:14:53size_t const offset_to_int[4] とか、
boost::function<int& (C&)> int_by_index[4] とか。
offsetof(C, y.y1) って有効だっけ?直接のメンバしかだめ?
0139デフォルトの名無しさん
2006/03/21(火) 09:21:49実際はメンバがもっと多くて処理も複数行に渡ってる、つまり
DoSomething1(p->Member1);
DoSomething2(p->Member1);
DoSomething1(p->Member2.SubMember1);
DoSomething2(p->Member2.SubMember1);
DoSomething1(p->Member2.SubMember2);
DoSomething2(p->Member2.SubMember2);
DoSomething1(p->Member3);
DoSomething2(p->Member3);
// ... まだまだ続く
みたいになっていて、一見しただけでは処理したいもの全部に
対して本当に処理しているのが分からないからです。これが例えば
int table[] = {C::Member1,C::Member2::SubMember1,C::Member2::SubMember2,...};
for (int i = 0; i < n; ++i) {
DoSometiong1(p.table[i]);
DoSometiong2(p.table[i]);
}
みたいに書ければ見通しがよくなるのですが。
0140デフォルトの名無しさん
2006/03/21(火) 09:30:26よしわかった。
じゃぁまずは offsetof 使ったやつを。
C が POD 限定になるうえに offsetof(C, y.y1) が怪しいが、
とりあえず >>134 の C についてコンパイルと実行はできた。
void print(C* p)
{
static size_t const offset_to_int[4] = {
offsetof(C, x),
offsetof(C, y.y1),
offsetof(C, y.y2),
offsetof(C, z),
};
for(int i = 0; i < 4; ++i)
{
printf("%d\n", *reinterpret_cast<int*>(reinterpret_cast<char*>(p) + offset_to_int[i]));
}
}
0141デフォルトの名無しさん
2006/03/21(火) 09:36:52http://pc8.2ch.net/test/read.cgi/tech/1142741989/
0142デフォルトの名無しさん
2006/03/21(火) 09:48:420143デフォルトの名無しさん
2006/03/21(火) 10:03:33#include <iostream>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/casts.hpp>
struct C {
int x;
struct Y {
int y1, y2;
} y;
int z;
};
int main()
{
C c = {
1,
{2, 3},
4
};
using boost::lambda::bind;
using boost::lambda::_1;
boost::function<int (const C&)> arr[] = {
bind(&C::x, _1),
bind(&C::Y::y1, bind(&C::y, _1)),
bind(&C::Y::y2, bind(&C::y, _1)),
bind(&C::z, _1),
};
for (int i = 0; i < 4; ++i)
std::cout << arr[i](c) << std::endl;
return 0;
}
0144デフォルトの名無しさん
2006/03/21(火) 10:05:52union Hoge
{
C Foo;
int Bar[4]
};
0145デフォルトの名無しさん
2006/03/21(火) 10:08:46これを >>140 に最適化してくれるコンパイラがあれば神なんだが。
と思ってとりあえず iostream を cstdio に置き換えてから
gcc にアセンブリ吐かせてみたが、悶絶した。駄目だ。
0146デフォルトの名無しさん
2006/03/21(火) 10:11:38Hoge x に対して &x.Bar[1] == &x.Foo.y.y1 が成り立つと証明できる?
構造体のほうにはパディングが入る可能性があるからダメだと思うんだけど。
0147デフォルトの名無しさん
2006/03/21(火) 10:15:220148デフォルトの名無しさん
2006/03/21(火) 10:26:580149デフォルトの名無しさん
2006/03/21(火) 10:30:36メンバー関数用意しろ。
0150デフォルトの名無しさん
2006/03/21(火) 10:50:19それ使ってコード生成したら?
0151デフォルトの名無しさん
2006/03/21(火) 10:53:26そうすりゃalgorithmも適用できるから2重にお得
#include<iostream>
struct C {
int x;struct Y {int y1, y2;} y;int z;
struct iterator{
C*c;int&(**pos)(C*);
explicit iterator(C*c,int&(**pos)(C*)):c(c),pos(pos){}
int&operator*(){return (*pos)(c);}iterator&operator++(){++pos;return*this;}
friend bool operator!=(iterator a,iterator b){return a.c!=b.c||a.pos!=b.pos;}
};
iterator begin();
iterator end();
};
namespace{int&Cx(C*c){return c->x;}int&Cy1(C*c){return c->y.y1;}
int&Cy2(C*c){return c->y.y2;}int&Cz(C*c){return c->z;}
int&(*table[])(C*)={Cx,Cy1,Cy2,Cz};}
C::iterator C::begin(){return C::iterator(this,table);}
C::iterator C::end(){return C::iterator(this,table+sizeof(table)/sizeof(table[0]));}
int main()
{
C c = {1,{2, 3},4 };
C::iterator it = c.begin(),end=c.end();
//for_each + ostream_iteratorでも可
for (;it != end;++it)
std::cout << *it << std::endl;
return 0;
}
0152デフォルトの名無しさん
2006/03/21(火) 11:10:15すでにビット的定数性のないクラスなんていくつも出てきたし、
スレッドセーフとか言うわけでもないし、なんのためにがんば
ってconstつけてんだかわかんねー。
唯一、
void f(const string& s)
とかで
operator動かせて、f("hoge")って呼べるくらいしか
思いつかない。
0153デフォルトの名無しさん
2006/03/21(火) 11:23:12うっかり書き換えてしまうのを防ぐことができるじゃないか。
いつの間にか const スレが落ちてるのに気づいた。
0154デフォルトの名無しさん
2006/03/21(火) 11:26:14void f(const string &s);
だと、
f(s);
としたときに、sの値が変わらないことが保証される。
「値が変わらない」の正確な意味は型によるけど、
たとえ内部表現が変わっても観測可能な振舞は変わらないように
const性が定義されてることを期待できる。
これで十分じゃないか?
0155デフォルトの名無しさん
2006/03/21(火) 11:29:55手間がかかりすぎる気がするなあと。
stlもconst_iteratorとかさ・・。もう疲れたよ。
全てつけるのやめるとすると、上の以外なんか問題ってあるん
だったっけ?
0156デフォルトの名無しさん
2006/03/21(火) 11:36:31静的な定数テーブルがプロセス間で共有できない。
または ROM に配置できない。
0157デフォルトの名無しさん
2006/03/21(火) 11:37:34constスレとカンマスレを偲ぶ人多いね。
良スレだったってことですね。
0158デフォルトの名無しさん
2006/03/21(火) 11:43:44ほら、保障っつってもさ、const_cast程度で外されちゃうし、
大した保障じゃないなら、もう
void f(string &s);
でいいんじゃないのかなーとか思うんだよね。そうするとさ、
void getHoge() const{}
これは意味的定数性だからconstにして、メンバはmutableつけて
対策してと・・とか色々考えるのから開放されるしさ。
そもそもきっとconst導入した人は、ビット的定数性なんて問題を
想定してなかったような気がするし、そうするともう役目を終えてる
というか、なんかほとんど効力がない機能のような気がするんだよなあ。
0159デフォルトの名無しさん
2006/03/21(火) 11:52:250160デフォルトの名無しさん
2006/03/21(火) 11:56:510161デフォルトの名無しさん
2006/03/21(火) 12:00:430162デフォルトの名無しさん
2006/03/21(火) 12:35:25値セマンティクスのクラスにはconstをしっかり考えてやるべきだけど、
参照セマンティクスのクラスはあまりconstを考える必要はない。
というのをどこかで読んだ覚えがある。
0163デフォルトの名無しさん
2006/03/21(火) 14:28:47>>151
C は自分で作ったクラスではないので、いじらずに済ませたいのです。
Interface Pattern はアリですが、もっとシンプルなのが無いかと思いまして。
>>150
C++ の範囲内でやる方法は無いですかねえ。
0164デフォルトの名無しさん
2006/03/21(火) 14:38:230165デフォルトの名無しさん
2006/03/21(火) 18:38:02>const_cast程度
程度じゃねえよ、const_castは実装のための最後の手段の1つで、
そうホイホイ使うような物じゃないだろ。
constは単純なread onlyインターフェイスを生成する手段の一つだと思ってる。
read onlyインターフェイスが要らないクラスなら、無くてもいいんじゃね。
0166デフォルトの名無しさん
2006/03/21(火) 19:06:120167デフォルトの名無しさん
2006/03/21(火) 19:16:39と、途方にくれるな
0168デフォルトの名無しさん
2006/03/21(火) 20:24:55class Hoge
{
public:
const_reference operator [](std::size_t i) const {/* 〜 */}
refernece operator [](std::size_t i) {return const_cast<reference>(static_cast<const Hoge&>(*this)[i]);}
};
0169デフォルトの名無しさん
2006/03/21(火) 21:49:36こっちのがよくね?
reference operator [](std::size_t i);
const_reference operator [](std::size_t i) const {return const_cast<Hoge&>(*this)[i];}
0170デフォルトの名無しさん
2006/03/22(水) 00:14:24コンストラクタで、メンバーイニシャライザで初期化するには
どうすればよいでしょうか?
0171デフォルトの名無しさん
2006/03/22(水) 00:16:17できません。
0172デフォルトの名無しさん
2006/03/22(水) 00:17:10んですね。ありがとうございました。
0173デフォルトの名無しさん
2006/03/22(水) 00:50:14ちょっと、言い方がおかしかったかも。
constの価値がないと言ってるんじゃなくて、概念的定数性の存在価値は
あるのかってことを言いたかった。
Java的に言うとimmutableパターンによるスレッドセーフなオブジェクトと
シャローコピー時のデータ汚染の回避みたいなメリットが、概念的定数性
だとmutableによって、当然どっちも失われるわけだから、苦労する意味は
いったいあるのか?みたいなことを言いたかった。
0174デフォルトの名無しさん
2006/03/22(水) 01:14:34bar();
{
static int si = 123;
return si;
}
}
みたいなC++の関数があるとして、si用のメモリが123に初期化されるのは
どのタイミングでしょうか?
1 プログラムが実行開始した瞬間
2 main関数到達前
3 foo関数初回呼び出し直後
4 変数siの存在するブロックに初回に入ろうとする時
くらいの候補があると思うのですが。手持ちのコンパイラでは1でしたが、
標準で保障されているのがどこまでかが知りたいです。
0175デフォルトの名無しさん
2006/03/22(水) 01:17:00その言い方だと mutable さえ使わなければ挙げてるメリットが得られるんだろ?
十分だと思うなぁ。
なんで mutable の使用が前提になってんの?
0176デフォルトの名無しさん
2006/03/22(水) 01:24:29大抵はデータセグメントに配置されて、プログラムロード時に初期値が設定されるんじゃねーの?
0177デフォルトの名無しさん
2006/03/22(水) 01:26:41POD 型のローカル static オブジェクトが定数式で初期化される場合、
プログラムが初めてブロックに入る前に初期化されていればいつでもいい。
6.7 -4-
ttp://www.kuzbass.ru/docs/isocpp/stmt.html#stmt.dcl
0178174
2006/03/22(水) 01:32:41ども。クロスプラットフォームなコードを書いている関係で、「PODなロー
カルstaticオブジェクトの定数式による初期化」がスレッドセーフに行わ
れるかどうかを気にしているのですが、スレッドが絡むと標準仕様では何
ともいえないですかね・・・。
0179デフォルトの名無しさん
2006/03/22(水) 01:54:22大丈夫、どのスレッドかは兎も角、どれかのスレッドで最初に実行されるまでには
初期化されている。
まぁ、volatileつけないとどの道まともに扱えないわけだが。
0180デフォルトの名無しさん
2006/03/22(水) 01:56:04GCC 4.0 の変更点 http://gcc.gnu.org/gcc-4.0/changes.html に挙げられていた
リンクからたどった、関係ありそうな記事へのリンクを貼っておく。
http://www.codesourcery.com/cxx-abi/cxx-closed.html#G4
あんまりしっかり読んでないけど、とりあえず
いろいろがんばってる人たちが居るのはわかった。
「POD なローカル static オブジェクトの定数式による初期化」に限れば、
わざわざ初期化を遅らせるメリットも無いと思うんで、おおかたの実装で
グローバルなのといっしょにまとめて初期化されるだろうね。
ところでクロスプラットフォームでスレッドを扱うなら、使ってるスレッドライブラリに
ここらへんの問題に対処する道具があったりしないかな?
0181デフォルトの名無しさん
2006/03/22(水) 02:04:36いや、何の前提も加えずに大丈夫とは言えないだろう。
現行の規格ではスレッドについて何の言及も無いわけで、
規格に準拠したコンパイラがスレッドを考慮したコード生成を行うとは限らない。
0182デフォルトの名無しさん
2006/03/22(水) 02:12:18そうだっけ?
確か大抵の実装は関数に入る際にフラグをチェックして
初回ならば、コンストラタを呼び・・みたいに展開されるので
マルチスレッドの場合はコンストラクタが2度呼び出されるので
危険だったような・・
だとすればPODの場合もアウトなので、その関数はまずシングル
スレッドで一度呼び出されていないとまずくなると想定していて、
俺は怖いのでそうしてる。
0183182
2006/03/22(水) 02:20:06http://gcc.gnu.org/gcc-4.0/changes.html
The compiler now uses the library interface specified by the
C++ ABI for thread-safe initialization of function-scope static
variables. Most users should leave this alone, but embedded
programmers may want to disable this by specifying -fno-threadsafe-
statics for a small savings in code size.
gcc4.0はfunction-scope staticはthread-safeを保障しているみたい
VCはどうかな
0184182
2006/03/22(水) 02:36:28概念的定数性ってメンバにキャッシュ処理的なことしてる場合に
GetHoge()とかがメンバを変えるけど、意味的にはconstって
ことだろ?
class A{public:
void GetHoge() const{a_ *= 2; return a_;}
mutable int a_;
};
でも、constにしたいからメンバをmutableにするって理解
だったが・・、なんか違うかな?
んで、結局GetHogeはスレッドセーフじゃないし、immutable
オブジェクトにもならないからメリットはなんだ?という
ことを考えたが。
0185デフォルトの名無しさん
2006/03/22(水) 03:00:39mutable を使えばそうなる。あたりまえ。
それは const の機能について「ほとんど効力がない」という理由にはならないだろ。
結局は、キャッシュや遅延評価を装備したオブジェクトから値を取り出す
メンバ関数に const 付けて mutable 使うか、非 const メンバ関数にしてしまうか
という2択で迷ってるだけじゃないの?
0186デフォルトの名無しさん
2006/03/22(水) 04:29:01>それは const の機能について「ほとんど効力がない」という理由には
>ならないだろ。
いや、だからそれは173で訂正してると思う・・
> 結局は、キャッシュや遅延評価を装備したオブジェクトから値を取り出す
> メンバ関数に const 付けて mutable 使うか、非 const メンバ関数にしてしまうか
> という2択で迷ってるだけじゃないの?
Yes。けど、"ただ"と言えるほど簡単な話ではないと思う。(EffectiveC++
で筆者は両者の方法は哲学的問題と言ってるが)。そして、今のところ自他
ともスマートな解決方法は聞いたことがない。
185はどっちの立場でやってる?
0187デフォルトの名無しさん
2006/03/22(水) 04:32:270188デフォルトの名無しさん
2006/03/22(水) 05:10:020189デフォルトの名無しさん
2006/03/22(水) 06:14:22多分,下の2つのスレのことかと思われ.いずれも dat 落ち.
【C++】 const だけでメシが3杯食えちゃうスレ
http://pc8.2ch.net/test/read.cgi/tech/1078193971/
【C】カンマ演算子を極めるスレ【C++】
http://pc8.2ch.net/test/read.cgi/tech/1112011590/
0190デフォルトの名無しさん
2006/03/22(水) 07:21:33>まぁ、volatileつけないとどの道まともに扱えないわけだが。
kwsk
0191174
2006/03/22(水) 07:45:15ので問題ないですね。しかし、MS/Sun/HP/Intel/..のコンパイラだとどうな
の?というのが気になっている&コンパイラ買えないという感じです。
local staticは諦めて、
static int si = 123;
int foo() {
bar();
return si;
}
にすればOKでしょうか。
0192デフォルトの名無しさん
2006/03/22(水) 07:51:000193174
2006/03/22(水) 08:02:43http://www.kuzbass.ru/docs/isocpp/basic.html#basic.start.init
を見るに外なら"static initialization"が行われるそうですが、
ほんとに実装依存?
0194デフォルトの名無しさん
2006/03/22(水) 09:18:28関数オブジェクトに汁
0195174
2006/03/22(水) 09:26:19すみません、もうちょい具体的に・・・
0196デフォルトの名無しさん
2006/03/22(水) 09:29:220197デフォルトの名無しさん
2006/03/22(水) 09:56:18http://www.google.co.jp/search?hl=ja&q=%22%E9%96%A2%E6%95%B0%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%22&lr=
0198デフォルトの名無しさん
2006/03/22(水) 09:59:30template <typename A,typename B>inline char *binary_pack(const std::map<A,B> &src,char *from)
{
*((int*)from)=(int)src.size();
from+=4;
for(std::map<A,B>::const_iterator i=src.begin();i!=src.end();i++)
from=binary_pack(*i,from);
return from;
}
という関数を作ったのですがg++(gcc3.4.4/FC4)で通らなくて困ってます。
エラー内容はiteratorのiが定義されてないということらしいのですが、
VC++7やgcc3.2.4あたりでは通ったり(警告でる)します。
同じ関数名でいくつか似たような機能のものを複数多重定義してますが、
mapでないvectorのiterator作ろうとしてもエラーでてしまいます。
-fno-implicit-templatesのようなオプションも無駄でした
(http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Invoking%20GCCより。
たぶんiteratorの定義方法が正確ではないのかなと思ってるんですが
エラーの対処方法詳しくわかる方居たらご教授願えないでしょうか?
0199デフォルトの名無しさん
2006/03/22(水) 10:05:12かな
0200198
2006/03/22(水) 10:10:32typenameつけたらwarningもでなくなり通るようになりました。
0201デフォルトの名無しさん
2006/03/22(水) 10:10:41本当にコンパイル通ったのか?
再帰の実引数 *i は map の const_iterator が指し示す先で
再帰の仮引数 src は map そのものへの参照やんけ
0202デフォルトの名無しさん
2006/03/22(水) 10:22:050203デフォルトの名無しさん
2006/03/22(水) 10:33:43多重定義だろ。
0204デフォルトの名無しさん
2006/03/22(水) 10:54:35VC8のビルドは、configure.batを走らせてからでないとビルド出来ない。
多分もう誰でも知ってると思うけど、一応初心者用に書いておきます。
0205デフォルトの名無しさん
2006/03/22(水) 10:54:560206185
2006/03/22(水) 12:36:58> いや、だからそれは173で訂正してると思う・・
ごめん。見落としてた。
よく考えると、概念的 const のせいで苦労が増すというのがおかしいと思う。
スレッドセーフが必要なら、どのみち値の算出(〜設定)に同期が要る。
クラスが内部でやらなければ利用者に責任が押し付けられることになる。
シャローコピーしたところで概念的に const でさえあればデータ汚染にはならない。
>>184 の例がまずいのは、繰り返し GetHoge() を呼び出すだけで値が変わっていくから。
一般的なキャッシュ、遅延評価の実装では他の非 const 操作が行われるまで
外部に返される値は変わらない。この場合、他に非 const 操作がなければ
Immutable オブジェクトとしての性質を満たし得るだろう。
先にインターフェースを考えて、実装段階でキャッシュが必要になることを考えると、
immutable を使った概念的 const も妥当だと思う。
0207デフォルトの名無しさん
2006/03/22(水) 15:10:380208デフォルトの名無しさん
2006/03/22(水) 15:20:22今の定義で十分に対応可能だし
0209デフォルトの名無しさん
2006/03/22(水) 15:21:34禿もそういってるし
0210デフォルトの名無しさん
2006/03/22(水) 15:31:520211デフォルトの名無しさん
2006/03/22(水) 19:01:380212デフォルトの名無しさん
2006/03/22(水) 20:22:270213デフォルトの名無しさん
2006/03/22(水) 21:44:54共用体なので問題ないと思っていたのですが、何が問題なのでしょうか。
#include <iostream>
using namespace std;
union bits{
bits(double n);
void show_bits();
double d;
unsigned char c[sizeof(double)];
};
bits::bits(double n){
d = n;
}
void show_bits(){
int i, j;
for(j = sizeof(double) - 1; j >= 0; j--){
cout << "ビットパターン/Byte" << j << ": ";
for(i = 128; i; i >>= 1)
cout << i & c[j] ? "1" : "0";
cout << endl;
}
}
int main(){
bits ob(1991.829);
ob.show_bits();
return 0;
}
0214デフォルトの名無しさん
2006/03/22(水) 22:03:15なんでshowのほうにbits::ねえんだよ
あとi&c[j]は括弧でくくれ、優先順位が違う
0215デフォルトの名無しさん
2006/03/22(水) 22:11:38すごい単純ミスですいません。
ありがとうございました。
0216デフォルトの名無しさん
2006/03/22(水) 22:17:44boostじゃだめなの?
0217デフォルトの名無しさん
2006/03/23(木) 02:30:020218デフォルトの名無しさん
2006/03/23(木) 02:32:06変数への読み書きが「副作用」とみなされ、最適化で削除されなくなる。
また、 const と同様にオーバーロードに使われる。
0219デフォルトの名無しさん
2006/03/23(木) 02:37:42ちなみに所謂cv修飾のvなのでconstがつけれるとこならどこにでもつけれる。
# c は const
0220デフォルトの名無しさん
2006/03/23(木) 02:42:14と考えると、実際どういう場合につけるべきなのか
難しいですね。一時変数は別に不要だとわかりますが
クラスのメンバー変数は全部つけないといけなくなるのかな
0221デフォルトの名無しさん
2006/03/23(木) 03:04:13コードから見ていつ変わるかわからん変数やオブジェクトにつけるべし。
具体例をあげると複数のスレッドから変更される変数やオブジェクトとか
メモリマップドI/Oなんかに対してつける。こういった変数やオブジェクトに
アクセスする時に最適化が効いてるととんでもないことになる。
大変なことになる一例をあげると下のコードで hoge をどっかスレッドがfalseにしても
最適化が効いちゃってると無限ループになっちまう。これを避ける為には hoge を volatileで修飾すべし!
bool hoge = true;
void hige() {
while(hoge);
}
0222デフォルトの名無しさん
2006/03/23(木) 03:36:43削除されるのは変数じゃなくて、変数への読み書きだぞ。
メンバー関数に全部つけるとか、ただの糞コードに他ならない。
0223デフォルトの名無しさん
2006/03/23(木) 08:48:56f(void* p);
ってふうになってるケースがあるからこれらを呼び出す時にconstキャストは多々つかいますわ。
0224デフォルトの名無しさん
2006/03/23(木) 08:50:20何言ってんの?
0225デフォルトの名無しさん
2006/03/23(木) 09:04:30C 用に設計されたコールバックなどの汎用引数には
ほとんど void* が引数として使われるので、そこに
const T* を渡そうと思ったら const_cast が必要になる。
ってことだと思われ。
0226デフォルトの名無しさん
2006/03/23(木) 10:07:45>最適化で削除されたくない
^^^^
必ずしも削除じゃないよ
普通に文脈解釈したときの意味が変わるような削除まで無限に許しているわけじゃない
本当に厳密なタイミングが必要な箇所だとか、a -= 0; みたいに意味なさそうに見える箇所だとか、
本来ならアセンブラで書くような性格を含んでいるところに、取扱注意と書いておくだけ
>>222
メンバ関数全部に throw() をつけるたり
非静的メンバ関数全部に virtual をつけたり
基底指定子全部に public をつけたり
C++ ってデフォが糞なの結構あるね
0227デフォルトの名無しさん
2006/03/23(木) 10:12:18ではデフォルトで全ての変数をvolatile扱いしてほしいということですか。
0228デフォルトの名無しさん
2006/03/23(木) 10:26:08必要な箇所に必要なキーワードを置くことにいやも好きもない
俺はドライに割り切ってるが、糞という表現がでてきたんで言い出したらキリねえぞってだけ
0229デフォルトの名無しさん
2006/03/23(木) 10:51:310230デフォルトの名無しさん
2006/03/23(木) 11:10:320231デフォルトの名無しさん
2006/03/23(木) 12:34:360232デフォルトの名無しさん
2006/03/23(木) 15:24:49#include <iostream>
using namespace std;
template <class T>
class coord {
T x,y;
public:
coord(T i, T j) { x=i; y=j; }
friend ostream &operator<<(ostream &stream, coord ob);
friend ostream &operator>>(istream &stream, coord &ob);
};
template <class T>
ostream &operator<<(ostream &stream, coord<T> ob)
{
stream << ob.x << ' ' << ob.y << endl;
return stream;
}
template <class T>
istream &operator>>(istream &stream, coord<T> &ob)
{
stream >> ob.x >> ob.y;
return stream;
}
int main()
{
coord<int> i_ob(1,2);
cout << i_ob << endl;
return 0;
}
こういうコードコンパイルしたら「外部シンボルoperator<< ... が未解決」と怒られました。
どこを訂正すべきでしょうか?
0233デフォルトの名無しさん
2006/03/23(木) 15:37:30#include <iostream>
using namespace std;
template <class T> class coord;
template <class T> ostream &operator<<(ostream &, coord<T>);
template <class T> istream &operator>>(istream &, coord<T> &);
template <class T>
class coord {
T x,y;
public:
coord(T i, T j) { x=i; y=j; }
friend ostream &operator<< <T>(ostream &stream, coord ob);
friend istream &operator>> <T>(istream &stream, coord &ob);
};
0234デフォルトの名無しさん
2006/03/23(木) 15:47:10T x,y;
public:
coord(T i, T j) { x=i; y=j; }
- friend ostream &operator<<(ostream &stream, coord ob);
- friend ostream &operator>>(istream &stream, coord &ob);
+ template <typename U> friend ostream &operator<< (ostream &stream, coord <U> ob);
+ template <typename U> friend ostream &operator>> (istream &stream, coord <U> &ob);
};
-template <class T>
-ostream &operator<<(ostream &stream, coord<T> ob)
+template <typename U>
+ostream &operator<<(ostream &stream, coord<U> ob)
{
stream << ob.x << ' ' << ob.y << endl;
return stream;
}
-template <class T>
-istream &operator>>(istream &stream, coord<T> &ob)
+template <typename U>
+istream &operator>>(istream &stream, coord<U> &ob)
{
stream >> ob.x >> ob.y;
return stream;
0235デフォルトの名無しさん
2006/03/23(木) 17:26:23メンバテンプレート使うと、BCC5.8.1では「このコンテキストでは<<が
曖昧です」とか言われる。BCCのバグらしい。
gcc3.4.2(MinGW)、VC8ではちゃんと通る。
0236デフォルトの名無しさん
2006/03/23(木) 19:58:46// --- fig1 ---------------------------
template <typename T> struct X {
template <typename U> friend void f(X<U>&)
{
X<int> a;
a.y = 0;
}
private:
int y;
};
main()
{
X<void> x;
f(x);
}
この場合、
・Borland 5.5.1 は private のみを問題視
・g++ 4.1.0 は X<void> で宣言された f と X<int> で宣言された f が曖昧と言ってくる
俺は g++ に賛成
0237デフォルトの名無しさん
2006/03/23(木) 19:59:06// --- fig2 ---------------------------
template <typename T> struct X {
friend void g(X<T>&)
{
X<int> a;
a.y = 0;
}
};
main()
{
X<void> x;
g(x);
}
この場合、
・Borland 5.5.1 は X<void> で宣言した friend 権限は、X<int> には及ばないと言ってくる
・g++ は何も言ってこない
俺は Borland に賛成
0238デフォルトの名無しさん
2006/03/23(木) 20:11:320239デフォルトの名無しさん
2006/03/23(木) 21:22:47fig 2の方は何がしたいか分からんのだが。
0240デフォルトの名無しさん
2006/03/24(金) 00:22:11DQN発見..というのは言い過ぎかもしれないが..痛い。
別のスレッドがその変数に触るなら、mutexなりcritical sectionなり
で排他制御するのが正しい。もしそれを省略してlock-freeなアルゴ
リズムを採用したいのなら、volatileではなくメモリバリアを使え。
0241デフォルトの名無しさん
2006/03/24(金) 00:24:55片方はコンパイラ向けで、片方はCPU向けでそ?
0242240
2006/03/24(金) 00:32:28渡した場合について調べてみれ。
0243デフォルトの名無しさん
2006/03/24(金) 00:44:590244デフォルトの名無しさん
2006/03/24(金) 01:31:370245デフォルトの名無しさん
2006/03/24(金) 01:36:20volatile が必要になるようなケースで、volatile を書かずにメモリバリアを入れても駄目でそ。
っていうかメモリバリアってSMPじゃないと意味ないし。volatileはスレッドや割り込み処理でも
有効に使える・・というか正しく使わなくてはならない。
0246デフォルトの名無しさん
2006/03/24(金) 01:40:460247デフォルトの名無しさん
2006/03/24(金) 01:49:01DQN発見..というのは言い過ぎかもしれないが..痛い。
mutexなりcritical sectionなりを使ってもvolatileを使わなければ
コンパイラの最適化で無限ループになっても文句は言えない。
0248デフォルトの名無しさん
2006/03/24(金) 02:13:16>mutexなりcritical sectionなりを使ってもvolatileを使わなければ
>コンパイラの最適化で無限ループになっても文句は言えない。
え??
0249デフォルトの名無しさん
2006/03/24(金) 02:55:29さすがにグローバル変数の場合には volatile なしでも関数呼び出しの前には
値をストアするだろうし、後で参照すれば値をロードしなおすコードが出る出祖。
auuto 変数の場合にはコンパイルオプションによってはロードしなおさないコードが
でることもあるかもしれない。この場合には明示的な volatile が必要か。
0250デフォルトの名無しさん
2006/03/24(金) 08:17:050251デフォルトの名無しさん
2006/03/24(金) 13:45:39オーバーしてしまった時に自動でリサイズしてくれるような
クラスを作りたいのですが、
x[i] = x[i-1] + vx[i] * dt;
と言うような感じのコードを実行したときに、
「x[i]」でリサイズが必要になった場合、
「x[i-1]」の参照が無効になってしまうと言う状態になってしまいました。
なにかこう言った状態を解決する方法はないのでしょうか?
よろしくお願いします。
0252デフォルトの名無しさん
2006/03/24(金) 13:49:02operator [] の戻り値を参照型じゃなくて値型にしていれば
そういった状態にはならない。
配列クラスへのポインタとインデックスの組み合わせを持った
プロキシオブジェクトを返すことでも解決できるかもしれない。
0253251
2006/03/24(金) 13:57:18値の代入は何かほかの方法を用意しておくしかないということでしょうか?
プロキシオブジェクトについてはしらなかったので調べてみます。
ありがとうございました。
0254デフォルトの名無しさん
2006/03/24(金) 14:06:31bool hoge = true;
void hige() {
while(hoge);
}
大域スコープにあってもループ中にhogeを変更する明示的なコードが無いから>>221を
↓のように置き換えるコンパイラがあってもおかしくない。つかstrength reduceとかあたりまえ。
void hige() {
if (hoge)
for (;;)
;
}
autoだと変数がレジスタにしか割り当てられない可能性高いけどそれはまた別の話。
はいはいワロスワロス
0255デフォルトの名無しさん
2006/03/24(金) 14:09:48事前にresizeするか、↓じゃだめなの?
prev = x[i-1];
x[i] = prev + vx[i] * dt;
0256デフォルトの名無しさん
2006/03/24(金) 14:18:17それだったら、STLのvector使っても、あまり変わらないだろう。
0257251
2006/03/24(金) 14:28:56自分で使うだけなら事前にresizeするだけでもよかったんですが、
C言語もほとんどしらないような友人も使うので
できる限り単純にしておいておきたかったんですよね。
かといってデータの量もかなりあるので余り無駄なメモリも負担も増やせなくて…
0258251
2006/03/24(金) 15:02:28一度も値が代入されていない変数の値を使う事は普通は無いと思うので、
リサイズする可能性があるのは代入演算子の左側の「x[i]」だけだと考えて、
x[i] = x[i-1] + vx[i] * dt;
と言うような命令があったときに「x[i]」でリサイズして
配列をdeleteするのを、次に「operator[]」が呼ばれた時にする
というのはありなのでしょうか?
なにか問題が起きそうな気もしなくもないですが
0259デフォルトの名無しさん
2006/03/24(金) 15:03:500261デフォルトの名無しさん
2006/03/24(金) 15:36:21しれんが、少なくとも式の評価順序について曖昧な部分は、その
処理系の説明書にも書いてないだろう。
規格はそこまで縛ってないのだから。自分で調べるというのならそれでも
いいのだが。
0262デフォルトの名無しさん
2006/03/24(金) 15:50:240263嘘
2006/03/24(金) 15:55:150264デフォルトの名無しさん
2006/03/24(金) 15:56:590265デフォルトの名無しさん
2006/03/24(金) 15:58:11operator=のPOD型に関する評価順序は右から左と決まっているので、
右辺を評価した後で左辺を評価した時に配列やvectorの参照アドレス
が変わるのがまずいって話でしょう。
あとoperator+とかは左から右なので、例えばx[i} + x[i + 1]という式が
あったとして、x[i + 1]がxの参照を変更してしまうような操作であった場合、
x[i]が参照で返されているとアクセスエラーが出る可能性があります。
だから>>252さんのおっしゃられる通り、値返しにすれば、アドレスが変化
しても問題がないように思います。
0266デフォルトの名無しさん
2006/03/24(金) 16:01:170267デフォルトの名無しさん
2006/03/24(金) 16:04:33いやいや、今の話はPOD型ではなくて、自前のクラスの話では。
まあクラスにしても同じなんだが。
0268デフォルトの名無しさん
2006/03/24(金) 16:34:23いっそstd::map使え。キーにstd::size_tを指定してしまえ。
0269デフォルトの名無しさん
2006/03/24(金) 16:48:13漏れは、各ノードに「親ノードへのポインタ」と「子ノードへのポインタのリスト」を持つようにした。
struct tree {
tree* parent;
std::list<tree*> children;
T value;
};
実際にはstructではなくclassで、各メンバはprivateにした上でアクセサを定義。
イテレータとして
1. 子ノードイテレータ
typedef std::list<tree*> children_type;
typedef typename children_type::iterator children_iterator;
2. preorder_iterator(begin()、end()で先頭・末尾の次を取得でき、全ノードを前置順走査する)
3. postorder_iterator(rbegin()、rend()で先頭・末尾の次を取得でき、全ノードを後置順走査する)
を用意。tree::iteratorにpreorder_iteratorをtypedefしておく。
子ノードの追加はoperator+, +=、削除はoperator-, -=
これにストリーム入出力つけて300行くらい。でもコード見たらboost::iterator_facade使ってた。
0270デフォルトの名無しさん
2006/03/24(金) 16:54:270271デフォルトの名無しさん
2006/03/24(金) 17:02:57STLにツリーは用意されてません。
もしSTLっぽいツリーを実装したいなら、「tree.hh」でググるべし。
0272デフォルトの名無しさん
2006/03/24(金) 17:03:16始めはこの形を検討しました。
ただ怖いのは、ポインタが無効になることなんですよね。。
やっぱり配列かなぁ。。
Cらしくない。。
0273デフォルトの名無しさん
2006/03/24(金) 17:05:53おぉ。
面白そうなので、ソースを見てみます。
0274デフォルトの名無しさん
2006/03/24(金) 17:10:04ここが C++相談室 ならお前の言うことは正しい。
しかし、ここは 【初心者歓迎】C/C++室 Ver.25【環境依存OK】 なのであった。
0275デフォルトの名無しさん
2006/03/24(金) 17:11:180276デフォルトの名無しさん
2006/03/24(金) 17:15:39すまん。素でまちがえた。
0277デフォルトの名無しさん
2006/03/24(金) 17:16:18なにその誤爆系ギャグ
0278デフォルトの名無しさん
2006/03/24(金) 17:17:20ポインタが無効になる、というのはどういうこと?
見落としてるのかな。
0279デフォルトの名無しさん
2006/03/24(金) 17:21:02コピーした場合とかですね。
イテレータに詳しい方ならわかるはず。
0280デフォルトの名無しさん
2006/03/24(金) 17:39:36ううん…?
要素追加時にnew、要素削除時に子要素もろともdelete。
treeのデストラクタで全要素delete。
コピーコンストラクタでは構造通り全要素追加。
std::list<>で持っているのはノードへのポインタだから、deleteされるまで無効にはならないはず。
各イテレータは、直下の子要素追加・削除時に無効になるけれど、それはSTLでも同じことじゃないかい?
それとも見当はずれのことを言ってるのかな('A`)
0281デフォルトの名無しさん
2006/03/24(金) 17:42:390282デフォルトの名無しさん
2006/03/24(金) 17:44:56>関数呼び出しの前には値をストアするだろうし、後で参照すれば値をロードしなおす
^^^^^^^^^^^^^^^^^
目の不自由な人乙
それとも理解力ないのか?
0283デフォルトの名無しさん
2006/03/24(金) 17:58:51気にしていたのは、
tree<...> x, y;
xつりーを構築;
y = x; //yは有効なつりー?
とかです。
よく考えてみたら、yの木を根から再構築すればいいだけの話ですね。。
0284デフォルトの名無しさん
2006/03/24(金) 18:00:56日本語おかしいですね。
"y" -> "x"
もしくは、
"yの木を"->"yの木は"
0285デフォルトの名無しさん
2006/03/24(金) 18:03:55日本語おかしいですね。
"y" -> "x"
もしくは、
"yの木を"->"yの木は"
0286デフォルトの名無しさん
2006/03/24(金) 22:47:25operator[]が返すのは参照型がダメだけど代入はできるようにする
っていうのを意識して内部クラス作ってみた
とりあえず最小限のことしか用意してませんが、なにかあれば添削とか批評お願いします
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1706.txt
>>252
プロキシオブジェクトのことなんも知らず作ったけど、もしかしてこういうやつのこと?
0287デフォルトの名無しさん
2006/03/24(金) 23:06:05ひえーBCCだとコンパイルできない。
BCCぜってー変だよこれ。
VC7.1だと通るね。
0288デフォルトの名無しさん
2006/03/24(金) 23:33:250289デフォルトの名無しさん
2006/03/24(金) 23:48:27宣言の初期化みたいなんですけど、
コメントの 1、2、3 と return文 4 の
ところです。
#include <stdio.h>
class test {
public:
test() {};
~test() {};
static test* ins();
static test ins1;
static test* ins2;
static test* ins3;
};
test test::ins1; // 1
test* test::ins2 = test::ins(); // 2
test* test::ins3 = (test*)NULL; // 3
test* test::ins() {
return new test(); // 4
}
0290デフォルトの名無しさん
2006/03/24(金) 23:53:181から3は静的変数の定義。
クラスの静的変数は、クラス内の宣言とは別にどこかcppファイルで定義が必要。
普通のグローバル変数がヘッダで宣言し、どこかで定義するのと同じこと。
2と3は初期化子を指定している。
4は動的にオブジェクトを作っている。誤解を恐れず言えばmallocのC++版と言ったところ。
これくらい自分で何とかしろよ。
0291デフォルトの名無しさん
2006/03/24(金) 23:56:43ありがとうございます。感謝です。
C++は暗号みたいで難しいです。
0292デフォルトの名無しさん
2006/03/25(土) 00:18:05このコードだとメモリリークする危険がありますな。
0293デフォルトの名無しさん
2006/03/25(土) 00:30:20freeがないからリークの可能性って事
C言語はまだ良く分からないけど
0294由美子
2006/03/25(土) 00:32:26NTVDM CPUは不正命令を検出しました。
CS:270c IP:0103 OP:63 3a 5C 42 6f アプリケーションを終了するには[閉じる]を選んでください。
と表示され.odjファイルしか作れません。三つファイルが出来るのですよね?
かれこれ2時間格闘しています。
誰か、何が悪いのかわかる方いらっしゃいますか?
よろしくお願いします。かなりの初心者で申し訳ありません
0295デフォルトの名無しさん
2006/03/25(土) 00:57:53それを見てなんとか汁
0296デフォルトの名無しさん
2006/03/25(土) 01:21:030297デフォルトの名無しさん
2006/03/25(土) 01:58:290298由美子
2006/03/25(土) 02:44:13ホントお願いします。泣
0299デフォルトの名無しさん
2006/03/25(土) 02:47:59'=' も '+' も評価順序は決まってないよ。
0300デフォルトの名無しさん
2006/03/25(土) 02:54:450301デフォルトの名無しさん
2006/03/25(土) 03:10:13その状態によって、使えるメソッドが決まる、という設計は
やっぱ糞かなw
0302デフォルトの名無しさん
2006/03/25(土) 03:11:51糞かどうかはわからないが、バグの元になることは確かだ。
0303デフォルトの名無しさん
2006/03/25(土) 05:51:560304デフォルトの名無しさん
2006/03/25(土) 09:40:59以下のソースで動かしました
#include <iostream>
using namespace std;
class Test{
public:
char *ary;void print(char *ary);Test(char *ary);~Test();};
Test::Test(char *ary){cout << "コンストラクタ\n";cout << ary << '\n';}
Test::~Test(){cout << "デスクトラクタ\n";cout << ary << '\n';}
void print(Test *obj){obj->ary = "print()\n";}
int main(){Test obj("Hello");print(&obj);return 0;}
で、デスクトラクタは、オブジェクト破棄の後に出る関数と捉えているんですが
結果、print()という関数の前にデスクトラクタが出てきました
objが破棄されたにもかかわらず、objの参照渡しがなされてるようで
不思議です。まだまだクズの初心者なんで、学習量が少ないんですが
出来れば教えてください
0305デフォルトの名無しさん
2006/03/25(土) 09:54:22>結果、print()という関数の前にデスクトラクタが出てきました
どうやってこれを確認した?
0306デフォルトの名無しさん
2006/03/25(土) 09:57:01コンストラクタ
Hello
デスクトラクタ
print()
と出力されて何も問題ないようだが。
ちなみにprint関数の中では代入しているだけで画面への出力はぜんぜん行っていないからな。
0307デフォルトの名無しさん
2006/03/25(土) 11:39:15何を言う!BCCと言っても、現時点では最新バージョンの5.8.1だぞ!
(タイムスタンプ 05-12-01 10:01)
・・・・・と言ってもむなしいだけだよな。氏ねよBCC・・・・
0308デフォルトの名無しさん
2006/03/25(土) 16:32:580309デフォルトの名無しさん
2006/03/25(土) 19:10:32挙動については>>306だと思うが、気になったので老婆心から一言言わせてくれ。
クラスTestのメンバにvoid print(char* ary)があり、かつ、クラス外にもvoid print(char* ary)がある。
こういうケースでは、クラスメンバの方だけを使う方がいいと思う。
あと、メンバ変数char* aryと、コンストラクタの引数char* aryが同名だけど、ちゃんと混乱せず使えてる?
挙動がわからない状況では、まぎらわしい記述は避けた方がいいよ。
0310デフォルトの名無しさん
2006/03/25(土) 19:11:40すまんこ
0311304
2006/03/25(土) 20:34:31と思っています。さすがに、長いプログラム書くときに
こんな同名の変数やら、メンバやらは区別しようと
思ってます。
0312デフォルトの名無しさん
2006/03/25(土) 21:03:46これやってみな
main()
{
cout << "--------------" << endl;
Test obj("Hello");
cout << "--------------" << endl;
print(&obj);
cout << "--------------" << endl;
}
0313デフォルトの名無しさん
2006/03/25(土) 21:05:57筑紫23の偏向報道にはもう我慢できない!!!
スポンサー「キリン」に対して抗議の不買運動実施中!!!
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
一向に偏向報道をやめない筑紫23に対して抗議の不買運動を実施中です。
・偏向報道って具体的にどんななの?
→★TBSで放送された、ナヌムの家の動画
--- 動画抜粋 ---
動画1
http://youtube.com/watch?v=AlPQUhb7GDI
動画2
http://youtube.com/watch?v=lHEDn2CMTYg
そんなに長くありません。1回見ればその悪質さが理解できます。
(これは一部です。本スレにすべてのリンクがあります)
・なんで不買?直接抗議すれば?
→電話やEメールなどで抗議では、聞き流されるか不遜な応対をされます。
不買運動は元法務大臣も推奨する合法的な活動です。
・何でキリンだけなの?
→みんなでまとまって一つの企業に対してやらないと力が分散し、あまり効果が望めません。
特に偏向・捏造・隠蔽の酷かった「ナヌムの家」の回のスポンサーであったキリンに白羽の矢が立っただけです。
詳しくは本スレまで
【キリンから】筑紫23偏向報道・スポンサーに抗議の不買★30
http://live22x.2ch.net/test/read.cgi/news/1143280975/
0314デフォルトの名無しさん
2006/03/25(土) 22:12:11> こんな同名の変数やら、メンバやらは区別しようと
これは、ちょっと違う
変数名は別に同じでも構わない
初心者は別だが
0315デフォルトの名無しさん
2006/03/25(土) 22:38:27int getHoge(int a) const;
とかかれていた所があったのですが、このconst はどういう意味なのでしょうか?
0316デフォルトの名無しさん
2006/03/25(土) 22:39:240317デフォルトの名無しさん
2006/03/25(土) 22:40:56おまいらありがと
0318デフォルトの名無しさん
2006/03/25(土) 22:43:17とどう違うの?
0319デフォルトの名無しさん
2006/03/25(土) 22:47:000320デフォルトの名無しさん
2006/03/25(土) 23:35:42端的に言えばthisポインタの有無。
だめな説明だな、これじゃ。
0321デフォルトの名無しさん
2006/03/25(土) 23:36:57>>315だとgetHoge()の中でメンバー変数を読むことだけはできる。
0322デフォルトの名無しさん
2006/03/26(日) 00:40:35ポインタでかまわない場合は、
class CFoo;
class CAAA
{
protected:
CFoo *pFoo;
};
こんなふうによくやりますけど、
このCFooってクラスがnamespace付きの場合って、
無理なんでしょうか。
class hoge::CFoo;
class CAAA
{
protected:
hoge::CFoo *pFoo;
};
こういうのは怒られてしまうんですけど、
ヘッダにインクルードする以外手はないんでしょうか
0323デフォルトの名無しさん
2006/03/26(日) 00:44:41{
class CFoo;
}
じゃだめか?
0324デフォルトの名無しさん
2006/03/26(日) 02:50:33めんどくね?
俺はパフォーマンス多少悪くなるけど、共通関数作って呼んじゃってる
けど、みんなどうしてる?
0325デフォルトの名無しさん
2006/03/26(日) 04:52:050326デフォルトの名無しさん
2006/03/26(日) 04:53:24極まれにマクロつかったりする
0327デフォルトの名無しさん
2006/03/26(日) 05:48:12メンバ多すぎるんじゃね?
private にネストしたクラス作るとうまくいったりする。
0328デフォルトの名無しさん
2006/03/26(日) 07:57:58クラスをインターフェイスと実装に分離し、非公開継承する
0329デフォルトの名無しさん
2006/03/26(日) 08:34:460330デフォルトの名無しさん
2006/03/26(日) 10:41:17どんなにきつくても悪魔のささやきには負けない
0331デフォルトの名無しさん
2006/03/26(日) 12:16:20早めにPODとクラスに分けちゃってクラスの書き方は速度をあんまり考えてない。
0332デフォルトの名無しさん
2006/03/26(日) 12:53:500333デフォルトの名無しさん
2006/03/26(日) 12:56:210334デフォルトの名無しさん
2006/03/26(日) 12:57:010335デフォルトの名無しさん
2006/03/26(日) 13:04:570336デフォルトの名無しさん
2006/03/26(日) 13:08:17struct S { std::string s; }; この S はデータブロックだが POD じゃないぞ。
0337デフォルトの名無しさん
2006/03/26(日) 13:11:130338デフォルトの名無しさん
2006/03/26(日) 14:23:56おお、なるほど!!
ありが�`
じゃあついでにもう1こ。
クラス内クラスを別ヘッダから宣言だけしたい場合はどうすればよいんでしょ。
class CFile
{
class CHandle
{
int a;
};
};
こういうクラスがあったとして、CHandleを別のヘッダで
class CFile::CHandle;
ってやると怒られてしまいますが、
これって、
class CFile
{
class CHandle;
};
こんなことやってもダメですよね?
0339デフォルトの名無しさん
2006/03/26(日) 14:31:51その問題は避けられないので、ネストされたクラスは
インターフェースに使わないほうがいい。
逆に言うと、インターフェースに使うクラスは
ネストされたクラスにしないほうがいい。
0340デフォルトの名無しさん
2006/03/26(日) 20:40:49よくわからないところがあったので質問させてもらいました。
「*.h」というようなファイルには極端な話し
外部のファイルからアクセスする必要があって、
実体の無い物のみ書き込むと言うような考え方で良いのでしょうか?
またサブフォルダなどを使ってはいけないと言う話しをどこかで聞きました。
#include "./test/test.h"
#include "../test.h"
などとすると問題が起きることがあるのでしょうか?
ヘッダファイルの中では極力インクルードを使わないようにした方が良い
なんて言う話しも聞いたことがあります。
なにかこう言ったようなやってはいけない的な事があれば
教えてもらえませんでしょうか?
基本的な質問で申し訳ないですが、よろしくお願いします。
0341デフォルトの名無しさん
2006/03/26(日) 20:50:52*.c ファイルには関数の定義を書くんだよ、って言えたんだけどなぁ。
クラスの定義はヘッダファイルに書くし、テンプレートの定義も
ヘッダファイルに書くし、ヘッダファイルって大活躍だよね。
ごめん、ぜんぜん質問の答えになってなかった。寝るわ。
0342デフォルトの名無しさん
2006/03/26(日) 21:09:00確かに言われてみればクラスやテンプレートを勉強し始めてから
よくわからなくなってきたような気がします。
ありがとうございました、お疲れさまです。
0343デフォルトの名無しさん
2006/03/26(日) 22:44:36ヘッダの変更は利用側の再コンパイルを必要とするので、
内容は必要最小限にしておいたほうがいい。
ヘッダファイルの検索方法は標準で定義されていないので
コンパイラ間で移植を行うときに問題になることがある。
個人的には、 . や .. などソースファイルの位置に依存する書き方は
問題になりやすいのでお勧めしない。
ただ、コンパイルオプションの設定でどうにかなることがほとんど。
ヘッダファイルの中でのインクルードは依存関係を累積的に増やす事になる。
これも必要最小限にするべきだろう。
0344デフォルトの名無しさん
2006/03/26(日) 23:33:12typedef enum A {
a,
b,
c,
: (20個ぐらい続く)
} TypeA;
↑
こういうクラスの中にtypedefされたenum定義とかって、別のヘッダファイルにしておいて
public:
include A.h;
みたいにかけないですかね?
0345デフォルトの名無しさん
2006/03/26(日) 23:35:220346デフォルトの名無しさん
2006/03/26(日) 23:35:27普通に書けるよ。
class something {
public:
#include "A.h"
};
0347デフォルトの名無しさん
2006/03/26(日) 23:59:210348344
2006/03/27(月) 00:04:540349デフォルトの名無しさん
2006/03/27(月) 00:37:40メソッドは、Bの方には継承したくありません。こういう場合、一般的にはどうするのが
うまい設計でしょうか?
単純にAの一部のメソッドを別クラス(A’)にしてCの方は、AとA’
を多重継承させるのが簡単かと思いますが、この場合A’は引数にAの
メンバ変数を取る単なる関数の集合体になります。まぁこれでもいいの
ですが、何かもうちょっとオブジェクト指向的な?よい方法はありますか?
0350デフォルトの名無しさん
2006/03/27(月) 00:43:05> この場合A’は引数にAのメンバ変数を取る単なる関数の集合体になります
ここの意味がわからん。
不満が無いならそれでいいだろう。
何が不満なのかわかるように書いてくれれば、
回避方法もあるかもしれんが。
0351デフォルトの名無しさん
2006/03/27(月) 00:45:07Aの一部のメソッドを外したものをBaseAとして定義してその一部のメソッドだけの集合をOptAにつっこんでCはOptAを継承してBはBaseAを継承じゃだめなのか?
というかAが基底になりきってないだけじゃないの?
ライブラリ提供のAだってならどうしようもないけどな。
0352デフォルトの名無しさん
2006/03/27(月) 00:49:14「オブジェクト指向的」に言うと、Aの持つインターフェースを全て持たないなら
BはAをpublic継承すべきではない。
C++の観点から言うと、usingを使って継承されたメンバのpublic/privateを自由に変更できる。
0353デフォルトの名無しさん
2006/03/27(月) 00:49:29プライベートに宣言しとくとか
0354デフォルトの名無しさん
2006/03/27(月) 00:51:56>C++の観点から言うと、usingを使って継承されたメンバのpublic/privateを自由に変更できる。
できなくね?
0355デフォルトの名無しさん
2006/03/27(月) 00:55:02#include <iostream>
struct a
{
void f(){std::cout << "f\n";}
void g(){std::cout << "g\n";}
};
struct b : public a
{
private:
using a::f;
};
int main()
{
b x;
x.f(); /* エラー: b::fはprivate */
((a &)x).f(); /* ok */
}
0356デフォルトの名無しさん
2006/03/27(月) 00:58:140358349
2006/03/27(月) 01:01:09その中で、
>>352
>「オブジェクト指向的」に言うと、Aの持つインターフェースを全て持たないなら
BはAをpublic継承すべきではない。
まさにここをお聞きしたかったのですが、全てもたないけど一部は持つ(その一部
は実装が共通のメソッド)
という場合はどのようにすべきなのでしょう? 個人的にはこれってmix-inの問題
なのかなと思ったりするのですが。う〜ん
0359349
2006/03/27(月) 01:02:170360デフォルトの名無しさん
2006/03/27(月) 01:03:04g++3.5.4
test.cpp: In function `int main()':
test.cpp:5: error: `void a::f()' is inaccessible
test.cpp:18: error: within this context
0361デフォルトの名無しさん
2006/03/27(月) 01:03:36そもそもなんでAを継承したい?
0362360
2006/03/27(月) 01:04:080363デフォルトの名無しさん
2006/03/27(月) 01:04:53どうするべきかって言ったら、きっちりインターフェースを切るべきに決まってるだろ。
何が不満なのかわかんないままだし。
0364デフォルトの名無しさん
2006/03/27(月) 01:05:36なるほど・・・ありがとうございます。
参考になりました。
0365デフォルトの名無しさん
2006/03/27(月) 09:59:23「ペンギンは鳥。鳥は空を飛べる。従ってペンギンは空を飛べる。あれれ?」問題だっけ。
鳥クラスにfly()メソッドがあり、鳥クラスを継承したペンギンはfly()が呼び出せる。
fly()をprivateにしたり例外投げたりすることで、ペンギンは空を飛べなくなる。
しかし、これは、ペンギンは空を飛べるが、空を飛ぼうとしたら必ず失敗する、ということにすぎない。
それが嫌なら、flyable_birdクラスとnon_flyable_birdクラスあたりに分離する。
というのをどこかで昔読んだ。
0366デフォルトの名無しさん
2006/03/27(月) 10:58:14実際、そうだけどね
バージョン化したプログラムに退化器官はつきものだし
退化ではなくもともと翼のない鳥なんておかしなものを後付で作るほうがどうかしてるよ
0367デフォルトの名無しさん
2006/03/27(月) 11:19:42なんかすごい納得。いいなその説明。
メモっとこ。
0368デフォルトの名無しさん
2006/03/27(月) 11:28:560369デフォルトの名無しさん
2006/03/27(月) 11:32:40struct typelist_tag{};
template< typename Signature > struct inherits;
template< typename T1 >
struct inherits< typelist_tag ( T1 ) > : public T1 {};
...
/* 鳥テンプレート */
template< class Polices >
class bird : public inherits< Polices >
{
...
};
struct flyable { virtual void fly()=0; };
struct swimable { virtual void swim()=0; };
// カラス
class crow : public bird< typelist_tag( flyable ) >
{
/* fly を実装するとか */ ...
};
// ペンギン
class penguin : public bird< typelist_tag( swimable ) >
{
/* swim を実装するとか */ ...
};
0370デフォルトの名無しさん
2006/03/27(月) 11:40:33// 鳥
class bird
{
...
};
struct flyable { virtual void fly()=0; };
struct swimable { virtual void swim()=0; };
// カラス
class crow : public bird,public flyable
{
/* fly を実装するとか */ ...
};
// ペンギン
class penguin : public bird,public swimable
{
/* swim を実装するとか */ ...
};
0371デフォルトの名無しさん
2006/03/27(月) 11:41:080372デフォルトの名無しさん
2006/03/27(月) 11:45:25いつかは風を切って知る〜
0373デフォルトの名無しさん
2006/03/27(月) 12:01:20空気嫁
0374デフォルトの名無しさん
2006/03/27(月) 12:04:30飛べるはず〜
0375デフォルトの名無しさん
2006/03/27(月) 12:04:58EffectiveC++の
「publicに継承するときはis-a関係にあるか確認しよう」
に出てた。これが最初かしらんけど。
bird
/ |
flying non flying
|
penguin
こんな感じででてたね。
私自身、この設計が間違ってるとは思わないけど、
本の中で、例を出すにはいい解説だったと思うよ
0376デフォルトの名無しさん
2006/03/27(月) 13:15:25hoge();
}
hoge::hoge(){
class piyo{
piyo();
int piyovalue;
}
}
piyo::piyo(){
piyovalue=0;
}
見たいな事できる?
変なところがあったらダメだし求む。
0377デフォルトの名無しさん
2006/03/27(月) 13:28:15試すって発想は無いのか?
0378デフォルトの名無しさん
2006/03/27(月) 13:31:040379デフォルトの名無しさん
2006/03/27(月) 13:35:540380デフォルトの名無しさん
2006/03/27(月) 13:39:590381デフォルトの名無しさん
2006/03/27(月) 14:14:370382デフォルトの名無しさん
2006/03/27(月) 17:07:53相談のマナーがなってなけりゃスルーでええやん。
0383デフォルトの名無しさん
2006/03/27(月) 17:46:41どうでもいいけど、classの宣言・定義は、ブロック {} のあとに ; が必要だ。
piyoのコンストラクタはprivateなので、
hogeと明示的にfriend関係にするか、piyoをpublic継承しないと
このままではpiyoのインスタンスを生成できない。
コンストラクタで例外が投げられないよう気を付けておく。
0384デフォルトの名無しさん
2006/03/27(月) 18:07:56もしくは、どんなオブジェクトでも無差別に開放するスマートな方法はありますか?
0385デフォルトの名無しさん
2006/03/27(月) 18:20:27std::vectorでもつかっときなさい
0386デフォルトの名無しさん
2006/03/27(月) 18:23:17これも有効な方法があるんですか?
0387デフォルトの名無しさん
2006/03/27(月) 18:33:040388デフォルトの名無しさん
2006/03/27(月) 18:33:10通常は auto を使えば構築と破壊の対をコンパイラに作ってもらえる
それをわざわざ違う方法で扱うからには構築と破壊の対を特殊な形にする動機が必ずあるはず
よって、この質問はシュールと言わざるを得ない
>もしくは、どんなオブジェクトでも無差別に開放するスマートな方法はありますか?
0389デフォルトの名無しさん
2006/03/27(月) 18:41:17無差別にオブジェクトを削除したければ、ステートメントブロックを作ってその中に記述すれば良いんですか?
0390デフォルトの名無しさん
2006/03/27(月) 18:46:54詩的な表現をされている部分の真意を測りかねるが
ブロックからの逸脱を削除と解釈してはならないオブジェクトを指定する方法が new や static だ
0391デフォルトの名無しさん
2006/03/27(月) 19:08:05でもスマートじゃない。
0392デフォルトの名無しさん
2006/03/27(月) 19:22:02え???
0393デフォルトの名無しさん
2006/03/27(月) 19:37:21このへんでやめとこう
0394デフォルトの名無しさん
2006/03/27(月) 20:41:52コツコツオブジェクトを殺すんじゃなくて、ステートメントブロックを活用して一気にオブジェクトを殺せば良いと。
でもそれだと複雑なコードが組めないし、トリッキーになるから素直にdeleatするか、この話はこのへんで止めておこうと。
0395デフォルトの名無しさん
2006/03/27(月) 21:04:420396デフォルトの名無しさん
2006/03/27(月) 21:07:540397デフォルトの名無しさん
2006/03/27(月) 21:20:010398デフォルトの名無しさん
2006/03/27(月) 21:30:450399デフォルトの名無しさん
2006/03/27(月) 21:34:09という気持ちもわかるが、最後の締めがdeleatじゃねぇ・・・
0400デフォルトの名無しさん
2006/03/27(月) 22:59:540401デフォルトの名無しさん
2006/03/27(月) 23:12:28空気が読めない奴は、女にもてない。
0402デフォルトの名無しさん
2006/03/27(月) 23:15:100403デフォルトの名無しさん
2006/03/27(月) 23:17:09>>401はまぁまぁ正しい
0404デフォルトの名無しさん
2006/03/28(火) 00:01:41同類なので憐れんであげる。 orz
0405デフォルトの名無しさん
2006/03/28(火) 01:16:250406デフォルトの名無しさん
2006/03/28(火) 02:20:470407デフォルトの名無しさん
2006/03/28(火) 05:20:35配列arrayの先頭アドレスは、しばしばポインタで表される。
あるポインタ変数が与えられたとき、それはオブジェクトへのポインタを指すのか?
T* X = new T;
それとも、配列の先頭アドレスなのか?
int array[N];
int* Y = &array[0];
両者を区別することは難しい。
そこで、オブジェクト用のdeleteと、配列用のdeleteを用意して、
判断をプログラマにまかせているのだと思われ。
delete X;
delete[] Y;
0408デフォルトの名無しさん
2006/03/28(火) 05:22:420409デフォルトの名無しさん
2006/03/28(火) 15:47:17エラー処理を一箇所でまとめたいとき
try ~ catchって使っていいの?
gotoや、do{ break }while(0);とか使うべき?
エラーと例外は別物とか聞いたし
0410デフォルトの名無しさん
2006/03/28(火) 15:59:560411デフォルトの名無しさん
2006/03/28(火) 16:02:28まさにそのために例外がある。
ただし、例外を使うのは例外的な状況に限ったほうがいい。
0412デフォルトの名無しさん
2006/03/28(火) 16:04:02このスレに張られているURLは参考になるものが多いと思う。
http://pc8.2ch.net/test/read.cgi/tech/1142667446/l50
0413デフォルトの名無しさん
2006/03/28(火) 17:48:10ほんとだ、参考になる。じっくり読んでみるよ。
0414デフォルトの名無しさん
2006/03/28(火) 18:40:50また例外処理のスレが立ったのか。
0415Defaultの名無しさん
2006/03/28(火) 21:45:51ちょっと変わったfunctorが作りたいです。
普通はresult operator(arg1,arg2, ...)といった感じで実行ですが、
すべての関数は,void Execute()で実行します。
このとき引数の値を事前にfunctorに保持させるようにします。
戻り値もExecute()実行後にfunctorに保持し、適宜,rerult GetResult()みたいな感じで取り出すとします。
ここで問題となるのが、引数argN型や戻り値result型の保持の問題です。
argやresultが参照の場合はやっかいです。メタプログラムして値型にすれば容易に解決できると思いますが、
Execute()実行まえに参照先が変化している場合(マルチスレッドが理由とかで)もあるので、
やっぱり参照で保持したい・・・ポリモルフィズムしてほしい・・・
なにか良い知恵をご教示願います。
0416デフォルトの名無しさん
2006/03/28(火) 21:50:340417Defaultの名無しさん
2006/03/28(火) 22:10:27でも、
保持している関数ポインタ(func_ptr)の引数がarg&だった場合はarg*で保持するとします。
このとき、Execute()実行時はfunc_ptr(*arg)が起動するわけですが、
argが抽象クラスの場合はコンパイルされません・・・
0418デフォルトの名無しさん
2006/03/28(火) 22:49:57cc1:error:sorry unmplemented.か?
0419デフォルトの名無しさん
2006/03/28(火) 22:55:06struct IHoge{ virtual void hoge()= 0;};
struct CHoge : IHoge{ void hoge(){printf("h\n");} };
int f(IHoge &i){ i.hoge(); return 0;}
struct ce { IHoge *arg; int ret; int (*func)( IHoge & );
void Execute(){ ret = func( *arg ); }
};
int main(){
CHoge ch;
ce e; e.arg =&ch; e.func = f;
e.Execute();
printf("%d\n", e.ret );
}
こういうことだろ。
0420デフォルトの名無しさん
2006/03/28(火) 23:10:160421デフォルトの名無しさん
2006/03/29(水) 00:58:59ほとんど同じとは聞くけど正確な違いとか定義とかあるんでしょうか?
0422Defaultの名無しさん
2006/03/29(水) 01:00:01自宅に帰ってきました。
とりあえず、こんな感じで使えればなあと思ってます・・・
class FunctorBase{
public: virtual void Execute(const long& arg)=0;
...};
template<typename Result,template Argument> class Functor
{
public:
typedef typename FuncPtrCreate<Result,Argument>::FuncPtr FuncPtr;//関数ポインタの型
typedef typename FuncPtrCreate<Result,Argument>::ResultType ResultType;
typedef typename FuncPtrCreate<Result,Argument>::Argtype Argtype;
private:
typedef typename FuncPtrCreate<Result,Argument>::ResultHolder ResultHolder;
typedef typename FuncPtrCreate<Result,Argument>::ArgHolder ArgHolder;
public:
explicit Functor(FuncPtr func) : FuncPtr_(func) { }
virtual void Execute() { ResultHolder_.Set( FuncPtr(ArgHolder_.Get()) ); }
void SetArg(Argtype arg) { ArgHolder_.Set(arg); }
ResultType GetResult() { return ResultHolder_.Get() }
private:
FuncPtr FuncPtr_;
ResultHolder ResultHolder_;
ArgHolder ArgHolder_;
...
};
つづく
0423Defaultの名無しさん
2006/03/29(水) 01:01:29使い方は・・・
Strung Func(long& arg);
int main()
{
Functor<String,long& arg> functor(&Func);
functor.SetArg(10);
functor.Execute();
Functor<String,int&>::ResultType rerult=temp1.GetResult();
} とりあえず寝ます。
0424デフォルトの名無しさん
2006/03/29(水) 01:03:57http://e-words.jp/w/E383A1E382BDE38383E38389.html
http://e-words.jp/w/E996A2E695B0.html
0425Defaultの名無しさん
2006/03/29(水) 01:04:05最下段temp1.GetResult(); はfunctor.GetResult();
めんご
0426デフォルトの名無しさん
2006/03/29(水) 01:11:47せめてコンパイルできるかどうかぐらいチェックしてから貼れよ。
使われてない FunctorBase とか宣言されてない FuncPtrCreate とかボロボロだぞ。
0427デフォルトの名無しさん
2006/03/29(水) 05:44:28処理系依存ですか?それとも規格で厳密に決まっていますか?
0428デフォルトの名無しさん
2006/03/29(水) 07:37:51The following macro names shall be defined by the implementation:
...
_ _DATE_ _ The date of translation of the source file (a character string literal of the form
"Mmm dd yyyy", where the names of the months are the same as those generated by the asctime
function, and the first character of dd is a space character if the value is less than 10). If the date of
translation is not available, an implementationdefined valid date is supplied.
_ _TIME_ _ The time of translation of the source file (a character string literal of the form "hh:mm:ss"
as in the time generated by the asctime function). If the time of translation is not available, an
implementationdefined valid time is supplied.
0429デフォルトの名無しさん
2006/03/29(水) 07:43:50処理系によって定義されていなければならない。
_DATE__
前処理翻訳単位の翻訳の日付("Mmm dd yyyy"の形式をもつ単純文
字列リテラルで, 月の名前はasctime関数で生成されるものと同じ
とする。dの値が10より小さいときは, その最初の文字は空白とす
る。)。翻訳の日付が得られない場合, 処理系定義の正しい日付を提供
しなければならない。
(略)
0430デフォルトの名無しさん
2006/03/29(水) 08:46:10メソッドはJava/C#などの言葉。
C++ではメンバ関数。
0431デフォルトの名無しさん
2006/03/29(水) 12:22:15とか使ってログを取ろうと思ってログ関数作ったけど
その関数の中で呼んでも意味無いんだね。当たり前だけど。
使えないと思った。
bindとか使ったら使いやすくなるだろか。
0432デフォルトの名無しさん
2006/03/29(水) 12:30:330433デフォルトの名無しさん
2006/03/29(水) 12:41:450434デフォルトの名無しさん
2006/03/29(水) 12:44:40使えるよ。 STLport 使うとだいぶマシになるよ。
0435デフォルトの名無しさん
2006/03/29(水) 12:50:39vc6だとmaxは定義されていないとでるんですが
#include<algorithm>
#include<iostream>
using namespace std;
void main(){
int a,b,c;
a = 0;
b = 1;
c = max(a,b);
cout << c << endl;
cout << a << b << endl;
}
0436デフォルトの名無しさん
2006/03/29(水) 13:26:04エラーメッセージはコピペが基本。
0437デフォルトの名無しさん
2006/03/29(水) 13:53:47vc6だとmaxは定義されていないとでるんですが
#include<algorithm>
#include<iostream>
using namespace std;
void main(){
int a,b,c;
a = 0;
b = 1;
c = max(a,b);
cout << c << endl;
cout << a << b << endl;
}
error C2065: 'max' : 定義されていない識別子です。
0438デフォルトの名無しさん
2006/03/29(水) 14:04:43同じ質問があった気がする
0439デフォルトの名無しさん
2006/03/29(水) 14:18:280440デフォルトの名無しさん
2006/03/29(水) 14:48:530441デフォルトの名無しさん
2006/03/29(水) 15:10:22ていうか、
「過去ログ呼んだか?」の一行をぜひ、
「できないよ」「できるよ」の答えの一行にしてほしい質問者です
0442デフォルトの名無しさん
2006/03/29(水) 15:34:43std::maxが使えるか、という質問ならたぶん「使えない」でいい。
algorithmの各関数が使えるか、という質問なら、「使えるものもある」で。
0443デフォルトの名無しさん
2006/03/29(水) 16:00:17ありがとうございます。
0444デフォルトの名無しさん
2006/03/29(水) 17:17:030445デフォルトの名無しさん
2006/03/29(水) 17:53:290446デフォルトの名無しさん
2006/03/29(水) 18:05:410447デフォルトの名無しさん
2006/03/29(水) 18:40:270448デフォルトの名無しさん
2006/03/29(水) 18:50:53>C++ではメンバ関数。
非公開メンバ関数をメソッドとは呼ばないと思う。
0449デフォルトの名無しさん
2006/03/30(木) 00:17:530450デフォルトの名無しさん
2006/03/30(木) 01:01:49●を買う。鯖代への貢献にもなって一石二鳥。
それでも拾いきれないものについては、保存している人を探して、拝み倒して
どこかにうpしてもらう。その後、君がまとめサイトを作れば完璧だ。
0451デフォルトの名無しさん
2006/03/30(木) 01:31:100452デフォルトの名無しさん
2006/03/30(木) 01:37:34エラーメッセージで Google も基本。
http://www.google.co.jp/search?q=C2065+max+%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E8%AD%98%E5%88%A5%E5%AD%90
0453デフォルトの名無しさん
2006/03/30(木) 09:37:06http://www.asahi-net.or.jp/~yf8k-kbys/newcpp17.html
を見ながら勉強していたら、最後のwhile文からを
while(1){
int ans;
cout << "1 鳴かす 2 年収を表示 3 昇給 4 やめる"<<endl;
cin >> ans;
if(ans == 1)
dora.naku();
else if(ans == 2)
cout<<dora.get_nensyu();
else break;
}
}
こう書くと年収の表示がおかしくなります。
自分で色々書き方を変えても原因がどうにも分かりません。
どなたか何処がダメなのか教えてください。
0454デフォルトの名無しさん
2006/03/30(木) 09:47:59endl が抜けてるせいで改行が入らない上にでバッファリングされてるんじゃね?
そうじゃないなら、「おかしくなる」って言われてもわかんねーよ。
ちゃんと症状書け。
0455デフォルトの名無しさん
2006/03/30(木) 10:05:22//hello3.cpp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
int tosi;
cout << "こんにちは。私はコンピュータです。" << endl;
cout << "あなたの名前を入力してください。" << endl;
cin >> name;
cout << name "さん。よろしく。" << endl;
cout << "ところで、" << name << "さん。失礼ですがお年はいくつですか?" <<endl;
cout << "(入力は必ず、半角の数字でお願いします。)" << endl;
cin >> tosi;
cout << "なるほど。" << tosi << "歳ですか。" << endl;
cout << "私はもうすぐ2歳のマシンです。"<<endl;
}
この例文を実行すると
エラー E2379 hello3.cpp 15: ステートメントにセミコロン(;)がない(関数 main() )
とか出ます・・・
セミコロンちゃんとつけてるんですが・・・・どこが悪いのかわかりません、教えてください。
0456デフォルトの名無しさん
2006/03/30(木) 10:14:29× cout << name "さん。よろしく。" << endl;
○ cout << name << "さん。よろしく。" << endl;
つか、エラーが出たら、その箇所を見て間違いを探す練習をした方がいいと思うぞ。
0457デフォルトの名無しさん
2006/03/30(木) 10:17:02エラーメッセージの内容は無視して、まず該当行から自力で間違いを探す方がいいな
0458デフォルトの名無しさん
2006/03/30(木) 10:31:17>>456-457
ありがとうございました!いままで○○Pとかにいたんでここの優しさがしみる・・・・
0459デフォルトの名無しさん
2006/03/30(木) 10:31:38いや、内容を無視するのはまずい。先に内容を考えた後で、
原因と直結しないメッセージである可能性も考慮するのが正解だろう。
慣れてくればそういうメッセージは見分けられるようになる。
0460453
2006/03/30(木) 10:43:00おかしくなるというのは、関数から返ってくる年収の値が100のはずなのに
実行すると1401とか表示されるということです。
>endl が抜けてるせいで改行が入らない上にでバッファリングされてるんじゃね?
これってどういうことでしょうか?
確かにdora.get_nensyu()<<endl;と直すとちゃんとした値が表示されるのですが
改行がないと何がまずいのでしょうか。
0461デフォルトの名無しさん
2006/03/30(木) 10:58:20endl ぐらい Google でも使って自分で調べろ。
あと標準出力のバッファリングもな。
で、 endl 入れると「ちゃんとした値」ってことで 100 と表示されるのか?
「1401とか」って何だよ?実行するごとに変わるのか?
改行が無いのがまずいと思わないならそれはお前の勝手だ。気にするな。
書き込む前によく読みなおして、自分以外の人が読んでも
理解できるかどうか確認してください。
0462デフォルトの名無しさん
2006/03/30(木) 10:59:27改行を入れるまで、文字列を出力しないでバッファにためこむ環境があるってことさ。
つまり、std::endl(もしくは'\n')を入れないと文字列が出力されないことがあるので、必ず入れましょう、ということ。
0463デフォルトの名無しさん
2006/03/30(木) 11:03:53'\n' をいれてもバッファのフラッシュはかからない。
「必ず入れましょう」ということで汎用のコードに endl ばら撒かれてもフラッシュしまくりで困る。
きちんと使い分けましょう。
0464デフォルトの名無しさん
2006/03/30(木) 11:08:270465453
2006/03/30(木) 11:20:21ありがとうございます。おかげでやっと意味が分かりました。
この手のエラーは初めてで何が原因だったか全く分からなかったため
言葉足らずな質問になってしまいすいませんでした。
0466デフォルトの名無しさん
2006/03/30(木) 11:49:10× cout << name "さん。よろしく。" << endl;
○ cout << name << "さん。よろしく。" << endl;
0467デフォルトの名無しさん
2006/03/30(木) 11:52:45>>456
0468デフォルトの名無しさん
2006/03/30(木) 11:54:54非公開だろうと何だろうと、メンバ関数をメソッドと呼ぶのは誤り。
0469デフォルトの名無しさん
2006/03/30(木) 12:00:090471デフォルトの名無しさん
2006/03/30(木) 12:07:47すいません、ありがとうございます。
0472デフォルトの名無しさん
2006/03/30(木) 12:25:58春
0473デフォルトの名無しさん
2006/03/30(木) 13:21:40あ、言おうと思ったら既に言われてたw
0474デフォルトの名無しさん
2006/03/30(木) 15:19:58つ[JIS X3014]
つ[google]
つ[自助努力]
0475デフォルトの名無しさん
2006/03/30(木) 15:35:26Functions declared in the definition of a class, excluding those declared with a friend specifier,
are called member functions of that class.
0476デフォルトの名無しさん
2006/03/30(木) 19:27:08ってやっていったら人工知能つくれませんか?
0477デフォルトの名無しさん
2006/03/30(木) 20:09:00こっちいけ
ttp://anime.2ch.net/test/read.cgi/ranime/1141404494/
0478476
2006/03/30(木) 23:00:160479デフォルトの名無しさん
2006/03/30(木) 23:37:56C++の書き方覚えても
あまり意味ないわけ?
裏切られた気分・・・・
0480デフォルトの名無しさん
2006/03/30(木) 23:53:25MFCはWindows アプリケーションを作るためのフレームワーク。
Winアプリを作るのが少しは楽になるかもしれない。ただ最近は下火。
C++の高度なことはあまり要求されないので、
MFCを使いたいがためにC++を学んだのであれば、
たしかに裏切られた気分になるかもしれない。
0481デフォルトの名無しさん
2006/03/31(金) 09:56:08各種ライブラリってどこに置いてますか?
C:\ に置いてます?たとえば C:\boost\lib\ みたいに。
その辺、Windows ってコンセンサスって無いですよね?
ルートに全部置くのもなんか汚い(?)気がするし、
かといって C:\Document and Settings\以下略
みたいな長ったらしい、かつ、空白を含むパスに置くのも嫌だしなぁ。
Vista では長ったらしいパスをやめた、って話だけど。
0482デフォルトの名無しさん
2006/03/31(金) 10:02:25http://eside.homeip.net/columns/winvista_fs.html
0483デフォルトの名無しさん
2006/03/31(金) 11:43:13普通は、libpathにパス指定して好きなとこに置くだろ。
パス指定されると、コンパイルが遅いとか言っていた時代と違うんだから。
0484デフォルトの名無しさん
2006/03/31(金) 12:39:44Win32対応って言わないと思うんだけどなぁ。
0485デフォルトの名無しさん
2006/03/31(金) 12:43:320486デフォルトの名無しさん
2006/03/31(金) 12:45:08/usr/lib の下にまとめてラクになっちゃえばOK。
Document and Setting も Vista では /user/ だし。
0487デフォルトの名無しさん
2006/03/31(金) 12:45:08やっぱそんなものなのか
おいらは普段はLinuxでやってるんだけど
ときどき頼まれてWinで開発するときに
どこに置いたらいいものか悩む
0488487
2006/03/31(金) 12:50:350489デフォルトの名無しさん
2006/03/31(金) 12:57:58GNU makeだと\でエスケープできるよ
0490デフォルトの名無しさん
2006/03/31(金) 20:17:34javaぽい書き方してjavaのリファクタイングツールを流用するしかない?
0491デフォルトの名無しさん
2006/03/31(金) 21:47:18適当にどっかにライブラリ用のフォルダ作ってまとめとくのが普通でしょ
こんなの、落としてきたインストーラ無しのソフトを
どこに解凍して置いておこうかな、っていうレベルの問題だと思う
linuxでもそういうことあるし同じでしょ・・・
全体的なフォルダ構成が違うけど
0492デフォルトの名無しさん
2006/03/31(金) 22:58:05エロイのか?
0493デフォルトの名無しさん
2006/03/31(金) 22:59:02ナウなヤングにバカウケ
0494デフォルトの名無しさん
2006/03/31(金) 23:00:48ナウでヤングに出来ないかな?
0495デフォルトの名無しさん
2006/03/31(金) 23:01:57適当に置くこともできるけどUNIXではコンセンサスみなたいなものはあるよ
手元に環境あれば
$ man hier
してみれば解説されている
0496デフォルトの名無しさん
2006/03/31(金) 23:47:13ttp://www.s34.co.jp/cpptechdoc/article/newcast/
0497デフォルトの名無しさん
2006/03/32(土) 03:07:42関数に渡したときもうまくいく方法があれば教えてほしい。(あっちのスレでね)
http://pc8.2ch.net/test/read.cgi/tech/1029599472/358-360
0498デフォルトの名無しさん
2006/04/02(日) 00:02:470499デフォルトの名無しさん
2006/04/02(日) 00:09:54static_cast のほうができることが少ない。そのぶん安全。
また、検索しやすいという効果もある。
0500デフォルトの名無しさん
2006/04/02(日) 00:21:14static_cast と const_cast と reinterpret_cast に分割した,
と思っておけば大体おk.
static_cast: 暗黙にできる型変換を明示的にやるために使う.
const_cast: const/volatile をつけたりはずしたりするために使う.
reinterpret_cast: 実装に依存するような型変更のために使う.
0501デフォルトの名無しさん
2006/04/02(日) 00:30:45誤解してるやつが多いんだが、 const, volatile をつけるときは const_cast 使わなくていい。
危険なキャストを洗い出すときに const_cast 検索するから、つけるときは static_cast で。
0502デフォルトの名無しさん
2006/04/02(日) 00:47:56すまん、意味がわからん。
C style のキャストも const_cast も使用せずに
どうやって const, volatile を付けるん?
暗黙の変換のこと?
0503デフォルトの名無しさん
2006/04/02(日) 00:48:410504デフォルトの名無しさん
2006/04/02(日) 01:06:33いつもはreinterpretを使ってたんだけど
あちこちでstaticの方でやってるのを見かけて自信がなくなってきてる
0505デフォルトの名無しさん
2006/04/02(日) 01:08:08ああ、すまん。そーゆー意味か。
0506デフォルトの名無しさん
2006/04/02(日) 01:18:07void* からオブジェクトポインタへの変換は static_cast 。
reinterpret_cast は間違い。
0507デフォルトの名無しさん
2006/04/02(日) 01:32:10検索はしづらくなるけど
0508デフォルトの名無しさん
2006/04/02(日) 01:32:550509デフォルトの名無しさん
2006/04/02(日) 01:36:59ビット表現が保持されると決まっているわけじゃない。
0510504
2006/04/02(日) 01:41:22thanks
staticは安全なの、reinterpretは危険なのを強引に、
dynamicはvtable付きクラスをダウンキャスト、constはconst,volatile外し
ってイメージで使ってた。
無チェックなダウンキャストとか、継承関係に無いポインタ間のキャストは
危険そうだったからreinterpretのイメージだったけど
危険さ具合がイメージとちょっとずれてたみたい。
0511デフォルトの名無しさん
2006/04/02(日) 01:41:34む、そうなのか・・・
ちょっと適当に自分でいろいろ試すことにする
0512デフォルトの名無しさん
2006/04/02(日) 01:48:42無チェックなダウンキャストは static_cast 。
継承関係が無ければエラーになる。
reinterpret_cast だとエラーにならない。
0513デフォルトの名無しさん
2006/04/02(日) 02:05:07特殊用途のdynamic,constの他は全部staticすか
0514デフォルトの名無しさん
2006/04/02(日) 02:23:51どうもいまいちreinterpret_castの使いどころがわからないんだよな。
0515デフォルトの名無しさん
2006/04/02(日) 02:25:23out.write(reinterpret_cast<char*>(&i), sizeof(i));
してるんだけど、これって実装依存になるのかな?
規格中に
・ int* から void* に変換したとき、変数の記憶域の先頭を指す。
・ void* と char* は同じ内部表現を持っている。
っていうのは見つけた。
だから static_cast<char*>(static_cast<void*>(&i)) なら大丈夫そうなんだけど、
これは激しくウザイ。
0516デフォルトの名無しさん
2006/04/02(日) 02:32:56この場合はreinterpret_castでいいのかな。
0517デフォルトの名無しさん
2006/04/02(日) 02:38:03普通、絶対そんなことしないと思うが、 alignとか考えたことある?
0518デフォルトの名無しさん
2006/04/02(日) 02:44:20皆キャストも満足に扱えてない。
0519デフォルトの名無しさん
2006/04/02(日) 02:48:50int i;
char c;
} d;
write(fp, &d, sizeof(Data));
0520デフォルトの名無しさん
2006/04/02(日) 02:54:56read, write の引数は char* なわけだが、「普通」はどうするのかね?
0521デフォルトの名無しさん
2006/04/02(日) 02:56:11void*じゃねーの
0522デフォルトの名無しさん
2006/04/02(日) 03:02:16POSIX の read, write は void* だな。
でも今話してるのは iostream の read, write で、こっちは char* になってる。
0523デフォルトの名無しさん
2006/04/02(日) 03:06:02そのlistをdeleteすればそのクラスの実態まで消えるのでしょうか?
0524デフォルトの名無しさん
2006/04/02(日) 03:07:470525デフォルトの名無しさん
2006/04/02(日) 03:14:56別途削除ですか……
0526デフォルトの名無しさん
2006/04/02(日) 03:16:29Effective STLとかにそのへんのこと詳しく載ってる
0527デフォルトの名無しさん
2006/04/02(日) 03:24:49即レス乙です。ちょっと憂鬱読んで気になったもので……
0528デフォルトの名無しさん
2006/04/02(日) 03:26:40>>526でした。
0529デフォルトの名無しさん
2006/04/02(日) 08:02:380530デフォルトの名無しさん
2006/04/02(日) 08:03:34なんのためにキャストしようとしているか理解していればそんなことはおき得ない
0531デフォルトの名無しさん
2006/04/02(日) 08:08:38その他に、ポインタが指す先がすべて new で確保したもので、2カ所以上からポイントされていないという保証も必要
ポインタの列を list で扱うというパターン自体が、そもそも自動 delete を望まないか、list で作っているのが部分集合で
全体集合を作っているコンテナに破壊の仕掛けがあるような場合に使うもの
0532デフォルトの名無しさん
2006/04/02(日) 08:11:230533デフォルトの名無しさん
2006/04/02(日) 08:16:51そんなときこそ delete して 0 代入イディオムですよ
0534デフォルトの名無しさん
2006/04/02(日) 09:40:430535デフォルトの名無しさん
2006/04/02(日) 09:48:01alignは#pragmaでごにょごにょしました。
やっぱり変数ごとに一個ずつ読んだり書いたりしないとだめなんかな。
ファイルヘッダとかは一気に構造体で扱っちゃったほうが分かりやすいと思ったんだけど……。
0536デフォルトの名無しさん
2006/04/02(日) 09:57:57互換性をいいだせば整数とかも文字列に変換せんといかんのじゃないか。
0537デフォルトの名無しさん
2006/04/02(日) 11:29:33struct A{
unsigned int data;
} a;
を
ifstream.read((char*)&a, sizeof(a));
したときの互換性?で致命的な問題って何があるでしょうか。
エンディアンぐらいしか思い浮かばない自分は半年ROMるべきでしょうか。
0538デフォルトの名無しさん
2006/04/02(日) 14:15:520539デフォルトの名無しさん
2006/04/02(日) 14:20:59思いつくのは揚げ足取り:
・alignmentを1バイト境界にできないコンパイラが存在したときに困る
・メンバにポインタや参照を含むときに望ましい結果にならない(そもそもやろうとしてないだろうけど)
・バイナリでの入出力は、どうも、C++では熟考されてない雰囲気
・アドバイス「構造体よりクラスを使え」
漏れも、たとえばWindowsBMP(DIB)のBITMAPINFOHEADERのような場合、
#pragma等でごにょってread(&struct)してるよ。ついでにoperator>>()も定義して
BITMAPFILEHEADER bf;
cin >> bf;
0540539
2006/04/02(日) 14:40:13これの意味は、バイナリ入出力では「型のビット表現」そのままを入出力するしかできないので、
型の大きさ(char単位の大きさ)、エンディアン、浮動小数点なら各ビットの意味など
判別・読み書き時にC++ライブラリの支援がない(支援ができない)。
そもそも、読み書きすべきバイナリデータが、C++だけで使われるとは限らない。
アマゴサ星系のエル・オーリアン人が、彼らの特殊言語で読み書きするかもしれない。
バイナリで扱うなら、ファイルの先頭あたりにUTFのBOMのようなものを入れるしかない。
「安全」さを求めるならテキスト入出力を使うべきなんだろう。
非現実的だが。
>>538
その問題は、read((char*)&a, sizeof(a))の問題ではなく、バイナリ入出力自体の問題じゃないかな。
0541デフォルトの名無しさん
2006/04/02(日) 14:49:56構造体のメンバを一つずつファイルに書き込んでたから
アラインメントとか考えるとこういう風になっちゃうのかなー
と思って、おれもそうしてた
まあ、C言語だけど
0542デフォルトの名無しさん
2006/04/02(日) 14:59:04・実際はtypedefしたdwordなので、intのサイズが違ったらtypedefを書き換えればいいかなぁとか。
・1バイト境界に出来ないコンパイラは考えてませんでした。反省。
・ポインタを含むようなら当然このような手段は取らないです。
・C++ではストリーム使うべきかなと思ったんですが……やめたほうがいいですかね。
・単にデータをバインドするだけの使い方をしたかったので、純粋な構造体を使いました。
構造体はこういう使い方をするべきではないでしょうか。
実際はファイルを扱うクラスのreadメンバ関数の中で処理してます。
virtualメンバ関数があるとsizeofがずれてしまうので構造体なんですけども。
>BITMAPINFOHEADER
はい、まさにそんな感じです。
ifstream.readを変数分全部書くと、構造体メンバの変更があったときコードにも影響が出ますよね。
もっといい書き方あるんでしょうか。
0543デフォルトの名無しさん
2006/04/02(日) 15:03:10考えれば、ほぼ必然的に int とか struct をそのまま write
したりは出来なくなるよね。
定義されてる(or 定義した) とおりのデータを、定義どおりの順に
定義どおりのサイズで読み書きする。たまたまパディングを調整
できるコンパイラで、バイトオーダーもあっていれば struct とかも使える。
そんだけのこと。
0544542
2006/04/02(日) 15:08:52>>540
可搬性を求めると問題は尽きないんですね……。
>>541
やっぱりそうなっちゃいますか〜。
>>543
なるほど……良くわかりました。
変数を全部読み込む手間 <-> 一度に読み込むリスク
でトレードオフってことですね。
0545デフォルトの名無しさん
2006/04/02(日) 15:27:22GUI ならどうせ他の色んな所でプラットフォーム固定のコードを書かざるを得ないだろうし、
ファイルの読み書きのところだけ可搬性を重視してもナンセンスかと。
0546542
2006/04/02(日) 15:34:45ある程度汎用性があったほうがよいかと思って色々と考えていました。
でも確かにここだけ可搬性を求めても仕方ないですね。
align指定と構造体で置いておくことにします。
色々とどうもありがとうございました。
0547デフォルトの名無しさん
2006/04/02(日) 18:35:19プラットフォームを変更したところで、
その構造体のところの定義をいじっただけで済むと思われ。
0548デフォルトの名無しさん
2006/04/02(日) 21:00:28何か気持悪いんですが……。
0549デフォルトの名無しさん
2006/04/02(日) 21:12:14個人的には彼女を持ったからオナニーをしたくないんですけど、杞憂でしょうか。
何か気持悪いんですが……。
と言われてる気分だ。お前の勝手にしろ。
0550デフォルトの名無しさん
2006/04/02(日) 21:37:05普通に sizeof 使ってたらアライメントも問題にならないと思うんだけど。
0551デフォルトの名無しさん
2006/04/02(日) 21:39:07別環境では、ずれる可能性があるって話では?
0552デフォルトの名無しさん
2006/04/02(日) 21:48:24別環境だったらサイズやビット表現も違う可能性もあるだろ。
アライメントだけ指定する意味が無い。
0553デフォルトの名無しさん
2006/04/02(日) 22:14:21仮想関数さえなければ大丈夫だろ。
0554デフォルトの名無しさん
2006/04/02(日) 22:15:30そんなもん織り込み済みで話してる
0555デフォルトの名無しさん
2006/04/02(日) 22:15:48仮想関数があってもなくても関係ない。「好きにしろ」で終わり。
0556デフォルトの名無しさん
2006/04/02(日) 22:19:380557デフォルトの名無しさん
2006/04/02(日) 22:19:58仮想関数テーブルへのアドレスが読み書きされちゃうじゃん。
0558デフォルトの名無しさん
2006/04/02(日) 22:23:310559デフォルトの名無しさん
2006/04/02(日) 22:28:29じゃぁ >>550 の答えは?
0560デフォルトの名無しさん
2006/04/02(日) 22:39:25漏れ個人的にはグローバルなコンパイルオプションなんかで
(ファイル書き出しなどに使う)構造体のレイアウトが変わったら
イヤだから、#pragma pack とかでアライメントは指定してる。
関連プログラム全部同じオプションでコンパイルするしー、とか
未来永劫アライメントなんか変えないしー、
っていう人なら確かにいらんかもしれないな。
0561デフォルトの名無しさん
2006/04/02(日) 23:00:29コンパイラが勝手にintとかshortをワード、ダブルワード境界に揃えてしまいました。
それでは構造体で一気に読み込むとパディングのせいで実際のファイル構造とずれてしまうので、
#pragmaでアライメントをバイト境界に指定するわけですが、
#pragmaの機能は当然処理系依存機能なので余り広範囲に使いたくありません。
(コンパイラを変更したら#pragmaを恐らく変更しなければならない)
エンディアンはこの際おいておいても、同一の性質を持つ記述を散在させるのは気持ちが悪いので、
PODのみを持つ構造体にアライメントを指定しておいて、それを扱うクラスにはアライメントを干渉させないように
したのです。
0562デフォルトの名無しさん
2006/04/02(日) 23:07:28なんか感覚おかしくね?
将来的なことを心配するならアライメント依存しない方法を選ぶだろ。
0563デフォルトの名無しさん
2006/04/02(日) 23:10:230564デフォルトの名無しさん
2006/04/02(日) 23:36:39そんなの使う場所で環境依存云々言ったって五十歩百歩。
0565デフォルトの名無しさん
2006/04/02(日) 23:44:09皆さんのお考えを聞いてみたかったのです……。
>>558
仮想関数を持ったクラスはsizeofの値が増加します(VCでは増えました、処理系によるかもしれません)。
この場合alignmentではなくこの増加分がどこに収められるかが心配なのです。
sizeofでサイズをとっての読み書きを想定しているので、
sizeofがずれるとread(&struct, sizeofA)では問題があるのです。
>>562
プログラムがalignmentに依存しないとしても、ファイルフォーマットは固定されてます。
構造体で一気に読むとしたらalignmentは少なからず関与してくると思います。
>>563
処理系依存なのはalignとエンディアンとパディングの大きさだけかと思っていました。
構造体一気読み自体が処理系依存とはどういうことでしょうか。
fstreamの仕様に関わることでしょうか。
>>564
ハックになってしまいますか。
メモリダンプというよりバイナリファイルダンプに近いんですけど。
なんだか収まりがつかなくなってきてしまったので、最後に皆様に率直にお聞きします。
私の構造体一気読みのコードを保守する羽目になったら私を殺そうと思いますか?
0566デフォルトの名無しさん
2006/04/02(日) 23:47:250567デフォルトの名無しさん
2006/04/02(日) 23:48:42あとchar以外の変数のサイズは処理系依存だけど。
0568デフォルトの名無しさん
2006/04/02(日) 23:52:25それを前提にしている構造体一気読みも当然処理系依存だろ。
>565
Win32上の処理系だと、COMの関係で、vtblはクラスの先頭に
もってきてる可能性が高い。
0569デフォルトの名無しさん
2006/04/03(月) 00:04:130570デフォルトの名無しさん
2006/04/03(月) 00:11:49sizeof(char)==1
であることは規定されている
0571542
2006/04/03(月) 00:28:49共用体ではないクラスの非静的データメンバがアクセス指定子が間に入らずに宣言された場合、
後で宣言されたデータメンバのほうがクラスオブジェクト内でより高位のアドレスになるように割り当てられる。
(X3014:2003より引用)
らしいです。
型のサイズについては>>542の最初の項のとおりです。
>>568
そうですね……。
3つの条件をクリアしたらいいのだろうか、と思いましたが、
よく考えるとつまりそれが処理系依存でした。
処理系依存でOKなら一気でもOK
ダメなら一個ずつ読み書きしなさい、ということですね。
0572デフォルトの名無しさん
2006/04/03(月) 00:35:10結局「勝手にしろ、好きにしろ」としかいえないのが現実なんじゃないの?
構造体一気読みはコードを書くのが簡単だし、パフォーマンス上好ましいことも
あるだろう(fstreamを使っている時点でアレかもしれんが)。
他プラットフォームへの移植性が求められるなら、一バイトずつ読み書きするのが
比較的良い方法になるだろう。それでもC++の規格はすべての環境で同じファイル
フォーマットが使えることを保証してはくれないだろうけど。
その気があれば、移植するすべてのプラットフォームごとにマクロで実装を
切り替えたっていい。
プラットフォームごとの違いを吸収してくれるバイナリ入出力ライブラリ
みたいなものを作ってもいい。
好きにしろ。
0573542
2006/04/03(月) 00:51:29読み込むにしても、もっとよい策が無いかなぁと思ったものですから、
経験豊富そうな方がいそうなここへ書き込んだしだいです。
少なくとも私の考えた策は処理系依存を気にしないなら使えることが分かりましたし、
可搬性や移植性を考えるならすべきでは無いことも分かりましたので、
後は好きにさせていただきます。
色々と為になる書き込みを戴きました。
どうもありがとうございました。
0574デフォルトの名無しさん
2006/04/03(月) 02:05:240575デフォルトの名無しさん
2006/04/03(月) 02:06:130576デフォルトの名無しさん
2006/04/03(月) 02:17:400577デフォルトの名無しさん
2006/04/03(月) 09:34:450578デフォルトの名無しさん
2006/04/03(月) 16:01:05例えばWin32 APIなんかだと構造体の最初のメンバが自分自身のsizeofを保持するケースがけっこうある。
先の例のBITMAPINFOHEADERでも、
unsigned long biSize; // 構造体のサイズ(バイト)
なんてメンバがある。
バイナリ入出力以前に、alignmentをバイト境界にしておかないと、こういうケースでハマると思うんだけど。
(構造体のサイズをハードコーディングするか、#pragmaごにょごにょ)
で、まぁ、なにがいいたいかというと…
alignment、endian、padding、メモリ上のビット表現を考慮し、
各環境で最適なコードで(一気読みできるならそうして、1バイトずつ変換が必要ならそうする)、
ストリームとバイナリ入出力してくれるような
可搬性のあるバイナリ入出力ライブラリ誰か作って…!
0579デフォルトの名無しさん
2006/04/03(月) 16:29:45バイト境界でなくても整合性さえ取れていれば問題ないと MSDN に書かれてます。
0580デフォルトの名無しさん
2006/04/03(月) 20:44:44以前実測したが、fstreamとFILE*は、readで一気読みする分には処理速度変わんないよ。
IOがでかすぎるせいで、差が消えちゃう。
0581デフォルトの名無しさん
2006/04/03(月) 20:51:43Unix の read() や Windows の ReadFile で細かい単位で読み書きしたり
すると、あるべき速度の10倍くらい遅いプログラムも簡単に作ることができる。
0582デフォルトの名無しさん
2006/04/04(火) 16:41:00考えてみれば関数オブジェクトから、Fooクラスのprivateメンバにはアクセスできないっす。
これは一々getter用意するなり、friendにせざるを得ないんすかね。
と、言いますか、operator=や、operator<なんかが、他オブジェクトのprivateメンバにアクセスできるのは、
どの辺に規定されてるんすかね。ドラフト見てもいまいち分からないっす…。
0583デフォルトの名無しさん
2006/04/04(火) 16:45:24Fooクラスにoperator<を持たせりゃいいじゃん。
それと、operatorなんとかのスコープは関数と同じ。どういう宣言を
されてるかだけによる。
0584582
2006/04/04(火) 16:53:28レスサンクスです。後者は勘違いしてました。
自分と同じクラスのprivateメンバなら、他オブジェクトでもアクセス出来ちゃうってことすか…。
何か納得いかないすが、理解できました。
何通りかでsortしたいんすが、「Fooクラスにoperator<を〜」では、一つしか賄えなくて困ってるっす。
でもgetterなりしか無いようでしたら、諦めるっす。
0585デフォルトの名無しさん
2006/04/04(火) 17:15:03関数オブジェクトのコンストラクタに引数をとるという方法は?
引数によって、どういう比較をするか、決めればいいのでは?
0586デフォルトの名無しさん
2006/04/04(火) 17:19:21外部から与えるコンパレータが内部構造に依存するのは道理としておかしい
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Foo {
int a, b;
public:
Foo(int a, int b) : a(a), b(b) { }
bool operator < (const Foo& o) const { return cmp_ab(*this, o); }
static bool cmp_ab(const Foo &lhs, const Foo &rhs) {
return lhs.a != rhs.a ? lhs.a < rhs.a : lhs.b < rhs.b; }
static bool cmp_ba(const Foo &lhs, const Foo &rhs) {
return lhs.b != rhs.b ? lhs.b < rhs.b : lhs.a < rhs.a; }
};
int main() {
vector<Foo> v;
v.push_back(Foo(0,2));v.push_back(Foo(1,1));v.push_back(Foo(2,0));
sort(v.begin(), v.end(), Foo::cmp_ab);
sort(v.begin(), v.end(), Foo::cmp_ba);
}
0587デフォルトの名無しさん
2006/04/04(火) 18:13:15関数オブジェクトの形にしないでもsortって使えるんですね。
見た目もすっきり。ありがとうございました。585さんもサンクス。
0588デフォルトの名無しさん
2006/04/05(水) 18:35:05クラスのメンバ内に次のような宣言があるとします。
public:
int num0;
int& operator=(int num1);
int& operator=(int num1); が呼ばれないようにひっそりと num0に
NULL を入れるにはどうやればいいですか?
0589デフォルトの名無しさん
2006/04/05(水) 18:41:09代入演算子はコピーには適用されなかったと思うからそうすりゃいいんじゃね?
0590デフォルトの名無しさん
2006/04/05(水) 18:48:07public:
int num0;
int& operator=(int num1);
};
main()
{
A a;
a.num0 = 0;
}
0591デフォルトの名無しさん
2006/04/05(水) 18:54:37コピーコンストラクタを作れってこと?
0592デフォルトの名無しさん
2006/04/05(水) 19:34:03がnum0に代入するときに呼ばれると思ってるのか?
0593デフォルトの名無しさん
2006/04/05(水) 21:03:02よく読むと全く意図の分からない電波質問だな
0594デフォルトの名無しさん
2006/04/05(水) 21:28:33・メンバ変数がpublic
・operator=で何をさせたいのかが不明
0595ガウショ
2006/04/05(水) 22:18:01char *型の引数で結果を受け取る関数ありますよね?
あれをstd::stringで受け取れるようにしたいです。
理想(無理だけど)↓
string s;
sprintf(s.data(),"aaa");
とか
string s;
GetDlgItemText(hWnd,ID,s.data(),256);
何かいい方法があったら教えて下さい。
0596デフォルトの名無しさん
2006/04/05(水) 22:19:230597デフォルトの名無しさん
2006/04/05(水) 22:20:540598デフォルトの名無しさん
2006/04/05(水) 22:23:41一時バッファ用意するしか無いと思う。
>>596
わかってなさすぎだと思う。
0599デフォルトの名無しさん
2006/04/05(水) 22:24:42#ifdef __cplusplus
BOOL GetDlgItemText(HWND, std::string&);
#endif
0600デフォルトの名無しさん
2006/04/05(水) 22:24:53std::stringってvectorの様に連続性が保証されてなかったんじゃなかったっけ?
0602デフォルトの名無しさん
2006/04/05(水) 22:27:44特に何も解決してなくね?
0603デフォルトの名無しさん
2006/04/05(水) 22:28:16コンストラクタで初期化せんでも、単に代入すればいいじゃん。
publicなんだし、num0への代入にoperator=は何も関与しないし。
0604デフォルトの名無しさん
2006/04/05(水) 22:31:43ひっそりと、っていうからクラスを利用する側に意識させたくないのかと思ったけど
それもそうか
0605ガウショ
2006/04/05(水) 22:35:03ありがとうございます!
>>598
やってみます。
0606ガウショ
2006/04/05(水) 23:00:390607デフォルトの名無しさん
2006/04/05(水) 23:03:53ransu=rand()%100;
とやっても生成された乱数が同じ数字が三連発されたり等でかなり「つかえねー」のですが
もっとゲームなどに適した乱数関数ってありますか?
0608デフォルトの名無しさん
2006/04/05(水) 23:04:53Mersenne Twister
0609デフォルトの名無しさん
2006/04/05(水) 23:05:270610デフォルトの名無しさん
2006/04/05(水) 23:09:06sprintfの代替にはboost::formatがある。
後者は自分でstd::string(というよりもおそらくstd::basic_string<TCHAR>)を受け取る関数を作るしかない。
ただし>>600に注意。
スレ違いな回答をするが、
ATL::CWindow::GetWindowTextならATL::CStringで受け取れる。
またATL::CStringにはFormatというsprintfの代替がある。
MFCのCWndとCStringでも可。
0611ガウショ
2006/04/05(水) 23:18:44stringをメンバにして自作クラスつくりまふ。
んでreserveして文字列受け取るメソッド作る。
cString s;
sprintf(s.GetCStr(),"aaa");
みたいな
0612ガウショ
2006/04/05(水) 23:33:450613デフォルトの名無しさん
2006/04/05(水) 23:40:40なんかそんなのboostにあったような無かったような…
0614607
2006/04/05(水) 23:43:54サンクス。
早速使ってみますた。
あまりの格の差に笑いすらこみ上げますた。
…rand()なんて薦める本は全部焼却処分したい気持ちだw
0615デフォルトの名無しさん
2006/04/05(水) 23:47:480616デフォルトの名無しさん
2006/04/05(水) 23:51:12boostは標準じゃないんだから、書きたくても書けない。
あと、標準のrandも、実装によってはMTが使われる場合もある。
0617デフォルトの名無しさん
2006/04/06(木) 00:27:28どこかrandの使い方を間違えてるように見えるんだけど
もしかしてrandを使うたびにsrandしてない?
0618デフォルトの名無しさん
2006/04/06(木) 01:16:44お世話になります。
開発環境:WindowsXP VC++6.0 MFC使用
ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し
子画面(A_Child)を表示させます。表示方法はDoModal()で。
そのA_ChildはCDialogベースです。
A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を
何も出来ない様にしたいのですが、方法はありますでしょうか?
(例:スタート→ログオフでダイアログが表示しますよね。
その時ってそのダイアログ以外は触れないですよね。)
せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。
SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。
DoModalで表示させるのがそもそもまちがいののでしょうか?
何か方法が有りましたらよろしくお願いします。
説明が下手ですみません。
PS
システムモーダルのチェックONで常に最前面に表示されているのですが
後ろの画面等が操作できてしまうんです・・・・。
0619デフォルトの名無しさん
2006/04/06(木) 01:33:300620デフォルトの名無しさん
2006/04/06(木) 01:34:41スレ違い
0621デフォルトの名無しさん
2006/04/06(木) 02:10:35そうだな。ありがちなのはtime()が一秒ぐらい同じ値を返すから、srandに3回ぐらい同じ値を
渡してるとか。
0622デフォルトの名無しさん
2006/04/06(木) 02:30:12(int) (100.0 * rand() / (RAND_MAX + 1.0))
のように上位ビットを用いなくては均等な乱数にならない。
0623デフォルトの名無しさん
2006/04/06(木) 02:40:23最近ではそれを考慮して実装されてるとどこかで聞いた。
ちょいと実験してみる。
0624デフォルトの名無しさん
2006/04/06(木) 02:46:07operator%を定義してるのかなー、とか考えてしまったではないか・・・w
キニシナイでおくれ
0625デフォルトの名無しさん
2006/04/06(木) 04:09:09みたいなのって定義出来ないの?オッパイ
0626デフォルトの名無しさん
2006/04/06(木) 05:51:08rand()をMersenne-Twister使って実装してるような処理系あるか?
0627デフォルトの名無しさん
2006/04/06(木) 12:00:19double X; //X座標
double Y; //Y座標
} SCoord ; //座標構造体
vector<SCoord*> CoordsList; //座標構造体へのポインタ列を格納するベクタ
srand((unsigned)time( NULL )); //乱数の初期化
for (unsigned int i=0; i<10; i++){
SCoord* pTempCoord;
pTempCoord = new SCoord;
SCoord->X = (double)rand(); //乱数で座標を生成、代入
SCoord->Y = (double)rand();
CoordsList.push_back(pTempCoord);
} //座標構造体のインスタンスを10個作ってポインタを格納
念のためファイルに
ofstreamfout("出力先ファイル.txt");
for (unsigned int i = 0; i < CoordsList.size(); i++){
SCoord* pTempCoord;
pTempCoord = (BeadsList[i]);
fout << "X座標 " << pTempCoord->X << ", Y座標 " << pTempCoord->Y << endl;
}
で出力したところ、正しい値のように見えます。
ここで、pTempCoordはスコープの外ですが、そのポインタはCoordsListに保存
されています。また、newでインスタンスを確保しているので、deleteで開放
するまでメモリが開放されるわけではないと思うのですが、問題あるでしょうか?
0628デフォルトの名無しさん
2006/04/06(木) 12:07:59問題ない。
>SCoord->X = (double)rand();
pTempCoord->Xの間違いか?
0629デフォルトの名無しさん
2006/04/06(木) 13:05:46そのとおりです。(__);
0630デフォルトの名無しさん
2006/04/06(木) 13:19:42typedef struct {
double X; //X座標
double Y; //Y座標
} SCoord ; //座標構造体
vector<SCoord*> CoordsList; //座標構造体へのポインタ列を格納するベクタ
srand((unsigned)time( NULL )); //乱数の初期化
for (unsigned int i=0; i<10; i++){
SCoord* pTempCoord;
pTempCoord = new SCoord;
pTempCoord->X = (double)rand(); //乱数で座標を生成、代入
pTempCoord->Y = (double)rand();
CoordsList.push_back(pTempCoord);
} //座標構造体のインスタンスを10個作ってポインタを格納
使用済み座標構造体のインスタンスをメモリから削除するつもり
for (unsigned int i = 0; i < CoordsList.size(); i++){
delete CoordsList[i];
}
CoordsList.clear(); //オートポインタなので不要とは思うが、念のためベクタをクリア
ベクタに格納したポインタは特に放置してもプログラム終了とともに自動消滅するでしょうけど、
構造体のインスタンスはプログラム終了後もメモリに残ると思います。それで構造体のインス
タンスを個別に開放しようとしているのですが、プログラムが異常終了してしまいます。
どこに問題があるのでしょうか?
0631デフォルトの名無しさん
2006/04/06(木) 13:54:48問題ないようだけど?
> プログラムが異常終了してしまいます
をもっと具体的に。
0632デフォルトの名無しさん
2006/04/06(木) 13:56:52for (unsigned int i = 0; i < CoordsList.size(); i++){
0633デフォルトの名無しさん
2006/04/06(木) 13:59:39それの何処に問題が?
0634632
2006/04/06(木) 14:03:110635デフォルトの名無しさん
2006/04/06(木) 14:46:18>構造体のインスタンスはプログラム終了後もメモリに残ると思います。
OS のないシステムなんですか?
>//オートポインタなので
何が?
で、どこでコケてるんですか?
0636デフォルトの名無しさん
2006/04/06(木) 15:06:23ですが、デバッガでステップ実行したら、>>630で書いたコードまで終了した
ところで、ソースファイルControls.pasが見つかりません。というダイアログ
が開き、パスを入力するようになりました。
Controls.pasって多分C++BuilderのGUI関連のライブラリのソースで、普通に
インストールすれば、ユーザーが知らなくても処理に必要なら処理系は知ってる
はずと思うのですが...
for (unsigned int i = 0; i < CoordsList.size(); i++){
delete CoordsList[i];
}
の部分をコメントアウトするとメモリリークしてるかもしれませんが正常終了します。
for (unsigned int i = 0; i < CoordsList.size(); i++){
SCoord* pTempCoord;
pTempCoord = CoordsList[i];
delete pTempCoord;
}
や
for (unsigned int i = 0; i < CoordsList.size(); i++){
delete (SCoord*)CoordsList[i];
}
に、変更しても同じなので、ポインタのデータサイズがわからなくなると
いった問題ではなさそうです。
0637デフォルトの名無しさん
2006/04/06(木) 15:07:430638デフォルトの名無しさん
2006/04/06(木) 15:13:440639デフォルトの名無しさん
2006/04/06(木) 15:14:090640デフォルトの名無しさん
2006/04/06(木) 15:24:17標準C++の範囲では、見たところソースコードに問題ない。
あくまでも趣味の違いだが、SCoord生成時はnew代入じゃなく初期化時new、削除はイテレータを使うくらいか?:
Sccord* pTempCoord = new SCoord;
for (vector<SCoord*>::iterator it = CoordsList.begin(); it != CoordsList.end(); ++it) delete *it;
Controls.pasは、処理系依存の問題なので、スレ違い。
C++Builder相談室 Part16
http://pc8.2ch.net/test/read.cgi/tech/1138766165/l50
0641デフォルトの名無しさん
2006/04/06(木) 15:25:40何か実行ファイルを開いたとき、他のプログラムを開きたいのだろう。
そして、環境もいわないという傲慢さだ。
そうだなぁ……。
大抵のOSでは、実行するシステムコールもしくはAPIなどがあるから、それをフックして……。
0642637
2006/04/06(木) 15:33:49組みたいプログラムは実行ファイルを開くと他の実行ファイルをオープンさせるという仕組みのプログラムです。
つまり実行ファイルを開いたらブラウザやテキストエディタを起動するようなプログラムを作りたいってこと。
0643デフォルトの名無しさん
2006/04/06(木) 15:36:48>>636
C++Builderなんていう腐りきった処理系は窓から投げ捨てろ
0644デフォルトの名無しさん
2006/04/06(木) 15:37:48ありがとうございました。どうも処理系依存の問題のようですから
C++Builder相談室 Part16に行ってみます。
0645デフォルトの名無しさん
2006/04/06(木) 15:44:50windows用のC++用開発ツールで、お勧めの腐りきってない処理系って
何ですか?...VC6からC++Builderに逃げ出したのですが...
0646デフォルトの名無しさん
2006/04/06(木) 15:45:28WinだったらShellExecuteだけど、スレ違いだから他行ってね。
0647デフォルトの名無しさん
2006/04/06(木) 15:55:462005 Express Edition じゃだめ?
0648デフォルトの名無しさん
2006/04/06(木) 16:10:17別にC++Builderでもいいと思うぞ。
少なくとも、VCLは優れたライブラリだと思う。いささか古い設計ではあるけどね。
今後の発展(標準C++やC++0xへの準拠)はもう望めないけれど、
Win専用GUIつきユーティリティ開発なら悪い選択肢ではない。
漏れはgcc/icc+wxWidgets でもこれは他人におすすめできない。
0649デフォルトの名無しさん
2006/04/06(木) 16:19:202005 Express Edition ってVCの新バージョンですか?
乗り換えた頃はVC6で、正確には覚えていないけど、
std::でコンパイルできないことがいくつかあったことと
BCB6にはposix互換関数が揃っていて、UNIXやLinuxへの
移植性があるプログラムが書けると思いました。
IDEのエディタがVCより更にひどかったけど、秀丸を
併用して、セーブしてIDEに戻ると、ソースが変更されました、
読み直しますか?と聞いてくるので、Yes、再コンパイルで
エディタの悪さはカバーできたし...VCLのソースが
パスカルって言うのは気になったけど、ブラックボックスだと
思えばWinMain関数まで隠してしまうMFCよりはましに思えたし...
...で、2005 Express Edition ってBCB10と比べてどういいの?
0650デフォルトの名無しさん
2006/04/06(木) 16:21:48やたらと重かったりインテリセンスが鈍くて困る
VC++2003から乗り換える理由が見つからん
BCBよりはマシじゃね
0651デフォルトの名無しさん
2006/04/06(木) 16:33:53リソースエディタ付いてないけどそういうの使わないし
てか発売されてるのは高杉
落とせばいいけど開発者としてなんだか悪い希ガス
0652デフォルトの名無しさん
2006/04/06(木) 16:44:13>落とせばいいけど開発者としてなんだか悪い希ガス
なんで?これMSが無償配布してるんだよね
0653デフォルトの名無しさん
2006/04/06(木) 16:46:080654デフォルトの名無しさん
2006/04/06(木) 16:47:18それとは別の発売されてる方だろ
雑談終了
0655デフォルトの名無しさん
2006/04/06(木) 16:50:19OSとVSが使い放題だった時期があったけど、今は高すぎ。
OS供給だけのMSDNに入ってる。
0656デフォルトの名無しさん
2006/04/06(木) 16:55:270657デフォルトの名無しさん
2006/04/06(木) 16:56:17暗号化されたソース読むのも勉強になるし
0658デフォルトの名無しさん
2006/04/06(木) 17:19:07sscanf に該当するものがないのは寂しいな。
0659デフォルトの名無しさん
2006/04/06(木) 17:20:53stringstreamは?
0660デフォルトの名無しさん
2006/04/06(木) 17:25:34逆だろ
0661デフォルトの名無しさん
2006/04/06(木) 17:26:590662デフォルトの名無しさん
2006/04/06(木) 17:56:03いや、stringstream があるのに、boost::format が出来たのは、
マニュピレータの指定が面倒だからでしょ。
たとえば、"0123456789ABCDEF" という入力があったとして、
これを、4桁ずつの16進数と解釈して4つの整数変数に設定したい
みたいな要望があったとき、
sscanf( in, "%4X%4X%4X%4X", out1, out2, out3, out5 );
みたいに型安全に書けたら便利かなってこと。
0663デフォルトの名無しさん
2006/04/06(木) 17:58:320664デフォルトの名無しさん
2006/04/06(木) 18:17:29これから使ってみようかなと思ってたのに。
0665デフォルトの名無しさん
2006/04/06(木) 18:22:43>663が言う件では、投げられないとしても問題が無い部分だ。
let's boostの人がそう言ってるから請け売りしてるだけ。
0666663
2006/04/06(木) 18:31:29let's boost の人がそう言っている、というのは知らなかったな。
まあそれはいいとして、俺は以下のコードはとても気持ちが悪いと
思ってるんだが、問題は無いと思うべきなのか?
try {
cout << format("%06d") % 1.23 << endl;
cout << format("%s") % 1.23 << endl;
} catch (...) {
cout << "catch" << endl; // ここにはこない
}
0667デフォルトの名無しさん
2006/04/06(木) 18:34:440668デフォルトの名無しさん
2006/04/06(木) 18:54:15だったら、xpressive や、spirit の用に Expression Template で
フォーマット書くようなライブラリを使えばいいじゃん。
例外といわず、コンパイル時に警告してくれるぞ。
print( cout, _0d[6] % _endl, 1.23 ); // (int)1.23 でないと警告
print( cout, _s % _endl, 1.23 ); // コンパイルエラー
0669デフォルトの名無しさん
2006/04/06(木) 19:08:34>>666、は
動的にフォーマットを生成できて、
さらに実行時に型が間違っていれば、
例外を投げてくれるようなものを欲しているのではないか?
0670デフォルトの名無しさん
2006/04/06(木) 19:15:10書式文字列を動的生成してるひとってどのくらいいるんだろ?
.NET だと自分自身、設定ファイルに書式書き込んでおいて、
読み込むとか(たまに)やるけど、C/C++ だとやった記憶がない。
0671デフォルトの名無しさん
2006/04/06(木) 19:21:49ひと、じゃなくて場面の問題。俺は割合よくやる。
0672デフォルトの名無しさん
2006/04/06(木) 19:35:15printf()なら"%*.*s"とかできるから余りやらないけど、scanf()だと融通が利かないからたまにやる。
あー、設定ファイルにフォーマット文字列を書くのはしばしばやるか。
例えば、日付で生成するファイル名を変える場合にFILE_NAME_FORMAT=result_%04d%02d%02d.txtとか。
0673デフォルトの名無しさん
2006/04/07(金) 04:23:29vc++2005です
0674デフォルトの名無しさん
2006/04/07(金) 04:33:25プリプロセッサだけ動かすの。
0675デフォルトの名無しさん
2006/04/07(金) 05:14:57sscanfはおそろしく速いよ。
parserの型を保存した場合だと、spiritもほぼ同じ速さ。
istringstreamは糞。
0676デフォルトの名無しさん
2006/04/07(金) 05:25:180677デフォルトの名無しさん
2006/04/07(金) 06:41:200678デフォルトの名無しさん
2006/04/07(金) 09:00:28かどにできれば?
かくにできれば?
0679デフォルトの名無しさん
2006/04/07(金) 09:22:05プリプロセッサでの展開後の姿を覗けたらって感じ。
「お前の本性覗いてやるぞ!」
0680デフォルトの名無しさん
2006/04/07(金) 09:39:120681デフォルトの名無しさん
2006/04/07(金) 12:40:56きっとBoost Preprocessorみたいな複雑なマクロを書いているのだろう。
0682デフォルトの名無しさん
2006/04/07(金) 13:40:34#define F(X, Y, ...) X(Y, __VA_ARGS__)
って、標準C++で対応してたっけ。
g++ 3.4.2は対応してるけれど、標準かどうかがわからず。
0683デフォルトの名無しさん
2006/04/07(金) 14:23:590684デフォルトの名無しさん
2006/04/07(金) 14:36:48vc8でも対応しているから別にいいよそんなこと。
0685デフォルトの名無しさん
2006/04/07(金) 19:27:28template <typename T>
class C
{
T value; // 実際にはもっと複雑なクラス
};
enum gen_t { i, d, c };
void f(gen_t type)
{
switch(type) {
case i:
{
C<int> c;
g(c); // g()は関数テンプレート
// ...
}
break;
case d:
{
C<double> c;
g(c);
// ...
このようにswitch-caseで分岐するしか思いつきません。
0686デフォルトの名無しさん
2006/04/07(金) 19:30:46変数xって何。その例でいうところの f の引数の type のこと?
0687デフォルトの名無しさん
2006/04/07(金) 19:34:40すんません、変数xではなくて、fの引数のtypeです。
0688デフォルトの名無しさん
2006/04/07(金) 19:42:34gen_tは使わなければいけないの?
template <typename T>
void f()
{
C<T> c;
g(c); // g()は関数テンプレート
}
f <int> ();
の方が素直だと思うのだけど
0689デフォルトの名無しさん
2006/04/07(金) 19:43:48コンパイル時に型が決まんないんでしょ
0690デフォルトの名無しさん
2006/04/07(金) 19:53:30コンパイル時に型が決まらないテンプレートを使いたいとき、
仮想関数と組み合わせるというテクニックがある。
struct f_base{ virtual void f() = 0; };
template <typename T> struct f : f_base {
void f() {
C<T> c;
g(c);
// ...
}
};
0691690
2006/04/07(金) 19:54:350692デフォルトの名無しさん
2006/04/07(金) 20:03:48boost::variantでvisitorパターンとか
#include<boost/variant.hpp>
typedef boost::variant<C<int>,C<double>,C<char> > val;
template <typename T> val create(){return val(T());}
val(*table[])()={create<C<int> >,create<C<double> >,create<C<char> >};
struct call_g : boost::static_visitor<>{template<typename T>void operator()(T&t)const{g(t);}};
void f(gen_t type){
val v = table[(int)type]();
boost::apply_visitor(call_g(),v);
}
0693デフォルトの名無しさん
2006/04/07(金) 20:16:13enum gen_t { i, d, c };
template <typename T> void h(){
C<T> t;
g(t);
}
void(*table[])()={h<int>,h<double>,h<char>};
void f(gen_t type){
table[(int)type]();
}
0694デフォルトの名無しさん
2006/04/07(金) 20:47:42それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
いや、冗談です。マジで参考になります。
>>690氏の仮想関数だと、派生クラス(f_baseを継承したクラス)のインスタンス化は
やっぱりコンパイル時に行われませんか。
>>692-693
インスタンス化された関数ポインタをテーブルで持っておくアイディアは思いつきませんでした。
thxです!
0695デフォルトの名無しさん
2006/04/07(金) 21:46:54アホ、「すみ」だ
0696デフォルトの名無しさん
2006/04/08(土) 01:32:57なんだ、つのじゃなかったのか。
0697デフォルトの名無しさん
2006/04/08(土) 07:39:420698デフォルトの名無しさん
2006/04/08(土) 12:36:23_, ,_ パーン
( ‘д‘)
⊂彡☆))Д´) ←>>697
0699デフォルトの名無しさん
2006/04/08(土) 16:16:41enum eHoge{TEST0,TEST1};
int i = eHoge::TEST0;
こんな感じで出来ないんですね
0700デフォルトの名無しさん
2006/04/08(土) 16:19:040701デフォルトの名無しさん
2006/04/08(土) 16:19:09int Zeroに対してint::Zeroとかやってるのと同じ
0702デフォルトの名無しさん
2006/04/08(土) 16:27:39は?ぁ?
0703デフォルトの名無しさん
2006/04/08(土) 16:29:58VC++ 8 だとどうかしらん。
0704デフォルトの名無しさん
2006/04/08(土) 16:40:29バカ?
0705デフォルトの名無しさん
2006/04/08(土) 17:21:33VC++8ではC++/CLIなら699のようになった。
0706デフォルトの名無しさん
2006/04/08(土) 17:52:340707デフォルトの名無しさん
2006/04/08(土) 17:57:48値を限定したい気もするよな。
まぁいまさら仕様を変えるのは無理なんだろうけど。
0708デフォルトの名無しさん
2006/04/08(土) 18:10:05とか、enum の方にも名前をつけてないと、
型を使いたい時に困るぞい。
0709デフォルトの名無しさん
2006/04/08(土) 21:43:180710デフォルトの名無しさん
2006/04/08(土) 21:51:280711デフォルトの名無しさん
2006/04/08(土) 22:10:17それどこの英語の教科書?
0712デフォルトの名無しさん
2006/04/08(土) 22:14:38const long& b = a;
って、キャストで一時オブジェクトができて、その一時オブジェクトを
参照するらしいけど、一時オブジェクトって、その式が終わった瞬間
に消滅するから、この記述は無意味?
0713デフォルトの名無しさん
2006/04/08(土) 22:15:43うんにゃ
0714デフォルトの名無しさん
2006/04/08(土) 22:17:32その変数の寿命まで引き伸ばされるという規定が無かったっけ?
0715デフォルトの名無しさん
2006/04/08(土) 22:29:36constの参照の場合、一時オブジェクトはスコープが続く限り
消滅しないだろ。
0716デフォルトの名無しさん
2006/04/09(日) 11:25:42(cの値がscanf前後で変わっていないっぽい)のですが
そもそもscanfは「いつ(ex 関数が呼び出されて以降)」から「いつ(ex Enterが呼ばれるまで)」までの
入力を受け取る関数なのですか?
ちなみにこんな感じの使い方です
peekmessage(){
・
・
・
void pushA{//Aキーを押したときの処理
//jyotaiが0のときAを押したらキーボード入力受け取りモードに
if (jyotai==0){
scanf("%s",c);
}
}
・
・
・
}
0717デフォルトの名無しさん
2006/04/09(日) 12:21:29いつからいつまでってないような気がするが。
0718デフォルトの名無しさん
2006/04/09(日) 14:04:200719デフォルトの名無しさん
2006/04/09(日) 15:23:59scnaf()は、関数が呼ばれた時点までに確定している入力を受け取る関数です。
ではいつ入力が確定するかと言うと、標準入力が接続されているデバイスによって違います。
0720デフォルトの名無しさん
2006/04/09(日) 15:25:02その説明だと入力待ちは生じないように聞こえるが?
0721デフォルトの名無しさん
2006/04/09(日) 15:25:24おまえの環境ではscanfはブロックしないのか?
0722719
2006/04/09(日) 15:29:47関数が呼ばれた時点までに確定している入力がフォーマットの要請に満たない場合、
エラーが発生しない限り待ちますw
0723716
2006/04/09(日) 15:48:36>>718
char c[81]とVC.netのヘルプのサンプルコードそのままに指定してます。
>>719
ということはpeekmessage中だとキーボードからの入力メッセージはいつまで経っても確定しない?
ってことですかね?
0724デフォルトの名無しさん
2006/04/09(日) 18:41:43標準入力可能なコンソールプログラムじゃないような気がするが気のせい?
0725デフォルトの名無しさん
2006/04/09(日) 23:25:48記述ミスですかね?
0726デフォルトの名無しさん
2006/04/09(日) 23:32:05{
public:
void a1();
void a2(); // <= a1()を内部で使ったメソッド
};
class B : public A
{
public:
void a1(); // <= a1 をオーバーライド
};
この時、オーバーライドしたa1()を使った a2() を呼びたいのですが
このままだと A::a2()が呼ばれます。良い方法はないでしょうか?
0727デフォルトの名無しさん
2006/04/09(日) 23:37:200728デフォルトの名無しさん
2006/04/09(日) 23:37:370729デフォルトの名無しさん
2006/04/09(日) 23:41:37{
public:
virtual void a1(); // a1 を仮想関数にして
void a2();
};
class B : public A
{
public:
using A::a1;
void a1(int); // a1 をオーバーロード
};
0730デフォルトの名無しさん
2006/04/09(日) 23:46:190731デフォルトの名無しさん
2006/04/09(日) 23:49:48できました。ありがとうございました!
0732デフォルトの名無しさん
2006/04/10(月) 20:10:25T* a = &T(i);
とかOKなの?
0733デフォルトの名無しさん
2006/04/10(月) 20:16:40struct T{T*operator&(){return new T;}};
int main(){
T i;
T*a=&T(i);
}
0734デフォルトの名無しさん
2006/04/10(月) 21:43:59╋
/\
0735デフォルトの名無しさん
2006/04/10(月) 22:02:10_, ,_ パーン
( ‘д‘)
⊂彡☆))============= T(i)
╋
/\
0736デフォルトの名無しさん
2006/04/10(月) 22:05:570737デフォルトの名無しさん
2006/04/10(月) 22:30:06ひょっとしてネタ?
0738デフォルトの名無しさん
2006/04/10(月) 22:52:14T(i)はTをiで初期化した一時オブジェクトという意味になるだろう。
0739デフォルトの名無しさん
2006/04/10(月) 23:07:190740デフォルトの名無しさん
2006/04/10(月) 23:31:31deleteしないとメモリリークするが。
0741デフォルトの名無しさん
2006/04/10(月) 23:32:25呼び出されるので、一時変数の内容は無視されている。
0742デフォルトの名無しさん
2006/04/10(月) 23:33:470743740
2006/04/10(月) 23:37:01×newした時に一時オブジェクトの内容がコピーされる
○newした後で折角作った一時オブジェクトがそのまま捨てられてしまう。
つまりT()でも良いし、T(j) [jはT型のインスタンス]でも全部同じ意味。
0744デフォルトの名無しさん
2006/04/10(月) 23:48:060745デフォルトの名無しさん
2006/04/11(火) 00:27:31ちゃんとレスしてるけどね
0746デフォルトの名無しさん
2006/04/11(火) 00:58:07返すような場合、一回に1配列分の文字列を返すようにする事が考えられますが、
イテレータとか使って一回で返してしまう方法ってあるんでしょうか?
0747デフォルトの名無しさん
2006/04/11(火) 01:08:15気がするけど、間違い無いよね?
0748デフォルトの名無しさん
2006/04/11(火) 01:12:21あまり美しくはないが、auto_ptr<vector<string> >を返すのがパターンかなぁ。
vector<string>を直で返すのはさすがに気が引けるし。
あ、もちろんvectorでなくても適当なコンテナなら何でもいいけど。
他に何かもっと美しい方法あるかね?
0749デフォルトの名無しさん
2006/04/11(火) 01:18:24std::stringについてのOutputIteratorを取るという方法もある。
面倒だし、異なるイテレータを渡すたびにコードが膨張するという欠点はあるが。
0750デフォルトの名無しさん
2006/04/11(火) 01:23:23void f(vector<string>& result) じゃダメなの?
0751デフォルトの名無しさん
2006/04/11(火) 01:24:23ソースと逆アセンブル混合で見る(VC8)とよくわかるね。
楽ばかりしてないで最終的には規格票を見なきゃならないんだが、あれ全部を
見るのは大変なので、ちょっとした事は上の方法で見ている。バイナリ嘘つかない。
0752デフォルトの名無しさん
2006/04/11(火) 01:29:00> バイナリ嘘つかない
そうでもないよ。未定義動作になるソースに対しても何かしらコードは出るしね。
あと、人に説明するときに「VC8がこうコンパイルしたから〜」じゃ、さすがに
根拠にならない。おとなしく規格嫁。
0753デフォルトの名無しさん
2006/04/11(火) 02:01:58Sutterお勧めの方法じゃないの?
0754デフォルトの名無しさん
2006/04/11(火) 02:40:34>vector<string>を直で返すのはさすがに気が引けるし。
TSC計ってみたけど,うち(A),(B)で殆ど差でないけどなぁ
typedef vector <string> Container;
void init_container (Container &p) {
static const size_t container_size (10), string_size (100);
p.reserve (container_size);
for (size_t i (0); i < container_size; ++ i) {
char c ('a'); string s;
for (size_t j (0); j < string_size; ++ j) s.push_back (c ++);
p.push_back (s);
}
}
Container get_container () {
Container result;
init_container (result);
return result;
}
auto_ptr <Container> get_container_ptr () {
auto_ptr <Container> result (new Container ());
init_container (*result);
return result;
}
Container c0 (get_container ()); // (A)
auto_ptr <Container> c1 (get_container_ptr ()); // (B)
0755デフォルトの名無しさん
2006/04/11(火) 09:07:13std::vector<char> v;
std::insert_iterator<std::vector<char> > out_itr(v,v.begin());
std::string str("test");
std::copy(str.begin(),str.end(),out_itr);
out_itr = 'a';++out_itr;//ここ
0756デフォルトの名無しさん
2006/04/11(火) 09:14:28後,状況によるけれどそのコードでやっていることをやりたいなら
'a' を最初に突っ込んで,次に [str.rbegin(), str.rend()) を
back_inserter に突っ込むほうが効率は良い.
0758デフォルトの名無しさん
2006/04/11(火) 09:34:080759デフォルトの名無しさん
2006/04/11(火) 14:51:120760デフォルトの名無しさん
2006/04/11(火) 17:33:47お前もな。
0761デフォルトの名無しさん
2006/04/11(火) 18:03:21もちろんそのつもりですがなにか?
0762デフォルトの名無しさん
2006/04/11(火) 19:14:44>>761
_, ,_ パーン
( ‘д‘)
⊂彡☆))Д´) ←>>740, 761
0763デフォルトの名無しさん
2006/04/11(火) 22:29:370764デフォルトの名無しさん
2006/04/11(火) 22:57:030765デフォルトの名無しさん
2006/04/11(火) 23:04:320766デフォルトの名無しさん
2006/04/11(火) 23:10:53俺もそうだけどな。
0767デフォルトの名無しさん
2006/04/11(火) 23:25:44致命的な欠点は仕事への責任感に比例して放置できない
全盲の人が機長になれないのと同じ
0768デフォルトの名無しさん
2006/04/11(火) 23:30:22別に責めてはならないとは言ってない。
ただ人を責める前に自分の欠点を直してからにしろと言いたい。
ある奴の欠点が他人から丸見えなのに、そいつに説教されると腹が立つだろう。
0769デフォルトの名無しさん
2006/04/11(火) 23:31:520770デフォルトの名無しさん
2006/04/11(火) 23:32:27わからん奴だな。俺は致命的な欠点については何も言ってない。
お前が勝手に言ってるだけだろう。
0771デフォルトの名無しさん
2006/04/11(火) 23:35:12治して来てもらう以外に打つ手はない
0772デフォルトの名無しさん
2006/04/11(火) 23:36:29それを先に言え馬鹿。
何の一般論かと思ったぜ。
0773デフォルトの名無しさん
2006/04/12(水) 00:17:060774デフォルトの名無しさん
2006/04/12(水) 00:41:58struct IStringifiable{
virtual string toString() const = 0;
virtual void Parse(const string& source) = 0;
};
template < typename T > struct Stringifiable : public T, public IStringifiable{
virtual string toString() const { 云々かんぬん… }
virtual void Parse(const string& source) { 云々かんぬん… }
};
なんてことをしたら Stringifiable< int > みたいにしても
プリミティブ型を継承できなくて('正しい基本クラスではない'と怒られる)困っています。
この場合StringifiableクラスのメンバーにT型のインスタンスを持つしかないんでしょうか?
0775デフォルトの名無しさん
2006/04/12(水) 00:43:25その通り。
0776デフォルトの名無しさん
2006/04/12(水) 00:44:190777デフォルトの名無しさん
2006/04/12(水) 00:51:02string StringFrom(T source);
void ParseTo(T& target, string source);
int と Stringifiable についてオーバーロードするか、
template にして特殊化すればいいんじゃね?
0778774
2006/04/12(水) 01:01:26みたいなモノを考えてました
例えば繰り返す回数をStringifiable< int > repeat_countみたいに定義しておいて
IIniFile::Bind("ファイル名", "セクション名", "キー名", repeat_count);
ICommandLine::Bind("コマンドライン名", repeat_count);
といった感じに関連付けておけば
IIniFile::Load("ファイル名");
ICommandLine::Eval(lpCmdLine);
とやった時に変数の内容が更新されているような。
これをメンバー変数でやるようにしてしまうと repeat_count = 10;
という式が書けなくなってしまうのでなんだかな〜と思ったわけです。
あ、operator const T() constとoperator=(const T& source)を
オーバーロードすりゃいいのかな?
0779デフォルトの名無しさん
2006/04/12(水) 01:11:04と宣言しといて、
template<> string ToString( const struct Hage& arg ){
//argを文字列に変換するコード
}
みたいなのを文字列に変換したい型の数だけ実装して、
strunt Hage a = {〜〜〜};
string hageStr = ToString(a);
みたいに使えばよくね?
0780774
2006/04/12(水) 01:48:21いや、それだとバインドができないので…
とりあえず>>778の最後の解決法でやってみてるけど
ユーザー定義型についてStringifiableのメソッドを特殊化してもらうときに
メンバー変数名がわかってないと書けないのは気持ち悪いなぁ
0781デフォルトの名無しさん
2006/04/12(水) 01:58:29IIniFile::Bind("ファイル名", "セクション名", "キー名", &repeat_count);
という風に使うインタフェースのほうがきれいじゃないだろうか。
Bindをいちいちテンプレートにするのが嫌なら、
IIniFile::Bind("ファイル名", "セクション名", "キー名", make_stringfier(&repeat_count));
とか。
0782774
2006/04/12(水) 02:26:45Bindの中でrepeat_countを参照で持つStringifiableのインスタンス作って
それを保持しとけば良いってことかな?
IIniFileとかの中ではいじくりたい変数の型を意識したくないので
なにかしらインターフェースを噛ませる必要があるのだけども
今後テキストエディットからの入力とか、外部から文字列で飛んでくる値を
全部透過的に扱うつもりなんだけど、受け取りたい対象毎に
(INIファイル用、コマンドライン用、エディタからの入力用…etc)
Stringifiableのインスタンスがどんどん増えてくのはどうなんだろう…
ちなみに後出しになって申し訳ないけどソースコード上である変数が
外部から書き換えられる可能性がありますよと明示したい意図もあったりして
説明のため直感的な名前にしたけどほんとはIStringifiableじゃなくて
IConfigurableってインターフェース名です
0783デフォルトの名無しさん
2006/04/12(水) 02:34:38はい次の人どうぞ。
0784デフォルトの名無しさん
2006/04/12(水) 18:02:37それだったら、operator <<と>>を作ってboost::lexical_castでよくね?
0785デフォルトの名無しさん
2006/04/12(水) 19:06:14// 文字列 => 変数への変換
template< typename T > struct parser {
void operator()( T & dest, string const & src ) const {
dest = ::boost::lexical_cast< T >( src );
}
};
// データバインドを行う
struct data_binder {
::boost::function< void ( string const & ) > update;
template< typename T > void bind( T & value ) {
update = ::boost::bind( parser<T>(), value, ::boost::bind::_1 );
}
};
// 派生クラス
class ini_file : data_bindable {
static map< path, data_binder > content;
public:
template< typename T >
static void bind( string const & fn, ...中略..., T & value )
{
path x( fn, section, key ); // パスを作成
content[x].bind( value ); // バインド完了
}
static void load( string const & filename ) {
/* 何かループ */ {
// TODO: データ読み込み
content[ /*パス*/ ].update( /*読み込んだデータ*/ );
}
}
};
0786785
2006/04/12(水) 19:10:23忘れてくれ。
0787デフォルトの名無しさん
2006/04/13(木) 08:57:51struct SList
{
boost::shared_ptr<SList> next;
};
int main(){
SList a;
SList* p = &a;
for(int i=0;i<100000;i++){
p->next = boost::shared_ptr<SList>(new SList);
p = p->next.get();
}
}
0788デフォルトの名無しさん
2006/04/13(木) 09:04:18cygwin g++ 3.4.4 で試したけど、何事も無く終了したよ。
0789デフォルトの名無しさん
2006/04/13(木) 09:31:00SList のデストラクタが全要素分再帰的に呼び出されることになるので、
デストラクタ呼び出しごとのスタック消費の 100000 倍のスタックが必要になる。
環境が書いてないことから想像すると Win32 で VC のデフォルト設定だろうから
スタックが 1M バイト割り当てられていたとして、1回のデストラクタ呼び出しによる
スタック消費が 10 バイト以内( 2 ワード以内)に収まっていればいい計算だが、微妙だな。
0791デフォルトの名無しさん
2006/04/13(木) 09:49:31CLR が挟まってるならスタック消費が 2 ワードじゃ済まなさそうだな。納得。
0792785
2006/04/13(木) 10:05:38_1 がいつの間にか無名NSに移動してたのは驚いた
// データバインドを行う
struct data_binder {
::boost::function< void ( string const & ) > update;
template< typename T > void bind( T & value ) {
update = boost::bind( parser<T>(), boost::ref(value), _1 );
}
};
0793デフォルトの名無しさん
2006/04/13(木) 10:07:550794デフォルトの名無しさん
2006/04/13(木) 10:17:330795デフォルトの名無しさん
2006/04/13(木) 10:20:490796787
2006/04/13(木) 10:21:13>>791
デストラクタが深い再帰にならないようにしないといけないんですね。
(/clrだとi=4393までしかいけませんでした。)
0797デフォルトの名無しさん
2006/04/13(木) 13:19:23一般的な環境(Win Mac Linux辺り)で
なんか丁寧に例外取ってるの馬鹿らしくなってきまして
0798デフォルトの名無しさん
2006/04/13(木) 13:28:35メモリが有限の資源である以上ある。
丁寧に例外を取るって何やってるか知らんが、多分間違った考え方してる。
0799デフォルトの名無しさん
2006/04/13(木) 13:36:24もちろんnewする度にそこでtry-catchしている訳ではなく、メモリ確保できなかったら、
中間層辺りcacthし、データをバックアップする程度なんですが。
仮想メモリもあるし、それすら使い果たす頃には
例外取ってバックアップどころじゃない気もするんですよね
0800デフォルトの名無しさん
2006/04/13(木) 13:55:10hevy_weight * p = 0;
try {
p = new hevy_weight();
}
catch( std::bad_alloc const & ) {
throw std::runtime_error("メモリ不足です!");
}
0801デフォルトの名無しさん
2006/04/13(木) 13:55:510802デフォルトの名無しさん
2006/04/13(木) 14:35:09そしてheavyなスペル違うぞ
0803デフォルトの名無しさん
2006/04/13(木) 15:17:40メモリ不足で bad_alloc 投げてるのに、ヒープに文字列保存する runtime_error 投げんのかよ!?
みたいな感じでは?
0804デフォルトの名無しさん
2006/04/13(木) 17:38:23一般向けOSだとメモリはページ単位(4KBとか)で確保するものが多いから
それ以下のメモリ要求に対し失敗したらruntime_errorも投げれなそう。
漏れの個人的テストだと、小ブロックの確保時にbad_allocが投げられることはあるけど、
わざとそういう状況を作るか、プログラムのバグでHDDが異常にガリガリ言った後に投げられるか、
いずれにしても例外が投げられる前から予想できるときにしか投げられなかった。
そこで、bad_allocに対してtry〜catchをするのではなく、予期しない例外のひとつとしてcatch(...)。
むしろbad_allocより、制御装置固有のとか、特定用途の例外を知りたいわけで。
0805797 799
2006/04/13(木) 18:36:29>>804
勉強になります。貴重な情報感謝。
なるほど、確保失敗時は厳しいので、細かくやらず大きいくくりで捉えておこうという訳ですか。
ありがとうございました。
0806デフォルトの名無しさん
2006/04/13(木) 23:11:280807デフォルトの名無しさん
2006/04/14(金) 14:48:58ダウンキャストしたい時はどうすればいいんでしょうか?
(例)
class foo{};
class bar : public foo{};
typedef boost::shared_ptr<foo> pfoo;
foo* b1 = new bar();
pfoo b2 = pfoo(new bar());
// b1なら、
if (dynamic_cast<bar>(*b1)) cout << "this is bar1" << endl;
// b2だと?
if (dynamic_cast<bar>(*b2)) ; // error!
0808デフォルトの名無しさん
2006/04/14(金) 14:53:18訂正
if (dynamic_cast<bar*>(b1)) cout << "this is bar1" << endl;
0809デフォルトの名無しさん
2006/04/14(金) 14:56:340810デフォルトの名無しさん
2006/04/14(金) 14:58:110811デフォルトの名無しさん
2006/04/14(金) 15:09:06dynamic_cast<bar*>(b2.get())
fooのデストラクタがvirtualになってないよ。
0812デフォルトの名無しさん
2006/04/14(金) 15:22:29b2.get()でいけました。 ありがとう
fooのデストラクタは、例では書かなかったけど作ってるプログラムはvirtualになってます。
0813デフォルトの名無しさん
2006/04/14(金) 16:38:36専用のキャストが用意されています.
http://www.boost.org/libs/smart_ptr/shared_ptr.htm#dynamic_pointer_cast
あと蛇足ですけれど, shared_ptr<foo>(new bar()) な形で shared_ptr を
生成していればデストラクタが virtual でなくても bar のデストラクタが走ります.
0814デフォルトの名無しさん
2006/04/14(金) 16:41:45もう遅いかもしれないが、shared_ptr 専用の
shared_static_cast
shared_dynamic_cast
shared_polymorphic_cast
shared_polymorphic_downcast
が定義されている。
上の例だと、
if( shared_polymorphic_downcast<bar>(b2) )
でもいい。
0815デフォルトの名無しさん
2006/04/14(金) 16:48:28おぉ、ありがとう。 専用のがあるんですね。
そっち使うことにします。
0816デフォルトの名無しさん
2006/04/14(金) 19:27:50あれをユーザが0から100の値で選べるようにするにはどういうコードを書いたらいいんでしょうか?
0817デフォルトの名無しさん
2006/04/14(金) 19:32:11スレ違い
0818デフォルトの名無しさん
2006/04/14(金) 19:34:35すいませんでしたorz
0819デフォルトの名無しさん
2006/04/14(金) 19:58:43http://pc8.2ch.net/test/read.cgi/tech/1144962549/1-4
0821デフォルトの名無しさん
2006/04/15(土) 11:46:33class hoge; // forward
boost::shared_ptr<hoge> PHoge;
class hoge
{
[※1] owner;
vector<PHoge> hoges;
};
こんなクラスがあるとき、
あるhogeオブジェクトAOwnerと、
AOwnerに所有されている、AOwnedがあるとき、
AOwnerのvector hogesに、AOwnedが入り、
AOwnedのownerにAOwnerを指すポインタを持ちたいとき
AOwnedのownerはweak_ptrにする必要があるのでしょうか?
boost::shared_ptrの循環参照の説明読んでたら頭が混乱してしまいました。
0822デフォルトの名無しさん
2006/04/15(土) 12:37:50あちこち探し回っても、的確な答えが見つからないので
C++の話だが、
SaveDigit(FILE* stream, int nData);
LoadDigit(FILE* stream, int* nData);
名前の通り、int型のファイル入出力を行う関数があるのだが、
COLORREFやDWORDやunsigned intをこの関数で保存したい場合、
当たり前だがキャストが必要になる。
このキャストの時、データは破壊されないのだろうか?
それとも、各型毎の関数を作るかテンプレート関数を作るべき?
0823デフォルトの名無しさん
2006/04/15(土) 12:40:04各型のサイズやビットパターンは環境依存
0824デフォルトの名無しさん
2006/04/15(土) 12:54:24サンクス、危うく環境依存のバグを埋め込むとこだった…orz
0825デフォルトの名無しさん
2006/04/15(土) 13:38:33boost::ptr_vector<Hoge> ptr_container;
containerからptr_containerに内容をコピーしたいのですが
std::copy(container.begin(), container.end(), std::back_inserter(ptr_container));
ではptr_container.push_back()がHoge*を要求するのでできません。
newしてpush_backするback_insert_iteratorを作る以外で何か方法ありませんか?
標準 or Boostにあるものを使って書ければベストなのですが。
0826デフォルトの名無しさん
2006/04/15(土) 13:49:300827デフォルトの名無しさん
2006/04/15(土) 13:51:45std::transform(container.begin(), container.end(),
std::back_inserter(ptr_container), new_ptr<Hoge>(_1));
0828825
2006/04/15(土) 14:05:34push_backイテレータ作るよりはシンプルですね。
これで行きます。ありがとうございました。
0829デフォルトの名無しさん
2006/04/15(土) 22:30:07いやですね、C++を学習するつもりで本を買ったのですがVC++を買ってました。
C++を学ぶならC++のやつを買いなおした方がいいでしょうか?
0830デフォルトの名無しさん
2006/04/15(土) 22:44:34ありゃ、マルチかい…。あっちに答えといたよ。
スレッドを立てるまでもない質問雑談スレ23
http://pc8.2ch.net/test/read.cgi/prog/1139729337/839
0831デフォルトの名無しさん
2006/04/16(日) 22:11:160832デフォルトの名無しさん
2006/04/16(日) 22:15:10つ精神と時の部屋
0833デフォルトの名無しさん
2006/04/16(日) 22:20:27右往左往してる弱った....
0834禿@ベル研究所 ◆HsptrkZmYk
2006/04/16(日) 22:24:29話はそれからだ。
0835デフォルトの名無しさん
2006/04/16(日) 22:31:15STLやクラスの高度な機能は後回し
0836833
2006/04/16(日) 23:47:41ここからどうすればいいの?
何かね課題みたいにプログラム作りたいんだけど
なんかいい例ない?1万ステップぐらいのやつがいいんだけど
0837デフォルトの名無しさん
2006/04/16(日) 23:57:30g++ 3.4.4 (cygwin special)で以下のコードをコンパイルしたら、
#include <fstream>
bool pattern::read(std::ifstream& ifs)
{
int w;
ifs >> w;
}
こんなエラーがでました。
pattern.cpp: In member function `bool pattern::read(std::ifstream&)':
pattern.cpp:39: error: no match for 'operator>>' in 'ifs >> w'
intに対しては operator>> は(cinと同様に)定義されてると思うんだけど……。
なんか不味いことしてますか?
0838デフォルトの名無しさん
2006/04/17(月) 00:27:20そのコードは pettern の宣言が無いというエラーになった。
エラーの出るソースはそれだけじゃないだろ。
問題が再現できるコードをちゃんと作れ。
0839837
2006/04/17(月) 00:53:23すみませんでした。正確には以下の通りです。
#include <iostream>
class pattern{
public:
bool read(std::ifstream&);
};
bool pattern::read(std::ifstream& ifs)
{
int w;
ifs >> w;
}
0840デフォルトの名無しさん
2006/04/17(月) 00:55:27× iostream
○ fstream
再現コード作ってるときに気付くのが、よくあるパターンなんだがな。
0841デフォルトの名無しさん
2006/04/17(月) 00:57:281万ステップは無いと思うが、課題が欲しいなら↓こんなスレがある。
C/C++の宿題を片付けます 63代目
http://pc8.2ch.net/test/read.cgi/tech/1143405137/
0842デフォルトの名無しさん
2006/04/17(月) 01:05:56うう、ifstreamは<fstream>ですね。
恐ろしく凡ミスに答えてくださってアリガトウございます。
全くお恥ずかしい限りで……。
0843デフォルトの名無しさん
2006/04/17(月) 04:58:33などとして確保したバッファ領域にデータを代入した後、そのデータはそのままに、
おしりに、さらに10バイト分のデータを追加したい場合、Cだと realloc()で、代入
データをそのままに、メモリー領域を拡大できますが、new した場合はそのような
事はできませんか?
できない場合は、別途 20バイト分newして、そこにそれぞれをコピーして繋げる
しかないでしょうか?
0844デフォルトの名無しさん
2006/04/17(月) 04:59:040845デフォルトの名無しさん
2006/04/17(月) 05:28:34その通り。realloc()を使わない方が良いのは、delete演算子で
デストラクタが働く事があるためです。
0846デフォルトの名無しさん
2006/04/17(月) 05:29:25×realloc()を使わない方が良いのは
○realloc()を使ってはいけないのは
0847デフォルトの名無しさん
2006/04/17(月) 08:53:06先ずはnew/deleteを使う戦略を見直す。
例えば、vectorなら何も悩む必要がなくなる。
0848デフォルトの名無しさん
2006/04/17(月) 09:36:58そこまでパフォーマンスを追求する(realloc を使う)必要性があるか、だな。
0849デフォルトの名無しさん
2006/04/17(月) 19:24:35そこほとんどCじゃんw
たまに、悪ふざけしているような回答者がC++でコード書いてるけど
というか、まあ、どうやって身に付ければいいんだろうね
おれは適当に本読んで、プログラム書いたりしてるけど
細かいところの知識があちこち欠けている気がする
ADLとか
0850デフォルトの名無しさん
2006/04/17(月) 19:27:430851デフォルトの名無しさん
2006/04/17(月) 19:33:34それを題材としてC++で組め、っていう話だろう・・・
0852デフォルトの名無しさん
2006/04/17(月) 23:25:41A* pa1 = new A();
A* pa2 = new A;
この2つの命令に何か違いはあるのでしょうか。
同じ意味だとは思うんですが、確信が持てないです。
ちょっとした違いでもあれば教えて下さい。
delete pa1;
delete pa2;
0853デフォルトの名無しさん
2006/04/17(月) 23:41:28前者は0フィル。
後者はデフォルト・コンストラクタが呼ばれる。
0854デフォルトの名無しさん
2006/04/17(月) 23:42:220855デフォルトの名無しさん
2006/04/17(月) 23:48:360856852
2006/04/17(月) 23:56:12実際に試してみたんですが、どちらも初期化されてませんでした。
C++言語仕様ではそうなっていて、私の環境では仕様に沿ってない実装ってことになるのでしょうか。
それとも他の意味があるのかな。
0857デフォルトの名無しさん
2006/04/17(月) 23:56:390858852
2006/04/18(火) 00:01:36なかなか素敵な言語仕様です。
結局、上で挙げた2つは全く同じだ、ということになるんですかね。
0859デフォルトの名無しさん
2006/04/18(火) 00:01:5215 A new-expression that creates an object of type T initializes that object as follows:
. If the new-initializer is omitted:
. If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is defaultinitialized
(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared
default constructor.
. Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly
cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of
const-qualified type, the program is ill-formed;
という事で、非POD型はデフォルト・コンストラクタ、POD型は不定値。
0860デフォルトの名無しさん
2006/04/18(火) 00:04:52. If the new-initializer is of the form (), the item is value-initialized (8.5);
. If the new-initializer is of the form (expression-list) and T is a class type, the appropriate constructor is
called, using expression-list as the arguments (8.5);
. If the new-initializer is of the form (expression-list) and T is an arithmetic, enumeration, pointer, or
pointer-to-member type and expression-list comprises exactly one expression, then the object is initialized
to the (possibly converted) value of the expression (8.5);
. Otherwise the new-expression is ill-formed.
で、§8.5を見てみると・・・・
8 [Note: since () is not permitted by the syntax for initializer,
X a();
is not the declaration of an object of class X, but the declaration of a function taking no argument and
returning an X. The form () is permitted in certain other initialization contexts (5.3.4, 5.2.3, 12.6.2). ]
0861デフォルトの名無しさん
2006/04/18(火) 00:09:10. if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
. if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized;
. if T is a union type, the object’s first named data member89) is zero-initialized;
. if T is an array type, each element is zero-initialized;
. if T is a reference type, no initialization is performed.
To default-initialize an object of type T means:
. if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);
. if T is an array type, each element is default-initialized;
. otherwise, the object is zero-initialized.
To value-initialize an object of type T means:
. if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
. if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;
という事で、A()の形は非POD型はデフォルト・コンストラクタ、POD型はzeroで初期化される。
ここがAという形とは違う唯一の点か。
0862デフォルトの名無しさん
2006/04/18(火) 00:15:10#include <iostream>
struct A {
int a;
};
int main()
{
int* pi1 = new int();
int* pi2 = new int;
A* pa = new A();
A* pb = new A;
std::cout << *pi1 << std::endl; // ここだけ必ず 0
std::cout << *pi2 << std::endl;
std::cout << pa->a << std::endl;
std::cout << pb->a << std::endl;
delete pb;
delete pa;
delete pi2;
delete pi1;
}
0863852
2006/04/18(火) 00:21:46これからは、new intに()をつけようって思いました。
ありがとうございました。
0864デフォルトの名無しさん
2006/04/18(火) 00:35:30struct A {
int a;
};
struct B {
int b;
void print() const {
std::cout << b << std::endl;
}
private:
virtual void f() {} // 非PODにする
};
int main()
{
int* pi1 = new int();
int* pi2 = new int;
A* pa = new A();
A* pb = new A;
B* pa2 = new B();
B* pb2 = new B;
std::cout << *pi1 << std::endl; // ここは必ず 0
std::cout << *pi2 << std::endl;
std::cout << pa->a << std::endl; // ここも必ず 0
std::cout << pb->a << std::endl;
pa2->print(); // もはや0である保証はない
pb2->print();
0865デフォルトの名無しさん
2006/04/18(火) 00:35:43delete pa2;
delete pb2;
delete pb;
delete pa;
delete pi2;
delete pi1;
}
0866デフォルトの名無しさん
2006/04/18(火) 00:42:49便乗して
char p[] = "123456";
new(p) char[3](); // 先頭3つだけ0にセット
これもあり?
0867デフォルトの名無しさん
2006/04/18(火) 01:49:42そもそもintをnewすることがナンセンス。
0868デフォルトの名無しさん
2006/04/18(火) 01:50:54#include <iostream>
#include <algorithm>
void print(int i) {
std::cout << i << ' ';
}
int main()
{
char p[] = "123456";
new(p) char[3](); // 先頭3つだけ0にセット
std::for_each(p, p + sizeof(p), print);
}
0869デフォルトの名無しさん
2006/04/18(火) 01:56:340870デフォルトの名無しさん
2006/04/18(火) 02:09:59配置newで配置したオブジェクトがデストラクタを持っている時だけ
呼び出す必要がある。
というか、char[3]ってデストラクタないでしょう。呼び出したくても
呼び出せない。
0871デフォルトの名無しさん
2006/04/18(火) 02:14:24そんな事は思ってないよね?
0872833
2006/04/18(火) 02:20:17new char[3]できるからしたいです
0873デフォルトの名無しさん
2006/04/18(火) 02:34:03やっても構わないけど、undefinedだよ。鼻から悪魔が出てくるかも。
new char[3] と new(p) char[3] の違いをもう一度調べてみよう。
0874デフォルトの名無しさん
2006/04/18(火) 04:18:19> std::cout << pa->a << std::endl;
↑ここも必ず 0 じゃね?
>>864
> pa2->print(); // もはや0である保証はない
↑ここも必ず 0 じゃね?
new B() は "value-initialized" で B は
"a class type with a user-declared constructor" じゃなくて
"a non-union class type without a user-declared constructor" だから
pa2->b は "value-initialized" → "zero-initialized" で 0 になるだろ。
0875デフォルトの名無しさん
2006/04/18(火) 04:59:510876デフォルトの名無しさん
2006/04/18(火) 05:11:070877デフォルトの名無しさん
2006/04/18(火) 05:21:33そう思うならやってみろや。
わざわざ仮想関数を入れてnon-PODにしている意味がわからないのか?
0878デフォルトの名無しさん
2006/04/18(火) 09:08:41直接に型は返せないが、
ポリモーフィズムや列挙型を使って
それなりのことはできる。
0879デフォルトの名無しさん
2006/04/18(火) 09:11:100880デフォルトの名無しさん
2006/04/18(火) 09:13:560881デフォルトの名無しさん
2006/04/18(火) 09:18:04そのオブジェクトをこっそり delete するのって、
登り掛けてる人のハシゴはずすみたいで
いたずらっぽくて楽しいよな。
0882デフォルトの名無しさん
2006/04/18(火) 09:25:09型が分からなければcatchできないのでは?
0883デフォルトの名無しさん
2006/04/18(火) 09:26:49パフォーマンスを度外視すれば確かに
型を返したと言えるね。
0884876
2006/04/18(火) 09:39:170885デフォルトの名無しさん
2006/04/18(火) 10:02:54type_info か?
0886デフォルトの名無しさん
2006/04/18(火) 10:09:51とりあえず g++ でやってみたら全部 0 になったわけだが。
規格の話をしてるんだから、自分の持ってるコンパイラの
実験結果がわかっても意味無いだろ。
POD かどうかは "a class type with a user-declared constructor" にも
"a non-union class type without a user-declared constructor" にも関係ないから
意味がわからん。
0887デフォルトの名無しさん
2006/04/18(火) 10:26:38あまりにも使わないので、存在を忘れかけていた。
0888デフォルトの名無しさん
2006/04/18(火) 10:31:06考えてたら夜があけてしまい、2chに質問書いて寝ていま起きましたスンマセン
0889886
2006/04/18(火) 10:38:39{
int a;
// virtual ~A();
};
A* f() { return new A(); }
こんなコードのアセンブリ吐かせてみた。
cygwin gcc 3.4.4 では non-POD にすると a は初期化されなかった。
とりあえず、 value-initialized に頼るのはまだまだ危険みたいだな。
だれか他のコンパイラの対応状況をレポートしてくれると助かる。
0890デフォルトの名無しさん
2006/04/18(火) 10:39:480891デフォルトの名無しさん
2006/04/18(火) 10:56:160892デフォルトの名無しさん
2006/04/18(火) 11:02:05875 や 888 は、絶対違うだろうけど。
0893デフォルトの名無しさん
2006/04/18(火) 11:17:57どういう使いかたを想定している?
0894デフォルトの名無しさん
2006/04/18(火) 11:30:34type foo() {
return int;
}
type t = foo();
t n = 0;
cout << n << endl;
まあ、直接は無理だな。
近い事はできるかもしれんが。
0895デフォルトの名無しさん
2006/04/18(火) 11:34:320896デフォルトの名無しさん
2006/04/18(火) 11:41:56衝動的に MP に置き換えてみたが、面白くなかった。
struct foo {
typedef int type;
};
typedef foo::type t;
t n = 0;
cout << n << endl;
0897デフォルトの名無しさん
2006/04/18(火) 11:46:21#include <memory>
class FooType {
public:
virtual void run() = 0;
protected:
template <typename type> static void body() {
type n = 0;
std::cout << n << std::endl;
}
};
template <typename type> class FooTypeRet : public FooType {
public:
virtual void run() {
body<type>();
}
};
std::auto_ptr<FooType> foo() {
std::auto_ptr<FooType> type(new FooTypeRet<int>);
return type;
}
int main() {
std::auto_ptr<FooType> type = foo();
type->run();
}
近いと言えば近いのかもしれないコード。
0898デフォルトの名無しさん
2006/04/18(火) 12:30:45*P=NEW CLASS1[500000]
2*30000 600MBなら取れるのですがそれ以上になると落ちます。
助けてください
0899デフォルトの名無しさん
2006/04/18(火) 12:50:41スレ違い。
0900デフォルトの名無しさん
2006/04/18(火) 12:57:150901デフォルトの名無しさん
2006/04/18(火) 12:59:570902デフォルトの名無しさん
2006/04/18(火) 13:10:230903デフォルトの名無しさん
2006/04/18(火) 13:36:300904デフォルトの名無しさん
2006/04/18(火) 14:28:190905デフォルトの名無しさん
2006/04/18(火) 15:18:44gccなどで、両方のコアに計算させたいと考えています。
コンパイラオプションなどで簡単に処理を分散させることはできるでしょうか?
あるいは、それぞれのコアに分担を割り振る命令がC++のコードレベルで必須と
なるでしょうか。
よろしくお願いします。
0906デフォルトの名無しさん
2006/04/18(火) 15:45:17ちなみにオレはデュアルコアが欲しくて仕方ないんだが、
あと半年なんとか我慢して待つつもり。
0907デフォルトの名無しさん
2006/04/18(火) 16:21:06あと2年はあたらしいPC買えそうにもない
0908905
2006/04/18(火) 16:43:42ttp://www1.jp.dell.com/content/topics/segtopic.aspx/misc/dm/wb2_landing?c=jp&l=jp&s=bsd&~tab=3
> PentiumD 820 (2.80GHz)
> 512MBメモリ
> 80GB HDD
送料込みで29980円なので、やすいかなと思い検討しています。
単純だけれど、とてもでかい配列の計算です。
なるべくスレッドを分けたりしたくないのですが、やはり難しいでしょうか。
或いはこの用途では
PentiumD 820 (2.80GHz)は
Pentium4 521(2.80GHz)に比較し殆どアドバンテージがないと考えてよいでしょうか?
0909デフォルトの名無しさん
2006/04/18(火) 16:45:30>コンパイラオプションなどで簡単に処理を分散させることはできるでしょうか?
>あるいは、それぞれのコアに分担を割り振る命令がC++のコードレベルで必須と
>なるでしょうか。
後者
マルチスレッド
マルチプロセス
あたりがキーワード
0911905
2006/04/18(火) 17:15:23のpage10
5.1.自動並列化
のあたりを読むと、コンパイラオプション(linuxの場合、-parallel指定)にて
並列化される可能性があることがわかりました。
自動並列化により、ループ内の処理がコード的に分割される様子もわかりました。
gccで対応しているかわかりませんが、可能性があることがわかりました。
0912デフォルトの名無しさん
2006/04/18(火) 17:35:59LinuxならICCが無料で使える。gompは・・・まあ、ね。
0913905
2006/04/18(火) 18:29:54ありがとうございます。
ICCいいですね。
あと
GCCも4.2でOpenMP対応するとの説もあるようで、先が楽しみです。
みなさま、ありがとうございました。
0914デフォルトの名無しさん
2006/04/18(火) 20:43:03VC6 やとデフォで nothrow ちゃうか?
0915デフォルトの名無しさん
2006/04/18(火) 20:44:38CPU アフィニティは OS のシステムコールで制御するものなんで
このスレで話せることは少なそうだな
0916デフォルトの名無しさん
2006/04/19(水) 00:24:01PentiumDは爆熱騒音の原因になる地雷CPU。
急ぎじゃなければ7月以降に出る予定になっているConroeコアのCPU、
が搭載されたPCにした方がいいと思うぞ。
まぁ、発売時期が明確になっていないのが難点だが。
■Quake 4で1.5倍,F.E.A.R.で1.7倍!?Pentium Dより圧倒的に高速なConroe
ttp://www.4gamer.net/news/history/2006.04/20060406232305detail.html
0917833
2006/04/19(水) 01:07:16自作板の情報だからまぁほぼ確定だと思うよ
0918デフォルトの名無しさん
2006/04/19(水) 01:15:25class Hoge : Hogehoge<T> {
...
};
このようなクラスがあったとき、Hoge のコンストラクタのイニシャライザで
�@Hoge(int x) : Hogehoge(x) { ... }
�AHoge(int x) : Hogehoge<T>(x) { ... }
とするのではどちらが正しいのですか?
VC8では両方、g++3.4では�Aがコンパイル通ったのですが
0919デフォルトの名無しさん
2006/04/19(水) 01:27:520920デフォルトの名無しさん
2006/04/19(水) 03:36:22上の様な分って重なっても大丈夫なのでしょうか?
例えば、
a.h
namespace LongLongNamespaceName {ほげ}
namespace LLNN = LongLongNamespaceName;
b.h
#include "a.h"
namespace LongLongNamespaceName {はげ}
namespace LLNN = LongLongNamespaceName;
上の場合、b.hでnamespace LLNN = LongLongNamespaceName;の部分がa.hのそれと
ダブってしまうと思うのですが
0921デフォルトの名無しさん
2006/04/19(水) 03:48:51っていうか試してみたらすぐ分かると思うが
0922デフォルトの名無しさん
2006/04/19(水) 19:04:00class C {
public:
T& getT() { return t_; }
private:
T t_;
};
template <class T>
class D : public C<T> {
public:
T& f() { return getT(); }
};
上記のコードをg++3.2でコンパイルしたところ、
Main.cpp: In member function `T& D<T>::f()':
Main.cpp:11: error: there are no arguments to `getT' that depend on a template parameter, so a declaration of `getT' must be available
Main.cpp:11: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
とエラーが出ました。私にはどこも間違っているように見えないのですが、これはg++のバグでしょうか?
それとも上記のコードにどこか間違いがあるのでしょうか?
0923デフォルトの名無しさん
2006/04/19(水) 19:12:43Dの基底であるC<T>はテンプレート引数であるTに依存しているから
Dのコンパイル時点では型が確定していないのでgetTを持つかどうかが不明。よってエラー。
ってことらしい。
0924デフォルトの名無しさん
2006/04/19(水) 19:19:09言い忘れた。
this->getT()やC<T>::getT()と明示的に呼ぶか
適当な所でusing C<T>::getT;を入れればOKっぽい。
0925デフォルトの名無しさん
2006/04/19(水) 19:40:29ありがとうございます
教えていただいた方法で問題は解決出来たのですが、
>Dのコンパイル時点では型が確定していないのでgetTを持つかどうかが不明。
というのがよく理解できませんでした。
Tの如何に関わらず、C<T>はgetTを持つので、C<T>からpublicに派生する
Dも当然getTを持つと思うのですが・・
0926デフォルトの名無しさん
2006/04/19(水) 19:50:15テンプレートの解釈は、二段階の名前解決をふむ。
最初は、Nondependentな名前のみが解決され、
インスタンス化されるときに、Dependetな名前が解決される。
Two-Phase Lookupという。
Dependentは、簡単に言うとテンプレートがかかわるもの。
たとえば、グローバルにgetT()という関数があったらどうなる?
当然、こっちのほうを呼び出すべき。
VCとかは、インスタンス化されるときに、すべての名前を解決するから、
>>922のようなコードでも、問題なく通ってしまう。
0927デフォルトの名無しさん
2006/04/19(水) 19:51:51この説明がわかりやすいかな。
ttp://www.codeproject.com/cpp/TwoPhaseLookup.asp
0928デフォルトの名無しさん
2006/04/20(木) 09:27:44#ifdef UNICODE
typedef CHogeA CHoge;
#else
typedef CHogeW CHoge;
#endif
0929デフォルトの名無しさん
2006/04/20(木) 09:39:32可能、というよりWinAPIでもTCHAR型は
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
となっているはず
0930デフォルトの名無しさん
2006/04/20(木) 09:50:25どうも有り難うございます。
てっきり#defineだけかと思ってました。
0931デフォルトの名無しさん
2006/04/20(木) 15:25:140932デフォルトの名無しさん
2006/04/20(木) 15:42:53APIはC++だけのものじゃないので無理。
0933デフォルトの名無しさん
2006/04/20(木) 15:52:380934デフォルトの名無しさん
2006/04/20(木) 15:55:24つ[boostスレ]
0935デフォルトの名無しさん
2006/04/20(木) 18:38:17GetWindowTextA/Wのように引数や戻り値まで全く同じものがある。
それでもC++ならテンプレートの特殊化でどうにかできるけれどさ。
0936デフォルトの名無しさん
2006/04/20(木) 18:54:060937デフォルトの名無しさん
2006/04/20(木) 20:04:57while (!ifstr.eor()) { // ifstr = ifstream
char ch;
ifstr >> ch;
cout << ch;
}
と書いたのですが、何故か改行が表示されなかったので、今度は
while (!ifstr.eor() {
std::cout << (char)ifstr.get();
}
としたら今度は一番最後に変な文字(見たところ値は-1のようです)が表示されるようになりました。
どうすれば私のしたいことが出来るようになるのか教えてください
0938デフォルトの名無しさん
2006/04/20(木) 20:19:090939デフォルトの名無しさん
2006/04/20(木) 20:22:37初めて気づく
俺EOF
0940デフォルトの名無しさん
2006/04/20(木) 21:30:140941デフォルトの名無しさん
2006/04/20(木) 21:37:09の解答をコンパイルしてみたらエラーで動きません。
警告も出ています。
警告の内容は以下のとおりです
c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(45) : warning C4541: 'typeid' が /GR- を使用したポリモーフィック型 'A' で使用されています; 動作結果は保証されません。
c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(47) : (省略)
c:\一鉄\趣味\ゲーム作成\勉強\TeachYourselfC++\12-check-4.cpp(49) : (省略)
警告だけで、エラーではないのでコンパイルは出来ます。
ですが実行時になってからエラーが表示されます
それの内容は
This Application has requested the Runtime to terminate it in an unsual way.
Please contact the application's support tema for more information.
です。
いろいろためしてみると
myclassというクラスとそのクラス型のobjというオブジェクトがあったとすると
typeid(obj)は機能するのですが
typeid(myclass)は機能しません。
だれかどうすればいいか分かる方はいませんか?
長々とすいませんですた
0942デフォルトの名無しさん
2006/04/20(木) 21:43:37コンパイラによっては、RTIIを使う際コンパイラオプションで
RTIIを使うことを指定しないといけないことがある。
0943デフォルトの名無しさん
2006/04/20(木) 21:44:090944デフォルトの名無しさん
2006/04/20(木) 21:50:120945デフォルトの名無しさん
2006/04/20(木) 21:57:40細かいことなんだが、実行時型情報はRTTIじゃなかったか?
0946デフォルトの名無しさん
2006/04/20(木) 22:50:130947デフォルトの名無しさん
2006/04/20(木) 23:30:33orzOLT
0948デフォルトの名無しさん
2006/04/20(木) 23:31:21どうもです^^
0949デフォルトの名無しさん
2006/04/21(金) 04:41:400950デフォルトの名無しさん
2006/04/21(金) 07:20:350951デフォルトの名無しさん
2006/04/21(金) 09:48:04一番最後の文字を取るにはどうすれば良いですか?
vectorとかならback()で取れるんですが・・
0952デフォルトの名無しさん
2006/04/21(金) 10:10:12str[str.size() - 1]
*(str.begin() + str.size() - 1)
*(--str.end())
0953デフォルトの名無しさん
2006/04/21(金) 11:28:200954デフォルトの名無しさん
2006/04/21(金) 13:06:18えっ!?
0955デフォルトの名無しさん
2006/04/21(金) 13:07:07テンプレにある cuj のリンクどうする?
0956デフォルトの名無しさん
2006/04/21(金) 16:18:45>OK, we all know std::basic_string is bloated and already has way too many members.
書き出しがこれかよwww
0957デフォルトの名無しさん
2006/04/21(金) 17:50:02その差分だけまとめた文書はないでしょうか?
双方もっているのですが、自分で調べるのは大変なので。
0958デフォルトの名無しさん
2006/04/21(金) 23:13:36のページで "Status: TC" という語で検索する
0959957
2006/04/22(土) 09:01:550960デフォルトの名無しさん
2006/04/23(日) 12:10:550961デフォルトの名無しさん
2006/04/25(火) 14:09:13どっちが一般的?
0962デフォルトの名無しさん
2006/04/25(火) 14:19:00引数の数で使うことはない。
それからスレ違い。
0963デフォルトの名無しさん
2006/04/25(火) 16:47:17begin(), end()や、イテレータの代入・インクリメント・デクリメント等の操作で
例外がthrowされる可能性はあるんでしょうか?
0964デフォルトの名無しさん
2006/04/25(火) 16:51:430965デフォルトの名無しさん
2006/04/25(火) 16:53:000966デフォルトの名無しさん
2006/04/25(火) 17:54:090967デフォルトの名無しさん
2006/04/25(火) 18:33:34禿本Special Editionの付録Eを読んで。
今手元にないからアレだけど。
0968デフォルトの名無しさん
2006/04/25(火) 18:55:46ttp://www.kuzbass.ru/docs/isocpp/
ここで調べたけど書いてないみたい。
0969デフォルトの名無しさん
2006/04/25(火) 19:03:130970デフォルトの名無しさん
2006/04/27(木) 14:44:11一度目は問題なく読み込めるんですが、
同じ作業中にもう一度同じファイルを読み込もうとした場合、
ちゃんと読み込めないことがあるんですが、どうなってるんでしょう?
0971デフォルトの名無しさん
2006/04/27(木) 15:01:460972デフォルトの名無しさん
2006/04/27(木) 15:10:50ifstream file1(filename);
:
:
//←なぜかクローズしてない
ifstream file2(filename);
readline(line); // ちゃんと読み込めない
}
0973970
2006/04/27(木) 15:10:56文字をどうも文字化けを起こした状態で読み込んでしまっているようです。
必ず起こるわけではなく、時折繰り返しているうちに起こります。
0974970
2006/04/27(木) 15:12:570975デフォルトの名無しさん
2006/04/27(木) 15:13:500976970
2006/04/27(木) 15:14:120977デフォルトの名無しさん
2006/04/27(木) 15:16:280978デフォルトの名無しさん
2006/04/27(木) 15:18:22is_open(), good()とかで確認してる?
0979970
2006/04/27(木) 15:19:17fi.open(fileChar, ios::in | ios::binary);
if (fi){
while(charaNum < 100){
charaNum++;
fi.seekg(1, ios::cur);
}
fi.seekg(0, ios::beg);
while(!fi.eof()) //ファイルの最後にきたら終了
{
sprintf(cha2, "%s", cha1);
fi.read(cha1, 1);
sprintf(chan, "%s%s", cha2, cha1);
if (strcmp(chan, "le") == 0){//改行
strs.erase(strs.end() - 1);
strvec.push_back(new string(strs, 0, strs.size()));
strs = "";
fi.seekg(2, ios::cur);
}else{
strs.append(cha1);//文字を保存
}
}
fi.getline(chars, 255);
strvec.push_back(new string(chars));
}
fi.close();
0980デフォルトの名無しさん
2006/04/27(木) 15:23:390981デフォルトの名無しさん
2006/04/27(木) 15:31:040982970
2006/04/27(木) 15:32:19バッファオーバーフローは無いと思うんですが。
一応格納する文字列のサイズは読み込む際は毎回0になってます。
0983970
2006/04/27(木) 15:33:19sprintf(cha2, "");
で一応初期化はしてます。
0984デフォルトの名無しさん
2006/04/27(木) 15:33:330985970
2006/04/27(木) 15:37:15string strs;//一行読み込み
int charaNum;//文字数
char cha;
char cha1[2];
char cha2[2];
char chan[4];
char fileChar[100];
ifstream fi;//ファイル入力
ファイルサイズは34.6kb〜65.9kbです。
0986デフォルトの名無しさん
2006/04/27(木) 15:48:50最初の一バイト目だけ'\0'で初期化されるけど、ニバイト目にはゴミが入ってる可能性がある。
fi.read(cha1, 1); で一バイト目に文字を入れたのはいいけど、ニバイト目に運良く'\0'が入っていれば次の
sprintf(chan, "%s%s", cha2, cha1); で期待通りの動作になる。
でも、ニバイト目に'\0'じゃないなにか ('A'とか)がはいってると
sprintf(chan, "%s%s", cha2, cha1); で readで読んだ一文字目 + 'A' + '\0'が現れるまで延々と続く
ゴミ文字列がchanにコピーされる
chanのサイズが4バイト分しかないんで、3文字+'\0'を越える長さの文字列を入れると悲しいことが起こる。
readした直後に cha1[1] = '\0';とかやっとけば問題ない
二文字目にたまたま何が入ってるかは、おまいのプログラムのつくりによるんだが
一回目は'\0'が入ってて、二回目以降は違うものが入ってるんだと思う
0987970
2006/04/27(木) 16:09:04おかげ様で上手く行きそうです。
助かりました。
こんな落とし穴があったとは。
0988デフォルトの名無しさん
2006/04/27(木) 17:57:09デストラクタで自動的にcloseされるようになっていない
のには何か理由があるのですか?
0989デフォルトの名無しさん
2006/04/27(木) 20:24:00デストラクタでcloseされるよ。
0990デフォルトの名無しさん
2006/04/28(金) 01:13:15最後まで読んでstd::ios::eofbitとかstd::ios::failbitが立ってしまってんだろ。
C++のファイルストリームは、Cとは違い、一度これらのフラグが立ったら、
自動ではクリアされない。そして、クリアしないと入出力が停止される。
clear()汁。
0991デフォルトの名無しさん
2006/04/28(金) 07:47:59clear() しても今度はすぐにストリームが空になって
eofbit たってしまいます。
0992デフォルトの名無しさん
2006/04/28(金) 08:29:500993デフォルトの名無しさん
2006/04/28(金) 08:32:040994デフォルトの名無しさん
2006/04/28(金) 09:40:360995デフォルトの名無しさん
2006/04/28(金) 09:45:580996デフォルトの名無しさん
2006/04/28(金) 09:53:44http://pc8.2ch.net/test/read.cgi/tech/1146185570/
立てたから後頼む。俺ちょっと出かけるんで。すまん。
0997デフォルトの名無しさん
2006/04/28(金) 10:04:300998デフォルトの名無しさん
2006/04/28(金) 11:17:47環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0999デフォルトの名無しさん
2006/04/28(金) 11:20:191000デフォルトの名無しさん
2006/04/28(金) 11:24:3910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。