C++相談室 part40
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/04/14(木) 01:15:57ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ part39
http://pc8.2ch.net/test/read.cgi/tech/1106527792/
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0002デフォルトの名無しさん
2005/04/14(木) 01:17:132 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html
0003デフォルトの名無しさん
2005/04/14(木) 01:17:4017 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デフォルトの名無しさん
2005/04/14(木) 01:18:0732 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/
0005デフォルトの名無しさん
2005/04/14(木) 01:18:29[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0006デフォルトの名無しさん
2005/04/14(木) 01:22:33amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0007デフォルトの名無しさん
2005/04/14(木) 01:26:34Effective 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デフォルトの名無しさん
2005/04/14(木) 01:28:55[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[STL]
STLport http://www.stlport.org/
SGI-STL http://www.sgi.com/tech/stl/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://www.moderncppdesign.com/
LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0009デフォルトの名無しさん
2005/04/14(木) 01:29:27[他]
ACE http://www.cs.wustl.edu/~schmidt/
Blitz++ http://www.oonumerics.org/blitz/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
http://www.trumphurst.com/cpplibs/cpplibs.phtml
(日本語) http://www.kmonos.net/alang/cpp/lib.html
0010デフォルトの名無しさん
2005/04/14(木) 01:29:59【C++】template 統合スレ -- Part6
http://pc5.2ch.net/test/read.cgi/tech/1101384692/
ぼるじょあがC/C++の宿題を片づけますYO! 41代目
http://pc8.2ch.net/test/read.cgi/tech/1109542053/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL/WTL Part3
http://pc5.2ch.net/test/read.cgi/tech/1095442366/
0011デフォルトの名無しさん
2005/04/14(木) 01:35:160012デフォルトの名無しさん
2005/04/14(木) 01:42:36標準ライブラリのそのまた一部の機能だけ
スレを分割するなんて意味ないぞ。
0013デフォルトの名無しさん
2005/04/14(木) 02:03:250014デフォルトの名無しさん
2005/04/14(木) 02:04:11俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0015デフォルトの名無しさん
2005/04/14(木) 02:04:470016デフォルトの名無しさん
2005/04/14(木) 02:05:37後氏ね。
0017デフォルトの名無しさん
2005/04/14(木) 02:06:27まぁヒントぐらいにはなったな。
うむごくろう。
0018デフォルトの名無しさん
2005/04/14(木) 02:40:07C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
0019デフォルトの名無しさん
2005/04/14(木) 02:44:50乙。
0020デフォルトの名無しさん
2005/04/14(木) 02:49:17warota
0021デフォルトの名無しさん
2005/04/14(木) 03:47:02実は part41 にしないといけなかったのかもしれない。
ttp://pc8.2ch.net/test/read.cgi/tech/1106527792/41-42
0022デフォルトの名無しさん
2005/04/14(木) 03:53:10C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
専用の別スレがあるライブラリ(Boostなど)や
開発環境、IDE(VC++など)に関する質問はそちらにお願いします。
前スレ part40
http://pc8.2ch.net/test/read.cgi/tech/1113408957/
0023デフォルトの名無しさん
2005/04/14(木) 08:02:460024デフォルトの名無しさん
2005/04/14(木) 09:38:54いんでない
0025デフォルトの名無しさん
2005/04/14(木) 12:39:08管理の楽さから、ポインタを渡さない様にしようと思い、つまずきました。
コンストラクタに引数が無い場合は、どう末尾に生成すれば良いのでしょうか
#include <list>
struct TestA{
int hoge;
TestA( int n ){ hoge = n; }
};
struct TestB{
int hoge;
TestB(){ hoge = 3; }
};
int main(){
std::list<TestA> list_test_a;
list_test_a.push_back(7);
TestA& test_a = list_test_a.back();
printf( "%d\n", test_a.hoge );
std::list<TestB> list_test_b;
TestB& test_b = list_test_b.push_back(); //エラー
printf( "%d\n", test_b.hoge );
return 0;
}
0026デフォルトの名無しさん
2005/04/14(木) 12:45:260028デフォルトの名無しさん
2005/04/14(木) 17:21:58int x = 0, y = 0, z = 0;
int &rx = x, &ry = y, &rz = z; // reference of int
int* p[] = {&x, &y, &z}; // array of pointer to int
int& r[] = { ... }; // array of reference to int
0029デフォルトの名無しさん
2005/04/14(木) 17:30:27作れない
0030デフォルトの名無しさん
2005/04/14(木) 17:38:52ISO/IEC 14882:1998
8.3.2.4
「There shall be no references to references, no arrays of references,
and no pointers to references.」
0031デフォルトの名無しさん
2005/04/14(木) 17:39:14俺もC1010出る。
ちなみに#include "stdafx.h" は全部に入ってる。
他の原因ってないっすか?
0032デフォルトの名無しさん
2005/04/14(木) 17:47:350033デフォルトの名無しさん
2005/04/14(木) 17:51:54これ新しいテンプレ?
0034デフォルトの名無しさん
2005/04/14(木) 17:52:01<stdafx.h>ではなくて?
0035デフォルトの名無しさん
2005/04/14(木) 17:55:14ちなみにやった事は、アプリケーションWIZでWIN32アプリを作り、
それにcppとhを1つづつ追加しただけす。
追加したソースは他のアプリで使ってたんで問題ないと思います。
という感じです。
>>33 テンプレちがう。
0036デフォルトの名無しさん
2005/04/14(木) 18:02:11ヘッダーのinclude行より前に書いたら直りました。
ごめんなさい。
0037デフォルトの名無しさん
2005/04/14(木) 20:06:29判断するにはどうしたらいいのかな?
0038v(^・^)v
2005/04/14(木) 22:33:220039デフォルトの名無しさん
2005/04/15(金) 00:03:39参照メンバに対してoffsetofを使おうとすると、鼻から悪魔が。
まあ、大抵の実装でぬるぽ。
0040デフォルトの名無しさん
2005/04/15(金) 00:28:51どうにもこうにも
0041デフォルトの名無しさん
2005/04/15(金) 00:34:040042デフォルトの名無しさん
2005/04/15(金) 00:34:37マクロの物はマクロで
0043デフォルトの名無しさん
2005/04/15(金) 00:58:44メンバの型は直接関係無くて、POD以外の型にoffsetof使った時点でアウト。
0044デフォルトの名無しさん
2005/04/15(金) 01:27:02http://www.kumamoto-u.ac.jp/
反撃したいやつは、VIP板に集合
http://ex10.2ch.net/news4vip/index.html
0045デフォルトの名無しさん
2005/04/15(金) 08:21:30ガッ
0046デフォルトの名無しさん
2005/04/16(土) 14:11:45メモリリークを検知するツール何が一番よいと思いましたか?
0047デフォルトの名無しさん
2005/04/16(土) 18:00:40自前の時はVCランタイム任せ…
0048デフォルトの名無しさん
2005/04/16(土) 18:39:300049デフォルトの名無しさん
2005/04/16(土) 18:45:590050デフォルトの名無しさん
2005/04/16(土) 18:47:510051デフォルトの名無しさん
2005/04/16(土) 21:19:460052デフォルトの名無しさん
2005/04/16(土) 21:24:310053デフォルトの名無しさん
2005/04/16(土) 21:31:11オブジェクトですか?
オブジェクトなら入れる入れ物はポインタじゃないんですか?
005453
2005/04/16(土) 21:32:11さらに、ポインタじゃなくてポインタ変数でした。
0055デフォルトの名無しさん
2005/04/16(土) 21:32:27さて無いのはどれだ?
0056デフォルトの名無しさん
2005/04/16(土) 21:37:580057デフォルトの名無しさん
2005/04/16(土) 21:39:28メモリに「なにか」が格納されている領域の先頭アドレス。
0058デフォルトの名無しさん
2005/04/17(日) 03:27:38a = &b + &cとかいやだから作ったってはげが言ってた
0059デフォルトの名無しさん
2005/04/17(日) 09:29:350060デフォルトの名無しさん
NGNGそれをいうなら *a = *b + *c がいやだから、じゃないか?
0061デフォルトの名無しさん
2005/04/17(日) 20:41:14文字通り参照を渡してるんだよ。アドレスとかなんとか余計なことは考えなくてよろしい。
0062デフォルトの名無しさん
2005/04/17(日) 23:59:020063デフォルトの名無しさん
2005/04/18(月) 00:00:38コピーしたらまずいんでね?オブジェクトの場合。
0064デフォルトの名無しさん
2005/04/18(月) 00:13:08「アドレスを保持した変数をコピー」と読み替えるんだろ。何かまずいか?
0065デフォルトの名無しさん
2005/04/18(月) 02:12:330066デフォルトの名無しさん
2005/04/18(月) 14:25:210067デフォルトの名無しさん
2005/04/18(月) 14:32:39なぜカタコト
0068デフォルトの名無しさん
2005/04/18(月) 22:23:080069デフォルトの名無しさん
2005/04/18(月) 23:38:560070デフォルトの名無しさん
2005/04/18(月) 23:52:29ガイシュツ。そして歴史は繰り返す。
0071デフォルトの名無しさん
2005/04/19(火) 00:02:310072デフォルトの名無しさん
2005/04/19(火) 10:35:28スタンディング・バックインサーター
0073デフォルトの名無しさん
2005/04/19(火) 10:54:030074デフォルトの名無しさん
2005/04/19(火) 19:29:42sexually transmitted diseases・back inserter
0075デフォルトの名無しさん
2005/04/20(水) 14:15:45ライブラリ一覧( Boost-TR1 )が加わってるみたい。
現在 std::tr1 名前空間が利用されている模様
0076デフォルトの名無しさん
2005/04/20(水) 14:28:050077デフォルトの名無しさん
2005/04/20(水) 23:03:26というかTRの文面でその名前空間を使えと指定してますからね
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1711.pdf
0078デフォルトの名無しさん
2005/04/20(水) 23:33:18(VC6,VC7.1,GCC3.4.3)
#include<iostream>
#define print(x) {for(int i____=0;i____<32;i____++){ \
std::cout << (((static_cast<unsigned long>(0x00000001) << (32-1-i____)) & x) != 0);} \
std::cout << std::endl;}
int main()
{
print( ((0xFFFFFFFFU >> 32) << 32) );//00000000000000000000000000000000
unsigned int uu1 = 0xFFFFFFFFU;
print( ((uu1 >> 32) << 32) );//11111111111111111111111111111111
}
0079デフォルトの名無しさん
2005/04/20(水) 23:43:36というかall 1になるのは反則だな。
008078
2005/04/21(木) 01:10:19#define LSHIFT(data,N) ( ((N)<sizeof(data)*8) ? ( (data) << (N) ) : (0) )
#define RSHIFT(data,N) ( ((N)<sizeof(data)*8) ? ( (data) >> (N) ) : (0) )
で対処するか...
unsigned int uu2=1;
print( ( 1 << 31 ) );//1000000000000000000000
print( ( uu2 << 31 ) );//1000000000000000000000
print( ( 1 << 32 ) );//0000000000000000000000
print( ( uu2 << 32 ) );//0000000000000000000001
print( ( 1 << 33 ) );//0000000000000000000000
print( ( uu2 << 33 ) );//0000000000000000000010
print( ( 1 << 34 ) );//0000000000000000000000
print( ( uu2 << 34 ) );//0000000000000000000100
std::cout << "----------------------" << std::endl;
print( ( 1 >> 31 ) );//0000000000000000000000
print( ( uu2 >> 31 ) );//0000000000000000000000
print( ( 1 >> 32 ) );//0000000000000000000000
print( ( uu2 >> 32 ) );//0000000000000000000001
print( ( 1 >> 33 ) );//0000000000000000000000
print( ( uu2 >> 33 ) );//0000000000000000000000
print( ( 1 >> 34 ) );//0000000000000000000000
print( ( uu2 >> 34 ) );//0000000000000000000000
0081デフォルトの名無しさん
2005/04/21(木) 01:12:130にされているのかな。
008281
2005/04/21(木) 01:13:130083デフォルトの名無しさん
2005/04/21(木) 02:47:200084デフォルトの名無しさん
2005/04/21(木) 03:54:20そりゃダメだろー
0085デフォルトの名無しさん
2005/04/21(木) 08:57:09このあたりか?
ttp://oku.edu.mie-u.ac.jp/~okumura/iroiro/0303.html
ttp://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section01/section01_05.html
ttp://www.lcv.ne.jp/~kenmio/goukaku/goukaku2/g25.htm#g2-26 (←これはJAVAの話)
混合モードで見ると、まんま
shr eax,20h
shl eax,20h
0086デフォルトの名無しさん
2005/04/21(木) 09:01:41"The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand."
結果の値が実装定義かと思ってたが、未定義動作になるそうだ。
32bitCPUなら、シフト命令のオペランドが下位5ビットしか見られなくて、
32ビットのシフトが0ビットのシフトになる、というのが考えられる。
定数の場合はコンパイラが内部で計算するので、CPUの特性を反映しないんだろう。
0087デフォルトの名無しさん
2005/04/21(木) 10:58:5780386以降がそうだったかなー
0088デフォルトの名無しさん
2005/04/21(木) 16:46:15tryが認識されません。
なぜでしょうか?
コードは長いので2回に分けて書きます
void mo12(void){
char str12[5]={0};/*結果を入れてもらう変数*/
int strbl;/*strlenghtの結果を入れる為の変数*/
putchar('\n');
for(;1;){
printf("\t文字を入力してください(zで終了):");
try{
gets(str12);/*値を取得してstr12に格納*/
}catch(...){
printf("エラー");
break;
}
0089デフォルトの名無しさん
2005/04/21(木) 16:47:29//str12[0]='z';
strbl=strlen(str12);//文字の最大数を測定
//元の値の表示
if(strbl>5){er=-3;error1(&er);break;}
putchar('\t');
for(i=0;i<strbl;i++){printf("%X ",str12[i]);}
printf("が入力されました\n\t");
for(count=0;count<strbl;count++){
er=mondai12(str12,count);/*文字をHEXコードに変換し、上位ビットと下位ビットを入れ替える関数*/
if(er<0){/*エラー処理*/error1(&er);}else{
//結果の表示
if(count==0){/*最初のみ表示*/printf("上位ビットと下位ビットを入れ替えると");}
printf("%X ",er);
}
}
printf("\n\n");
for(count=0;count<strbl;count++){/*大文字か小文字のzを検索該当する値があれば-5をerに代入*/
if(str12[count]==0x7a||str12[count]==0x5a){
er=-5;}
}
if(er==-5){break;}
}
}
0090デフォルトの名無しさん
2005/04/21(木) 16:50:560091デフォルトの名無しさん
2005/04/21(木) 16:52:02お前のごみみたいなコードを何回も見ているこっちの身にもなってくれ。
つーか、根本的にC++(というよりCでさえ)理解できていない悪寒。
VBやってる方が幸せだと思われ。
0092デフォルトの名無しさん
2005/04/21(木) 16:54:48解決しました、ご迷惑をおかけしてすみませんでした。
スレを3つも巻き込んでしまってすみませんでした。
0093デフォルトの名無しさん
2005/04/21(木) 17:27:08せめてどうやって解決したのかくらい書けばまだ許せたのに。
0094デフォルトの名無しさん
2005/04/21(木) 17:32:01.cの拡張子でコンパイルしていたのでtryが機能しませんでした。
.ccpに変えると上手くいきました。
解決方法を書かなくてすみませんでした
0095デフォルトの名無しさん
2005/04/21(木) 21:12:05getsって例外吐いたっけ?
0096デフォルトの名無しさん
2005/04/21(木) 21:24:021. 通常のnew演算子
・クラスのサイズのメモリを割り当て
・コンストラクタを呼ぶ
・deleteで解放する
2. operator new
・単に生のメモリを割り当てるだけ。コンストラクタは呼ばない
・解放する時はoperator delete ※malloc()みたいなモノ?
3. クラスでオーバーロードした operator new
・1で呼ばれる deleteで解放する
4. placement new
・既に確保してあるメモリブロック(共有メモリとか)上にインスタンスを作成する
・デストラクタは明示的に呼ぶ必要がある
・メモリの解放はメモリ獲得時の方法に依存する
の四種類という認識でいいんでしょうか
どこか詳しく解説しているサイト等あったら教えてください
0097デフォルトの名無しさん
2005/04/21(木) 21:26:15解決しませんでした。gets()は例外を投げない関数である事を忘れて
いました。
0098デフォルトの名無しさん
2005/04/21(木) 21:31:28istreamのメンバじゃない方のstd::getlineを使え。
0099デフォルトの名無しさん
2005/04/21(木) 21:35:04そのplacement newはnewのあとにくるnew-placementが
void*型一つの場合で、デフォルトの(<new>に定義されている)
operator new (std::size_t, void*)かこれと同じような実装の
operator new(std::size_t, void*)を使用する場合の話。
0100デフォルトの名無しさん
2005/04/21(木) 21:36:174のplacement newを実現する方法が2と3のoperator new。
operator newは関数呼び出しの形式で使うとコンストラクタは呼ばれないが、演算子として使えばコンストラクタは呼ばれる。
operator deleteをオーバーロードすれば、そのoperator deleteを(演算子として)使うことによりデストラクタも呼ばれる。
0102デフォルトの名無しさん
2005/04/21(木) 22:20:35平たく言うと演算子のnewは
1 適切なoperator newでメモリを確保
2 確保したメモリにオブジェクトを作る
ということをしている。
>>96の4でいうplacement newは1のステップを
渡されたポインタをそのまま返すという空の動作にすることで、
メモリ確保をせずオブジェクトの生成だけを行っている。
0103デフォルトの名無しさん
2005/04/21(木) 22:30:35二項フレンド演算子関数の所で内部コンパイルエラーとなってしまいます。
friend coord operator+(coord ob1, int i);
単項フレンド演算子関数だと平気なのですが、原因わかる方いませんか?
friend coord operator++(coord &ob);
0104デフォルトの名無しさん
2005/04/21(木) 22:35:09つうかエラーメッセージを書こうよ
0105103
2005/04/21(木) 22:41:32int x, y; // 座標値
public:
coord() { x=0; y=0; }
coord(int i, int j) { x=i; y=j; }
void get_xy(int &i, int &j) { i=x; j=y; }
friend coord operator+(coord ob1, int i);
friend coord operator+(int i, coord ob1);
};
// ob+intのオーバーロード
coord operator+(coord ob1, int i)
{
coord temp;
temp.x = ob1.x + i;
temp.y = ob1.y + i;
return temp;
}
\StudyCPP.cpp(11) : fatal error C1001: 内部コンパイラ エラー
(コンパイラ ファイル 'msc1.cpp', 行番号 1786)
Visual C++ のサポート情報 コマンドを選択してください
ヘルプ メニュー、 またはサポート情報のヘルプ ファイルを参照してください
cl.exe の実行エラー
となってしまいます。ソースは独習C++付属CDからのコピペなんで間違ってはないと思うのですが。
0106デフォルトの名無しさん
2005/04/21(木) 22:55:27それより内部エラーは6.0の作りが悪い。
0107103
2005/04/21(木) 23:10:17となるとが左側に定数がくるような演算
temp = 10+ob;
が出来なくなるみたいなんですがしょうがないのかな
0108デフォルトの名無しさん
2005/04/21(木) 23:11:330109_(._.)_
2005/04/21(木) 23:16:29コンパイル中
ntddndis.hのtypedef ULONG NDIS_OID, *PNDIS_OID;
のところで
NtDDNdis.h(78): error C2146: 構文エラー : ';' が、識別子 'NDIS_OID' の前に必要です。
NtDDNdis.h(78): error C2501: 'NDIS_OID' : 識別名を宣言するのに、型が指定されていません。
NtDDNdis.h(78): error C2501: 'PNDIS_OID' : 識別名を宣言するのに、型が指定されていません。
...
というエラーがでます。なぜでしょうか?
0110デフォルトの名無しさん
2005/04/21(木) 23:16:35ファイルのサイズを取得する方法はないでしょうか。
具体的には、
FILE* fp;
fp.fopen("hogehoge.dat", "r");
として、
long size = fp.GetFileSize();
のように行ないたいです。
よろしくお願いします。
0111デフォルトの名無しさん
2005/04/21(木) 23:20:58> fp.fopen("hogehoge.dat", "r");
これがまず無理。
0112デフォルトの名無しさん
2005/04/21(木) 23:22:14って何のクラスだこれ
0113デフォルトの名無しさん
2005/04/21(木) 23:23:49ご指摘ありがとうございます。
fp = fopen("hogehoge.txt", "r");
long size = GetFileSize(fp);
に訂正します。
0114デフォルトの名無しさん
2005/04/21(木) 23:24:01windows.hをインクルードしてないからじゃないか?
0115_(._.)_
2005/04/21(木) 23:26:13ありがとうございます。コンパイルとおりました。
0116デフォルトの名無しさん
2005/04/21(木) 23:27:19GetFileSize((HANDLE)_get_osfhandle(_fileno(fp)), NULL)
0118デフォルトの名無しさん
2005/04/21(木) 23:28:51とりあえずVCにSPを当ててみろ。
0119デフォルトの名無しさん
2005/04/21(木) 23:29:16もしかすると fseek は、ポインタ位置の増分を返してくれるのですか?
ありがとうございました、さっそく使用してみます。
>>116
こちらの方も検討してみます。
ありがとうございます。
0120デフォルトの名無しさん
2005/04/21(木) 23:31:46手元のVC6(SP6)だとすんなり通ったよ
0121デフォルトの名無しさん
2005/04/21(木) 23:39:11非標準ライブラリの話はスレ違い。
ほどほどにしろ。
0123デフォルトの名無しさん
2005/04/22(金) 00:27:000124デフォルトの名無しさん
2005/04/22(金) 01:08:310126デフォルトの名無しさん
2005/04/22(金) 22:22:09などという言葉が出てきたのですが、仮想基底クラスとは
どういうクラスを指すのですか?
virtualなメンバ関数のみのクラスってこと?
0127デフォルトの名無しさん
2005/04/22(金) 22:24:41そんくらいググれよボケ
0128デフォルトの名無しさん
2005/04/22(金) 22:29:050129126
2005/04/22(金) 23:22:58とこしか・・・ orz
0130デフォルトの名無しさん
2005/04/22(金) 23:31:22ダイアモンド継承した時に、親の親クラスのインスタンスを一つに絞るおまじない
とでも覚えておくとよい。それ以外は、速度が遅くなるなどデメリットばかり。
0131デフォルトの名無しさん
2005/04/22(金) 23:40:23Aから継承したB
Aから継承したC
BとCから継承したD
↑をダイアモンド継承という
0132氷河
2005/04/22(金) 23:45:080133126
2005/04/22(金) 23:45:51親の親クラスがその仮想基底クラスじゃないとなると
ダイアモンド継承したクラスには、Aのインスタンスが2つ
あるってことか。じゃ、あいまいさが出てくるの?
0134デフォルトの名無しさん
2005/04/22(金) 23:53:27コンパイルして実験すればすぐわかる〜
struct A {
int x;
};
struct B : public A {
};
struct C : public A {
};
struct D : public B, public C {
D() {
std::cout << x << std::endl; // B::xなのかC::xなのか?
}
};
0135126
2005/04/23(土) 00:46:520136デフォルトの名無しさん
2005/04/23(土) 23:07:58意味ないんですよね?
0137デフォルトの名無しさん
2005/04/23(土) 23:15:550138デフォルトの名無しさん
2005/04/24(日) 05:22:36w
0139デフォルトの名無しさん
2005/04/24(日) 06:04:270140デフォルトの名無しさん
2005/04/24(日) 07:00:18今だけ教えてあげよう。BだけがAを仮想基底クラスとして継承した場合、
Cから見てAのint xは仮想基底とはならず、やはりDで曖昧さが生じてしまう。
仮想基底の仕組みは、ポインタによく似ている。
詳しくはInside The C++ Object Modelの第3章当たりを読んでみて欲しい。
0141デフォルトの名無しさん
2005/04/24(日) 08:18:20BがなくてDが重複している。
0142136
2005/04/24(日) 09:11:24ありがとうございます。
どちらも仮想基底としなかった場合と同じようにあいまいになるようですが
内部的にはちょっと違いがあるってことですかね。
0143デフォルトの名無しさん
2005/04/24(日) 20:58:05「多重継承は犯罪です」スレを思い出したよ。
0144デフォルトの名無しさん
2005/04/24(日) 23:50:22なにこのダライアス継承
0145デフォルトの名無しさん
2005/04/25(月) 12:59:27http://headlines.yahoo.co.jp/hl?a=20050425-00000004-cnet-sci
0146age
2005/04/25(月) 13:36:31http://japan.cnet.com/news/ent/story/0,2000047623,20083118,00.htm
0147デフォルトの名無しさん
2005/04/25(月) 15:13:12http://japan.cnet.com/news/ent/story/0,2000047623,20083118,00.htm
0148デフォルトの名無しさん
2005/04/25(月) 20:37:34毛が増えたらしい
0149デフォルトの名無しさん
2005/04/25(月) 21:51:48どれだけ出てくるのかって問題もあるんじゃ・・・。
次の標準化で少しは光が見えてくるのかしら。
0150デフォルトの名無しさん
2005/04/25(月) 22:28:220151デフォルトの名無しさん
2005/04/25(月) 23:13:240152デフォルトの名無しさん
2005/04/26(火) 01:03:250153デフォルトの名無しさん
2005/04/26(火) 02:02:440154sage
2005/04/26(火) 11:38:22C++では、標準Cライブラリの識別子(マクロを除く)は名前空間std内に宣言/定義されるよね。
でもerrnoはマクロと識別子のどちらであるか規定されないってあるんだけど。
それって、単にerrnoって書くべきか、std::errnoって書くべきか、処理系よって異なるってこと?
参照してる情報が間違ってるのかしらん。
stdoutとかも良くわからん…
0155デフォルトの名無しさん
2005/04/26(火) 11:39:170156デフォルトの名無しさん
2005/04/26(火) 13:35:38-5- Names which are defined as macros in C shall be defined as macros in the C++ Standard Library,
even if C grants license for implementation as functions.
[Note: the names defined as macros in C include the following: assert,
errno, offsetof, setjmp, va_arg, va_end, and va_start.--- end note]
だそうだ
0157デフォルトの名無しさん
2005/04/26(火) 19:29:360158デフォルトの名無しさん
2005/04/26(火) 20:34:140159デフォルトの名無しさん
2005/04/26(火) 20:45:16たとえCが処理系に対して関数として実装する許可を与えていても、Cにおいて
マクロとして定義されている名前はC++標準ライブラリにおいてもマクロとして
定義されなければならない。
[注釈:Cにおいてマクロとして定義されている名前には次のものが含まれる:
assert、errno、offsetof、setjmp、va_arg、va_end、そしてva_start。--- 注釈終]
0160154
2005/04/26(火) 21:51:18疑問が解けました。
ありがとです。
0161デフォルトの名無しさん
2005/04/27(水) 00:12:21boost::compatibilityなんかはほんとに.hをincludeしてるだけだ。男気がある
0162デフォルトの名無しさん
2005/04/27(水) 00:15:40std::FILE とか禿しくキモい記述になったり、
setjmp がマクロだから std 無しで、 longjmp は関数だから std 付けて、とか、
正直やってらんない。
0163デフォルトの名無しさん
2005/04/27(水) 00:40:56.hをincludeして、std付けないで使ってる。
そのやり方が非推奨だと知っていても。
0164デフォルトの名無しさん
2005/04/27(水) 00:41:02「標準」 のものに名前空間なんかいらないと思うんだけどな
0165デフォルトの名無しさん
2005/04/27(水) 01:02:56まぁ、結局unorderd_mapみたいになんだけどな。
0166デフォルトの名無しさん
2005/04/27(水) 01:09:110167デフォルトの名無しさん
2005/04/27(水) 01:10:15ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#456
456. Traditional C header files are overspecified
Status: OPEN
"We should accept the fact that we made a serious mistake and rectify it, however belatedly, by explicitly allowing either of the two schemes for declaring C names in headers. "
「我々は深刻なミスを犯した事実を認め、2つのスキーマの両方を明示的に認めることによって、たとえ手遅れだとしても、これを修正するべきである。」
0168デフォルトの名無しさん
2005/04/27(水) 02:34:45struct A
{
virtual char const* f() { return "A"; }
};
struct B
{
virtual char const* f() { return "B"; }
};
struct C : A, B
{
char const* f() { return "C"; }
};
int main()
{
C c;
A& a = c;
std::puts( a.f() );
B& b = c;
std::puts( b.f() );
return 0;
}
このソースを cygwin g++ 3.4.1 でコンパイルして実行すると、
"C" が2つ表示されたんですが、C::f() の定義ひとつで、
A::f() と B::f() の両方が同時にオーバーライドされたことになってるんでしょうか?
エラーになるか、どちらか片方だけオーバーライドされると思っていたのに。
0169168
2005/04/27(水) 02:38:59A::f() と B::f() のそれぞれに C で別々の実装を与えるような
オーバーライドを行いたい場合はどうしたらいいんでしょうか?
0170デフォルトの名無しさん
2005/04/27(水) 02:46:50違う。CはA、Bのprivate継承なので、オーバライドになってない。
0171168
2005/04/27(水) 03:00:24C は struct で宣言しているので、継承は public です。
class で宣言して継承が private になっていたとしても、
オーバーライドになるかならないかに影響はありません。
0172168
2005/04/27(水) 03:04:23http://www.gotw.ca/gotw/039.htm
なになに? "Renaming Virtual Functions"・・・
うわぁ・・・猛烈に納得いかねー。
0173デフォルトの名無しさん
2005/04/27(水) 03:07:26もう手遅れだけどな!
C++のライブラリ設計ってよく考えると結構キモス
0174デフォルトの名無しさん
2005/04/27(水) 03:34:12struct A
{
virtual char const* f() { return "A"; }
};
struct B
{
virtual char const* f() { return "B"; }
};
struct C : A, B
{
char const* f() { return "C"; }
};
int main()
{
C c;
A& a = c;
std::puts(a.f());
B& b = c;
std::puts(a.f());
std::puts(a.A::f());
std::puts(b.B::f());
return 0;
}
0175デフォルトの名無しさん
2005/04/27(水) 03:38:240176デフォルトの名無しさん
2005/04/27(水) 11:26:44個数を0で、newすると、メモリが確保されるのですが、これはなぜでしょうか?
この例の場合、char 1つ分のメモリが確保されるのでしょうか?
そもそも、0でnewすることが間違っているとは思うのですが。
ガイシュツだったら、すいません。
int
main (int argc, char **argv)
{
char *p = NULL;
p = new char[0];
printf ("%d\n", p);
delete [] p;
exit (EXIT_SUCCESS);
}
0177デフォルトの名無しさん
2005/04/27(水) 11:44:32char 1 つ分のメモリは確保されない。
確保されるとみなしてアクセスすると違反や領域破壊が起こる可能性がある。
処理系の実装にもよるが、一般に new char[0]; で返される領域の直前あたりに
メモリ管理情報のための領域が取られていたりするので、[0] でも使用メモリは
%>FOXE瘧ア増える。
0178デフォルトの名無しさん
2005/04/27(水) 11:47:38サンクスです。
0179デフォルトの名無しさん
2005/04/27(水) 12:13:32%>FOXE瘧ア増える。
ってなってるんだが俺だけ?
0180デフォルトの名無しさん
2005/04/27(水) 12:25:14サイズを 1 にして確保するように規格で
決まってなかったっけ?
0181デフォルトの名無しさん
2005/04/27(水) 12:36:11#include <iostream>
class A
{
public:
A() { std::cout << "Hello, world!" << std::endl; }
};
int main(void)
{
A *a = new A[0];
delete[] a;
return 0;
}
"Hello, world!" が表示されるというのか?
0182デフォルトの名無しさん
2005/04/27(水) 13:04:44operator newではなくてnew演算子だよ。
0183デフォルトの名無しさん
2005/04/27(水) 13:06:43NULLでないこと、operator deleteを呼び出しても安全なこと、
このくらいしか決まってなかった気がするけど。
0184デフォルトの名無しさん
2005/04/27(水) 13:37:26こういう処理にしていると、どっかで禿が書いていたような気が……
0186デフォルトの名無しさん
2005/04/27(水) 15:44:54サイズ1っていっても、operator newからは型がわからんだろ。
1バイト?
0187デフォルトの名無しさん
2005/04/27(水) 15:48:05ずれてる。
0188デフォルトの名無しさん
2005/04/27(水) 15:51:075.3.4-7
When the value of the expression in a direct-new-declarator
is zero, the allocation function is called to allocate an array
with no elements.
0189デフォルトの名無しさん
2005/04/27(水) 23:31:41p = new char[sizeof(Hoge)];
*p = Hoge(100);
このようにした場合一時オブジェクトのデストラクタも呼ばれてしまい、
パフォーマンス的にどうかなと思います。
そこで、
p->Point(100);
こんな感じでデストラクタのようにコンストラクタが呼べればいいのですがダメみたいです。
明示的にコンストラクタを呼ぶにはどうしたら良いのでしょうか?
0190デフォルトの名無しさん
2005/04/27(水) 23:33:41operator newを使うとか
0191デフォルトの名無しさん
2005/04/28(木) 00:03:49placement new
0192デフォルトの名無しさん
2005/04/28(木) 00:06:51p->Point::~Point();
0193デフォルトの名無しさん
2005/04/28(木) 00:09:04190,191 はスルーしてるが、「メモリブロック」って何のこと言ってんの?
その例だけ見ると、 p = new Hoge(100) で何も問題ないように見えるんだが。
0194191
2005/04/28(木) 00:19:11あと、一応突っ込んどくが
>*p = Hoge(100);
>このようにした場合一時オブジェクトのデストラクタも呼ばれてしまい、
>パフォーマンス的にどうかなと思います。
パフォーマンス以前に構築されてないオブジェクトに対し代入するのはだめよ。
0195デフォルトの名無しさん
2005/04/28(木) 00:31:30placement newでも、
p->Point::Point(); でも確保済みのメモリブロックを初期化できるみたいですが、
この二つにビット的な違いはあるんでしょうか?
>>193
何らかのライブラリが返したメモリ領域とでも言えばよいでしょうか?
直接newで確保出来ない場合などです。
0196デフォルトの名無しさん
2005/04/28(木) 00:36:000197デフォルトの名無しさん
2005/04/28(木) 00:36:47構築されてないオブジェクトとはどのような意味でしょうか…?
0198デフォルトの名無しさん
2005/04/28(木) 00:39:09察して頂けてると思いますが書き間違えで本来は
p->Hoge::Hoge();
です。
ええと VC++7.1です。
この呼び出し方は一般的に通用しない方法なんですかね。
0199デフォルトの名無しさん
2005/04/28(木) 00:44:48無い無い。VC++に騙されてる。忘れろ。
0200デフォルトの名無しさん
2005/04/28(木) 00:46:11>>197
必要なメモリ領域があるだけじゃだめで、コンストラクタで構築されて初めて使える。
0201デフォルトの名無しさん
2005/04/28(木) 00:48:44"The C++ object model"
ttp://www.kuzbass.ru/docs/isocpp/intro.html#intro.object
0202デフォルトの名無しさん
2005/04/28(木) 00:58:41VC++独自の解釈なんですね。
今回の事例では便利なんですがこれが普通だと理解してしまうのはちと危険ですかね。
placement newで実装してみます。
>>200, 201
言及ありがとうございました。
0203デフォルトの名無しさん
2005/04/28(木) 13:27:23error C2079: 'ClassA::classB' が 未定義の class 'ClassB' で使用しています。
というエラーメッセージが出てしまいます。
ClassA 内で ClassB をメンバ変数として持たせる方法を教えて下さい。
お願いいたします。
// クラスのプロトタイプ宣言
class ClassB;
// クラスA
class ClassA
{
public:
ClassB classB;
};
// クラスB
class ClassB
{
};
0204デフォルトの名無しさん
2005/04/28(木) 13:40:57ClassBをClassAの前に持ってくる。
0205203
2005/04/28(木) 18:45:14返信ありがとうございます。
204さんの仰る方法で解決することができたのですが、またすぐにつまずいてしまいました。
ClassA から ClassB のメソッドを呼び出し。
ClassB から ClassA のメソッドを呼び出すと
error C2027: 認識できない型 'ClassA' が使われています。
error C2227: '->Method2' : 左側がクラス、構造体、共用体へのポインタではありません。
というエラーメッセージが出てしまいコンパイルできませんでした。
具体的なコードは下記のとおりです。
// クラスのプロトタイプ宣言
class ClassA;
class ClassB;
// クラスB
class ClassB {
public:
ClassA* pClassA;
void Method1() { pClassA->Method2(); };
void Method2() { };
};
// クラスA
class ClassA {
public:
ClassB* pClassB;
void Method1() { pClassB->Method2(); };
void Method2() { };
};
0206デフォルトの名無しさん
2005/04/28(木) 18:57:20B::Method1()の定義をClassAの宣言の後に書く。
あるクラスを使う場合、そのクラスの完全な宣言が必要になる。
コンパイラはファイルの先頭から順に解釈していく。
0207デフォルトの名無しさん
2005/04/28(木) 20:42:01_CrtSetDbgFlagで正しく行番号をアウトプットに吐かせるには
どうしたら良いでしょうか
マクロで対応させれたと思うのですが、忘れてしまいまして、、。
宜しくお願いします
(´・ω・`)
0208デフォルトの名無しさん
2005/04/28(木) 20:54:040209203
2005/04/28(木) 20:57:07ありがとうございます。
おかげさまで解決できました。
0210207
2005/04/28(木) 21:30:190211デフォルトの名無しさん
2005/04/30(土) 02:09:25アンドリュー・コーニグのC++再考(新装版)の話なんだけど、
第八章で式をつくる(そして計算する)プログラムつくるよね?
そんとき、コンストラクタの引数で直接Exprを渡してるのはなんで?
const Expr&で十分、というかその方がいいのでは?
たいして違わないと言われればそれまでだけど・・
0212デフォルトの名無しさん
2005/04/30(土) 03:04:45Unary_Node、Binary_Nodeで引数へのポインタを取っていて、
それがconstじゃないからまずいんでしょ。
0213デフォルトの名無しさん
2005/04/30(土) 03:22:18こんな感じのフラグチェック用メンバ関数を作りたいのですが、
「warning C4800: 'int' : ブール値を 'true' または 'false' に強制的に設定します」
という警告が出てしまいます。
boolでキャストしても駄目で…返値をintにすれば大丈夫なのですがその前に質問させてください。
bool返値のまま、警告を出さずに済むような方法は無いでしょうか。
0214デフォルトの名無しさん
2005/04/30(土) 03:24:000215デフォルトの名無しさん
2005/04/30(土) 03:25:280216デフォルトの名無しさん
2005/04/30(土) 08:00:44const Expr& だと、 std::auto_ptr は渡せない。
とかそういう話が出てくるからじゃないかな?
0217デフォルトの名無しさん
2005/04/30(土) 11:56:58class A; // クラスAの宣言
class A // クラスAの宣言&定義
{
void hoge(); // メンバ関数hogeの宣言
void foo() {} // メンバ関数fooの宣言&定義
int i; // メンバ変数の定義?
};
という認識であってますか?
0218デフォルトの名無しさん
2005/04/30(土) 12:20:530219デフォルトの名無しさん
2005/04/30(土) 12:31:57これも宣言かつ定義。
0221デフォルトの名無しさん
2005/04/30(土) 15:58:26これって宣言でもあるの?
extern int i;
が宣言で
前者は定義かと思っていた・・・。
0222デフォルトの名無しさん
2005/04/30(土) 16:11:420223222
2005/04/30(土) 16:17:41宣言はコンパイラに名前を認識させるもの。
定義は名前と同時に、その名前に具体的な実体、意味を与えるもの。
定義ではない宣言はあり得る(class A; extern int i;)が、
宣言ではない定義はあり得ない。
うーん。たいしてわかりやすくなってないかも。
0224デフォルトの名無しさん
2005/04/30(土) 16:37:19hogeが名前空間のとき、
int hoge::i;
は定義だけど、宣言ではないんじゃない?
0225デフォルトの名無しさん
2005/04/30(土) 17:00:32その形でも、少なくとも文法上は宣言(および定義)。
しかしその形では、名前空間の中に新しい宣言を取り込ませることは
できないという制限があるので、実際に宣言の役割を果たすことは無い。
ttp://www.kuzbass.ru/docs/isocpp/decl.html#dcl.decl
"When the declarator-id is qualified,..."
0226デフォルトの名無しさん
2005/04/30(土) 17:27:13int i;
と似た形をしたものは全部宣言なんだな。
0227211
2005/04/30(土) 20:19:11ありがとうございます。
がしかし、実はよくわかってないです。。
引数へのポインタ?auto_ptr?えっ、何!?どこ!?という感じであります。
僕の書き方がまずかったのですが、「コンストラクタの引数」というのは
Exprクラスのコンストラクタ引数のことです。
各ノードクラスのコンストラクタ引数とデータメンバの型は、Exprが正しいと思います。
・・・で、Exprがコピーされる時には、実は内部のpがコピーされ、useが変えられてるだけ、ですよね。
そうすると、このExprコンストラクタの引数は参照で十分な気が、という話でした。
同じこと繰り返してすみません(;´Д`)
皆さんのレス書き留めておいて本と一緒にじっくり読ん
できま
す…
0228デフォルトの名無しさん
2005/04/30(土) 23:36:42解説している基礎本・入門本ってありませんかね?技術的なことは書いてなくてもいいのでわかればいいです。
それとC言語もやったことないのでそこのところよろ。
プログラム作ったりしたことあるのはPerl(現在停滞中)と学校であるVisual Basic(ぶっちゃけ簡単すぎて話にならry)です。
ちなみに>>6の見たんですがレビューみたところよさそうなのがThe C++ Programming Languageだけでレビュー見る限り初心者にはあまりむかないそうなのでorz
0229デフォルトの名無しさん
2005/05/01(日) 00:54:27ま、スレ違い。推奨図書のスレにどうぞ。
推薦図書/必読書のためのスレッド PART 23
http://pc8.2ch.net/test/read.cgi/tech/1112178595/
0230デフォルトの名無しさん
2005/05/01(日) 20:51:21>>6で入門書と言えるのはPrimerだけだと思われ
0231デフォルトの名無しさん
2005/05/02(月) 04:27:28コンパイラの仕様?小数点はテンプレートで使えないの?
0232デフォルトの名無しさん
2005/05/02(月) 06:27:18>コンパイラの仕様?小数点はテンプレートで使えないの?
んなこたーない。
ソースとエラーメッセージを晒せ。
0233デフォルトの名無しさん
2005/05/02(月) 07:21:590234デフォルトの名無しさん
2005/05/02(月) 08:11:180235デフォルトの名無しさん
2005/05/02(月) 10:20:13使えない。
ISO/IEC 14882:1998 14.3.2 Template nontype arguments -1
A template-argument for a non-type, non-template template-parameter
shall be one of:
- an integral constant-expression of integral or enumeration type; or
- the name of a nontype template-parameter; or
- the name of an object or function with external linkage, including function
templates and function template-ids but excluding nonstatic class members,
expressed as idexpression; or
- the address of an object or function with external linkage, including function
templates and function template-ids but excluding nonstatic class members,
expressed as & idexpression where the & is optional if the name refers to
a function or array; or
- a pointer to member expressed as described in 5.3.1 .
0236231
2005/05/02(月) 11:36:350237デフォルトの名無しさん
2005/05/02(月) 12:22:570238デフォルトの名無しさん
2005/05/02(月) 16:13:23あとmplなんかではテンプレートテンプレート引数は使っちゃ駄目ってことだけど
標準はどうする気なんだろう
0239デフォルトの名無しさん
2005/05/02(月) 16:44:04浮動小数点はなー。
template<float> class T; に対して、
T<10.0f> と、 T<1.0f * 10> が同じ型かどうか、
なんてのが問題になる限り、無いと思うよ。
> mplなんかではテンプレートテンプレート引数は使っちゃ駄目
こちら、解説きぼん。
0240231
2005/05/02(月) 19:31:05……
template <const double& D>
void f()
{ std::cout << D << std::endl; }
これくらいなら通るんですが、基本的にムリっぽいですね…
0241デフォルトの名無しさん
2005/05/02(月) 20:34:21T<0.1f * 100> なんてのはもっと危ないな。
0242デフォルトの名無しさん
2005/05/02(月) 21:03:50>>239
> mplなんかではテンプレートテンプレート引数は使っちゃ駄目
MPLで言うところのメタ関数クラスに置き換わる方向性だと思うんですけれどね.
テンプレートテンプレート引数は対象とするテンプレート引数の個数を
決め打ちしないといけないので非常に使いづらいんですよ.
0243デフォルトの名無しさん
2005/05/02(月) 21:13:49それで不満なところは何?
0244デフォルトの名無しさん
2005/05/02(月) 21:27:000.1f * 100 = 10.0f で float ってことで
×T<10>
○T<10.0f>
ってことにはならないの?
0245デフォルトの名無しさん
2005/05/02(月) 21:34:570246217
2005/05/02(月) 22:43:570247デフォルトの名無しさん
2005/05/03(火) 00:19:16そんなことは分かっている。
それがわかったところで>244はやっぱりわからん。
ついでにその番号コテも意味がわからん。
0248デフォルトの名無しさん
2005/05/03(火) 00:39:260249デフォルトの名無しさん
2005/05/03(火) 00:47:080250デフォルトの名無しさん
2005/05/03(火) 04:24:550251デフォルトの名無しさん
2005/05/03(火) 04:27:290252デフォルトの名無しさん
2005/05/03(火) 10:15:530253デフォルトの名無しさん
2005/05/03(火) 10:49:46問題は無理数をどうするかだ。
0254デフォルトの名無しさん
2005/05/03(火) 10:57:17正しいインスタンスの意味を教えてください。
0255デフォルトの名無しさん
2005/05/03(火) 11:31:19整数をベースに加減乗除とlogとexpを許した集合なら
がんばって比較できるんじゃないだろうか。
0256デフォルトの名無しさん
2005/05/03(火) 11:32:11int a=1, b=1; と宣言した場合aとbの内容は同じでも実体(インスタンス)は別ってことになる。
0257デフォルトの名無しさん
2005/05/03(火) 11:37:23型(クラス)のインスタンス(オブジェクト)と
テンプレートのインスタンス(型か関数)を混同してないか?
0258デフォルトの名無しさん
2005/05/03(火) 11:44:52「インスタンス」=「C++における型のインスタンス」と思い込んでいるようだが、そうではない。
「インスタンス」はモデルに対する実体を表す一般的な名詞。
0259256
2005/05/03(火) 12:04:46でも、この例だと素直にclass Float{ Float(double bunshi, doouble bunbo);} で欲ねーか?
0260デフォルトの名無しさん
2005/05/03(火) 12:21:34それなら typedef double Float; でいいんじゃね?
もう何がしたいのかわかんなくなってるな。発端は>231だと思うが。
0261デフォルトの名無しさん
2005/05/03(火) 13:37:47・浮動小数点数をテンプレートに渡したい(>>231)
・そのためには等値比較が必要(>>239)
・等値比較可能な数値表現として、有理数の提案(>>250)
・等値比較可能性もコンパイル時決定性もどうでも良くなった有理数(>>259)
・当然の合理化(>>260)
0262デフォルトの名無しさん
2005/05/03(火) 13:50:24template< class IntegralSequence, int Scale >
struct big_decimal {
typedef IntegralSequence unscaled_value;
typedef mpl::int_<Scale> scale;
};
typedef big_decimal<mpl::vector_c<int,4,5,6>,2> big4p56;
0263デフォルトの名無しさん
2005/05/05(木) 20:02:02bccやvcでは依存関係の自動出力などはありませんか?
0264デフォルトの名無しさん
2005/05/06(金) 23:12:27int& ref = *new int;
delete &ref;
0265デフォルトの名無しさん
2005/05/06(金) 23:14:38っうぇっうぇwwwwwwうはっwwwおkwwwっ
っうぇwwwwwwっwwwwww
うぇwww
wwwwwwwwwwwwwwwwwwうはっwww
0266デフォルトの名無しさん
2005/05/06(金) 23:36:54ソースを書いてビルドして自分で試すよりも、2chに書き込んで返答を待つことを選んだわけだな?
0267デフォルトの名無しさん
2005/05/06(金) 23:49:15やってみてできた、ということと保証されているということは違うよ。
0268デフォルトの名無しさん
2005/05/07(土) 00:19:03それだけみると、大丈夫だろう。
何を心配している?
0269デフォルトの名無しさん
2005/05/07(土) 20:34:12std::ostringstream s;
...sを使用
s.seekp(0,std::ios_base::beg);//再利用を試みたつもり。
...再び使用。
これで一応動作しているようなのですが、問題ありませんか?
検索したら、stringstreamでstr(string(""))すると書いてあったの
ですが、いまいち違いが分かりません。
(ついでに:ostringstreamとstringstreamの違いも分かりません)
よろしくお願いします。
0270デフォルトの名無しさん
2005/05/07(土) 20:59:25std::ios::failbitとかstd::ios::eofbitを立ててしまったら、s.clear();しとけよ。
それからstd::ostringstreamとstd::istringstreamを多重継承したのが
std::stringstreamってだけの話。当然std::ostringstreamは出力しか
できない。
0271デフォルトの名無しさん
2005/05/07(土) 21:01:37seekp()だけだと前に出力したゴミがくっついて出てこない?
0272デフォルトの名無しさん
2005/05/07(土) 21:09:34#include <sstream>
int main()
{
std::ostringstream s;
s << "abcdefgh";
std::cout << s.str() << std::endl;
s.seekp(0); //再利用を試みたつもり。だけどゴミが残ってる
s << "def";
std::cout << s.str() << std::endl;
s.str("");
s << "def";
std::cout << s.str() << std::endl; // 今度はOK
}
0273デフォルトの名無しさん
2005/05/07(土) 23:39:38s.clear();も無条件につけとくことにします。
stringstreamも多重継承だっんたんですね。
iとかoで始まるものを見かけたら多重継承もあるかも
と考えた方が良さげですね。
>>271さん >>272さん
試したらゴミ出ました。同じ長さ以上の文字列で書き換
えていたので気づきませんでした、、
納得できました。有難うございました。
0274デフォルトの名無しさん
2005/05/08(日) 10:39:200275デフォルトの名無しさん
NGNG0276デフォルトの名無しさん
2005/05/08(日) 17:41:32片方ができればもう片方を作る必要はない。
変換対象が単一オブジェクトなら、
template<typename _Type> static inline void endian(_Type & val) {std::reverse(reinterpret_cast<char *>(& val), reinterpret_cast<char *>(& val + 1));}
0277デフォルトの名無しさん
2005/05/08(日) 18:11:050278デフォルトの名無しさん
2005/05/08(日) 18:14:20定型的に変換できるとは思えないので、無いだろうな。
あんたの言ってる「再帰」がもっと具体的な何かであれば、可能性は有る。
0279不明なデバイスさん
2005/05/08(日) 20:29:21そうだよ。
PCIバスに挿すカードやらIDE接続するドライブなんかはプラグ&プレイであってホットプラグではないだろ?
0280デフォルトの名無しさん
2005/05/08(日) 21:37:48効率悪くなるけど再帰からの出力を別スレッドからキュー経由で受け取ったものを順次読むならboost使って可能かもしれない
0281デフォルトの名無しさん
2005/05/09(月) 23:00:38あるようですが、これってどういう使い方のやつですか?
普通にa.*bみたいな感じ?こんなのありましたっけ?
0282デフォルトの名無しさん
2005/05/09(月) 23:08:50「メンバへのポインタ演算子」でぐぐってみ。
0283デフォルトの名無しさん
2005/05/09(月) 23:10:35メンバへのポインタの参照。
本当は *a.b と書きたいのだが、意味が変わってしまうので、新しく作られた。
純粋なCの*演算子とは意味が違い、アドレスではなくてオフセットのような
物が入っている。
0284デフォルトの名無しさん
2005/05/09(月) 23:30:47>283 のせいで混乱した。
0285281
2005/05/09(月) 23:48:02ぐぐってみたところ、メンバ関数のポインタから関数呼び出しする際に
使うようですね。これ以外は使い道ないですかね。
0286デフォルトの名無しさん
2005/05/09(月) 23:59:380287281
2005/05/10(火) 00:10:530288デフォルトの名無しさん
2005/05/10(火) 00:32:10News 2005-05-09: The 2005-05 mailing is available (7400 kb tar.gz, .zip 7400 kb) individual papers
News 2005-05-09: The C++ Standard Library Issues List (Revision 36) is available (.tar.bz2)
News 2005-05-09: C++ Standard Core Language Issues List (Revision 35) is available, also committee version
0289デフォルトの名無しさん
2005/05/10(火) 00:52:28wwwwwwwwwwwwっうぇおkwwwwwww
wうはっwwwwwwwwwっうはっwwwwwwwww
wwwwwwwwwwwwwwwwww
wwww
0290デフォルトの名無しさん
2005/05/10(火) 06:42:260291デフォルトの名無しさん
2005/05/10(火) 10:47:07K&R
0292デフォルトの名無しさん
2005/05/10(火) 11:38:23ありがとう
とりあえず、アマゾンで注文してみました
0293デフォルトの名無しさん
2005/05/10(火) 11:43:03|
|
|
/V\ ,J
/◎;;;,;,,,,ヽ
_ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
0294デフォルトの名無しさん
2005/05/10(火) 14:19:43template <class T> class Parent{
public:
T operator = (T x){
・・・処理・・・
return x;
}
}
こんな感じのクラスがあり、これを他のクラスから継承して使っています。
継承クラスは「class Child : public Parent<int> {};」という感じです。
しかし、実際に「Child a ; a = 1;」などすると
「二項演算子 '=' : 型 'int' の右オペランドを扱う演算子が見つかりません (または変換できません)。」
というコンパイルエラーが出ます。
あとこの現象はイコール演算子特有なのか「+=」を使うとエラーは出ませんでした。
Childクラスにこのoperator =()を書くと正常にコンパイルできますが、継承クラスは複数あるし、
見た目的にも何だかなぁという感じなのでそれ以外の方法で解決法があれば教えて欲しいです。
環境は WindowsXP SP2 + VS.NET2003 Academicです。
よろしくお願いします。
0295デフォルトの名無しさん
2005/05/10(火) 14:23:05operator=だけは継承されない、と決められてた希ガス。
0296デフォルトの名無しさん
2005/05/10(火) 14:23:34そりゃそうだ
0297デフォルトの名無しさん
2005/05/10(火) 14:24:19ごっつい初歩的な質問すみませんでした・・・。
0298デフォルトの名無しさん
2005/05/10(火) 14:28:33using Parent<int>::opereator=;
でなんとかなる。
>>295
へー。
0299294
2005/05/10(火) 14:37:56なるほど・・・試してみましたが、ちゃんとできました。
これなら変更とかでも対応しやすそうなので充分です。
ありがとうございました!
0300デフォルトの名無しさん
2005/05/10(火) 14:56:50ちょっとキムチ悪いかも・・・
0301デフォルトの名無しさん
2005/05/10(火) 15:02:25デフォルトの(自動生成される)
Child::operator= があるので、
Parent<int>::operator= は隠される。
0302デフォルトの名無しさん
2005/05/10(火) 16:07:420303デフォルトの名無しさん
2005/05/10(火) 17:41:43>コンストラクタ
派生クラスから基底クラスのコンストラクタにはアクセスできるわけだし
継承されないっていうのは違うのでは?外から呼ぶ方法がないだけで。
そもそも関数が継承されるってどういう意味なんでしょう?
この辺は可視性やアクセス権限の問題な気がします。
0304デフォルトの名無しさん
2005/05/10(火) 21:17:02それを言うならoperator=も呼べる。
0305303
2005/05/10(火) 21:45:34はい、呼べますよ。それが何か?
>>301が言っているように、オーバーロード解決のときに
Parent::operator= が考慮されないだけで。
0306デフォルトの名無しさん
2005/05/10(火) 21:46:53そういうのを「継承されない」って言うんだろうが( ゚Д゚)ゴルァ!!
0308デフォルトの名無しさん
2005/05/10(火) 22:07:21どうでもいいが、それだとprivate継承はどうなるんだ?
0309デフォルトの名無しさん
2005/05/10(火) 23:55:18>>301 が正解。
>>295,306 は間違い。
0310デフォルトの名無しさん
2005/05/11(水) 02:26:020311デフォルトの名無しさん
2005/05/11(水) 03:34:140312デフォルトの名無しさん
2005/05/11(水) 09:37:040313デフォルトの名無しさん
2005/05/11(水) 10:16:100314デフォルトの名無しさん
2005/05/11(水) 11:04:01いわゆるひとつのガッ
0315デフォルトの名無しさん
2005/05/11(水) 14:54:47「継承されない」と書いているC++本多いね。糞、今まで騙されて
いたのか。
0316デフォルトの名無しさん
2005/05/11(水) 14:56:470317デフォルトの名無しさん
2005/05/12(木) 00:35:58friend属性は「継承されない」で正しい。
0318デフォルトの名無しさん
2005/05/12(木) 04:20:15std 名前空間とグローバルの両方にあるんだけど、
これって規格的にはOKなの?
(VC .NET 2003)
0319デフォルトの名無しさん
2005/05/12(木) 10:44:000320デフォルトの名無しさん
2005/05/13(金) 01:14:190321デフォルトの名無しさん
2005/05/13(金) 01:45:05渡しなんかは、明に継承なんてほとんど使ったこと無いです。
単純に、外に見えるようにpublic、外に出さないようにprivate、
ぐらいの感覚でしか使ってません。protectedの使う場面は無し。
まあ何と言いますか、変数管理のしやすさ程度に使ってるって感じです。
それでもCよりC++のほうが、classを使えたり、機能的にCより上なので、
C++のほうがいいかな、とは思ってます。
(というか、C++使うのは必然的なんですけどね。)。
0322デフォルトの名無しさん
2005/05/13(金) 01:57:14継承もそれなりに使っている。
話がややこしくなるからMFCは置いておくとして、ログファイルや設定ファイルなんかは仕様が似通うので
基本クラスを作っておいてそれを派生して使うことがしばしば。
この場合、コンストラクタをprotectedにして派生クラスでしか使えないようにしている。
後は、例えば読み込み関数は仮想化してフォーマットの違いに対応するくらいかな。
0324デフォルトの名無しさん
2005/05/13(金) 07:01:50画像を読み込む関数なんですが、例外を返すようにすると
try {
loadTexture("a.jpg");
loadTexture("b.jpg");
loadTexture("c.jpg");
loadTexture("d.jpg");
catch (hoge) {}
と複数の画像を一気に読むときに便利なのですが、
try {
loadTexture("a.jpg");
}
catch (hoge) {
try {
loadTextuer("hoge/a.jpg");
}
}
なように、最初に指定したファイルが読み込めなかった場合に違うところから
探すようにするときに不便になってしまいます。
何かいい方法はありませんでしょうか?
0325デフォルトの名無しさん
2005/05/13(金) 07:21:42ちょっと考えてこんなん出ました。
loadTexture_fuzzy(name)
{
paths_t paths = {"hoge/"}
paths_t::iterator i = paths.begin();
path = "";
for(;;)
{
try
{
loadTexture(path+name);
return;
}
catch(hoge)
{
if(i==paths.end()) { throw; }
else { path = *i; ++i; continue; }
}
}
}
try {
loadTexture_fuzzy("a.jpg");
loadTexture_fuzzy("b.jpg");
loadTexture_fuzzy("c.jpg");
loadTexture_fuzzy("d.jpg");
catch (hoge) {
0326デフォルトの名無しさん
2005/05/13(金) 11:57:36それ、いいすね。良い事聞きました。
そういう使い方っていいなーって思いました。
私もやってみようっと。ありがとございました。
0327デフォルトの名無しさん
2005/05/13(金) 13:59:10基底クラスからそれを禁止する方法ってないものでしょうか。
C言語スレに書き込んでしまった…。
0328デフォルトの名無しさん
2005/05/13(金) 14:22:09sealedがC++にあればなあ・・・・・
デストラクタをprotectedにするとかは?
0329デフォルトの名無しさん
2005/05/13(金) 14:35:24コンストラクタをprivateにするとか(そうするってーと基底クラスの生成方法が
限定されてしまうし)、デストラクタをvirtualにしない事で、相手が気づいて
くれるのを期待するとか、その程度しか思いつかない。
0330デフォルトの名無しさん
2005/05/13(金) 14:41:460331デフォルトの名無しさん
2005/05/13(金) 14:46:34protected なデストラクタは継承を禁止するテクニックではなく
継承した際に、基底クラスからの delete を防ぐテクニック。
あと、>>327 は virtual 継承の話をしていると思うのだが。
0332デフォルトの名無しさん
2005/05/13(金) 14:59:34ないのではないかと思う。
0333327
2005/05/13(金) 15:31:24既にやられちゃってる部分は、担当を蹴り飛ばしてきます。
いや、自分が悪いのか。
0334デフォルトの名無しさん
2005/05/13(金) 15:47:07それに実行速度が落ちるしなあ・・・・
0335デフォルトの名無しさん
2005/05/13(金) 19:58:10http://article.gmane.org/gmane.comp.lib.boost.devel/101260
0336デフォルトの名無しさん
2005/05/13(金) 22:42:31nonderivable_baseを非仮想基本クラスにすると通っちゃうのはなぜだろう。
つか仮想基本クラスだとBをエラーにできる理由がわからんorz
0337デフォルトの名無しさん
2005/05/13(金) 22:43:19これか。
0338デフォルトの名無しさん
2005/05/13(金) 22:51:31コピー不可じゃなくて継承不可の話してるんだよ?
0339デフォルトの名無しさん
2005/05/13(金) 23:00:30しばらく書き込み控えよう・・・・脳細胞が破壊された模様。
0341デフォルトの名無しさん
2005/05/14(土) 01:41:25class A;
class B;
を協調させて使うクラスCを作りました。
class C {
private:
A &a;
B &b;
C( A &a_, B &b_ ) : a( a_ ), b( b_ ) {}
...
};
質問1
クラスのメンバに参照持たせて不都合があるでしょうか?ポインタ置いたほうがいいですか?
質問2
上記のようにしたのは、aやbの動作をいじるためにそれぞれのメソッドを呼びたいからです。
class Cは、
class C {
private:
A a;
B b;
public:
A& getA( void ) { return a; }
B& getB( void ) { return b; }
};
publicに晒すのは良くないらしいので、これでも良いのですがどのようにしたらいいと思われますか?
0342デフォルトの名無しさん
2005/05/14(土) 01:54:55それは包含(composition)という手法で、has-a関係を表すのによく使われる。
ポインタにするか参照にするかは、実行途中で包含しているクラスの実体を
切り替えたいかどうかで決めればよい。どちらにしても仮想関数はちゃんと動く。
それから、実体の参照を返すくらいだったら、包含にせず、外で実体を持った
方が良い。あくまでもprivateで外に見せない事を前提にメンバにしているのだ
から、外から操作できたら意味的に本末転倒だ。
0343デフォルトの名無しさん
2005/05/14(土) 01:57:08>質問1
問題ない。
>質問2
メンバ変数をpublicにしない方が良いと言われるのは、
公開した場合、包含クラス(この場合C)が被包含クラス(A, B)を使って
実装されているという事実が、包含クラスのインタフェースに表れるのを嫌っての事。
従って、この点では、メンバ変数の参照を返すメンバ関数を公開するのは、
メンバをpublicに置くのと大して変わらない。
0344デフォルトの名無しさん
2005/05/14(土) 02:13:13ttp://www.tietew.jp/cppll/archive/10659
0345デフォルトの名無しさん
2005/05/14(土) 02:31:35この場合、Cにaやbを持たせず、
C::func( A &a, B &b )として外から引数で与えようかとも悩みました。
いちいち引数に指定するのが面倒なのでメンバに置いたのですが…
C++は悩みが尽きません。
0346デフォルトの名無しさん
2005/05/14(土) 02:42:24そういう事なら、包含だとは思わず、publicメンバで持ってしまえばよい。
ま、しかし、そういう設計をする事はあまりないので、他人が貴方の作った
クラスを見てどう思うか、それを意識しないで済むのなら自由なんですが。
クラスCに関連するクラスAとクラスBのローカルな実体を持って、なおかつ
それを外部に公開するとなると、CがA及びBに意味的に縛られている限り、
外部からAやBを自由にされてしまうと、その都度Cのコンディションを把握
しなければならないようになり、余計な心配が増えるだけ。
かと言って継承を使うとなると、AとBからの多重継承になり、これまた
頭が痛いですね。
0347デフォルトの名無しさん
2005/05/14(土) 02:44:47外部からの操作を徹底的に制限する方向に行きます。
0348デフォルトの名無しさん
2005/05/14(土) 08:40:28const参照を返すようには作るなぁ。
これなら外部から変更される心配が大幅に減る。
0349デフォルトの名無しさん
2005/05/14(土) 23:32:05クラスを協調させるクラスは必要だと思うので、すっきりした方法があると思うのですが…
AやBの設計が間違っているのかなぁ。手間はかかっても>>347さんの設計がいいのかなぁ。
0350デフォルトの名無しさん
2005/05/15(日) 01:57:24CがAやBの内容を見て動くのならば、AとBでCをfriendとして宣言したら
どうだろうか?これもあまり勧められた方法ではないけど、一応役目は
果たすんじゃない?
0351デフォルトの名無しさん
2005/05/15(日) 02:02:47サブクラスがいたずらに増えるのを防止して、CからAやBを自由に切り替えて使える
ように出来る。
0352デフォルトの名無しさん
2005/05/15(日) 02:11:29想像であーだこーだ言っててもしょうがない。
0353デフォルトの名無しさん
2005/05/15(日) 02:16:27まあな。C++はいくら自由度が高いと言っても、ある程度ルールに乗っ取った
クラス階層にしないと、Cのポインタの使いすぎと同じで可読性が著しく下がる。
当然メンテナンス性も大幅に低下する。
継承を使うべきでない所に無理に継承を使ったり、カプセル化の大原則を
無視して意味不明なプログラムを作る香具師大杉。
0354デフォルトの名無しさん
2005/05/15(日) 13:23:430355デフォルトの名無しさん
2005/05/15(日) 13:50:11現状、 cstdio を使って実装されていることがほとんどなので、
cstdio に比べて重い実装が多いのは本当。
使わないほうがいいかどうかは、使う側で判断するべし。
0356デフォルトの名無しさん
2005/05/15(日) 14:42:17そうでないならご自由に。
0357デフォルトの名無しさん
2005/05/15(日) 18:27:37できるのでしょうか?
0358デフォルトの名無しさん
2005/05/15(日) 18:30:47規格では明確になっていないと思うが、現実問題としてできるし、
多用されている。ただし delete した後はメンバに触らないように
注意ね(即 return するのがお奨め)。
0359デフォルトの名無しさん
2005/05/15(日) 18:35:08typedef struct {
int x, y;
}POS;
const int ARRAY = 5;
std::map< string, POS[ARRAY] > BBBmap;
POS a[ARRAY];
// BBBmap["HOGE"] = a;// 配列operator= 未定義なので×
// BBBmap["HOGE"][2] = a[2];// intからPOS[5]に変換できません
て出るので
std::map< string, POS > BBBmap[ARRAY];
を使ってるんですが、これは前者のmapをスムーズに使いたきゃ
配列operator 定義しろやゴルァってことでしょうか。
0360デフォルトの名無しさん
2005/05/15(日) 18:49:41std::map< string, POS[ARRAY] > BBBmap;
を、
std::map< std::string, std::vector<POS> > BBBmap;
にしろ。そしてSTLスレに行け。
0362357
2005/05/15(日) 18:59:18delete this;
でいいのかな?
0363359
2005/05/15(日) 19:08:23以後気をつけます。
0364デフォルトの名無しさん
2005/05/15(日) 19:55:24§23.1.3
The type of objects stored in these components must meet the requirements of CopyConstructible types (lib.copyconstructible),
and the additional requirements of Assignable types.
0365デフォルトの名無しさん
2005/05/15(日) 20:36:460366デフォルトの名無しさん
2005/05/15(日) 22:53:14ok
0367341
2005/05/16(月) 00:19:48class Driver {
public:
IMP1_ &imp1;
IMP2_ &imp2;
Driver ( IMP1_ &imp1_, IMP2_ &imp2_ );
void shori() {
...
imp1.shori( imp2 ); //処理を委譲
...
}
};
template< typename POLICY1, typename POLICY2 >
class IMP1 {
private:
MEM1 mem1;
MEM2 mem2;
public:
POLICY1 t1;
POLICY2 t2;
template< typename X > void shori( X &x ) {
x, mem1, mem2, t1, t2 を使って処理;
}
};
(続く)
0368341
2005/05/16(月) 00:20:38int main( int argc, char *argv[] ) {
IMP1< POLICY1, POLICY2 > imp1;
IMP2 imp2;
Driver< IMP2, IMP1< POLICY1, POLICY2 > > driver( imp2, imp1 );
...
driver.shori();
...
}
IMP2, POLICY1, POLICY2 は 取り替え可能としたい。
IMP1を見て頂いたらわかると思いますが、publicにPOLICY1,POLICY2をおいています。
たまに、imp1.t1.hoge(), imp1.t2.hoge()等とメソッドを呼んで動きを調整したいのです。この場合、IMP1に細かくアクセサを作っていくとIMP1がPOLICYの数だけできて嫌な感じになると予想して躊躇しているところです。
何かいい方法はないものでしょうか?
(続く)
0369341
2005/05/16(月) 00:25:16>>352 さんの仰る通り、問題を簡単にしようと情報を切りすぎていました。
申し訳ございません。
0370デフォルトの名無しさん
2005/05/16(月) 00:26:31Stateパターンとか。
0371デフォルトの名無しさん
2005/05/16(月) 00:30:55もしかして template 覚えたてだったりするか?
速度に対する要求がシビアなプログラムでもなければ、
template 使いすぎの悪い例に見える。
0372341
2005/05/16(月) 00:36:080374デフォルトの名無しさん
2005/05/16(月) 00:54:28じゃぁ template の使いすぎに注意して考え直してみるべきじゃないかな?
もうすこしすっきりすると思うぞ。
0375デフォルトの名無しさん
2005/05/16(月) 00:55:530376デフォルトの名無しさん
2005/05/16(月) 01:16:10つ [Modern C++ Design]
普通にStrategy/Stateパターン使ってもいいけどね。
0377デフォルトの名無しさん
2005/05/16(月) 01:50:370378デフォルトの名無しさん
2005/05/17(火) 07:53:501=32,2=24,3=4 になってしまうのですがこれはC++Builderのバグでしょうか?
gccだと1=28,2=24,3=4になります。
#include <stdio.h>
typedef struct {
signed long long a, b, c;
unsigned long d;
} test1;
typedef struct {
signed long long a, b, c;
} test2;
typedef struct {
unsigned long d;
} test3;
int main(void){
printf("1=%d,", sizeof(test1));
printf("2=%d,", sizeof(test2));
printf("3=%d\n", sizeof(test3));
return 0;
}
0379デフォルトの名無しさん
2005/05/17(火) 07:58:480380デフォルトの名無しさん
2005/05/17(火) 08:19:310382デフォルトの名無しさん
2005/05/17(火) 11:44:54-a4スイッチつければbccでもtest1は28バイトになる。(デフォルトは-a8で8バイト境界になってる)
0383デフォルトの名無しさん
2005/05/18(水) 12:01:260384デフォルトの名無しさん
2005/05/18(水) 12:46:31専用スレ立てようか?
0385デフォルトの名無しさん
2005/05/18(水) 17:32:17どの間違い?柴田先生には相当傾倒している俺としては気になる。
0386デフォルトの名無しさん
2005/05/18(水) 19:55:43> デストラクタを明示的に呼び出すことはできますか。
>
> できません。
かな。
0387デフォルトの名無しさん
2005/05/18(水) 20:13:05サンクス。
あーそりゃ完全な間違いだわ。
0388デフォルトの名無しさん
2005/05/20(金) 00:06:00class testClass{
static testProc proc;
public:
testClass(testProc ProcAddress){
proc = ProcAddress;
}
static void CallProc(){
proc(0);
}
};
ってやるとprivate: static void (*testProc)(int)が未解決ですって出るんだけど、
どうすればいいかな
0389デフォルトの名無しさん
2005/05/20(金) 00:16:420390デフォルトの名無しさん
2005/05/20(金) 00:17:29適当なcppファイル中に
testProc testClass::proc;
0391デフォルトの名無しさん
2005/05/20(金) 00:27:19感じのことをcppll(だと思う)で見つけたけど、それと同じこと?
0392デフォルトの名無しさん
2005/05/20(金) 00:40:01>>390が答えを書いているが、要するにクラスのstaticメンバはクラス外で
定義しないといけんのよ。理由はわからんが、多分クラスのインスタンス
がいくら増えても、あるいはインスタンスが一つもなくても、staticメンバは
一つきり実体があるためかも。
0393388
2005/05/20(金) 00:41:360394デフォルトの名無しさん
2005/05/20(金) 01:44:12アドレス比較するぐらいしか思いつかんのだけど、インスタンスの実体は
(コンパイラ作る人からすれば楽そうだし)スタック(もしくはそれに類するも
の)に置いたりしてるんじゃないかな。
static変数やstaticなメンバ、グローバル変数等はひとくくりに
扱える気がする(実体ひとつだと領域が確定しているし)
・・・にしても別にclass宣言内で初期設定できるような規定?でも良かったよ
うな気もする。でもそうなってないなら従うしかないか
微妙に思えるのはローカル関数内(mainもそう分類されるのか知らん)のstatic
なクラスのインスタンスやグローバルなクラスのインスタンス。
まあでもこれだって、サイズは(コンパイラに)わかってるわけだし、初期化前
にインスタンスの領域を確保しないだけ・・・・と推測してみる。
(一回だけ構築するように関数埋め込むのかもしれん。この方がデストラクタ
呼ぶ時も分かりやすそうだ。インスタンス用に1つレジスタ裂けたらこっちが良さげ鴨)
・・・長々と空想ごめん。もう寝る。
0395デフォルトの名無しさん
2005/05/20(金) 02:07:54class内で初期設定できるのはstatic const intだけだね。
しかしその理由を[C++の設計と進化]の中で探したが、見つけられなかった。
P367にはどこかに置くとしか書いてないし。探し方が足りないかもしれない。
俺も眠いから寝る。 (つ∀-)オヤスミー
0396デフォルトの名無しさん
2005/05/20(金) 11:25:41class A{
public:
A(int n);
A(int n1,int n2,int n3);
A(char *s);
};
class B : public A{
public:
B(int n) : A(n) { }
B(int n1,int n2,int n3) : A(n1,n2,n3) { }
B(char *s) : A(s) { }
};
やっぱりこういうふうに、すべてのコンストラクタについて
定義し直さなければなりませんか?
(すべてのコンストラクタをそのまま使えるようにしたい場合)
コンストラクタの数が多いとめんどくさいので、
宣言を省略する(もしくはより短く表記する)方法があれば嬉しいのですが…。
0397デフォルトの名無しさん
2005/05/20(金) 11:29:57class B : public A{
public:
B(A const& base) : A(base) {}
望むものとは違うかもな。
0398デフォルトの名無しさん
2005/05/20(金) 11:37:57>B(char *s)
(;`Д´)・・・・・
0399デフォルトの名無しさん
2005/05/20(金) 11:41:57なるほど。暗黙の変換がされるわけですね。
引数の数が1以外だと使えませんが…。
でも引数の数が1つのことは多いので役に立ちそうです。
ありがとうございます。
>>398
例として挙げただけです。
曖昧さが生じることはあんまりないと思いますが。
0400デフォルトの名無しさん
2005/05/20(金) 12:26:16区別しないバージョンは標準には無いんでしょうか?
自分でちょちょいと書くしかないのかな(´・ω・`)
0401デフォルトの名無しさん
2005/05/20(金) 12:44:38標準には無いよ。
でも、いろんな人が書いてるからどっかから拾ってこれるかもしれない。
ん? boost::algorithm になんかありそうだな。
0402デフォルトの名無しさん
2005/05/20(金) 13:09:28その中にあるクラスの宣言は公開したいけど、中身は公開したくないってとき
どうすればいいかな。
クラスの中に実際のしょりを書かないでソースファイル内への関数のポインタで初期化しようかと考えたけど
それだとソースファイル内の関数群のtypedef宣言しなきゃいけないし、構造体でいい事になりますよね
それにクラスで宣言すると、VCだと(他のソフトは使ってないからわからない)ナビが出てわかりやすいと思うんですよ。
もっとスマートな方法ってありますか
0403デフォルトの名無しさん
2005/05/20(金) 13:12:01公開しても良い部分のクラス内で↑のを使う。このクラスを公開する。
そうすれば公開したくない部分は、パブリックなメンバ関数しか見えない。
0404デフォルトの名無しさん
2005/05/20(金) 14:09:43つEffective STL
0405デフォルトの名無しさん
2005/05/20(金) 14:10:31よくわからんがPImplとかそういう話?
この話題もFAQだよなー。
0406デフォルトの名無しさん
2005/05/20(金) 15:29:56//----公開するヘッダ----
class A{
public:
Proc(int x){
B::bProc(x);
}
};
//----公開しないヘッダ----
class B{
public:
bProc(int x){
}
};
//----プラグイン側ソース----
A a = new A();
a.Proc(0);
こういうこと?
B::bProc(x);この文でコンパイルエラーになりそうだけど
0407デフォルトの名無しさん
2005/05/20(金) 15:53:23おまいの頭には「公開しないソース」という概念は存在しないのか。
0408デフォルトの名無しさん
2005/05/20(金) 17:13:01こうやるんだよ(←高圧的な物言い)
公開するヘッダ
class A {
public:
static A* CreateInstance();
virtual void Proc(int x);
};
公開しないソース
class AImpl : public A {
virtual void Proc(int x) { ... ;};
};
A* A::CreateInstance() {
return new AImpl;
};
プラグイン側ソース
A* a = A::CreateInstance();
a->Proc(0);
0409デフォルトの名無しさん
2005/05/20(金) 17:13:390410デフォルトの名無しさん
2005/05/20(金) 17:14:49ABIがらみとかでハマりたいならとめんが。
0411デフォルトの名無しさん
2005/05/20(金) 17:35:09名前空間の名前はどのようにつけていますか?
NameSpace? nameSpace?
0412デフォルトの名無しさん
2005/05/20(金) 18:28:13ない。
0413デフォルトの名無しさん
2005/05/20(金) 19:12:12namespace jp{ namespace co{ namespace company{ namespace product{ namespace module{
} } } } }
にでもしやがれ
0414デフォルトの名無しさん
2005/05/20(金) 20:48:14BorlandでC++ Compiler 5.5というのをダウンロードしたんですがこれだけでは使えないんですか?
まだ初心者なものでくだらない質問ですいません。
0415デフォルトの名無しさん
2005/05/20(金) 21:13:09・店行ってVC++.net 2003 Standardを買ってきてインストール
・Dev-C++あたりを日本語の解説見ながらインストール&日本語化
・BCCを解説ページ読みながら自力で設定
のどれが一番簡単なんだろうな?
0416デフォルトの名無しさん
2005/05/20(金) 22:44:23・店行ってVC++.net 2003 Standardを買ってきてインストール
これが一番簡単だと思う…。
インストールして、プロジェクト作って、ソース書いて、ワンクリックでビルド。
俺、もうVC無しじゃ生きていけない。
0417デフォルトの名無しさん
2005/05/20(金) 23:02:000418デフォルトの名無しさん
2005/05/20(金) 23:34:51Borland C++Builder 6 Personalの方が安い?
0419デフォルトの名無しさん
2005/05/20(金) 23:59:39Aより先にBを宣言しないとダメっぽいんだけど
関数のプロトタイプ宣言みたいに宣言だけ最初にまとめて記述ってできないのかな
0420デフォルトの名無しさん
2005/05/21(土) 00:00:170421デフォルトの名無しさん
2005/05/21(土) 00:03:44それはやってみたんだけど認識できない型でコンパイルエラーなんだよね
0422デフォルトの名無しさん
2005/05/21(土) 00:05:260423デフォルトの名無しさん
2005/05/21(土) 00:14:44単独で使用するときに、必要な知識とか設定。
http://ykr414.com/dos/
http://www.birdport.jp/CPre/free/
よくわからんのなら、
http://www.vector.co.jp/vpack/filearea/win/prog/c/index.html
の
CPad for Borland C++Compiler 2.31
BCC Developer 1.2.21
setbcc 1.5
のどれかを使えばなんとかなるんでない?
あと、BCCはこっち。
タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/
0424デフォルトの名無しさん
2005/05/21(土) 02:17:090425デフォルトの名無しさん
2005/05/21(土) 02:22:05std::endl は '\n' と std::flush をいっぺんに突っ込む。
エラーの起こる可能性の有る処理の前、
時間のかかる処理の前に出すメッセージ、
など、画面への表示を確実に完了させたいときに使う。
0426デフォルトの名無しさん
2005/05/21(土) 04:32:14確かめる方法ってありますか?
あるいはdelete[]じゃないとやばいかどうかとか知りたいんです。
もしくはdelete及びdelete[]できない型を渡せなくするとか。
0427デフォルトの名無しさん
2005/05/21(土) 04:34:31できん。
その分、newの際にできるだけ使用するヒープ量を減らす事にしたのだから。
0428デフォルトの名無しさん
2005/05/21(土) 05:03:410429デフォルトの名無しさん
2005/05/21(土) 05:06:19それはdeleteした後にポインタ変数に0を入れておくなどの用心しかない。
できるだけクラスにして、デストラクタに始末させると綺麗に書けるんだけどね。
そうしたくない場合が多いからね。
0430426
2005/05/21(土) 07:41:52具体的にはクラスのポインタをハッシュテーブル化することを想定した
テンプレートクラスで、要素を削除したときインスタンスも一緒に削除
したいんですが、仮に以下のようにstd::mapで実装したとして
template< typename keyT, class valueT >
class HashContainer {
typedef std::map< const keyT, valueT * const > container_t;
container_t *m_container;
〜中略〜
public:
void Delete(const keyT& key) {
container_t::iterator result = m_container->find(key);
if (result != m_container->end()) {
delete (*result).second; //←■問題の箇所■
m_container->erase(result);
〜以下略〜
HashContainer< int, int > などとされて int a = 10; の &a なんかを
渡されちゃうと、問題の箇所でぶっとんじゃうのをなんとかしたいんです。
問題のある型でインスタンシエイトできなくするか、問題が無い場合だけ
deleteするか、何か良い方法はないでしょうか?
0431デフォルトの名無しさん
2005/05/21(土) 08:31:11変数のアドレスを渡すなとコメントに書くしかない。
ただstd::auto_ptrやboost::shared_ptrにすればnew使えという意思がソースからも読み取れるようにはなると思う。
0432デフォルトの名無しさん
2005/05/21(土) 12:51:14ポインタを渡しただけなのに、その指している先を削除してしまうコンテナは実装がまずいといえる。
deleteしない、deleteする、delete[]する、の3種類の動作が分けられるスマートポインタを提供し、
さらにそれを格納するコンテナを提供するのが筋。
0433デフォルトの名無しさん
2005/05/21(土) 12:52:11○設計がまずい
俺は何を言ってるんだ・・・。
0434デフォルトの名無しさん
2005/05/21(土) 13:16:29すまぽ
ぬるぽ
0435426
2005/05/21(土) 15:04:22それを継承したクラスしか渡せないとかダメかな?
class IDeletable {};
として
std::map< const keyT, IDeletable * const > m_container;
みたいな
これでもスタックに確保された配列とか渡されたらダメか…
>>432氏の方法を考えてみます
0436デフォルトの名無しさん
2005/05/21(土) 15:14:190437デフォルトの名無しさん
2005/05/21(土) 15:16:17何も問題ないと思うけど?
0438デフォルトの名無しさん
2005/05/21(土) 15:17:39shared_ptrとかもそうしてはず。
GC使えばいいのに...
0439デフォルトの名無しさん
2005/05/21(土) 21:32:25デストラクタからなにか関数を呼ぶということだと思うけど、
自身の仮想関数を呼ぶと愉快な動作をしてくれる。
0440デフォルトの名無しさん
2005/05/21(土) 21:49:49デストラクタというんですね。ありがとう
自分の無知さがはずかしい
0441デフォルトの名無しさん
2005/05/21(土) 21:51:040442デフォルトの名無しさん
2005/05/21(土) 22:57:10どなたかお願いします。
0443デフォルトの名無しさん
2005/05/21(土) 23:00:550444デフォルトの名無しさん
2005/05/21(土) 23:52:400445デフォルトの名無しさん
2005/05/22(日) 01:44:06やっても大丈夫なのかな・・・。
あるいは言語仕様的には OK でもちゃんとコンパイルできない処理系があるとか・・・。
とりあえず g++ ではうまくいったわけだが。
---以下サンプルコード---
#include <iostream>
struct Giko {
virtual void gorua() { std::cout << "ゴルア" << std::endl; }
};
struct Hoge {
Giko* createGiko() {
struct FusaGoko : public Giko {
virtual void gorua() { std::cout << "フサフサ" << std::endl; }
};
return new FusaGoko();
}
};
int main() {
Giko* giko = Hoge().createGiko();
giko->gorua();
delete giko;
return 0;
}
0446デフォルトの名無しさん
2005/05/22(日) 01:44:54OK
0447445
2005/05/22(日) 01:45:400449デフォルトの名無しさん
2005/05/22(日) 01:50:140450デフォルトの名無しさん
2005/05/22(日) 01:53:27★初心者にVisual C++を教えるスレ★ Part19
http://pc8.2ch.net/test/read.cgi/tech/1116209988/
0451デフォルトの名無しさん
2005/05/22(日) 18:27:55この中で、調べてもよくわからないところがありましたので質問させていただきます。
C言語(stdio.h)のfscanfとかfseekに相当する関数は、C++(fstream.h)ではどれにそうとするのでしょうか?
また、C言語とC++との違い・対応がわかりやすいサイト・書籍がありましたらご紹介願います。
// テンプレ嫁といわれてしまいそうですが_| ̄|○
わかりにくい文章かもしれませんが、よろしくお願いします。
0452デフォルトの名無しさん
2005/05/22(日) 18:35:07fscanf は各型の operator >> が対応していると言えなくも無いかな。
fseek は読み込みなら seekg だろうな。
無理に fstream を使わなければ、そのまま動くはずだけど。
あと、 fstream.h は fstream にしとけよ。
最後に、テンプレ嫁。
0453デフォルトの名無しさん
2005/05/22(日) 18:37:37ttp://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/main.html
0454デフォルトの名無しさん
2005/05/22(日) 18:46:20レス、サンクスです。
これで、がんばれそうです。
0455デフォルトの名無しさん
2005/05/22(日) 18:48:25現在のC++ではfstream.hは存在しないから将来も何もない。
どうしてもわからなければsed::getline()でstd::stringに読み込んでから<cstdio>のstd::sscanfを使う方法もあるさ。
0456デフォルトの名無しさん
2005/05/23(月) 10:27:52やはりここは、
C++(cstdio)のstd::fscanf()とかstd::fseek()が相当します。
と答えたくなるな。
0457デフォルトの名無しさん
2005/05/23(月) 10:59:19static_castですか?それともreinterpret_castですか?
ポインタの型は論理変換でしたっけ?
0458デフォルトの名無しさん
2005/05/23(月) 11:00:48やりたいことを具体的に示せ。
0459デフォルトの名無しさん
2005/05/23(月) 11:12:32そのオーバーロード関数内で
MyClass *p;
p = ????_cast<MyClass*>( new char[chunk] );
の場合は、どのキャストがベストですか?
0460デフォルトの名無しさん
2005/05/23(月) 12:14:490461デフォルトの名無しさん
2005/05/23(月) 12:24:25Effective C++ P.63には
Airplane *newBlock = static_cast<Airplane*>(::operator new(BLOCK_SIZE * sizeof(Airplane)) );
とあるんですが、このケースは違う?
0462デフォルトの名無しさん
2005/05/23(月) 12:38:08void *からT *へはstatic_castが使える。
char *からT *へは使えない。
0463デフォルトの名無しさん
2005/05/23(月) 13:14:12なるへそ。
ということは
new ???
こういう書式だと、???の型のポインタが返されるけど
operator new(size_t)
この書式だと、コンパイラは型がわからないからvoid*型が
返されるってことかな?
0464デフォルトの名無しさん
2005/05/23(月) 14:22:00new ClassA(a, b, new ClassB() );
といったように別のクラスを引数としてとる事がありますが
これはC++だとdeleteされないからメモリリークを起こしますよね
0465デフォルトの名無しさん
2005/05/23(月) 14:35:480466デフォルトの名無しさん
2005/05/23(月) 14:59:53Brush側でColorがこの後利用するかどうかって判断つかない場合もあると思うんですよ
0467デフォルトの名無しさん
2005/05/23(月) 15:02:51Colorみたいなものは値渡しだからどうでもいいとして、
初期化がどうとかいう話ではなく、「GCがないから
いらなくなったら自分で delete しないとメモリリークを起こしますよね」
っていう話のような気がする。
0468デフォルトの名無しさん
2005/05/23(月) 15:05:43shared_ptrでも使えば?
0469デフォルトの名無しさん
2005/05/23(月) 16:07:470470デフォルトの名無しさん
2005/05/23(月) 16:36:100471デフォルトの名無しさん
2005/05/23(月) 17:03:51interpreter = インタプリタから。
0472デフォルトの名無しさん
2005/05/23(月) 17:04:19interpreter = インタプリタから。
0473デフォルトの名無しさん
2005/05/23(月) 17:21:54引数が構造体の場合は、デフォルト値はどのように記述すれば良いのですか?
0474デフォルトの名無しさん
2005/05/23(月) 17:46:04構造体にコンストラクタを設けて、デフォルト引数を一時オブジェクト作成にすればよい。
struct A
{
int x;
A(int x) : x(x) {}
};
void f(A a = A(0));
0475デフォルトの名無しさん
2005/05/23(月) 17:49:13ありがとうございました
0476デフォルトの名無しさん
2005/05/23(月) 20:12:57class B : public A { };
//////////
B* x = new B();
A* y = x; // ← これは大丈夫なのに
B** z = &x;
A** w = z; // ← これは駄目なのはどうしてなのでしょうか?
0477デフォルトの名無しさん
2005/05/23(月) 20:24:32どうして?と聞かれても、仕様だ!と答えるしかないな。
その変換を認めると、
A **w = z;
*w = new A;
// ここで*zを使う
のようなコードで、Bのつもりでアクセスした実体が実はAだった、ということがおきる。
つまり、その変換は安全じゃないから、禁止されている。
0478477
2005/05/23(月) 20:27:08ね。
0479デフォルトの名無しさん
2005/05/24(火) 01:56:25禿・・・
0480デフォルトの名無しさん
2005/05/24(火) 02:02:53Bjarne Stroustrup
これは正確にはなんと発音すればいいんだ?
俺はうまく発音できなくて禿げ禿げでごまかしてるんだが。
0481デフォルトの名無しさん
2005/05/24(火) 02:18:32情報処理用語の読み方を確認するスレ
http://pc8.2ch.net/test/read.cgi/tech/1056173956/l50
0482デフォルトの名無しさん
2005/05/24(火) 02:32:170483デフォルトの名無しさん
2005/05/24(火) 02:32:39つか情報処理用語なのかこいつの名前は。
0484デフォルトの名無しさん
2005/05/24(火) 02:52:41#define final_class class
final_class foo {
};
みたいな事するのって気色悪いですか?
用語はまあsealed_classとかでもOKなんですが
デストラクタをvirtualにしないだけじゃ設計ミスみたいだし…
0485デフォルトの名無しさん
2005/05/24(火) 02:59:01マクロ使うぐらいならコメント一言入れとけば?
0486デフォルトの名無しさん
2005/05/24(火) 04:39:39class foo { // 継承したら肛門童貞奪うぞ
};
((( ;゚Д゚)))ガクガクブルブル
0487デフォルトの名無しさん
2005/05/24(火) 09:46:170488デフォルトの名無しさん
2005/05/24(火) 09:50:01肛門が童貞じゃないお兄さんなら継承しても平気なわけだ。
0489肛門童貞じゃない
2005/05/24(火) 10:32:320490デフォルトの名無しさん
2005/05/24(火) 10:36:130491デフォルトの名無しさん
2005/05/24(火) 10:44:050492デフォルトの名無しさん
2005/05/24(火) 11:50:14>>490
ビヤーンネ・スカトローストロップが正しい。
0493デフォルトの名無しさん
2005/05/24(火) 13:10:200494デフォルトの名無しさん
2005/05/24(火) 14:56:200495デフォルトの名無しさん
2005/05/24(火) 16:02:09ファイル名が指定されていないときは標準出力に、
それぞれ出力したい場合:
void f(const string &filename="") {
ostream &fout = (filename != "") ? *(new ofstream(filename.c_str())) : cout;
fout << "hello, world" << endl;
if (&fout != &cout) delete(&fout);
}
というように書けばいいんでしょうか?
0496デフォルトの名無しさん
2005/05/24(火) 16:11:11そんな感じでいいと思うよ。
俺だったらconst char *版もオーバーロードするけど。
0497デフォルトの名無しさん
2005/05/24(火) 16:29:22ofstream ofs( filename.c_str() );
f( ofs );
]
void f() {
f( cout );
}
void f(ostream& os) {
os << "hello" << endl;
}
0498デフォルトの名無しさん
2005/05/24(火) 16:32:59それだったらデフォルト引数にcoutを書けばいいだけじゃねえかよ。
0499デフォルトの名無しさん
2005/05/24(火) 16:36:110500デフォルトの名無しさん
2005/05/24(火) 16:52:53俺ならおとなしくこう書くかな。
void f(const string &filename) {
if(filename.empty()){
ff(cout);
}
else{
ofstream ofs(filename.c_str());
ff(ofs);
}
}
void ff(ostream &os)
{
os << "hello, world" << endl;
}
0501デフォルトの名無しさん
2005/05/24(火) 17:08:21static inline void f(const char * filename = NULL) {filename ? ff(ofstream(filename)) : ff();}
0502デフォルトの名無しさん
2005/05/24(火) 17:22:10inline void f(const char *filename) {filename ? ff(std::ofstream(filename)) : ff();}
inline void f(const std::string& str) {f(str.c_str());}
0503デフォルトの名無しさん
2005/05/25(水) 00:03:33class final {
class foo {};
}
つうのはどうでしょう?
0504デフォルトの名無しさん
2005/05/25(水) 00:21:250505デフォルトの名無しさん
2005/05/25(水) 00:38:120506デフォルトの名無しさん
2005/05/25(水) 00:42:54実装側で適当にやるのは良いと思う(というかそういう言語だと思う)が
公開するインターフェースはオブジェクト指向にして欲しい
0507デフォルトの名無しさん
2005/05/25(水) 01:59:37normal
0508デフォルトの名無しさん
2005/05/25(水) 02:18:48トートロジー
0509デフォルトの名無しさん
2005/05/25(水) 10:01:100510デフォルトの名無しさん
2005/05/25(水) 12:18:54(名・形動)[文]ナリ
(1)いつでもどこにでもあって、めずらしくない・こと(さま)。
「日本に―の鳥」
(2)ほかとくらべて特に変わらない・こと(さま)。
「ごく―の家庭に育つ」「―ならもう卒業している」
(3)特別ではなく、一般的である・こと(さま)。
「―高校」
⇔特殊
(副)
たいてい。一般に。
⇔特殊
「郵便は―三日かかる」
――の体(からだ)でない
病気である。また、妊娠している。
http://dictionary.goo.ne.jp/search.php?MT=%C9%E1%C4%CC&kind=jn
0511デフォルトの名無しさん
2005/05/25(水) 13:11:36オブジェクト指向かどうか(これは設計の問題)とは関係ない。
0512デフォルトの名無しさん
2005/05/25(水) 13:23:56手続きを抽象化するスタイル(要は構造化)のことを
オブジェクト指向と対比して手続き型と言うことがあると思う。
plc++3にはこの意味で出てきた。
0513デフォルトの名無しさん
2005/05/25(水) 13:47:32> C++の関数の中の書き方(セミコロンで区切って命令を順番に書く)を手続き型というのであって
セミコロン云々はそりゃいくらなんでも違うだろ。
代入を順番に書き連ねて、その副作用を利用していくのが手続き型。
> オブジェクト指向かどうか(これは設計の問題)とは関係ない。
これも間違い。多くのオブジェクト指向プログラミングは、これまでのところ
手続き型言語の枠組で提案されてきてる。その理由としては、特に手続き型の
対極にあたる宣言型、そのなかでも関数型の場合は、状態を保持するオブジェ
クトとの相性があまりよろしくない。そもそもオブジェクト指向のサポートの
一切ない言語(たとえばHaskell)を使うのにオブジェクト指向で設計、などあ
り得ない。
0514デフォルトの名無しさん
2005/05/25(水) 14:09:390515デフォルトの名無しさん
2005/05/25(水) 16:33:09C++では区切り子にセミコロンを使っているというだけの話だろ
セミコロン必須だとはだれも思っちゃいない(お前以外は勘違いすらしない)
0516デフォルトの名無しさん
2005/05/25(水) 16:50:23>代入を順番に書き連ねて、その副作用を利用していくのが手続き型。
Lispは手続き型?
0517デフォルトの名無しさん
2005/05/25(水) 18:09:29> セミコロン必須だとはだれも思っちゃいない(お前以外は勘違いすらしない)
勘違いしてるのはお前だろ。511も513も「セミコロン必須」なんて話はしてない。
>>516
> Lispは手続き型?
「Lispが関数型」っていうのは「Cが関数型」っていうのと同じくらい正確。
0518デフォルトの名無しさん
2005/05/25(水) 18:58:15セミコロン必須 = 文と文を区切るためにセミコロンを使うこと
と解釈してくれ
0519デフォルトの名無しさん
2005/05/25(水) 21:54:400520デフォルトの名無しさん
2005/05/25(水) 22:23:01わからなかったので教えてください。
実際のクラスの関数へのポインタをデータの中に埋め込んでおいて
それを使用して関数を呼び出すというのはわかったのですが、
その関数に暗黙に渡されるインスタンスへのポインタの渡し方が
よくわかりませんでした。
多重継承している場合はベースへのポインタと派生クラスの
ポインタでアドレスが異なる場合がありますよね?
その場合は実際に渡すアドレスをどこで変換してるんでしょうか?
0521デフォルトの名無しさん
2005/05/25(水) 22:36:09thisとvtable
0522デフォルトの名無しさん
2005/05/25(水) 22:52:24thisは実際のところ、関数の引数として渡されているだけ(の実装が多い)。
0523デフォルトの名無しさん
2005/05/25(水) 23:00:20ttp://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/
0524デフォルトの名無しさん
2005/05/25(水) 23:21:13>520 に答えようとして途中でわからなくなったんだけど、勉強になった。サンクス。
0526デフォルトの名無しさん
2005/05/25(水) 23:29:48>485
コンストラクタを全部privateにしちまえばいいんでない。
んで、statci A& A::getInstance()とかしておくと
>486
まあ、それで十分な開発体制ならいいんだけど、
現実はマーフィーの法則を超えることがあるわけで
0527デフォルトの名無しさん
2005/05/25(水) 23:34:54回答はすでにされているので、ほんとにあった怖いコード
クラスをmemsetで丸ごと初期化してる
0528デフォルトの名無しさん
2005/05/25(水) 23:46:56そりゃぁ、状態を管理するオブジェクト指向と状態を持たない純関数型言語では
相性悪いだろうに……
0529デフォルトの名無しさん
2005/05/26(木) 05:53:25例えば
printf(”¥x1B[%d;%dH%s”,plin,pcol,str);
での表示はどう直せばよいのでしょうか?
0530デフォルトの名無しさん
2005/05/26(木) 06:04:100531デフォルトの名無しさん
2005/05/26(木) 06:07:310532デフォルトの名無しさん
2005/05/26(木) 07:40:18SetConsoleCursorPosition
0533デフォルトの名無しさん
2005/05/26(木) 11:26:440534デフォルトの名無しさん
2005/05/26(木) 11:35:310535デフォルトの名無しさん
2005/05/26(木) 11:37:210536デフォルトの名無しさん
2005/05/26(木) 11:50:06int (*a)[3] = new int a[3][3] ={
{1,2,3},
{4,5,6},
{7,8,9}
}
これはだめでした
0537デフォルトの名無しさん
2005/05/26(木) 12:40:40デストラクタで処理すりゃいい話だけどそんな細かいニーズのためにクラス作ってらんない。
0538デフォルトの名無しさん
2005/05/26(木) 13:24:02クラスは破棄されないんだけど、エラーが発生してエラー処理、って場合に。
0539デフォルトの名無しさん
2005/05/26(木) 14:04:370540デフォルトの名無しさん
2005/05/26(木) 15:11:280541デフォルトの名無しさん
2005/05/26(木) 15:58:240542デフォルトの名無しさん
2005/05/26(木) 16:22:550543デフォルトの名無しさん
2005/05/26(木) 16:34:03Rubyみたいにファイルオブジェクト作るたびに例外ハンドラ書かされる糞言語見てるとGCが大して幸福に貢献しないことがよく分かる
0544デフォルトの名無しさん
2005/05/26(木) 16:55:34(´-`).。oO(例外自体も?)
0545デフォルトの名無しさん
2005/05/26(木) 18:24:01>スパートポインタ
>スパートポインタ
0546デフォルトの名無しさん
2005/05/26(木) 19:47:56もしかしてスパートポインタも知らないのか?
0547デフォルトの名無しさん
2005/05/26(木) 19:57:040548デフォルトの名無しさん
2005/05/26(木) 20:25:22俺は知ってるぞ
http://www.google.co.jp/search?hl=ja&q=%E3%82%B9%E3%83%91%E3%83%BC%E3%83%88%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
0549デフォルトの名無しさん
2005/05/26(木) 20:29:10今、C++の参考書を読み終わったのですが、
クラスや関数のことについては大体分かりました。
まずは簡単な住所録をつくろうと思ってたのですが、
コマンドプロンプト上でしか動かせない状況です。
これから先はMFCやAPIを勉強していけば
C++のソフトを作るには十分だといえるのでしょうか?
もし、よろしかったらご教授下さい。
0550デフォルトの名無しさん
2005/05/26(木) 20:51:20new int a[3][3]まではいいけどその先が駄目。
newの後で要素へ代入していくしかない。
0551デフォルトの名無しさん
2005/05/26(木) 21:14:54a[0] = new int[3]; //a[0] = {1,2,3};
a[1] = new int[3];
a[2] = new int[3];
0552デフォルトの名無しさん
2005/05/27(金) 00:14:290553デフォルトの名無しさん
2005/05/27(金) 00:31:05>>138
055498
2005/05/27(金) 02:09:55なんかどれに参加していいかも良くわからないし。途中から参加しても
ついていけなさそう。
0555デフォルトの名無しさん
2005/05/27(金) 02:48:240556デフォルトの名無しさん
2005/05/27(金) 04:18:130557デフォルトの名無しさん
2005/05/27(金) 06:03:07'sw' は 'std' のメンバーではない!とか怒られたんですが
何がマズイんでしょうか?
もちろんsstreamはincludeしてます。
問題部分のソースは
if(!(s << src) || !(s >> dest) || !(s >> std::sw).eof())
0558デフォルトの名無しさん
2005/05/27(金) 06:19:28サンクス。
いろいろ書くと、チョット複雑なんだけど
hDCが使えないので、Locate()とか、home()でカ−ソルを動かせると良いのですが・・
元々、画面へ直接アクセスの考えがないから、駄目なんでしょうね。
0559デフォルトの名無しさん
2005/05/27(金) 07:19:45ws(white space)
0560デフォルトの名無しさん
2005/05/27(金) 09:28:29deleteしても、その解放したメモリ領域は、アプリが終わるまではOS側で再利用してくれないのでしょうか?
0561デフォルトの名無しさん
2005/05/27(金) 09:34:22コンパイラ、ライブラリ、OSの実装による。
疑いを晴らしたいのなら、 new, delete を
OSのメモリ管理を直接使うように再定義して置き換えればよい。
0562デフォルトの名無しさん
2005/05/27(金) 10:06:53だからスレ違いだってばよ。
http://pc8.2ch.net/test/read.cgi/tech/1115386557/
0563デフォルトの名無しさん
2005/05/27(金) 10:12:04レスありがとうございます。決まってないんですか。
折角隠蔽してくれているなら、こだわらない方が良いのでしょうか。
「OSのメモリ管理」で勉強しなおした所、(スレ違いですが)Windowsの場合は、すぐにでは無いけど、
後で可能ならば再利用してくれているんですね。あまり考えないことにします。
0564デフォルトの名無しさん
2005/05/27(金) 16:12:10プロセスの解放時に全部解放されっから気にスンナ
メモリリークが〜とかいうのはDaemonとか永続的に
走らせるアプリケーションじゃなきゃたいして問題じゃない
というと怒る人がいっぱいいるけどね!
0565デフォルトの名無しさん
2005/05/27(金) 16:47:35そういうのは大抵deleteがどうとかいう問題じゃなくて単純にバグでメモリリークしてるか、後で使うかもしれないからと使いもしないゴミを後生大事に抱え込んでるかのどっちか。
0566デフォルトの名無しさん
2005/05/27(金) 17:41:12友人達と複数のゲームクラスをつくり、最後に一つにくっつけてゲーム完成を目指しています。
ただその際、メインのcppファイルがみんなのheaderファイルをincludeするため
#define での宣言が重なってしまうかもしれません。
例えば
#define DRAW_GAME_WIDTH 640
などです。ゲームによって幅が違うため、他の人が320などで宣言していたらコンパイル(プリプロセス)の際にエラーになってしまうでしょう。
これの解決策としてはどのような方法が一般的なのでしょうか。
それぞれはクラスを作ることになっており、グローバル空間には変数などを作らない約束にはなっています。
なのでstatic intでメンバー変数を
static int DRAW_GAME_WIDTH = 640;
といった感じのものを、クラス内で宣言させればグローバル空間を汚染しないかと考えました。
ですが変数ですので、#defineで置換したものに比べてわずかながら処理が遅いのかなと思います。
もう一つ
enum{
DRAW_GAME_WIDTH = 640,
DRAW_GAME_HEIGHT = 480,
DRAW_XXX = 5
};
というのをクラス内で宣言させることを考えました。
ただ、気になるのはこの場合のスピードです。これは直値に置換されるのでしょうか?
それとも変数扱いなのでしょうか。
初心者な質問ですが、よろしければご教授お願いいたします。(どれも見当違い! を含めて)
0567デフォルトの名無しさん
2005/05/27(金) 17:58:19遅くない。
遅かったとしても、本当にわずかだから気にしなくていい。
それを気にするレベルならC++なんか使うな。
> ただその際、メインのcppファイルがみんなのheaderファイルをincludeするため
ありえない。
0568デフォルトの名無しさん
2005/05/27(金) 18:01:28んなもんコンパイラによって違うから吐かれたコード見ろ。
第一そんなとこがボトルネックになるわけない。
最適化の基本は計測。
計測した結果、本当にそこがボトルネックになってるならそれから考える。
enumでやるのはconst staticが使えない環境で
無理矢理同じことを再現するEnam hackという手法。
本来のenumの使い方とは違うのでconst staticが
ちゃんと使えるならconst staticでやれ。
そもそも他人と被るようなウィンドウ幅みたいな定数を
グローバルにおかない事の方が間違いだがな。
0569デフォルトの名無しさん
2005/05/27(金) 18:02:06enumはコンパイル時定数なのでろくに最適化をしないコンパイラでも問題ない。
ただし、単にクラス内定数が欲しいだけならenumよりstatic constを使う方が一般的。
ほかにもクラスの枠に縛られない定数が欲しいときには
1人1人が独自のnamespaceを持ち、その中でconstな定数を宣言する方法もある。
0570デフォルトの名無しさん
2005/05/27(金) 18:42:310571デフォルトの名無しさん
2005/05/27(金) 20:47:23スレ違いではないと言う事が解らないほど、あほな奴だな。
0572デフォルトの名無しさん
2005/05/27(金) 21:10:47enum定数 => コンパイル時に計算される、ただし値がint
const static データメンバ定数 => 整数型ならば、コンパイル時に計算される
整数ならば、const staticデータメンバで行けばよい
浮動小数点のばあい、#defineのよい代案はない
インライン関数で定義すれば、コンパイル時に計算する可能性が高いか
0573デフォルトの名無しさん
2005/05/27(金) 21:25:460574デフォルトの名無しさん
2005/05/27(金) 21:28:110575デフォルトの名無しさん
2005/05/28(土) 01:44:34型が違うってエラーの本来クラス名が出るところに_closureとか出てるんですが
0576デフォルトの名無しさん
2005/05/28(土) 01:52:09無理。次。
0577575
2005/05/28(土) 01:57:42メンバにアクセスできる以上ポインタも取得できそうなものなのに
もしかしてコンストラクタの中で
そのクラスのポインタを受け取る関数にthis渡すのもできないんですか?
0578デフォルトの名無しさん
2005/05/28(土) 02:03:030579デフォルトの名無しさん
2005/05/28(土) 02:05:36> もしかしてコンストラクタの中で
> そのクラスのポインタを受け取る関数にthis渡すのもできないんですか?
できる。が、一般的に危険だと言える。
0580575
2005/05/28(土) 02:22:39危険というのはコンストラクタで例外が起きちゃった場合とかですか?
それともコンストラクタ内でthisが使えるのは特殊な実装になってるんでしょうか
>>578
わかったかたがいるようなので貼りません。
0581デフォルトの名無しさん
2005/05/28(土) 02:27:58コンストラクタでなければ渡せるのか?
メンバ関数へのポインタの書き方を知らないだけじゃないのか?
0582デフォルトの名無しさん
2005/05/28(土) 02:38:59コンストラクタの中ということは、コンストラクタが完了していないわけで、
その型の完全なオブジェクトを期待している処理に渡された場合に整合性が崩れる可能性がある。
0583デフォルトの名無しさん
2005/05/28(土) 02:50:500584575
2005/05/28(土) 03:06:37>コンストラクタでなければ渡せるのか?
はい
>メンバ関数へのポインタの書き方を知らないだけじゃないのか?
そこまで馬鹿じゃありません
>>582
なるほどそれはそうですね
単純なオブジェクトプールを考えていて
プールクラスのAddメソッドに this を渡したいだけなので
マルチスレッドにでもしない限り大丈夫かな
下位クラスのコンストラクタでプールに検索かけられたらやばそうですが
0585デフォルトの名無しさん
2005/05/28(土) 03:32:290586デフォルトの名無しさん
2005/05/28(土) 03:43:50ム板きっての 大 馬 鹿
0587デフォルトの名無しさん
2005/05/28(土) 07:48:22関数ポインタの使い方を知らないだけの予感
0588デフォルトの名無しさん
2005/05/28(土) 13:05:49BCBのVCLは独自拡張で非staticなメンバ関数のポインタを扱えるようになっているが通常のC++では非staticなメンバ関数のポインタは取れない。
ついでにRTTIでもVCLのTObject派生クラスは通常のC++クラスと振る舞いが違う。
0589デフォルトの名無しさん
2005/05/28(土) 13:14:10&をつけて明示すれば非staticな関数のポインタも取れないわけではない。
メンバへのポインタだから普通の関数ポインタのようには使えないが。
0590デフォルトの名無しさん
2005/05/28(土) 13:23:55http://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03057.html
で585でBCBと言ったのは、BCBはコンストラクタの中でだけ
void (CTest::*fpFunc)() = CTest::Func;
と書けなくて、&CTest::Func; としないと駄目だったので。
0591デフォルトの名無しさん
2005/05/28(土) 13:23:58->*とか.*を使わないとダメですな。
まあ、管理するのも面倒なので、boost::functionとか使いますが。
0592デフォルトの名無しさん
2005/05/28(土) 13:53:150593デフォルトの名無しさん
2005/05/28(土) 14:00:040594デフォルトの名無しさん
2005/05/28(土) 16:09:18MSVCでは単なる関数ポインタで実装されています。しかし、
構造体を使って実装されている環境もあります。一般的に、
メンバ関数へのポインタの実装は互換性を持ちません。
0595デフォルトの名無しさん
2005/05/28(土) 17:24:51な、なんだって!?
それはかなり初耳だ。
0596デフォルトの名無しさん
2005/05/28(土) 17:54:39コンストラクタ以外で CTest::Func が使えるのなら、それは標準とは違う動作だ。
0597デフォルトの名無しさん
2005/05/28(土) 18:30:51む、そうでしたか。メンバ関数ポインタはあのサイトで知ってVCも&なしで通ったので、
&なしが普通だと思ってました。ご指摘どうもです。
0598デフォルトの名無しさん
2005/05/29(日) 12:15:20Inside The C++ Object Modelでも読めよ。
0599デフォルトの名無しさん
2005/05/29(日) 13:15:09その本に書いてることが本当だという保証はないだろ?
0600デフォルトの名無しさん
2005/05/29(日) 13:16:410601デフォルトの名無しさん
2005/05/29(日) 13:17:130602デフォルトの名無しさん
2005/05/29(日) 13:19:01何だよその子供みたいな反論は・・・
0603デフォルトの名無しさん
2005/05/29(日) 13:37:44少なくともお前のようなヘタレの頭の中よりはマシな事が書いてある。
0604デフォルトの名無しさん
2005/05/29(日) 16:46:11書籍読んで、逆アセンブルしたコードと見比べればすぐ分かるだろ。
0605デフォルトの名無しさん
2005/05/29(日) 17:12:51仕様で決められてないんだから関数ポインタがたとえどんな風に実装されていようが驚くような事じゃないだろ。
0606デフォルトの名無しさん
2005/05/29(日) 22:53:01「詳説C++ 標準C++完全理解 第2版 大城 正典 (著)」
ってのを衝動買いしてしまった。
これで勉強して大丈夫か?
0607デフォルトの名無しさん
2005/05/29(日) 22:59:300608デフォルトの名無しさん
2005/05/29(日) 22:59:57本当にいい本は変な修飾語はつけない。
0609デフォルトの名無しさん
2005/05/30(月) 14:45:11そのコンパイラが標準に準拠してるほs(略
まぁどうでもいいが('A`)
0610デフォルトの名無しさん
2005/05/31(火) 00:08:070611デフォルトの名無しさん
2005/05/31(火) 00:09:470612デフォルトの名無しさん
2005/05/31(火) 00:26:130613デフォルトの名無しさん
2005/05/31(火) 00:28:200614デフォルトの名無しさん
2005/05/31(火) 01:15:270615デフォルトの名無しさん
2005/05/31(火) 01:25:070616デフォルトの名無しさん
2005/06/02(木) 10:22:57アクセス関数がずらーーっと、並べちゃうんですが、これは考え方そのもの
が間違っているでしょうか? もうちょっとうまいやり方は、ないのか、
とか思いますが、なにか行き詰まってます。
意味不明なこと書いてるかもしれないですが、アドバイスよろしくお願いします。
0617デフォルトの名無しさん
2005/06/02(木) 10:39:01その前に読点の使い方を勉強したほうがいい。
0618デフォルトの名無しさん
2005/06/02(木) 10:53:27ワロタ
0619デフォルトの名無しさん
2005/06/02(木) 10:55:43変数定義が多すぎるか、クラス間のつながりが強すぎるかのどちらかだと思うから、設計から見直す必要あり。
もしそれが変数だけを集めたクラスならアクセサは不要だけど。
0620デフォルトの名無しさん
2005/06/02(木) 11:25:58private:
int FMoge;
void SetMoge(int value);
int GetMoge();
public:
__property int Moge = { read=GetMoge, write=SetMoge };
};
ただし思いっきりコンパイラ依存
0622デフォルトの名無しさん
2005/06/02(木) 13:52:34Hoge1.h--------------------------------------
class Hoge2;
class Hoge1 {
public:
void Fuga(Hoge2 h);
};
Hoge2.h--------------------------------------
class Hoge1;
class Hoge2 {
public:
void Fuga(Hoge1 h);
};
Hoge1::Fuga()とHoge2::Fuga()をインライン関数にしようと思ったら
(ここではインライン関数にする意義はあるものとします)
Hoge1.h--------------------------------------
#include "Hoge2.h"
class Hoge1 {
public:
void Fuga(Hoge2 h) { ... }
};
Hoge2.h--------------------------------------
#include "Hoge1.h"
class Hoge2 {
public:
void Fuga(Hoge1 h) { ... }
};
では当然コンパイル通らないので、
0623デフォルトの名無しさん
2005/06/02(木) 13:52:47class Hoge1 {
public:
void Fuga(Hoge2 h);
};
class Hoge2 {
public:
void Fuga(Hoge1 h);
};
inline Hoge1::Fuga() { ... }
inline Hoge2::Fuga() { ... }
とでもするしかなくて、1ファイル1クラスの原則が壊れてグダグダになるんですが、
何かエクセレントな手は……ないよね、やっぱし? せいぜい、
Piyo.h---------------------------------------
#include "Hoge1.h"
#include "Hoge2.h"
#include "Hoge1.inl"
#include "Hoge2.inl"
くらい?
0624622
2005/06/02(木) 13:57:05Piyo.h---------------------------------------
class Hoge2;
class Hoge1 {
public:
void Fuga(Hoge2 h);
};
class Hoge2 {
public:
void Fuga(Hoge1 h);
};
inline void Hoge1::Fuga() { ... }
inline void Hoge2::Fuga() { ... }
0625デフォルトの名無しさん
2005/06/02(木) 14:15:04だけ読んだ。
0626デフォルトの名無しさん
2005/06/02(木) 14:45:09っていうか、実体を渡す場面が思いつかない。
0627デフォルトの名無しさん
2005/06/02(木) 15:15:40何これ?波浪注意報?
0628デフォルトの名無しさん
2005/06/02(木) 16:09:340629デフォルトの名無しさん
2005/06/02(木) 18:10:390630622
2005/06/02(木) 18:17:31>>626
実際には参照を渡しとります。
いずれにしても、インライン関数を定義するときに、その関数で使うクラスの定義が必要で、
それが複数のクラスで依存しあう場合にグダグダのガビガビになるんでどうしようかなあと。
0631デフォルトの名無しさん
2005/06/02(木) 18:33:17Hoge1の参照しているHoge2, Hoge2の参照しているHoge1を
templateで処理しとけ。
0632デフォルトの名無しさん
2005/06/02(木) 19:28:00hallow (ground)
Hoge2のインライン関数の定義に際して、その前にHoge1のインターフェイスが
必要になる。逆も同様である。よって互いのクラス定義が見える状態である
必要がある。よって双方のクラス定義が共にそれぞれの関数定義の前方に
ある必要がある。よって>>624のような形か設計を変更する以外に手はない。
0633デフォルトの名無しさん
2005/06/02(木) 20:15:20>632
>よって>>624のような形か設計を変更する以外に手はない。
だから、templateつかって、実体化を引き延ばせって。
class Hoge1 {public:template<class T> void Fuga(T h){ h.Fuga(*this);}};
class Hoge2 {public:template<class T> void Fuga(T h){ h.Fuga(*this);}};
int main() { Hoge1 hoge1; Hoge2 hoge2; hoge2.Fuga(hoge1); }
0634デフォルトの名無しさん
2005/06/02(木) 20:45:40定義側は五十歩百歩
0635デフォルトの名無しさん
2005/06/02(木) 21:52:03ifstream fin(filename, ios::binary);
のように open mode として ios::binary を指定すれば
fin.read((char*)&(raw[0]), bufsize);
で読み込むことができます。
しかしこの open mode は文字通り open 時のオプションらしく、
開いてしまうと途中でモードを切り替える方法がわかりません。
具体的には、cin からバイナリデータとして読み込んだり、
ひとつのファイルの N バイト目以前をバイナリ、残りをテキストとして
読み込んだりする方法がわかりません。
istream の ios::binary フラグを実行時の任意のときに切り替える方法はありませんか?
gcc-3.3.3 の ios_base のソースコードだと
static const openmode binary = openmode(__ios_flags::_S_bin);
とあって、絶望的ですが(´д`)
0636デフォルトの名無しさん
2005/06/02(木) 22:02:140637デフォルトの名無しさん
2005/06/02(木) 22:52:59>具体的には、cin からバイナリデータとして読み込んだり、
>ひとつのファイルの N バイト目以前をバイナリ、残りをテキストとして
前者は兎も角、後者は設計の問題。混在させるメリットが乏しい。
0638デフォルトの名無しさん
2005/06/03(金) 00:08:21//コンストラクタ
Scene::Scene()
: m_pVB(0),m_pTexture(0),m_pTexture2(0) ←この部分について
{
//m_pVB,m_pTexture,m_pTexture2はSceneクラスで定義されてる、変数(ポインタ)
}
上記の矢印の部分なんだけど、一体何をしているんでしょうか?
基本クラスコンストラクタへの引数渡しでもないようなんですが・・
よろしくお願いします。
0639デフォルトの名無しさん
2005/06/03(金) 00:23:250640デフォルトの名無しさん
2005/06/03(金) 00:42:57cinは二回openできるの?
>>638
初期化リスト
0641デフォルトの名無しさん
2005/06/03(金) 00:56:42単純にプロパティ(パラメータ)が多過ぎるだけでは?
試しにアクセス関数が多過ぎると思うクラスを見せて欲しい
単純に「ずらーと並んでておかしいのかもしれない」と言われたら
メンバ変数とプロパティの区別が付いてない可能性くらいしか思いつかない
0643デフォルトの名無しさん
2005/06/03(金) 04:27:47どうでもいいことだけど追記
constメンバ変数や、メンバ変数が参照型のときなど、
「代入」ではなく「初期化」しなければならないときには初期化リストを使わなければならない。
そうでなくても、初期化の方がコスト面で優れているので、常に初期化リスト使うのおすすめ。
class X {
int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
double A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
public:
X() {
a = b = c = d = e = f = g = h = i = j = k = l = m = n = o = p = q = r = s = t = u = v = w = x = y = z = 0;
A = B = C = D = E = F = G = H = I = J = K = L = M = N = O = P = Q = R = S = T = U = V = W = X = Y = Z = 0.0;
};
}
のように、初期化リストだと煩雑すぎる場合だけ代入を使えと
えふぇシーに書いてあった
0644デフォルトの名無しさん
2005/06/03(金) 05:17:58大丈夫、その例はコンストラクタで代入するのではなく代入用関数を用意すべきだから。
0645デフォルトの名無しさん
2005/06/03(金) 06:14:390646デフォルトの名無しさん
2005/06/03(金) 08:12:5610年経っても解らない
0647デフォルトの名無しさん
2005/06/03(金) 09:16:150648デフォルトの名無しさん
2005/06/03(金) 10:36:530649デフォルトの名無しさん
2005/06/03(金) 11:24:59C++にプロパティなんて無いのに、
メンバ変数とプロパティの区別ってどうゆうこと?
0650デフォルトの名無しさん
2005/06/03(金) 11:58:10プログラマーなら誰しも一度は通る道だからだろうか
0651デフォルトの名無しさん
2005/06/03(金) 12:12:020652デフォルトの名無しさん
2005/06/03(金) 12:27:18「気になる」のは誰もが通る道だろうけど、「どこにもない」ことはないだろう。
検索エンジンが無かったころじゃあるまいし。
0653デフォルトの名無しさん
2005/06/03(金) 13:30:51C++みたいないい加減な言語使う場合こそ、
ちゃんとオブジェクト指向理解して下さい
Setter/Getterが必要なのはそのオブジェクトのプロパティ(特徴)であって
中でどんな変数でもってるかなんてのは問題じゃないです
複数のメンバ変数を合成した結果かもしれないし、そもそも変数じゃないかもしれない
クラスを便利な構造体と思ってるとプロパティ=メンバ変数と勘違いしてしまう
0654デフォルトの名無しさん
2005/06/03(金) 13:52:45オブジェクトの状態を表示/設定する手段の一つに
「プロパティ」があるってだけで、それがメンバ関数だろうと
プロキシクラスだろうと、はたまたメッセージ送受信だろうと
んなこたあ問題じゃないです。
そして、C++ には「プロパティ」なるものは存在しません。
>ちゃんとオブジェクト指向理解して下さい
0655デフォルトの名無しさん
2005/06/03(金) 14:01:23お前が言いたい「プロパティ」とやらは「アトリビュート」だろ。
0656デフォルトの名無しさん
2005/06/03(金) 14:10:49653は、C++にプロパティがあるとは、言ってない。
C++にプロパティという文法はなくても、「オブジェクト指向」(と言っていいのか?)
にプロパティという概念はある。
クラス=プロパティ+メソッドみたいなもの?
C++ではプロパティを明示する方法が文法で区別されていない、
つまり、プロパティとその他のメソッドを同等に扱うことができるが、
それは扱ってもよい、と等価ではない、
と、653はいいたいのだと思う。
俺は同意。
0657デフォルトの名無しさん
2005/06/03(金) 14:17:500658デフォルトの名無しさん
2005/06/03(金) 15:17:12こういうマジレスで他人のフリする必要無いし。
0659デフォルトの名無しさん
2005/06/03(金) 15:44:550660デフォルトの名無しさん
2005/06/03(金) 16:09:470661デフォルトの名無しさん
2005/06/03(金) 18:02:31>にプロパティという概念はある。
0662デフォルトの名無しさん
2005/06/03(金) 18:03:45operator T()とoperator =(const T&)を持つクラスを置いたりGetter/Setterをメンバ関数にしたりすれば
いいから没にしたとか書いてあったような希ガス。
0663デフォルトの名無しさん
2005/06/04(土) 01:24:35>>635-640あたりのってこれと同じものなの?
さっぱりわからん。
_fmode = _O_BINARY;
_setmode( 0, _O_BINARY );
こういうのってcinとかには左右しないのかな
わからんからサッカー見て寝る。
0664デフォルトの名無しさん
2005/06/04(土) 06:49:58typedef struct _HOGE_
{
floatx; floaty; floatz;
}HOGE;
typedef struct _HAGE_
{
inta; intb; intc;
}HAGE;
typedef struct _HIGE_
{
HOGEhoge; HAGE hage;
}HIGE;
std::vector< HIGE > m_hige;
という構造体があって
HIGE hige;
hige.hoge.x = 1.0; hige.hoge.y = 2.0; hige.hoge.z = 3.0;
hige.hage.a = 1; hige.hage.b = 2; hige.hage.c = 3;
m_hige.pushback( hige );
m_higeにhigeを入れたとして、
このm_higeの中のhogeとhageの先頭アドレスを得るにはどうしたら良いのでしょうか?
hige構造体の中身がhogeかhageだけだったら&m_hige[ 0 ]でいけるのですが・・・
0665デフォルトの名無しさん
2005/06/04(土) 07:44:100666デフォルトの名無しさん
2005/06/04(土) 08:01:21それだとなんか上手くいかなかったdeath
glVertexPointer( 3, GL_FLOAT, 0, &m_hige[0].hoge );
glColorPointer( 3, GL_FLOAT, 0, &m_hige[0].hage );
0667デフォルトの名無しさん
2005/06/04(土) 08:15:380668デフォルトの名無しさん
2005/06/04(土) 08:45:35HOGEやHAGEの単純な配列じゃないんだから、少なくとも0じゃないと思うけど。
0669デフォルトの名無しさん
2005/06/04(土) 08:50:540670デフォルトの名無しさん
2005/06/04(土) 09:28:08それで逝けました。ありがとうございまs・・・
0671デフォルトの名無しさん
2005/06/04(土) 09:52:00それはsizeof(HIGE)で大丈夫。
>>670
頼むから2ターン目の質問で新事実を出さんでくれ。
>>666までの流れだと完璧に煽りと同じだよ。
0672デフォルトの名無しさん
2005/06/04(土) 11:33:340673デフォルトの名無しさん
2005/06/06(月) 02:02:41外部シンボル ""public: virtual void __thiscall hoge::Proc(void)" (?Proc@hoge@@UAEXXZ)"は未解決です。
とでてくるんですが、どうすればいいでしょうか
0674デフォルトの名無しさん
2005/06/06(月) 02:08:050675673
2005/06/06(月) 02:18:32正しくは
未解決の外部シンボル "?CreateInstance@hoge@?A0xec65bdf2@@SAPAV12@XZ"
(?CreateInstance@hoge@?A0xec65bdf2@@SAPAV12@XZ)が関数 "void __stdcall Init(void)" (?Init@YGXXZ)で参照されました。
でした。
>>673の方は
virtual void Proc() = 0;とする事で通りました。
0676デフォルトの名無しさん
2005/06/06(月) 02:22:520677673
2005/06/06(月) 02:51:59CreateInstanceを定義するためには
A* A::CreateInstance() {
return new AImpl;
};
これも公開側に書かないとだめで、そうするとAImplの定義が必要になるから
class AImpl : public A {
virtual void Proc(int x) { ... ;};
};
こっちも公開側に書かないとダメになって意味なくなっちゃうとおもうんですけど
0678デフォルトの名無しさん
2005/06/06(月) 04:14:26Windows 上でプラグインを DLL にしようとするなら、公開しないソース相当の部分とどうにかしてリンクする必要が
あるんじゃない?公開しないソース相当部分を DLL にしてインポートライブラリを提供すればできるんじゃないかな。
EXE でもエクスポートできたような気はするが。
いっそのこと COM にしちゃえば?
0679673
2005/06/06(月) 04:34:39プロジェクトを分散して開発するときにもこういう手法が必要なんじゃないかと思ってやってました
0680デフォルトの名無しさん
2005/06/06(月) 07:57:53クラスAの宣言は公開するヘッダに必要。
A::CreateInstance()の定義はDLLに必要。(さらにDLLからエクスポートする必要がある)
A::CreateInstance()でAImplをnewしているからDLLにはAImplの宣言と定義が必要。
DLLを使う側にはAの宣言とA::CreateInstance()のDLLからのインポートが必要になる。
しかしAImplは不要。
0681673
2005/06/06(月) 14:11:02って事はその場合だとDll側が本体でそれを呼び出す側がプラグインのような形になってしまうと思うんですけど
Dllを呼び出す側に実操作が入ってて、DLL側でそれを利用するという形にしたい場合は
DLL側でAの宣言とA::CreateInstance()のインポートを行うという形でいいんでしょうか
0682デフォルトの名無しさん
2005/06/06(月) 14:23:14いいんじゃないかね。やってみれば?
0683デフォルトの名無しさん
2005/06/06(月) 14:36:31そういう場合は、
struct {
A* (CreateAInstance)();
... // その他あれこれ
};
みたいなもの(へのポインタ)をEXE側からDll側に渡してあげるのが
良くあるパターン。
0684デフォルトの名無しさん
2005/06/06(月) 16:02:26それをクラスとnewを使って実現する方法ってありますか
typedef struct{
class A;
} B;
int main(){
B b;
A* a = new b.A();
}
見たいな感じで出来ますか。
0685デフォルトの名無しさん
2005/06/06(月) 16:14:14自分でやってみるか、ここで聞きたいなら要件を明らかにせよ。
何がしたいのか、何が気に入らないのかわからん。
0686デフォルトの名無しさん
2005/06/06(月) 16:24:01class B{
public:
class A{
public:
void act();
};
};
Exe側ソース
typedef void (*C_PROC)(B*);
void B::A::act(){
printf("test message");
}
int main(int argc, char* argv[]){
B* b = new B();
HMODULE m = LoadLibrary("dll.dll");
C_PROC f = (C_PROC)GetProcAddress(m, "C");
f(b);
int i;
scanf("%d", &i);
return 0;
}
Dll側ソース
void __stdcall C(B* b){
B::A* a = new b->A();
a->act();
}
ってやるとDll側で"構文エラー 識別子'b'"っていうエラーがでてaが初期化できない
改めて考えると何がしたいんだろ
0687デフォルトの名無しさん
2005/06/06(月) 16:24:31newするには具体的なクラスの情報が必要なので、この件ではAImplを公
開しない限りnewを使うのは不可能。
0688デフォルトの名無しさん
2005/06/06(月) 17:29:090689デフォルトの名無しさん
2005/06/06(月) 17:33:00その場合だとa->act();が未解決の外部シンボルになります。
0690デフォルトの名無しさん
2005/06/06(月) 17:37:01//共通ヘッダ
class A {
virtual void hoge();
};
A *CreateA();
void DestroyA(A*&);
//DLL
class B : public A {
public:
virtual void hoge() {
MessageBox(0, TEXT("hello"), TEXT(""), MB_OK);
}
};
A *CreateA() {
return new(std::nothrow) B;
}
void DestroyA(A*& a) {
delete a;
a = 0;
}
//EXE
int main() {
A *pA = CreateA();
pA->hoge();
DestroyA(pA);
};
0691デフォルトの名無しさん
2005/06/06(月) 17:56:410692デフォルトの名無しさん
2005/06/06(月) 17:57:42それ以外はVC関係なくないか
0693デフォルトの名無しさん
2005/06/06(月) 18:18:55AT&TやBell研やらgoogle先生やらに聞いて見ましたがわかりません(´・ω・`)
0694デフォルトの名無しさん
2005/06/06(月) 18:58:38無料でダウンロードできるAppleの旧々開発環境のMPWに
ついてたような気がする。バイナリだけど。
0695デフォルトの名無しさん
2005/06/06(月) 19:41:43訳すの面倒だけど、見出しだけならぱっと見て読めるし、
2ndと内容的に重なっている部分も多いので、読むのはそんなに
苦にならない。
0696デフォルトの名無しさん
2005/06/06(月) 19:52:400697デフォルトの名無しさん
2005/06/06(月) 20:00:300698デフォルトの名無しさん
2005/06/06(月) 20:47:34ありがとうございます。
でもおいらMac持ってないので、友人のMacに入れて…
0699デフォルトの名無しさん
2005/06/07(火) 00:29:49おれも今日手に入れた。
で、なんとなく読んでみた Item 46 が
いきなり知らなかった内容でびっくりした。
0700デフォルトの名無しさん
2005/06/07(火) 06:15:38C++を始めたい初心者です
おすすめのフリーのコンパイラとフリーのIDEがあれば教えて下さい
0701デフォルトの名無しさん
2005/06/07(火) 07:13:120702デフォルトの名無しさん
2005/06/07(火) 07:24:530703デフォルトの名無しさん
2005/06/07(火) 11:12:53それが一番最強な気がするのでそれ試してみます
0704デフォルトの名無しさん
2005/06/07(火) 11:27:15mule+gcc
0705デフォルトの名無しさん
2005/06/07(火) 15:14:58ttp://blue.sakura.ne.jp/~junnno/ykwk212/wiki.cgi?C%2b%2b%b4%c4%b6%ad
0706デフォルトの名無しさん
2005/06/07(火) 20:51:450707デフォルトの名無しさん
2005/06/08(水) 04:37:10こんなところにconstついてるの初めてみました。
0708デフォルトの名無しさん
2005/06/08(水) 09:06:130709デフォルトの名無しさん
2005/06/08(水) 09:07:06その前に char const* p と char *const p の違いは分かる?
前者は「const char へのポインタ」で p 自体は変更可能だが、p が指す先は
リードオンリー。++p は OK だが (*p)++ とか *p = '\0' はダメ。
後者は「char への const ポインタ」で p の値は変更不可能だが、p が差す
先は変更可能。++p はダメだけど *p = 'a' は OK。
0710デフォルトの名無しさん
2005/06/08(水) 09:11:460711デフォルトの名無しさん
2005/06/08(水) 09:26:35p is (modifiable) pointer to const pointer to const char
pはポインタ。p自身を書き換えてもいい。
pの示す先(*p)は書き換え不可能なポインタ。*pは書き換えちゃいけない。
*pの示す先(**p)はchar。これは書き換えてもいい。
0712デフォルトの名無しさん
2005/06/08(水) 09:28:21下の三行だけ読んでくれ。
0713707
2005/06/08(水) 09:35:53なるほど。constにまつわる話ってポインタ自身とポインタが指す先とどっちも考えなきゃいけないわけですね。
�d!
ちょっとまだ疑問なんですが、>>709さんの char const * p っていうのは const char * p と比べてどうなんでしょうか・・・?
0714デフォルトの名無しさん
2005/06/08(水) 10:09:46char const * p と const char * p はどちらも同じ。
const int foo = -1; と int const foo = -1; も同様。
0715707
2005/06/08(水) 10:12:58どうもです。
0716デフォルトの名無しさん
2005/06/08(水) 10:25:11大して違いはないばかりか非効率だと言われればそれまでだが、
-numeric_limits<double>::max();
の方がいいんじゃない?
0717デフォルトの名無しさん
2005/06/08(水) 11:10:130718デフォルトの名無しさん
2005/06/08(水) 11:21:530719デフォルトの名無しさん
2005/06/08(水) 13:19:43min()は「表現できる正の最小値」だから、0に限りなく近い値を示す
(浮動小数点値の場合)
効率についてはパパよくわかんないけど、#defineはコンパイル時定数、
numeric_limits<double>::max()はgcc3.3.3だと
static double max() throw() { return __DBL_MAX__; }
だから実行時定数になる分、パラノイアからしたら効率が下がっているのかもしれない悪寒。
0720デフォルトの名無しさん
2005/06/08(水) 15:55:492次元(orN次元)で扱えるものは有りますでしょうか?
0721デフォルトの名無しさん
2005/06/08(水) 15:59:380722デフォルトの名無しさん
2005/06/08(水) 16:37:45そういう機能はさ、テンプレートパラメタで渡った型の
プロパティーをテンプレートクラス・関数側で調べるためには
どうしても必要だから標準ライブラリにあるんだけど
そうでなければ、別にどっちつかってもどうでもいいと思うんだが
0723デフォルトの名無しさん
2005/06/08(水) 18:39:15boost::multi_array
0724デフォルトの名無しさん
2005/06/09(木) 02:23:09numeric_limits<double>::min() (および DBL_MIN )って正の値だったのか。
型として取り得る最小の値を返してくれると思ってたから、
double については負の値だと思ってたよ。
型としての最小値を、テンプレート引数 T から取ろうと思ったら、
numeric_limits<T>::min() だと浮動小数点型の時にダメだし、
-numeric_limits<T>::max() だと整数型の時にダメになるってこと?
場合分けが要るのか?
0725デフォルトの名無しさん
2005/06/09(木) 04:06:130726デフォルトの名無しさん
2005/06/09(木) 06:36:29そういうことじゃなくて INT_MIN != -numeric_limits<int>::max() ってこったろ。
2の補数的には負の数のが一つ多い。
0727デフォルトの名無しさん
2005/06/10(金) 00:39:28Effective C++ 第2版の正誤表に関連する記述があるね。
>ttp://aristeia.com/BookErrata/ec++2e-errata_frames.html
>For a floating point type FPT, the minimum representable value is
>typically -numeric_limits<FPT>::max(), though the Standard does not guarantee this.
で、規格をさらってみますと
>ISO/IEC 14882:2003 18.2.1.2-2
> 1 Minimum finite value.181)
> 2 For floating types with denormalization, returns the minimum positive normalized value.
> 181) Equivalent to CHAR_MIN, SHRT_MIN, FLT_MIN, DBL_MIN, etc.
んじゃ、floating types without denormalization はどうやねんと考えると、
18.2.2 から DBL_MIN 等は C 相当。
>ISO/IEC 9899:1999 5.2.4.2.2-10
には FLT_MIN 等は minimum normalized positive floating-point number となって
いるので、結局 floating types については、min() は minimum positive normalized
value を返す、と考えてよさそう。
結局、numeric_limits<T>::is_integer により整数であるかどうかを判別する必要が
あるんじゃないすかね。
ところで有理数型なんてものがあった場合、min() は minimum positive number を
返すべきなんでしょうかね。
0728デフォルトの名無しさん
2005/06/10(金) 01:23:15T minimum_value_of()
{
typedef std::numeric_limits<T> limits;
return limits::is_integer ? limits::min() : -limits::max();
}
これでいいのか?
判定を is_integer でやるのは、隙があるように思うが、
どうやって判定すべきかわからんな。
0729デフォルトの名無しさん
2005/06/10(金) 15:43:38エラーメッセージはboost/mpl/aux_/integral_wrapper.hppでエラーが発生したとなっており、
どういった経路でインクルードされたのかを調べるだけでも嫌になりそうです。
こういった分かりにくいエラーメッセージに対処するいい方法はないでしょうか?
0730デフォルトの名無しさん
2005/06/10(金) 16:08:14エラーメッセージ貼れよ。長くて貼れないなら、zipに固めてどこかのロダにうp。
STL/Boost関連のエラーメッセージはとにかく複雑でグチャグチャなので、
使用したコンパイラと(エラーメッセージを見ればコンパイラは見当が付くが)、
エラーメッセージがないと何とも言えない。
STLfiltというツールもあるが、Perlを入れて動かしてみる手もある。
http://www.bdsoft.com/tools/stlfilt.html
0731729
2005/06/10(金) 16:55:27すみません、環境はBCC5.5.1とBCC Developerを使っていて、エラメッセージは
エラー E2489 c:\boost_1_32_0\boost/mpl/aux_/integral_wrapper.hpp 45: オプションコンテキスト応答深度の上限を超過: 再帰をチェックしてください
これが25回連続出ます(26個目は「エラーあるいは警告が多すぎる」)。
STLfilt落としてみましたが、英語が読めなく使い方が分からないので、あとで翻訳かけながらじっくり読んでみます。
0732デフォルトの名無しさん
2005/06/10(金) 17:04:17http://engineering.meta-comm.com/boost-regression/CVS-HEAD/developer/multi_array.html
0733デフォルトの名無しさん
2005/06/10(金) 17:20:56そりゃ、templateで再帰展開してる場合が多いしな。
>>732のリンク先見たらfailと書いてあるし、だめみたいだね。
VC7.1かgccが他に有名だからそういうのにすべし。
gccをMinGWにしてSTLport入れれば、BCCなんて不要だし、
Dev-C++を入れればBCC Developerと同じような環境に出来る。
0735デフォルトの名無しさん
2005/06/10(金) 19:11:52あーそうだ、gccは日本語対応してないので、ソ系ダメ文字の問題が
あるので(「ダメ文字」でぐぐるとわかる)、それだけは気を付けてくれ。
コメント欄に書いただけでエラーになる。解決法はその文字の後に'\'
を書くだけなんだが。
前に // 一覧表 と書いてエラーになり、何度調べてもプログラムに
間違いが無く、困っていたが、「表」がダメ文字だとわかり、// 一覧表\
と書いて解決した。
0737デフォルトの名無しさん
2005/06/11(土) 00:11:31文字列リテラルはエスケープしなくちゃいけないから、要注意という点はその通りだけど。
0738デフォルトの名無しさん
2005/06/11(土) 00:18:390739デフォルトの名無しさん
2005/06/11(土) 00:21:06秋には2005出るぞ。VC7.1買っておけば多分安く買える。
0740デフォルトの名無しさん
2005/06/11(土) 00:26:380741デフォルトの名無しさん
2005/06/11(土) 01:08:42const Foo foo() { return Foo(); }
っていう const オブジェクトを返す関数の戻り値を
Foo f(foo());
みたいに非 const オブジェクトで受けた場合、RVOってできるものなの?
0742デフォルトの名無しさん
2005/06/11(土) 01:34:390743741
2005/06/11(土) 02:16:54聞きたかったのは RVO の次の段階で、
foo() の戻り値である一時オブジェクトをも
最適化で消すことができるかということでした。
ネタ元の記事を発見したので読み返してみます。
お騒がせしました。
http://www.cuj.com/documents/s=8246/cujcexp2102alexandr/
0744デフォルトの名無しさん
2005/06/11(土) 04:25:00を仮定する(もしくはロケールから推測する)と思うんだが。
0745デフォルトの名無しさん
2005/06/11(土) 16:03:42使ったほうがいいんでしょうか?
使わなくても困ったことがないんですけど。
0746デフォルトの名無しさん
2005/06/11(土) 16:05:560747デフォルトの名無しさん
2005/06/11(土) 16:17:47boost::regexを使うときとかに困る。
困ってから使えばいい。
0748745
2005/06/11(土) 16:58:59私が以前使ったのは、半角と全角文字がまざっていて、
全角文字を1文字としたとき wchar_t に変換すると、
便利でした。
これが正常な使い方かどうかは、知りません。
あと、unicode を使うときは、wchar_t を使ったほうが
よさそうな感じがして、悩んでます。
UTF-8 なら使わずにすむかなぁとか。
wchar_t や、wstring について解説してあるよいページってないですか?
見てみたんですが、どういうときに使うべきかっていうのは
見つからなくて。
0749デフォルトの名無しさん
2005/06/11(土) 18:45:00UTF-8はマルチバイト文字の1種みたいなものだから
プログラム内部で使うのにはあまり向いていないと思う。
0750デフォルトの名無しさん
2005/06/11(土) 19:12:500751デフォルトの名無しさん
2005/06/11(土) 19:19:400752デフォルトの名無しさん
2005/06/11(土) 21:57:260753デフォルトの名無しさん
2005/06/14(火) 03:58:37そのインスタンスへのポインタの配列を
コンパイル時に自動的に確保するようなコードって書けますか?
例えばclass Fooがあったとして
Foo a, b, c;
としたときに
Foo* AllFoos[3] = { &a, &b, &c };
のようなものをコンパイル時に作ってしまいたいんです
テンプレートとコンストラクタとstaticメンバ組み合わせれば
出来そうな気がするんですけど、なかなかうまくいきません
0754デフォルトの名無しさん
2005/06/14(火) 05:45:13の部分を自動で生成するってことか?
>テンプレートとコンストラクタとstaticメンバ組み合わせれば
>出来そうな気がするんですけど、なかなかうまくいきません
これだと実行時じゃないの?
0755デフォルトの名無しさん
2005/06/14(火) 06:01:31その部分の3ていう数字とか&aとかの部分です
というのもFooオブジェクトはスタティックな
インスタンスとしてしか存在しないんだけど
ソースファイルのいろんなところに散らばってしまうので
追加修正があったときにGrepしてカウントするのは非効率かなと
なんでコンパイル時にこだわってるかは、例えば
インスタンスの数が極端に少なければ全てのインスタンスに対するループ
for (int i = 0; i < Fooの総数; ++i) {
AllFoo[i]->SomeMethod();
}
がコンパイラの最適化によって展開されたりしたらいいなあと
0756デフォルトの名無しさん
2005/06/14(火) 06:17:50for (int i = 0; AllFoo[i]!=NULL; ++i) {
修正箇所は一箇所じゃないの?
Foo* AllFoos[] = { &a, &b, &c, NULL };
最適化はよくわからんけど
それだと仮に最適化されてもどうでもいいような速度じゃない?
0757デフォルトの名無しさん
2005/06/14(火) 06:59:28わかりにくくてすみません
概念的にリスト構造なんで仮に配列で表現したまでで、
実際配列でやるのかは実装次第です
例えば実行時にリストを構築するとすれば
class Foo {
static std::vector< Foo* > s_AllFoos;
public:
Foo() { s_AllFoos.push_back(this); }
static void ForEach(std::unary_function<Foo, void> func) {
std::foreach(s_AllFoos->begin(), s_AllFoos->end(), func);
}
};
みたいにな感じになると思うんですが、動的に作らないクラスなので
コンパイル時に全てのインスタンスがわかるので
起動時に一々リスト構築するよりうまいやり方がないかなと思ったわけです
0758デフォルトの名無しさん
2005/06/14(火) 07:54:01を呼び出すならコンパイル時には無理なんじゃないの?
0759デフォルトの名無しさん
2005/06/14(火) 10:50:33俺だったら簡単なスクリプトを書いてそういうソースを自動生成するな。
0760デフォルトの名無しさん
2005/06/14(火) 11:23:09static void ForEach(std::unary_function<Foo, void> func) {
std::foreach(s_AllFoos->begin(), s_AllFoos->end(), func);
}
こんなの間違っても書くなよ
0761デフォルトの名無しさん
2005/06/14(火) 13:26:47ですから、あくまで例です…
>>759
確かにスクリプトの領分かもしれません
一旦別の方向で考えてみます
>>760
すみません適当すぎましたw
0762デフォルトの名無しさん
2005/06/14(火) 23:11:400763デフォルトの名無しさん
2005/06/14(火) 23:24:280764デフォルトの名無しさん
2005/06/14(火) 23:25:43http://pc8.2ch.net/test/read.cgi/tech/1117984322/l50
0765デフォルトの名無しさん
2005/06/14(火) 23:26:38こうゆう場合はどうなのでしょうか?
俺がつくった関数
hoge getHoge()
hogeが取れなかった場合nullを返す
先輩がつくった関数
boolean getHoge(hoge &h)
hogeが取れなかった場合falseを返す
どちらも呼ぶ側はif(!getHoge(...))です。ここまでしてnullを避けなければならないのでしょうか?
会社によってはこうゆうルールがあるのですか?先輩はnullはダメだとしか教えてくれませんでした
0766デフォルトの名無しさん
2005/06/14(火) 23:28:220767デフォルトの名無しさん
2005/06/14(火) 23:28:48もしかして、言語が Java じゃないか?
0768デフォルトの名無しさん
2005/06/14(火) 23:32:07C++です
0769デフォルトの名無しさん
2005/06/14(火) 23:34:110770デフォルトの名無しさん
2005/06/14(火) 23:41:01というあたりが、おすすめの処世
0771デフォルトの名無しさん
2005/06/14(火) 23:44:49http://www-6.ibm.com/jp/developerworks/java/010810/j_j-diag2.html
0772デフォルトの名無しさん
2005/06/14(火) 23:47:39とC/C++使いとしてはうらやましいわけですよ
0773デフォルトの名無しさん
2005/06/14(火) 23:54:360774デフォルトの名無しさん
2005/06/14(火) 23:54:41まあここはそんなスレじゃないけどな。
0775デフォルトの名無しさん
2005/06/15(水) 00:04:46boolean とか、hoge getHoge() でなぜか null を返せるとか (hoge がポインタ型に
typedef されてるのか?) 俄には信じがたいんだが。
null 返すな bool にしとけ、ってのは CODE COMPLETE で見た気がする。
ポインタだとエラーチェックを端折るヤツが多くて後で苦労した、という実経験に
裏打ちされた話だったような。
0776デフォルトの名無しさん
2005/06/15(水) 01:44:44ただポインタ返されてもそれがnewしたものかメンバのポインタかわからんので
コードメンテ上良くない。
0777デフォルトの名無しさん
2005/06/15(水) 09:12:59> ポインタだとエラーチェックを端折るヤツが多くてboolだと大丈夫という理屈はさっぱりわからんな。
理屈は分からなくても、実際にデバッグ工数減れば何でも良いよ。
0778デフォルトの名無しさん
2005/06/15(水) 22:01:460779デフォルトの名無しさん
2005/06/15(水) 23:51:49有効なオブジェクトとして扱う行為は正当でしょうか?
class C;
void func(C &); // Cのオブジェクトを操作する
class C
{
C(){ func(*this); }
};
0780デフォルトの名無しさん
2005/06/16(木) 00:00:42「構築済み」を規格レベルの意味で捉えるなら、不当。
コンストラクタの実行が完了したときに「構築済み」と言える。
ttp://www.kuzbass.ru/docs/isocpp/basic.html#basic.life
0781デフォルトの名無しさん
2005/06/16(木) 00:46:46ありがとうございます。
http://www.kuzbass.ru/docs/isocpp/special.html#class.init
上節などを読む限りでは構築中の場合でも制限付きで扱えるということみたいですね。
ただこれに関して規格を厳密に追うのは結構しんどそうだと理解しました。
0782デフォルトの名無しさん
2005/06/16(木) 23:55:35メンバ関数に割り当てたいと考えています。
class Test
{
void a_(int x){cout << "a:" << x << endl;}
void b_(int x){cout << "b:" << x << endl;}
public:
Test(unsigned int kind)
: run( kind ? a_ : b_){}
void (Test::*run)(int);
};
int main()
{
Test test(1);
test.run(3); <-- test.b_(3)が呼ばれてほしい
return 0;
}
上記のように試してみたのですが、test.run(3); の行で、
error:expression must have (pointer-to-) function type
とエラーが出てしまいます。上記の例はどのように直せば
うまく行くでしょうか?お分かりの方がいらっしゃいましたら、
ぜひご教授よろしくお願いいたします m(__)m
0783デフォルトの名無しさん
2005/06/17(金) 00:05:41(test.*test.run)(3);
0784デフォルトの名無しさん
2005/06/17(金) 00:06:40じゃない? 試してないから知らんけど。
0785デフォルトの名無しさん
2005/06/17(金) 00:06:44class Test
{
void a_(int x){cout << "a:" << x << endl;}
void b_(int x){cout << "b:" << x << endl;}
void (Test::*run_)(int);
public:
Test(unsigned int kind)
: run_( kind ? &Test::a_ : &Test::b_){}
void run(int x) { return (this->*run_)(x); }
};
0786デフォルトの名無しさん
2005/06/17(金) 00:07:11class Test
{
void a_(int x){cout << "a:" << x << endl;}
void b_(int x){cout << "b:" << x << endl;}
void (Test::*pf)(int);
public:
Test(unsigned int kind)
: pf( kind ? &Test::a_ : &Test::b_){}
void run(int c)
{
(this->*pf)(c);
}
};
int main()
{
Test test(1);
test.run(3);
}
0787デフォルトの名無しさん
2005/06/17(金) 00:07:270788デフォルトの名無しさん
2005/06/17(金) 00:07:36汚すぎ。
せっかくC++使うんならポリモフィズム使えばいいだろが。
0789786
2005/06/17(金) 00:08:010790デフォルトの名無しさん
2005/06/17(金) 00:08:340791784
2005/06/17(金) 00:10:000792782
2005/06/17(金) 00:11:40今からそれぞれ試してみます!
0793デフォルトの名無しさん
2005/06/17(金) 00:14:23飢えているなら俺から質問
voidってなに?
0794デフォルトの名無しさん
2005/06/17(金) 00:17:55> <-- test.b_(3)が呼ばれてほしい
これは無理だろ
0795デフォルトの名無しさん
2005/06/17(金) 00:20:530796デフォルトの名無しさん
2005/06/17(金) 00:21:15783- の回答でできたんじゃないの?
0797784
2005/06/17(金) 00:22:40Ω<ナ、ナンダッテー
0798デフォルトの名無しさん
2005/06/17(金) 00:23:04戻り値なし
0799デフォルトの名無しさん
2005/06/17(金) 00:24:14thx
ホントにvoidだけにスルーされたかと思った
0800デフォルトの名無しさん
2005/06/17(金) 00:25:210801デフォルトの名無しさん
2005/06/17(金) 00:26:03> Test test(1);
となってるからrunにはTest::a_が入る。
だからTest::b_は呼ばれない。
0802デフォルトの名無しさん
2005/06/17(金) 00:28:560803デフォルトの名無しさん
2005/06/17(金) 00:32:19はいはい
void*型
引数なし
0804782
2005/06/17(金) 00:32:23=
>>786
は無事うまく行きました。文法的に
何をやっているかも理解できました。なるほどこうやればいいんですね。
ありがとうございます。
>>783
>>787
は共に文法的に同じ事を意味しているようですね。
文法的にどのような構造になっているのか
よく理解できていないのですが、無事うまくいきました。
何だか分からんが、すごいです。。
>>784
は残念ながら私の環境ではエラーになってしまうようです。
>>788
確かに、きたないですね。。ただ、対応すべき関数(a_,b_など)がいっぱい
ありすぎるため、いちいち子クラスを作ると大量にクラスができてしまう
ので躊躇してしまっています。
皆様、これくらいの事は一瞬で分かるようで、
すご過ぎて尊敬してしまいます。
大変勉強になりました。どうもありがとうございましたm(__)m
0805デフォルトの名無しさん
2005/06/17(金) 00:35:24お前はすごいよ
俺なんてvoidすらわからねぇんだから自信もて
0807デフォルトの名無しさん
2005/06/17(金) 00:35:53どういう経緯でそれが必要になったか知らないが、設計考え直したほうがいいぞ。
0808デフォルトの名無しさん
2005/06/17(金) 00:37:12>>783等の形は、
「メンバ関数へのポインタ(変数)は、そのクラスのメンバであるとは限らない」ことから。
変数を指定するためのtest.runと、
そのメンバ関数ポインタを呼び出すインスタンスとしてのtest
この2つが必要だということ。
0809デフォルトの名無しさん
2005/06/17(金) 00:39:14会社とかでさ
パッケージを保守する仕事してたら
ソースのFOR文とかに
iとかjとかつかってるのがあると萎えるのはなぜ
0810デフォルトの名無しさん
2005/06/17(金) 00:41:120811デフォルトの名無しさん
2005/06/17(金) 00:42:46特に深い意味はなかったけど何で大文字にしたんだろ
0812782
2005/06/17(金) 00:43:28そうですね。色々ほかの可能性も考慮に入れて見る事にします。
>>808
なるほど。。超勉強になります。どうもありがとうございます。
0813デフォルトの名無しさん
2005/06/17(金) 12:00:34public:
virtual void run(int) = 0;
};
class TestA : public TestBase {
public:
void run(int x){cout << "a:" << x << endl;}
};
class TestB : public TestBase {
public:
void run(int x){cout << "b:" << x << endl;}
};
class Test {
public:
Test(int kind) { if (kind) tb = new TestA(); else tb = new TestB(); }
virtual ~Test() { delete tb; }
void run(int x) { tb->run(x); }
private:
TestBase* tb;
};
int main()
{
Test t(1);
t.run(3);
return 0;
}
0814デフォルトの名無しさん
2005/06/17(金) 12:03:32Strategyを差し込もうよ。
0816813
2005/06/17(金) 13:28:53class TestBase {
public:
TestBase(string n) : name(n) {}
void run(int x) { cout << name << x << endl; }
private:
string name;
};
class TestA : public TestBase {
public:
TestA() : TestBase("a:") {}
};
class TestB : public TestBase {
public:
TestB() : TestBase("b:") {}
};
0817デフォルトの名無しさん
2005/06/17(金) 14:22:57書いてからよく見たらほとんど変わらなかった。
class Runnable { // 仮想デストラクタ省略
public:
virtual void run(int x) = 0;
};
class A : public Runnable {
virtual void run(int x) ){ cout << "a:" << x << endl; }
};
class B : public Runnable {
virtual void run(int x) ){ cout << "b:" << x << endl; }
};
class Test {
public:
void setRunnable(Runnable* r) { r_ = r; } // setterでさしこむ
void run(int x) { r_->run(x); }
private:
Runnable* r_;
};
0818デフォルトの名無しさん
2005/06/17(金) 14:50:07別クラスにすると場合によってはTestのポインタを(TestA,TestBとかに)引き渡さなくちゃいけなくなるし。
0819デフォルトの名無しさん
2005/06/17(金) 18:32:53先頭とその次の要素まで参照できるstackがほしいんですが,どう実装するのが良いんでしょうか.
0820デフォルトの名無しさん
2005/06/17(金) 18:40:470821819
2005/06/17(金) 19:52:05stackとしてしか使っていないので,できる限りstackっぽくしたいんですよねえ.
0822デフォルトの名無しさん
2005/06/17(金) 20:37:14std::stack stk; // ゴミ箱があるとする
tmp = stk.top(); // ふたをコピーして
stk.pop(); // ふたを開けるとする
// stk.top(); // 中身を見てうげー
stk.push(tmp); // ふたを閉める
これしかないんじゃ?
0823デフォルトの名無しさん
2005/06/17(金) 21:28:03うん。
生のメンバ関数ポインタを boost function に変えれば、
ほぼ 785 の通りにできるよね(呼び出し時にもthisとか
いらない)。
0824デフォルトの名無しさん
2005/06/18(土) 16:32:00メソッドの引数で(foo<T> const & r)みたいな
constの位置ってどういう意味なんでしょうか?
(char * const bar) みたいのがポインタ不変宣言なのは知ってるのですが
参照の前にconstがあるのは知りませんでした…
0825デフォルトの名無しさん
2005/06/18(土) 16:34:080826デフォルトの名無しさん
2005/06/18(土) 16:58:44ありがとうございます
0827デフォルトの名無しさん
2005/06/19(日) 02:04:30メソッドならtemplate<> ClassName<特化型>::SomeMethod()
みたいな感じにするのはわかるんですが、
例えばインデックスの型によってコンテナを使い分けるクラステンプレート
template<typename valueT, typename indexT>
class MyTable {
indexT add(const valueT& value);
void remove(const indexT& index);
valueT find(const indexT& index);
}
みたいのを、具体的にどうやって記述して良いのかわかりません
数値ならハッシュテーブル、文字列なら二分木、みたいな感じでやりたいのですが…
0828デフォルトの名無しさん
2005/06/19(日) 05:42:34template<typename valueT>
class MyTable<valueT,int> {
//ハッシュで実装
};
template<typename valueT>
class MyTable<valueT,char*> {
//木で実装
};
これじゃダメか?
0829デフォルトの名無しさん
2005/06/19(日) 11:22:29あー…なるほど…クラス自体を特殊化してしまうんですね
0830デフォルトの名無しさん
2005/06/19(日) 11:25:08typedef typename if_<is_integral<indexT>, hash<indexT, valueT>, tree<indexT, valueT> >::type containerT;
でもメソッドの実装ごと切り替えたいなら実装用のクラスを作ってテンプレート引数で切り替えるというのも
有りかと。まー >828 と同じだけど
template<typename valueT, typename indexT>
class MyTable : public MyTableImp<valueT, indexT, is_integral<indexT>::value> {};
template<typename valueT, typename indexT, bool b>
class MyTableImp {
// ハッシュテーブル実装
};
template<typename valueT, typename indexT>
class MyTableImp<valueT, indexT, false> {
// 二分木実装
};
0831デフォルトの名無しさん
2005/06/19(日) 16:41:20ありがとうございます
テンプレートをboolリテラル?的に扱うのは
覚えた方が良さそうですね
0832デフォルトの名無しさん
2005/06/21(火) 19:17:40変形する関数(GaussJordan)は行列のクラスのメンバ関数にしていいと思いますか?
0833デフォルトの名無しさん
2005/06/21(火) 20:40:31インタフェースは必要最小限がいい。
0834デフォルトの名無しさん
2005/06/21(火) 21:01:48class A
{
//普通なクラス
};
template <class name>
class B{
//テンプレートクラス
};
があったとします。
そして、このテンプレートクラスを使うために"型"を指定してインスタンス化
するわけですけど
b<型> object;
この"型"に一番上に書いた「class A」のような
自分で作ったクラスを"型"として指定できるのでしょうか?
int型などは、普通に指定できるのはわかっているんですが・・・・
ご教授お願いします。
0835デフォルトの名無しさん
2005/06/21(火) 21:04:300836デフォルトの名無しさん
2005/06/21(火) 21:16:14ですよね。
ありがとうございました。
0837デフォルトの名無しさん
2005/06/21(火) 22:27:09クラスのインスタンスにはメンバ関数へのポインタは含まれてないけど、
そのかわりに○○○って所へのポインタを持っていて
メンバを呼ぶと○○○からたどって目的のメンバ関数を呼び出すって感じだったと思うんですけど
○○○って何て名前ですか? たしかアルファベット3文字だったと思うんですけど。
0838デフォルトの名無しさん
2005/06/21(火) 22:28:36ちなみに仮想関数だけな。
0839デフォルトの名無しさん
2005/06/21(火) 22:29:500840デフォルトの名無しさん
2005/06/21(火) 22:32:100841デフォルトの名無しさん
2005/06/21(火) 22:38:05どーもありがとん。
0842デフォルトの名無しさん
2005/06/21(火) 22:53:16C++って何でもメンバにしがちだけど
俺もそっちの方が自然だと思うな。
例えばvectorクラスだったら、
長さを返すlengthはメンバでいいと思うけど
正規化するnormalizeは関数の方がいいみたいな。
0843デフォルトの名無しさん
2005/06/21(火) 22:58:00メンバ、関数共に存在して欲しい
0844デフォルトの名無しさん
2005/06/21(火) 23:02:44正規化した結果を返す関数 T normalize(const T&) の両方欲しい。
効率の観点から。
0845デフォルトの名無しさん
2005/06/21(火) 23:06:22効率の問題があるなら>>844みたいにするか、成分ごとの操作を許すかだな。
0846デフォルトの名無しさん
2005/06/21(火) 23:26:370847デフォルトの名無しさん
2005/06/21(火) 23:35:57class Vector {
float Norm() const;
Vector& Normalize();
static Vector Normalize(const Vector& v);
inline float Length() const { return Norm() };
};
みたいになっている
しかしガウスジョルダンだかしらんけど
用途が極限られてるメソッドは
独立させた方がいいんじゃないかね
0848デフォルトの名無しさん
2005/06/21(火) 23:36:00なんでそんなことするんだ?
0849デフォルトの名無しさん
2005/06/21(火) 23:37:560850846
2005/06/21(火) 23:42:01例えば>>847のように
Vectorクラスに関連してるが
インスタンスの情報は必要ないユーティリティ的な関数ってstaticにするけど
0851デフォルトの名無しさん
2005/06/21(火) 23:46:23>>845
>効率の問題があるなら>>844みたいにするか、成分ごとの操作を許すかだな。
「成分ごとの操作を許さない行列クラス」ってちょっと使い難いと思う。
>>847
>Vector& Normalize();
なるほど。 v2 = (x - y).Normalize() * 2; とか効率よく出来るわけね。
>>848
普通の関数にするのは、Vectorみたいなデータクラスの操作を一々
メンバ関数にしてられっかょ、何か追加するたびに毎回Vectorみたいな
基本的なクラスに変更が入んのか、というようなことだと思う。
0852デフォルトの名無しさん
2005/06/21(火) 23:57:30外に見せるインターフェースと内側での実装の間に
多少なりとも違いのあるクラスなら、メンバ関数にして内側の実装を直接いじった方が
効率がいいかも、とは考えるかな。
0853デフォルトの名無しさん
2005/06/21(火) 23:59:42俺なら同じファイルに入れるだけにするな。
static関数もカプセル化のために使いたい。
0854デフォルトの名無しさん
2005/06/22(水) 01:40:25俺はどっちかに統一して欲しいなあ。
神経質なんで。
0855デフォルトの名無しさん
2005/06/22(水) 01:54:43VC6でbool形に true to falseしか代入させないようにするって出来ますでしょうか?
VC6だとこれ通っちゃうんですけど・・・
bool foo = (float)1.0;
bool foo = (double)1.0;
TRUE,FALSEの代入も抑制したいんです。
0856デフォルトの名無しさん
2005/06/22(水) 01:57:24無理
0857デフォルトの名無しさん
2005/06/22(水) 01:57:340858デフォルトの名無しさん
2005/06/22(水) 02:18:540859デフォルトの名無しさん
2005/06/22(水) 03:26:530860855
2005/06/22(水) 08:38:43一時オブジェクトを生成させることによって、
コンパイルエラーをわざとと吐かせることは可能なんだぞ。
あとはグローバルの bool operator = をオーバーライドする方法さえあればいいのに。
int f(void){return 1;}
#undef TRUE
#define TRUE f();
bool foo1 = TRUE;
0861デフォルトの名無しさん
2005/06/22(水) 08:44:360862デフォルトの名無しさん
2005/06/22(水) 14:39:240863デフォルトの名無しさん
2005/06/22(水) 17:44:57VC7.1では1と0のリテラル以外なら整数・浮動小数点数共に警告が出た。
0864デフォルトの名無しさん
2005/06/22(水) 22:03:37で、また疑問が出てきました。
あの、.netを使ってるんですけど
テンプレートのことで
.h
でテンプレートクラスとその関数を定義
.cpp
でテンプレートの関数を実装
でビルドするとリンクされてませんエラーが出ます。
このスレの過去ログで、vc6ではこのcppとhの分離が出来ないということがわかりました。
現在でもこのcppとhの分離は出来ないのでしょうか
よろしくお願いします。
0865デフォルトの名無しさん
2005/06/22(水) 22:18:160866デフォルトの名無しさん
2005/06/22(水) 22:20:280867デフォルトの名無しさん
2005/06/22(水) 22:22:45こも
0868デフォルトの名無しさん
2005/06/22(水) 23:21:17これですね。
ttp://www.comeaucomputing.com/
他にも
>Full C++03 core language support!
>Full TC1 support!
とか書いてありますが。
0869デフォルトの名無しさん
2005/06/22(水) 23:28:17ありがとうございます。
なるほど。
決まりだったのか・・
もやもやした疑問が解けてかなり助かりました。
これで、作業が進めれれるぞ!(・∀・)
0870855
2005/06/22(水) 23:36:18仕方ないので、comp lang c++ λ...逝って来ます・・・。
0871デフォルトの名無しさん
2005/06/22(水) 23:45:38VC6って、「警告をエラーとして扱う」オプションとかないの?
0872デフォルトの名無しさん
2005/06/22(水) 23:46:000873デフォルトの名無しさん
2005/06/22(水) 23:59:05進めれれるってあんた・・・
0874デフォルトの名無しさん
2005/06/23(木) 16:04:59http://www.artima.com/cppsource/safebool.html
これは参考にならないですか?
0876デフォルトの名無しさん
2005/06/24(金) 18:05:38警告の個数で停止汁ってできたんじゃ?
0877デフォルトの名無しさん
2005/06/25(土) 02:25:53[プロジェクト]-[設定...] メニューで出てくるダイアログの [C/C++] タブの中に
「警告をエラーとして扱う」 オプションがあるよ。
コマンドラインからなら /WX かな。
>>876
んなオプションどっかにあった?
0878デフォルトの名無しさん
2005/06/25(土) 17:31:53error LNK2001:
外部シンボル ""private: static class Hoge * Hoge::_h"(?_h@Hoge@@0PAV1@A)"
は未解決です。
というコンパイルエラーが出ます。
class Hoge{
public:
static Hoge& GetInstance();
private:
Hoge();
static void Instance(){
static Hoge h;
}
static Hoge *_h;
};
Hoge& Hoge::GetInstance(){
return *_h;
}
Hoge::Hoge(){
_h = this;
}
コンストラクタHoge()からstaticクラスメンバ*_hへのアクセスが、
外部シンボルとなってしまうのはなぜでしょうか?
0879デフォルトの名無しさん
2005/06/25(土) 17:42:53コンパイラのエラーそのまんまの意味じゃん?
どっかのcppにHoge * Hoge::_h = NULL;と書いとけ
0880デフォルトの名無しさん
2005/06/25(土) 17:44:03Hoge* Hoge::_h;
って書かないと。
0881デフォルトの名無しさん
2005/06/25(土) 17:44:06staticメンバには実態が必要。
0882878
2005/06/25(土) 20:19:11ありがとうございました。
0883デフォルトの名無しさん
2005/06/26(日) 08:31:08News 2005-06-26: The C++ Standard Library Issues List (Revision 37) is available
0884デフォルトの名無しさん
2005/06/26(日) 11:45:48/* A.h */
#ifndef _A_H_
#define _A_H_
#include "B.h"
(中略)
#endif
/* B.h */
#ifndef _B_H_
#define _B_H_
#include "A.h"
(中略)
#endif
としてしまうと、
A.hを読み込むと、B.hが読み込まれますが、さらにB.hがA.hを読み込むとき
#ifndefのせいでB.hではAが定義されていないとエラーが出るのですが
解決する方法はございませんでしょうか?
0885デフォルトの名無しさん
2005/06/26(日) 12:08:57B.h から #include "A.h" を削除。
0886デフォルトの名無しさん
2005/06/26(日) 12:10:29B.hを読み込むファイルもあるのです。
根本的に変更するべきでしょうか
0887デフォルトの名無しさん
2005/06/26(日) 12:13:02A.h から #include "B.h" を削除。
0888デフォルトの名無しさん
2005/06/26(日) 12:13:461つのファイルにまとめるほど強い関係でないのなら、クラス設計的にもっと何とかなるだろ。
0889デフォルトの名無しさん
2005/06/26(日) 12:15:10B.h は A.h にインクルードされているんだから、A.hをインクルードすればいい。
0890デフォルトの名無しさん
2005/06/26(日) 12:15:43それだとA.hを読み込んだときに
「Bがない」とエラーが出てしまいます。
0891884,886,890
2005/06/26(日) 12:17:52考えてみます。
ありがとうございました。
0892デフォルトの名無しさん
2005/06/26(日) 12:33:35---------[A.h]-------------
#include "B.h"
class A
{
B *pB;
;;
};
---------[B.h]-------------
class A;
class B
{
A *pA;
;;
};
---------[main.cpp]-------------
#include "A.h"
int main()
{
A a;
B; b;
;;
};
0893デフォルトの名無しさん
2005/06/26(日) 12:45:15そんな方法もあったのですね。
ありがとうございました。
0894デフォルトの名無しさん
2005/06/26(日) 12:47:22どちらか片方がポインタだけの利用で済むならそれが答えになるだろうが、
884 はそんな情報は示していない。
0895デフォルトの名無しさん
2005/06/26(日) 12:48:130896デフォルトの名無しさん
2005/06/26(日) 12:49:420897デフォルトの名無しさん
2005/06/26(日) 12:54:23情報が足らずにすいませんでした。
ポインタでない場合でもできるような方法はありますでしょうか?
>>895
eclipseでクラスを作ると自動的についてくるのでそのままにしていたのですが
なにか問題が発生しますか?
0898デフォルトの名無しさん
2005/06/26(日) 12:59:06処理系で予約されている。だから使うべきではない。
でも、現実問題、使われまくりだったりする。
0900デフォルトの名無しさん
2005/06/26(日) 13:26:40テンプレートをマンセーしておく。
0901デフォルトの名無しさん
2005/06/26(日) 13:27:39前方宣言によって有効になる記述はポインタ以外にもいろいろあるが、
一言で言うと、不完全な型しか要求しない記述なら大丈夫。
「完全な型」、「不完全な型」の詳しい意味は、自分で調べてくれ。
0902デフォルトの名無しさん
2005/06/26(日) 13:35:08ありがとうございました。
0903デフォルトの名無しさん
2005/06/27(月) 03:04:45インクルードガードなんて馬鹿馬鹿しいから
消しまくってるよ。
0904デフォルトの名無しさん
2005/06/27(月) 03:15:45それでも良かろう
0905デフォルトの名無しさん
2005/06/27(月) 08:47:59c++でvistaを使う為に
xvilla.hのソースコードの#include<villa.h>を#include<vista.h>に変えてみたり
アプリケーションのソースコードに#include<vista.h>を書いてみたのですが
普通にvilla用のデータベースファイルが作られてしまい、villaとして機能してしまっているみたいです。
vistaをc++で使う為にはどうしたらいいのでしょう?
0906デフォルトの名無しさん
2005/06/27(月) 08:54:20置き換わるほうがまれだろう
0907905
2005/06/27(月) 09:23:12ヘッダファイル名をvista.hに変えるだけで良い、とマニュアルに書いてあって、
C用だと確かにヘッダのファイル名を変えるだけで上手く行くのですが
C++用はxvista.hが無いしxvilla.h内のvilla.hのインクルードをvista.hに変えてもダメだし
マニュアルにはC++はCとほぼ同じAPIが使えると書いてあったけど(ほぼなのでC++用vistaは無いのかもしれないけど)
C++用vistaについて何も書かれていないし、QDBMのWEB上の情報自体が少ないんです。
ただ、かなり優秀なソフトなので使っている人は割と多いのではと思うのですが
分かる方が居たら教えて欲しいです。
0908デフォルトの名無しさん
2005/06/27(月) 15:57:13ウィンドウズでVisualC++とか使っている範囲では、
殆どそんなテクニックは意識したことが無いのです。
0909デフォルトの名無しさん
2005/06/27(月) 16:06:22aho.h
class boke; //クラスの名前だけどっかにあるよ宣言
//#include "boke.h" いんくるーどはしませんよ
class Aho {
boke* m_pBoke; //ポインタ形だからクラスの名前だけあればいけるよ
};
とやってるんですがここでbokeが
typedef struct tag_boke {
...
}BOKE;
typedef struct tag_boke* LPBOKE;
とCライクに書かれている場合はどのようにbokeクラス宣言すればいいのでしょうか?
インクルードせずに
class Aho {
LPBOKE m_pBoke;
};
と書きたいのですが・・・。
typedefされたLPBOKEをインクルードせずに見る方法ってあるのかな。
0910デフォルトの名無しさん
2005/06/27(月) 16:15:51そんくらい悟れや
0911デフォルトの名無しさん
2005/06/27(月) 16:23:17動機としては
class Aho {
private:
Boke* m_pBoke
}
だからAhoはBokeを実装手段としてプライベートに持つ
つまりAhoクラスを使うクライアントにはBokeクラスを知る必要がない。
ということでインクルードはしたくないし、不必要
だったのですが、
今時typedefでLPなんとかとやるメリットは
どこにあるのかと思ったチンカス君でした。
0912デフォルトの名無しさん
2005/06/27(月) 16:25:15class tag_boke;
class Aho {
tag_boke* m_Boke;
};
0913デフォルトの名無しさん
2005/06/27(月) 16:27:48この行があれば充分だけど
0914デフォルトの名無しさん
2005/06/27(月) 16:33:01いちいち#ifndef LPなんたらもめんどいし・・・。
0915デフォルトの名無しさん
2005/06/27(月) 16:33:22struct tag_boke;
typedef struct tag_boke* LPBOKE;
0916デフォルトの名無しさん
2005/06/27(月) 16:45:570917デフォルトの名無しさん
2005/06/27(月) 16:49:40#include "boke_fwd.h"
0918デフォルトの名無しさん
2005/06/27(月) 17:08:37コレが出来たら何でもありじゃん。
//struct struct_boke
//{
//int a;
//};
class class_boke
{
int a;
};
__if_exists( ::struct_boke)
{
class aho
{
::struct_boke* pboke;
};
}
__if_exists( ::class_boke)
{
class aho
{
::class_boke* pboke;
};
}
0919918
2005/06/27(月) 17:14:23今回のケースでは役に立たんね ガクッ(x_x;
0920デフォルトの名無しさん
2005/06/27(月) 18:30:29ツールってないのでしょうか?
http://www.kmonos.net/alang/boost/classes/test.html
こんな感じのホームページにしたいです
0921デフォルトの名無しさん
2005/06/27(月) 18:50:17お前はそこの管理人よりもずっと頭が悪いんだから無理です。
そいつは東大の学生だぞ。
0922デフォルトの名無しさん
2005/06/27(月) 19:03:04なんちゅー答えだw
お前は馬鹿というより幼い感じだな。
0923デフォルトの名無しさん
2005/06/27(月) 19:14:090924デフォルトの名無しさん
2005/06/27(月) 19:34:42そんな阿呆な質問してる奴のソースなんて、見せられても逆に困る。
0925デフォルトの名無しさん
2005/06/27(月) 20:54:43htmlのソース見てコピペすればすむことだろ。
0926デフォルトの名無しさん
2005/06/27(月) 20:59:22そしてboostに例があったりする
ttp://www.boost.org/libs/regex/doc/regex_replace.html#examples
0927デフォルトの名無しさん
2005/06/27(月) 22:37:480928デフォルトの名無しさん
2005/06/27(月) 23:32:310929デフォルトの名無しさん
2005/06/27(月) 23:43:28色とか付けたいってコトだろ
0930デフォルトの名無しさん
2005/06/28(火) 01:25:030931デフォルトの名無しさん
2005/06/28(火) 09:44:580932デフォルトの名無しさん
2005/06/28(火) 10:53:53グローバル変数は1つも使うべきではいないのでしょうか。
使ったほうが便利なケースはいくらでもありそうな気がして
ならないのです。
設計のスキルはまだ全然ないのですが、他のソースを
リバースエンジニアリングしてみてもほとんどのソースで
グローバル変数が使用されている様子ですが・・・。
0933デフォルトの名無しさん
2005/06/28(火) 10:59:220934デフォルトの名無しさん
2005/06/28(火) 11:00:20グローバル変数の是非はC++に限らず。
http://www.google.co.jp/search?q=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0
0935デフォルトの名無しさん
2005/06/28(火) 11:00:28とは言っても、グローバル変数はいくらでも使われてるだろうけど。
errnoとかcoutとかだって、その一種と言えないこともないし。
0936デフォルトの名無しさん
2005/06/28(火) 11:05:53糞ソースばかり読むな
0937デフォルトの名無しさん
2005/06/28(火) 11:30:380938デフォルトの名無しさん
2005/06/28(火) 11:47:00糞ソースじゃないソースを提示してみろと言ってみる
0939デフォルトの名無しさん
2005/06/28(火) 12:19:57提示できるソースをいきなりホイホイ挙げられるかよ
0940デフォルトの名無しさん
2005/06/28(火) 12:24:16逆ギレキタ━━━━(゚∀゚)━━━━!!
0941デフォルトの名無しさん
2005/06/28(火) 12:38:250942デフォルトの名無しさん
2005/06/28(火) 17:44:410943デフォルトの名無しさん
2005/06/28(火) 19:50:08ソースコードを強調表示されたhtmlにしたいときは、漏れなら
-gvimのhtml変換機能で出力させる(ページがphpなら出力ファイルをinclude)
-wiki(pukiwiki codeプラグインなど)を使う
ttp://pukiwiki.org/index.php?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2Fcodehighlight.inc.php
あたりを考える。
クラスの関係図とかまで出力したいときはdoxygenなのかもしれないけど
そういう設計レベルの図が必要な場合、設計段階で図を書いてるし
わざわざ使うほどのものでもないかなと。
>>928
実はPREタグの場合、template <class T>と書けない。
html special charsは<や>にしないといけない。
このフィルタを書こうとすると、「やっぱり色つきにしたい」などと夢がふくらむ罠
そしてそれは激しく車輪の再発明に。(もちろん、勉強のためにはおもしろい題材だけど)
0944デフォルトの名無しさん
2005/06/28(火) 20:16:43背景として、C++に限らずlisp・perl・おぞましいN88-BASICなどのソースコードも
提示することがあるから、それらすべてに対応してる既存品が楽かなと。
>>932
真にグローバルな変数は使わない方がいいと思う。
他のプロジェクトではもっとまともなのかもしれないけど、
過去のC/BASIC/Fortranのソースコードから再利用したり
担当者が4人ほど変わって引き継いだりそもそも担当はプログラム経験がほとんどない人だったり
仕様が毎日か長くて毎週変わったり
それを5年ほど続けると、もうすごいことになっています。
・・・結論まで書こうと思ったが鬱になったのでもうどうでもいいや…
0945デフォルトの名無しさん
2005/06/28(火) 22:37:330946デフォルトの名無しさん
2005/06/28(火) 22:38:56というのが、今回の問題です。
0947デフォルトの名無しさん
2005/06/28(火) 22:43:230948デフォルトの名無しさん
2005/06/28(火) 22:45:040949デフォルトの名無しさん
2005/06/28(火) 23:02:40グローバルで管理したい理由、プログラムの規模、プログラムの寿命などによって答えは変わる。
0950デフォルトの名無しさん
2005/06/29(水) 00:13:31規模なんて相対的だし。客観的な表現方法ってあるの?
0951デフォルトの名無しさん
2005/06/29(水) 00:58:13C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
専用の別スレがあるライブラリ(Boostなど)や
開発環境、IDE(VC++など)に関する質問はそちらにお願いします。
前スレ part40(実質41)
http://pc8.2ch.net/test/read.cgi/tech/1113408957/
0952デフォルトの名無しさん
2005/06/29(水) 10:41:33News 2005-06-28: C++ Standard Core Language Issues List (Revision 36) is available
0953デフォルトの名無しさん
2005/06/29(水) 14:02:21「プログラムの規模」って言いたかっただけでは?
0954デフォルトの名無しさん
2005/06/29(水) 16:16:10明確な基準はないと思うけど、
「いつ、どこで、どんな操作がされるかを把握できる」
かどうかに懸かってるんじゃなかろか。
例えばログファイルにメッセージ書くクラスがあって
それが「書き込み」という操作しかなければ
グローバルにインスタンス作ってもいいわけで。
0955デフォルトの名無しさん
2005/06/29(水) 16:44:44publicでstaticな変数との違いは、
クラス宣言に書く必要が無いからこっそり使ったりする事が可能だって事と、
大規模なプログラムの場合、名前の衝突が管理出来なかったり、
VCみたいな賢いIDEが使えない場合に型の確認が面倒だって事くらいだろう。
publicでstaticな変数にも共通する欠点は色々あるから、
それを許すかどうかもはっきりさせた方がいいわな。
どっちにしろ、「使わなくても出来るけど手抜きでやってる」って事を意識しとくべき。
0956デフォルトの名無しさん
2005/06/29(水) 16:50:540957デフォルトの名無しさん
2005/06/29(水) 17:48:09まぁクラスにきちんとまとめて、それも全部publicとかじゃなくて丁寧にアクセス制御しとくんだろうな
0958デフォルトの名無しさん
2005/06/29(水) 19:58:18ふぬおおおソースがきちゃなくなるんじゃあああヾ(`□´)ノ
0959デフォルトの名無しさん
NGNGVC++6.0ではネストできんかった。
VC++.NETではネストできた。
0960959
NGNG0961デフォルトの名無しさん
2005/06/29(水) 23:08:21g++だと意図的に対応していないようであります
標準のappendixで禁止しているかららしい。
関数内関数定義とか、templateの宣言・定義の簡略化とか
C++0xで変わったらいいなあ。
0962デフォルトの名無しさん
2005/06/30(木) 01:08:310963デフォルトの名無しさん
NGNGとりあえずフレームワークさえ構築してしまえば
表だったグローバル変数は使わなくて済むと思う。
まぁ俺は安易にグローバル変数使っちゃう族だが。
0964デフォルトの名無しさん
2005/06/30(木) 02:04:380965デフォルトの名無しさん
2005/06/30(木) 02:10:20結局、STLはここでいいんだよね?
0966デフォルトの名無しさん
2005/06/30(木) 02:28:18いいはずでしょ、標準の一部だし。
0967デフォルトの名無しさん
2005/06/30(木) 03:17:570968デフォルトの名無しさん
2005/06/30(木) 07:30:170969デフォルトの名無しさん
2005/06/30(木) 15:39:33-1.#IND000000000
-1.#INF000000000
こんな数字が変数に入ってるんだけどこれは何なのでしょうか?
0970デフォルトの名無しさん
2005/06/30(木) 16:24:42数値以外の値。
前者はなんだろう。
後者は負の無限大かな?
いずれにしても、C++の問題というよりデバッガの問題だよな。
0971デフォルトの名無しさん
2005/06/30(木) 16:39:510972デフォルトの名無しさん
2005/06/30(木) 16:56:01前者は「不定」で恐らくは-0/0の結果。
後者は「無限大」で恐らくは-1/0の結果。
0973デフォルトの名無しさん
2005/06/30(木) 17:24:04DirectXのD3DXVECTORぐらいでいいのですが、環境に依存しないやつほしいです。
0974デフォルトの名無しさん
2005/06/30(木) 17:33:480975デフォルトの名無しさん
2005/06/30(木) 17:44:42ttp://www.objectclub.jp/download/vecmath1
こんなん?
0976デフォルトの名無しさん
2005/06/30(木) 17:59:58gslとかliboctaveとか
0977デフォルトの名無しさん
2005/06/30(木) 18:09:53Indeterminate
0978デフォルトの名無しさん
2005/06/30(木) 18:51:49boostのベクトルも探してる最中なんですが、
2次元3次元のベクトルよりquaternion、octonionやらが先に見つかってしまいます。
どこかな・・・。
>>975-976
ありがとうございます。
そーゆーのです。
といってもいろいろあると目移りしてしまいます・・・。
0979デフォルトの名無しさん
2005/06/30(木) 19:02:32>どこかな・・・。
ublas
0980デフォルトの名無しさん
2005/07/01(金) 01:13:04自分は今までプログラムをやった事がないものの、来週からC++をやろうとしています
ここで質問ですが、C++をやるに当たって最初に必要なものはなんでしょうか?何か買う必要があるのでしょうか?
幾ら調べても本当にわけが分かりません、コンパイラーというのが有れば出来るものなのでしょうか?ご指導をよろしくお願いいたします。。
0981デフォルトの名無しさん
2005/07/01(金) 01:17:13コンパイラーと、あとはテキストエディタが要るだろうな。
しかしここはスレ違いだ。
何か始めて、行き詰まったらまず↓こっち行け。
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
ここの過去ログやリンクを漁れば、初心者の質問は大抵カタがつく。
0982デフォルトの名無しさん
2005/07/01(金) 01:20:18どうして突然C++をやることになったのかが興味がわきますね。
とりあえず友達にプログラマを見つけて、ある程度のレベルまでは教えてもらうのが早いかと。
0983デフォルトの名無しさん
2005/07/01(金) 01:24:04Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/6-12
0984デフォルトの名無しさん
2005/07/01(金) 02:28:49A a[10];
for( A* i = a; a != a + 10; ++a )
a->a = 10;
これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
0985984訂正です
2005/07/01(金) 02:29:38A a[10];
for( A* i = a; i != a + 10; ++i )
a->a = 10;
これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
0986デフォルトの名無しさん
2005/07/01(金) 02:30:36プログラミングやってる奴がキモいです><
ttp://ex11.2ch.net/test/read.cgi/news4vip/1120152486/
0987デフォルトの名無しさん
2005/07/01(金) 02:45:23using namespace boost::lambda;
std::for_each(a, a + 10, bind(&A::a, _1) = 10);
0988デフォルトの名無しさん
2005/07/01(金) 02:50:27boost::bind ではなく boost::lambda::bind だけど。
#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
namespace bl = boost::lambda;
std::for_each(&a[0], &a[10], bl::bind(&A::a, bl::_1) = 10);
0989デフォルトの名無しさん
2005/07/01(金) 03:10:18lambdaを使うんですね、ありがとうございました。
0990デフォルトの名無しさん
2005/07/01(金) 05:13:32{
public:
result_type operator( ) ( argument_type i ){}
};
std::vector< int > v;
boost::bind( &std::for_each, _1, _2, _3)( v.begin(), v.end(), func());
すいません、また教えてください・・
VisualC++7.1なんですが、これのコンパイルが通りません。
error C2780が大量に出ます。さっぱりわかりません。
0991デフォルトの名無しさん
2005/07/01(金) 05:44:56&std::for_each< std::vector< int >::iterator, func > に直しましたが
まだ駄目です。
bind関数の一番目の引数である「v.begin()」に対して
「1 番目の引数を '_STL::vector<_Tp>::iterator' から '_STL::vector<_Tp>::iterator & ' に変換できません。」
「'const' に対してではない参照は 非左辺値へバインドできません。」
とでます。どういう意味でしょうか?
0992デフォルトの名無しさん
2005/07/01(金) 06:24:00型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート:
template <typename lhs, typename rhs>
struct is_equal {
tempalte <typename T> struct proxy { enum { type = false }; };
template <> struct proxy<rhs> { enum { type = true }; };
enum { type = proxy<lhs>::type };
};
は、explicit specialization in non-namespace scopeエラーとなりコンパイルできません。
そこで、proxyクラステンプレートをnamespaceスコープで特殊化することになりますが
この書き方がサッパリわかりません。
外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
コンパイラはgcc-3.3.3です。
>>990
それはbind使う意味があるんでしょうか?
0993デフォルトの名無しさん
2005/07/01(金) 06:34:31bind内部では参照がメインだからです。
boost::bind( &std::for_each<std::vector<int>::iterator&, func>, _1, _2, _3)( v.begin(), v.end(), func());
これでいいと思うよ。
0994デフォルトの名無しさん
2005/07/01(金) 08:04:40やってみて駄目だったんですが、
一時オブジェクトは非const参照には変換出来ないとわかりまして
以下のようにしたら通りました。
勉強になりました、ありがとうございました。
std::vector< int > v;
std::vector< int >::iterator b= v.begin();
std::vector< int >::iterator e= v.end();
boost::bind( &std::for_each< std::vector< int >::iterator, func >, _1, _2, _3)( b, e, func());
>>992
for( iterator i = v.begin(); i != v.end(); ++i){
for( iterator j = i->w.begin(); j != i->w.end(); ++j){
func( *j );}}
これを関数オブジェクトで書けないかと検討中だったんです。
しかし、bindやlambdaというのは使い道が見えません。
普通に直で関数オブジェクト書いちゃった方が楽な気がする・・
0995デフォルトの名無しさん
2005/07/01(金) 09:23:58ttp://boost.cppll.jp/HEAD/libs/lambda/doc/ar01s05.html#sect:nested_stl_algorithms
0996デフォルトの名無しさん
2005/07/01(金) 10:59:36StrToIntとかToIntという関数があるようですが,
これでは駄目なようで困っています.
�Aファイルから1行を切り出すにはどうすればいいんですか??
40文字ずつ改行しながら別のファイルに出力させていくという
プログラムを作りたいのですが,
char *c;
fileReader.get(c, number, '\n');
のようにしてnumberが21くらいになるとメモリがreadにならないという
エラーメッセージが出てきます.どうしてでしょうか??
0997デフォルトの名無しさん
2005/07/01(金) 11:21:46inline int stoi(const string& str) { return atoi(str.c_str()); };
関数名から予想するとBCBのようだけど、
AnsiString == String != std::string (!= CString)
なので注意ナ
「一行」切り出すのは、finをテキストモードで開いて
string str;
getline(fin, str);
40文字ずつ改行するならsubstrかカウンタ使う
漏れならperl使う
0998デフォルトの名無しさん
2005/07/01(金) 11:41:15>型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート
これだけが必要なら別に外側だけ特殊化すればよいような気がします.
>外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
これは言語規格的に無理です.
0999デフォルトの名無しさん
2005/07/01(金) 12:29:571000デフォルトの名無しさん
2005/07/01(金) 12:30:0910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。