■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

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

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

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり

2 名前:デフォルトの名無しさん :2005/04/14(木) 01:17:13
1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html

3 名前:デフォルトの名無しさん :2005/04/14(木) 01:17:40
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/

4 名前:デフォルトの名無しさん :2005/04/14(木) 01:18:07
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/

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
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/

7 名前:デフォルトの名無しさん :2005/04/14(木) 01:26:34
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

8 名前:デフォルトの名無しさん :2005/04/14(木) 01:28:55
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

9 名前:デフォルトの名無しさん :2005/04/14(木) 01:29:27
■Libraries■
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html

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());

27 名前:25 :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
マクロに渡された引数が定数かどうか
判断するにはどうしたらいいのかな?


38 名前:v(^・^)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
なんのですか?
オブジェクトですか?
オブジェクトなら入れる入れ物はポインタじゃないんですか?

54 名前:53 :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 ?
>>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になるのは反則だな。

80 名前:78 :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にされているのかな。

82 名前:81 :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
>>78 >>80
このあたりか?
ttp://oku.edu.mie-u.ac.jp/~okumura/iroiro/0303.html
ttp://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section01/section01_05.html
ttp://www.lcv.ne.jp/~kenmio/goukaku/goukaku2/g25.htm#g2-26 (←これはJAVAの話)

混合モードで見ると、まんま
shr eax,20h
shl eax,20h

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を(演算子として)使うことによりデストラクタも呼ばれる。

101 名前:96 :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
二項演算子をメンバ関数にしちゃってるとか
つうかエラーメッセージを書こうよ

105 名前:103 :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の作りが悪い。

107 名前:103 :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)

117 名前:103 :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++のスレだぞ
非標準ライブラリの話はスレ違い。
ほどほどにしろ。

122 名前:103 :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
ダライアス継承でググれ

129 名前:126 :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
ダイヤモンドッ ダストォォォーーー

133 名前:126 :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なのか?
 }
};


135 名前:126 :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
ttp://www.kzm.info.gifu-u.ac.jp/~k05mizutani/diary/200503/images/20050310_darius.png


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が重複している。

142 名前:136 :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

146 名前:age :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
禿げているのが一番の問題。

154 名前:sage :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。--- 注釈終]

160 名前:154 :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() の両方が同時にオーバーライドされたことになってるんでしょうか?
エラーになるか、どちらか片方だけオーバーライドされると思っていたのに。

169 名前:168 :2005/04/27(水) 02:38:59
↑のソースについて、追加で相談です。
A::f() と B::f() のそれぞれに C で別々の実装を与えるような
オーバーライドを行いたい場合はどうしたらいいんでしょうか?

170 名前:デフォルトの名無しさん :2005/04/27(水) 02:46:50
>>168
違う。CはA、Bのprivate継承なので、オーバライドになってない。

171 名前:168 :2005/04/27(水) 03:00:24
>>170
C は struct で宣言しているので、継承は public です。
class で宣言して継承が private になっていたとしても、
オーバーライドになるかならないかに影響はありません。

172 名前:168 :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) で何も問題ないように見えるんだが。

194 名前:191 :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
>>197
"The C++ object model"
ttp://www.kuzbass.ru/docs/isocpp/intro.html#intro.object

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の前に持ってくる。

205 名前:203 :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++スレの人が教えてくれるかと

209 名前:203 :2005/04/28(木) 20:57:07
>>206
ありがとうございます。
おかげさまで解決できました。

210 名前:207 :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; // メンバ変数の定義?
これも宣言かつ定義。

220 名前:217 :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 宣言⊃定義

223 名前:222 :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;
と似た形をしたものは全部宣言なんだな。

227 名前:211 :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 .

236 名前:231 :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なんかではテンプレートテンプレート引数は使っちゃ駄目
こちら、解説きぼん。

240 名前:231 :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 意味がわからん。

246 名前:217 :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>でいけ


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.