C++相談室 part40

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ part39
http://pc8.2ch.net/test/read.cgi/tech/1106527792/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
2デフォルトの名無しさん:2005/04/14(木) 01:17:13
3デフォルトの名無しさん:2005/04/14(木) 01:17:40
4デフォルトの名無しさん:2005/04/14(木) 01:18:07
5デフォルトの名無しさん: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/ (日本語)
6デフォルトの名無しさん:2005/04/14(木) 01:22:33
7デフォルトの名無しさん:2005/04/14(木) 01:26:34
8デフォルトの名無しさん:2005/04/14(木) 01:28:55
9デフォルトの名無しさん:2005/04/14(木) 01:29:27
10デフォルトの名無しさん: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/
11デフォルトの名無しさん:2005/04/14(木) 01:35:16
おつかれさん
12デフォルトの名無しさん:2005/04/14(木) 01:42:36
強引にSTLスレを独立させる気だな。
標準ライブラリのそのまた一部の機能だけ
スレを分割するなんて意味ないぞ。
13デフォルトの名無しさん:2005/04/14(木) 02:03:25
STLつかうと一気に実行ファイルサイズが10倍に?!
14デフォルトの名無しさん:2005/04/14(木) 02:04:11
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
15デフォルトの名無しさん:2005/04/14(木) 02:04:47
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
16デフォルトの名無しさん:2005/04/14(木) 02:05:37
#include <stdafx.h>

後氏ね。
17デフォルトの名無しさん:2005/04/14(木) 02:06:27
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
18デフォルトの名無しさん:2005/04/14(木) 02:40:07
>>15>>16の間

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
19デフォルトの名無しさん:2005/04/14(木) 02:44:50
>>1
乙。
20デフォルトの名無しさん:2005/04/14(木) 02:49:17
>>18
warota
21デフォルトの名無しさん:2005/04/14(木) 03:47:02
>>1
実は part41 にしないといけなかったのかもしれない。
ttp://pc8.2ch.net/test/read.cgi/tech/1106527792/41-42
22デフォルトの名無しさん:2005/04/14(木) 03:53:10
次スレを part42 にして 1 は↓でよろしいか?

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
専用の別スレがあるライブラリ(Boostなど)や
開発環境、IDE(VC++など)に関する質問はそちらにお願いします。

前スレ part40
http://pc8.2ch.net/test/read.cgi/tech/1113408957/
23デフォルトの名無しさん:2005/04/14(木) 08:02:46
ったく、スレもまともに立てられねえのかよ。クズが。
24デフォルトの名無しさん:2005/04/14(木) 09:38:54
>>22
いんでない
25デフォルトの名無しさん:2005/04/14(木) 12:39:08
list末尾に要素を追加し、次にその要素を操作しようと思っています。
管理の楽さから、ポインタを渡さない様にしようと思い、つまずきました。
コンストラクタに引数が無い場合は、どう末尾に生成すれば良いのでしょうか

#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;
}
26デフォルトの名無しさん:2005/04/14(木) 12:45:26
push_back(TestB());
2725:2005/04/14(木) 12:52:31
>>26
ありがとうございました、助かりました
28デフォルトの名無しさん:2005/04/14(木) 17:21:58
「リファレンス」の配列は作れないのかな。

 int 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
29デフォルトの名無しさん:2005/04/14(木) 17:30:27
>>28
作れない
30デフォルトの名無しさん:2005/04/14(木) 17:38:52
>>28
ISO/IEC 14882:1998
8.3.2.4
「There shall be no references to references, no arrays of references,
and no pointers to references.」
31デフォルトの名無しさん:2005/04/14(木) 17:39:14
>>18
俺もC1010出る。
ちなみに#include "stdafx.h" は全部に入ってる。
他の原因ってないっすか?
32デフォルトの名無しさん:2005/04/14(木) 17:47:35
>>29-30 ありがとうございます。
33デフォルトの名無しさん:2005/04/14(木) 17:51:54
>>31
これ新しいテンプレ?
34デフォルトの名無しさん:2005/04/14(木) 17:52:01
>>31
<stdafx.h>ではなくて?
35デフォルトの名無しさん:2005/04/14(木) 17:55:14
>>34 ""も<>もやってみたけどダメでした。
ちなみにやった事は、アプリケーションWIZでWIN32アプリを作り、
それにcppとhを1つづつ追加しただけす。
追加したソースは他のアプリで使ってたんで問題ないと思います。
という感じです。
>>33 テンプレちがう。
36デフォルトの名無しさん:2005/04/14(木) 18:02:11
すんません。直りました。
ヘッダーのinclude行より前に書いたら直りました。

ごめんなさい。
37デフォルトの名無しさん:2005/04/14(木) 20:06:29
マクロに渡された引数が定数かどうか
判断するにはどうしたらいいのかな?
38v(^・^)v:2005/04/14(木) 22:33:22
v(^・^)v
39デフォルトの名無しさん:2005/04/15(金) 00:03:39
>>30と関連するけど
参照メンバに対してoffsetofを使おうとすると、鼻から悪魔が。
まあ、大抵の実装でぬるぽ。
40デフォルトの名無しさん:2005/04/15(金) 00:28:51
>>37
どうにもこうにも
41デフォルトの名無しさん:2005/04/15(金) 00:34:04
マクロを処理するプリプロセスの段階では構文解析はしないしな
42デフォルトの名無しさん:2005/04/15(金) 00:34:37
カエサルの物はカエサルへ
マクロの物はマクロで
43デフォルトの名無しさん:2005/04/15(金) 00:58:44
>>39
メンバの型は直接関係無くて、POD以外の型にoffsetof使った時点でアウト。
44デフォルトの名無しさん:2005/04/15(金) 01:27:02
熊本大学が中国にクラッキングされた。
http://www.kumamoto-u.ac.jp/

反撃したいやつは、VIP板に集合
http://ex10.2ch.net/news4vip/index.html
45デフォルトの名無しさん:2005/04/15(金) 08:21:30
>>39
ガッ
46デフォルトの名無しさん:2005/04/16(土) 14:11:45
メモリリーク関連のテクニックだけ扱った書籍というのはあるのでしょうか?
メモリリークを検知するツール何が一番よいと思いましたか?
47デフォルトの名無しさん:2005/04/16(土) 18:00:40
漏れは仕事ではBoundsChecker使ってるけど
自前の時はVCランタイム任せ…
48デフォルトの名無しさん:2005/04/16(土) 18:39:30
気にするな、年とともに漏れなくなる。
49デフォルトの名無しさん:2005/04/16(土) 18:45:59
寧ろ漏れ易くなるような……
50デフォルトの名無しさん:2005/04/16(土) 18:47:51
(−ω−)
51デフォルトの名無しさん:2005/04/16(土) 21:19:46
参照渡しって結局なにを渡してるんですか?
52デフォルトの名無しさん:2005/04/16(土) 21:24:31
アドレス
53デフォルトの名無しさん:2005/04/16(土) 21:31:11
なんのですか?
オブジェクトですか?
オブジェクトなら入れる入れ物はポインタじゃないんですか?
5453:2005/04/16(土) 21:32:11
失礼、↑は53です。
さらに、ポインタじゃなくてポインタ変数でした。
55デフォルトの名無しさん:2005/04/16(土) 21:32:27
値渡し、参照渡し、名前渡し、矢切の渡し
さて無いのはどれだ?
56デフォルトの名無しさん:2005/04/16(土) 21:37:58
必要呼び出し
57デフォルトの名無しさん:2005/04/16(土) 21:39:28
>>53
メモリに「なにか」が格納されている領域の先頭アドレス。
58デフォルトの名無しさん:2005/04/17(日) 03:27:38
ポインタ渡し
a = &b + &cとかいやだから作ったってはげが言ってた
59デフォルトの名無しさん:2005/04/17(日) 09:29:35
住所を書いた紙をコピーしたと思えばよろし
60デフォルトの名無しさん:2005/04/17(日) 18:26:04 BE:128847839-
>>58
それをいうなら *a = *b + *c がいやだから、じゃないか?
61デフォルトの名無しさん:2005/04/17(日) 20:41:14
>>51
文字通り参照を渡してるんだよ。アドレスとかなんとか余計なことは考えなくてよろしい。
62デフォルトの名無しさん:2005/04/17(日) 23:59:02
実態はポインタ渡してるのとほぼ同じ。
63デフォルトの名無しさん:2005/04/18(月) 00:00:38
>>59
コピーしたらまずいんでね?オブジェクトの場合。
64デフォルトの名無しさん:2005/04/18(月) 00:13:08
>>63
「アドレスを保持した変数をコピー」と読み替えるんだろ。何かまずいか?
65デフォルトの名無しさん:2005/04/18(月) 02:12:33
より分かりづらいという意味でならまずいかも
66デフォルトの名無しさん:2005/04/18(月) 14:25:21
でも、実質、アドレス私。
67デフォルトの名無しさん:2005/04/18(月) 14:32:39
>>66
なぜカタコト
68デフォルトの名無しさん:2005/04/18(月) 22:23:08
禿も関数は参照渡しよりポインタ渡しを使えと言ってるしな
69デフォルトの名無しさん:2005/04/18(月) 23:38:56
back_inserterってエロくない?
70デフォルトの名無しさん:2005/04/18(月) 23:52:29
>>69
ガイシュツ。そして歴史は繰り返す。
71デフォルトの名無しさん:2005/04/19(火) 00:02:31
人間は学習しない。
72デフォルトの名無しさん:2005/04/19(火) 10:35:28
std::back_inserter
スタンディング・バックインサーター
73デフォルトの名無しさん:2005/04/19(火) 10:54:03
つまんね
74デフォルトの名無しさん:2005/04/19(火) 19:29:42
std::back_inserter
sexually transmitted diseases・back inserter
75デフォルトの名無しさん:2005/04/20(水) 14:15:45
Boost の Sandbox Files に、次期標準ライブラリに組み込まれる予定の
ライブラリ一覧( Boost-TR1 )が加わってるみたい。

現在 std::tr1 名前空間が利用されている模様
76デフォルトの名無しさん:2005/04/20(水) 14:28:05
あ、でも… <hash> が無いから、unorderd_map と、unorderd_set が無いのか
77デフォルトの名無しさん:2005/04/20(水) 23:03:26
>現在 std::tr1 名前空間が利用されている模様
というかTRの文面でその名前空間を使えと指定してますからね
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1711.pdf
78デフォルトの名無しさん: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
}
79デフォルトの名無しさん:2005/04/20(水) 23:43:36
これはおもしろい。
というかall 1になるのは反則だな。
8078:2005/04/21(木) 01:10:19
型のbit数以上のシフトの結果が保証されてナインかな...。
#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
81デフォルトの名無しさん:2005/04/21(木) 01:12:13
上のほうはコンパイル時に((0xFFFFFFFFU >> 32) << 32)が展開されて
0にされているのかな。
8281:2005/04/21(木) 01:13:13
あ、上のほうはこれで問題ないのか。すまん。
83デフォルトの名無しさん:2005/04/21(木) 02:47:20
BCC 5.5.1 は両方とも 11111111111111111111111111111111 になった
84デフォルトの名無しさん:2005/04/21(木) 03:54:20
> 型のbit数以上のシフト

そりゃダメだろー
85デフォルトの名無しさん:2005/04/21(木) 08:57:09
86デフォルトの名無しさん:2005/04/21(木) 09:01:41
ttp://www.kuzbass.ru/docs/isocpp/expr.html#expr.shift
"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の特性を反映しないんだろう。
87デフォルトの名無しさん:2005/04/21(木) 10:58:57
> 下位5ビットしか見られなくて

80386以降がそうだったかなー
88デフォルトの名無しさん:2005/04/21(木) 16:46:15
tryでgetsで得た値が配列を超えていた場合でもエラーが起きないようにしたいのですが、
tryが認識されません。
なぜでしょうか?
コードは長いので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;
}
89デフォルトの名無しさん:2005/04/21(木) 16:47:29
>>88の続きです
//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;}
}
}



90デフォルトの名無しさん:2005/04/21(木) 16:50:56
おいおい、点々とするばかりで片っ端からレスを無視か?
91デフォルトの名無しさん:2005/04/21(木) 16:52:02
>>88
お前のごみみたいなコードを何回も見ているこっちの身にもなってくれ。
つーか、根本的にC++(というよりCでさえ)理解できていない悪寒。
VBやってる方が幸せだと思われ。
92デフォルトの名無しさん:2005/04/21(木) 16:54:48
>>91
解決しました、ご迷惑をおかけしてすみませんでした。
スレを3つも巻き込んでしまってすみませんでした。
93デフォルトの名無しさん:2005/04/21(木) 17:27:08
マルチポストでスレ汚した挙句、「解決しました」の一言だけ。
せめてどうやって解決したのかくらい書けばまだ許せたのに。
94デフォルトの名無しさん:2005/04/21(木) 17:32:01
>>93
.cの拡張子でコンパイルしていたのでtryが機能しませんでした。
.ccpに変えると上手くいきました。
解決方法を書かなくてすみませんでした
95デフォルトの名無しさん:2005/04/21(木) 21:12:05
>>88
getsって例外吐いたっけ?
96デフォルトの名無しさん:2005/04/21(木) 21:24:02
new演算子について考えすぎてハゲそうになりました
1. 通常のnew演算子
・クラスのサイズのメモリを割り当て
・コンストラクタを呼ぶ
・deleteで解放する
2. operator new
・単に生のメモリを割り当てるだけ。コンストラクタは呼ばない
・解放する時はoperator delete ※malloc()みたいなモノ?
3. クラスでオーバーロードした operator new
・1で呼ばれる deleteで解放する
4. placement new
・既に確保してあるメモリブロック(共有メモリとか)上にインスタンスを作成する
・デストラクタは明示的に呼ぶ必要がある
・メモリの解放はメモリ獲得時の方法に依存する
の四種類という認識でいいんでしょうか
どこか詳しく解説しているサイト等あったら教えてください
97デフォルトの名無しさん:2005/04/21(木) 21:26:15
>>91
解決しませんでした。gets()は例外を投げない関数である事を忘れて
いました。
98デフォルトの名無しさん:2005/04/21(木) 21:31:28
>>97
istreamのメンバじゃない方のstd::getlineを使え。
99デフォルトの名無しさん:2005/04/21(木) 21:35:04
>>96
そのplacement newはnewのあとにくるnew-placementが
void*型一つの場合で、デフォルトの(<new>に定義されている)
operator new (std::size_t, void*)かこれと同じような実装の
operator new(std::size_t, void*)を使用する場合の話。
100デフォルトの名無しさん:2005/04/21(木) 21:36:17
>>96
4のplacement newを実現する方法が2と3のoperator new。
operator newは関数呼び出しの形式で使うとコンストラクタは呼ばれないが、演算子として使えばコンストラクタは呼ばれる。

operator deleteをオーバーロードすれば、そのoperator deleteを(演算子として)使うことによりデストラクタも呼ばれる。
10196:2005/04/21(木) 22:12:32
>>99
>>100
むう。難しい

関数として呼ぶ時と演算子として呼ぶ時で動作が違うという事ですか
かしこさが1あがった気がします
102デフォルトの名無しさん:2005/04/21(木) 22:20:35
>>101
平たく言うと演算子のnewは
1 適切なoperator newでメモリを確保
2 確保したメモリにオブジェクトを作る
ということをしている。
>>96の4でいうplacement newは1のステップを
渡されたポインタをそのまま返すという空の動作にすることで、
メモリ確保をせずオブジェクトの生成だけを行っている。
103デフォルトの名無しさん:2005/04/21(木) 22:30:35
Visual C++6.0 を使って参考書みながら勉強してるんですけど、
二項フレンド演算子関数の所で内部コンパイルエラーとなってしまいます。
friend coord operator+(coord ob1, int i);

単項フレンド演算子関数だと平気なのですが、原因わかる方いませんか?
friend coord operator++(coord &ob);


104デフォルトの名無しさん:2005/04/21(木) 22:35:09
二項演算子をメンバ関数にしちゃってるとか
つうかエラーメッセージを書こうよ
105103:2005/04/21(木) 22:41:32
class coord {
int 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からのコピペなんで間違ってはないと思うのですが。
106デフォルトの名無しさん:2005/04/21(木) 22:55:27
friend の二項演算子はクラスのメンバにできなかったと思うけど。
それより内部エラーは6.0の作りが悪い。
107103:2005/04/21(木) 23:10:17
そうなんですか。
となるとが左側に定数がくるような演算
temp = 10+ob;
が出来なくなるみたいなんですがしょうがないのかな

108デフォルトの名無しさん:2005/04/21(木) 23:11:33
普通の関数をfriendに
109_(._.)_: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' : 識別名を宣言するのに、型が指定されていません。
...
というエラーがでます。なぜでしょうか?

110デフォルトの名無しさん:2005/04/21(木) 23:16:35
質問です。環境は XP、VC++6.0 です。

ファイルのサイズを取得する方法はないでしょうか。
具体的には、

FILE* fp;
fp.fopen("hogehoge.dat", "r");

として、
long size = fp.GetFileSize();

のように行ないたいです。
よろしくお願いします。
111デフォルトの名無しさん:2005/04/21(木) 23:20:58
>>110
> fp.fopen("hogehoge.dat", "r");
これがまず無理。
112デフォルトの名無しさん:2005/04/21(木) 23:22:14
fp.fseek(SEEK_END);
って何のクラスだこれ
113デフォルトの名無しさん:2005/04/21(木) 23:23:49
>>111
ご指摘ありがとうございます。

fp = fopen("hogehoge.txt", "r");

long size = GetFileSize(fp);

に訂正します。
114デフォルトの名無しさん:2005/04/21(木) 23:24:01
>>109
windows.hをインクルードしてないからじゃないか?
115_(._.)_:2005/04/21(木) 23:26:13
>>114
ありがとうございます。コンパイルとおりました。
116デフォルトの名無しさん:2005/04/21(木) 23:27:19
>>113
GetFileSize((HANDLE)_get_osfhandle(_fileno(fp)), NULL)
117103:2005/04/21(木) 23:28:26
>>108
なるほど。ありがとうございました。
118デフォルトの名無しさん:2005/04/21(木) 23:28:51
>>107
とりあえずVCにSPを当ててみろ。
119デフォルトの名無しさん:2005/04/21(木) 23:29:16
>>112
もしかすると fseek は、ポインタ位置の増分を返してくれるのですか?
ありがとうございました、さっそく使用してみます。

>>116
こちらの方も検討してみます。
ありがとうございます。
120デフォルトの名無しさん:2005/04/21(木) 23:31:46
>>107
手元のVC6(SP6)だとすんなり通ったよ
121デフォルトの名無しさん:2005/04/21(木) 23:39:11
おまえら、ここは標準C++のスレだぞ
非標準ライブラリの話はスレ違い。
ほどほどにしろ。
122103:2005/04/22(金) 00:07:01
>>118,120
ありがとう。SP6にしたらコンパイルできました。
123デフォルトの名無しさん:2005/04/22(金) 00:27:00
VC6は糞。窓から投げ捨てろ。
124デフォルトの名無しさん:2005/04/22(金) 01:08:31
領事館の窓へ投げつけろ
125北京市:2005/04/22(金) 11:44:10
>>124
いやもう勘弁して下さい。
126デフォルトの名無しさん:2005/04/22(金) 22:22:09
本を読んでいたら、「仮想基底クラス」「非仮想基底クラス」
などという言葉が出てきたのですが、仮想基底クラスとは
どういうクラスを指すのですか?
virtualなメンバ関数のみのクラスってこと?
127デフォルトの名無しさん:2005/04/22(金) 22:24:41
>>126
そんくらいググれよボケ
128デフォルトの名無しさん:2005/04/22(金) 22:29:05
ダライアス継承でググれ
129126:2005/04/22(金) 23:22:58
ググっても仮想基底クラスという言葉を当たり前のように使ってる
とこしか・・・ orz
130デフォルトの名無しさん:2005/04/22(金) 23:31:22
>>129
ダイアモンド継承した時に、親の親クラスのインスタンスを一つに絞るおまじない
とでも覚えておくとよい。それ以外は、速度が遅くなるなどデメリットばかり。
131デフォルトの名無しさん:2005/04/22(金) 23:40:23
ダイアモンド継承がわかってれば質問しないだろ
Aから継承したB
Aから継承したC
BとCから継承したD
↑をダイアモンド継承という
132氷河:2005/04/22(金) 23:45:08
ダイヤモンドッ ダストォォォーーー
133126:2005/04/22(金) 23:45:51
う〜む、するってぇと、ダイアモンド継承するときに
親の親クラスがその仮想基底クラスじゃないとなると
ダイアモンド継承したクラスには、Aのインスタンスが2つ
あるってことか。じゃ、あいまいさが出てくるの?
134デフォルトの名無しさん:2005/04/22(金) 23:53:27
>>133
コンパイルして実験すればすぐわかる〜
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なのか?
 }
};
135126:2005/04/23(土) 00:46:52
やはりxへのアクセスはあいまいっすね
136デフォルトの名無しさん:2005/04/23(土) 23:07:58
>>134の場合で、BだけがAを仮想基底クラスとして継承しても
意味ないんですよね?
137デフォルトの名無しさん:2005/04/23(土) 23:15:55
>>136 聞く前に実験するなり調べるなりしろよ。
138デフォルトの名無しさん:2005/04/24(日) 05:22:36
139デフォルトの名無しさん:2005/04/24(日) 06:04:27
編み物?
140デフォルトの名無しさん:2005/04/24(日) 07:00:18
>>136
今だけ教えてあげよう。BだけがAを仮想基底クラスとして継承した場合、
Cから見てAのint xは仮想基底とはならず、やはりDで曖昧さが生じてしまう。

仮想基底の仕組みは、ポインタによく似ている。
詳しくはInside The C++ Object Modelの第3章当たりを読んでみて欲しい。
141デフォルトの名無しさん:2005/04/24(日) 08:18:20
>>138
BがなくてDが重複している。
142136:2005/04/24(日) 09:11:24
>>140
ありがとうございます。
どちらも仮想基底としなかった場合と同じようにあいまいになるようですが
内部的にはちょっと違いがあるってことですかね。
143デフォルトの名無しさん:2005/04/24(日) 20:58:05
>>138
「多重継承は犯罪です」スレを思い出したよ。
144デフォルトの名無しさん:2005/04/24(日) 23:50:22
>>138
なにこのダライアス継承
145デフォルトの名無しさん:2005/04/25(月) 12:59:27
「C++の重要性は高まっている」:同言語の生みの親が主張
http://headlines.yahoo.co.jp/hl?a=20050425-00000004-cnet-sci
146age:2005/04/25(月) 13:36:31
「C++の重要性は高まっている」:同言語の生みの親が主張
http://japan.cnet.com/news/ent/story/0,2000047623,20083118,00.htm
147デフォルトの名無しさん:2005/04/25(月) 15:13:12
「C++の重要性は高まっている」:同言語の生みの親が禿しく主張
http://japan.cnet.com/news/ent/story/0,2000047623,20083118,00.htm
148デフォルトの名無しさん:2005/04/25(月) 20:37:34
コンパイルタイムのチューリング完全性が分かったとき
毛が増えたらしい
149デフォルトの名無しさん:2005/04/25(月) 21:51:48
C++の重要性っていっても、はたしてこの言語を使いこなせる奴が
どれだけ出てくるのかって問題もあるんじゃ・・・。
次の標準化で少しは光が見えてくるのかしら。
150デフォルトの名無しさん:2005/04/25(月) 22:28:22
C++が出て何年たったの?いまさら重要性って言われてもねぇ。
151デフォルトの名無しさん:2005/04/25(月) 23:13:24
年の問題じゃないだろ。
152デフォルトの名無しさん:2005/04/26(火) 01:03:25
だらだらやってるのが問題だろ。
153デフォルトの名無しさん:2005/04/26(火) 02:02:44
禿げているのが一番の問題。
154sage:2005/04/26(火) 11:38:22
ちょっと気になったので、誰か教えて。
C++では、標準Cライブラリの識別子(マクロを除く)は名前空間std内に宣言/定義されるよね。
でもerrnoはマクロと識別子のどちらであるか規定されないってあるんだけど。
それって、単にerrnoって書くべきか、std::errnoって書くべきか、処理系よって異なるってこと?
参照してる情報が間違ってるのかしらん。
stdoutとかも良くわからん…
155デフォルトの名無しさん:2005/04/26(火) 11:39:17
sage間違えた。。鬱だ。。
156デフォルトの名無しさん:2005/04/26(火) 13:35:38
17.4.1.2 - Headers [lib.headers]
-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]

だそうだ
157デフォルトの名無しさん:2005/04/26(火) 19:29:36
訳:Cでマクロとして定義されてる名前はC++でもマクロなんだよ!
158デフォルトの名無しさん:2005/04/26(火) 20:34:14
訳(追加):Cでは関数として実装しても良いヤツもC++ではマクロなんだよ!
159デフォルトの名無しさん:2005/04/26(火) 20:45:16
17.4.1.2 ヘッダ -5
たとえCが処理系に対して関数として実装する許可を与えていても、Cにおいて
マクロとして定義されている名前はC++標準ライブラリにおいてもマクロとして
定義されなければならない。
[注釈:Cにおいてマクロとして定義されている名前には次のものが含まれる:
assert、errno、offsetof、setjmp、va_arg、va_end、そしてva_start。--- 注釈終]
160154:2005/04/26(火) 21:51:18
おお、なるほどなるほど。
疑問が解けました。
ありがとです。
161デフォルトの名無しさん:2005/04/27(水) 00:12:21
VC++だとシングルスレッドの時だけstd名前空間にもあるというおかしなことになってるな
boost::compatibilityなんかはほんとに.hをincludeしてるだけだ。男気がある
162デフォルトの名無しさん:2005/04/27(水) 00:15:40
厳しく std 付けていこうとすると、どれがマクロなのか把握しないといけないし、
std::FILE とか禿しくキモい記述になったり、
setjmp がマクロだから std 無しで、 longjmp は関数だから std 付けて、とか、
正直やってらんない。
163デフォルトの名無しさん:2005/04/27(水) 00:40:56
正直、俺も、(規約で定められてなければ)C標準のものは
.hをincludeして、std付けないで使ってる。
そのやり方が非推奨だと知っていても。
164デフォルトの名無しさん:2005/04/27(水) 00:41:02
using namespace std;

「標準」 のものに名前空間なんかいらないと思うんだけどな
165デフォルトの名無しさん:2005/04/27(水) 01:02:56
後から標準ライブラリを増やすためだよ。
まぁ、結局unorderd_mapみたいになんだけどな。
166デフォルトの名無しさん:2005/04/27(水) 01:09:11
VC++8 には iostream.h は存在しない
167デフォルトの名無しさん:2005/04/27(水) 01:10:15
そんなおまいらに The C++ Standard Library Active Issue のお知らせですよ。

ttp://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つのスキーマの両方を明示的に認めることによって、たとえ手遅れだとしても、これを修正するべきである。」
168デフォルトの名無しさん:2005/04/27(水) 02:34:45
#include <cstdio>
struct 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() の両方が同時にオーバーライドされたことになってるんでしょうか?
エラーになるか、どちらか片方だけオーバーライドされると思っていたのに。
169168:2005/04/27(水) 02:38:59
↑のソースについて、追加で相談です。
A::f() と B::f() のそれぞれに C で別々の実装を与えるような
オーバーライドを行いたい場合はどうしたらいいんでしょうか?
170デフォルトの名無しさん:2005/04/27(水) 02:46:50
>>168
違う。CはA、Bのprivate継承なので、オーバライドになってない。
171168:2005/04/27(水) 03:00:24
>>170
C は struct で宣言しているので、継承は public です。
class で宣言して継承が private になっていたとしても、
オーバーライドになるかならないかに影響はありません。
172168:2005/04/27(水) 03:04:23
なんだか関連する記事を拾った予感。
http://www.gotw.ca/gotw/039.htm

なになに? "Renaming Virtual Functions"・・・
うわぁ・・・猛烈に納得いかねー。
173デフォルトの名無しさん:2005/04/27(水) 03:07:26
>>167
もう手遅れだけどな!
C++のライブラリ設計ってよく考えると結構キモス
174デフォルトの名無しさん:2005/04/27(水) 03:34:12
#include <cstdio>
struct 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;
}
175デフォルトの名無しさん:2005/04/27(水) 03:38:24
>>174 意味がわからん。
176デフォルトの名無しさん: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);
}
177デフォルトの名無しさん:2005/04/27(水) 11:44:32
>>176
char 1 つ分のメモリは確保されない。
確保されるとみなしてアクセスすると違反や領域破壊が起こる可能性がある。

処理系の実装にもよるが、一般に new char[0]; で返される領域の直前あたりに
メモリ管理情報のための領域が取られていたりするので、[0] でも使用メモリは
%>FOXE瘧ア増える。
178デフォルトの名無しさん:2005/04/27(水) 11:47:38
>>177
サンクスです。
179デフォルトの名無しさん:2005/04/27(水) 12:13:32
>>177
%>FOXE瘧ア増える。

ってなってるんだが俺だけ?
180デフォルトの名無しさん:2005/04/27(水) 12:25:14
operator new でサイズが 0 の時は
サイズを 1 にして確保するように規格で
決まってなかったっけ?
181デフォルトの名無しさん:2005/04/27(水) 12:36:11
>>180
#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!" が表示されるというのか?
182デフォルトの名無しさん:2005/04/27(水) 13:04:44
コンストラクタを呼び出すのは
operator newではなくてnew演算子だよ。
183デフォルトの名無しさん:2005/04/27(水) 13:06:43
あ、サイズが0で呼び出された時に確保される領域のサイズが1かどうかは知らね。
NULLでないこと、operator deleteを呼び出しても安全なこと、
このくらいしか決まってなかった気がするけど。
184デフォルトの名無しさん:2005/04/27(水) 13:37:26
new A[0] だけを例外的に扱うのは、コンパイラの実装の際に面倒だから、
こういう処理にしていると、どっかで禿が書いていたような気が……
185デフォルトの名無しさん:2005/04/27(水) 15:42:14
>>179
私もそう見えてます。

>>180
そうだったんですか?

>>184
なるほど。
186デフォルトの名無しさん:2005/04/27(水) 15:44:54
>>180
サイズ1っていっても、operator newからは型がわからんだろ。
1バイト?
187デフォルトの名無しさん:2005/04/27(水) 15:48:05
>>182
ずれてる。
188デフォルトの名無しさん:2005/04/27(水) 15:51:07
>>180
5.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.
189デフォルトの名無しさん:2005/04/27(水) 23:31:41
メモリブロックをクラスのコンストラクタで初期化したい場合、

p = new char[sizeof(Hoge)];
*p = Hoge(100);

このようにした場合一時オブジェクトのデストラクタも呼ばれてしまい、
パフォーマンス的にどうかなと思います。

そこで、
p->Point(100);
こんな感じでデストラクタのようにコンストラクタが呼べればいいのですがダメみたいです。
明示的にコンストラクタを呼ぶにはどうしたら良いのでしょうか?
190デフォルトの名無しさん:2005/04/27(水) 23:33:41
明示的にコンストラクタは呼べない
operator newを使うとか
191デフォルトの名無しさん:2005/04/28(木) 00:03:49
>>189
placement new
192デフォルトの名無しさん:2005/04/28(木) 00:06:51
p->Point::Point();
p->Point::~Point();
193デフォルトの名無しさん:2005/04/28(木) 00:09:04
>>189
190,191 はスルーしてるが、「メモリブロック」って何のこと言ってんの?
その例だけ見ると、 p = new Hoge(100) で何も問題ないように見えるんだが。
194191:2005/04/28(木) 00:19:11
俺は、任意のメモリブロック上にオブジェクトを構築したい、と解釈したんだがどうなんだろうな?
あと、一応突っ込んどくが

>*p = Hoge(100);
>このようにした場合一時オブジェクトのデストラクタも呼ばれてしまい、
>パフォーマンス的にどうかなと思います。

パフォーマンス以前に構築されてないオブジェクトに対し代入するのはだめよ。
195デフォルトの名無しさん:2005/04/28(木) 00:31:30
>> 190-192
placement newでも、
p->Point::Point(); でも確保済みのメモリブロックを初期化できるみたいですが、
この二つにビット的な違いはあるんでしょうか?

>>193
何らかのライブラリが返したメモリ領域とでも言えばよいでしょうか?
直接newで確保出来ない場合などです。
196デフォルトの名無しさん:2005/04/28(木) 00:36:00
p->Point::Point() こんなのコンパイルとおるのか?どのコンパイラ使ってんの?
197デフォルトの名無しさん:2005/04/28(木) 00:36:47
>>194
構築されてないオブジェクトとはどのような意味でしょうか…?
198デフォルトの名無しさん:2005/04/28(木) 00:39:09
>>196
察して頂けてると思いますが書き間違えで本来は
p->Hoge::Hoge();
です。
ええと VC++7.1です。

この呼び出し方は一般的に通用しない方法なんですかね。
199デフォルトの名無しさん:2005/04/28(木) 00:44:48
>>198
無い無い。VC++に騙されてる。忘れろ。
200デフォルトの名無しさん:2005/04/28(木) 00:46:11
コンストラクタの直接呼び出しは禁止されてたような・・・

>>197
必要なメモリ領域があるだけじゃだめで、コンストラクタで構築されて初めて使える。
201デフォルトの名無しさん:2005/04/28(木) 00:48:44
202デフォルトの名無しさん:2005/04/28(木) 00:58:41
>>199
VC++独自の解釈なんですね。
今回の事例では便利なんですがこれが普通だと理解してしまうのはちと危険ですかね。
placement newで実装してみます。

>>200, 201
言及ありがとうございました。
203デフォルトの名無しさん:2005/04/28(木) 13:27:23
ClassA 内に ClassB を持たせようと思い、下記のように書いたのですが、
error C2079: 'ClassA::classB' が 未定義の class 'ClassB' で使用しています。
というエラーメッセージが出てしまいます。
ClassA 内で ClassB をメンバ変数として持たせる方法を教えて下さい。
お願いいたします。

// クラスのプロトタイプ宣言
class ClassB;

// クラスA
class ClassA
{
public:
ClassB classB;
};

// クラスB
class ClassB
{
};
204デフォルトの名無しさん:2005/04/28(木) 13:40:57
>>203
ClassBをClassAの前に持ってくる。
205203:2005/04/28(木) 18:45:14
>>204
返信ありがとうございます。
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() { };
};
206デフォルトの名無しさん:2005/04/28(木) 18:57:20
>>205
B::Method1()の定義をClassAの宣言の後に書く。

あるクラスを使う場合、そのクラスの完全な宣言が必要になる。
コンパイラはファイルの先頭から順に解釈していく。
207デフォルトの名無しさん:2005/04/28(木) 20:42:01
new演算子を使い終了時にリークしていた時、
_CrtSetDbgFlagで正しく行番号をアウトプットに吐かせるには
どうしたら良いでしょうか
マクロで対応させれたと思うのですが、忘れてしまいまして、、。
宜しくお願いします
(´・ω・`)
208デフォルトの名無しさん:2005/04/28(木) 20:54:04
VC++スレの人が教えてくれるかと
209203:2005/04/28(木) 20:57:07
>>206
ありがとうございます。
おかげさまで解決できました。
210207:2005/04/28(木) 21:30:19
スレ違いでしたか、すみません
211デフォルトの名無しさん:2005/04/30(土) 02:09:25
あんまり知ってる人いないかもしれないけども、もしいたら教えてください。
アンドリュー・コーニグのC++再考(新装版)の話なんだけど、
第八章で式をつくる(そして計算する)プログラムつくるよね?
そんとき、コンストラクタの引数で直接Exprを渡してるのはなんで?
const Expr&で十分、というかその方がいいのでは?
たいして違わないと言われればそれまでだけど・・
212デフォルトの名無しさん:2005/04/30(土) 03:04:45
>>211
Unary_Node、Binary_Nodeで引数へのポインタを取っていて、
それがconstじゃないからまずいんでしょ。
213デフォルトの名無しさん:2005/04/30(土) 03:22:18
bool checkFrag(){ return (frag & 0x40); }

こんな感じのフラグチェック用メンバ関数を作りたいのですが、
「warning C4800: 'int' : ブール値を 'true' または 'false' に強制的に設定します」
という警告が出てしまいます。

boolでキャストしても駄目で…返値をintにすれば大丈夫なのですがその前に質問させてください。
bool返値のまま、警告を出さずに済むような方法は無いでしょうか。
214デフォルトの名無しさん:2005/04/30(土) 03:24:00
C4800 のヘルプを見ること。
215デフォルトの名無しさん:2005/04/30(土) 03:25:28
お恥ずかしい…ありがとうございました
216デフォルトの名無しさん:2005/04/30(土) 08:00:44
>>211
const Expr& だと、 std::auto_ptr は渡せない。
とかそういう話が出てくるからじゃないかな?
217デフォルトの名無しさん:2005/04/30(土) 11:56:58
宣言と定義の違いなんですが

class A; // クラスAの宣言

class A // クラスAの宣言&定義
{
void hoge(); // メンバ関数hogeの宣言
void foo() {} // メンバ関数fooの宣言&定義
int i; // メンバ変数の定義?
};

という認識であってますか?
218デフォルトの名無しさん:2005/04/30(土) 12:20:53
あってるんじゃないかな。
219デフォルトの名無しさん:2005/04/30(土) 12:31:57
> int i; // メンバ変数の定義?
これも宣言かつ定義。
220217:2005/04/30(土) 13:34:52
>>218-219
ありがとうございます。
宣言と定義の違いについて自信が持てるようになりました。
221デフォルトの名無しさん:2005/04/30(土) 15:58:26
int i; 
これって宣言でもあるの?
extern int i;
が宣言で
前者は定義かと思っていた・・・。
222デフォルトの名無しさん:2005/04/30(土) 16:11:42
>>221 宣言⊃定義
223222:2005/04/30(土) 16:17:41
ごめん。わかりにくいな。
宣言はコンパイラに名前を認識させるもの。
定義は名前と同時に、その名前に具体的な実体、意味を与えるもの。

定義ではない宣言はあり得る(class A; extern int i;)が、
宣言ではない定義はあり得ない。

うーん。たいしてわかりやすくなってないかも。
224デフォルトの名無しさん:2005/04/30(土) 16:37:19
>>223
hogeが名前空間のとき、
int hoge::i;
は定義だけど、宣言ではないんじゃない?
225デフォルトの名無しさん:2005/04/30(土) 17:00:32
>>224
その形でも、少なくとも文法上は宣言(および定義)。
しかしその形では、名前空間の中に新しい宣言を取り込ませることは
できないという制限があるので、実際に宣言の役割を果たすことは無い。

ttp://www.kuzbass.ru/docs/isocpp/decl.html#dcl.decl
"When the declarator-id is qualified,..."
226デフォルトの名無しさん:2005/04/30(土) 17:27:13
なるほど。
int i;
と似た形をしたものは全部宣言なんだな。
227211:2005/04/30(土) 20:19:11
>>212 >>216
ありがとうございます。
がしかし、実はよくわかってないです。。
引数へのポインタ?auto_ptr?えっ、何!?どこ!?という感じであります。
僕の書き方がまずかったのですが、「コンストラクタの引数」というのは
Exprクラスのコンストラクタ引数のことです。
各ノードクラスのコンストラクタ引数とデータメンバの型は、Exprが正しいと思います。
・・・で、Exprがコピーされる時には、実は内部のpがコピーされ、useが変えられてるだけ、ですよね。
そうすると、このExprコンストラクタの引数は参照で十分な気が、という話でした。
同じこと繰り返してすみません(;´Д`)
皆さんのレス書き留めておいて本と一緒にじっくり読ん
できま
す…
228デフォルトの名無しさん:2005/04/30(土) 23:36:42
(´・ω・`)ここでこんなこと聞いていいのかわからないがC++初心者にわかりやすく
解説している基礎本・入門本ってありませんかね?技術的なことは書いてなくてもいいのでわかればいいです。
それとC言語もやったことないのでそこのところよろ。
プログラム作ったりしたことあるのはPerl(現在停滞中)と学校であるVisual Basic(ぶっちゃけ簡単すぎて話にならry)です。

ちなみに>>6の見たんですがレビューみたところよさそうなのがThe C++ Programming Languageだけでレビュー見る限り初心者にはあまりむかないそうなのでorz
229デフォルトの名無しさん:2005/05/01(日) 00:54:27
>>228
ま、スレ違い。推奨図書のスレにどうぞ。

推薦図書/必読書のためのスレッド PART 23
http://pc8.2ch.net/test/read.cgi/tech/1112178595/
230デフォルトの名無しさん:2005/05/01(日) 20:51:21
>>228
>>6で入門書と言えるのはPrimerだけだと思われ
231デフォルトの名無しさん:2005/05/02(月) 04:27:28
template 引数を float とか double にするとエラーになるのは何故?
コンパイラの仕様?小数点はテンプレートで使えないの?
232デフォルトの名無しさん:2005/05/02(月) 06:27:18
>template 引数を float とか double にするとエラーになるのは何故?
>コンパイラの仕様?小数点はテンプレートで使えないの?
んなこたーない。
ソースとエラーメッセージを晒せ。
233デフォルトの名無しさん:2005/05/02(月) 07:21:59
テンプレート引数には型と整数しか渡せなかった予感。
234デフォルトの名無しさん:2005/05/02(月) 08:11:18
テンプレートの引数に渡せるのは、型・整数・テンプレートのいずれか。
235デフォルトの名無しさん:2005/05/02(月) 10:20:13
>>231
使えない。
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 .
236231:2005/05/02(月) 11:36:35
だめだあ。templateを使った事もない香具師が答えるなよ。
237デフォルトの名無しさん:2005/05/02(月) 12:22:57
正直テンプレートは、STLしか使った事がない。
238デフォルトの名無しさん:2005/05/02(月) 16:13:23
floatはいずれ使えるようになるんだろうか
あとmplなんかではテンプレートテンプレート引数は使っちゃ駄目ってことだけど
標準はどうする気なんだろう
239デフォルトの名無しさん:2005/05/02(月) 16:44:04
>>238
浮動小数点はなー。
template<float> class T; に対して、
T<10.0f> と、 T<1.0f * 10> が同じ型かどうか、
なんてのが問題になる限り、無いと思うよ。

> mplなんかではテンプレートテンプレート引数は使っちゃ駄目
こちら、解説きぼん。
240231:2005/05/02(月) 19:31:05
>>236
……

template <const double& D>
void f()
{ std::cout << D << std::endl; }

これくらいなら通るんですが、基本的にムリっぽいですね…
241デフォルトの名無しさん:2005/05/02(月) 20:34:21
>239
T<0.1f * 100> なんてのはもっと危ないな。
242デフォルトの名無しさん:2005/05/02(月) 21:03:50
>>238
>>239
> mplなんかではテンプレートテンプレート引数は使っちゃ駄目
MPLで言うところのメタ関数クラスに置き換わる方向性だと思うんですけれどね.
テンプレートテンプレート引数は対象とするテンプレート引数の個数を
決め打ちしないといけないので非常に使いづらいんですよ.
243デフォルトの名無しさん:2005/05/02(月) 21:13:49
>>240
それで不満なところは何?
244デフォルトの名無しさん:2005/05/02(月) 21:27:00
>>241
0.1f * 100 = 10.0f で float ってことで
×T<10>
○T<10.0f>
ってことにはならないの?
245デフォルトの名無しさん:2005/05/02(月) 21:34:57
>>244 意味がわからん。
246217:2005/05/02(月) 22:43:57
0.1f * 100 == 10.0f が真になるとは限らん。
247デフォルトの名無しさん:2005/05/03(火) 00:19:16
>>246
そんなことは分かっている。
それがわかったところで>244はやっぱりわからん。
ついでにその番号コテも意味がわからん。
248デフォルトの名無しさん:2005/05/03(火) 00:39:26
>246 は >244 へのレスではないだろうか。
249デフォルトの名無しさん:2005/05/03(火) 00:47:08
番号コテは消し忘れっス
250デフォルトの名無しさん:2005/05/03(火) 04:24:55
template Float<int bunshi,int bunbo>でいけ
251デフォルトの名無しさん:2005/05/03(火) 04:27:29
>>250 Float<1,2> と Float<2,4> が別々のインスタンスになってしまう件。
252デフォルトの名無しさん:2005/05/03(火) 10:15:53
固定小数点でやるしかないな
253デフォルトの名無しさん:2005/05/03(火) 10:49:46
>>251 約分してやれば無問題。ついでに言っとくがインスタンスの意味を取り違えてる。

問題は無理数をどうするかだ。
254デフォルトの名無しさん:2005/05/03(火) 10:57:17
>>253
正しいインスタンスの意味を教えてください。
255デフォルトの名無しさん:2005/05/03(火) 11:31:19
>>253
整数をベースに加減乗除とlogとexpを許した集合なら
がんばって比較できるんじゃないだろうか。
256デフォルトの名無しさん:2005/05/03(火) 11:32:11
インスタンスは実体。
int a=1, b=1; と宣言した場合aとbの内容は同じでも実体(インスタンス)は別ってことになる。
257デフォルトの名無しさん:2005/05/03(火) 11:37:23
>>256
型(クラス)のインスタンス(オブジェクト)と
テンプレートのインスタンス(型か関数)を混同してないか?
258デフォルトの名無しさん:2005/05/03(火) 11:44:52
>>253,256
「インスタンス」=「C++における型のインスタンス」と思い込んでいるようだが、そうではない。
「インスタンス」はモデルに対する実体を表す一般的な名詞。
259256:2005/05/03(火) 12:04:46
クラスのインスタンスとテンプレートのインスタンスを混同してた。orz

でも、この例だと素直にclass Float{ Float(double bunshi, doouble bunbo);} で欲ねーか?
260デフォルトの名無しさん:2005/05/03(火) 12:21:34
>>259
それなら typedef double Float; でいいんじゃね?

もう何がしたいのかわかんなくなってるな。発端は>231だと思うが。
261デフォルトの名無しさん:2005/05/03(火) 13:37:47
いままでの流れ。
・浮動小数点数をテンプレートに渡したい(>>231
・そのためには等値比較が必要(>>239)
・等値比較可能な数値表現として、有理数の提案(>>250)
・等値比較可能性もコンパイル時決定性もどうでも良くなった有理数(>>259
・当然の合理化(>>260)
262デフォルトの名無しさん:2005/05/03(火) 13:50:24
これでいけ

template< 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;
263デフォルトの名無しさん:2005/05/05(木) 20:02:02
gccでmakefileの依存関係を自動で出力するのありますよね[gcc -MM file.c]
bccやvcでは依存関係の自動出力などはありませんか?
264デフォルトの名無しさん:2005/05/06(金) 23:12:27
ふと思ったんですけどこんなことしても平気ですか?

int& ref = *new int;
delete &ref;
265デフォルトの名無しさん:2005/05/06(金) 23:14:38
http://n219078172160.netvigator.com/

っうぇっうぇwwwwwwうはっwwwおkwwwっ
っうぇwwwwwwっwwwwww
うぇwww


wwwwwwwwwwwwwwwwwwうはっwww
266デフォルトの名無しさん:2005/05/06(金) 23:36:54
>>264
ソースを書いてビルドして自分で試すよりも、2chに書き込んで返答を待つことを選んだわけだな?
267デフォルトの名無しさん:2005/05/06(金) 23:49:15
>>266
やってみてできた、ということと保証されているということは違うよ。
268デフォルトの名無しさん:2005/05/07(土) 00:19:03
>>264
それだけみると、大丈夫だろう。
何を心配している?
269デフォルトの名無しさん:2005/05/07(土) 20:34:12
質問です。
std::ostringstream s;
...sを使用
s.seekp(0,std::ios_base::beg);//再利用を試みたつもり。
...再び使用。

これで一応動作しているようなのですが、問題ありませんか?
検索したら、stringstreamでstr(string(""))すると書いてあったの
ですが、いまいち違いが分かりません。
(ついでに:ostringstreamとstringstreamの違いも分かりません)
よろしくお願いします。
270デフォルトの名無しさん:2005/05/07(土) 20:59:25
>>269
std::ios::failbitとかstd::ios::eofbitを立ててしまったら、s.clear();しとけよ。

それからstd::ostringstreamとstd::istringstreamを多重継承したのが
std::stringstreamってだけの話。当然std::ostringstreamは出力しか
できない。
271デフォルトの名無しさん:2005/05/07(土) 21:01:37
それからs.str("")はバッファをクリアするおまじない。
seekp()だけだと前に出力したゴミがくっついて出てこない?
272デフォルトの名無しさん:2005/05/07(土) 21:09:34
#include <iostream>
#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
}
273デフォルトの名無しさん:2005/05/07(土) 23:39:38
>>270さん
s.clear();も無条件につけとくことにします。

stringstreamも多重継承だっんたんですね。
iとかoで始まるものを見かけたら多重継承もあるかも
と考えた方が良さげですね。

>>271さん >>272さん
試したらゴミ出ました。同じ長さ以上の文字列で書き換
えていたので気づきませんでした、、

納得できました。有難うございました。
274デフォルトの名無しさん:2005/05/08(日) 10:39:20
ビッグエンディアンをリトルエンディアンにまたその逆の変換をする方法を教えてください
275デフォルトの名無しさん:2005/05/08(日) 11:04:04 BE:38820454-#
_asm { bswap eax; }
276デフォルトの名無しさん:2005/05/08(日) 17:41:32
>>274
片方ができればもう片方を作る必要はない。
変換対象が単一オブジェクトなら、
template<typename _Type> static inline void endian(_Type & val) {std::reverse(reinterpret_cast<char *>(& val), reinterpret_cast<char *>(& val + 1));}
277デフォルトの名無しさん:2005/05/08(日) 18:11:05
再帰を反復子に変換するアダプタってある?

278デフォルトの名無しさん:2005/05/08(日) 18:14:20
>>277
定型的に変換できるとは思えないので、無いだろうな。
あんたの言ってる「再帰」がもっと具体的な何かであれば、可能性は有る。
279不明なデバイスさん :2005/05/08(日) 20:29:21
>>276
そうだよ。
PCIバスに挿すカードやらIDE接続するドライブなんかはプラグ&プレイであってホットプラグではないだろ?
280デフォルトの名無しさん:2005/05/08(日) 21:37:48
>>277
効率悪くなるけど再帰からの出力を別スレッドからキュー経由で受け取ったものを順次読むならboost使って可能かもしれない
281デフォルトの名無しさん:2005/05/09(月) 23:00:38
初歩的質問ですが、オーバーロードできない演算子の中に「.*」が
あるようですが、これってどういう使い方のやつですか?
普通にa.*bみたいな感じ?こんなのありましたっけ?
282デフォルトの名無しさん:2005/05/09(月) 23:08:50
>>281
「メンバへのポインタ演算子」でぐぐってみ。
283デフォルトの名無しさん:2005/05/09(月) 23:10:35
>>281
メンバへのポインタの参照。
本当は *a.b と書きたいのだが、意味が変わってしまうので、新しく作られた。
純粋なCの*演算子とは意味が違い、アドレスではなくてオフセットのような
物が入っている。
284デフォルトの名無しさん:2005/05/09(月) 23:30:47
>282 のおかげですごく理解できた。
>283 のせいで混乱した。
285281:2005/05/09(月) 23:48:02
レスどうもです。
ぐぐってみたところ、メンバ関数のポインタから関数呼び出しする際に
使うようですね。これ以外は使い道ないですかね。
286デフォルトの名無しさん:2005/05/09(月) 23:59:38
別に関数じゃなくてもいいんだが。
287281:2005/05/10(火) 00:10:53
あ、そうですね。メンバを指すポインタからメンバを参照するときですね。
288デフォルトの名無しさん:2005/05/10(火) 00:32:10
http://www.open-std.org/jtc1/sc22/wg21/
News 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
289デフォルトの名無しさん:2005/05/10(火) 00:52:28
http://p5091-ipad02miyazaki.miyazaki.ocn.ne.jp/
wwwwwwwwwwwwっうぇおkwwwwwww

wうはっwwwwwwwwwっうはっwwwwwwwww
wwwwwwwwwwwwwwwwww
wwww
290デフォルトの名無しさん:2005/05/10(火) 06:42:26
いきなりC++から入る場合、何かよい参考書はありませんか?
291デフォルトの名無しさん:2005/05/10(火) 10:47:07
>>290
K&R
292デフォルトの名無しさん:2005/05/10(火) 11:38:23
>>291
ありがとう
とりあえず、アマゾンで注文してみました
293デフォルトの名無しさん:2005/05/10(火) 11:43:03
                |
                |
                |
                |
     /V\        ,J
    /◎;;;,;,,,,ヽ
 _ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
  ヾソ:::::::::::::::::.:ノ
   ` ー U'"U'
294デフォルトの名無しさん:2005/05/10(火) 14:19:43
C++のテンプレートと演算子のオーバーロードについて質問です。

template <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です。
よろしくお願いします。
295デフォルトの名無しさん:2005/05/10(火) 14:23:05
>>294
operator=だけは継承されない、と決められてた希ガス。
296デフォルトの名無しさん:2005/05/10(火) 14:23:34
>「二項演算子 '=' : 型 'int' の右オペランドを扱う演算子が見つかりません (または変換できません)。」
そりゃそうだ
297デフォルトの名無しさん:2005/05/10(火) 14:24:19
えぇ!?そうなんですか;;;
ごっつい初歩的な質問すみませんでした・・・。
298デフォルトの名無しさん:2005/05/10(火) 14:28:33
>>294
using Parent<int>::opereator=;
でなんとかなる。

>>295
へー。
299294:2005/05/10(火) 14:37:56
>> 298
なるほど・・・試してみましたが、ちゃんとできました。
これなら変更とかでも対応しやすそうなので充分です。
ありがとうございました!
300デフォルトの名無しさん:2005/05/10(火) 14:56:50
operator=が自身の参照を返さないのは
ちょっとキムチ悪いかも・・・
301デフォルトの名無しさん:2005/05/10(火) 15:02:25
>>294
デフォルトの(自動生成される)
Child::operator= があるので、
Parent<int>::operator= は隠される。
302デフォルトの名無しさん:2005/05/10(火) 16:07:42
コンストラクタもコピーコンストラクタもfriendも継承されないぞ。
303デフォルトの名無しさん:2005/05/10(火) 17:41:43
>>302
>コンストラクタ
派生クラスから基底クラスのコンストラクタにはアクセスできるわけだし
継承されないっていうのは違うのでは?外から呼ぶ方法がないだけで。
そもそも関数が継承されるってどういう意味なんでしょう?

この辺は可視性やアクセス権限の問題な気がします。
304デフォルトの名無しさん:2005/05/10(火) 21:17:02
>>303
それを言うならoperator=も呼べる。
305303:2005/05/10(火) 21:45:34
>>304
はい、呼べますよ。それが何か?
>>301が言っているように、オーバーロード解決のときに
Parent::operator= が考慮されないだけで。
306デフォルトの名無しさん:2005/05/10(火) 21:46:53
>>305
そういうのを「継承されない」って言うんだろうが( ゚Д゚)ゴルァ!!
307303:2005/05/10(火) 21:57:15
>>306
うーん、そうなんですかね。
関数を継承するってピンと来ないんですけど。
ヒマなんで規格書でも読んでみます。
308デフォルトの名無しさん:2005/05/10(火) 22:07:21
>>306
どうでもいいが、それだとprivate継承はどうなるんだ?
309デフォルトの名無しさん:2005/05/10(火) 23:55:18
継承のルールは他の関数と同じ。
>>301 が正解。
>>295,306 は間違い。
310デフォルトの名無しさん:2005/05/11(水) 02:26:02
つまり隠蔽されるわけか。
311デフォルトの名無しさん:2005/05/11(水) 03:34:14
つまり、private継承はオブジェクトの継承ではなくて実装手段の継承だね。
312デフォルトの名無しさん:2005/05/11(水) 09:37:04
>>311 なにが「つまり」だ?だれもそんな話してないぞ。
313デフォルトの名無しさん:2005/05/11(水) 10:16:10
つまり、ぬるぽか。
314デフォルトの名無しさん:2005/05/11(水) 11:04:01
>>313
いわゆるひとつのガッ
315デフォルトの名無しさん:2005/05/11(水) 14:54:47
コンストラクタ、コピーコンストラクタ、代入演算子、friend属性は
「継承されない」と書いているC++本多いね。糞、今まで騙されて
いたのか。
316デフォルトの名無しさん:2005/05/11(水) 14:56:47
まあね、クラスの外から見えないからって継承されてないわけじゃない
317デフォルトの名無しさん:2005/05/12(木) 00:35:58
>>315
friend属性は「継承されない」で正しい。
318デフォルトの名無しさん:2005/05/12(木) 04:20:15
printf とかのC標準関数が cstdio をインクルードしても
std 名前空間とグローバルの両方にあるんだけど、
これって規格的にはOKなの?
(VC .NET 2003)
319デフォルトの名無しさん:2005/05/12(木) 10:44:00
320デフォルトの名無しさん:2005/05/13(金) 01:14:19
つまり、sex friend属性は継承されないということですね
321デフォルトの名無しさん:2005/05/13(金) 01:45:05
実際、継承とかガンガン使ってるんですか?
渡しなんかは、明に継承なんてほとんど使ったこと無いです。
単純に、外に見えるようにpublic、外に出さないようにprivate、
ぐらいの感覚でしか使ってません。protectedの使う場面は無し。
まあ何と言いますか、変数管理のしやすさ程度に使ってるって感じです。
それでもCよりC++のほうが、classを使えたり、機能的にCより上なので、
C++のほうがいいかな、とは思ってます。
(というか、C++使うのは必然的なんですけどね。)。
322デフォルトの名無しさん:2005/05/13(金) 01:57:14
>>321
継承もそれなりに使っている。
話がややこしくなるからMFCは置いておくとして、ログファイルや設定ファイルなんかは仕様が似通うので
基本クラスを作っておいてそれを派生して使うことがしばしば。
この場合、コンストラクタをprotectedにして派生クラスでしか使えないようにしている。
後は、例えば読み込み関数は仮想化してフォーマットの違いに対応するくらいかな。
323322:2005/05/13(金) 01:59:06
>>322
いかん、冒頭に「私は」が抜けた。
まぁ、EffectiveC++でも読んでみるといいかも。
324デフォルトの名無しさん: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");
}
}
なように、最初に指定したファイルが読み込めなかった場合に違うところから
探すようにするときに不便になってしまいます。

何かいい方法はありませんでしょうか?
325デフォルトの名無しさん:2005/05/13(金) 07:21:42
>>824
ちょっと考えてこんなん出ました。

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) {
326デフォルトの名無しさん:2005/05/13(金) 11:57:36
>>322
それ、いいすね。良い事聞きました。
そういう使い方っていいなーって思いました。
私もやってみようっと。ありがとございました。
327デフォルトの名無しさん:2005/05/13(金) 13:59:10
virtual継承されたくないクラスがあるのですが、
基底クラスからそれを禁止する方法ってないものでしょうか。

C言語スレに書き込んでしまった…。
328デフォルトの名無しさん:2005/05/13(金) 14:22:09
>>327
sealedがC++にあればなあ・・・・・
デストラクタをprotectedにするとかは?
329デフォルトの名無しさん:2005/05/13(金) 14:35:24
だめだ、C++で継承を禁止するスマートな方法はないや。
コンストラクタをprivateにするとか(そうするってーと基底クラスの生成方法が
限定されてしまうし)、デストラクタをvirtualにしない事で、相手が気づいて
くれるのを期待するとか、その程度しか思いつかない。
330デフォルトの名無しさん:2005/05/13(金) 14:41:46
enemyのいないfriendワールド万歳

331デフォルトの名無しさん:2005/05/13(金) 14:46:34
>>328
protected なデストラクタは継承を禁止するテクニックではなく
継承した際に、基底クラスからの delete を防ぐテクニック。
あと、>>327 は virtual 継承の話をしていると思うのだが。
332デフォルトの名無しさん:2005/05/13(金) 14:59:34
C++では、通常の継承も、virtual継承でも、強制的に禁止する手段は
ないのではないかと思う。
333327:2005/05/13(金) 15:31:24
virtual継承するな、のコメントを目立つように工夫しました… orz。

既にやられちゃってる部分は、担当を蹴り飛ばしてきます。
いや、自分が悪いのか。
334デフォルトの名無しさん:2005/05/13(金) 15:47:07
virtual継承って事は、ダイヤモンド継承でも行いそうになってるのか?
それに実行速度が落ちるしなあ・・・・
335デフォルトの名無しさん:2005/05/13(金) 19:58:10
Boost に継承不可能なクラスを作成するためのテンプレートがあったぞ。
http://article.gmane.org/gmane.comp.lib.boost.devel/101260
336デフォルトの名無しさん:2005/05/13(金) 22:42:31
>>335
nonderivable_baseを非仮想基本クラスにすると通っちゃうのはなぜだろう。
つか仮想基本クラスだとBをエラーにできる理由がわからんorz
337デフォルトの名無しさん:2005/05/13(金) 22:43:19
338デフォルトの名無しさん:2005/05/13(金) 22:51:31
>>337
コピー不可じゃなくて継承不可の話してるんだよ?
339デフォルトの名無しさん:2005/05/13(金) 23:00:30
だめだ。昨晩飲み過ぎてから、馬鹿になった。
しばらく書き込み控えよう・・・・脳細胞が破壊された模様。
340ヽ(´ー`)ノ ◆.ogCuANUcE :2005/05/13(金) 23:31:59
>>335
> friend typename identity<T>::type;
ん、これ良いのか?
341デフォルトの名無しさん:2005/05/14(土) 01:41:25
初歩的な質問で申し訳ないですが、聞いてください。

class 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に晒すのは良くないらしいので、これでも良いのですがどのようにしたらいいと思われますか?
342デフォルトの名無しさん:2005/05/14(土) 01:54:55
>>341
それは包含(composition)という手法で、has-a関係を表すのによく使われる。
ポインタにするか参照にするかは、実行途中で包含しているクラスの実体を
切り替えたいかどうかで決めればよい。どちらにしても仮想関数はちゃんと動く。

それから、実体の参照を返すくらいだったら、包含にせず、外で実体を持った
方が良い。あくまでもprivateで外に見せない事を前提にメンバにしているのだ
から、外から操作できたら意味的に本末転倒だ。
343デフォルトの名無しさん:2005/05/14(土) 01:57:08
>>341
>質問1
問題ない。
>質問2
メンバ変数をpublicにしない方が良いと言われるのは、
公開した場合、包含クラス(この場合C)が被包含クラス(A, B)を使って
実装されているという事実が、包含クラスのインタフェースに表れるのを嫌っての事。
従って、この点では、メンバ変数の参照を返すメンバ関数を公開するのは、
メンバをpublicに置くのと大して変わらない。
344デフォルトの名無しさん:2005/05/14(土) 02:13:13
345デフォルトの名無しさん:2005/05/14(土) 02:31:35
>>342>>343 お返事ありがとうございます。
この場合、Cにaやbを持たせず、
C::func( A &a, B &b )として外から引数で与えようかとも悩みました。
いちいち引数に指定するのが面倒なのでメンバに置いたのですが…
C++は悩みが尽きません。
346デフォルトの名無しさん:2005/05/14(土) 02:42:24
>>345
そういう事なら、包含だとは思わず、publicメンバで持ってしまえばよい。
ま、しかし、そういう設計をする事はあまりないので、他人が貴方の作った
クラスを見てどう思うか、それを意識しないで済むのなら自由なんですが。

クラスCに関連するクラスAとクラスBのローカルな実体を持って、なおかつ
それを外部に公開するとなると、CがA及びBに意味的に縛られている限り、
外部からAやBを自由にされてしまうと、その都度Cのコンディションを把握
しなければならないようになり、余計な心配が増えるだけ。

かと言って継承を使うとなると、AとBからの多重継承になり、これまた
頭が痛いですね。
347デフォルトの名無しさん:2005/05/14(土) 02:44:47
私だったらAとBはprivateもしくはprotectedにし、細かいアクセサを付けて
外部からの操作を徹底的に制限する方向に行きます。
348デフォルトの名無しさん:2005/05/14(土) 08:40:28
例えばAやBが座標値のような汎用のクラスなら、
const参照を返すようには作るなぁ。
これなら外部から変更される心配が大幅に減る。
349デフォルトの名無しさん:2005/05/14(土) 23:32:05
>>346-348 お返事ありがとうございます。
クラスを協調させるクラスは必要だと思うので、すっきりした方法があると思うのですが…
AやBの設計が間違っているのかなぁ。手間はかかっても>>347さんの設計がいいのかなぁ。
350デフォルトの名無しさん:2005/05/15(日) 01:57:24
>>349
CがAやBの内容を見て動くのならば、AとBでCをfriendとして宣言したら
どうだろうか?これもあまり勧められた方法ではないけど、一応役目は
果たすんじゃない?
351デフォルトの名無しさん:2005/05/15(日) 02:02:47
それか、これはデザパタの話になってしまうけど、Strategyパターンを起用する手もある。
サブクラスがいたずらに増えるのを防止して、CからAやBを自由に切り替えて使える
ように出来る。
352デフォルトの名無しさん:2005/05/15(日) 02:11:29
まともに議論するには情報足りなすぎ。
想像であーだこーだ言っててもしょうがない。
353デフォルトの名無しさん:2005/05/15(日) 02:16:27
>>352
まあな。C++はいくら自由度が高いと言っても、ある程度ルールに乗っ取った
クラス階層にしないと、Cのポインタの使いすぎと同じで可読性が著しく下がる。
当然メンテナンス性も大幅に低下する。

継承を使うべきでない所に無理に継承を使ったり、カプセル化の大原則を
無視して意味不明なプログラムを作る香具師大杉。
354デフォルトの名無しさん:2005/05/15(日) 13:23:43
C++ の iostream は実装が重いから使わないほうがいい、って本当ですか?
355デフォルトの名無しさん:2005/05/15(日) 13:50:11
>>354
現状、 cstdio を使って実装されていることがほとんどなので、
cstdio に比べて重い実装が多いのは本当。
使わないほうがいいかどうかは、使う側で判断するべし。
356デフォルトの名無しさん:2005/05/15(日) 14:42:17
iostream の遅さがプログラムの動作に致命的な影響を与えるなら使わない (使えない)
そうでないならご自由に。
357デフォルトの名無しさん:2005/05/15(日) 18:27:37
クラスのメンバ関数から、自分自身をdeleteするようなことは
できるのでしょうか?
358デフォルトの名無しさん:2005/05/15(日) 18:30:47
>>357
規格では明確になっていないと思うが、現実問題としてできるし、
多用されている。ただし delete した後はメンバに触らないように
注意ね(即 return するのがお奨め)。
359デフォルトの名無しさん:2005/05/15(日) 18:35:08
VS.NET2003で、付属の標準STLでのことですが、

typedef 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 定義しろやゴルァってことでしょうか。
360デフォルトの名無しさん:2005/05/15(日) 18:49:41
>>359

std::map< string, POS[ARRAY] > BBBmap;

を、

std::map< std::string, std::vector<POS> > BBBmap;

にしろ。そしてSTLスレに行け。
361357:2005/05/15(日) 18:55:35
>>358
レスどうもです。
するってえと、

delete *this;

こんな感じですかね。
362357:2005/05/15(日) 18:59:18
あ、違うな。

delete this;

でいいのかな?
363359:2005/05/15(日) 19:08:23
360さん、どうもです、そしてすみません。
以後気をつけます。
364デフォルトの名無しさん: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.
365デフォルトの名無しさん:2005/05/15(日) 20:36:46
366デフォルトの名無しさん:2005/05/15(日) 22:53:14
>>362
ok
367341:2005/05/16(月) 00:19:48
template< typename IMP1_, typename IMP2_ >
class 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 を使って処理;
}
};

(続く)
368341:2005/05/16(月) 00:20:38
class IMP2;

int 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の数だけできて嫌な感じになると予想して躊躇しているところです。
何かいい方法はないものでしょうか?
(続く)
369341:2005/05/16(月) 00:25:16
と整理していましたら道が見えてきた気もします(まだ巧く表現できません)。

>>352 さんの仰る通り、問題を簡単にしようと情報を切りすぎていました。
申し訳ございません。
370デフォルトの名無しさん:2005/05/16(月) 00:26:31
>>368
Stateパターンとか。
371デフォルトの名無しさん:2005/05/16(月) 00:30:55
>>367-369
もしかして template 覚えたてだったりするか?
速度に対する要求がシビアなプログラムでもなければ、
template 使いすぎの悪い例に見える。
372341:2005/05/16(月) 00:36:08
template覚えたてです…
373341:2005/05/16(月) 00:45:16
stateパターンってこの場合に使えるんですか?
ちょっと考えてみます。>>370さんありがとうございます。
374デフォルトの名無しさん:2005/05/16(月) 00:54:28
>>372
じゃぁ template の使いすぎに注意して考え直してみるべきじゃないかな?
もうすこしすっきりすると思うぞ。
375デフォルトの名無しさん:2005/05/16(月) 00:55:53
>>370 何を根拠に・・・・
376デフォルトの名無しさん:2005/05/16(月) 01:16:10
>368
つ [Modern C++ Design]
普通にStrategy/Stateパターン使ってもいいけどね。
377デフォルトの名無しさん:2005/05/16(月) 01:50:37
こやつにModern C++ Designを読ませるのは、火に油を注ぐようなものだと思うが。
378デフォルトの名無しさん:2005/05/17(火) 07:53:50
下記のテストプログラムをbcc32でコンパイルした場合、
1=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;
}
379デフォルトの名無しさん:2005/05/17(火) 07:58:48
その辺はコンパイラの勝手なのでバグじゃない。
380デフォルトの名無しさん:2005/05/17(火) 08:19:31
ちなみにbccには"long long"という型は無い。
381378:2005/05/17(火) 08:44:59
>>379,380

なるほど…
ありがとうございました。
382デフォルトの名無しさん:2005/05/17(火) 11:44:54
>>378
-a4スイッチつければbccでもtest1は28バイトになる。(デフォルトは-a8で8バイト境界になってる)
383デフォルトの名無しさん:2005/05/18(水) 12:01:26
BohYoh.comのFAQに間違いがあるのが気になる・・・問い合わせは受け付けてないし・・・
384デフォルトの名無しさん:2005/05/18(水) 12:46:31
>>383
専用スレ立てようか?
385デフォルトの名無しさん:2005/05/18(水) 17:32:17
>>383
どの間違い?柴田先生には相当傾倒している俺としては気になる。
386デフォルトの名無しさん:2005/05/18(水) 19:55:43
C++ FAQ
> デストラクタを明示的に呼び出すことはできますか。
>
> できません。

かな。
387デフォルトの名無しさん:2005/05/18(水) 20:13:05
>>386
サンクス。
あーそりゃ完全な間違いだわ。
388デフォルトの名無しさん:2005/05/20(金) 00:06:00
typedef void (*testProc)(int);

class testClass{
static testProc proc;

public:
testClass(testProc ProcAddress){
proc = ProcAddress;
}

static void CallProc(){
proc(0);
}
};
ってやるとprivate: static void (*testProc)(int)が未解決ですって出るんだけど、
どうすればいいかな
389デフォルトの名無しさん:2005/05/20(金) 00:16:42
実体を用意する
390デフォルトの名無しさん:2005/05/20(金) 00:17:29
>388
適当なcppファイル中に
testProc testClass::proc;
391デフォルトの名無しさん:2005/05/20(金) 00:27:19
"class内のstatic変数は宣言であって定義ではない"って
感じのことをcppll(だと思う)で見つけたけど、それと同じこと?
392デフォルトの名無しさん:2005/05/20(金) 00:40:01
>>391
>>390が答えを書いているが、要するにクラスのstaticメンバはクラス外で
定義しないといけんのよ。理由はわからんが、多分クラスのインスタンス
がいくら増えても、あるいはインスタンスが一つもなくても、staticメンバは
一つきり実体があるためかも。
393388:2005/05/20(金) 00:41:36
ありがとう、無事解決できた。
394デフォルトの名無しさん:2005/05/20(金) 01:44:12
>>392
アドレス比較するぐらいしか思いつかんのだけど、インスタンスの実体は
(コンパイラ作る人からすれば楽そうだし)スタック(もしくはそれに類するも
の)に置いたりしてるんじゃないかな。

static変数やstaticなメンバ、グローバル変数等はひとくくりに
扱える気がする(実体ひとつだと領域が確定しているし)

・・・にしても別にclass宣言内で初期設定できるような規定?でも良かったよ
うな気もする。でもそうなってないなら従うしかないか

微妙に思えるのはローカル関数内(mainもそう分類されるのか知らん)のstatic
なクラスのインスタンスやグローバルなクラスのインスタンス。

まあでもこれだって、サイズは(コンパイラに)わかってるわけだし、初期化前
にインスタンスの領域を確保しないだけ・・・・と推測してみる。
(一回だけ構築するように関数埋め込むのかもしれん。この方がデストラクタ
呼ぶ時も分かりやすそうだ。インスタンス用に1つレジスタ裂けたらこっちが良さげ鴨)

・・・長々と空想ごめん。もう寝る。
395デフォルトの名無しさん:2005/05/20(金) 02:07:54
>>394
class内で初期設定できるのはstatic const intだけだね。
しかしその理由を[C++の設計と進化]の中で探したが、見つけられなかった。
P367にはどこかに置くとしか書いてないし。探し方が足りないかもしれない。
俺も眠いから寝る。 (つ∀-)オヤスミー
396デフォルトの名無しさん:2005/05/20(金) 11:25:41
基底クラスのコンストラクタをそのまま派生クラスで使いたいのですが

class 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) { }
};

やっぱりこういうふうに、すべてのコンストラクタについて
定義し直さなければなりませんか?
(すべてのコンストラクタをそのまま使えるようにしたい場合)

コンストラクタの数が多いとめんどくさいので、
宣言を省略する(もしくはより短く表記する)方法があれば嬉しいのですが…。
397デフォルトの名無しさん:2005/05/20(金) 11:29:57
>>396
class B : public A{
public:
 B(A const& base) : A(base) {}

望むものとは違うかもな。
398デフォルトの名無しさん:2005/05/20(金) 11:37:57
>B(int n)
>B(char *s)
(;`Д´)・・・・・
399デフォルトの名無しさん:2005/05/20(金) 11:41:57
>>397
なるほど。暗黙の変換がされるわけですね。
引数の数が1以外だと使えませんが…。

でも引数の数が1つのことは多いので役に立ちそうです。
ありがとうございます。

>>398
例として挙げただけです。
曖昧さが生じることはあんまりないと思いますが。
400デフォルトの名無しさん:2005/05/20(金) 12:26:16
map<string, hoge>とした場合、デフォのless<string>では大文字小文字が区別されますが
区別しないバージョンは標準には無いんでしょうか?
自分でちょちょいと書くしかないのかな(´・ω・`)
401デフォルトの名無しさん:2005/05/20(金) 12:44:38
>>400
標準には無いよ。
でも、いろんな人が書いてるからどっかから拾ってこれるかもしれない。
ん? boost::algorithm になんかありそうだな。
402デフォルトの名無しさん:2005/05/20(金) 13:09:28
プラグインの開発用に公開したいヘッダーファイルがあって、
その中にあるクラスの宣言は公開したいけど、中身は公開したくないってとき
どうすればいいかな。

クラスの中に実際のしょりを書かないでソースファイル内への関数のポインタで初期化しようかと考えたけど
それだとソースファイル内の関数群のtypedef宣言しなきゃいけないし、構造体でいい事になりますよね

それにクラスで宣言すると、VCだと(他のソフトは使ってないからわからない)ナビが出てわかりやすいと思うんですよ。
もっとスマートな方法ってありますか
403デフォルトの名無しさん:2005/05/20(金) 13:12:01
公開したくない部分をクラス化しておいて
公開しても良い部分のクラス内で↑のを使う。このクラスを公開する。
そうすれば公開したくない部分は、パブリックなメンバ関数しか見えない。
404デフォルトの名無しさん:2005/05/20(金) 14:09:43
>>400
つEffective STL
405デフォルトの名無しさん:2005/05/20(金) 14:10:31
>>402
よくわからんがPImplとかそういう話?
この話題もFAQだよなー。
406デフォルトの名無しさん:2005/05/20(金) 15:29:56
>>403
//----公開するヘッダ----
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);この文でコンパイルエラーになりそうだけど
407デフォルトの名無しさん:2005/05/20(金) 15:53:23
>>406
おまいの頭には「公開しないソース」という概念は存在しないのか。
408デフォルトの名無しさん:2005/05/20(金) 17:13:01
>>402
こうやるんだよ(←高圧的な物言い)

公開するヘッダ
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);
409デフォルトの名無しさん:2005/05/20(金) 17:13:39
仮想デストラクタ忘れてた・・・
410デフォルトの名無しさん:2005/05/20(金) 17:14:49
つーか、プラグインの形態にもよるがCOMとか経由せずにDLLとかでC++のクラスを公開するのは非常に面倒なんでやめとけ。
ABIがらみとかでハマりたいならとめんが。
411デフォルトの名無しさん:2005/05/20(金) 17:35:09
Jana風なコーディングしてる人に聞きたいのですが、
名前空間の名前はどのようにつけていますか?
NameSpace? nameSpace?
412デフォルトの名無しさん:2005/05/20(金) 18:28:13
>>401
ない。
413デフォルトの名無しさん:2005/05/20(金) 19:12:12
>>411
namespace jp{ namespace co{ namespace company{ namespace product{ namespace module{
} } } } }
にでもしやがれ
414デフォルトの名無しさん:2005/05/20(金) 20:48:14
すいません、質問お願いしたいんですけどいいでしょうか?
BorlandでC++ Compiler 5.5というのをダウンロードしたんですがこれだけでは使えないんですか?
まだ初心者なものでくだらない質問ですいません。
415デフォルトの名無しさん:2005/05/20(金) 21:13:09
PC自体の初心者の場合、
・店行ってVC++.net 2003 Standardを買ってきてインストール
・Dev-C++あたりを日本語の解説見ながらインストール&日本語化
・BCCを解説ページ読みながら自力で設定
のどれが一番簡単なんだろうな?
416デフォルトの名無しさん:2005/05/20(金) 22:44:23
>>415
・店行ってVC++.net 2003 Standardを買ってきてインストール
これが一番簡単だと思う…。
インストールして、プロジェクト作って、ソース書いて、ワンクリックでビルド。
俺、もうVC無しじゃ生きていけない。
417デフォルトの名無しさん:2005/05/20(金) 23:02:00
学生ならthe Spokeね。
418デフォルトの名無しさん:2005/05/20(金) 23:34:51
学生でないなら、
Borland C++Builder 6 Personalの方が安い?
419デフォルトの名無しさん:2005/05/20(金) 23:59:39
あるクラス(A)の処理で別のクラス(B)を引数に持つときに
Aより先にBを宣言しないとダメっぽいんだけど
関数のプロトタイプ宣言みたいに宣言だけ最初にまとめて記述ってできないのかな
420デフォルトの名無しさん:2005/05/21(土) 00:00:17
class B;
421デフォルトの名無しさん:2005/05/21(土) 00:03:44
>>420
それはやってみたんだけど認識できない型でコンパイルエラーなんだよね
422デフォルトの名無しさん:2005/05/21(土) 00:05:26
ポインタか参照で持て
423デフォルトの名無しさん:2005/05/21(土) 00:14:44
>>414
単独で使用するときに、必要な知識とか設定。
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/
424デフォルトの名無しさん:2005/05/21(土) 02:17:09
endl と \n の違いがよくわかりません。どのような状況では endl を使ったほうがいいのでしょうか?
425デフォルトの名無しさん:2005/05/21(土) 02:22:05
>>424
std::endl は '\n' と std::flush をいっぺんに突っ込む。
エラーの起こる可能性の有る処理の前、
時間のかかる処理の前に出すメッセージ、
など、画面への表示を確実に完了させたいときに使う。
426デフォルトの名無しさん:2005/05/21(土) 04:32:14
関数の引数として渡されたポインタ変数がdeleteできるかどうか
確かめる方法ってありますか?
あるいはdelete[]じゃないとやばいかどうかとか知りたいんです。
もしくはdelete及びdelete[]できない型を渡せなくするとか。
427デフォルトの名無しさん:2005/05/21(土) 04:34:31
>>426
できん。
その分、newの際にできるだけ使用するヒープ量を減らす事にしたのだから。
428デフォルトの名無しさん:2005/05/21(土) 05:03:41
deleteできるかどうかも渡したらいいんじゃない?
429デフォルトの名無しさん:2005/05/21(土) 05:06:19
>>428
それはdeleteした後にポインタ変数に0を入れておくなどの用心しかない。
できるだけクラスにして、デストラクタに始末させると綺麗に書けるんだけどね。
そうしたくない場合が多いからね。
430426: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するか、何か良い方法はないでしょうか?
431デフォルトの名無しさん:2005/05/21(土) 08:31:11
>>430
変数のアドレスを渡すなとコメントに書くしかない。

ただstd::auto_ptrやboost::shared_ptrにすればnew使えという意思がソースからも読み取れるようにはなると思う。
432デフォルトの名無しさん:2005/05/21(土) 12:51:14
>>430
ポインタを渡しただけなのに、その指している先を削除してしまうコンテナは実装がまずいといえる。
deleteしない、deleteする、delete[]する、の3種類の動作が分けられるスマートポインタを提供し、
さらにそれを格納するコンテナを提供するのが筋。
433デフォルトの名無しさん:2005/05/21(土) 12:52:11
×実装がまずい
○設計がまずい

俺は何を言ってるんだ・・・。
434デフォルトの名無しさん:2005/05/21(土) 13:16:29
すまぽ
すまぽ
ぬるぽ
435426:2005/05/21(土) 15:04:22
なるほど… 実体の無いインターフェース用意して
それを継承したクラスしか渡せないとかダメかな?
 class IDeletable {};
として
 std::map< const keyT, IDeletable * const > m_container;
みたいな

これでもスタックに確保された配列とか渡されたらダメか…
>>432氏の方法を考えてみます
436デフォルトの名無しさん:2005/05/21(土) 15:14:19
クラスがdeleteされるときに呼ばれる関数をクラスの中に組み込めますか?
437デフォルトの名無しさん:2005/05/21(土) 15:16:17
>>436
何も問題ないと思うけど?
438デフォルトの名無しさん:2005/05/21(土) 15:17:39
ファンクタ使えばできる。
shared_ptrとかもそうしてはず。
GC使えばいいのに...
439デフォルトの名無しさん:2005/05/21(土) 21:32:25
>>436
デストラクタからなにか関数を呼ぶということだと思うけど、
自身の仮想関数を呼ぶと愉快な動作をしてくれる。
440デフォルトの名無しさん:2005/05/21(土) 21:49:49
>>439
デストラクタというんですね。ありがとう
自分の無知さがはずかしい
441デフォルトの名無しさん:2005/05/21(土) 21:51:04
話がかみ合ってないのに情報が伝わっててワラタ
442デフォルトの名無しさん:2005/05/21(土) 22:57:10
ええと。ホームページで携帯からアクセスを禁止にしたいのですがどうすればいいのか分からないんですけど・・・
どなたかお願いします。
443デフォルトの名無しさん:2005/05/21(土) 23:00:55
+激しくスレ違い+
444デフォルトの名無しさん:2005/05/21(土) 23:52:40
むしろなぜここに質問しようと思ったのか全く理解できないくらいスレ&板違い
445デフォルトの名無しさん:2005/05/22(日) 01:44:06
メソッド内で定義したローカルクラスのポインタを返すのって、C++ の言語仕様的に
やっても大丈夫なのかな・・・。
あるいは言語仕様的には 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;
}
446デフォルトの名無しさん:2005/05/22(日) 01:44:54
>>445
OK
447445:2005/05/22(日) 01:45:40
プログラムの動作そのものには関係しないけど、FusaGoko → FusaGiko ですた・・・。
448445:2005/05/22(日) 01:48:31
>>446
どうもサンクスでつ。
449デフォルトの名無しさん:2005/05/22(日) 01:50:14
Visual C++ 6.0でコンパイルをするとリンク中と表示されたままで進まないことが以上に多いんですけど、これってどうしようもないんですか?教えてください。
450デフォルトの名無しさん:2005/05/22(日) 01:53:27
スレ違い

★初心者にVisual C++を教えるスレ★ Part19
http://pc8.2ch.net/test/read.cgi/tech/1116209988/
451デフォルトの名無しさん:2005/05/22(日) 18:27:55
かつてCで書いたプログラムを、勉強+将来のGUI化に向けて、C++に書き直しています。

この中で、調べてもよくわからないところがありましたので質問させていただきます。
C言語(stdio.h)のfscanfとかfseekに相当する関数は、C++(fstream.h)ではどれにそうとするのでしょうか?
また、C言語とC++との違い・対応がわかりやすいサイト・書籍がありましたらご紹介願います。
// テンプレ嫁といわれてしまいそうですが_| ̄|○

わかりにくい文章かもしれませんが、よろしくお願いします。
452デフォルトの名無しさん:2005/05/22(日) 18:35:07
>>451
fscanf は各型の operator >> が対応していると言えなくも無いかな。
fseek は読み込みなら seekg だろうな。
無理に fstream を使わなければ、そのまま動くはずだけど。
あと、 fstream.h は fstream にしとけよ。
最後に、テンプレ嫁。
453デフォルトの名無しさん:2005/05/22(日) 18:37:37
454デフォルトの名無しさん:2005/05/22(日) 18:46:20
>>452-453
レス、サンクスです。
これで、がんばれそうです。
455デフォルトの名無しさん:2005/05/22(日) 18:48:25
>>451
現在のC++ではfstream.hは存在しないから将来も何もない。

どうしてもわからなければsed::getline()でstd::stringに読み込んでから<cstdio>のstd::sscanfを使う方法もあるさ。
456デフォルトの名無しさん:2005/05/23(月) 10:27:52
>C言語(stdio.h)のfscanfとかfseekに相当する関数は、C++(fstream.h)ではどれにそうとするのでしょうか?
やはりここは、
C++(cstdio)のstd::fscanf()とかstd::fseek()が相当します。
と答えたくなるな。
457デフォルトの名無しさん:2005/05/23(月) 10:59:19
newで返されるポインタの型をキャストするときは
static_castですか?それともreinterpret_castですか?
ポインタの型は論理変換でしたっけ?
458デフォルトの名無しさん:2005/05/23(月) 11:00:48
>>457
やりたいことを具体的に示せ。
459デフォルトの名無しさん:2005/05/23(月) 11:12:32
operator newをオーバーロードしたいのですが、

そのオーバーロード関数内で
MyClass *p;
p = ????_cast<MyClass*>( new char[chunk] );

の場合は、どのキャストがベストですか?
460デフォルトの名無しさん:2005/05/23(月) 12:14:49
reinterpret 以外あり得ない
461デフォルトの名無しさん:2005/05/23(月) 12:24:25
staticとreinterpretと両方見かけたことがあるんですよね。
Effective C++ P.63には

Airplane *newBlock = static_cast<Airplane*>(::operator new(BLOCK_SIZE * sizeof(Airplane)) );

とあるんですが、このケースは違う?
462デフォルトの名無しさん:2005/05/23(月) 12:38:08
>>461
void *からT *へはstatic_castが使える。
char *からT *へは使えない。
463デフォルトの名無しさん:2005/05/23(月) 13:14:12
>>462
なるへそ。
ということは
new ???
こういう書式だと、???の型のポインタが返されるけど
operator new(size_t)
この書式だと、コンパイラは型がわからないからvoid*型が
返されるってことかな?
464デフォルトの名無しさん:2005/05/23(月) 14:22:00
.Netではあるクラスを初期化するときに
new ClassA(a, b, new ClassB() );
といったように別のクラスを引数としてとる事がありますが
これはC++だとdeleteされないからメモリリークを起こしますよね
465デフォルトの名無しさん:2005/05/23(月) 14:35:48
それってClassAのデストラクタでClassBをdeleteすればいいんじゃないの?
466デフォルトの名無しさん:2005/05/23(月) 14:59:53
たとえばnew Brush(new Color(255,255,255));みたいに
Brush側でColorがこの後利用するかどうかって判断つかない場合もあると思うんですよ
467デフォルトの名無しさん:2005/05/23(月) 15:02:51
>>466
Colorみたいなものは値渡しだからどうでもいいとして、

初期化がどうとかいう話ではなく、「GCがないから
いらなくなったら自分で delete しないとメモリリークを起こしますよね」
っていう話のような気がする。
468デフォルトの名無しさん:2005/05/23(月) 15:05:43
そらC++なら当たり前だ
shared_ptrでも使えば?
469デフォルトの名無しさん:2005/05/23(月) 16:07:47
GCが防いでくれるのは多重開放であってメモリリークではない。
470デフォルトの名無しさん:2005/05/23(月) 16:36:10
reinterpret の読み方って 「りんたぷれっと」 でいいの?
471デフォルトの名無しさん:2005/05/23(月) 17:03:51
リインタプリトって読んでいる。
interpreter = インタプリタから。
472デフォルトの名無しさん:2005/05/23(月) 17:04:19
リインタプリトって読んでいる。
interpreter = インタプリタから。
473デフォルトの名無しさん:2005/05/23(月) 17:21:54
引数が省略可能とする時は、プロトタイプ宣言にてデフォルトを記述しますが、
引数が構造体の場合は、デフォルト値はどのように記述すれば良いのですか?
474デフォルトの名無しさん:2005/05/23(月) 17:46:04
>>473
構造体にコンストラクタを設けて、デフォルト引数を一時オブジェクト作成にすればよい。

struct A
{
    int x;
    A(int x) : x(x) {}
};

void f(A a = A(0));
475デフォルトの名無しさん:2005/05/23(月) 17:49:13
>>474
ありがとうございました
476デフォルトの名無しさん:2005/05/23(月) 20:12:57
class A { };
class B : public A { };

//////////

B* x = new B();
A* y = x;  // ← これは大丈夫なのに

B** z = &x;
A** w = z; // ← これは駄目なのはどうしてなのでしょうか?
477デフォルトの名無しさん:2005/05/23(月) 20:24:32
>>476
どうして?と聞かれても、仕様だ!と答えるしかないな。
その変換を認めると、

A **w = z;
*w = new A;
// ここで*zを使う

のようなコードで、Bのつもりでアクセスした実体が実はAだった、ということがおきる。
つまり、その変換は安全じゃないから、禁止されている。
478477:2005/05/23(月) 20:27:08
// ここで**zを使う
ね。
479デフォルトの名無しさん:2005/05/24(火) 01:56:25
480デフォルトの名無しさん:2005/05/24(火) 02:02:53
いつも思うのだが
Bjarne Stroustrup
これは正確にはなんと発音すればいいんだ?
俺はうまく発音できなくて禿げ禿げでごまかしてるんだが。
481デフォルトの名無しさん:2005/05/24(火) 02:18:32
>>480
情報処理用語の読み方を確認するスレ
http://pc8.2ch.net/test/read.cgi/tech/1056173956/l50
482デフォルトの名無しさん:2005/05/24(火) 02:32:17
情報処理用語かよw
483デフォルトの名無しさん:2005/05/24(火) 02:32:39
ビアルネだったのか・・・ビヤーンだと思ってた。
つか情報処理用語なのかこいつの名前は。
484デフォルトの名無しさん:2005/05/24(火) 02:52:41
継承して欲しくないクラスを明確にする為に

#define final_class class
final_class foo {
};

みたいな事するのって気色悪いですか?
用語はまあsealed_classとかでもOKなんですが
デストラクタをvirtualにしないだけじゃ設計ミスみたいだし…
485デフォルトの名無しさん:2005/05/24(火) 02:59:01
俺はデストラクタがvirtualでなければ継承禁止の意思表示に取るけどね
マクロ使うぐらいならコメント一言入れとけば?
486デフォルトの名無しさん:2005/05/24(火) 04:39:39
>>484
class foo { // 継承したら肛門童貞奪うぞ
};

((( ;゚Д゚)))ガクガクブルブル
487デフォルトの名無しさん:2005/05/24(火) 09:46:17
488デフォルトの名無しさん:2005/05/24(火) 09:50:01
>>486
肛門が童貞じゃないお兄さんなら継承しても平気なわけだ。
489肛門童貞じゃない:2005/05/24(火) 10:32:32
おねいさんはだめですか?
490デフォルトの名無しさん:2005/05/24(火) 10:36:13
ビヤーンネ・ストローストロップが正しいのか。
491デフォルトの名無しさん:2005/05/24(火) 10:44:05
それを言い出すとカナ表記しようとする段階で間違い。
492デフォルトの名無しさん:2005/05/24(火) 11:50:14
>>486を受けると
>>490
ビヤーンネ・スカトローストロップが正しい。
493デフォルトの名無しさん:2005/05/24(火) 13:10:20
イヤーネ・スカトローストリップ?
494デフォルトの名無しさん:2005/05/24(火) 14:56:20
イヤーン・スカトロストリップ?
495デフォルトの名無しさん: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);
}

というように書けばいいんでしょうか?
496デフォルトの名無しさん:2005/05/24(火) 16:11:11
>>495
そんな感じでいいと思うよ。
俺だったらconst char *版もオーバーロードするけど。
497デフォルトの名無しさん:2005/05/24(火) 16:29:22
void f(const string& str) {
 ofstream ofs( filename.c_str() );
 f( ofs );
]

void f() {
 f( cout );
}

void f(ostream& os) {
 os << "hello" << endl;
}
498デフォルトの名無しさん:2005/05/24(火) 16:32:59
>>497
それだったらデフォルト引数にcoutを書けばいいだけじゃねえかよ。
499デフォルトの名無しさん:2005/05/24(火) 16:36:11
漏れだったらstd::stringのconst参照ではなくconst char *をとるようにするなぁ。
500デフォルトの名無しさん: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;
}
501デフォルトの名無しさん:2005/05/24(火) 17:08:21
static inline void ff(ostream & os = cout) {os << "hello" << endl;}
static inline void f(const char * filename = NULL) {filename ? ff(ofstream(filename)) : ff();}
502デフォルトの名無しさん:2005/05/24(火) 17:22:10
inline void f(std::ostream& os = std::cout) {os << "hello" << std::endl;}
inline void f(const char *filename) {filename ? ff(std::ofstream(filename)) : ff();}
inline void f(const std::string& str) {f(str.c_str());}
503デフォルトの名無しさん:2005/05/25(水) 00:03:33
finalにしたいなら

class final {
 class foo {};
}
つうのはどうでしょう?
504デフォルトの名無しさん:2005/05/25(水) 00:21:25
C++で手続き型のプログラムって普通はしないものなのか。
505デフォルトの名無しさん:2005/05/25(水) 00:38:12
>>504 普通ってなんだろー
506デフォルトの名無しさん:2005/05/25(水) 00:42:54
>>504
実装側で適当にやるのは良いと思う(というかそういう言語だと思う)が
公開するインターフェースはオブジェクト指向にして欲しい
507デフォルトの名無しさん:2005/05/25(水) 01:59:37
>>505
normal
508デフォルトの名無しさん:2005/05/25(水) 02:18:48
>>507
トートロジー
509デフォルトの名無しさん:2005/05/25(水) 10:01:10
ナポリタン
510デフォルトの名無しさん:2005/05/25(水) 12:18:54
ふつう 0 【普通】

(名・形動)[文]ナリ
(1)いつでもどこにでもあって、めずらしくない・こと(さま)。
「日本に―の鳥」
(2)ほかとくらべて特に変わらない・こと(さま)。
「ごく―の家庭に育つ」「―ならもう卒業している」
(3)特別ではなく、一般的である・こと(さま)。
「―高校」
⇔特殊

(副)
たいてい。一般に。
⇔特殊
「郵便は―三日かかる」
――の体(からだ)でない
病気である。また、妊娠している。

http://dictionary.goo.ne.jp/search.php?MT=%C9%E1%C4%CC&kind=jn
511デフォルトの名無しさん:2005/05/25(水) 13:11:36
C++の関数の中の書き方(セミコロンで区切って命令を順番に書く)を手続き型というのであって、対義語は関数型もしくは論理型。
オブジェクト指向かどうか(これは設計の問題)とは関係ない。
512デフォルトの名無しさん:2005/05/25(水) 13:23:56
>>511
手続きを抽象化するスタイル(要は構造化)のことを
オブジェクト指向と対比して手続き型と言うことがあると思う。
plc++3にはこの意味で出てきた。
513デフォルトの名無しさん:2005/05/25(水) 13:47:32
>>511
> C++の関数の中の書き方(セミコロンで区切って命令を順番に書く)を手続き型というのであって
セミコロン云々はそりゃいくらなんでも違うだろ。
代入を順番に書き連ねて、その副作用を利用していくのが手続き型。

> オブジェクト指向かどうか(これは設計の問題)とは関係ない。
これも間違い。多くのオブジェクト指向プログラミングは、これまでのところ
手続き型言語の枠組で提案されてきてる。その理由としては、特に手続き型の
対極にあたる宣言型、そのなかでも関数型の場合は、状態を保持するオブジェ
クトとの相性があまりよろしくない。そもそもオブジェクト指向のサポートの
一切ない言語(たとえばHaskell)を使うのにオブジェクト指向で設計、などあ
り得ない。
514デフォルトの名無しさん:2005/05/25(水) 14:09:39
おとなはうそつきだ
515デフォルトの名無しさん:2005/05/25(水) 16:33:09
>>513
C++では区切り子にセミコロンを使っているというだけの話だろ
セミコロン必須だとはだれも思っちゃいない(お前以外は勘違いすらしない)
516デフォルトの名無しさん:2005/05/25(水) 16:50:23
>>513
>代入を順番に書き連ねて、その副作用を利用していくのが手続き型。

Lispは手続き型?
517デフォルトの名無しさん:2005/05/25(水) 18:09:29
>>515
> セミコロン必須だとはだれも思っちゃいない(お前以外は勘違いすらしない)
勘違いしてるのはお前だろ。511も513も「セミコロン必須」なんて話はしてない。

>>516
> Lispは手続き型?
「Lispが関数型」っていうのは「Cが関数型」っていうのと同じくらい正確。
518デフォルトの名無しさん:2005/05/25(水) 18:58:15
ん?言葉の使い方が悪かったか?
セミコロン必須 = 文と文を区切るためにセミコロンを使うこと
と解釈してくれ
519デフォルトの名無しさん:2005/05/25(水) 21:54:40
513はセミコロンに拘ってるな
520デフォルトの名無しさん:2005/05/25(水) 22:23:01
virtual functionを実現するコンパイラの仕組みがよく
わからなかったので教えてください。
実際のクラスの関数へのポインタをデータの中に埋め込んでおいて
それを使用して関数を呼び出すというのはわかったのですが、
その関数に暗黙に渡されるインスタンスへのポインタの渡し方が
よくわかりませんでした。
多重継承している場合はベースへのポインタと派生クラスの
ポインタでアドレスが異なる場合がありますよね?
その場合は実際に渡すアドレスをどこで変換してるんでしょうか?
521デフォルトの名無しさん:2005/05/25(水) 22:36:09
>>520
thisとvtable
522デフォルトの名無しさん:2005/05/25(水) 22:52:24
>>520
thisは実際のところ、関数の引数として渡されているだけ(の実装が多い)。
523デフォルトの名無しさん:2005/05/25(水) 23:00:20
524デフォルトの名無しさん:2005/05/25(水) 23:21:13
>523
>520 に答えようとして途中でわからなくなったんだけど、勉強になった。サンクス。
525520:2005/05/25(水) 23:28:51
>>523
なるほど、理解できました。アドレス補正処理も同時に埋め込んでいる
んですね。
526デフォルトの名無しさん:2005/05/25(水) 23:29:48
おそレスだが
>485
コンストラクタを全部privateにしちまえばいいんでない。
んで、statci A& A::getInstance()とかしておくと

>486
まあ、それで十分な開発体制ならいいんだけど、
現実はマーフィーの法則を超えることがあるわけで
527デフォルトの名無しさん:2005/05/25(水) 23:34:54
>520
回答はすでにされているので、ほんとにあった怖いコード
クラスをmemsetで丸ごと初期化してる
528デフォルトの名無しさん:2005/05/25(水) 23:46:56
>513
そりゃぁ、状態を管理するオブジェクト指向と状態を持たない純関数型言語では
相性悪いだろうに……
529デフォルトの名無しさん :2005/05/26(木) 05:53:25
エスケ−ブシ−ケンスはW2000では使えないようなのですが
例えば
printf(”¥x1B[%d;%dH%s”,plin,pcol,str);
での表示はどう直せばよいのでしょうか?
530デフォルトの名無しさん:2005/05/26(木) 06:04:10
半角に直せばいいと思うよ
531デフォルトの名無しさん:2005/05/26(木) 06:07:31
つーか、スレ違い。
532デフォルトの名無しさん:2005/05/26(木) 07:40:18
>>529
SetConsoleCursorPosition
533デフォルトの名無しさん:2005/05/26(木) 11:26:44
finallyを使うのと、単にtry・catchブロックの次に書くのとでは何が違うのでしょうか?
534デフォルトの名無しさん:2005/05/26(木) 11:35:31
__finallyはMS拡張であってC++標準ではない。
535デフォルトの名無しさん:2005/05/26(木) 11:37:21
例えばtryブロック内でreturnしてもfinallyが実行されるんでないっけ
536デフォルトの名無しさん:2005/05/26(木) 11:50:06
newを使って二次元配列を作り初期化する方法ってどうやればいいのでしょうか?
int (*a)[3] = new int a[3][3] ={
                   {1,2,3},
                   {4,5,6},
                   {7,8,9}
                   }
これはだめでした
537デフォルトの名無しさん:2005/05/26(木) 12:40:40
finally はめちゃめちゃ欲しい。
デストラクタで処理すりゃいい話だけどそんな細かいニーズのためにクラス作ってらんない。
538デフォルトの名無しさん:2005/05/26(木) 13:24:02
デストラクタじゃ代用にならないだろ。
クラスは破棄されないんだけど、エラーが発生してエラー処理、って場合に。
539デフォルトの名無しさん:2005/05/26(木) 14:04:37
スマートポインタのデストラクタで代用できるだろ
540デフォルトの名無しさん:2005/05/26(木) 15:11:28
エラー処理をfinallyに書いてどうする。
541デフォルトの名無しさん:2005/05/26(木) 15:58:24
finallyも例外自体もスコープアウト時のガベージコレクトのないレガシー言語の機構。
542デフォルトの名無しさん:2005/05/26(木) 16:22:55
finally の用途はメモリ関係に限らないんだけどね。
543デフォルトの名無しさん:2005/05/26(木) 16:34:03
スパートポインタ系のラッパクラスにしてもメモリ以外にも適用できるわけだが。
Rubyみたいにファイルオブジェクト作るたびに例外ハンドラ書かされる糞言語見てるとGCが大して幸福に貢献しないことがよく分かる
544デフォルトの名無しさん:2005/05/26(木) 16:55:34
>>541
(´-`).。oO(例外自体も?)
545デフォルトの名無しさん:2005/05/26(木) 18:24:01
>スパートポインタ
>スパートポインタ
>スパートポインタ
546デフォルトの名無しさん:2005/05/26(木) 19:47:56
>>545
もしかしてスパートポインタも知らないのか?
547デフォルトの名無しさん:2005/05/26(木) 19:57:04
ダストスパート
548デフォルトの名無しさん:2005/05/26(木) 20:25:22
549デフォルトの名無しさん:2005/05/26(木) 20:29:10
ものすごく初歩的な質問なんですが、
今、C++の参考書を読み終わったのですが、
クラスや関数のことについては大体分かりました。

まずは簡単な住所録をつくろうと思ってたのですが、
コマンドプロンプト上でしか動かせない状況です。

これから先はMFCやAPIを勉強していけば
C++のソフトを作るには十分だといえるのでしょうか?

もし、よろしかったらご教授下さい。
550デフォルトの名無しさん:2005/05/26(木) 20:51:20
>>536
new int a[3][3]まではいいけどその先が駄目。
newの後で要素へ代入していくしかない。
551デフォルトの名無しさん:2005/05/26(木) 21:14:54
(int *)(*a) = new (int *)[3];
a[0] = new int[3]; //a[0] = {1,2,3};
a[1] = new int[3];
a[2] = new int[3];
552デフォルトの名無しさん:2005/05/27(金) 00:14:29
ダライアス継承という言葉をたまに耳にしますがどういった物なのでしょうか?
553デフォルトの名無しさん:2005/05/27(金) 00:31:05
55498:2005/05/27(金) 02:09:55
sourceforge以外で実際に作って勉強できそうなところないでしょうか?
なんかどれに参加していいかも良くわからないし。途中から参加しても
ついていけなさそう。
555デフォルトの名無しさん:2005/05/27(金) 02:48:24
ダイダロス継承という言葉をたまに耳にしますがどういった物なのでしょうか? 
556デフォルトの名無しさん:2005/05/27(金) 04:18:13
ダルイデス継承という言葉をたまに耳にしますがどういった物なのでしょうか?
557デフォルトの名無しさん:2005/05/27(金) 06:03:07
BOOST::lexical_castをパクってみたら、
'sw' は 'std' のメンバーではない!とか怒られたんですが
何がマズイんでしょうか?

もちろんsstreamはincludeしてます。
問題部分のソースは

 if(!(s << src) || !(s >> dest) || !(s >> std::sw).eof())
558デフォルトの名無しさん :2005/05/27(金) 06:19:28
>532
サンクス。
いろいろ書くと、チョット複雑なんだけど
hDCが使えないので、Locate()とか、home()でカ−ソルを動かせると良いのですが・・

元々、画面へ直接アクセスの考えがないから、駄目なんでしょうね。
559デフォルトの名無しさん:2005/05/27(金) 07:19:45
>>557
ws(white space)
560デフォルトの名無しさん:2005/05/27(金) 09:28:29
使っているうちに使用メモリが増えていくアプリが、結構ありますが、
deleteしても、その解放したメモリ領域は、アプリが終わるまではOS側で再利用してくれないのでしょうか?
561デフォルトの名無しさん:2005/05/27(金) 09:34:22
>>560
コンパイラ、ライブラリ、OSの実装による。
疑いを晴らしたいのなら、 new, delete を
OSのメモリ管理を直接使うように再定義して置き換えればよい。
562デフォルトの名無しさん:2005/05/27(金) 10:06:53
>>558
だからスレ違いだってばよ。
http://pc8.2ch.net/test/read.cgi/tech/1115386557/
563デフォルトの名無しさん:2005/05/27(金) 10:12:04
>>561
レスありがとうございます。決まってないんですか。
折角隠蔽してくれているなら、こだわらない方が良いのでしょうか。

「OSのメモリ管理」で勉強しなおした所、(スレ違いですが)Windowsの場合は、すぐにでは無いけど、
後で可能ならば再利用してくれているんですね。あまり考えないことにします。
564デフォルトの名無しさん:2005/05/27(金) 16:12:10
まあ大抵のOSではプロセスが確保したメモリは
プロセスの解放時に全部解放されっから気にスンナ

メモリリークが〜とかいうのはDaemonとか永続的に
走らせるアプリケーションじゃなきゃたいして問題じゃない

というと怒る人がいっぱいいるけどね!
565デフォルトの名無しさん:2005/05/27(金) 16:47:35
>>560
そういうのは大抵deleteがどうとかいう問題じゃなくて単純にバグでメモリリークしてるか、後で使うかもしれないからと使いもしないゴミを後生大事に抱え込んでるかのどっちか。
566デフォルトの名無しさん:2005/05/27(金) 17:41:12
C++に限定した話ではないかもと思うのですが、質問です。

友人達と複数のゲームクラスをつくり、最後に一つにくっつけてゲーム完成を目指しています。
ただその際、メインの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
};
というのをクラス内で宣言させることを考えました。
ただ、気になるのはこの場合のスピードです。これは直値に置換されるのでしょうか?
それとも変数扱いなのでしょうか。

初心者な質問ですが、よろしければご教授お願いいたします。(どれも見当違い! を含めて)
567デフォルトの名無しさん:2005/05/27(金) 17:58:19
> ですが変数ですので、#defineで置換したものに比べてわずかながら処理が遅いのかなと思います。
遅くない。
遅かったとしても、本当にわずかだから気にしなくていい。
それを気にするレベルならC++なんか使うな。

> ただその際、メインのcppファイルがみんなのheaderファイルをincludeするため
ありえない。
568デフォルトの名無しさん:2005/05/27(金) 18:01:28
>>566
んなもんコンパイラによって違うから吐かれたコード見ろ。
第一そんなとこがボトルネックになるわけない。
最適化の基本は計測。
計測した結果、本当にそこがボトルネックになってるならそれから考える。

enumでやるのはconst staticが使えない環境で
無理矢理同じことを再現するEnam hackという手法。
本来のenumの使い方とは違うのでconst staticが
ちゃんと使えるならconst staticでやれ。

そもそも他人と被るようなウィンドウ幅みたいな定数を
グローバルにおかない事の方が間違いだがな。
569デフォルトの名無しさん:2005/05/27(金) 18:02:06
>>566
enumはコンパイル時定数なのでろくに最適化をしないコンパイラでも問題ない。
ただし、単にクラス内定数が欲しいだけならenumよりstatic constを使う方が一般的。

ほかにもクラスの枠に縛られない定数が欲しいときには
1人1人が独自のnamespaceを持ち、その中でconstな定数を宣言する方法もある。
570デフォルトの名無しさん:2005/05/27(金) 18:42:31
そもそも、画面の大きさは定数にするものなの?
571デフォルトの名無しさん :2005/05/27(金) 20:47:23
>562
スレ違いではないと言う事が解らないほど、あほな奴だな。
572デフォルトの名無しさん:2005/05/27(金) 21:10:47
#define定数 => コンパイル時に計算される
enum定数 => コンパイル時に計算される、ただし値がint
const static データメンバ定数 => 整数型ならば、コンパイル時に計算される

整数ならば、const staticデータメンバで行けばよい
浮動小数点のばあい、#defineのよい代案はない
インライン関数で定義すれば、コンパイル時に計算する可能性が高いか
573デフォルトの名無しさん:2005/05/27(金) 21:25:46
#defineはコンパイル前のプリプロセスで置換されるものだが。
574デフォルトの名無しさん:2005/05/27(金) 21:28:11
プリプロセスを含めてcompilation phasesともいえる。
575デフォルトの名無しさん:2005/05/28(土) 01:44:34
コンストラクタで何かにメンバ関数のポインタ渡すのって無理なんですか…?
型が違うってエラーの本来クラス名が出るところに_closureとか出てるんですが
576デフォルトの名無しさん:2005/05/28(土) 01:52:09
>>575
無理。次。
577575:2005/05/28(土) 01:57:42
問題のメンバ関数をstaticメソッドにしたら渡せました…
メンバにアクセスできる以上ポインタも取得できそうなものなのに

もしかしてコンストラクタの中で
そのクラスのポインタを受け取る関数にthis渡すのもできないんですか?
578デフォルトの名無しさん:2005/05/28(土) 02:03:03
>>575 意味がわからん。ソース貼れ。
579デフォルトの名無しさん:2005/05/28(土) 02:05:36
>>577
> もしかしてコンストラクタの中で
> そのクラスのポインタを受け取る関数にthis渡すのもできないんですか?

できる。が、一般的に危険だと言える。
580575:2005/05/28(土) 02:22:39
>>579
危険というのはコンストラクタで例外が起きちゃった場合とかですか?
それともコンストラクタ内でthisが使えるのは特殊な実装になってるんでしょうか

>>578
わかったかたがいるようなので貼りません。
581デフォルトの名無しさん:2005/05/28(土) 02:27:58
>>575
コンストラクタでなければ渡せるのか?
メンバ関数へのポインタの書き方を知らないだけじゃないのか?
582デフォルトの名無しさん:2005/05/28(土) 02:38:59
>>580
コンストラクタの中ということは、コンストラクタが完了していないわけで、
その型の完全なオブジェクトを期待している処理に渡された場合に整合性が崩れる可能性がある。
583デフォルトの名無しさん:2005/05/28(土) 02:50:50
情報小出し厨は逝ってよし。
584575:2005/05/28(土) 03:06:37
>>581
>コンストラクタでなければ渡せるのか?
はい
>メンバ関数へのポインタの書き方を知らないだけじゃないのか?
そこまで馬鹿じゃありません

>>582
なるほどそれはそうですね
単純なオブジェクトプールを考えていて
プールクラスのAddメソッドに this を渡したいだけなので
マルチスレッドにでもしない限り大丈夫かな
下位クラスのコンストラクタでプールに検索かけられたらやばそうですが
585デフォルトの名無しさん:2005/05/28(土) 03:32:29
BCBなヨカン。&つけて渡してみては。
586デフォルトの名無しさん:2005/05/28(土) 03:43:50
>>584
ム板きっての 大 馬 鹿
587デフォルトの名無しさん:2005/05/28(土) 07:48:22
> 問題のメンバ関数をstaticメソッドにしたら渡せました…
関数ポインタの使い方を知らないだけの予感
588デフォルトの名無しさん:2005/05/28(土) 13:05:49
>>575
BCBのVCLは独自拡張で非staticなメンバ関数のポインタを扱えるようになっているが通常のC++では非staticなメンバ関数のポインタは取れない。
ついでにRTTIでもVCLのTObject派生クラスは通常のC++クラスと振る舞いが違う。
589デフォルトの名無しさん:2005/05/28(土) 13:14:10
>>588
&をつけて明示すれば非staticな関数のポインタも取れないわけではない。
メンバへのポインタだから普通の関数ポインタのようには使えないが。
590デフォルトの名無しさん:2005/05/28(土) 13:23:55
ここに書いてるのは普通のC++が対象じゃないんかー
http://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03057.html

で585でBCBと言ったのは、BCBはコンストラクタの中でだけ
void (CTest::*fpFunc)() = CTest::Func;
と書けなくて、&CTest::Func; としないと駄目だったので。
591デフォルトの名無しさん:2005/05/28(土) 13:23:58
メンバ関数のポインタはそれぞれのオブジェクトに対するシフトを表しているから、
->*とか.*を使わないとダメですな。
まあ、管理するのも面倒なので、boost::functionとか使いますが。
592デフォルトの名無しさん:2005/05/28(土) 13:53:15
シフト……。せめてオフセットとかディスプレースメントにしとけ。
593デフォルトの名無しさん:2005/05/28(土) 14:00:04
メンバ関数のポインタは普通の関数ポインタで実装されてる希ガス
594デフォルトの名無しさん:2005/05/28(土) 16:09:18
>>593
MSVCでは単なる関数ポインタで実装されています。しかし、
構造体を使って実装されている環境もあります。一般的に、
メンバ関数へのポインタの実装は互換性を持ちません。
595デフォルトの名無しさん:2005/05/28(土) 17:24:51
>>594
な、なんだって!?
それはかなり初耳だ。
596デフォルトの名無しさん:2005/05/28(土) 17:54:39
>>590
コンストラクタ以外で CTest::Func が使えるのなら、それは標準とは違う動作だ。
597デフォルトの名無しさん:2005/05/28(土) 18:30:51
>>596
む、そうでしたか。メンバ関数ポインタはあのサイトで知ってVCも&なしで通ったので、
&なしが普通だと思ってました。ご指摘どうもです。
598デフォルトの名無しさん:2005/05/29(日) 12:15:20
>>595
Inside The C++ Object Modelでも読めよ。
599デフォルトの名無しさん:2005/05/29(日) 13:15:09
>>598
その本に書いてることが本当だという保証はないだろ?
600デフォルトの名無しさん:2005/05/29(日) 13:16:41
お前らあいかわらず下等だな
601デフォルトの名無しさん:2005/05/29(日) 13:17:13
ヘタレがヘタレをバカにするのを見ていると本当に悲しくなる。
602デフォルトの名無しさん:2005/05/29(日) 13:19:01
>その本に書いてることが本当だという保証はないだろ?
何だよその子供みたいな反論は・・・
603デフォルトの名無しさん:2005/05/29(日) 13:37:44
>>599
少なくともお前のようなヘタレの頭の中よりはマシな事が書いてある。
604デフォルトの名無しさん:2005/05/29(日) 16:46:11
>>599
書籍読んで、逆アセンブルしたコードと見比べればすぐ分かるだろ。
605デフォルトの名無しさん:2005/05/29(日) 17:12:51
Inside The C++ Object Modelを読むまでも無く、
仕様で決められてないんだから関数ポインタがたとえどんな風に実装されていようが驚くような事じゃないだろ。
606デフォルトの名無しさん:2005/05/29(日) 22:53:01
C++を勉強するのに
「詳説C++ 標準C++完全理解 第2版 大城 正典 (著)」
ってのを衝動買いしてしまった。
これで勉強して大丈夫か?
607デフォルトの名無しさん:2005/05/29(日) 22:59:30
推薦図書読むのが一番の近道
608デフォルトの名無しさん:2005/05/29(日) 22:59:57
詳説とか完全とか書いてある本は避けたほうが無難だよ。
本当にいい本は変な修飾語はつけない。
609デフォルトの名無しさん:2005/05/30(月) 14:45:11
>604
そのコンパイラが標準に準拠してるほs(略

まぁどうでもいいが('A`)
610デフォルトの名無しさん:2005/05/31(火) 00:08:07
Cからの移行の場合、どの本がいい?
611デフォルトの名無しさん:2005/05/31(火) 00:09:47
K&R
612デフォルトの名無しさん:2005/05/31(火) 00:26:13
逆戻りさせる気かい?
613デフォルトの名無しさん:2005/05/31(火) 00:28:20
Cがちゃんと使えてるならいきなりC++3rd読んであとはEffectiveシリーズなりModern C++ Designなり。
614デフォルトの名無しさん:2005/05/31(火) 01:15:27
Cからの移行というより、別物と思ったほうが。
615デフォルトの名無しさん:2005/05/31(火) 01:25:07
スクリプト系からの移行なら、まずAccelerated C++
616デフォルトの名無しさん:2005/06/02(木) 10:22:57
自分はいつもクラスを作る時、get_XXX, set_XXX と、パラメータごとに
アクセス関数がずらーーっと、並べちゃうんですが、これは考え方そのもの
が間違っているでしょうか? もうちょっとうまいやり方は、ないのか、
とか思いますが、なにか行き詰まってます。
意味不明なこと書いてるかもしれないですが、アドバイスよろしくお願いします。
617デフォルトの名無しさん:2005/06/02(木) 10:39:01
>>616
その前に読点の使い方を勉強したほうがいい。
618デフォルトの名無しさん:2005/06/02(木) 10:53:27
>>616-617
ワロタ
619デフォルトの名無しさん:2005/06/02(木) 10:55:43
>>616
変数定義が多すぎるか、クラス間のつながりが強すぎるかのどちらかだと思うから、設計から見直す必要あり。

もしそれが変数だけを集めたクラスならアクセサは不要だけど。
620デフォルトの名無しさん:2005/06/02(木) 11:25:58
class hoge {
 private:
  int FMoge;
  void SetMoge(int value);
  int GetMoge();
 public:
  __property int Moge = { read=GetMoge, write=SetMoge };
};

ただし思いっきりコンパイラ依存
621616:2005/06/02(木) 11:32:26
>>619
>>620
どうもありがとうございました。
とても勉強になりました。
622デフォルトの名無しさん:2005/06/02(木) 13:52:34
ハロー(注意報)。えっと、こんなクラスを用意します。

Hoge1.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) { ... }
};

では当然コンパイル通らないので、
623デフォルトの名無しさん:2005/06/02(木) 13:52:47
Piyo.h---------------------------------------
class 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"

くらい?
624622:2005/06/02(木) 13:57:05
うあ、あちこち抜けてる。Piyo.h修正

Piyo.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() { ... }
625デフォルトの名無しさん:2005/06/02(木) 14:15:04
>ハロー(注意報)。

だけ読んだ。
626デフォルトの名無しさん:2005/06/02(木) 14:45:09
よく読んでないけど、ポインタ・参照を渡すようにする。

っていうか、実体を渡す場面が思いつかない。
627デフォルトの名無しさん:2005/06/02(木) 15:15:40
>ハロー(注意報)。
何これ?波浪注意報?
628デフォルトの名無しさん:2005/06/02(木) 16:09:34
ハロー(CV:井上瑤)
629デフォルトの名無しさん:2005/06/02(木) 18:10:39
C++/CLIは正式に策定されたら別スレになるんだろうか
630622:2005/06/02(木) 18:17:31
ハロー(警報)。(好評らしいので)

>>626
実際には参照を渡しとります。
いずれにしても、インライン関数を定義するときに、その関数で使うクラスの定義が必要で、
それが複数のクラスで依存しあう場合にグダグダのガビガビになるんでどうしようかなあと。
631デフォルトの名無しさん:2005/06/02(木) 18:33:17
波浪(again)

Hoge1の参照しているHoge2, Hoge2の参照しているHoge1を
templateで処理しとけ。
632デフォルトの名無しさん:2005/06/02(木) 19:28:00
>>622
hallow (ground)

Hoge2のインライン関数の定義に際して、その前にHoge1のインターフェイスが
必要になる。逆も同様である。よって互いのクラス定義が見える状態である
必要がある。よって双方のクラス定義が共にそれぞれの関数定義の前方に
ある必要がある。よって>>624のような形か設計を変更する以外に手はない。
633デフォルトの名無しさん:2005/06/02(木) 20:15:20
波浪(again)

>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); }
634デフォルトの名無しさん:2005/06/02(木) 20:45:40
どれも呼び出し側は綺麗に書けるんだし好きなの選べばいい希ガス。
定義側は五十歩百歩
635デフォルトの名無しさん:2005/06/02(木) 21:52:03
ファイルストリームからバイナリデータとして入力するには
 ifstream 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);
とあって、絶望的ですが(´д`)
636デフォルトの名無しさん:2005/06/02(木) 22:02:14
二回openすりゃいいじゃん
637デフォルトの名無しさん:2005/06/02(木) 22:52:59
>>635
>具体的には、cin からバイナリデータとして読み込んだり、
>ひとつのファイルの N バイト目以前をバイナリ、残りをテキストとして
前者は兎も角、後者は設計の問題。混在させるメリットが乏しい。
638デフォルトの名無しさん:2005/06/03(金) 00:08:21
コンストラクタについて質問。
//コンストラクタ
Scene::Scene()
: m_pVB(0),m_pTexture(0),m_pTexture2(0) ←この部分について
{
//m_pVB,m_pTexture,m_pTexture2はSceneクラスで定義されてる、変数(ポインタ)
}

上記の矢印の部分なんだけど、一体何をしているんでしょうか?
基本クラスコンストラクタへの引数渡しでもないようなんですが・・

よろしくお願いします。
639デフォルトの名無しさん:2005/06/03(金) 00:23:25
変数の初期化
640デフォルトの名無しさん:2005/06/03(金) 00:42:57
>>636
cinは二回openできるの?

>>638
初期化リスト
641デフォルトの名無しさん:2005/06/03(金) 00:56:42
>>616
単純にプロパティ(パラメータ)が多過ぎるだけでは?
試しにアクセス関数が多過ぎると思うクラスを見せて欲しい
単純に「ずらーと並んでておかしいのかもしれない」と言われたら
メンバ変数とプロパティの区別が付いてない可能性くらいしか思いつかない
642638:2005/06/03(金) 01:16:58
>>639 >>640
ありがとうございます。
理解しました。
643デフォルトの名無しさん:2005/06/03(金) 04:27:47
>>642
どうでもいいことだけど追記
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;
};
}
のように、初期化リストだと煩雑すぎる場合だけ代入を使えと
えふぇシーに書いてあった
644デフォルトの名無しさん:2005/06/03(金) 05:17:58
>>643
大丈夫、その例はコンストラクタで代入するのではなく代入用関数を用意すべきだから。
645デフォルトの名無しさん:2005/06/03(金) 06:14:39
それも込みでの「えふぇシー」。
646デフォルトの名無しさん:2005/06/03(金) 08:12:56
HogeHogeってどういう意味?ホゲホゲ?
10年経っても解らない
647デフォルトの名無しさん:2005/06/03(金) 09:16:15
グーグル先生に聞けばいいと思うよ
648デフォルトの名無しさん:2005/06/03(金) 10:36:53
649デフォルトの名無しさん:2005/06/03(金) 11:24:59
>>641
C++にプロパティなんて無いのに、
メンバ変数とプロパティの区別ってどうゆうこと?
650デフォルトの名無しさん:2005/06/03(金) 11:58:10
このhogeとかfoobarとか詳しい説明がどこにもないのは
プログラマーなら誰しも一度は通る道だからだろうか
651デフォルトの名無しさん:2005/06/03(金) 12:12:02
hogeはプログラマというよりUNIX文化発祥じゃなかろか
652デフォルトの名無しさん:2005/06/03(金) 12:27:18
>>650
「気になる」のは誰もが通る道だろうけど、「どこにもない」ことはないだろう。
検索エンジンが無かったころじゃあるまいし。
653デフォルトの名無しさん:2005/06/03(金) 13:30:51
>>649
C++みたいないい加減な言語使う場合こそ、
ちゃんとオブジェクト指向理解して下さい

Setter/Getterが必要なのはそのオブジェクトのプロパティ(特徴)であって
中でどんな変数でもってるかなんてのは問題じゃないです
複数のメンバ変数を合成した結果かもしれないし、そもそも変数じゃないかもしれない
クラスを便利な構造体と思ってるとプロパティ=メンバ変数と勘違いしてしまう
654デフォルトの名無しさん:2005/06/03(金) 13:52:45
>>653
オブジェクトの状態を表示/設定する手段の一つに
「プロパティ」があるってだけで、それがメンバ関数だろうと
プロキシクラスだろうと、はたまたメッセージ送受信だろうと
んなこたあ問題じゃないです。
そして、C++ には「プロパティ」なるものは存在しません。

>ちゃんとオブジェクト指向理解して下さい
655デフォルトの名無しさん:2005/06/03(金) 14:01:23
>>653
お前が言いたい「プロパティ」とやらは「アトリビュート」だろ。
656デフォルトの名無しさん:2005/06/03(金) 14:10:49
>>654
653は、C++にプロパティがあるとは、言ってない。

C++にプロパティという文法はなくても、「オブジェクト指向」(と言っていいのか?)
にプロパティという概念はある。
クラス=プロパティ+メソッドみたいなもの?

C++ではプロパティを明示する方法が文法で区別されていない、
つまり、プロパティとその他のメソッドを同等に扱うことができるが、
それは扱ってもよい、と等価ではない、

と、653はいいたいのだと思う。
俺は同意。
657デフォルトの名無しさん:2005/06/03(金) 14:17:50
つか、同じ人?
658デフォルトの名無しさん:2005/06/03(金) 15:17:12
別人じゃないの?
こういうマジレスで他人のフリする必要無いし。
659デフォルトの名無しさん:2005/06/03(金) 15:44:55
そういう意味のプロパティなんてOOすら理解してないITドカタのORマッピングでしかつかってねーけどな。
660デフォルトの名無しさん:2005/06/03(金) 16:09:47
またそうやってデタラメを自説の後ろ盾にするw
661デフォルトの名無しさん:2005/06/03(金) 18:02:31
>オブジェクト指向」(と言っていいのか?)
>にプロパティという概念はある。
662デフォルトの名無しさん:2005/06/03(金) 18:03:45
たしかD&Eにはいわゆるプロパティをクラスに搭載することを検討したけど、
operator T()とoperator =(const T&)を持つクラスを置いたりGetter/Setterをメンバ関数にしたりすれば
いいから没にしたとか書いてあったような希ガス。
663デフォルトの名無しさん:2005/06/04(土) 01:24:35
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/multdisp.html
>>635-640あたりのってこれと同じものなの?
さっぱりわからん。

_fmode = _O_BINARY;
_setmode( 0, _O_BINARY );
こういうのってcinとかには左右しないのかな
わからんからサッカー見て寝る。
664デフォルトの名無しさん:2005/06/04(土) 06:49:58
質問どえす

typedef 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 ]でいけるのですが・・・
665デフォルトの名無しさん:2005/06/04(土) 07:44:10
&m_hige[0].hoge; と &m_hige[0].hage;
666デフォルトの名無しさん:2005/06/04(土) 08:01:21
>665
それだとなんか上手くいかなかったdeath

glVertexPointer( 3, GL_FLOAT, 0, &m_hige[0].hoge );
glColorPointer( 3, GL_FLOAT, 0, &m_hige[0].hage );
667デフォルトの名無しさん:2005/06/04(土) 08:15:38
上手くいかないと言われても、何のことやら。
668デフォルトの名無しさん:2005/06/04(土) 08:45:35
glVertexPointerとやらを調べたけど、3番目の引数はsizeof(HIGE)になるんでないか。
HOGEやHAGEの単純な配列じゃないんだから、少なくとも0じゃないと思うけど。
669デフォルトの名無しさん:2005/06/04(土) 08:50:54
あでもvectorのstrideがsizeof(HIGE)でいいのかは俺は分からないや。とにかく0はいかんと思う。
670デフォルトの名無しさん:2005/06/04(土) 09:28:08
>669
それで逝けました。ありがとうございまs・・・
671デフォルトの名無しさん:2005/06/04(土) 09:52:00
>>669
それはsizeof(HIGE)で大丈夫。
>>670
頼むから2ターン目の質問で新事実を出さんでくれ。
>>666までの流れだと完璧に煽りと同じだよ。
672デフォルトの名無しさん:2005/06/04(土) 11:33:34
いくらなんでも「ライブラリの仕様を勘違いしてた」はNGだろ
673デフォルトの名無しさん:2005/06/06(月) 02:02:41
>>408をやってみたんですが
外部シンボル ""public: virtual void __thiscall hoge::Proc(void)" (?Proc@hoge@@UAEXXZ)"は未解決です。
とでてくるんですが、どうすればいいでしょうか
674デフォルトの名無しさん:2005/06/06(月) 02:08:05
>>673 void hoge::Proc(void) を定義する。
675673: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;とする事で通りました。
676デフォルトの名無しさん:2005/06/06(月) 02:22:52
>>675 応用効かせろよ。 hoge::CreateInstance の定義をよーく見直す。
677673:2005/06/06(月) 02:51:59
ごめんなさい、わかんないです。

CreateInstanceを定義するためには
A* A::CreateInstance() {
return new AImpl;
};
これも公開側に書かないとだめで、そうするとAImplの定義が必要になるから
class AImpl : public A {
 virtual void Proc(int x) { ... ;};
};
こっちも公開側に書かないとダメになって意味なくなっちゃうとおもうんですけど
678デフォルトの名無しさん:2005/06/06(月) 04:14:26
>677
Windows 上でプラグインを DLL にしようとするなら、公開しないソース相当の部分とどうにかしてリンクする必要が
あるんじゃない?公開しないソース相当部分を DLL にしてインポートライブラリを提供すればできるんじゃないかな。
EXE でもエクスポートできたような気はするが。
いっそのこと COM にしちゃえば?
679673:2005/06/06(月) 04:34:39
俺は402じゃないんで、プラグイン開発とかじゃないんですが
プロジェクトを分散して開発するときにもこういう手法が必要なんじゃないかと思ってやってました
680デフォルトの名無しさん:2005/06/06(月) 07:57:53
>>677
クラスAの宣言は公開するヘッダに必要。
A::CreateInstance()の定義はDLLに必要。(さらにDLLからエクスポートする必要がある)
A::CreateInstance()でAImplをnewしているからDLLにはAImplの宣言と定義が必要。

DLLを使う側にはAの宣言とA::CreateInstance()のDLLからのインポートが必要になる。
しかしAImplは不要。
681673:2005/06/06(月) 14:11:02
>>680
って事はその場合だとDll側が本体でそれを呼び出す側がプラグインのような形になってしまうと思うんですけど

Dllを呼び出す側に実操作が入ってて、DLL側でそれを利用するという形にしたい場合は
DLL側でAの宣言とA::CreateInstance()のインポートを行うという形でいいんでしょうか
682デフォルトの名無しさん:2005/06/06(月) 14:23:14
>>681
いいんじゃないかね。やってみれば?
683デフォルトの名無しさん:2005/06/06(月) 14:36:31
>>681
そういう場合は、
struct {
 A* (CreateAInstance)();
 ... // その他あれこれ
};

みたいなもの(へのポインタ)をEXE側からDll側に渡してあげるのが
良くあるパターン。
684デフォルトの名無しさん:2005/06/06(月) 16:02:26
>>683
それをクラスとnewを使って実現する方法ってありますか

typedef struct{
class A;
} B;

int main(){
B b;
A* a = new b.A();
}
見たいな感じで出来ますか。
685デフォルトの名無しさん:2005/06/06(月) 16:14:14
>>684
自分でやってみるか、ここで聞きたいなら要件を明らかにせよ。
何がしたいのか、何が気に入らないのかわからん。
686デフォルトの名無しさん:2005/06/06(月) 16:24:01
ExeとDllの両方のヘッダ
class 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が初期化できない

改めて考えると何がしたいんだろ
687デフォルトの名無しさん:2005/06/06(月) 16:24:31
>>684
newするには具体的なクラスの情報が必要なので、この件ではAImplを公
開しない限りnewを使うのは不可能。
688デフォルトの名無しさん:2005/06/06(月) 17:29:09
A* a = new B::A;
689デフォルトの名無しさん:2005/06/06(月) 17:33:00
>>688
その場合だとa->act();が未解決の外部シンボルになります。
690デフォルトの名無しさん: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);
};
691デフォルトの名無しさん:2005/06/06(月) 17:56:41
もうVCスレ逝けよ。
692デフォルトの名無しさん:2005/06/06(月) 17:57:42
>>690はあれだが
それ以外はVC関係なくないか
693デフォルトの名無しさん:2005/06/06(月) 18:18:55
cfrontがダウンロードできる所を知ってる方はいらっしゃいますか?
AT&TやBell研やらgoogle先生やらに聞いて見ましたがわかりません(´・ω・`)
694デフォルトの名無しさん:2005/06/06(月) 18:58:38
>>693
無料でダウンロードできるAppleの旧々開発環境のMPWに
ついてたような気がする。バイナリだけど。
695デフォルトの名無しさん:2005/06/06(月) 19:41:43
ようやくEffective C++ 3rd(英語版)が手に入った。
訳すの面倒だけど、見出しだけならぱっと見て読めるし、
2ndと内容的に重なっている部分も多いので、読むのはそんなに
苦にならない。
696デフォルトの名無しさん:2005/06/06(月) 19:52:40
(∩゚д゚)アーアー
697デフォルトの名無しさん:2005/06/06(月) 20:00:30
(∩゚д゚)イーイー
698デフォルトの名無しさん:2005/06/06(月) 20:47:34
>>694
ありがとうございます。
でもおいらMac持ってないので、友人のMacに入れて…
699デフォルトの名無しさん:2005/06/07(火) 00:29:49
>>695
おれも今日手に入れた。
で、なんとなく読んでみた Item 46 が
いきなり知らなかった内容でびっくりした。
700デフォルトの名無しさん:2005/06/07(火) 06:15:38
質問です
C++を始めたい初心者です
おすすめのフリーのコンパイラとフリーのIDEがあれば教えて下さい
701デフォルトの名無しさん:2005/06/07(火) 07:13:12
eclipse+cdt+gcc
702デフォルトの名無しさん:2005/06/07(火) 07:24:53
Dev-C++
703デフォルトの名無しさん:2005/06/07(火) 11:12:53
>701
それが一番最強な気がするのでそれ試してみます
704デフォルトの名無しさん:2005/06/07(火) 11:27:15
>>700
mule+gcc
705デフォルトの名無しさん:2005/06/07(火) 15:14:58
706デフォルトの名無しさん:2005/06/07(火) 20:51:45
vim+g++
707デフォルトの名無しさん:2005/06/08(水) 04:37:10
char*const*pってどういうことですか?
こんなところにconstついてるの初めてみました。
708デフォルトの名無しさん:2005/06/08(水) 09:06:13
double型がとれる最小値は-DBL_MAXでよいのでしょうか?
709デフォルトの名無しさん:2005/06/08(水) 09:07:06
>>707
その前に char const* p と char *const p の違いは分かる?

前者は「const char へのポインタ」で p 自体は変更可能だが、p が指す先は
リードオンリー。++p は OK だが (*p)++ とか *p = '\0' はダメ。

後者は「char への const ポインタ」で p の値は変更不可能だが、p が差す
先は変更可能。++p はダメだけど *p = 'a' は OK。
710デフォルトの名無しさん:2005/06/08(水) 09:11:46
*が二度出てくるのは俺も初めて見たw
711デフォルトの名無しさん:2005/06/08(水) 09:26:35
内側から読めばいいよ。
p is (modifiable) pointer to const pointer to const char

pはポインタ。p自身を書き換えてもいい。
pの示す先(*p)は書き換え不可能なポインタ。*pは書き換えちゃいけない。
*pの示す先(**p)はchar。これは書き換えてもいい。

712デフォルトの名無しさん:2005/06/08(水) 09:28:21
なんか一個constが増えてる予感。
下の三行だけ読んでくれ。
713707:2005/06/08(水) 09:35:53
>>709>>712
なるほど。constにまつわる話ってポインタ自身とポインタが指す先とどっちも考えなきゃいけないわけですね。
d!
ちょっとまだ疑問なんですが、>>709さんの char const * p っていうのは const char * p と比べてどうなんでしょうか・・・?
714デフォルトの名無しさん:2005/06/08(水) 10:09:46
>>713
char const * p と const char * p はどちらも同じ。
const int foo = -1; と int const foo = -1; も同様。
715707:2005/06/08(水) 10:12:58
同じだったんだ・・・orz
どうもです。
716デフォルトの名無しさん:2005/06/08(水) 10:25:11
>>708
大して違いはないばかりか非効率だと言われればそれまでだが、
 -numeric_limits<double>::max();
の方がいいんじゃない?
717デフォルトの名無しさん:2005/06/08(水) 11:10:13
別に効率は変わんないんじゃないの?
718デフォルトの名無しさん:2005/06/08(水) 11:21:53
numeric_limits<double>::min();じゃだめなの?
719デフォルトの名無しさん:2005/06/08(水) 13:19:43
>>718
min()は「表現できる正の最小値」だから、0に限りなく近い値を示す
(浮動小数点値の場合)

効率についてはパパよくわかんないけど、#defineはコンパイル時定数、
numeric_limits<double>::max()はgcc3.3.3だと
static double max() throw() { return __DBL_MAX__; }
だから実行時定数になる分、パラノイアからしたら効率が下がっているのかもしれない悪寒。
720デフォルトの名無しさん:2005/06/08(水) 15:55:49
STLのvectorクラスのような動的に確保するもので、
2次元(orN次元)で扱えるものは有りますでしょうか?
721デフォルトの名無しさん:2005/06/08(水) 15:59:38
vector<vector<T> >
722デフォルトの名無しさん:2005/06/08(水) 16:37:45
>>716
そういう機能はさ、テンプレートパラメタで渡った型の
プロパティーをテンプレートクラス・関数側で調べるためには
どうしても必要だから標準ライブラリにあるんだけど
そうでなければ、別にどっちつかってもどうでもいいと思うんだが
723デフォルトの名無しさん:2005/06/08(水) 18:39:15
>>720
boost::multi_array
724デフォルトの名無しさん:2005/06/09(木) 02:23:09
>>719
numeric_limits<double>::min() (および DBL_MIN )って正の値だったのか。
型として取り得る最小の値を返してくれると思ってたから、
double については負の値だと思ってたよ。

型としての最小値を、テンプレート引数 T から取ろうと思ったら、
numeric_limits<T>::min() だと浮動小数点型の時にダメだし、
-numeric_limits<T>::max() だと整数型の時にダメになるってこと?
場合分けが要るのか?
725デフォルトの名無しさん:2005/06/09(木) 04:06:13
INT_MINは0?
726デフォルトの名無しさん:2005/06/09(木) 06:36:29
>>725
そういうことじゃなくて INT_MIN != -numeric_limits<int>::max() ってこったろ。
2の補数的には負の数のが一つ多い。
727デフォルトの名無しさん:2005/06/10(金) 00:39:28
>724
Effective 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 を
返すべきなんでしょうかね。
728デフォルトの名無しさん:2005/06/10(金) 01:23:15
template<typename T>
T minimum_value_of()
{
 typedef std::numeric_limits<T> limits;
 return limits::is_integer ? limits::min() : -limits::max();
}

これでいいのか?
判定を is_integer でやるのは、隙があるように思うが、
どうやって判定すべきかわからんな。
729デフォルトの名無しさん:2005/06/10(金) 15:43:38
boost::multi_arrayを使用したソースをコンパイルしたところエラーが発生したんですが、
エラーメッセージはboost/mpl/aux_/integral_wrapper.hppでエラーが発生したとなっており、
どういった経路でインクルードされたのかを調べるだけでも嫌になりそうです。
こういった分かりにくいエラーメッセージに対処するいい方法はないでしょうか?
730デフォルトの名無しさん:2005/06/10(金) 16:08:14
>>729
エラーメッセージ貼れよ。長くて貼れないなら、zipに固めてどこかのロダにうp。
STL/Boost関連のエラーメッセージはとにかく複雑でグチャグチャなので、
使用したコンパイラと(エラーメッセージを見ればコンパイラは見当が付くが)、
エラーメッセージがないと何とも言えない。

STLfiltというツールもあるが、Perlを入れて動かしてみる手もある。
http://www.bdsoft.com/tools/stlfilt.html
731729:2005/06/10(金) 16:55:27
>>730
すみません、環境はBCC5.5.1とBCC Developerを使っていて、エラメッセージは
エラー E2489 c:\boost_1_32_0\boost/mpl/aux_/integral_wrapper.hpp 45: オプションコンテキスト応答深度の上限を超過: 再帰をチェックしてください

これが25回連続出ます(26個目は「エラーあるいは警告が多すぎる」)。

STLfilt落としてみましたが、英語が読めなく使い方が分からないので、あとで翻訳かけながらじっくり読んでみます。
732デフォルトの名無しさん:2005/06/10(金) 17:04:17
733デフォルトの名無しさん:2005/06/10(金) 17:20:56
>>731
そりゃ、templateで再帰展開してる場合が多いしな。
>>732のリンク先見たらfailと書いてあるし、だめみたいだね。
VC7.1かgccが他に有名だからそういうのにすべし。
gccをMinGWにしてSTLport入れれば、BCCなんて不要だし、
Dev-C++を入れればBCC Developerと同じような環境に出来る。
734729:2005/06/10(金) 18:47:28
>>732 >>733
そういうことだったんですか。
gccに乗り換えることにします。
どうもありがとうございました。
735デフォルトの名無しさん:2005/06/10(金) 19:11:52
>>734
あーそうだ、gccは日本語対応してないので、ソ系ダメ文字の問題が
あるので(「ダメ文字」でぐぐるとわかる)、それだけは気を付けてくれ。
コメント欄に書いただけでエラーになる。解決法はその文字の後に'\'
を書くだけなんだが。

前に // 一覧表 と書いてエラーになり、何度調べてもプログラムに
間違いが無く、困っていたが、「表」がダメ文字だとわかり、// 一覧表\
と書いて解決した。
736729:2005/06/10(金) 19:15:07
>>735
thx
737デフォルトの名無しさん:2005/06/11(土) 00:11:31
コメント欄に関してなら、行末に空白や*を入れるだけで充分だと思う。
文字列リテラルはエスケープしなくちゃいけないから、要注意という点はその通りだけど。
738デフォルトの名無しさん:2005/06/11(土) 00:18:39
そこまで頑張ってWinでgcc使うぐらいならVC++使へ
739デフォルトの名無しさん:2005/06/11(土) 00:21:06
金があったらVC7.1買え。それが本当はいい選択なんだが。
秋には2005出るぞ。VC7.1買っておけば多分安く買える。
740デフォルトの名無しさん:2005/06/11(土) 00:26:38
金がなくてもコンパイラ部分だけはタダで使えるしな
741デフォルトの名無しさん:2005/06/11(土) 01:08:42
effective c++ 読んでて疑問に思ったんだが、
const Foo foo() { return Foo(); }
っていう const オブジェクトを返す関数の戻り値を
Foo f(foo());
みたいに非 const オブジェクトで受けた場合、RVOってできるものなの?
742デフォルトの名無しさん:2005/06/11(土) 01:34:39
出来る
743741:2005/06/11(土) 02:16:54
あ、すいません。勘違いしていました。
聞きたかったのは RVO の次の段階で、
foo() の戻り値である一時オブジェクトをも
最適化で消すことができるかということでした。

ネタ元の記事を発見したので読み返してみます。
お騒がせしました。
http://www.cuj.com/documents/s=8246/cujcexp2102alexandr/
744デフォルトの名無しさん:2005/06/11(土) 04:25:00
最近のgccはコマンドラインで指定すればiconv使ってくれるしデフォルトでutf-8
を仮定する(もしくはロケールから推測する)と思うんだが。

745デフォルトの名無しさん:2005/06/11(土) 16:03:42
日本語を使うときは、wchar_t や wstring って
使ったほうがいいんでしょうか?
使わなくても困ったことがないんですけど。
746デフォルトの名無しさん:2005/06/11(土) 16:05:56
>>745 困ってないなら使わなくていい。
747デフォルトの名無しさん:2005/06/11(土) 16:17:47
>>745
boost::regexを使うときとかに困る。
困ってから使えばいい。
748745:2005/06/11(土) 16:58:59
問題がでたら、その所で、変換すればOKってことですか?

私が以前使ったのは、半角と全角文字がまざっていて、
全角文字を1文字としたとき wchar_t に変換すると、
便利でした。
これが正常な使い方かどうかは、知りません。

あと、unicode を使うときは、wchar_t を使ったほうが
よさそうな感じがして、悩んでます。
UTF-8 なら使わずにすむかなぁとか。

wchar_t や、wstring について解説してあるよいページってないですか?
見てみたんですが、どういうときに使うべきかっていうのは
見つからなくて。
749デフォルトの名無しさん:2005/06/11(土) 18:45:00
>>748
UTF-8はマルチバイト文字の1種みたいなものだから
プログラム内部で使うのにはあまり向いていないと思う。
750デフォルトの名無しさん:2005/06/11(土) 19:12:50
wchar_t使ってもエンコードがUTF-16だったりすると(以下略なわけだが。
751デフォルトの名無しさん:2005/06/11(土) 19:19:40
仕様:本ソフトウェアはサロゲート・合成文字の類には一切対応しておりません。
752デフォルトの名無しさん:2005/06/11(土) 21:57:26
そんなもん使うやつはいないからそれでいいよ
753デフォルトの名無しさん:2005/06/14(火) 03:58:37
コンパイル時に数が確定しているstaticなインスタンスを数え上げて
そのインスタンスへのポインタの配列を
コンパイル時に自動的に確保するようなコードって書けますか?

例えばclass Fooがあったとして
Foo a, b, c;
としたときに
Foo* AllFoos[3] = { &a, &b, &c };
のようなものをコンパイル時に作ってしまいたいんです

テンプレートとコンストラクタとstaticメンバ組み合わせれば
出来そうな気がするんですけど、なかなかうまくいきません
754デフォルトの名無しさん:2005/06/14(火) 05:45:13
Foo* AllFoos[3] = { &a, &b, &c };
の部分を自動で生成するってことか?

>テンプレートとコンストラクタとstaticメンバ組み合わせれば
>出来そうな気がするんですけど、なかなかうまくいきません
これだと実行時じゃないの?
755デフォルトの名無しさん:2005/06/14(火) 06:01:31
>>754
その部分の3ていう数字とか&aとかの部分です

というのもFooオブジェクトはスタティックな
インスタンスとしてしか存在しないんだけど
ソースファイルのいろんなところに散らばってしまうので
追加修正があったときにGrepしてカウントするのは非効率かなと

なんでコンパイル時にこだわってるかは、例えば
インスタンスの数が極端に少なければ全てのインスタンスに対するループ
for (int i = 0; i < Fooの総数; ++i) {
  AllFoo[i]->SomeMethod();
}
がコンパイラの最適化によって展開されたりしたらいいなあと
756デフォルトの名無しさん:2005/06/14(火) 06:17:50
for文をこうすれば
for (int i = 0; AllFoo[i]!=NULL; ++i) {
修正箇所は一箇所じゃないの?
Foo* AllFoos[] = { &a, &b, &c, NULL };

最適化はよくわからんけど
それだと仮に最適化されてもどうでもいいような速度じゃない?
757デフォルトの名無しさん:2005/06/14(火) 06:59:28
>>756
わかりにくくてすみません
概念的にリスト構造なんで仮に配列で表現したまでで、
実際配列でやるのかは実装次第です

例えば実行時にリストを構築するとすれば
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);
  }
};
みたいにな感じになると思うんですが、動的に作らないクラスなので
コンパイル時に全てのインスタンスがわかるので
起動時に一々リスト構築するよりうまいやり方がないかなと思ったわけです
758デフォルトの名無しさん:2005/06/14(火) 07:54:01
std::vector::push_back
を呼び出すならコンパイル時には無理なんじゃないの?
759デフォルトの名無しさん:2005/06/14(火) 10:50:33
>>753
俺だったら簡単なスクリプトを書いてそういうソースを自動生成するな。
760デフォルトの名無しさん:2005/06/14(火) 11:23:09
適当に書いただけだと思うが、
  static void ForEach(std::unary_function<Foo, void> func) {
    std::foreach(s_AllFoos->begin(), s_AllFoos->end(), func);
  }
こんなの間違っても書くなよ
761デフォルトの名無しさん:2005/06/14(火) 13:26:47
>>759
ですから、あくまで例です…

>>759
確かにスクリプトの領分かもしれません
一旦別の方向で考えてみます

>>760
すみません適当すぎましたw
762デフォルトの名無しさん:2005/06/14(火) 23:11:40
超初心者が質問してもいいスレはこちらですか?(;´Д`)
763デフォルトの名無しさん:2005/06/14(火) 23:24:28
いいえ
764デフォルトの名無しさん:2005/06/14(火) 23:25:43
【初心者歓迎】C/C++室 vol.18
http://pc8.2ch.net/test/read.cgi/tech/1117984322/l50
765デフォルトの名無しさん:2005/06/14(火) 23:26:38
先輩にnullは使うなといわれました。確かに安易に使ってはいけないとおもいますが
こうゆう場合はどうなのでしょうか?

俺がつくった関数
hoge getHoge()
hogeが取れなかった場合nullを返す

先輩がつくった関数
boolean getHoge(hoge &h)
hogeが取れなかった場合falseを返す

どちらも呼ぶ側はif(!getHoge(...))です。ここまでしてnullを避けなければならないのでしょうか?
会社によってはこうゆうルールがあるのですか?先輩はnullはダメだとしか教えてくれませんでした

766デフォルトの名無しさん:2005/06/14(火) 23:28:22
わざわざnullableまで作ったMSの立場は
767デフォルトの名無しさん:2005/06/14(火) 23:28:48
>>765
もしかして、言語が Java じゃないか?
768デフォルトの名無しさん:2005/06/14(火) 23:32:07
>>767
C++です
769デフォルトの名無しさん:2005/06/14(火) 23:34:11
どんな事にせよ明確な理由も述べずに教条的に「〜しろ」言う奴は信用しない方が
770デフォルトの名無しさん:2005/06/14(火) 23:41:01
信用はせず、イヤイヤ黙って従っておく
というあたりが、おすすめの処世
771デフォルトの名無しさん:2005/06/14(火) 23:44:49
こういう話なんじゃないのかね。
http://www-6.ibm.com/jp/developerworks/java/010810/j_j-diag2.html
772デフォルトの名無しさん:2005/06/14(火) 23:47:39
nullアクセスで例外を吐いてくれるとはなんて親切なんだ!

とC/C++使いとしてはうらやましいわけですよ
773デフォルトの名無しさん:2005/06/14(火) 23:54:36
Windowsなら例外飛んでくるぞ。SEHのほうだがな
774デフォルトの名無しさん:2005/06/14(火) 23:54:41
Windows上ではC/C++でもSEHになる。少し細工すればC++例外に出来る。
まあここはそんなスレじゃないけどな。
775デフォルトの名無しさん:2005/06/15(水) 00:04:46
>>768
boolean とか、hoge getHoge() でなぜか null を返せるとか (hoge がポインタ型に
typedef されてるのか?) 俄には信じがたいんだが。

null 返すな bool にしとけ、ってのは CODE COMPLETE で見た気がする。
ポインタだとエラーチェックを端折るヤツが多くて後で苦労した、という実経験に
裏打ちされた話だったような。
776デフォルトの名無しさん:2005/06/15(水) 01:44:44
ポインタだとエラーチェックを端折るヤツが多くてboolだと大丈夫という理屈はさっぱりわからんな。
ただポインタ返されてもそれがnewしたものかメンバのポインタかわからんので
コードメンテ上良くない。
777デフォルトの名無しさん:2005/06/15(水) 09:12:59
>>776
> ポインタだとエラーチェックを端折るヤツが多くてboolだと大丈夫という理屈はさっぱりわからんな。
理屈は分からなくても、実際にデバッグ工数減れば何でも良いよ。
778デフォルトの名無しさん:2005/06/15(水) 22:01:46
ポインタでエラーチェックを端折るヤツはboolでも端折るんじゃないかと
779デフォルトの名無しさん:2005/06/15(水) 23:51:49
コンストラクタの本体で、thisの指す先もしくは*thisを構築済みの
有効なオブジェクトとして扱う行為は正当でしょうか?

class C;

void func(C &); // Cのオブジェクトを操作する

class C
{
C(){ func(*this); }
};
780デフォルトの名無しさん:2005/06/16(木) 00:00:42
>>779
「構築済み」を規格レベルの意味で捉えるなら、不当。
コンストラクタの実行が完了したときに「構築済み」と言える。
ttp://www.kuzbass.ru/docs/isocpp/basic.html#basic.life
781デフォルトの名無しさん:2005/06/16(木) 00:46:46
>>780
ありがとうございます。
http://www.kuzbass.ru/docs/isocpp/special.html#class.init
上節などを読む限りでは構築中の場合でも制限付きで扱えるということみたいですね。
ただこれに関して規格を厳密に追うのは結構しんどそうだと理解しました。
782デフォルトの名無しさん: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
783デフォルトの名無しさん:2005/06/17(金) 00:05:41
>>782
(test.*test.run)(3);
784デフォルトの名無しさん:2005/06/17(金) 00:06:40
test.*run(3);
じゃない? 試してないから知らんけど。
785デフォルトの名無しさん:2005/06/17(金) 00:06:44
>>782
class 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); }
};
786デフォルトの名無しさん:2005/06/17(金) 00:07:11
>>782
class 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);
}
787デフォルトの名無しさん:2005/06/17(金) 00:07:27
(test.*(test.run))(3);
788デフォルトの名無しさん:2005/06/17(金) 00:07:36
>>782
汚すぎ。
せっかくC++使うんならポリモフィズム使えばいいだろが。
789786:2005/06/17(金) 00:08:01
かぶった。すまぬ。
790デフォルトの名無しさん:2005/06/17(金) 00:08:34
何人いるんだ・・・
791784:2005/06/17(金) 00:10:00
皆質問に飢えてたりするのかねw
792782:2005/06/17(金) 00:11:40
一気にすごい数の回答が。。ありがとうございますm(__)m
今からそれぞれ試してみます!

793デフォルトの名無しさん:2005/06/17(金) 00:14:23
>>791
飢えているなら俺から質問

voidってなに?
794デフォルトの名無しさん:2005/06/17(金) 00:17:55
全然関係ないが
> <-- test.b_(3)が呼ばれてほしい
これは無理だろ
795デフォルトの名無しさん:2005/06/17(金) 00:20:53
ひっかけ問題か。全員不正解!
796デフォルトの名無しさん:2005/06/17(金) 00:21:15
>>794
783- の回答でできたんじゃないの?
797784:2005/06/17(金) 00:22:40
>794
Ω<ナ、ナンダッテー
798デフォルトの名無しさん:2005/06/17(金) 00:23:04
>>793
戻り値なし
799デフォルトの名無しさん:2005/06/17(金) 00:24:14
>>798
thx
ホントにvoidだけにスルーされたかと思った
800デフォルトの名無しさん:2005/06/17(金) 00:25:21
void* what_about_this(void);
801デフォルトの名無しさん:2005/06/17(金) 00:26:03
>>796
> Test test(1);
となってるからrunにはTest::a_が入る。
だからTest::b_は呼ばれない。
802デフォルトの名無しさん:2005/06/17(金) 00:28:56
>>801 あーそうだったのか。
803デフォルトの名無しさん:2005/06/17(金) 00:32:19
>>800
はいはい
void*型
引数なし
804782:2005/06/17(金) 00:32:23
>>785
=
>>786
は無事うまく行きました。文法的に
何をやっているかも理解できました。なるほどこうやればいいんですね。
ありがとうございます。
>>783
>>787
は共に文法的に同じ事を意味しているようですね。
文法的にどのような構造になっているのか
よく理解できていないのですが、無事うまくいきました。
何だか分からんが、すごいです。。
>>784
は残念ながら私の環境ではエラーになってしまうようです。
>>788
確かに、きたないですね。。ただ、対応すべき関数(a_,b_など)がいっぱい
ありすぎるため、いちいち子クラスを作ると大量にクラスができてしまう
ので躊躇してしまっています。

皆様、これくらいの事は一瞬で分かるようで、
すご過ぎて尊敬してしまいます。
大変勉強になりました。どうもありがとうございましたm(__)m
805デフォルトの名無しさん:2005/06/17(金) 00:35:24
>>782
お前はすごいよ
俺なんてvoidすらわからねぇんだから自信もて
806782:2005/06/17(金) 00:35:25
>>795
よし、皆ひっかかったぜ!




というのは大嘘で、単なるミスです。。
すみません、ご指摘ありがとうございました。
807デフォルトの名無しさん:2005/06/17(金) 00:35:53
>>804
どういう経緯でそれが必要になったか知らないが、設計考え直したほうがいいぞ。
808デフォルトの名無しさん:2005/06/17(金) 00:37:12
>804
>>783等の形は、
「メンバ関数へのポインタ(変数)は、そのクラスのメンバであるとは限らない」ことから。
変数を指定するためのtest.runと、
そのメンバ関数ポインタを呼び出すインスタンスとしてのtest
この2つが必要だということ。
809デフォルトの名無しさん:2005/06/17(金) 00:39:14
関係ないんだが
会社とかでさ
パッケージを保守する仕事してたら
ソースのFOR文とかに
iとかjとかつかってるのがあると萎えるのはなぜ
810デフォルトの名無しさん:2005/06/17(金) 00:41:12
i, j よりも for が大文字なのが、一体どんなマクロかと思って萎える。
811デフォルトの名無しさん:2005/06/17(金) 00:42:46
>>810
特に深い意味はなかったけど何で大文字にしたんだろ
812782:2005/06/17(金) 00:43:28
>>807
そうですね。色々ほかの可能性も考慮に入れて見る事にします。
>>808
なるほど。。超勉強になります。どうもありがとうございます。
813デフォルトの名無しさん:2005/06/17(金) 12:00:34
class TestBase {
public:
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;
}
814デフォルトの名無しさん:2005/06/17(金) 12:03:32
>>813
Strategyを差し込もうよ。
815813:2005/06/17(金) 13:26:01
>>814
俺も勉強中なんだ。リファクタリング希望。
816813:2005/06/17(金) 13:28:53
こんなか?
class 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:") {}
};
817デフォルトの名無しさん:2005/06/17(金) 14:22:57
>>814
書いてからよく見たらほとんど変わらなかった。

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_;
};
818デフォルトの名無しさん:2005/06/17(金) 14:50:07
こうしてみると>>785あたりが意外と悪くない気がするなぁ。
別クラスにすると場合によってはTestのポインタを(TestA,TestBとかに)引き渡さなくちゃいけなくなるし。
819デフォルトの名無しさん:2005/06/17(金) 18:32:53
std::stackって最後に追加したものだけしか要素を参照できませんよね.
先頭とその次の要素まで参照できるstackがほしいんですが,どう実装するのが良いんでしょうか.
820デフォルトの名無しさん:2005/06/17(金) 18:40:47
stack使わずにdequeなりvectorなり使えば?
821819:2005/06/17(金) 19:52:05
>>820 とりあえず今は std::deque で実装してるんですが,先頭から二つの要素が見える
stackとしてしか使っていないので,できる限りstackっぽくしたいんですよねえ.
822デフォルトの名無しさん:2005/06/17(金) 20:37:14

std::stack stk;   // ゴミ箱があるとする
tmp = stk.top(); // ふたをコピーして
stk.pop();         // ふたを開けるとする
// stk.top();     // 中身を見てうげー
stk.push(tmp);  // ふたを閉める
これしかないんじゃ?
823デフォルトの名無しさん:2005/06/17(金) 21:28:03
>>818
うん。
生のメンバ関数ポインタを boost function に変えれば、
ほぼ 785 の通りにできるよね(呼び出し時にもthisとか
いらない)。
824デフォルトの名無しさん:2005/06/18(土) 16:32:00
boostのソース追ってて気になったんですが、
メソッドの引数で(foo<T> const & r)みたいな
constの位置ってどういう意味なんでしょうか?

(char * const bar) みたいのがポインタ不変宣言なのは知ってるのですが
参照の前にconstがあるのは知りませんでした…
825デフォルトの名無しさん:2005/06/18(土) 16:34:08
const T と T const は同じ
826デフォルトの名無しさん:2005/06/18(土) 16:58:44
>>825
ありがとうございます
827デフォルトの名無しさん: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);
}
みたいのを、具体的にどうやって記述して良いのかわかりません
数値ならハッシュテーブル、文字列なら二分木、みたいな感じでやりたいのですが…
828デフォルトの名無しさん:2005/06/19(日) 05:42:34
template<typename valueT, typename indexT> class MyTable;

template<typename valueT>
class MyTable<valueT,int> {
 //ハッシュで実装
};

template<typename valueT>
class MyTable<valueT,char*> {
 //木で実装
};

これじゃダメか?
829デフォルトの名無しさん:2005/06/19(日) 11:22:29
>>828
あー…なるほど…クラス自体を特殊化してしまうんですね
830デフォルトの名無しさん:2005/06/19(日) 11:25:08
本当にメンバフィールドの型だけを変えたいってのなら、Boost 使うとこんな感じ?

typedef 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> {
// 二分木実装
};
831デフォルトの名無しさん:2005/06/19(日) 16:41:20
>>830
ありがとうございます
テンプレートをboolリテラル?的に扱うのは
覚えた方が良さそうですね
832デフォルトの名無しさん:2005/06/21(火) 19:17:40
ガウス・ジョルダン法を用いてn*(n+1)行列を変形する関数を作っているのですが、
変形する関数(GaussJordan)は行列のクラスのメンバ関数にしていいと思いますか?
833デフォルトの名無しさん:2005/06/21(火) 20:40:31
俺ならそうはしない。
インタフェースは必要最小限がいい。
834デフォルトの名無しさん:2005/06/21(火) 21:01:48
テンプレートのことで聞きたいんですが,

class A
{
//普通なクラス
};

template <class name>
class B{
//テンプレートクラス
};

があったとします。

そして、このテンプレートクラスを使うために"型"を指定してインスタンス化
するわけですけど
b<型> object;

この"型"に一番上に書いた「class A」のような
自分で作ったクラスを"型"として指定できるのでしょうか?
int型などは、普通に指定できるのはわかっているんですが・・・・

ご教授お願いします。
835デフォルトの名無しさん:2005/06/21(火) 21:04:30
できる。
836デフォルトの名無しさん:2005/06/21(火) 21:16:14
>>833
ですよね。
ありがとうございました。
837デフォルトの名無しさん:2005/06/21(火) 22:27:09
クラスのメンバ関数に関してなんですが
クラスのインスタンスにはメンバ関数へのポインタは含まれてないけど、
そのかわりに○○○って所へのポインタを持っていて
メンバを呼ぶと○○○からたどって目的のメンバ関数を呼び出すって感じだったと思うんですけど
○○○って何て名前ですか? たしかアルファベット3文字だったと思うんですけど。
838デフォルトの名無しさん:2005/06/21(火) 22:28:36
vtblのことか?
ちなみに仮想関数だけな。
839デフォルトの名無しさん:2005/06/21(火) 22:29:50
vtbl?
840デフォルトの名無しさん:2005/06/21(火) 22:32:10
DVD
841デフォルトの名無しさん:2005/06/21(火) 22:38:05
>>838-839
どーもありがとん。
842デフォルトの名無しさん:2005/06/21(火) 22:53:16
>>833
C++って何でもメンバにしがちだけど
俺もそっちの方が自然だと思うな。
例えばvectorクラスだったら、
長さを返すlengthはメンバでいいと思うけど
正規化するnormalizeは関数の方がいいみたいな。
843デフォルトの名無しさん:2005/06/21(火) 22:58:00
normalize なんかは非常によく使うので、
メンバ、関数共に存在して欲しい
844デフォルトの名無しさん:2005/06/21(火) 23:02:44
自己書き換えで const でないメンバ関数 normalize (戻り値なし)と、
正規化した結果を返す関数 T normalize(const T&) の両方欲しい。
効率の観点から。
845デフォルトの名無しさん:2005/06/21(火) 23:06:22
俺はlengthもフリー関数で良いと思うけど。
効率の問題があるなら>>844みたいにするか、成分ごとの操作を許すかだな。
846デフォルトの名無しさん:2005/06/21(火) 23:26:37
ノーマル関数というかクラスのstatic関数にしないか普通
847デフォルトの名無しさん:2005/06/21(火) 23:35:57
もれのところでは
class Vector {
  float Norm() const;
  Vector& Normalize();
  static Vector Normalize(const Vector& v);
  inline float Length() const { return Norm() };
};
みたいになっている
しかしガウスジョルダンだかしらんけど
用途が極限られてるメソッドは
独立させた方がいいんじゃないかね
848デフォルトの名無しさん:2005/06/21(火) 23:36:00
>>846
なんでそんなことするんだ?
849デフォルトの名無しさん:2005/06/21(火) 23:37:56
わかってないから
850846:2005/06/21(火) 23:42:01
あれ?俺だけ?
例えば>>847のように
Vectorクラスに関連してるが
インスタンスの情報は必要ないユーティリティ的な関数ってstaticにするけど
851デフォルトの名無しさん:2005/06/21(火) 23:46:23
値を返す方は漏れも普通の関数にするな。

>>845
>効率の問題があるなら>>844みたいにするか、成分ごとの操作を許すかだな。
「成分ごとの操作を許さない行列クラス」ってちょっと使い難いと思う。

>>847
>Vector& Normalize();
なるほど。 v2 = (x - y).Normalize() * 2; とか効率よく出来るわけね。

>>848
普通の関数にするのは、Vectorみたいなデータクラスの操作を一々
メンバ関数にしてられっかょ、何か追加するたびに毎回Vectorみたいな
基本的なクラスに変更が入んのか、というようなことだと思う。
852デフォルトの名無しさん:2005/06/21(火) 23:57:30
基本的には同意だが、ベクタぐらいならともかく、
外に見せるインターフェースと内側での実装の間に
多少なりとも違いのあるクラスなら、メンバ関数にして内側の実装を直接いじった方が
効率がいいかも、とは考えるかな。
853デフォルトの名無しさん:2005/06/21(火) 23:59:42
>>850
俺なら同じファイルに入れるだけにするな。
static関数もカプセル化のために使いたい。
854デフォルトの名無しさん:2005/06/22(水) 01:40:25
>>843-844
俺はどっちかに統一して欲しいなあ。
神経質なんで。
855デフォルトの名無しさん:2005/06/22(水) 01:54:43
ん、いきなり流れを立って申し訳ないけど。

VC6でbool形に true to falseしか代入させないようにするって出来ますでしょうか?

VC6だとこれ通っちゃうんですけど・・・
bool foo = (float)1.0;
bool foo = (double)1.0;

TRUE,FALSEの代入も抑制したいんです。
856デフォルトの名無しさん:2005/06/22(水) 01:57:24
>>855
無理
857デフォルトの名無しさん:2005/06/22(水) 01:57:34
>>855 言語の規格なんで、無理。
858デフォルトの名無しさん:2005/06/22(水) 02:18:54
boolean型新たに作るとか
859デフォルトの名無しさん:2005/06/22(水) 03:26:53
boon b;
860855:2005/06/22(水) 08:38:43
無理ゆーなーヽ(`Д´)ノ

一時オブジェクトを生成させることによって、
コンパイルエラーをわざとと吐かせることは可能なんだぞ。

あとはグローバルの bool operator = をオーバーライドする方法さえあればいいのに。

int f(void){return 1;}
#undef TRUE
#define TRUE f();

bool foo1 = TRUE;
861デフォルトの名無しさん:2005/06/22(水) 08:44:36
>>860 だから、無理。
862デフォルトの名無しさん:2005/06/22(水) 14:39:24
時間と手間をかけるほどの意味なし。
863デフォルトの名無しさん:2005/06/22(水) 17:44:57
>>855
VC7.1では1と0のリテラル以外なら整数・浮動小数点数共に警告が出た。
864デフォルトの名無しさん:2005/06/22(水) 22:03:37
>>835さん回答ありがとうございます。

で、また疑問が出てきました。

あの、.netを使ってるんですけど
テンプレートのことで

.h
でテンプレートクラスとその関数を定義
.cpp
でテンプレートの関数を実装

でビルドするとリンクされてませんエラーが出ます。
このスレの過去ログで、vc6ではこのcppとhの分離が出来ないということがわかりました。

現在でもこのcppとhの分離は出来ないのでしょうか

よろしくお願いします。
865デフォルトの名無しさん:2005/06/22(水) 22:18:16
テンプレートは全部ヘッダに書く。これC++の決まり。
866デフォルトの名無しさん:2005/06/22(水) 22:20:28
exportでできるけど 可能な実装見た事ないなぁ
867デフォルトの名無しさん:2005/06/22(水) 22:22:45
>>866
こも
868デフォルトの名無しさん:2005/06/22(水) 23:21:17
>867
これですね。
ttp://www.comeaucomputing.com/
他にも
>Full C++03 core language support!
>Full TC1 support!
とか書いてありますが。
869デフォルトの名無しさん:2005/06/22(水) 23:28:17
>>865-867
ありがとうございます。

なるほど。
決まりだったのか・・
もやもやした疑問が解けてかなり助かりました。

これで、作業が進めれれるぞ!(・∀・)



870855:2005/06/22(水) 23:36:18
無理かもしれないけど、boost/mpl で何とかならんのかー('A`)
仕方ないので、comp lang c++ λ...逝って来ます・・・。
871デフォルトの名無しさん:2005/06/22(水) 23:45:38
>>855
VC6って、「警告をエラーとして扱う」オプションとかないの?
872デフォルトの名無しさん:2005/06/22(水) 23:46:00
あったと思う。
873デフォルトの名無しさん:2005/06/22(水) 23:59:05
>>869
進めれれるってあんた・・・
874デフォルトの名無しさん:2005/06/23(木) 16:04:59
>>870
http://www.artima.com/cppsource/safebool.html
これは参考にならないですか?
875855:2005/06/24(金) 00:55:52
>>874
おおぅ。 それっぽいことが長々と書いてある。塾読してみます。サンクス。
876デフォルトの名無しさん:2005/06/24(金) 18:05:38
>>871
警告の個数で停止汁ってできたんじゃ?
877デフォルトの名無しさん:2005/06/25(土) 02:25:53
>>871
[プロジェクト]-[設定...] メニューで出てくるダイアログの [C/C++] タブの中に
「警告をエラーとして扱う」 オプションがあるよ。
コマンドラインからなら /WX かな。

>>876
んなオプションどっかにあった?
878デフォルトの名無しさん:2005/06/25(土) 17:31:53
VC.NET2003で以下のようにシングルトンを実装したいのですが、
error 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へのアクセスが、
外部シンボルとなってしまうのはなぜでしょうか?
879デフォルトの名無しさん:2005/06/25(土) 17:42:53
>>878
コンパイラのエラーそのまんまの意味じゃん?
どっかのcppにHoge * Hoge::_h = NULL;と書いとけ
880デフォルトの名無しさん:2005/06/25(土) 17:44:03
ソースファイルに
Hoge* Hoge::_h;
って書かないと。
881デフォルトの名無しさん:2005/06/25(土) 17:44:06
>>878
staticメンバには実態が必要。
882878:2005/06/25(土) 20:19:11
解決しました。
ありがとうございました。
883デフォルトの名無しさん:2005/06/26(日) 08:31:08
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-06-26: The C++ Standard Library Issues List (Revision 37) is available
884デフォルトの名無しさん:2005/06/26(日) 11:45:48
2つのクラスA,Bを作り、それぞれにヘッダファイルとソースファイルを用意したとき、

/* 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が定義されていないとエラーが出るのですが
解決する方法はございませんでしょうか?
885デフォルトの名無しさん:2005/06/26(日) 12:08:57
>>884
B.h から #include "A.h" を削除。
886デフォルトの名無しさん:2005/06/26(日) 12:10:29
>>885
B.hを読み込むファイルもあるのです。

根本的に変更するべきでしょうか
887デフォルトの名無しさん:2005/06/26(日) 12:13:02
>>884,886
A.h から #include "B.h" を削除。
888デフォルトの名無しさん:2005/06/26(日) 12:13:46
AとBは互いを参照するほど強い関係なのだから、1つのファイルにまとめてもいいだろ。
1つのファイルにまとめるほど強い関係でないのなら、クラス設計的にもっと何とかなるだろ。
889デフォルトの名無しさん:2005/06/26(日) 12:15:10
>>886
B.h は A.h にインクルードされているんだから、A.hをインクルードすればいい。
890デフォルトの名無しさん:2005/06/26(日) 12:15:43
>>887
それだとA.hを読み込んだときに
「Bがない」とエラーが出てしまいます。
891884,886,890:2005/06/26(日) 12:17:52
>>888,889
考えてみます。
ありがとうございました。
892デフォルトの名無しさん:2005/06/26(日) 12:33:35
>>891
---------[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;
;;
};
893デフォルトの名無しさん:2005/06/26(日) 12:45:15
>>892
そんな方法もあったのですね。
ありがとうございました。
894デフォルトの名無しさん:2005/06/26(日) 12:47:22
>>892
どちらか片方がポインタだけの利用で済むならそれが答えになるだろうが、
884 はそんな情報は示していない。
895デフォルトの名無しさん:2005/06/26(日) 12:48:13
>>884 インクルードガードの先頭 _ はやめとけよ。
896デフォルトの名無しさん:2005/06/26(日) 12:49:42
情報なんて不足しまくりだし、ひとつの例を示しただけですが。
897デフォルトの名無しさん:2005/06/26(日) 12:54:23
>>894,896
情報が足らずにすいませんでした。
ポインタでない場合でもできるような方法はありますでしょうか?

>>895
eclipseでクラスを作ると自動的についてくるのでそのままにしていたのですが
なにか問題が発生しますか?
898デフォルトの名無しさん:2005/06/26(日) 12:59:06
C/C++では規格上、アンダースコア( _ ) やダブルアンダースコア( __ ) で始まる識別子は、
処理系で予約されている。だから使うべきではない。

でも、現実問題、使われまくりだったりする。
899855:2005/06/26(日) 13:21:33
>>897
プリコンパイラヘッダを使い方法は?
900デフォルトの名無しさん:2005/06/26(日) 13:26:40
ポインタでない場合、ヘタすれば無限再帰でコンパイラも殺せる
テンプレートをマンセーしておく。
901デフォルトの名無しさん:2005/06/26(日) 13:27:39
>>897
前方宣言によって有効になる記述はポインタ以外にもいろいろあるが、
一言で言うと、不完全な型しか要求しない記述なら大丈夫。
「完全な型」、「不完全な型」の詳しい意味は、自分で調べてくれ。
902デフォルトの名無しさん:2005/06/26(日) 13:35:08
>>901
ありがとうございました。
903デフォルトの名無しさん:2005/06/27(月) 03:04:45
つーか#pragma onceでいいじゃん。
インクルードガードなんて馬鹿馬鹿しいから
消しまくってるよ。
904デフォルトの名無しさん:2005/06/27(月) 03:15:45
特定OS上の特定処理系でしか絶対に使用しないとわかっているものなら
それでも良かろう
905デフォルトの名無しさん:2005/06/27(月) 08:47:59
QDBMというDBMを使っているのですが
c++でvistaを使う為に
xvilla.hのソースコードの#include<villa.h>を#include<vista.h>に変えてみたり
アプリケーションのソースコードに#include<vista.h>を書いてみたのですが
普通にvilla用のデータベースファイルが作られてしまい、villaとして機能してしまっているみたいです。
vistaをc++で使う為にはどうしたらいいのでしょう?
906デフォルトの名無しさん:2005/06/27(月) 08:54:20
むしろインクルードするヘッダファイル名を変えただけで
置き換わるほうがまれだろう
907905:2005/06/27(月) 09:23:12
villa.hのシンボルをマクロでオーバーライドしているので
ヘッダファイル名をvista.hに変えるだけで良い、とマニュアルに書いてあって、
C用だと確かにヘッダのファイル名を変えるだけで上手く行くのですが
C++用はxvista.hが無いしxvilla.h内のvilla.hのインクルードをvista.hに変えてもダメだし
マニュアルにはC++はCとほぼ同じAPIが使えると書いてあったけど(ほぼなのでC++用vistaは無いのかもしれないけど)
C++用vistaについて何も書かれていないし、QDBMのWEB上の情報自体が少ないんです。
ただ、かなり優秀なソフトなので使っている人は割と多いのではと思うのですが
分かる方が居たら教えて欲しいです。
908デフォルトの名無しさん:2005/06/27(月) 15:57:13
やっぱりC++使う以上は、継承とかバリバリ使えないといけないのでしょうか。
ウィンドウズでVisualC++とか使っている範囲では、
殆どそんなテクニックは意識したことが無いのです。
909デフォルトの名無しさん:2005/06/27(月) 16:06:22
ぷらぷらでは
aho.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をインクルードせずに見る方法ってあるのかな。
910デフォルトの名無しさん:2005/06/27(月) 16:15:51
あるわけねーだろチンカス
そんくらい悟れや
911デフォルトの名無しさん:2005/06/27(月) 16:23:17
ないですよねぇ・・・。

動機としては
class Aho {
private:
  Boke* m_pBoke
}
だからAhoはBokeを実装手段としてプライベートに持つ
つまりAhoクラスを使うクライアントにはBokeクラスを知る必要がない。
ということでインクルードはしたくないし、不必要
だったのですが、
今時typedefでLPなんとかとやるメリットは
どこにあるのかと思ったチンカス君でした。
912デフォルトの名無しさん:2005/06/27(月) 16:25:15
こうなるだけではないの?
class tag_boke;
class Aho {
 tag_boke* m_Boke;
};
913デフォルトの名無しさん:2005/06/27(月) 16:27:48
typedef struct tag_boke* LPBOKE;
この行があれば充分だけど
914デフォルトの名無しさん:2005/06/27(月) 16:33:01
結局タグなんたらって書いてますが・・・
いちいち#ifndef LPなんたらもめんどいし・・・。
915デフォルトの名無しさん:2005/06/27(月) 16:33:22
boke_fwd.h
struct tag_boke;
typedef struct tag_boke* LPBOKE;
916デフォルトの名無しさん:2005/06/27(月) 16:45:57
わざわざ二箇所でtypedefするのも嫌だな・・・。
917デフォルトの名無しさん:2005/06/27(月) 16:49:40
boke.h
#include "boke_fwd.h"
918デフォルトの名無しさん:2005/06/27(月) 17:08:37
試してみたら出来た。MSすげぇ
コレが出来たら何でもありじゃん。
//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;
};
}
919918:2005/06/27(月) 17:14:23
と思ったけど
今回のケースでは役に立たんね ガクッ(x_x;
920デフォルトの名無しさん:2005/06/27(月) 18:30:29
c++のコードを沢山乗せるホームページを簡単に作れる
ツールってないのでしょうか?
http://www.kmonos.net/alang/boost/classes/test.html
こんな感じのホームページにしたいです
921デフォルトの名無しさん:2005/06/27(月) 18:50:17
>>920
お前はそこの管理人よりもずっと頭が悪いんだから無理です。
そいつは東大の学生だぞ。
922デフォルトの名無しさん:2005/06/27(月) 19:03:04
>>921
なんちゅー答えだw
お前は馬鹿というより幼い感じだな。
923デフォルトの名無しさん:2005/06/27(月) 19:14:09
c2html?
924デフォルトの名無しさん:2005/06/27(月) 19:34:42
>>920
そんな阿呆な質問してる奴のソースなんて、見せられても逆に困る。
925デフォルトの名無しさん:2005/06/27(月) 20:54:43
>>920
htmlのソース見てコピペすればすむことだろ。
926デフォルトの名無しさん:2005/06/27(月) 20:59:22
>>920
そしてboostに例があったりする
ttp://www.boost.org/libs/regex/doc/regex_replace.html#examples
927デフォルトの名無しさん:2005/06/27(月) 22:37:48
うちは Source HighLight の Win32版つかってる。
928デフォルトの名無しさん:2005/06/27(月) 23:32:31
要するに<PRE></PRE>でいいんじゃねーの?
929デフォルトの名無しさん:2005/06/27(月) 23:43:28
>>928
色とか付けたいってコトだろ
930デフォルトの名無しさん:2005/06/28(火) 01:25:03
Doxygenでも使っとけ
931デフォルトの名無しさん:2005/06/28(火) 09:44:58
カクカクシカジカさんにも置いてあるね>cpp2html
932デフォルトの名無しさん:2005/06/28(火) 10:53:53
クラス図を書いていて思ったのですが、C++で設計する場合、
グローバル変数は1つも使うべきではいないのでしょうか。
使ったほうが便利なケースはいくらでもありそうな気がして
ならないのです。
設計のスキルはまだ全然ないのですが、他のソースを
リバースエンジニアリングしてみてもほとんどのソースで
グローバル変数が使用されている様子ですが・・・。
933デフォルトの名無しさん:2005/06/28(火) 10:59:22
タトエバどんな場合?
934デフォルトの名無しさん:2005/06/28(火) 11:00:20
935デフォルトの名無しさん:2005/06/28(火) 11:00:28
大半はクラススコープ/ファイルスコープのstatic変数だろ
とは言っても、グローバル変数はいくらでも使われてるだろうけど。

errnoとかcoutとかだって、その一種と言えないこともないし。
936デフォルトの名無しさん:2005/06/28(火) 11:05:53
>>932
糞ソースばかり読むな
937デフォルトの名無しさん:2005/06/28(火) 11:30:38
略して糞ース
938デフォルトの名無しさん:2005/06/28(火) 11:47:00
>>936
糞ソースじゃないソースを提示してみろと言ってみる
939デフォルトの名無しさん:2005/06/28(火) 12:19:57
糞だろうが何だろうが
提示できるソースをいきなりホイホイ挙げられるかよ
940デフォルトの名無しさん:2005/06/28(火) 12:24:16
>>939
逆ギレキタ━━━━(゚∀゚)━━━━!!
941デフォルトの名無しさん:2005/06/28(火) 12:38:25
まーオープンソースのものって大抵グローバル変数使われちゃってるわな。
942デフォルトの名無しさん:2005/06/28(火) 17:44:41
オープンソースやるやつは露出狂
943デフォルトの名無しさん:2005/06/28(火) 19:50:08
>>920
ソースコードを強調表示された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は<や>にしないといけない。
このフィルタを書こうとすると、「やっぱり色つきにしたい」などと夢がふくらむ罠
そしてそれは激しく車輪の再発明に。(もちろん、勉強のためにはおもしろい題材だけど)
944デフォルトの名無しさん:2005/06/28(火) 20:16:43
>>943
背景として、C++に限らずlisp・perl・おぞましいN88-BASICなどのソースコードも
提示することがあるから、それらすべてに対応してる既存品が楽かなと。

>>932
真にグローバルな変数は使わない方がいいと思う。
他のプロジェクトではもっとまともなのかもしれないけど、
過去のC/BASIC/Fortranのソースコードから再利用したり
担当者が4人ほど変わって引き継いだりそもそも担当はプログラム経験がほとんどない人だったり
仕様が毎日か長くて毎週変わったり
それを5年ほど続けると、もうすごいことになっています。
・・・結論まで書こうと思ったが鬱になったのでもうどうでもいいや…
945デフォルトの名無しさん:2005/06/28(火) 22:37:33
真と書いて「マジ」と読む?
946デフォルトの名無しさん:2005/06/28(火) 22:38:56
グローバルで管理したいデータってどうしたらいいのでしょう。



というのが、今回の問題です。
947デフォルトの名無しさん:2005/06/28(火) 22:43:23
そんな貴方にSingleton
948デフォルトの名無しさん:2005/06/28(火) 22:45:04
なにもわかってないな
949デフォルトの名無しさん:2005/06/28(火) 23:02:40
>>946
グローバルで管理したい理由、プログラムの規模、プログラムの寿命などによって答えは変わる。
950デフォルトの名無しさん:2005/06/29(水) 00:13:31
プログラムの規模、って言っても、表現に困るよね。
規模なんて相対的だし。客観的な表現方法ってあるの?
951デフォルトの名無しさん:2005/06/29(水) 00:58:13
次スレは「C++相談室 part42」です。テンプレは次でよろしく

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
専用の別スレがあるライブラリ(Boostなど)や
開発環境、IDE(VC++など)に関する質問はそちらにお願いします。

前スレ part40(実質41)
http://pc8.2ch.net/test/read.cgi/tech/1113408957/
952デフォルトの名無しさん:2005/06/29(水) 10:41:33
http://www.open-std.org/jtc1/sc22/wg21/
News 2005-06-28: C++ Standard Core Language Issues List (Revision 36) is available
953デフォルトの名無しさん:2005/06/29(水) 14:02:21
>>950
「プログラムの規模」って言いたかっただけでは?
954デフォルトの名無しさん:2005/06/29(水) 16:16:10
>>950
明確な基準はないと思うけど、
「いつ、どこで、どんな操作がされるかを把握できる」
かどうかに懸かってるんじゃなかろか。

例えばログファイルにメッセージ書くクラスがあって
それが「書き込み」という操作しかなければ
グローバルにインスタンス作ってもいいわけで。
955デフォルトの名無しさん:2005/06/29(水) 16:44:44
グローバル変数の欠点を理解してない意見も混ざってる気がする。

publicでstaticな変数との違いは、
クラス宣言に書く必要が無いからこっそり使ったりする事が可能だって事と、
大規模なプログラムの場合、名前の衝突が管理出来なかったり、
VCみたいな賢いIDEが使えない場合に型の確認が面倒だって事くらいだろう。

publicでstaticな変数にも共通する欠点は色々あるから、
それを許すかどうかもはっきりさせた方がいいわな。

どっちにしろ、「使わなくても出来るけど手抜きでやってる」って事を意識しとくべき。
956デフォルトの名無しさん:2005/06/29(水) 16:50:54
MFC使うとグローバル変数の一個大隊がついてくるからなぁ。
957デフォルトの名無しさん:2005/06/29(水) 17:48:09
グローバル変数が0で済むプログラムってのもどんだけちっちゃいんだよって思うけど。
まぁクラスにきちんとまとめて、それも全部publicとかじゃなくて丁寧にアクセス制御しとくんだろうな
958デフォルトの名無しさん:2005/06/29(水) 19:58:18
クラステンプレートの内側に、クラステンプレートの特殊化版をネスト定義できない件について。
ふぬおおおソースがきちゃなくなるんじゃあああヾ(`□´)ノ
959デフォルトの名無しさん:2005/06/29(水) 20:43:25 BE:168573964-
コンパイラが古いんジャマイカ。
VC++6.0ではネストできんかった。
VC++.NETではネストできた。
960959:2005/06/29(水) 20:43:44 BE:140478645-
.NET 2003ね。
961デフォルトの名無しさん:2005/06/29(水) 23:08:21
>>959
g++だと意図的に対応していないようであります
標準のappendixで禁止しているかららしい。
関数内関数定義とか、templateの宣言・定義の簡略化とか
C++0xで変わったらいいなあ。
962デフォルトの名無しさん:2005/06/30(木) 01:08:31
WindowsプログラミングをしようとするとWinMainとWndProcの兼ね合いとかでほとんど無理だけどな>グローバル0
963デフォルトの名無しさん:2005/06/30(木) 01:26:43 BE:295004276-
>>962
とりあえずフレームワークさえ構築してしまえば
表だったグローバル変数は使わなくて済むと思う。

まぁ俺は安易にグローバル変数使っちゃう族だが。
964デフォルトの名無しさん:2005/06/30(木) 02:04:38
いや、ウィンドウプロシージャごときで静的変数なんかつかわねーだろ普通
965デフォルトの名無しさん:2005/06/30(木) 02:10:20
>>951
結局、STLはここでいいんだよね?
966デフォルトの名無しさん:2005/06/30(木) 02:28:18
>>965
いいはずでしょ、標準の一部だし。
967デフォルトの名無しさん:2005/06/30(木) 03:17:57
このスレの1が変なのか
968デフォルトの名無しさん:2005/06/30(木) 07:30:17
STLスレを立てるやつが変。
969デフォルトの名無しさん:2005/06/30(木) 15:39:33
デバッグしてみたら
-1.#IND000000000
-1.#INF000000000
こんな数字が変数に入ってるんだけどこれは何なのでしょうか?
970デフォルトの名無しさん:2005/06/30(木) 16:24:42
>>969
数値以外の値。
前者はなんだろう。
後者は負の無限大かな?
いずれにしても、C++の問題というよりデバッガの問題だよな。
971デフォルトの名無しさん:2005/06/30(木) 16:39:51
INDって何の略ですか?
972デフォルトの名無しさん:2005/06/30(木) 16:56:01
>>969-971
前者は「不定」で恐らくは-0/0の結果。
後者は「無限大」で恐らくは-1/0の結果。
973デフォルトの名無しさん:2005/06/30(木) 17:24:04
なんかシンプルな行列やベクトルライブラリありませんか?
DirectXのD3DXVECTORぐらいでいいのですが、環境に依存しないやつほしいです。
974デフォルトの名無しさん:2005/06/30(木) 17:33:48
boostなり自分で作るなり
975デフォルトの名無しさん:2005/06/30(木) 17:44:42
976デフォルトの名無しさん:2005/06/30(木) 17:59:58
>>973
gslとかliboctaveとか
977デフォルトの名無しさん:2005/06/30(木) 18:09:53
>>971
Indeterminate
978デフォルトの名無しさん:2005/06/30(木) 18:51:49
>>974
boostのベクトルも探してる最中なんですが、
2次元3次元のベクトルよりquaternion、octonionやらが先に見つかってしまいます。
どこかな・・・。

>>975-976
ありがとうございます。
そーゆーのです。
といってもいろいろあると目移りしてしまいます・・・。
979デフォルトの名無しさん:2005/06/30(木) 19:02:32
>>978
>どこかな・・・。
ublas
980デフォルトの名無しさん:2005/07/01(金) 01:13:04
スレ違いかもしれないどうしようもない質問をしてしまうのですが
自分は今までプログラムをやった事がないものの、来週からC++をやろうとしています
ここで質問ですが、C++をやるに当たって最初に必要なものはなんでしょうか?何か買う必要があるのでしょうか?
幾ら調べても本当にわけが分かりません、コンパイラーというのが有れば出来るものなのでしょうか?ご指導をよろしくお願いいたします。。
981デフォルトの名無しさん:2005/07/01(金) 01:17:13
>>980
コンパイラーと、あとはテキストエディタが要るだろうな。
しかしここはスレ違いだ。
何か始めて、行き詰まったらまず↓こっち行け。
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
ここの過去ログやリンクを漁れば、初心者の質問は大抵カタがつく。
982デフォルトの名無しさん:2005/07/01(金) 01:20:18
>>980
どうして突然C++をやることになったのかが興味がわきますね。
とりあえず友達にプログラマを見つけて、ある程度のレベルまでは教えてもらうのが早いかと。
983デフォルトの名無しさん:2005/07/01(金) 01:24:04
>>980
Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/6-12
984デフォルトの名無しさん:2005/07/01(金) 02:28:49
struct A{ int a; };

A a[10];
for( A* i = a; a != a + 10; ++a )
a->a = 10;

これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
985984訂正です:2005/07/01(金) 02:29:38
struct A{ int a; };

A a[10];
for( A* i = a; i != a + 10; ++i )
a->a = 10;

これをSTLの関数オブジェクトまたはboostのbindを使って置換したいのですが
どうすればいいでしょうか?
986デフォルトの名無しさん:2005/07/01(金) 02:30:36
貼っときますね

プログラミングやってる奴がキモいです><
ttp://ex11.2ch.net/test/read.cgi/news4vip/1120152486/
987デフォルトの名無しさん:2005/07/01(金) 02:45:23
>>984-985
using namespace boost::lambda;
std::for_each(a, a + 10, bind(&A::a, _1) = 10);
988デフォルトの名無しさん:2005/07/01(金) 02:50:27
>>985
boost::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);
989デフォルトの名無しさん:2005/07/01(金) 03:10:18
>>987-988
lambdaを使うんですね、ありがとうございました。
990デフォルトの名無しさん:2005/07/01(金) 05:13:32
class func : std::unary_function<int, void>
{
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が大量に出ます。さっぱりわかりません。
991デフォルトの名無しさん:2005/07/01(金) 05:44:56
&std::for_each を
&std::for_each< std::vector< int >::iterator, func > に直しましたが
まだ駄目です。
bind関数の一番目の引数である「v.begin()」に対して
「1 番目の引数を '_STL::vector<_Tp>::iterator' から '_STL::vector<_Tp>::iterator & ' に変換できません。」
「'const' に対してではない参照は 非左辺値へバインドできません。」
とでます。どういう意味でしょうか?
992デフォルトの名無しさん: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使う意味があるんでしょうか?
993デフォルトの名無しさん:2005/07/01(金) 06:34:31
>>991
bind内部では参照がメインだからです。
boost::bind( &std::for_each<std::vector<int>::iterator&, func>, _1, _2, _3)( v.begin(), v.end(), func());
これでいいと思うよ。
994デフォルトの名無しさん:2005/07/01(金) 08:04:40
>>993
やってみて駄目だったんですが、
一時オブジェクトは非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というのは使い道が見えません。
普通に直で関数オブジェクト書いちゃった方が楽な気がする・・
995デフォルトの名無しさん:2005/07/01(金) 09:23:58
996デフォルトの名無しさん:2005/07/01(金) 10:59:36
@string型をint型にキャストするにはどーすればいいんですか??
 StrToIntとかToIntという関数があるようですが,
 これでは駄目なようで困っています.
Aファイルから1行を切り出すにはどうすればいいんですか??
 40文字ずつ改行しながら別のファイルに出力させていくという
 プログラムを作りたいのですが,
   char *c;
   fileReader.get(c, number, '\n');
 のようにしてnumberが21くらいになるとメモリがreadにならないという
 エラーメッセージが出てきます.どうしてでしょうか??
997デフォルトの名無しさん:2005/07/01(金) 11:21:46
>>996
inline 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使う
998デフォルトの名無しさん:2005/07/01(金) 11:41:15
>>992
>型AとBが同じ型のときtrueを、異なる型のときfalseを返すクラステンプレート
これだけが必要なら別に外側だけ特殊化すればよいような気がします.

>外側のクラステンプレートは特殊化せず、内側だけを特殊化したいのです。
これは言語規格的に無理です.
999デフォルトの名無しさん:2005/07/01(金) 12:29:57
999
1000デフォルトの名無しさん:2005/07/01(金) 12:30:09
ギリギリまで真面目に話してるおまえらにもえ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。