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


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

C++相談室 part12
1 名前:アフォルトの名無しさん :02/10/19 14:38
文法が汚くてもいいから、懐の広い言語を望むあなた。そんな
あなたにぴったりの言語、C++。
・・・いいやエレガントなソースを目指せゴルァ!!

(・∀・).。o(関連URLは >>2-3 辺り) アヒャ

2 名前:アフォルトの名無しさん :02/10/19 14:38
■Documents■
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/
ISO/IEC 14882 International Standard
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

■STL Libraries■
Boost http://www.boost.org/
STLport http://www.stlport.org/
Loki http://www.moderncppdesign.com/
Loki for VC7(LokiPort) http://www.geocities.com/rani_sharoni/LokiPort.html

■過去スレ■
Part1 http://piza.2ch.net/tech/kako/980/980175292.html
Part2 http://pc.2ch.net/tech/kako/996/996640937.html
Part3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
Part8 http://pc3.2ch.net/test/read.cgi/tech/1025010364/ (HTML 化待機中)
Part9 http://pc3.2ch.net/test/read.cgi/tech/1027347982/ (HTML 化待機中)
Part10 http://pc3.2ch.net/test/read.cgi/tech/1029315669/ (HTML 化待機中)
Part11 http://pc3.2ch.net/test/read.cgi/tech/1032345774/

3 名前:アフォルトの名無しさん :02/10/19 14:38
■関連スレ■
VisualC++相談室 3  http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4  http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5  http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6  http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室 【7】 http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC相談室 【8】   http://pc.2ch.net/test/read.cgi/tech/1022499000/

C++Builder相談室    http://piza2.2ch.net/tech/kako/969/969458279.html
新C++Builder相談室  http://pc.2ch.net/tech/kako/997/997074601.html
C Builder相談室 Part3 http://pc3.2ch.net/test/read.cgi/tech/1016065855/

STLスレッド      http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
STLスレッド part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/l50

4 名前:v(^・^)v :02/10/19 14:39
v(^・^)v

5 名前:デフォルトの名無しさん :02/10/19 14:55
#if abc
#error (・∀・)
#endif

abcと同名のシンボルは無いはずだけど全ての処理系で通る(falseで)!
大ハケーン?

6 名前:デフォルトの名無しさん :02/10/19 14:58
>>5
規格嫁

7 名前:アフォルトの名無しさん :02/10/19 15:27
>>5
何度も書き込むな。
前スレのレスはちゃんと読んだのか?
http://pc3.2ch.net/test/read.cgi/tech/1032345774/945-949
第一そんな下らない事で得意になるな。
・・・ネタ?

8 名前:デフォルトの名無しさん :02/10/19 15:41
>>1


9 名前:デフォルトの名無しさん :02/10/19 15:57
>>1-4
乙カレー

10 名前:アフォルトの名無しさん :02/10/19 16:04
>>9
4 は違う。

11 名前:デフォルトの名無しさん :02/10/19 16:53
関連スレ追加

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/


12 名前:デフォルトの名無しさん :02/10/19 17:01
関連スレ追加

Generic Programming with C++ Template
http://pc3.2ch.net/test/read.cgi/tech/1008593126/

13 名前:アフォルトの名無しさん :02/10/19 17:25
>>11 >>12 は STL スレッドの方にぶら下げた方が良ざげ。

14 名前:デフォルトの名無しさん :02/10/19 19:58
Vidual C++6.0がインストールされているPCでWordを使っていたら突然エラーダイアログが出て閉じるorデバックを要求されました。
そこでデバックを選択したら、Vidual C++6.0が起動し保存ダイアログが出たので保存を選択しました。(この時、保存先を指定することは出来ませんでした。)
この場合、データは何処に保存されているのでしょうか?
宜しくお願いします。

15 名前:デフォルトの名無しさん :02/10/19 20:20
>>13
なるほど、ここは隔離用インターネットだったのですね

16 名前:14 :02/10/19 21:02
すみません。Vidual C++6.0ではなくVisual Studioだったかも知れません。
WordはWord2000です。
症状はこれと似ています。
http://www.geocities.co.jp/SiliconValley-SanJose/8677/win95/pslg1612.html

17 名前:デフォルトの名無しさん :02/10/19 21:16
>>16
禿げしくスレ違いな上に、おそらくは板違い。カエレ!


18 名前:アフォルトの名無しさん :02/10/20 00:23
>>15
まあ、はっきり言えば隔離かもね (インターネットという言いまわしはグー)。
STL は使う使わないでソースコードの性格が変わるし、質問も然り。
STL バリバリのところに C++ 初心者は入っていけないだろうし、STL スレも
初歩レベルの情報を交えるべきでないと思う (5、14 みたいのも来るし)。

19 名前:デフォルトの名無しさん :02/10/20 15:24
>1


20 名前:デフォルトの名無しさん :02/10/20 17:43
STLなんかリファレンス一つあれば使えるだろ?
Perlより簡単だけど。

21 名前:デフォルトの名無しさん :02/10/20 17:46
>>20
コンテナだけならね。


22 名前:デフォルトの名無しさん :02/10/20 17:53
とりあえず、ヘッダファイルが一番のマニュアル

23 名前:デフォルトの名無しさん :02/10/20 18:01
g++の話で申し訳ないが、C++のコードにもgcovってまともに使える?
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_6.html


24 名前:デフォルトの名無しさん :02/10/20 18:06
>>21
コンテナだけって?

25 名前:デフォルトの名無しさん :02/10/20 18:16
>>24
vector<T>やらmap<T,U>を使うだけなら猿でもできる(もちろん使ったほうが
良いのだが)。vector<T>::iteratorやらなにやらでコンテナの内容にアクセスする
のも、当然サルでもできる。

その先が、ややハードル高い。20や24は<algorithm>で定義される各種
アルゴリズムを正確につかいこなしたり、bind1st,2ndと組み込みの述語関数
を組み合わせてプログラム書いたりを苦もなくできますか?

俺は目が慣れるまでに結構時間が必要だったけどね。関数型言語の経験があれば
"perlより簡単"なのかもしれんが・・・



26 名前:デフォルトの名無しさん :02/10/20 18:19
>>20
mem_fun1_tの使いどころを教えてください



とか言ってみるテスト



27 名前:20 :02/10/20 18:21
物覚え悪いんだね。

28 名前:デフォルトの名無しさん :02/10/20 18:23
>>27
ここでそう煽ることに何の意味が?
僕は馬鹿です と言っているのかな。



29 名前:デフォルトの名無しさん :02/10/20 18:26
必死でぐぐり中の20


30 名前:デフォルトの名無しさん :02/10/20 18:41
今後の20のレスが楽しみですw

31 名前:男子高校生 :02/10/20 18:46
今日デザインパタ〜ンってもんを初めてしったYO
なんか(・∀・)イイね。

32 名前:デフォルトの名無しさん :02/10/20 19:01
>>25
perlのスパゲティコード読むよりはるかに簡単じゃい。

33 名前:デフォルトの名無しさん :02/10/20 19:04
んま、主観的比較論争はこれくらいにしとけば?
20がSTL知らないということだけが客観的事実ってことで。


34 名前:デフォルトの名無しさん :02/10/20 19:06
(´,_ゝ`)プッ

35 名前:デフォルトの名無しさん :02/10/20 19:08
(´,_ゝ`)ペッ


36 名前:アフォルトの名無しさん :02/10/20 19:29
>>32
C++ のスパゲティコードだって似たようなもんじゃ。
>>33
同意。

37 名前:デフォルトの名無しさん :02/10/21 10:53
C++マンセー。

38 名前:デフォルトの名無しさん :02/10/21 10:55
C++で作られた有名ソフトって何がありますか?

39 名前:デフォルトの名無しさん :02/10/21 11:03
>>38
MSの製品

40 名前:デフォルトの名無しさん :02/10/21 11:07
>>38
mozilla

41 名前:デフォルトの名無しさん :02/10/21 15:34
char 型 は有名ですが、u_charってなんですか?


42 名前:デフォルトの名無しさん :02/10/21 15:41
unsigned charのtypedefでしょ?

43 名前:デフォルトの名無しさん :02/10/21 15:49
いつからクソスレに・・


44 名前:デフォルトの名無しさん :02/10/21 16:45
とてもくだらない質問なのですが、
void main(int argc,char *argv[])
というのがあるじゃないですか。それで、
argcが1を返すとはどういう意味でしょうか?


45 名前:デフォルトの名無しさん :02/10/21 16:47
ほんとにくだらん

46 名前:デフォルトの名無しさん :02/10/21 16:52
申し訳ありません。でも分らないので教えてください。

47 名前:デフォルトの名無しさん :02/10/21 16:55
argc = argument count

48 名前:デフォルトの名無しさん :02/10/21 16:56
はぃ。それで、1を返すのはどういう意味なんでしょう?

49 名前:デフォルトの名無しさん :02/10/21 16:58
argvになんかあるやろ。

50 名前:デフォルトの名無しさん :02/10/21 17:01
え? なんかってなんでしょう・・・。

51 名前:デフォルトの名無しさん :02/10/21 17:01
引数の数ですか。
では、
if(argc<=1){ exit(-1); }
って書くじゃないですか。
とうこということは、argvに自分のパスが入っているので、
必ず終了することになるんですか?

52 名前:アフォルトの名無しさん :02/10/21 17:06
>>44
とりあえず main() を void で書くのはやめろ。
>>51
その通り。
実際に引数が指定された場合は、argc は 2 以上になる。

53 名前:デフォルトの名無しさん :02/10/21 17:09
はい。voidで書くのはやめました。int main(){return 0;}って感じでいいんですよね。
でも、なんでですか?変わった気はしない…。
if(argc<=1){ exit(-1); } なんですけど、
よくサンプルコードに書いてあるじゃないですか?
無意味なんじゃないですか?


54 名前:デフォルトの名無しさん :02/10/21 17:11
そのプログラムはコマンドラインオプションが必要だからだろう。

55 名前:デフォルトの名無しさん :02/10/21 17:12
DOSで実行せよ ということですか?
mfc.exe command
ってかんじに。

56 名前:デフォルトの名無しさん :02/10/21 17:13
初心者です
UUこの半角記号が打てないので
プログラムを書くのに困っています。
キーボードの右下のUのキーを押しても¥が出てくるだけです
どうすれば、英数半角でこの記号が打てるようになるのか
教えてください


57 名前:デフォルトの名無しさん :02/10/21 17:15
ネタ質問は逝って良し

58 名前:デフォルトの名無しさん :02/10/21 17:15
アホ質問は続くわ、void main()ツッコミ厨が出るわ・・・

59 名前:デフォルトの名無しさん :02/10/21 17:27
おもしろいメールが盛りだくさんですね。

60 名前:デフォルトの名無しさん :02/10/21 17:30
あー、C++でないんですけど
if文の分岐予測ペナが大きいと聞いたんでビット演算で回避できないかやってみたんです。
  int A,B,C;(B,Cには適当な値)
  A=(B-C);
  if(A>=0) A=0;
を、
  A=((A>>31)&A);
にしてみたんですけど、素直にif文使った方が僅差で早かったです…。
これって他のCPUでも同じ結果になるんですかね?(ウチはDuron1.2G)
可読性も考えると、素直にif文…かな?

61 名前:アフォルトの名無しさん :02/10/21 17:34
>>53
main() が int を返さないなら、そのソースがどんなに酷似していても
C/C++ ではない。

>>56
それれ半角で書くとカタカナの "ヲ" だ (英字フォントでは "U" になる)。
この文字をプログラムで使えなくて困ることは無いはずだが?
"|" (Shift + "\") ではないのか?

>>58
printf() 使うのに <stdio.h> インクルードしない人ですか?

62 名前:デフォルトの名無しさん :02/10/21 17:53
C++なら<cstdio>やろ

63 名前:アフォルトの名無しさん :02/10/21 17:57
>>62
ありがとう

64 名前:デフォルトの名無しさん :02/10/21 18:03
特別な理由が無い限りC++ではiostreamを使うけどね。
boost::formatも出来たし、printfはバイバイキーン。

65 名前:デフォルトの名無しさん :02/10/21 18:04
C++に関係ない、っていうかネタ質問はさらりと流してほしいところ。

>>60
分岐予測はCPUによって実装が異なるだろうから
結果は微妙に変わってくるかもしれないけど、
よほど意地悪なor運の悪い状況でない限り、
ペナルティ多発ってことはないんじゃないでしょうか。

>A=((A>>31)&A);
同一レジスタに対する読み書きが連続することによる
ペナルティもあります。

素直にif文に一票。

66 名前:デフォルトの名無しさん :02/10/21 18:11
ネタじゃないのですが

UUこの半角記号が打てないので
プログラムを書くのに困っています。
キーボードの右下のUのキーを押しても¥が出てくるだけです
どうすれば、英数半角でこの記号が打てるようになるのか
教えてください



67 名前:デフォルトの名無しさん :02/10/21 18:12
だからネタ質問は逝っってよし。

68 名前:デフォルトの名無しさん :02/10/21 18:13
shift押せ、そして死ね

69 名前:アフォルトの名無しさん :02/10/21 18:13
>>60
単純にアセンブリに直すと、

  ; if(A >= 0) A = 0;
    cmp   DWORD PTR _A$[ebp], 0
    jl   SHORT $L42319
    mov   DWORD PTR _A$[ebp], 0
  $L42319:

  ; A = (A >> 31) & A;
    mov   eax, DWORD PTR _A$[ebp]
    sar   eax, 31
    and   eax, DWORD PTR _A$[ebp]
    mov   DWORD PTR _A$[ebp], eax

前者は (A >= 0) ならば 2 インストラクション、そうでなくても 3 インストラクション
で済んでいるのに対し、後者は一律 4 インストラクションになっている。
さらに、変数 A へのメモリアクセスも 1 つ多い。

というわけで後者の方が実はペナルティが多い。

分岐命令がパイプラインストールになる可能性は、コンパイラを使っている限り考えなくて
良い。

>>66
61 が見えんのか? やっぱりネタか?

70 名前:デフォルトの名無しさん :02/10/21 18:17
>>68
shiftを押しても出ないので質問してるのですが

71 名前:デフォルトの名無しさん :02/10/21 18:17
>>44
オプションパラメタが一つもない時。

72 名前:デフォルトの名無しさん :02/10/21 18:18
>>70 バカ!さっさと氏ね!

73 名前:デフォルトの名無しさん :02/10/21 18:21
>>70
PC初心者
http://pc.2ch.net/pcqa/

74 名前:デフォルトの名無しさん :02/10/21 18:21
右のShiftを押しっぱなしにすると出るよ

75 名前:60 :02/10/21 18:41
>>69
なるほど。回答ありがとうございます。

76 名前:アフォルトの名無しさん :02/10/21 18:56
69 追記。

> 分岐命令がパイプラインストールになる可能性は、コンパイラを使っている限り
> 考えなくて良い。

これは、コンパイラさえ使っていれば最良のパフォーマンスが得られると言う意味
ではないので念の為。
真に洗練されたアセンブリ使いの最適化には、どんなコンパイラも敵わない。
(漏れはコンパイラに敵わないが・・・)
そうではなくて、>>60 のように一見意味の読み取れないようなコードを書くと、
コンパイラがすでに想定している最適化を適用できずベタなマシン語を吐き出し
てしまうので止めた方がいいと言う事。

77 名前:デフォルトの名無しさん :02/10/21 19:22
これは実話?
http://www.kh.rim.or.jp/~nagamura/misc/stroustrup-interview.html

78 名前:デフォルトの名無しさん :02/10/21 19:34
>>77
それってC++挫折組の捏造記事。
って何年前のネタだよ。

79 名前:デフォルトの名無しさん :02/10/21 19:38
>>77
http://www.research.att.com/~bs/bs_faq.html#IEEE

80 名前:デフォルトの名無しさん :02/10/21 20:00
>>77
ああ、これ探してたんだ。ありがとう。
でも今読むと古臭いね。テンプレートについて
何か言わなければだめだよね(藁

81 名前:もも :02/10/21 21:18
三角形の三辺の長さをa,b,cに呼び込んで、ヘロンの公式で面積Sを求めて出力する
プログラムをC++で作ってください。ちなみにヘロンの公式、z=(a+b+c)/2
S=(z*(z-a)*(z-b)*(z-c))の平方根です。どなたかよろしくお願いします。

82 名前:デフォルトの名無しさん :02/10/21 21:20
>>81
逝ってよし

83 名前:デフォルトの名無しさん :02/10/21 21:47
>>81
そういうのは相談とは言わん。(・∀・) カエレ!
http://pc3.2ch.net/test/read.cgi/tech/1021862587/l50

84 名前:デフォルトの名無しさん :02/10/21 21:49
class A{
public:
A(){::_beginthread(func,0,(void*)this);}
void func(void){}
};

これは何故エラーになるのですか?
また、メンバ関数をマルチスレッドには出来ないのですか?

85 名前:デフォルトの名無しさん :02/10/21 21:50
>>84

A::func() -> func(A this)

func(A this) != func()

86 名前:もも :02/10/21 22:13
すみません、相談ではなく質問でしたね。場違いですみませんでした。

87 名前:デフォルトの名無しさん :02/10/21 22:19
>>86
そう言う高いレベルの問題ではない。


88 名前:デフォルトの名無しさん :02/10/21 22:49
>>84
class A {
 HANDLE hThread;
 unsigned idThread;
 static unsigned _stdcall func();
public:
 A()
 { hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, &func, reinterpret_cast<void*>(this), 0, &idThread)); }
 ~A()
 { WaitForSingleObject(hThread,INFINITE); CloseHandle(hThread); }
}

unsigned A::func() { return 0; }

89 名前:デフォルトの名無しさん :02/10/21 22:54
最後間違えた

unsigned _stdcall A::func(void* a) { return 0; }

で、この関数からメンバにアクセスしたい場合は

A* Instance = reinterpret_cast<A*>(a);
Instance->メンバ

90 名前:デフォルトの名無しさん :02/10/22 03:29
class A
{
public:
 volatile bool m_bContinue;
public:
 A() : m_bContinue(true){
  _beginthread(func_, 0, (void*)this);
 }
 void func(void* data){
  //...
  _endthread();
 }
 static void func_(void* data){
  ((A*)data)->func(data);
 }
};

俺ならこんな感じで。

91 名前:デフォルトの名無しさん :02/10/22 12:00
>>90
メンバ変数m_bContinueは何のために・・・?
static関数をインライン宣言しているのは何のために・・・?
しかも再帰構造になっているのは何のために・・・?

92 名前:デフォルトの名無しさん :02/10/22 12:17
しかもCスタイルのキャストだし。ってこれは別に良いか・・

93 名前:デフォルトの名無しさん :02/10/22 13:50
Intel C++ Compiler ってどうですか?
ANSI C++ や ISO C++ に準拠しているようですが、
Loki とか Boost とか何の手も入れることなくコンパイルできますか?
使っている方がいたら教えてください。

94 名前:デフォルトの名無しさん :02/10/22 14:27
Effective C++くらいは読め。

95 名前:デフォルトの名無しさん :02/10/22 18:04
デストラクタで仮想関数を呼び出した時の振る舞いって不定でしょうか?
コンストラクタは「未構築」なので不定(たいていはベースクラスのものですよね)
なのは理解しています。

ちなみにデストラクタは virtual にしています。
デストラクトチェーン中にわざわざ vptr を書き換えているのでしょうか?

ちなみに CodeWarrior for Windows 7.0 で確認した状態では
ベースクラスの関数が呼び出されてしまいます。

96 名前:デフォルトの名無しさん :02/10/22 18:20
>>93
http://www.boost.org/status/cs-win32.html

97 名前:デフォルトの名無しさん :02/10/22 18:28
みんなBoost使ってるんだ。いいなぁ。
保守が難しくなるってんでうちは標準ライブラリしか使わせてもらえないよ。

98 名前:デフォルトの名無しさん :02/10/22 19:30
みんな標準ライブラリ使ってるんだ。いいなぁ。
保守が難しくなるってんでうちは独自ライブラリしか使わせてもらえないよ。

99 名前:デフォルトの名無しさん :02/10/22 19:34
みんなC++使ってるんだ。いいなぁ。
(以下略

100 名前:デフォルトの名無しさん :02/10/22 19:51
みんな仕事してるんだ。いいなぁ。
(-_-


101 名前:デフォルトの名無しさん :02/10/22 19:59
みんなPC使ってるんだ。いいなぁ。
保守が難しくなるってんでうちは紙と鉛筆しか使わせてもらえないよ。




102 名前:デフォルトの名無しさん :02/10/22 20:11
みんな文字つかえてるんだ。いいなぁ。
何万年後の保守が難しくなるってんで、うちは象形文字一筋。

103 名前:名無しさん :02/10/22 20:35
>>102
ケータイの絵文字でつか?

104 名前:デフォルトの名無しさん :02/10/22 22:30
>>95
>デストラクトチェーン中にわざわざ vptr を書き換えているのでしょうか?
そういうこと。
コンストラクト時は基底クラスのコンストラクト直後に派生クラスの vptr に
書き換える。デストラクト時は逆に基底クラスのデストラクト直前に vptr を
基底クラスのものに書き換える。だから、「不定」ということはない。

105 名前:95 :02/10/23 02:07
>>104
なるほど…。まだまだ詰めが甘かったです。ありがとうございました。

106 名前:デフォルトの名無しさん :02/10/23 05:44
class A
{
 const char* m_fname;
public:
 A(const char* fname);
 ~A();
};

というクラスがあったとき、

A::A(const char* fname) : m_fname(fname) {}

とやるのと

A::A(const char* fname) : m_fname(strdup(fname)) {}
A::~A() { free(m_fname); }

とやるのでは、後者の方がより安全性が高いと言えますか?

107 名前:デフォルトの名無しさん :02/10/23 08:28
>>106
文字列クラスを使う

108 名前:デフォルトの名無しさん :02/10/23 08:35
用途によるだろ。
Aを構築した後、fname の参照元に対する変更に追随する必要があるなら前者だし、
影響を受けてはいけないなら後者だな。
#VCでは _strdup だな。

109 名前:デフォルトの名無しさん :02/10/23 08:42
コピーコンストラクタを用意していない以上、後者は激しく危険。

110 名前:デフォルトの名無しさん :02/10/23 12:22
>>109
コピーコンストラクタむっちゃ忘れてました・・・
代入演算子もですよね

private:
 A(const A& a){}
 A& operator=(const A& a){}

って事でひとつ・・・

で、何が言いたかったかというと
>>108氏が言及しているような事で、
前者だと参照元がなんかの拍子で書き替わってしまったら〜
という危険性は無いのかなという疑問でした

>>107が正解ですかね・・・

111 名前:デフォルトの名無しさん :02/10/23 13:59
>>110
const char*だからなんとなく変な気がするけど、
通常のクラスで考えてみるといいよ

前者、後者どちらもあり得るけど
値型に近いもの(文字列とか)なら後者にすることが多いねえ

112 名前:93 :02/10/23 16:27

Loki-lib みたら、Intel C++ Compiler は、素の Loki 呼ぶようになってたよ。
Intel C++ Compiler 検討してみようかな…

>>96
ありがとう。参考になりました

113 名前:デフォルトの名無しさん :02/10/23 22:42
>>110
そう、文字列クラスを使うのが正解。

遅延評価してくれる文字列クラスなら
あなたの出した2つの例のいいとこどり(↓)ができる。
文字列のコピー元の内容が変わらなければ、ディープコピーが行われることはない。
文字列のコピー元の内容が変われば、その時点で複製が作成される。

114 名前:デフォルトの名無しさん :02/10/24 00:38
class A{ public:virtual ~A(){} };
というクラスがあって、
const A a;
A *pa;
pa = (A *)&a;
上のキャストはExceptional C++によると、新しいキャストに置き換えられない
と書かれているんですが(const_castすると未定義になるらしい)。
つまり & で取ったconstポインタはconst_cast出来ないと言うことですか?


115 名前:デフォルトの名無しさん :02/10/24 00:40
>>114
単に、引数でconst受けしたわけではなく、「本当にconst」なオブジェクトを
const_castすると結果が未定義というだけではなくて?

#そういう話であれば、糞C言語だってそういう規格だよ。


116 名前:デフォルトの名無しさん :02/10/24 00:48
スレ立てるまでも〜スレで聴いてみたんですが、無反応だったのでこちらで
質問させてください。

C++で、

template < (略), class F>
class X {

friend F;
以下略

っていうのは文法的にどうなんですか?

VC6なら通ったんですが、
g++の3.2だと template parameters cannot be friends で はねられました。

BCC32の5.5.1でも通りました。

117 名前:デフォルトの名無しさん :02/10/24 01:11
>>115
レスthanks.
constで宣言&初期化したオブジェクトはconst_castできないんですね。
いままでconst_castすれば何でもconstをはずせると思ってました。


118 名前:デフォルトの名無しさん :02/10/24 04:55
>>116
friend class F;


119 名前:デフォルトの名無しさん :02/10/24 08:26
Windowsで使えるDBMライブラリってないですか?

120 名前:デフォルトの名無しさん :02/10/24 10:32
>>118
レスありがとう。

>friend class F;

と書くと、VC6やBCC5.5.1ではfriendが利かないんです。
やっぱりtemplate parameters cannot be friends が正しいんですかね?


121 名前:デフォルトの名無しさん :02/10/24 10:56
delete演算ではポインタの値はNULLにセットされるのでしょうか?

質問までの経緯としては,
1.あるソースを読んでいたら
   delete pA;
   pA = NULL;
  という2行があった.
2.今までてっきりNULLがセットされるものだと思ってた自分がいて,
  焦る.セットされることを前提でif(pA)とかしてたし.
3.MSDNやWebでそのことを明言してるフレーズを見つけられず.
といった流れです.

言語仕様ではどのようになっていたかご存知の方がいたら教えてください.


122 名前:デフォルトの名無しさん :02/10/24 10:59
>>121
されない。

というか、
deleteはpAの型に応じたデストラクタを、引数pAをのせて呼び出すだけ。

無用なバグの回避のために、deleteの直後にNULLを代入するのはよい習慣。

123 名前:121 :02/10/24 11:17
>>122
レスありがとうございます!

以前書いたコードもチェックした方が良さそうですね.
もやもやが解消されてすっきりしました.

>>無用なバグの回避のために、deleteの直後にNULLを代入するのはよい習慣。

はい,心掛けるようにします.


124 名前:デフォルトの名無しさん :02/10/24 11:54
>>122
> deleteの直後にNULLを代入するのはよい習慣。
俺はそうは思わない。無駄なコードは読み手に誤解を与える場合がある。
それに以下のような場合、NULLを代入するためだけにconstを外す必要が
あるが、constですむものをconstにしないのは悪い習慣である。
 A *const pA = new A;
 delete pA;
 pA = NULL;

125 名前:デフォルトの名無しさん :02/10/24 11:56
JavaやC#でも要らなくなった参照にはnullを入れるのがよい習慣
とされてるね。こっちは事情が違うけど、無駄な参照を減らすのは
よいことだと思う。

126 名前:デフォルトの名無しさん :02/10/24 13:10
>>121
自分でdeleteなんて書かなくていいようにするのがもっとよい習慣。

127 名前:デフォルトの名無しさん :02/10/24 13:33
>>125
事情違いすぎ

128 名前:デフォルトの名無しさん :02/10/24 14:07
>>124
つーか、const なポインタを delete するような状況って
それをメンバとして持つオブジェクトのデストラクト時
くらいしか思いつかんが。

129 名前:デフォルトの名無しさん :02/10/24 14:36
>>128
ポインタ自体の const と delete には何の関係もないと思いますが
何か勘違いしてません?


130 名前:デフォルトの名無しさん :02/10/24 14:42
素人はnull/NULL/0を代入したほうがいいな。
余計なことを考えずにすむし。

131 名前:デフォルトの名無しさん :02/10/24 14:50
厨房な質問ですみません。
NULLを代入するとどうしてバグ回避になるんですか?

132 名前:デフォルトの名無しさん :02/10/24 14:51
>>131
>>121

133 名前:デフォルトの名無しさん :02/10/24 14:52
まあ厨房はおとなしくNULL入れてろってこった。

あ、玄人の皆さんはしなくていいですよ。

134 名前:デフォルトの名無しさん :02/10/24 15:27
>>132
ありがとうございます。見落としていました。
メンバ変数とかをdeleteをしたときに、NULLを入れておくようにするのですね。

135 名前:デフォルトの名無しさん :02/10/24 16:13
デフォルト値プログラミングが流行るに3ペリカ

136 名前:デフォルトの名無しさん :02/10/24 16:22
template <typename T>
void safe_delete(T*& ptr)
{
delete ptr;
ptr = static_cast<T*>(0);
}

137 名前:デフォルトの名無しさん :02/10/24 16:51
>>136
キャストしなくても 0 は明らかにヌルポインタなのだが。

138 名前:C++使い(定期) :02/10/24 16:52
C++必読書のご案内です。

基本
ブ厚いけど持っておくと(・∀・)イイ!
◎ プログラミング言語 C++ 第三版

普通
◎ Effective C++
◎ More Effective C++
◎ Effective STL
◎ Exceptional C++

Hな方
◎ Modern C++ Design

139 名前:デフォルトの名無しさん :02/10/24 17:04
貧弱なマシンをお使いの方
◎Optimizing C++

140 名前:デフォルトの名無しさん :02/10/24 19:24
Efficient C++は激しくイマイチだった。memory pool くらいかなぁ。フ-ンと思ったのは。他はたとえば138の本を読んだことがあるなら常識。


141 名前:デフォルトの名無しさん :02/10/24 21:45
C++ やっていたら人生に疲れました。
どうしたらいいですか?

142 名前:デフォルトの名無しさん :02/10/24 21:59
>>141
ん?C++が人生に影響与えるほど疲れたか?
取り敢えず精神神経科にいって薬出してもらいなさい。

143 名前:デフォルトの名無しさん :02/10/25 00:38
>>120
どっかで見た話題だな、と思ってたのだが思い出した。
http://www.kmonos.net/wlog/
の10/9にそのネタが。

>>138
憂鬱本も入れといてホスィ。

144 名前:120 :02/10/25 02:03
>>143
レスありがとう!
とても助かりました。聴いてみてよかったです。
テンプレートまわりは、どの処理系も多少怪しそうですね。
リンク先を参考にさせていただきます。


145 名前:デフォルトの名無しさん :02/10/25 12:55
呼び出し元で構造体配列のポインタを保持して、そのポインタのアドレスを渡して
呼び出し先で新たに領域確保したいのですが、単純型だと出来るのですけど
構造体になった途端同じコード使い回しているのに出来なくなってしまいます
どなたかアドバイスを宜しくお願いします

146 名前:デフォルトの名無しさん :02/10/25 12:58
>>145


147 名前:デフォルトの名無しさん :02/10/25 12:59
ダブルポインタで渡さなければならないとこでポインタ渡ししているとか。

148 名前:デフォルトの名無しさん :02/10/25 13:11
>>147
void hoge(WORD **p,DWORD s,DWORD a);
main()
{
 WORD *p=NULL;
 hoge(&p,i*j,j);
}
void hage(VERTEX **vertexdat,DWORD *dwNumVertices,DWORD div,
     FLOAT fTheta0,FLOAT fTheta1,POINT Center,FLOAT r);
main()
{
 VERTEX *vertdat=NULL;
 hage(&vertdat,&dwnum,4,
    D3DXToRadian(30.f)*i,D3DXToRadian(30.f)*(i+1),cntr,20.f);
}
上は出来ても下は失敗するのですが、?


149 名前:デフォルトの名無しさん :02/10/25 13:34
コンパイルエラー?それとも論理エラーっぽいの?

150 名前:デフォルトの名無しさん :02/10/25 13:37
それとDirect3D使っているみたいだから、hage内で想定しない
HRESULTが返ってきているためのエラーかもね。


151 名前:デフォルトの名無しさん :02/10/25 13:39
コンパイルエラーというか、newやらdelete[]が失敗して落ちます
VC6のメモリウィンドウで*vertexdatが違うところを指していて
*vertexdat+0が実際の場所を指しています
これはメモリウィンドウのせいかもしれませんが、気になります

152 名前:147=149=150 ◆o615kFadeE :02/10/25 13:50
>newやらdelete[]
new と delete []をペアでつかっているの?new[]じゃなくて。

153 名前:デフォルトの名無しさん :02/10/25 13:57
>>152
new[]です間違えました御免なさい


http://jp.y42.briefcase.yahoo.co.jp/bc/nas6_2001/lst?&.dir=/Projects&.src=bc&.view=l&.last=1
うpしたので心優しく時間もある方見てみてください
行数はあまりないので宜しくお願いします

154 名前:デフォルトの名無しさん :02/10/25 14:01
>>153
パスワード求められるよ?

155 名前:デフォルトの名無しさん :02/10/25 14:02
>>153
あれゲストでは入れませんか?ちょっと待っててください

156 名前:デフォルトの名無しさん :02/10/25 14:04
読みにくいと思った。終わり。

157 名前:デフォルトの名無しさん :02/10/25 15:29
>>153
サーバーがビジーで開けんよ?

158 名前:デフォルトの名無しさん :02/10/25 15:36
すいません、どなたか教えてください。
もう行き詰って…

例えば手元に100個のデータファイルがあるとします。
その100個のデータファイルひとつひとつに
同じフィルタをかけたいのです。
そこで

ifstream in(****, ios::in | ios::binary);
ofstream out(####, ios::out );
filter();

こんな感じのプログラムをつくっているのですが、
この****と####をファイルごとに変えたいのです。
どのようにすればよいでしょうか?
argvで100個ファイル名を打ち込むとか無しで。
自動的に行いたいのです。
1000個になってもファイル数だけ指定するだけで
簡単に処理できるようにしたいです。

よろしくお願いします。

159 名前:153 :02/10/25 15:37
ブラウザのアドレスのとこに貼り付ければいけるはずですが、

160 名前:153 :02/10/25 15:40
>>158
ファイル検索するか、ファイル名に規則性持たせたりすればいいのでは?

161 名前:158 :02/10/25 15:45
>>160
レスありがとうございます。

ファイル名に規則性をもたせることはできます。
自分の勉強不足かもしれませんが、
ifsteramの****部分には例えば"test1.dat"というような
きちんとしたファイル名を指定をしないと読み込めないみたいなのです。
そうするとtest2.dat、test3.dat、test4.dat…test100.datと続くとき、
どうループをまわせばよいのかと。



162 名前:153 :02/10/25 15:48
strcpy(str,"test");
sprintf(s,"%d.dat",i);
strcat(str,s);
じゃ駄目ですか

163 名前:158 :02/10/25 15:51
>>162
ありがとうございます。
ちょっとやってみます。

164 名前:デフォルトの名無しさん :02/10/25 15:52
for (int n = 0; n < max_num; ++n)
{
std::string s("file");
s += boost::lexical_cast<std::string>(n);
s += ".???";
ifstream ifs(s.c_str());
...

165 名前:158 :02/10/25 15:55
>>164
ありがとうございます!
これもまたやってみます。
C++初心者なのでちょっと理解するのが大変そうですが。

>>163
sprintf、これは思いつかなかったです。


166 名前:157 :02/10/25 15:57
>>159 クリックで行けたよ。
 
このコードを見る限りでは new は不要に思える。
WORD w[8][8];
for (int x = 0; x < 8; ++x)
 for (int y = 0; y < 8; ++y)
  w[x][y] = x * 8 + y;
でいいんじゃない。
 
どのような結果を期待していたのかが解らないので、これ以上はなんとも言えない。

167 名前:153 :02/10/25 15:57
うわかっちょいいあちきは元々c屋なもんでへっぽこですな

168 名前:153 :02/10/25 16:03
>>157
hageの方が実際の実装予定関数でそっちは可変長で実装するので
newで確保->newでサイズ増やして再確保->・・・
が必要なのです
で多分hageはメモリエラーしてそうな気がしてきました
(グローバルにしても落ちたので)
がんばってバグ取りします
レスありがとうございました

169 名前:157 :02/10/25 16:19
>>168
そんな貴方に std::vector。
typedef vector<VERTEX> Vertices;
Vertices v(n)  n = 要素数
v.resieze(newsize)  拡大(縮小にも使える)
v[index].x 要素アクセス

170 名前:158 :02/10/25 16:28
>>163,164
できました〜
ありがとうございました。

171 名前:153 :02/10/25 16:28
>>169
ありがとうございます
やってみまつ


172 名前:デフォルトの名無しさん :02/10/25 16:31
std::valarray<double> va;

173 名前:デフォルトの名無しさん :02/10/25 16:38
>>172 VERTEXにはチョト剥いてない…

174 名前:147=149=150 ◆o615kFadeE :02/10/25 18:41
>>153
VERTEX *p=new VERTEX[*dwNumVertices+div*4];//VERTEX[*dwNumVertices+div];

又は、

*vertexdat=p;
for(i=0;i<= *dwNumVertices;i++)//for(i=0;i<div;i++)
{

という訳で書きこみオーバーによるdelete []
の例外発生。


175 名前:デフォルトの名無しさん :02/10/25 21:04
C++では、eof()の発生時期がCと違うようなのですが。

ifstream stream("filename", ios::binary);

while (!stream.eof()) {
処理1
stream.read(reinterpret_cast<char*>(&rec), SIZ);
}

とやると、一番最後のレコードを2回読んでしまいます。
どうすれば一番最後のレコードを1回しか読まないようにできますか?

176 名前:デフォルトの名無しさん :02/10/25 21:06
whie (1)
{
// ...
if (!stream.read(...))
break;
}

177 名前:デフォルトの名無しさん :02/10/25 21:17
>>176
ありがとうございます。ということは、レコードがない所でreadを
実行しないとEOFが検出されないようですね。助かりました。

178 名前:デフォルトの名無しさん :02/10/25 21:27
>175
おいおい。
EOF の発生条件は C の fread() や fgets() 等でも同じでないかい?
ファイルの終端を超えて読もうとしない限り EOF にならない。

179 名前:デフォルトの名無しさん :02/10/25 21:31
EOFの発生条件は
×ファイルポインタがファイルの終端に到達した
○ファイルの終端を越えてreadしようとした
でOKですか?

180 名前:デフォルトの名無しさん :02/10/25 21:34
>>178
うむそうですね。fread()などはファイルの終端に達していても
読み込んだバイト数を返しますからね。

>>179
そのようです。

181 名前:デフォルトの名無しさん :02/10/26 07:19
既存のcppソースに、ダイアログからのテキスト入力を追加したいと思っています。
〜なんとか.rc というファイルができて、レイアウトなどはできたようなのですが、
これを既存のソースからどう呼び出せばいいのか、わかりません。

サンプルが載っているページ等でもいいので、どなたかヒント戴けませんでしょうか。
(ダイアログの使い方は、VBで言うところのInputBoxみたいな感じです。text入力欄とok、cansel)

182 名前:デフォルトの名無しさん :02/10/26 07:34
>>181
★初心者にVisual C++を教えるスレ★
http://pc3.2ch.net/test/read.cgi/tech/1030985362/l50
VisualC 相談室【8】
http://pc3.2ch.net/test/read.cgi/tech/1022499000/l50

183 名前:182 :02/10/26 07:36
しまった、VC++ とは限らないか。
こっちね。

Windows Programing for C/C++(Not MFC)
http://pc3.2ch.net/test/read.cgi/tech/1018239290/l50

184 名前:デフォルトの名無しさん :02/10/26 08:37
      ∧_∧      ∧_∧
     _( ´∀`)    (´∀` )
  三(⌒),    ノ⊃    ( >>1 .)   糞スレは  
     ̄/ /)  )      | |  |
    . 〈_)\_)      (__(___)
         ∧_∧  .∧_∧
         (  ´∀) (´∀` )
       ≡≡三 三ニ⌒) >>1 .)    立てるなって
        /  /)  )  ̄.| |  |
        〈__)__)  (__(___)
           ∧_∧  ,__ ∧_∧
          (    ´)ノ ):;:;)∀`)
          /    ̄,ノ'' >>1 . )   言ってるだろうが
         C   /~ / /   /
         /   / 〉 (__(__./
         \__)\)
                      ヽ l //
            ∧_∧(⌒) ―― ☆ ―――
            (    ) /|l  // | ヽ   ヴォケがーー!
           (/     ノl|ll / / |  ヽ
            (O  ノ 彡''   /  .|
            /  ./ 〉
            \__)_)


185 名前:デフォルトの名無しさん :02/10/26 08:56
やい 184、漏れの白星パンチを無闇に振りまくな。

186 名前:デフォルトの名無しさん :02/10/26 09:32
この業界入って、何の資格も取らずに40歳までいっちゃうとリストラ対象になるってホントですか?

187 名前:デフォルトの名無しさん :02/10/26 10:04
>>186
あちこちこぴぺすんな!

188 名前:名無しさん :02/10/26 10:13
マネジメント能力があれば飛ばされはしないだろう。
いつまでも古いコードを吐いてもらっちゃ困るしな。

189 名前:デフォルトの名無しさん :02/10/26 16:05
ぬるぽのチェックは、
if (nanikano_pointer)
{
// not null
}
else
{
// nurupo
}
でいいの?
あと、NULLは、<iostream>に定義されてるの?

190 名前:デフォルトの名無しさん :02/10/26 16:08
>>189
NULLを0と断定するのは危険。

とでも言っておこう。

191 名前:デフォルトの名無しさん :02/10/26 16:14
>>189null pointerチェックはそれでいい。
規格でnull pointerは「偽」とみなされることになってる。

192 名前:デフォルトの名無しさん :02/10/26 16:18
>>191
へぇ、つまんない・・・。

193 名前:デフォルトの名無しさん :02/10/26 16:25
char* null_po()
{ return 0; } // ok.

194 名前:デフォルトの名無しさん :02/10/26 16:31
サブクラスのコンストラクタでスーパークラスの関数を
必ず呼ぶようにするのは、どうするのです?
<pre>
class A {
A() {
いろいろ処理
}
void Init( int i ) {
いろいろ処理
}
}

class B : public A {
B() {
いろいろ処理
  Init( 100 ); <----これを必ず書いてはしい
}
}
</pre>
ドキュメントに書いとく事しかできないのですかな。

195 名前:デフォルトの名無しさん :02/10/26 16:34
class A
{
A(int n);
};


196 名前:デフォルトの名無しさん :02/10/26 16:37
コンストラクタで済ますのが理想だねえ
ダメなら、デバッグビルドのときはフラグでInitを呼んだかチェックするように
するとか・・・

197 名前:デフォルトの名無しさん :02/10/26 18:26
NULLは<cstddef>だろ。ていうか使うな。


198 名前:デフォルトの名無しさん :02/10/26 18:28
C++って文法が汚いんですか?
オーバーロード機能のせいですか?


199 名前: ◆hMJAPH9PWA :02/10/26 18:34
>>198
オーバーロードは汚いとは思わないけど、
lambdaやinterfaceが無いから汚くせざるを得ない、って事はあるかもね。

200 名前:デフォルトの名無しさん :02/10/26 18:46
コンストラクタで
そのクラスのメンバ関数を呼び出しても
基本的にはOKと思ってるんですが、
問題になる場合はどんな時なんでしょうか?


201 名前:デフォルトの名無しさん :02/10/26 18:55
メンバ関数が別のクラスのメンバ関数を呼んでいて、
そこでそのクラスのコンストラクタが呼び出されると、、

202 名前:デフォルトの名無しさん :02/10/26 19:03
女子生徒「先生、私、ここの公式、どうしても暗記できないんです。」
先生 「頑張れば、だんだん、覚えられるようになるよ。」
女子生徒「で、でも・・・。先生は全部暗記してるんですか?」
先生 「もちろん。受験生のときに、なんとか暗記したよ。」
女子生徒「いいなぁ。先生の脳みそ、わたしにも分けてほしいな。」
先生 「ははは。脳みそは無理だけど僕の遺伝子だったらあげてもいいよ。
僕の遺伝子には、今まで勉強してきたことがすべて記憶されてるんだよ」
これがあれば、簡単に合格できるかもよ。」
女子生徒「え〜。それ、欲しい、欲しい。どうすれば、先生の遺伝子もらえるの?」
先生 「そうか・・・。じゃあ、スカートとルーズソックスはそのままでいいから
パンティをぬいでごらん。」
女子生徒「はい、脱ぎました。早く、先生の優秀な遺伝子をください。」
先生 「そんなにせかさなくても、たっぷり分けてあげるから。
それじゃあ、始めるよ。ハァハァ・・・。」
女子生徒「あっ・・・。先生・・・。も、もっと・・・。」

203 名前:デフォルトの名無しさん :02/10/26 19:48
C++で、Javaの
(Cast)Class.forName("className").newInstance();
ってどうやるの?

204 名前:デフォルトの名無しさん :02/10/26 19:57
>>203
それをやるとどうなるのかをまずかけ。
C++を知っている奴がみんなJAVAを知っているわけじゃないだろ。

205 名前:デフォルトの名無しさん :02/10/26 19:58
>>203
http://www.garret.ru/~knizhnik/cppreflection/docs/reflect.html
を突っ込む。

206 名前:デフォルトの名無しさん :02/10/26 20:36
>>200
そのクラスではまだ実装されてない純粋仮想関数を呼び出すとヌルポで落ちる

207 名前:デフォルトの名無しさん :02/10/26 20:38
>>205
感動した!


208 名前:デフォルトの名無しさん :02/10/26 20:42
>>202
感動した!

209 名前:デフォルトの名無しさん :02/10/26 21:54
>>202
ボッキサゲ!


210 名前:デフォルトの名無しさん :02/10/27 00:01
コンパイラによってデフォルトのコピーコンストラクタと代入演算子が
生成される条件(あるいはされない条件)について判りやすく説明しているサイトってないですか?


211 名前:デフォルトの名無しさん :02/10/27 00:02
コンパイラに依存するんだっけ?

212 名前:デフォルトの名無しさん :02/10/27 00:05
sinaidesu


213 名前:デフォルトの名無しさん :02/10/27 00:18
>>210
される条件。

 ・(コピーコンストラクタ|代入演算子)が宣言されていない
 ・全てのメンバ変数がそのクラスのスコープで(コピーコンストラクト可能|代入可能)
 ・派生元が、そのクラスのスコープで(コピーコンストラクト可能|代入可能)

以上。

214 名前:デフォルトの名無しさん :02/10/27 00:24
char aho[10000000]に一括してある数でXORかける関数ありませんか?
なかったらforでチマチマやってくしかないでしょうか。


215 名前:デフォルトの名無しさん :02/10/27 00:26
標準ライブラリにはないですね。

チマチマやる関数を作りましょう。

216 名前:デフォルトの名無しさん :02/10/27 00:35
わかりました。

217 名前:デフォルトの名無しさん :02/10/27 00:35
>>214
namespace {
char Xor( char c, char m ) { return c ^ m; }
}

int main(void) {
static const char aru_kazu = 10;
char* aho = new char[10000000];
std::transform( aho, &(aho[10000000]), aho, std::bind2nd( std::ptr_fun(Xor), aru_kazu ) );
}
・・・嘘です。


218 名前:デフォルトの名無しさん :02/10/27 00:59
struct Xor : public std::unary_function<char,char> {
explicit Xor(int m) : m_m(m) {}
result_type operator()(argument_type c) { return c ^ m_m; }
private:
char m_m;
};

...

Xor f(aru_kazu);
std::transform(aho, &(aho[10000000]), aho, f);

のほうがだいぶ速いのではなかろうか。

>・・・嘘です。
同じく。


219 名前:デフォルトの名無しさん :02/10/27 01:02
オナニーショウは終わりですか?

220 名前:デフォルトの名無しさん :02/10/27 01:03
多分あと2つくらい。


221 名前:デフォルトの名無しさん :02/10/27 01:04
真のC++プログラマーなら、C のキャスト 使わずに
static_cast dynamic_cast const_cast とか、使うべきですか?

これを、使うことによって、メリットってあるのかな?
人のソースとか、読んでると、ほとんどの人が、Cキャスト。

222 名前:デフォルトの名無しさん :02/10/27 01:06
>>221
仕事ならば、そこのコーディング規約に従う。

趣味あるいはコーディング規約を作る立場ならば、
C++キャストが適した場所には必ず使う。

223 名前:デフォルトの名無しさん :02/10/27 01:07
>>221
漏れはCキャストは使わないが、コーディング標準を決めるときは

・dynamic_castは代用できないから使わざるを得ない
・(constをどうしてもはずさなければならないならそのようにしてもいいが、Cキャストではなく)const_castを使え
・あとは好きにしたら?

くらいにしている。逆に、数値計算っぽい箇所でのstatic_cast強要は少し
可愛そうかな(タイプ数的に)、とも思う。



224 名前:223 :02/10/27 01:11
なお、生粋のCプログラマさんには、
・type safetyのありがたさ
・const objectのありがたさ
をわかってもらった上で、223の規約を適用します。

放っておくと無意味なキャスト、無意味なconstはずしで積み上げてきた各種の保証がぼろぼろになるから...




225 名前:デフォルトの名無しさん :02/10/27 01:17
221はどーしてんのYO


226 名前:デフォルトの名無しさん :02/10/27 01:29
どうして誰も >>190 に突っ込まないんだ?

227 名前:153 :02/10/27 01:29
>174
亀レススマソ
デバグしていただいてありがとうございました

228 名前:デフォルトの名無しさん :02/10/27 01:32
189が正しい、という突っ込みが入ったからそれでいいんじゃないの?



229 名前:デフォルトの名無しさん :02/10/27 02:03
キャストoperatorで暗黙の変換が
予想通りに働かないのですが、なぜなんでしょうか?
struct to
{
const char* ptr;
to(const char* c){ptr = c;}
operator const char* (){return ptr;}
const char* get(){return ptr;}
};
void print(to a)
{
std::cout << a;//const void*が呼ばれてる!!//address
std::cout << (const char*) a;//正しい//aa
std::cout << a.get();//正しい//aa
std::string s = a;
std::cout << s;//これは正しい//aa
}
int main()
{
print("aa");
}

230 名前:デフォルトの名無しさん :02/10/27 02:09
g++の3.2ではprint関数の最初の出力は問題ありませんが?
あと、std::string s = a;は s(a) ; とせんとコンパイルでけん。



231 名前:229 :02/10/27 02:31
>>230
サンクス。
やっぱ、VC++.NETのバグの気がしてきた。

232 名前:デフォルトの名無しさん :02/10/27 04:06
std::string::string(const char*)があって
to::operator const char*() があるからって

暗黙に
std::string s = a.operator const char*();
してくれるんだっけ?


233 名前:デフォルトの名無しさん :02/10/27 05:23
規格の裏づけがないようなコードは書かずに、素直に明示キャストした方が
いいような。
229 に関しては、ostream への operator<< を実装すべきだ。

234 名前:デフォルトの名無しさん :02/10/27 10:12
struct to に複数のcast operatorがあって
coutが複数のoperator overloadがあると
どれが選ばれるか分からんような...

235 名前:デフォルトの名無しさん :02/10/27 10:34
>>234
BCCだと型を明示しろっつーコンパイルエラーが出る
確か「cout << static_cast<目的の型>(to)」で問題ないはず

236 名前:デフォルトの名無しさん :02/10/27 10:48
>>234
一体何で混乱する?
何も考えずに operator<< が呼ばれる。
その前に明示的に型キャストを指定していれば別だ。

# 漏れ的には、229 の std::cout << a; で、何で to::operator const char* () と、
# それに続けて ostream::operator<<(const void *) が呼ばれるのか分からん。
# まあ VC のバグなんだろうな・・・。

あと、ややどうでもいいか゜ 229 が何で std::endl をつけないのか不思議だ。

237 名前:236 :02/10/27 10:49
すまそ、234 の意味を取り違えてた。
逝ってきます・・・

238 名前:デフォルトの名無しさん :02/10/27 10:53
>>236
> 一体何で混乱する?
> 何も考えずに operator<< が呼ばれる。

どの operator<< が呼ばれるの?
具体的な宣言まで一緒に書いてみてよ。

239 名前:237 :02/10/27 10:55
>>238
いやすまん、223 から続けて 234 を読んで混乱したみたいだ・・・
忘れてくれ。

240 名前:238 :02/10/27 10:57
アイヨ>>239

ついでだから
 struct to a;
 printf("%d", a);
とやるとどうなるんだっけ、とか混乱してみる。

241 名前:239 :02/10/27 11:03
>>240
やってみた。
単に、a のアドレスが 10 進で出るみたいだ。
a.ptr と同じアドレスだからやや紛らわしそう。

242 名前:241 :02/10/27 11:04
つまり、printf(const char *, ...) だから型キャストなんて発生しない
という事かな。

243 名前:デフォルトの名無しさん :02/10/27 14:40
>>221
C風キャストに使う理由が見出せない。
C++のキャストの方が意図・区別がし易い。

244 名前:デフォルトの名無しさん :02/10/27 14:46
C++では()を使ったキャストは基本的にご法度?

245 名前:デフォルトの名無しさん :02/10/27 14:48
yes


246 名前:デフォルトの名無しさん :02/10/27 14:50
なるほど。さんくす個

247 名前:デフォルトの名無しさん :02/10/27 15:08
ていうかconst外しなんてするべきではないよな。

248 名前:デフォルトの名無しさん :02/10/27 15:10
221の話題だな


249 名前:デフォルトの名無しさん :02/10/27 15:26
const外しが発生するのはそもそもインターフェイス設計が
間違っていると思います。

250 名前:デフォルトの名無しさん :02/10/27 15:37
>>249
厨房と爺はメソッドをconstにしないし、引数をconstにしないんだからしょうがない。



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