5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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にしないんだからしょうがない。


251 :デフォルトの名無しさん:02/10/27 15:57
古いCライブラリを実装してたら外さなければならない状況がありました。

252 :デフォルトの名無しさん:02/10/27 15:57
>>241
dobleとintの間の変換をしょっちゅうやるような場所だったら、
Cキャストの方が楽だし、そういう場面では危険も少ないとは
思う。それ以外なら問答無用でC++キャストにするけど。

253 :241:02/10/27 16:00
>>252
明後日の方向にレスなさってますか?
つーか、「C キャストの方が楽」 って・・・タイプ数が少ないって事?

254 :デフォルトの名無しさん:02/10/27 16:20
タイプ量云々以外にC風キャストを使う意味ってあるんですか?

255 :デフォルトの名無しさん:02/10/27 16:43
不定…
未定義…
(・∀・)イクナイ!

256 :デフォルトの名無しさん:02/10/27 17:10
どうでもいいけど、クラスのメンバ変数の名前ってどうしてる?

1, 接頭辞m_をつける
2, 接尾辞_をつける
3, んなもんつけない(で、メンバ関数の引数とかぶるときはthis->をつかう)

俺は2か3で迷ってるんだけど…。(最近は2)
1は使ったことない。

257 :デフォルトの名無しさん:02/10/27 17:12
>>256
漏れは、自分だけで書くなら常に 3。
共同の場合は相談に応じて。
仕事の場合はしょうがないから規約に従う。

258 :デフォルトの名無しさん:02/10/27 17:18
自分だけで書くコードは最近は3。
人に見せるときは1か3、だなぁ。接尾辞 _ って
目立たないので、あんまり付ける意味が感じられなくて。

259 :デフォルトの名無しさん:02/10/27 17:44
仕事のときにはそこの規約にしたがう。

そうでない場合は気分によるな・・・どれでも別に構わないし

260 :デフォルトの名無しさん:02/10/27 17:47
そろぞろ「接頭辞をつける奴はアフォ」発言が来るぞ

261 :デフォルトの名無しさん:02/10/27 17:50
Say Prefix

262 :デフォルトの名無しさん:02/10/27 20:20
最近2の「接尾辞_をつける」パターンをよく見る。
いつごろから使われだしたんだろ。


263 :デフォルトの名無しさん:02/10/27 20:29
>>262
漏れの場合は Exceptional C++ を読んでから。

264 :デフォルトの名無しさん:02/10/27 20:32
>>263
なんか理由かいてあるの?

265 :デフォルトの名無しさん:02/10/27 20:48
「クラス名::メンバ名」って人はさすがにいないのかな。

266 :263:02/10/27 20:51
「接[頭]辞 _ は使ってはいけない」 理由が書いあるけど、
接尾辞_については特に。「個人的なおすすめ」とだけ。
あの本好きなので習ってみただけっす。

>>265
それはstatic変数用にとっておく。

267 :デフォルトの名無しさん:02/10/27 21:02
クラスのメンバに接頭・接尾語付けないヤツはアホ

クラスメンバint aがあったとして
Class::GetA() { return a; }
Class::SetA(const int& a) { this->a = a; }
とかやってたら更にアホ

Class::a() { return m_a; }
Class::a(const int& a) { m_a = a; }
にしろ

268 :デフォルトの名無しさん:02/10/27 21:06
とりあえず理由を述べないヤツはアホ

269 :名無しさん:02/10/27 21:25
クラスメンバにaなんて短い名称をつけるやつがアホ。
クラスにするくらいなんだから、意味づけしろよ。

270 :デフォルトの名無しさん:02/10/27 22:39
ただの例文に対してそんなところにしか突っ込めない奴が一番アホ。
終了。

271 :デフォルトの名無しさん:02/10/27 22:43
268 を無視して 269 だけ煽り返す奴は宇宙一 DQN
しかも 269 は 「一番アホ」 と表現する程でもない

272 :271:02/10/27 22:45
失礼。
269 は 「一番アホ」 と表現する程でもないどころか、言っている内容は
至極まともだ。
ただの揚げ足取で、269 の本論は全く覆せていない。

つーか例示にしても a じゃなくて Something とかにしとけ。

273 :デフォルトの名無しさん:02/10/27 22:46


   2 6 7 必 死 だ な




274 :デフォルトの名無しさん:02/10/27 22:52
「関数の型を書かないやつはアホ」とかくだらないことどんどん書いててくださいよ

275 :デフォルトの名無しさん:02/10/27 22:59
ってか、267 の示した前者と後者も、大した違いは無い。
と言うより、本当のプロパティのように扱えない以上、Get/Set は
つけるべきとまでは言わんが、そうしても良いと思うがどうよ?

276 :デフォルトの名無しさん:02/10/27 23:29
アホキター!!!

277 :デフォルトの名無しさん:02/10/27 23:30
>>276
>>276

278 :デフォルトの名無しさん:02/10/27 23:49
>>275
正直、コーディング規約が統一されてればどっちでも良い。それより int を
渡すのに、わざわざ参照使ってる方が気になる(w

(まー、今時のコンパイラなら最適化かければ結果的には変わらんだろうが)

279 :デフォルトの名無しさん:02/10/28 00:29
>>278
Class::GetA() const、になっていないのも気になって夜も眠れない。


280 :デフォルトの名無しさん:02/10/28 00:33
そろそろ「prefixをつける奴はKIMOI」発言が来るぞ

281 :デフォルトの名無しさん:02/10/28 00:40
JavaHouse方面で、"m_ "を "余計なもの"と呼称する祭りが以前は定期的に開催されていたと
記憶していますが、その際の叩く理由は何でしたっけ?C++には関係なし?



282 :デフォルトの名無しさん:02/10/28 00:44
要約すると、267 が一番アホという事か。

283 :デフォルトの名無しさん:02/10/28 00:44
prefixをつける奴はKIMOI

284 :デフォルトの名無しさん:02/10/28 00:47
suffixをつける奴はKIMORIN


285 :デフォルトの名無しさん:02/10/28 00:48
>>282
自明


286 :デフォルトの名無しさん:02/10/28 01:06
なんで >>260 で完璧に予言されてるのに、普通にルーティンワークしてるんだよ(藁

287 :デフォルトの名無しさん:02/10/28 01:16
ニチャソダカラ


288 :デフォルトの名無しさん:02/10/28 01:35
Cマガジンが毎年C言語入門講座をやるのと同じでは?

289 :デフォルトの名無しさん:02/10/28 01:50
>>286
それがルーティンワークというものだ

290 :デフォルトの名無しさん:02/10/28 02:01
自己言及的テンプレートのようで(・A・)イイ!


291 :デフォルトの名無しさん:02/10/28 02:58
>290 カオガイクナイ

292 :256:02/10/28 07:58
なんか凄いことになってるな…。。。
接尾辞_はタイプ数が減るから好き。
this->はちょっと長い。
m_はそもそもなんか格好悪い。mってマゾですか(藁

293 :デフォルトの名無しさん:02/10/28 07:59
>>292
メンバです。アホですか?

294 :デフォルトの名無しさん:02/10/28 08:07
「アフォ」「キモイ」「格好悪い」

キター!!!!

295 :デフォルトの名無しさん:02/10/28 08:40
class A
{
 int a;
public:
 int GetA() { return a; }
 void SetA(int a) { this->a = a; }
};
とかやってるヤツは低脳

class A { public: int a; };
にしろ

296 :デフォルトの名無しさん:02/10/28 08:49
>>295
内部で保存していたいデータと外から見えるようにしたいデータが著しく違う場合は?

たとえば、日付は内部では整数型で管理した方が都合が良いが外には文字列型で見せたいとか。

297 :デフォルトの名無しさん:02/10/28 09:30
お互いがお互いをメンバに持ち合うクラスって作れますか?

class A{
B b;
};

class B{
A a;
};

みたいな

298 :デフォルトの名無しさん:02/10/28 09:32
>>295
それなら構造体にするのが普通だと思うんだが

299 :デフォルトの名無しさん:02/10/28 09:56
>>297
ポインタだったら可能。

class A {
B *b;
}

class B {
A *a;
}

300 :256:02/10/28 10:13
>>293
ネタにマジレスされたよ(T__T)

301 :デフォルトの名無しさん:02/10/28 10:15
A *a = new A();
a->b->a->b->a->b->a = a;

わけわかんねえ…


302 :デフォルトの名無しさん:02/10/28 10:18
>>301
リンクリストとかツリーとかだとそういう構造になるけど…

303 :デフォルトの名無しさん:02/10/28 10:19
メンバ変数がset/get関数でしか参照されない場合、
その設計は100%誤りである。

304 :デフォルトの名無しさん:02/10/28 10:25
>>302
ツリーなら2つクラス用意せんでもいいんでないかい?

305 :デフォルトの名無しさん:02/10/28 10:26
>>303
定義を述べるだけなら誰でもできる。
根拠もついでに示してくれ。

306 :デフォルトの名無しさん:02/10/28 10:27
>>301
途中のでNULLポインタが混ざっててエラーを起こす罠

307 :デフォルトの名無しさん:02/10/28 10:32
>>304
> ツリーなら2つクラス用意せんでもいいんでないかい?

「そういう構造になる」というのは、データが再帰的に
連なるって程度のことで、深い意味は無いです…

(ツリーだとノードとリーフで複数のクラスを使うことがよくあるとは思うけど)


308 :デフォルトの名無しさん:02/10/28 14:28
C++規格書の日本語版はJISから手に入りますか?

309 :デフォルトの名無しさん:02/10/28 16:18
C++をやりたいのですが、Cの知識もないときついでしょうか?

310 :デフォルトの名無しさん:02/10/28 16:28
いいえ。

311 :デフォルトの名無しさん:02/10/28 16:32

あるクラスを定義して、
それが参照されたときに必ず、
ある関数が先に呼ばれる、って事を実装したいです。

class CLASS_BASE
{
  public: void f_0(){ /* こっちを呼んだ時でも、 */ }
};

class CLASS : public CLASS_BASE
{
  public: void f_1(){ /* こっちを呼んだ時でも、 */ }
  public: void f_2(){ /* これが、いつも先に必ず呼ばれる */ }
};

f_1 は内部で f_2 を呼べばいいのですが、
f_0 は既存の物なので、書き換えるわけにはいきません。
関数が1つ2つならオーバーライドですみますが、
関数はたくさんあるので巧く書けません。

どなたか、エレガントな方法をお教え下さい。




312 :デフォルトの名無しさん:02/10/28 16:39
>>309
┌──────────┐
│  Cの知識 ┌────┼───────┐
|       .|. . .   |. . .C++.の知識.|
└─────┼────┘          . |
       .  └────────────┘

かぶる領域はある。


313 :309:02/10/28 16:42
>>310>>312
ありがとうございました

314 :デフォルトの名無しさん:02/10/28 16:43
被るというか抱合してやってるというか。

315 :311:02/10/28 16:46
だれか>>311プリーズ。


316 :デフォルトの名無しさん:02/10/28 16:53
#DEFINE DECLARE_INHERITE_HOOK(base, func, hook)\
void (func)(){\
(hook)(); \
(base)::func();\
}
とでもしとけ。

317 :デフォルトの名無しさん:02/10/28 16:54
CLASSでvirtual void f_0(){ f_2(); p_q(); }は…
だめだな当然(-_-)

318 :デフォルトの名無しさん:02/10/28 17:31
fps = 1000.0f / (timeGetTime() - prev_time);
だとちゃんと動くのに

fps = 1000 / (timeGetTime() - prev_time);
がゼロ除算エラーになるのは何故ですか・・・?

319 :デフォルトの名無しさん:02/10/28 20:28
class CA{
public:
int ma;
CA():ma(NULL){}
void thread(void){::_beginthread(func,0,(void*)this);}

static void func(void* p){
((CA*)p)->fff();
::_endthread();}

void fff(void){cout<<ma<<endl;}
};
void main(void)
{
CA ca;
ca.thread();
}
を実行すると24と表示される。ナゼ・・・???

320 :デフォルトの名無しさん:02/10/28 20:59

画面に0〜99の数字を1秒間隔で表示。1〜9で改行、するプログラムを教えてください
図にするとこんな感じです

1 2 3 4 5 6 7 8 9
10 11 12〜〜〜〜〜〜〜〜〜19
20〜〜〜〜〜〜省略〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜99

解らねえ・・・

321 :デフォルトの名無しさん:02/10/28 21:08
counter % 10 == 0 の時、'\n' 挿入したら。
コンソールだったらの話だけど。

322 :デフォルトの名無しさん:02/10/28 21:08
for(i=1;i<=100;++i) {
if(i%10==0) putchar('\n');
printf("%d ", i);
sleep(1);
}

323 :デフォルトの名無しさん:02/10/28 21:09
>>320
マルチ野郎には何も教えてやらねえぞ。

324 :デフォルトの名無しさん:02/10/28 21:13
>>320
boost::timer t1
for(i = 0; i < 10; i++) {
 for(j = 1; j < 10; j++) {
  cout << i*10+j;
  while(t1.elapsed() >= 1.0f) Sleep(1);
 }
 cout << endl;
}

325 :デフォルトの名無しさん:02/10/28 21:17
>>324
for(i = 0; i < 10; i++) {
 for(j = 1; j < 10; j++) {
  cout << i*10+j;
  boost::timer t1;
  while(t1.elapsed() >= 1.0f) Sleep(1);
 }
 cout << endl;
}

326 :デフォルトの名無しさん:02/10/28 21:21
めちゃくちゃだな(藁

>>322
要求全然満たしてないぞ
>>320は1〜99と言っている
しかもsleepの分解能は秒か?

>>325
whileの不等号式が逆だろ

327 :デフォルトの名無しさん:02/10/28 21:45
>326
sleepの分解能は秒である、と書いてあるが。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sleep.3.html

328 :デフォルトの名無しさん:02/10/28 21:46
>>326
> しかもsleepの分解能は秒か?

unix系は秒単位じゃなかったっけ?


329 :デフォルトの名無しさん:02/10/28 21:50
>>320
を見ると、最初の行は全角で、後の行は半角だ。
なかなかの引っ掛け問題だな

330 :デフォルトの名無しさん:02/10/28 22:04
正解者ゼロか。しょせん2ちゃんねらーはこの程度だな。

331 :デフォルトの名無しさん:02/10/28 22:04
>>320
を見ると文章には0〜99と書いているが、
表示例には、
最初の行が1〜9で、その次の行からは10〜19、20〜29・・・
になっている。
これも引っ掛けか?

332 :デフォルトの名無しさん:02/10/28 22:13
ソースファイル中にちりばめられた
「FileHandle << "なんたらかんたら" << endl;」(FileHandleはofstreamです)
を、プリプロセッサマクロによって使う使わないの切り替えをする事は可能ですか?

例えば普通は
#if defined(OUTPUT_LOG)
 FileHandle << "なんたらかんたら" << endl;
#endif
みたいにすると思うんですが、その量が膨大なので
#define FileHandleで乗っ取って(?)処理しちゃうような
何か上手い方法はないかと思案中なんですが・・・

333 :デフォルトの名無しさん:02/10/28 22:20
FileHandleのクラスを切り替えるようにすればいいのでは。

334 :デフォルトの名無しさん:02/10/28 22:21
FileHandle を \dev\nul とか /dev/null とか…

335 :デフォルトの名無しさん:02/10/28 22:56
operator <<
の定義を直接、書き換えてしまう。


336 :デフォルトの名無しさん:02/10/28 23:22
ウムム・・・
FileHandle(厳密にはofstreamのラッパークラス)はユーザーにも公開していて
ユーザーが明示的に呼び出した場合は通常通りの操作をしたいのです

というのも、あるサブシステムを作っていて
そのエラーログを吐き出すのにFileHandleを使っているのですが
ユーザーから「標準のエラーログは邪魔くさいから有り無し変えられるようにして」と
仕様変更が入りまして・・・今更言うなよ・・・といったようなワケでして・・・
そのために1個グローバルなフラグを増やすのもアレですし

>>333氏の発想でもうちょっと考えてみます

337 :デフォルトの名無しさん:02/10/28 23:27
>>319
このままだとコンパイルすら通らないのでは。
fff() は CA::fff()
の間違いだとして…。分からん!


338 :デフォルトの名無しさん:02/10/28 23:32
>>337
ヨクヨメ
まぁ良く読んでもわからんがw

339 :デフォルトの名無しさん:02/10/28 23:35
すいません、どなたか>>318わかりませんか・・・?

340 :デフォルトの名無しさん:02/10/28 23:42
>>339
timeGetTime() - prev_time
がゼロになってるからじゃないの?

341 :デフォルトの名無しさん:02/10/28 23:52
>>339
本気でわからんか?

>>339
> fps = 1000.0f / (timeGetTime() - prev_time);
> だとちゃんと動くのに

本当にちゃんと動いてるとお思いか?

> fps = 1000 / (timeGetTime() - prev_time);
> がゼロ除算エラーになるのは何故ですか・・・?

timeGetTime() と prev_time はどっちも多分 DWORD 型なんだろう?
timeGetTime() == prev_time の時、どうなるか考えてみろ。
まんまゼロ除算だろうが。

ちなみに、1000.0f の時に落ちないのは、浮動小数点演算の場合にゼロ除算を行った場合、
整数助産の場合と違って一般保護例外にならず、#INF 値を返すからだ。
#INF 値は整数に代入すると、0 になる。
だから、見かけ上動いてるように見える。
fps の型を double にして、std::cout に投げてみろ。

342 :341:02/10/28 23:57
整数助産だって・・・カコワルイ

追記。
浮動小数点演算のゼロ除算が一般保護例外にならないのは、浮動小数点数は
#INF 値つまり無限大を表現できるからだ。
だから整数の場合と違ってわざわざ一般保護例外にする必要が無い。

343 :デフォルトの名無しさん:02/10/29 00:02
余計なツッコミだけんども
win32環境ではゼロ除算と一般保護例外は別だよ。
他もそうだと思うけど。

344 :デフォルトの名無しさん:02/10/29 00:04
>>341
1000.0fだとちゃんと動きます
デバッガでwatchしてみると

1000.0fの場合→正しいFPS値
1000の場合→unsigned int 0(0x0)

になります
もちろん初回計算時はprev_time = timeGetTime() - 10;
などとしてゼロ除算にならないように注意しています

更に、FPSを計った後Sleep(1)しているので
OSが仕様を踏襲している限り
(timeGetTime() - prev_time)がゼロになることはありえません

345 :デフォルトの名無しさん:02/10/29 00:05
ちなみに環境はWin98SE/BCC5.5.1です

346 :デフォルトの名無しさん:02/10/29 00:10
>>344
なら
DWORD tmp;
tmp = timeGetTime() - prev_time;
fps = 1000 / tmp;
とでもしとけ。

347 :デフォルトの名無しさん:02/10/29 00:13
>>344
それって・・・
それって・・・
エラーが発生してるんじゃなくて、単に整数演算の丸めで 0 になってるだけじゃ・・・
timeGetTime() - prev_time > 1000 の時どうなるか考えてみろ。

348 :デフォルトの名無しさん:02/10/29 00:13
Sleepの精度は結構悪かったような記憶があるが。

349 :ちなみにソースの一部:02/10/29 00:14
メインループで、while { 内部処理; Render(); }としていて、Render()の実装が

void cEngine::Render()
{
 const static DWORD fps_limit = 60;
 static DWORD prev_time = (timeGetTime() - 10);
 fps = 1000.0f / (timeGetTime() - prev_time);
 // 内部処理が間に合っていなければコマ落ちさせる
 if (fps < fps_limit) {
  prev_time = timeGetTime();
  return;
 }
 else {
  // Sleepの誤差が5msとして、余った時間を計算する
  DWORD over_time = (1000.0f / fps_limit) - (timeGetTime() - prev_time) - 5;
  if (over_time > 0) Sleep(over_time);
  while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time);
 }
 prev_time = timeGetTime();
 lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0);
 lpD3DDevice->BeginScene();
/*いろいろ*/
 lpD3DDevice->EndScene();
 lpD3DDevice->Present (NULL, NULL, NULL, NULL);
 Sleep(1);
}

です

350 :デフォルトの名無しさん:02/10/29 00:16
>>347
え・・・?

351 :デフォルトの名無しさん:02/10/29 00:18
>>344
>更に、FPSを計った後Sleep(1)しているので
>OSが仕様を踏襲している限り
>(timeGetTime() - prev_time)がゼロになることはありえません

ありえません?
これだから・・・

352 :デフォルトの名無しさん:02/10/29 00:19
つーか、根本的に間違ってないか?
FPS って普通 frames per second つまり 1 秒に何フレーム描画したかという
ベーンチマークのことで、実際に 1 秒きっかりを測って実際に何回レンダリング
できたかを測るものだろ。
決して、1 秒を 1 回のレンダリング時間で割った数値ではない。

353 :デフォルトの名無しさん:02/10/29 00:21
>>351
あーはい・・・内部処理に49日とちょっとかかるとゼロになりますけど

>>352
それはわかっていますが、内部処理でfpsを見たりしているので
現時点での疑似FPSが必要なんです
/*いろいろ*/の部分で1秒毎に描画済みフレーム数調べる処理はしています

354 :デフォルトの名無しさん:02/10/29 00:22
>>349
センスのかけらも感じないな。

timeGetTimeは一回だけ呼び出せ。
こんな関数でstatic使うな。
そんな判定で除算を使うな。

355 :デフォルトの名無しさん:02/10/29 00:23
>>353
で、347 の件はどーなったの?


356 :デフォルトの名無しさん:02/10/29 00:24
C++じゃなくなってきたけどまあいいか

357 :デフォルトの名無しさん:02/10/29 00:33
>>356
除算とかの話なら、C++ でも範疇だろう。
それとも、C++ でも C と重なる機能は C スレへ逝けって?

358 :デフォルトの名無しさん:02/10/29 00:41
>>354
>timeGetTimeは一回だけ呼び出せ。
定義することは誰でもできます
明確な理由を教えて下さい

>こんな関数でstatic使うな。
こんな関数でメンバ変数増やしたくありません

>そんな判定で除算を使うな。
どうやっても60FPSと指定したい場合は
どっかで1/60なり除算しないと無理だと思うんですが
プリプロセッサにやらせろって事ですか?
ユーザーが動的にFPSを指定したい場合は?

>>357
ゼロ除算になるのは何故?という質問が
FPSの計り方にズレてきている事を指しているんじゃないでしょうか

>>355
丸め誤差で変数fpsがゼロになったところで、
どこを見ても「任意/fps」の式はありませんが・・・?

359 :デフォルトの名無しさん:02/10/29 00:52
>358
問題はここ
if (fps < fps_limit) {
 prev_time = timeGetTime();
 return;
}
ここからreturnした場合、最後のSleep(1)が呼ばれないので
内部処理が1ms以内で終わった場合ゼロ除算になる

360 :デフォルトの名無しさん:02/10/29 00:58
>>358
漏れは 354 じゃないけど 「timeGetTime() は一回だけ呼び出せ」 には賛成。
他の場合ならいざしらず、FPS 値が重要になるような局面では。

「こんな関数で static 使うな」 の意味だけど、static にする必要も無い
(当然メンバ変数にする必要も無い) ものが static になってるという事じゃ
ないの?
static DWORD prev_time = (timeGetTime() - 10); の初期化は 1 回しか
行われないけどいいの?
(もしかしてこれが今回の騒ぎの原因じゃあ・・・)
ヒープに確保しなければならないようなでかい領域を使わない限り、auto 変数の
速度上のコストって全くのゼロなんだけどな。

あと、355 にある 「347 の件」 は 349 のソースには全く関係無いんだけど、
「どこを見ても「任意/fps」の式はありませんが・・・?」 ってどう言う意味?

361 :360:02/10/29 01:00
359 見て、

> 「こんな関数で static 使うな」 の意味だけど、static にする必要も無い
> (当然メンバ変数にする必要も無い) ものが static になってるという事じゃ
> ないの?

は取り消し・・・

362 :デフォルトの名無しさん:02/10/29 01:02
>>359
解決しました
ありがとう

>>360
最後のヤツですが、ゼロ除算エラーが起きる事が問題だったので
fpsがゼロになることは一向にかまわないのですが、という意味です

363 :354:02/10/29 01:20
>>362
解決すんなよ。そんな腐れコードさっさと捨てろ。

・timeGetTimeは一回だけ呼び出せ。
2回呼び出したときの値が同じだと期待できる根拠はどこにもない。
にもかかわらず、貴様のソースはすべての呼び出しで
同じ値が帰ってこないと意味を成さない。

・こんな関数でstatic使うな。
メンバ変数は要らなくなったらプログラムの都合でメモリ領域を開放できる。
static変数はプログラムの都合では開放できない。
static変数は初期化のタイミングも、プログラムの都合には合わせられない。
cEngineのインスタンスが一度破棄されて、再び生成されたときどうなる?

・そんな判定で除算を使うな。
↓のソース参照のこと。(prev_timeはメンバ変数)

void cEngine::Render()
{
const unsigned fps_limit = 60;
const unsigned time_limit = 1000 / 60;

const DWORD now_time = timeGetTime();
const DWORD time = now_time - prev_time;
 prev_time = now_time;
 if (1000 < time * fps_limit) {
  return;
 }
 else {
以下略

あとは、やろうとしてること自体も根本的に間違ってるっぽ。

364 :デフォルトの名無しさん:02/10/29 01:43
>はすべての呼び出しで 同じ値が帰ってこないと意味を成さない。
逆ですよ
over_timeの計算はほとんど無意味でしたけど
while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time);
これは固定値だと意味をなさないどころか危険なコードになります

>cEngineのインスタンスが一度破棄されて、再び生成されたときどうなる?
されません(させません)し、当然nocopyableです
cEngineはさらに上位のラッパークラスに生成を管理されています
そのラッパークラスを1プロセス内で2度生成した場合の動作は保証しませんが

除算は大幅にはぶけました
が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう

>やろうとしてること自体も根本的に間違ってるっぽ。
prev_time = now_time;
これこそ間違ってるっぽいんですが・・・
私のやろうとしている事は
余った時間の算出→その分だけSleep→実際にかかった時間を取得→もろもろの処理
という至極単純なモノです
疑似FPSの算出でちょっとややこしくなってますが

365 :354:02/10/29 02:35
やれやれだぜ、。

> while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time);
> これは固定値だと意味をなさないどころか危険なコードになります

もともと無意味で危険な糞コードなんだよ。
そんなループいらねぇだろ。

> されません(させません)し、当然nocopyableです
> cEngineはさらに上位のラッパークラスに生成を管理されています
> そのラッパークラスを1プロセス内で2度生成した場合の動作は保証しませんが

貼り付けられたあのソースを見ただけでそこまで察しろってか。

> 除算は大幅にはぶけました
> が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう

「除算しないと無理」とか言ってた奴のセリフかね。
つまらん負け惜しみしてねぇで、
除算をはぶく方法を頭に刻み込め。

> prev_time = now_time;
> これこそ間違ってるっぽいんですが・・・

んー?どこが?
まぁ貴様のやりたいことはいまいちつかめんから、そうかもしれんな。

> という至極単純なモノです
> 疑似FPSの算出でちょっとややこしくなってますが

負け惜しみはいらねぇから、
単純なことがややこしくなったらなんかおかしいと肝に銘じておけ。

366 :デフォルトの名無しさん:02/10/29 02:47
> 余った時間の算出→その分だけSleep→実際にかかった時間を取得

この処理がレンダリング処理のどんな場面で必要なのか想像がつかないよ・・・
364 は天才かも知れぬ

367 :ゲーム会社勤務:02/10/29 02:47
> 除算は大幅にはぶけました
> が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう
ゴメン、突っ込ませて。
除算なんか多様してたらまともに動くゲームなんて無い。
こちとら、必死こいて最適化してんだ、ふざけんな。


368 :デフォルトの名無しさん:02/10/29 03:15
> が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう

アフォじゃねーのこいつ

369 :デフォルトの名無しさん:02/10/29 05:28
ゲ作板でヤレ

370 :デフォルトの名無しさん:02/10/29 11:36
AAと煽りだらけのネタ掲示板で何をやれと?

371 :デフォルトの名無しさん:02/10/29 13:26
(メンバ関数ではない)関数テンプレートは、完全な特殊化も禁止ですか?


372 :デフォルトの名無しさん:02/10/29 13:28
>>371
template<typename T> void hoge(T& foo) {}
template<> void hoge<char>(char& foo) {}


373 :371:02/10/29 13:31
>>372
template< typename T > void hoge(T& foo, int bar = 0) {}
template<> void hoge<char>(char& foo, int bar = 0) {}
だと駄目でした


374 :371:02/10/29 13:46
デフォルト引数があると駄目なのですね。すみません。


375 :デフォルトの名無しさん:02/10/29 13:52
explicit substancialization!

376 :デフォルトの名無しさん:02/10/29 13:55
>>375
ナニソレ
ブキ?


377 :デフォルトの名無しさん:02/10/29 14:15
後半出鱈目

378 :デフォルトの名無しさん:02/10/29 14:38
C++コンパイラ一人で作った人います?

379 :デフォルトの名無しさん:02/10/29 14:40
4人で作った人ならEDGにいます



380 :デフォルトの名無しさん:02/10/29 15:10
>>373
template<> void hoge<char>(char& foo, int bar) {}
にするとコンパイルできてしかも汎用テンプレートで与えられた
デフォルト引数を引き継ぐんだね。知らんかった。g++ 3.2

381 :デフォルトの名無しさん:02/10/29 16:02
>>380
へー、それは猫耳。


382 :デフォルトの名無しさん:02/10/29 16:15
>>380
VC6でも逝けた。奇跡だ(わら


383 :デフォルトの名無しさん:02/10/29 17:52

すいません、T*& ってどういう動きをするのか教えてもらえますか?

例)
 *どこかに typedef Class* LPCLASS; と設定されているものとする。
 
void func func( LPCLASS& cls ) // <- cls はナニ?

384 :383:02/10/29 17:53
間違えました。
 void func func => void func

385 :デフォルトの名無しさん:02/10/29 18:05
reference of pointer

386 :デフォルトの名無しさん:02/10/29 18:12
some_t *&p = some_map[some_key];
/* pをいじる */

って私はよくやるけど。

387 :386:02/10/29 18:16
std::map<key_t, some_t*> some_map;
です

388 :デフォルトの名無しさん:02/10/29 18:17
typedef struct foo_ { A* a; } foo;
typedef struct bar_ { A*& a; } bar;
A* a = new A();
foo f = { a };
bar b = { a };
delete a;
a = NULL;
f.a // 未定義
b.a // NULL

389 :デフォルトの名無しさん:02/10/29 18:20
LPCLASS *p = new LPCLASS();
func(p); //pの中身が変更される可能性がある!
cout<<p->msg()<<endl; //pがぬるぽだったらいやんなエラー

とか

390 :デフォルトの名無しさん:02/10/29 18:24
pDC->TextOut(0,0,"( ゚∀゚ )ぬるぽぬるぽるぬぽ〜〜");
AfxMessageBox("さいたまさいたまさいたま〜〜( ゚ ∀゚ )");

391 :386:02/10/29 18:26
>>389
ちょっとおかしくね?

392 :デフォルトの名無しさん:02/10/29 18:32
どこらへん?

393 :386:02/10/29 18:39
>>392
LPCLASSはただのぽいんただから(*p)->msg()かな、と。別にいいけど。

394 :デフォルトの名無しさん:02/10/29 18:45
ああ。よく見てなかったスマソ

LPCLASS p = new Class();

395 :デフォルトの名無しさん:02/10/29 19:17
(´-`).。oO(なんでだろう…)

396 :デフォルトの名無しさん:02/10/29 19:18
>>390
スレ違い。


397 :デフォルトの名無しさん:02/10/30 00:07
>>343
一般保護例外はメモリ関係でプロテクションに引っかかった場合だよな。
NULL ポインタを参照したとか。

>>342
大抵の環境では、例外を発生するように設定できる。

x87 は両対応で、Win32 ではランタイムライブラリの方で「デフォルトでは
例外を発生せず計算続行」に設定されてる。(今は違うけど) 昔の FreeBSD
では例外が発生するモードに初期化されていて、すぐにシグナルが飛んで
きた。

>>367
わり算も敵だが (VCL のお陰でちょっと楽になったけど)、俺には DMA も
敵のような気がしてる今日この頃。非同期処理なんか嫌いだ…。

398 :デフォルトの名無しさん:02/10/30 04:11
ブルートフォースアタック?をやろうと思って、
辞書順の次の文字列を返す(またはすりかえる)
ジェネリック?アルゴリズムを作ろうと思ったのですが、
既にありそうなのでどこかにあるのを知っていたら教えていただけないでしょうか...
それを利用すれば実現可能なクラスとかでもいいです。

例えば

char buf[] = { 'a', 'z', 'z' };
func( buf );
cout << buf; // 出力> baa

みたいな感じです。
実際には[a-zA-Z] とか [あ-お](←これは無しとしても)みたいに範囲指定か
const char dic[] = {'a', 'g', 'e'};//この辞書順
みたいな辞書指定できるようになっていると思うので、
もう少し複雑な使い方になると思いますが...

399 :デフォルトの名無しさん:02/10/30 04:14
力技で何を解くの? UNIX のcrypt?


400 :383:02/10/30 14:41
>>385-389
ありがとうございます。
ポインタの安全性が若干ながら向上するわけですね。
勉強になりました。

401 :デフォルトの名無しさん:02/10/30 15:23
using namespace についての質問です。
ヘッダーファイルでusing namespace std ; などを宣言して最後にこれを
撤回したいのですがどうすればよいでしょうか?
例えば
#include <string>
using namespace std ;
class myclass {
 string str1 ;
} ;
みたいなのをヘッダーファイルに書いてcppファイルでこれをインクルードしたときに
using namespace std ;の宣言を無効にしておきたいのです。
コンパイラはVC++6です。お願いします。

402 :デフォルトの名無しさん:02/10/30 15:41
>>401
そのヘッダファイル内の定義を新たに namespace ns で包んで、その中で
using namespace std すれば見かけ上は OK。
でも、後で using namespace ns とした時点で std も丸見えになるので
あんまし有効でない。
結局、ヘッダ内では面倒臭がらずに std:: 付けよう、というのが一般的
みたい。
いい方法があったら漏れも知りたい。

403 :401:02/10/30 16:03
>>402
どうもです。あまり良い方法はないということですね。

404 :デフォルトの名無しさん:02/10/30 19:13
STLスレから移動してきました。
>>Comeauって$50で全部(コンパイラ、標準ライブラリ、リンカ、デバッガ)ついてくるんですか?
>>そうなら買ってみてもイイ!かも
>ついてこない。
>フロントエンドだけ。
デバッガはともかく、標準ライブラリとリンカも別売りなんでしょうか?
英文ちゃんと嫁って言われそうですが(汗

使用しているかたオシエテ

405 :デフォルトの名無しさん:02/10/30 23:22
シュリンクトゥーフィット?
キレイキレイしましょ?

406 :デフォルトの名無しさん:02/10/31 23:23
以下のようにすると、pが指している文字が"あいうえお"にならないのです。
どうしたらちゃんと指すようにできますか?

ostringstream os;
os << "あいうえお";
const char* p = os.str().c_str();

407 :デフォルトの名無しさん:02/10/31 23:29
string s = os.str();
const char* p = s.c_str();

or

ostrstream os;
os << "あいうえお";
const char* p = os.str();

408 :デフォルトの名無しさん:02/10/31 23:31
>>407
下のは危険な香りがするのですが...

409 :デフォルトの名無しさん:02/10/31 23:33
>>406
c_str()の寿命は一時的だから、ポインタに代入して参照したら、
何を指しているか保証されないよ。

410 :デフォルトの名無しさん:02/10/31 23:36
フロッピーディスクをコピープロテクトをかけて、特殊フォーマット
かけるソフトをVC++で作ろうと思っているのですが、FATやらなんらや
で良くわかりません。大まかで良いのでアドバイスをいただきたいです。

環境はWin2000のVC++6.0です。

よろしくお願いします

411 :デフォルトの名無しさん:02/10/31 23:38
デバイスドライバ作らないと無理じゃないかなあ

412 :デフォルトの名無しさん:02/10/31 23:39
デバイスドライバってどうやって作るのでしょうか?

413 :デフォルトの名無しさん:02/10/31 23:42
>>412
WIN32APIスレで聞いたほうがいいカモ。
でもあそこでもデバイスドライバの話は見たことないな・・・

414 :デフォルトの名無しさん:02/10/31 23:46
 今 時 フ ロ ッ ピ ー プ ロ テ ク ト か よ

415 :デフォルトの名無しさん:02/10/31 23:58
FDはCD-ROMとちがって規格上プロテクトがかけれるようになってるけど書き込むには
専用の機械が必要。

416 :デフォルトの名無しさん:02/11/01 00:02
>>412
VC++とDDKを使う。DDKはMicrosoftのサイトのどっかにある。

417 :デフォルトの名無しさん:02/11/01 00:12
>>415
プロテクトノッチを上げる専用の機械か?(藁

418 :デフォルトの名無しさん:02/11/01 00:29
互換機ってFDCは何使ってたっけなぁ〜?

419 :名無しさん:02/11/01 05:04
>>416
VS.NETじゃつくれないのかな>DDRV

420 :デフォルトの名無しさん:02/11/01 09:21
低レベルの質問ですいません。
namespaceについてですが、
自作ライブラリが、他のライブラリと重複しないようにnamespaceを使ってみたんですが

STLの名前空間でのcoutは、
std::cout でも、cout
どっちでも使用できるようになっているのですが
自分で宣言した名前空間(例:namespace onigri)の中にある
関数(例: void wassyoi(); )は、
onigiri::wassyoi();
しか受け付けないみたいです(wassyoi();だけでは無理)。
他のライブラリと重複してない場合、wassyoi();だけで、
呼び出すことはできないのでしょうか?

自分なりに考えた方法は、
namespace onigiri
{
void wassyoi();
}
using namespace onigiri;
という風に、
ヘッダ内に、usingを無理やり入れてます。
これだと、あまり よくないような気がして。


421 :デフォルトの名無しさん:02/11/01 09:25
>>420
それでいいんだよ。>using
g++の2.xを使ってるのか? std:: なしでエラーにならんのは
単にg++の不具合。

422 :420:02/11/01 09:25

何か、他に方法があったらご教授ください。

423 :デフォルトの名無しさん:02/11/01 09:30
はぁ?


424 :420:02/11/01 09:33
ごめんなさい。
#include <iostream>
だと std空間で
#include <iostream.h>
だと グローバル空間みたいでした。
俺がアフォでした。
ごめんちゃい。

425 :420:02/11/01 09:36
421の即レスにびっくり
422は、気にしないでください。
どうも。

426 :デフォルトの名無しさん:02/11/01 10:49
>>420
using onigiri::wassyoi;
って感じに、個別にやったほうがいいと思われ。

427 :デフォルトの名無しさん:02/11/01 12:56
namespaceってのは、衝突するかもしれないシンボルを回避
するという目的もあるんだから、その名前空間を定義するヘッダ内で
using namespaceするなんて意味ないじゃん。


428 :デフォルトの名無しさん:02/11/01 13:03
using namespace std; はC++の初期の学習段階から使わないように
する癖を付けよう。

429 :デフォルトの名無しさん:02/11/01 13:36
using namespace std; はデフォだろ。

430 :デフォルトの名無しさん:02/11/01 13:49
>>428
main() のあるファイルでも使っちゃ逝けないのか?

431 :デフォルトの名無しさん:02/11/01 13:53
>>429
デフォって何?

432 :デフォルトの名無しさん:02/11/01 14:14
Don't forget namespace!


433 :デフォルトの名無しさん:02/11/01 14:17
債務不履行宣言

434 :デフォルトの名無しさん:02/11/01 14:47
>431
怠け者がすること、って意味じゃないかな?

435 :デフォルトの名無しさん:02/11/01 16:37
mutable 使ってますか?

436 :デフォルトの名無しさん:02/11/01 19:15
こんばんわ。
C++のとても簡単な事を全然思いつかないので、
どなたか教えてください。

int x[n];
int y[n];
があったとすると
sum = (x[0]-y[0])+(x[1]-y[1])+(x[2]-y[2])+…(x[n]-y[n])  ←ここです。

for(int i=0; i<n; i++){
sum ○ x[i]-y[i]
}

○の部分が。。。

437 :デフォルトの名無しさん:02/11/01 19:16
>>436
> C++のとても簡単な事

そう思うなら自分で回答してみては。

438 :デフォルトの名無しさん:02/11/01 19:20
>>437
簡単だと思うのですけど、
自分で回答できなくて助けを求めています。

439 :デフォルトの名無しさん:02/11/01 19:57
どうがんばってもネタにしか見えないが,
○ = +=

440 :デフォルトの名無しさん:02/11/01 19:57
あと,
for(int i=0; i<n; i++){
は,
for(int i=0; i<=n; i++){
な。

441 :デフォルトの名無しさん:02/11/01 20:01
>>436
std::accumulate(x,x+n,0)-std::accumulate(y,y+n,0)

442 :デフォルトの名無しさん:02/11/01 20:06
>>441
頓珍漢

443 :デフォルトの名無しさん:02/11/01 20:08
stringのlistをソートしたいんですが、コンパイラに怒られます。

string s1 = "A";
string s2 = "B";
if(s1 < s2)

としただけでだめです。stringのoperator <はちゃんと定義されていると
思うのですが、なぜだめなのでしょうか?

444 :デフォルトの名無しさん:02/11/01 20:19
>>443
普通にできるが。

445 :デフォルトの名無しさん:02/11/01 20:25
エラーメッセージを書かないのはネタだと何回も何回も・・・

446 :デフォルトの名無しさん:02/11/01 21:28
CLine* CDay10Doc::AddLine(CPoint ptFrom, CPoint ptTo)
{
CLine *pLine = new CLine(ptFrom, ptTo);
try
{
m_oalines.Add(pLine);
SetModifiledFlag();
}
//メモリが許容範囲を超えたときの例外処理
catch (CMemoryException* perr)
{
AfxMessageBox("Out of memory",MB_ICONSTOP | MB_OK);
if(pLine)
{
delete pLine;
pLine = NULL;
}
perr->Delete();
}
return pLine;
}
何が間違っているのか分からないので教えてください
error C2143ですがセミコロンはちゃんとあります

447 :デフォルトの名無しさん:02/11/01 21:32
>>446
「セミコロンはちゃんとあります」 って言われてもわからん。
そのエラーメッセージは何行目を指してたのよ?
エラーメッセージはプログラムのどこがどうおかしいかを教えてくれるもので、
あなたを困らせるものじゃないんだから、ちゃんと理解しなさい。

448 :デフォルトの名無しさん:02/11/01 21:35
ええと
try
{
コレの{の部分でエラーが出るのです

449 :448:02/11/01 21:36
sageミス すいません

450 :デフォルトの名無しさん:02/11/01 22:08
>>448
はっきり言ってわからん。
この文脈で考えられる事と言ったら try が変なものに #define されてるくらい
だが、そんな事無いだろうし。

つーか、エラーメッセージはエラーを示す唯一のメッセージなのに、何で全部
書いてくれないの?
エラーメッセージを、そんなにどうでもいい情報だと思ってる?

451 :デフォルトの名無しさん:02/11/01 22:18
ぼくに理解できないので あなたにも理解できるとは思えません

452 :デフォルトの名無しさん:02/11/01 22:19
ヽ(´ー`)ノ

453 :デフォルトの名無しさん:02/11/01 23:44
typedef std::vector<std::string> T; のような型Tを
つくるとして、Tの名前どんなふうに命名しますか?

454 :デフォルトの名無しさん:02/11/01 23:45
StringArrayとか

455 :デフォルトの名無しさん:02/11/01 23:47
StringArray

456 :デフォルトの名無しさん:02/11/01 23:47
Stringsもいいな

457 :デフォルトの名無しさん:02/11/01 23:57
ビット演算子って覚えた方がいいんですか?なんかよく理解できないんで…

458 :デフォルトの名無しさん:02/11/02 00:01
ビット演算をする羽目になったときに覚えればよい

459 :453:02/11/02 00:03
>>454-456
〜Buf とか 〜s も考えたんですが、前者は感覚的に違う気がしたのと
後者はぱっと見て判断しにくいかなと。。Array がいいです。
ありがとうございます。

460 :名無しさん:02/11/02 00:03
>>457
組込用MPUくらいでしか使わないんじゃないのか。ビット演算(操作)

461 :デフォルトの名無しさん:02/11/02 00:19
>>460
圧縮とか、固定小数点演算とかいろいろありますがな。

462 :デフォルトの名無しさん:02/11/02 00:20
ビットストリームの読み書きには必須ですな

463 :デフォルトの名無しさん:02/11/02 00:24
使うかどうかは別としても、ビット演算程度がよく理解できない人間が
まともにプログラム組めるようになるとは思えないね。



464 :デフォルトの名無しさん:02/11/02 00:26
intのサイズを理解してないと厳しいんじゃなかろうか。

465 :デフォルトの名無しさん:02/11/02 10:49
>>453
vstr_type

466 :デフォルトの名無しさん:02/11/02 12:17
ビット演算の真理表を見つめてたら 1010 & 1100 = 1000 ってことはわかりました。けど、

 1010  0000  0010  1000 = a028

ってなるのが全然わかりません。これは覚えなくてもよいですか?

467 :デフォルトの名無しさん:02/11/02 12:30
そりゃ2進数と16進数の変換では?

468 :デフォルトの名無しさん:02/11/02 12:34
>>467
サンクス

469 :デフォルトの名無しさん:02/11/02 12:47
vector<int> v;
int i = v.size();
みたいなことをVC++でやると 「size()の戻り値はint型じゃない」みたいな
ワーニングが出るがこういう場合、どう対処するのが普通なの?

1. intじゃなくてvector::size_typeを使う
2. size()の戻り値をintにキャスト
3. ワーニングを無視

470 :デフォルトの名無しさん:02/11/02 12:52
>>469
1. が王道。
2. はどうしても符号付の数値が必要な場合のみ。
3. は絶対にするべきではない。
別解 4. 大抵は size_t で通じる。

471 :デフォルトの名無しさん:02/11/02 12:53
size_typeがunsignedだったりするといやだから2.かなあ
3.は重要なwarningを見落としたりすると困るからちょっとイヤかも

472 :デフォルトの名無しさん:02/11/02 12:59
>>471
signed な数値を返す size() ってあるの?

473 :デフォルトの名無しさん:02/11/02 13:12
数値型はすべてintで扱うべき、1ビットの節約のために
わざわざunsignedを使うのはばかげている

という意見と

正の値しかとらない変数はunsignedを使うべき、間違って負の値が
入ることを防ぐことができる

という意見

あなたならDOUCH !?

474 :デフォルトの名無しさん:02/11/02 13:17
全部intでもいいけど、前者に書いてある理由付けはDQNだろう

475 :デフォルトの名無しさん:02/11/02 13:19
>>470
「vectorのサイズ分ループをまわす」とかの場合、
1や4だとループのカウンタ用の変数もsize_tを使うことになるんですか?
ループのカウンタ用の変数がintだと結局終了条件でintとsize_tを比較
することになってしまいますよね。

476 :デフォルトの名無しさん:02/11/02 13:23
>>475
> 「vectorのサイズ分ループをまわす」とかの場合、
vector<T>::iterator を使うことになります。

indexで回すなら当然size_tだな。

477 :デフォルトの名無しさん:02/11/02 13:25
負の値になることがありうる変数を
後からsize_tにしてハマったことならあるよ...

478 :デフォルトの名無しさん:02/11/02 13:25
intを使う奴はDQN

479 :デフォルトの名無しさん:02/11/02 13:29
>>474
どういう理由付けなら全部intでもいいの?

480 :デフォルトの名無しさん:02/11/02 13:37
>>470
size_tを使うとわざわざvectorやlistでsize_typeをtypedef
している意味がないような。
かといってわざわざvector::size_typeと書くのは面倒だし、
コンテナを変更した時修正しないといけないし。
かといってそのためにテンプレート化するのもなんだし。



481 :デフォルトの名無しさん:02/11/02 13:39
個数をあらわすインターフェースがsize_tと決まっているのだから
すべてsize_tで統一すべき

intは不要。使う奴はDQN。

482 :デフォルトの名無しさん:02/11/02 15:10
>数値型はすべてintで扱うべき、1ビットの節約のために
>わざわざunsignedを使うのはばかげている

ってどういう意味?教えてちょ。


483 :デフォルトの名無しさん:02/11/02 15:12
俺、最近符号なしの整数使うときsize_t使ってるんだけどヤバイかな?

484 :470:02/11/02 15:19
>>475
コンテナでループする時は、476 の通り iterator を使うべき。
index の場合は、インデックス値が 0 から始まるとは言い切れないので一概には
言えないが、index は本来ランダムアクセスに使うべき。
その場合は多分コンテナの範囲を超えた値を指定しても大丈夫だから size() は
関係無い。

>>480
サイズを表す数値の型は size_t と決まっている。
だから 「大抵は size_t で通じる」。
size() が size_t 以外を返すのはよっぽどの事情がある場合で、その場合は
素直に Class::size_type を使うべき。
そういう時にコーディングが面倒だと言うのは DQN。
で、あんたは size_t も Class::size_type も否定してるけど、じゃあ
どうしたいの?

>>483
size_t はサイズを表す数値の型と決まっている。
size_t は unsigned int で無い場合がある (もっと大きかったりする事もある)
が、それで問題が出ないなら構わない。
ただし単にタイプ数を減らしたいな uint を typedef で用意すべきで、それを
サボるのは DQN。

485 :デフォルトの名無しさん:02/11/02 16:04
size_tで全く問題がないなら Class::size_typeの存在意義はない ですよね。
size_tでは問題になる可能性があるのなら size_tを使ったらいけない
ってことになるんじゃ??


486 :デフォルトの名無しさん:02/11/02 16:07
size_tもsize_typeも符号無し整数型と決まっているから
その処理系で最大の符号なし整数型で受ければ何の問題もない

487 :デフォルトの名無しさん:02/11/02 16:14
>>485
どうしてそう両極端に考えるんだ?

>>484
> サイズを表す数値の型は size_t と決まっている。
> だから 「大抵は size_t で通じる」。
> size() が size_t 以外を返すのはよっぽどの事情がある場合で、その場合は
> 素直に Class::size_type を使うべき。

結局、その class がどういうものかわからないと何とも言えないと言う事だ。
ただし、普通の Class::size_type が size_t であることはまず無いから、
size_t とみなして良いという事。
(ダメなときはそもそもコンパイラが怒る)

そしてそもそも、

>>469
> 1. intじゃなくてvector::size_typeを使う
> 2. size()の戻り値をintにキャスト
> 3. ワーニングを無視
>>470
> 1. が王道。

どう結論出していいか迷うなら、まず Class::size_type を使え。

488 :487:02/11/02 16:15
訂正。

×: 通の Class::size_type が size_t であることはまず無いから
○: 通の Class::size_type が size_t 以外であることはまず無いから

489 :デフォルトの名無しさん:02/11/02 16:40
X3J16/96-0225 WG21/N1043 より

20.1.5 Allocator requirements

expression:
  X::size_type
return type:
  unsigned integral type
assertion/note pre/postcondition:
  a type that can represent the size of the largest object in the allocation

The typedef members pointer, const_pointer, size_type, and difference_type are
required to be T*, T const*, size_t, and ptrdiff_t, respectively.

他の標準クラスは Allocator::size_type をそのまま引き継いでいるようです。
だから標準で済ませる限り size_t と見なしていいみたいですね。

うがった見方をすれば、独自の Allocator で、size_type を整数表現する class に
すり替える事も可能と言えば可能。

490 :ふトンカ ◆wX94FutoNg :02/11/02 19:22
Perlで変な掲示板などを作っております。
しかしとてつもなく重いです。

CかC++あたりを勉強してWindowsのGUIプログラムでも作りたい物もあるし、
さらに変なものを作りたいのですが、とりあえず必要なものはなんでしょう?

エデッタ、コンパイラ(BCC32とかでいいのでしょうか?)、入門書みたいな本、自分
以外に必要な物はありますか?
なんとか C++ とか、高い物もいきなり必要なのでしょうか?


天才とかはありません…。

C/C++の違いは、、なんか++が付いていてお得そうなので、こちらに質問します、、
(これでいいのかな自分( ゚_゚ )?)

491 :デフォルトの名無しさん:02/11/02 19:25
>>490
perlやってるんなら正規表現が欲しいだろうから、boostのregexとか
触ってみれば。

492 :デフォルトの名無しさん:02/11/02 19:33
>>490
何か困った事が発生してから質問してください。
そうでないなら、まずは始めてください。
一番必要なのは、コードを書く事です。

ちなみに、C/C++ から GUI を扱うにはいろいろ覚える事があり、一朝一夕には
できません。
とにかく GUI をやりたいと言うなら、C/C++ は一旦置いといて HSP (無料)
あたりにでも手を出してください。

493 :ふトンカ ◆wX94FutoNg :02/11/02 19:34
Perlはある程度できますがC++などは全く素人ですので
正規表現使う必要が出てくるまでにかな時間がかかりそうです。。
Perlですら最初の一応役に立つプログラムまで2ヶ月かかってますし
役に立たないプログラムならもっとすぐに書いていましたが…

494 :デフォルトの名無しさん:02/11/02 19:37
>>493
掲示板だけならコンソールアプリケーションで十分だから、GUIはとりあえず
必要ないと思います。

C++のstd::stringを使えばバッファオーバーランの問題も避けられるはずです。

495 :ふトンカ ◆wX94FutoNg :02/11/02 19:39
>>492
どちらかというと、GUIは後から、重い言語以外にもう1つ覚えたいといったところでしょうか
とにかく解説書なりページなり見て、
プログラム書いて書いて書きまくれということですね。
ではそうしたいと思います。

Perlの時はソースを改造→分からないから解説書→0から書けるように
なっているので、こういうやり方は初めてですが。

やってみたいと思います。
回答ありがとうございました。

496 :デフォルトの名無しさん:02/11/02 20:32
dynamic_cast の計算量について、なにか予測できることってありますか?
クラスの数に比例する?とか、
多重継承すると???とか。

497 :デフォルトの名無しさん:02/11/02 21:10
>>496
処理系依存?
単継承と重継承でパフォーマンステストしてみたら?

498 :デフォルトの名無しさん:02/11/02 21:20
class Single {
public:
static Single* getInstance() { /* 省略 */}
void func() { /* なにかの処理 */ }
private
Single() {}
static Single* _instance; }
Single* Single::_instance = 0;

とかいうしんぐるとんクラスがあって、このインスタンスを使う場合は、


class UseSingle {
public:
UseSingle() { sin = Single::getinstance(); }
void use() { sin->func(); }
private:
static Single* sin;
}

のような感じでいいの?



499 :デフォルトの名無しさん:02/11/02 21:40
使う側は単に
Single::getInstance()->func()
でいいのでは?。

わざわざ呼ぶためのクラスを作る必要はないし、どこからでもアクセス
できるのがSingletonのメリット。

500 :496:02/11/02 21:42
g++-3.1.1 でテストしてみました。

class B { public: virtual ~B(){}; };
class D1 : public B {};
class D2 : public D1 {};
class D3 : public D2 {};
で、dynamic_cast<D1*>をそれぞれの実インスタンスへのポインタでテスト。
B < D1 < D2 < D3 となって、継承の回数に比例してる感じでした。

継承ツリーを順にたどる処理が想定できますが、そのまんまの実装ぽいですねぇ。

501 :デフォルトの名無しさん:02/11/02 21:47
おお。
しかしまんまの結果やね。
多重継承のときは先頭から辿るんだろうか・・・

502 :デフォルトの名無しさん:02/11/03 00:18
こういう感じのクラス間で相互に定義が入れ子になるコードを書いているのですが
コンパイル時に先に読み込まれたほうであとから読み込まれるクラスが定義されて
なくてうまくコンパイルできません。何らかの形でクラス識別子を定義してやれば
いいんだとは思っているんですがVCのヘルプとか見渡してもどうしたらいいのか
よくわからないので質問させてもらいます。

【CMona.h】
#ifndef CMona_H
#define CMona_H
#include "CGiko.h"

class CMona{

public:
  CGiko* Giko;
}

#endif
---------
【CGiko.h】
#ifndef CGiko_H
#define CGiko_H
#include "CMona.h"

class CGiko{

public:
  void Copipe(CMona* Mona);
}

#endif

503 :デフォルトの名無しさん:02/11/03 00:23
それぞれに
class CMona;
class CGiko;
をつけくわえてみよう。

504 :デフォルトの名無しさん:02/11/03 00:37
Thanx! うまくいったよ(*^o^*)

505 :デフォルトの名無しさん:02/11/03 06:03
Berkeley DB みたいな感じのファイルDBで、商用でもフリーでかつオープンソースに
しなくてもいいラインセンスのライブラリってありませんか?

506 :デフォルトの名無しさん:02/11/03 06:24
>>505
Berkeley DB


507 :デフォルトの名無しさん:02/11/03 08:00
>>506
Berkeley DB はソース公開しない場合は有料だったと思ったが。

508 :デフォルトの名無しさん:02/11/03 08:55
んじゃcdb。
っていうかスレ違いだし。


509 :デフォルトの名無しさん:02/11/03 08:55
http://cr.yp.to/cdb.html>>508


510 :デフォルトの名無しさん:02/11/03 14:57
具象クラス10個を多重継承していいですか?
それとも、クラス設計から考え直すべきですか?

511 :デフォルトの名無しさん:02/11/03 14:58
>>510
コンポジションならそういう例もあるんじゃない?

512 :デフォルトの名無しさん:02/11/03 18:46
>510
is-a法則は成り立つ?
委譲じゃ解決できない?

>>511
理解できないので詳しい説明お願いします

513 :デフォルトの名無しさん:02/11/03 19:04
>>510
そんな風にたずねられたら、普通はヤメトケって言われるよ・・・

514 :デフォルトの名無しさん:02/11/03 20:22
template<class T,class S>struct STA{
typedef T(STA::*FUNC)(S);
FUNC func;
std::string name;
STA(){
name=typeid(T).name();
if("void"==name){cout<<"debug"<<endl;func=fff;}
(this->*func)();
}
void fff(void){cout<<"fff"<<endl;}
};
/**************************************************************/
void main(void)
{
STA<void,void> sta;
}
エラーじゃないんですが、何故かメモリリークします。どうやらstringが
原因らしいんですが・・・

515 :デフォルトの名無しさん:02/11/03 20:24
きもっ

516 :デフォルトの名無しさん:02/11/03 20:46
2次元配列を動的に作成するときに現在は
 float** array;
 array new float*[x];
 for (int i = 0; i < num; ++i){
  array[i] = new float[y];
 }
のようにしているんですが、一気に領域を確保することはできませんか?

517 :デフォルトの名無しさん:02/11/03 21:16
標準例外に関する質問です。
「引数の範囲が不正」な場合には
invalid_argument を投げるべきでしょうか?それとも
out_of_range を投げるべきでしょうか?
range_error という可能性も?

あと、ここらへんについて簡素かつ正確に書いてある書籍等はないでしょうか?

518 :デフォルトの名無しさん:02/11/03 21:18
glibcって何ですか?

519 :デフォルトの名無しさん:02/11/03 21:26
>>517
引数の範囲が数直線上の区間で表すようなものならば、out_of_rangeが
適切でしょう。そうでなくて、たとえばenumにないものを指定されたとか
NULLはダメなのにNULL突っ込んだとかはinvalid_argumentでしょう。

> あと、ここらへんについて簡素かつ正確に書いてある書籍等はないでしょうか?

それぞれの例外の説明を読むしかないのでは・・・

520 :デフォルトの名無しさん:02/11/03 21:26
>>516
float* array;
array = new float[x * y];

利用時は
array[x + (y * rangeX)];



521 :517:02/11/03 21:30
>>519
レスありがとうございます。
out_of_range が(runtime_errorではなく) logic_error を継承しているのが
ちょっと解せなかったのですが、
そこらへんはあんまり気にしないほうが良いのでしょうか?

区間を表す場合に、「最小値」が「最大値」より大きい なんて場合には
どうすればいいのでしょうか?

522 :デフォルトの名無しさん:02/11/03 21:34
雑談レスだけど、例外の適切な使い分けがなかなかわからねーなー。

523 :デフォルトの名無しさん:02/11/03 21:37
適当にXXXExceptionクラスを作ってそれ投げてりゃ良いのよ。

524 :デフォルトの名無しさん:02/11/03 21:40
>>520
やはりそれしかないんですか。
それでは、それを使おうと思います。



525 :517:02/11/03 22:11
>>522
ですよねー。Java や C# などの後発の言語に比べて中途半端というか、
所詮後付け感は否めないですよねー。

>>523
やってると混乱してきちゃうので…。
中途半端に標準ライブラリに含めないで欲しかったですね。
そうすれば思い切って独自仕様で固められたのに。

>>524
(実は >>520 は私だったのですが)
あと、インデックスに使う値を管理するクラスを作ると楽かも?
でもそれをするとテンプレートとか使って「配列クラス」を作りたくなってしまうという罠!みたいな。

526 :デフォルトの名無しさん:02/11/04 12:01
例外はクラスライブラリによって使い方が違ってくるから複数のクラスライブラリ使ってると
設計がかなり難しくなってくる。

Javaはライブラリもそろってるしメモリ食わなきゃそこそこいいんだが。

527 :デフォルトの名無しさん:02/11/04 17:15
Hoge* HogeCreater::creat() {
 return new Hoge();
}

Hogeクラスのインスタンスを返す↑って使い方あってる?
メソッドを抜けるとオブジェクトが勝手に破棄されるとか?

528 :デフォルトの名無しさん:02/11/04 17:36
>>527
されない。どこかでちゃんと解放してやれよ。

529 :デフォルトの名無しさん:02/11/04 19:13
>>527
あってる
恐れている間違いはこういう感じだろう。

return &Hoge(); // 関数を抜けたら不正になるオブジェクトへのポインタを返している!!

>>528
質問の意図を読み間違えていると思われ。

530 :デフォルトの名無しさん:02/11/04 19:24
>>529
多分お前がな。

531 :デフォルトの名無しさん:02/11/04 19:25
Hoge& HogeCreater::creat() {
 return Hoge();
}

何も考えずこうした方が良いと思うが

532 :デフォルトの名無しさん:02/11/04 19:27
>>531
だめぽ


533 :デフォルトの名無しさん:02/11/04 19:47
勉強をかねて、Visual C++ でMFCではなくAPI主体のアプリを作ってます。
可変長の文字列というのはどのように扱うのが一般的なのでしょうか?

1.GlobalAllocなどのAPIを使う
2.C++標準ライブラリのcstringを使う
3.(便利そうだから?)MFCのCStringを使う
4.その他

今のところは数十から多くて数百文字なのであらかじめ多めに見積もって
おいてもだいじょうぶだとは思ってますが、なんとなく気分的にいやなんです。

534 :デフォルトの名無しさん:02/11/04 19:48
>>514
bcc5.51, vc++6.0, gcc2.95.3-5どれもエラー

535 : ◆hMJAPH9PWA :02/11/04 19:48
>>531
自動変数のリファレンス反しちゃダメじゃん。
Effective C++の23項参照。

536 :デフォルトの名無しさん:02/11/04 19:49
>>533
>2.C++標準ライブラリのcstringを使う
stringでは?
(2)がベターだと思われ。勉強がてら(1)してみるのもおもしろいかも。


537 :デフォルトの名無しさん:02/11/04 19:50
(´-`).。oO(C++標準にcstringなんてあったっけ?)

538 :デフォルトの名無しさん:02/11/04 19:53
>>537
煽りはスピードが命。

539 :デフォルトの名無しさん:02/11/04 19:53
(´-`).。oO(string.hのC++版…可変長じゃねぇな)


540 :533:02/11/04 20:00
レスありがとうございます
>>536
ありがとうございます 使ってみますです
>>537
stringでしたね 寝ぼけたこと言ってごめんなさいです
>>539
そうなんですか!? 少しパニくってきたけど
そのへんはがんばれば自己解決でけそうです

541 :デフォルトの名無しさん:02/11/04 20:03
可変長文字列はstrdup()で確保してfree()で解放するのが常識だろ
strdup()の返り値はチェックしなくてすむしな

542 :デフォルトの名無しさん:02/11/04 20:15
  ∧__∧
 (ミTдTミ) しくしくしくしくしくしくしくしくしくしくしくしく 

543 :デフォルトの名無しさん:02/11/04 22:13
C言語で書かれたWindowsのスケルトンプログラムをC++で書き直しているところなのですが、
コールバック関数をクラスの中に入れると、どうしてもエラーが出てしまいます。

DirectXのサンプルプログラムを見てみると

基底のクラスで
class CD3DApplication
{
protected:
                :
  
static INT_PTR CALLBACK SelectDeviceProc( HWND hDlg, UINT msg,
WPARAM wParam, LPARAM lParam );

となっていました。そこで「SelectDeviceProc」をmsdnの検索キーワードにかけたのですが該当する
関数は見つかりませんでした。

誰か教えてください。

544 :デフォルトの名無しさん:02/11/04 22:19
ちなみにエラーの内容は、

error C2440; '='; 'LRESULT(_thiscall test_app::*)(HWND, UINT, WPARAM, LPARAM)'から'WADPROC'に変換できません。

wc.hIconSm=NULL;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.lpfnWndProc=WndProc;<-----ここ

if( !RegisterClassEx(&wc) )

545 :デフォルトの名無しさん:02/11/04 22:19
>>543
C++のメソッドは

A::hoge() -> hoge(A *this)

な感じになっています。

546 :デフォルトの名無しさん:02/11/04 22:21
画像が貼れるチャットがあるよ
http://www.i-chubu.ne.jp/~tomomi-h/marion/navi/navi.cgi?links=20311

547 :デフォルトの名無しさん:02/11/04 22:22
>>545 thanks

535はだだ今勉強中

548 :デフォルトの名無しさん:02/11/04 22:25
ちゃんとstaticつけたか?

549 :デフォルトの名無しさん:02/11/05 00:25
int *p(0);
がこけるんだけど、C++の仕様?それともVC6の制限?
ポインタはexplicitな宣言できないのかな?
でも、
int (*pf)(void)(0);
は通るんだなあ・・・

550 :デフォルトの名無しさん:02/11/05 00:27
こけるって?

551 :デフォルトの名無しさん:02/11/05 00:28
>>549
>int *p(0);
コンパイル通りませんけど。

552 :デフォルトの名無しさん:02/11/05 00:28
typedef int* INTP;
INTP p(0)
は?

553 :デフォルトの名無しさん:02/11/05 00:38
CとC++のどちらからでも勉強できるのですか?

554 :デフォルトの名無しさん:02/11/05 00:39
>>549
それ、コンパイラには int *(p(0)); と解釈されてると思うんだがどうよ?
演算子の優先順位的に。

555 :デフォルトの名無しさん:02/11/05 00:40
>>553
ええ、そうですよ。

556 :デフォルトの名無しさん:02/11/05 00:42
>>555
まったくの初心者なんですが、プログラミング言語を勉強する前に何か本などを読んで方がいいのでしょうか?

557 :デフォルトの名無しさん:02/11/05 00:45
まったくの初心者なら、スクリプト言語辺りを軽く触っておいてから
挑むのが良いかもれ知れませんね。

558 :549:02/11/05 00:53
レスさんくす。
規格読んでたんだけど、それらしき記述は見つけられず。残念。
>>552
確かに、typedefしたら通りました。
>>554
なるほど。エラーメッセージが一緒だな。どうもそれみたい。
まあ、素直にふつうに宣言するのが無難だな。

559 :デフォルトの名無しさん:02/11/05 01:01
typedefしても通らんぞ(gcc3.2)。
VC++がおかしいんじゃないの?

560 :549:02/11/05 01:05
>>559
VC6では確かに通ったよ。
それはそうと、宣言じゃなく初期化だな。恥ずかしい・・・

561 :デフォルトの名無しさん:02/11/05 01:07
>>560
ああ了解。拡張子を.cにしていました。スマソ。
そうか、int (*p)(0); は、int *p = 0; と同じなのね。

562 :デフォルトの名無しさん:02/11/05 10:00
>>543
プロシージャにしたいメンバ関数を
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
としてwc.lpfnWndProc = WindowProc;で何も問題無い

ちなみにstaticな関数なので、プロシージャの中からメンバにアクセスしたい場合は
プロシージャの最初のほうでWM_CREATEのlParamからlpCreateParamを拾って保持しておく必要がある

static 自作ウィンドウクラス* Instance = NULL;
if (Instance == NULL) {
 if(msg == WM_CREATE) {
  Instance = static_cast<自作ウィンドウクラス*>(reinterpret_cast<LPCREATESTRUCT>(lParam)->lpCreateParams);
 }
 return DefWindowProc(hWnd, msg, wParam, lParam);
}

アクセスする場合はInsctance->メンバ

563 :デフォルトの名無しさん:02/11/05 20:27
仮想関数デストラクタについて質問。

C++ FAQ等を見ていると
class CA{
public:
CA();
virtual ~CA();
};
のように、
デストラクタが、仮想関数になってるのですが、
virtual にしても、しなくても変化が無いように見えますが
仮想関数にする意味があるんでしょうか?



564 :デフォルトの名無しさん:02/11/05 20:30
>>563
C++ FAQ見れ

565 :デフォルトの名無しさん:02/11/05 20:35
継承しないなら、関係ない。

566 :563:02/11/05 20:40
>>564
それについて、
コンストラクタとちがって
virtualキーワードをつけて宣言できる。
としか書いてないのです。

つけても、つけなくても、
継承元デストラクタ→継承先デストラクタ
が呼ばれるのです。
オーバーライドしようと、継承先で~CA()と書いてもエラー出るし。
よくわからないので、おしえてください。


567 :デフォルトの名無しさん:02/11/05 20:52
>>566
例えばclass CAから派生したclass CBがあったとして、そのポインタを
親のCAで表現しているとき

CA* cap = new CB;
delete cap;

とした時、~CA()も~CB()も仮想デストラクタにしておかないと、~CB()が
呼び出される保証はない。

568 :566:02/11/05 21:02
>>567
うおお。
わかりました。
わかりすぎて、少し感動しました。
ありがとうございますー。

569 :デフォルトの名無しさん:02/11/05 21:03
これが意図した動作かどうか確かめてみそ。

class CA {
public:
~CA() { std::cout << "~CA()\n"; }
};

class CB : public CA {
~CB() { std::cout << "~CB()\n"; }
};

int main()
{
CA* cap = new CB;
delete cap;
}

570 :デフォルトの名無しさん:02/11/05 21:38
class CA {
public:
vittual ~CA() { std::cout << "~CA()\n"; }
};

class CB : public CA {
~CB() { std::cout << "~CB()\n"; }
};

int main()
{
CA* cap = new CB;
delete cap;
return 0;
}

は OK? NG?

571 :デフォルトの名無しさん:02/11/05 21:49
>>570
OKですよ。基底クラスのデストラクタが仮想デストラクタになると、
それ以降継承されたクラスのデストラクタはデフォルトで(というか
強制的に)仮想デストラクタになるから。

572 :デフォルトの名無しさん:02/11/05 21:52
お、vittualはvirtualですよね。念のため。

573 :デフォルトの名無しさん:02/11/05 21:58
Effective-C++のP78〜84には、基底クラスのデストラクタを仮想デスト
ラクタにするべき時とそうでない時についての考察が書かれている。

大まかに言えば、継承するつもりのないクラスのデストラクタは仮想に
すべきでなく、継承するつもりならば仮想デストラクタにしておけば安心
であるというような内容。

574 :570:02/11/05 21:59
#define vittual virtual
逝ってくる・・・

571 アリガ`

575 :デフォルトの名無しさん:02/11/05 21:59
クラスに少なくとも1個の仮想関数が含まれていれば、仮想デストラクタ
を宣言すること、となっている。

576 :デフォルトの名無しさん:02/11/05 22:05
なんでコンパイルできないの?

class CA {
public:
virtual ~CA() = 0;
};

class CB : public CA {
public:
~CB() { std::cout << "~CB()\n"; }
};

class CC : public CB {
public:
~CC() { std::cout << "~CC()\n"; }
};

int main()
{
CA* cap = new CC;
delete cap;
}

577 :デフォルトの名無しさん:02/11/05 22:10
>>576
純粋仮想関数であってもデストラクタの場合は実体が必要。
だから

CA::~CA() {}

などの定義を行えばよい。

578 :デフォルトの名無しさん:02/11/05 22:12
>>577
即レスありがとうございますぅ。でもどうしてデストラクタの場合だけ
実体がないとエラーになるのでしょうか?C++3rdのどの当たりにその
ような事が書いてあるかわかりますか?

579 :デフォルトの名無しさん:02/11/05 22:13
腐ってんね。

580 :デフォルトの名無しさん:02/11/05 22:20
>>578
Effective-C++のP83にそのような事が書いてある。

デストラクタは純粋仮想関数の中でも特別な扱いで、基底クラスのデストラクタ
の呼び出しをコンパイルしてしまうため、リンク時にエラーになるとある。

他の純粋仮想関数ではこうはならない。

581 :デフォルトの名無しさん:02/11/05 22:25
>>580
どうもありがとうございます。もう少しデストラクタについて勉強
してみます。

582 :デフォルトの名無しさん:02/11/05 22:27
class hoge {
public:
 virtual void huga() = 0;
};
void hoge::huga()
{
 cout << "huga" << endl;
}

583 :デフォルトの名無しさん:02/11/05 22:31
>>582
その場合huga()はどうやって呼び出すの?

584 :デフォルトの名無しさん:02/11/05 22:36
class hage: public hoge {
public:
 void huga() {}
 void age() { hoge::huga(); }
};
int main()
{
 hage sage;
 sage.age();
 return 0;
}

585 :デフォルトの名無しさん:02/11/05 22:39
>>584
なるほど・・・・こうなると、純粋仮想関数も糞もあったもんじゃないですね。
直接呼び出せなくなっているだけで間接的には呼び出せるのか。

586 :デフォルトの名無しさん:02/11/06 00:06
>>561
g++3.0でこんな実験をやってみた。
typedef int *intp;
const int *x(0);
としておくと、
int *y(0), int (*y)(0), int *(y(0)), int (*y(0)), intp y(0)
は全部同じエラー(const外し)になって、
intp y = intp(x);
は通った。intp(x)はCスタイルの(intp)xと同じになるみたい。
参考までに。

587 :デフォルトの名無しさん:02/11/06 00:14
int main()
{
 int i(); //default constructor?
 i = 0; //oh error!
 return 0;
}

588 :デフォルトの名無しさん:02/11/06 00:18
>>586
> const int *x(0);
え?

589 :588:02/11/06 00:32
> const int *x(0);

これ何でコンパイル通るの?
* 演算子より () 演算子の方が優先順位高いはずだけど・・・。

590 :543:02/11/06 00:36
>>562さん 

詳しい説明ありがとうございました。

そのおかげで何とかできました。

今は、自作関数をC++に書き直してているのですがまた分からない事があったらよろしくお願いします。

591 :デフォルトの名無しさん:02/11/06 00:38
const int * x = 0;

592 :588:02/11/06 00:46
>>591
いや、const int (*x)(0); ならそうなるのもわかるんだけど。
const int *x(0); なのにそうなるのなら理由がわからない。

593 :587:02/11/06 00:47
>>589
xは0で初期化され、その型はconst int *である、と読めると思うが?
それよりint (*x)(0);が通るのが不思議。*xが0で初期化される、と
読まれて、エラーになりそうなものだが、int *x = 0;と同じように
解釈されている。まあint *x = 0;だって、普通の優先順位で考えたら
*xが0になりそうなものだが。・・・今試してみたら、
int (*x) = 0;
が通ったよ。

594 :デフォルトの名無しさん:02/11/06 00:49
>>589
変数宣言の所の * とか [] とか () とかは演算子ではないと思うが。
コンストラクタ呼び出しの()はともかく。

595 :588:02/11/06 01:01
>>593
int (*func)(int arg); って例があるもんだから。
・・・あれ? 余計混乱してきたような・・・。
>>594
うーん、「そういうものだ」 と思い込むしかないのか・・・。

596 :age:02/11/06 03:31
vc6.0のデバッグで関数に飛ぶと 
シンボル this
値    error変数にスタックフレームが必要です
という のが表示されてしまっています。

これはどのような時に表示されるのでしょうか?
特に実行がおかしいわけではないのですが気になってしょうが
ありません。

597 :デフォルトの名無しさん:02/11/06 03:47
>>596
標準スタックフレームの生成を外しているとか。

598 :デフォルトの名無しさん:02/11/06 03:55
大抵の関数には、突入時に、自動変数領域の確保や
引数の取り出し用に、ebp,espを操作します。
スタック操作が完了していない場合、
「変数にはスタックフレームが必要」が出てくると思われます。

class A{ public:int Val;
void setA(int v)
{Val = v; }
void setB(int v)
{
Val = v;
}};
int main()
{A a;
a.setA(2);
a.setB(55);
}
ウオッチウインドウにthisを追加して、上のコードをステップ実行すれば、
大体わかるとおもいます。混合モードをステップ実行するのも良いでしょう。

599 :デフォルトの名無しさん:02/11/06 14:39
Visual Fortranで作成したプログラムをVC++上で走らせるにはどうしたらいいですか?
一応C++に移植したのですが変な動作するので、あきらめてフォートランの方のを
使おうと考えているのですが。

600 :デフォルトの名無しさん:02/11/06 14:47
>>599
答えられる奴は神


601 :デフォルトの名無しさん:02/11/06 14:48
>>599
DLLにするのが賢い気がする。

602 :デフォルトの名無しさん:02/11/06 14:53
>>599
そりゃ、忠実に移植するしかないだろ。

603 :デフォルトの名無しさん:02/11/06 15:22
こんにちは。質問させてください。

C言語で
struct main_data{
double z
}data;
(struct main_data*)malloc(sizeof(struct main_data)*810000)
というふうに構造体を作りメモリを確保し、

for(int i=0; i<900; i++){
for(int j=0; j<900; j++){
(data+j+i*900)->z = nodata;
}}

としたものがあります。

それをC++で
struct main_data{
double z[810000];
}data;
とし、newでメモリを確保したなら、
↑のfor文を書くならどうすればよいでしょうか?

どなたかよろしくお願いします。


604 :デフォルトの名無しさん:02/11/06 15:24
>>603
C++でもmalloc使える。

605 :デフォルトの名無しさん:02/11/06 15:35
てゆーかさ、メモリブロックをまとめて「配列として」確保したんだから、Cでも
for(int i=0; i<900; i++){
for(int j=0; j<900; j++){
data[j+i*900].z = nodata;
}}
とするのが普通だと思うんだが。

606 :デフォルトの名無しさん:02/11/06 15:38
fill(&z[0], &z[810000], nodata);

607 :603:02/11/06 15:38
>>604、605
レスありがとうございます。

すいません、書き漏れ。
C++で、
struct main_data *data0;
data0 = &data
としています。
自分は
data0->z[j+i*900] = nodata;
だと思うのですが、いかかでしょうか?

608 :デフォルトの名無しさん:02/11/06 15:41
aha?

609 :デフォルトの名無しさん:02/11/06 15:42
クラステンプレート内で仮想関数を宣言することに意味は見出せますか?


610 :デフォルトの名無しさん:02/11/06 15:42
あは♪

611 :デフォルトの名無しさん:02/11/06 15:42
>>609
割と。

612 :デフォルトの名無しさん:02/11/06 15:46
>>611
具体例キボンヌ


613 :デフォルトの名無しさん:02/11/06 15:57
> struct main_data{
> double z[810000];
> }data;

普通に

struct main_data{
double z[900][900];
}data;
じゃいかんのか?

614 :デフォルトの名無しさん:02/11/06 15:58
       /■ヽ
      (´Д`)
  (( ─━OO━─ ))
        ∪∪

615 :603:02/11/06 16:01
>613
多分いいと思いますが、いまさら書き直す気力がありません。。。

616 :デフォルトの名無しさん:02/11/06 20:12
>>612
ATL の CWindowImplBaseT とか。

617 :デフォルトの名無しさん:02/11/06 20:58
>>602
C から FORTRAN 側の関数を呼べるんじゃないかなぁ。VC++ は知らんが、
その昔 UNIX でやった覚えがある。

618 :デフォルトの名無しさん:02/11/06 22:09
class explicit_class
{
public:
virtual explicit_class(){};//error
virtual ~explicit_class(){};
virtual explicit_class(const explicit_class&){};//error
virtual explicit_class& operator=(const explicit_class&) = 0;
virtual explicit_class* operator&() = 0;
virtual const explicit_class* operator&() const = 0;
};

コンパイルできないんだけど、やっぱり無理なんでしょうか?

619 :デフォルトの名無しさん:02/11/06 22:13
コンストラクタにvirtual宣言?

620 :デフォルトの名無しさん:02/11/06 23:05
>>619
サンクス
コンストラクタにはvirtual宣言できないのね。
コンストラクタの記述の強制はできないのか...。
//修正
class explicit_class
{
public:
explicit_class(){};
explicit_class(const explicit_class&){};
...後は同じ
};

class A :public explicit_class
{
public:
A(){}
A(const A& i){*this = i;}
~A(){}
A& operator=(const explicit_class& i){return *this;}//両方必要
A& operator=(const A& i){return *this;}//両方必要
A* operator&(){return this;}
const A* operator&() const{return this;}
};

int main()
{
A a,b;
a=b;
}

621 :デフォルトの名無しさん:02/11/07 02:02
>>599
Fortranしらないんで、適当だけど
#define IF if(
#define THEN ){
#define ENDIF }
とかする。

622 :デフォルトの名無しさん:02/11/07 02:07
>>621
そういう事は絶対にやめれ。

623 :デフォルトの名無しさん:02/11/07 07:54
timeGetTime() ってどのくらいはかれるんでしょうか?一時間とかいけます?

624 :デフォルトの名無しさん:02/11/07 08:31
>>623
WIN32API行き

625 :デフォルトの名無しさん:02/11/07 11:37
vector について(?)です

class CTEST
{
  LPSTR  m_var ;
public:
  CTEST::CTEST() { m_var = new CHAR[10]; } ;
  CTEST::~CTEST() { delete [] m_var; } ;
  void operator = ( LPSTR lps ) { strcpy(m_var, lps); } ;
};

// 処理
...
 vector<CTEST>  vecTest ;
 CTEST      cTmp ;

 for ( long i=0; i < 10; i++ )
 {
   cTmp = "(・∀・)" ;
   vecTest.push_back( cTmp ) ;
 }

とすると、3回目の push_back で例外がボーン・・・
(→ HEAP[FORDEBUG.exe]: Invalid Address specified to RtlValidateHeap( 00370000, 00370FE0 )

ただし、メンバを LONG にしたり CHAR m_var[10] とかの場合は問題なしです。
動的に確保したものはダメなんでしょーか?


626 :デフォルトの名無しさん:02/11/07 11:45
>>625
void operator = ( const CTEST& ) { ... } ;

こっちの代入演算子を定義してないからじゃないかな?


627 :デフォルトの名無しさん:02/11/07 11:50
なぜ代入演算子の戻り値が void なんだ?
コピーコンストラクタもないし突っ込みどころ満載だな。
例外の原因は new CHAR[11] かな。

628 :625:02/11/07 13:54
>>626 >>627
ありがd。
解決しますた。

1. コピーコンストラクタが無いからデフォルトコピーコンストラクタが呼ばれる
2. メンバをそのままコピー
3. デストラクタであぼーん
ということですか。。。

下を追加したら動きました。

  CTEST::CTEST( const CTEST& cc)
  {
    m_var = new char[10];
    strcpy(m_var, cc.m_var) ;
  } ;
  CTEST &operator = ( const CTEST& cc)
  {
    if (this != &cc)
    {
      m_var = new char[10];
      strcpy(m_var, cc.m_var);
    }
    return *this;
  } ;


629 :デフォルトの名無しさん:02/11/07 14:33
"(・∀・)" は char[10] に収まるの?

630 :デフォルトの名無しさん:02/11/07 14:57
>>629
Shift-JIS で 8 バイトですが何か?

631 :625:02/11/07 15:05
>>629
ぎりぎり入るけど
strcpy なのでアウトでしたね。
ていうか 初期化もしてなかったし・・・
回線切って首つってきます。

632 :デフォルトの名無しさん:02/11/07 18:11
STL使っているなら素直にstring使えば。

633 :デフォルトの名無しさん:02/11/08 07:47
class T { class N{}; };

↑で定義される T::N を、
class T; みたいに名前の宣言だけってできますか?
class T::N; だとエラーになります。

634 :デフォルトの名無しさん:02/11/08 08:43
>>633
>できますか?
試しなさいよ。

構造体と事情は一緒ではなかったかい?

635 :633:02/11/08 08:57
> 試しなさいよ。
> 構造体と事情は一緒ではなかったかい?

事情が同じなら class T::N; で試した段階で
宣言できて欲しいところですが。
エラーになるデスヨ。

636 :デフォルトの名無しさん:02/11/08 11:28
>>635
T クラスが事前に定義されていないと T::N のように限定することはできなかったと思う。



637 :その1:02/11/08 12:08
class Class_Test079{
public:
class Class_Test080;
class Class_Test081;
class Class_Test080{
public:
Class_Test081* m_pointer;
Class_Test081* Func(){cout<<"\nClass_Test080::Func"<<endl;return m_pointer;}
}hoge;

class Class_Test081{
public:
Class_Test080* m_pointer;
Class_Test080* Func(){cout<<"\nClass_Test081::Func"<<endl;return m_pointer;}
}hage;
};

638 :その2:02/11/08 12:09
int
main(){//確認用
class Class_Test079 a;
a.hoge.m_pointer = &a.hage;
a.hage.m_pointer = &a.hoge;
a.hoge.m_pointer->Func()->Func()->Func()->Func()->Func()->Func()->Func()->Func()->Func()->Func()
return 0;
}

639 :その2':02/11/08 12:11
おっとmainのFunc()にセミコロンが抜けた。

こういうことがやりたかったのか?

640 :デフォルトの名無しさん:02/11/08 14:57
私の悩み、聞いてくれます?
C覚えて、その後Java覚えて、再びCのプログラム書こうと
してるけどJavaの悪い癖(参照)がついてしまって、なかなか
ポインタが使えません・・・
リスト構造関連の優秀なWebページを教えていただけませんか?
あ、「猫でも分かる・・・」は勘弁してください。デムパ嫌いですから。

641 :デフォルトの名無しさん:02/11/08 15:48
>>629
6バイトでいけるんちゃうか?


642 :デフォルトの名無しさん:02/11/08 17:08
>>640
> 私の悩み、聞いてくれます?
> デムパ嫌いですから。

そうですか。それは大変ですね。

643 :デフォルトの名無しさん:02/11/08 21:56
>>640
ここはC++相談室ですが?

644 :633:02/11/08 23:44
>>639
うーん、class T が定義されてるヘッダをインクルードせずに、
T::N の名前を使いたい・・・。
こうして書いてみると、できなくてあたりまえのような気がしてきたり。

645 :デフォルトの名無しさん:02/11/09 00:25
メンバに含めるって事はサイズがわからなきゃダメだから
宣言だけでは無理だよ

646 :639:02/11/09 01:38
というかnamespaceの問題だと思う。
T::ときたらTの名前空間はコンパイラが知っていなければ
ならない。

647 :名無しさん@Emacs:02/11/09 04:39
継承とポインタをからめたんだけど:

class Base {
 int a;
};

class Derived : public Base {
 int b;
};

void
aho(Derived *p)
{
 Base *p1 = p;
 Base b;
 *p1 = b;
}

で、 *p に Base の instanceが入っちゃうじゃん!!
っていうのは問題じゃないの?
型安全性が... とか考えちゃうんだけど。



648 :デフォルトの名無しさん:02/11/09 05:25
>>647
class Base
{
public:
  Base() { a = 1; }
  virtual void print() { cout << "Base: " << a << endl; }
protected:
  int a;
};

class Derived: public Base
{
public:
  Derived() { a = 3; b = 5; }
  void print() { cout << "Derived: " << a << ", " << b << endl; }
private:
  int b;
};

void aho(Derived *p)
{
  Base *p1 = p; cout << "p1->print(): "; p1->print();
  Base b; cout << "b.print(): "; b.print();
  *p1 = b; cout << "p1->print(): "; p1->print();
}

Base 分のメンバだけはコピーされる。
Derived 分のメンバはそのまま。
それが問題というなら問題だけど、そうでないならどうでもいいと思う。

649 :デフォルトの名無しさん:02/11/09 05:58
Baseの代入演算子をprivateあるいはprotectedにしとけば
一応回避はできるね。

その手の本を読むと、「コピーコンストラクタと代入演算子は
定義するか、あるいはprivateにせよ」と書いてある。

650 :デフォルトの名無しさん:02/11/09 06:36
typedef使えばいいんじゃん。
#include<iostream>

struct a{
struct b{
b(){ std::cout << "test"; }
};
};
typedef a::b b;

void f(){
class c{};//関数内のクラスはfinalです
}

int main()
{
a A;
b B;
//c C;//これはコンパイルできない
}

651 :デフォルトの名無しさん:02/11/09 06:49
>633
T::Nを必要とする部分をテンプレートにしてまえば、
前方宣言要らへんのとちゃう?

652 :デフォルトの名無しさん:02/11/09 09:27
>>647
もちろん問題だが、もしそれを解決しようと思ったら常に

 そのポインタが指してるデータの型は、本当は何?

っつーのをチェックする必要がある。これはコストが大きいから、C++ では
敢えて危険な方をデフォルトにしてる。

C++ だと継承を使っているオブジェクトに関しては、値のコピーはふつー
認めないように operator=() を private にしておく。ポインタのコピー、ある
いは参照を常に使い、操作はメンバ関数 (往々にして virtual) で。

653 :デフォルトの名無しさん:02/11/09 10:30
> そのポインタが指してるデータの型は、本当は何?

これを言語レベルでやるなら、VB の Variant 型を実装する事になるな。
void* ポインタに対して任意のメソッドが使えたりして。

654 :名無しさん@Emacs:02/11/09 12:31
>>648 それは確認したんで、主張としては弱いかと思ったんだけど。
>>649,652 やぱーり知られた問題で解決法があったんだねえ。
たしかに copyを制限して、フツーの OOPLみたいにするのがいいんだろうね。

あと、 int (*)(const T&) と int (*)(T&) の間のキャストとか
vector<const T> と vector<T> の関係とか気になったのだけど、
ここらもおしてしるべしかしらん。

void* を int* に変換できなかったり、多重継承したクラスのポインタを
親クラスのポインタにすると値が変わっちゃうぐらい気を使ってるんだから
そこらへんもなんとかなってほしかった C & Haskell使いでした。


655 :デフォルトの名無しさん:02/11/09 13:10
>>654
関数ポインタは、いずれもキャスト可能。しかも C 時代の遺物だから
実行時型情報は使えないので危ないことこの上ない。C++ 的には、
関数オブジェクトを使うのがお奨めかと。

> そこらへんもなんとかなってほしかった
まぁ、過去との互換性の問題とか何とか、いろいろしがらみ多い言語
だから。

コピー禁止に関しては boost を入れて boost::noncopyable を継承する
のが楽。#inculde と合わせても 2 行で済むし。

656 :デフォルトの名無しさん:02/11/09 20:27
メンバー変数を配列にすることはできないんでしょうか?


657 :デフォルトの名無しさん:02/11/09 21:27
class Hoge
{
 int hogehoge[100000];
};
ならできるけど、そういう話じゃなくて?

658 :デフォルトの名無しさん:02/11/09 21:47
>>657
すいません、説明不足でした。

hairetu[10000]={ m_member1 , m_member2 , ................. }

みたいなことをやりたいんです。
メンバ変数を連番にしているのでfor文とかで使いたいと
思ったのですが。。

659 :デフォルトの名無しさん:02/11/09 21:53
>>658
657 にすればいい話じゃなくて?
どうしても名前付き変数名とインデックスを使い分けたいなら、union にでもすれば。

660 :659:02/11/09 21:54
「名前付き変数名」 って何かおかしいけどナー。

661 :デフォルトの名無しさん:02/11/10 00:11
>>658

(・∀・)?

662 :デフォルトの名無しさん:02/11/10 00:20
>メンバ変数を連番にしているのでfor文とかで使いたい
配列の立場は・・・?

663 :デフォルトの名無しさん:02/11/10 00:22
>>658
なにしたいんだかよくわからん

struct hoge {
int arr[100] ;
} ;
ならば
hoge h={1,2,3,4} ;
または
hoge i={{1,2,3,4}} ;

それとも
struct hoge {
int a1 ;
int a2 ;
int a3 ;
} ;

int hoge::*p[3]={&hoge::a1,&hoge::a2,&hoge::a3} ;

とか

664 :デフォルトの名無しさん:02/11/10 00:23
>>658
enumで定数を定義して定数と要素数に対応した
処理で決着というオチが見えるのだが。

665 :デフォルトの名無しさん:02/11/10 00:34
class Hoge {
 int m_member1;
 int m_member2;
 ...
 int m_member10000;
}

という 「定義済みの」 class があって、そのメンバを 「外部から」 配列で
使いたいという話か? なら、

   設 計 か ら や り 直 し て く れ 。

どうしてもと言うなら
int *hairetu[10000] = { &m_member1, &m_member2, ... &m_member10000 };
for(int i = 0; i < 10000; i++)
 DoSomething(*hairetu[i]);

でも繰り返すが、

   設 計 か ら や り 直 し て く れ 。

そもそも連番のメンバ名なんか使うな。
くれぐれも、設計からやり直してくれ。

COBOLer のにほいがぷんぷんと・・・

666 :デフォルトの名無しさん:02/11/10 00:57
>>657-665
大人なんだから望みをかなえてやれヨ!

#include "boost/preprocessor/repetition/repeat.hpp"
#include "boost/preprocessor/punctuation/comma_if.hpp"
#define MEMBER_MAX 10000
#define MACRO(z,n,d) BOOST_PP_COMMA_IF(n) d##n
class A {
public:
int BOOST_PP_REPEAT(MEMBER_MAX, MACRO, m_member);
};
int main() {
A a;
int hairetu[MEMBER_MAX] = {BOOST_PP_REPEAT(MEMBER_MAX, MACRO, a.m_member)};
return 0;
}


667 :デフォルトの名無しさん:02/11/10 01:20
>>666
658 の望みは叶えられない方が周りが幸せなんだが。
つーか、class 定義いじれるなら union でいいだろ。

668 :デフォルトの名無しさん:02/11/10 02:57
JDK1.4を入れてたんだけど
さっきインターネットしてたら、1.2がインストールされて、デフォルトが1.2になっちまったよ。。
どうすれば1.4に戻るの?コントロールパネルのJava-Plug Inをどうにかするの?

669 :デフォルトの名無しさん:02/11/10 02:58
>>668
ここはC++スレッド

670 :デフォルトの名無しさん:02/11/10 06:55
ID「C++」でますた…

671 :デフォルトの名無しさん:02/11/10 07:49
>>670
どこ

672 :デフォルトの名無しさん:02/11/10 09:43
クラスを作成してその中で配列を使うとき、

class A{

public;
char a[70][2];
................
}
として
コンストラクタで初期化するときに

a[70][2]={"aa","bb",......}

というように一度に初期化はできないんでしょうか?

673 :デフォルトの名無しさん:02/11/10 10:14
>>672
言ってる意味分からん。
どうでもいいが、文字2つを文字列として扱うなら、 a[70][3] じゃねーの?

674 :デフォルトの名無しさん:02/11/10 10:54
>>672
普通,
const char default_a_table[70][3?] = {
 "aa",
 "bb",
};
コンストラクタ
memcpy(a, default_a_table, sizeof(a));

675 :デフォルトの名無しさん:02/11/10 12:31
コンストラクタでクラス内で使用したい変数を new した際に、
new できずに返り値として NULL が返った場合どういった処理をすればよいのでしょうか?
クラスの使用者に安全に使ってもらうためにはどうしたらよいのでしょうか。
例外を投げたりして教えるのでしょうか?

676 :デフォルトの名無しさん:02/11/10 13:12
newは新規作成できない場合std::bad_allocを投げますが…
NULLで判断するのは一昔前の話では

677 :デフォルトの名無しさん:02/11/10 15:14
VCを使っているのですが、出力結果を標準出力から
テキストファイルに変更するにはどうしたらいいでしょうか

678 :デフォルトの名無しさん:02/11/10 15:59
freopen(stdout, "ファイル.txt", "wt");

679 :677:02/11/10 16:19
"wt"というのは何ですか。
すいませんが教えてください。

680 :デフォルトの名無しさん:02/11/10 16:26
>>679
VC使ってるならコードをコピってF1押せ。
特定の関数のフラグなんか、2chで聞くよりヘルプ見たほうが早いだろ

681 :デフォルトの名無しさん:02/11/10 19:33
(・∀゚) <っ…コメントネェヨ

682 :デフォルトの名無しさん:02/11/10 21:13
2つ構造体同士のコピーについて質問です。
typedef struct { // 1
char * tekitou; // 2
}DATA; // 3
DATA * original; // コピー元 4
DATA * copy; // コピー 5

original = new DATA; // 6
/* 本来データはあらかじめ存在する値
ここでは適当に作っただけ */

char input[]="sage"; // 元の構造体を適当につくる 7
original->tekitou=(char *)malloc((strlen(input)+1)); // 8
strcpy(original->tekitou,"sage"); // 9

// original を copy にコピーする
copy = new DATA; // 10
copy->tekitou=(char *)malloc( ?????? ); // 11

11行目でも領域確保はどのようにしたらよいのでしょう?
strlen(original->tekitou) でも sizeof(original->tekitou) でもだめですよね。sage という文字数を判別するにはどーしたらよいのでしょうか?

683 :デフォルトの名無しさん:02/11/10 21:15
↑省略されて見るの面倒ですが、マジで困ってるのでどなたかおねがいします

684 :デフォルトの名無しさん:02/11/10 21:22
C++と全然関係ないない。sage

685 :デフォルトの名無しさん:02/11/10 23:04
>>676
ありがとうございました。
new(nothrow) すると例外投げずにできるんですね。

686 :デフォルトの名無しさん:02/11/11 16:54
失礼します。相談したいです。

構造体のメモリ確保に関しての質問です。
プログラム開始後、
自分の指定した数だけ構造体を作りたい時はどうすればよいですか?


例えば
cout<<"データ数は?\n";
cin >> num;
などとした後

struct data{
double a[10000];
double b[10000];
double c[10000];
}data,*datap;
datap = &data;
このような構造体をnumの数だけ確保したいとき、
どうしたらよいでしょうか?

datap = new data ???????;
↑??????らへんの書き方がよくわかりません。

どなたかよろしければアドバイスお願いします。

687 :デフォルトの名無しさん:02/11/11 17:27
クラス名とインスタンス名が同じ名前になってるぞ。

struct Data{...
}data,*datap;
datap = new Data [num];
delete [] datap;


688 :デフォルトの名無しさん:02/11/11 17:51
>>687
書き間違えていましたね。
アドバイスありがとうございましたー

689 :686:02/11/11 18:57
686の者です。
すいません、書き方間違えていました。
numの分だけ構造体メンバーの配列を増やしたいでした。
つまり
struct Data{
double a[10000*num];
double b[10000*num];
double c[10000*num];
}data,*datap
という感じで。
ただ、この形じゃあコンパイルがとおらないので、
どなたかよい方法教えていただけませんか?

690 :デフォルトの名無しさん:02/11/11 19:00
素直にvector使っと毛

691 :デフォルトの名無しさん:02/11/11 20:00
>>689

struct Data{
Data(int num){
a=new double[10000*num];
b=new double[10000*num];
c=new double[10000*num];
}
double* a;
double* b;
double* c;
...

692 :686:02/11/11 20:04
>>690
さきほどvectorについて調べました。
まだ初心者なのでなかなか難しそうです。
その方法しかなければ勉強するしかないのでがんばります。

693 :686:02/11/11 20:06
>>691
おー!ありがとうございます。
早速試してみます。

694 :デフォルトの名無しさん:02/11/11 23:04
文字列と整数をキーにしたオブジェクトを溜め込むのにmapを使って、

struct key {
string name;
int num;
};

typedef map<key, ClassName> ClassTable;

このような宣言ってありですか?
とくにstruct keyのここでの使いっぷりってどうなんでしょ?


695 :デフォルトの名無しさん:02/11/11 23:08
keyには適切な比較演算子、代入演算子、コピーコンストラクタが
定義されていればなんでもいいんじゃなかろうか。

696 :デフォルトの名無しさん:02/11/12 00:46
>>694
> とくにstruct keyのここでの使いっぷりってどうなんでしょ?

1. Assignable, すなわち Key 型の変数 t, u に対して t = u を実行すると、
 t と u が等しくなり、その式の戻り値は Key& 型である。

2. map テンプレートクラスの第三引数 Compare (デフォルトでは std::less<key_type>) に
 よって、厳密な弱い順序づけ (strict weak ordering) がなされる。すなわち
 Key 型の変数 t, u は

  t と u が等しい <=> !Compare(t, u) && !Compare(u, t) が真

 である。

これが条件。

ダメな例を挙げると const int みたいに代入不可能であるとか、auto_ptr
のように代入後の値が異なってしまうもの。それから Compare を

 t <= u

みたいな定義にするのもダメ。これだと

 !Compare(t, t) && !Compare(t, t) = !(t <= t) && !(t <= t) =
 !ture && !true = false && false = false

となってしまい、2 の条件に反するから。

697 :686:02/11/12 13:39
>>691
ちょっとうまくできません。
これはメモリを確保するために、
構造体のポインタをこう定義しているのですか?

構造体メンバの動的配列のやり方って無理なんですかね。。。

698 :デフォルトの名無しさん:02/11/12 13:46
その num の値はどうやって供給するつもりなんよ?
num が const なら >>689 のままでいけるし、変数なんだったら
>>691 のようにするしかあるめぇ。


699 :デフォルトの名無しさん:02/11/12 13:48
686

 何 が や り た い ん で す か ?

700 :686:02/11/12 13:54
>>698
numはcin>>numで供給するつもりでした。
>>699
もうちょっと勉強します。

701 :686:02/11/12 13:57
本日はここまでです。
お疲れさまでした!


702 :デフォルトの名無しさん:02/11/12 14:06
:-)


703 :デフォルトの名無しさん:02/11/12 16:06
template <std::size_t Size>
struct data{
double a[Size];
double b[Size];
double c[Size];
};

data<num> data_instance;

…ってnumは変数か。std::vector<>使えばいいんでないの?

704 :デフォルトの名無しさん:02/11/12 17:42
クラスを継承するときの関数のオーバーロードについて質問させて下さい。

下のようなクラスAとその継承クラスBを作りました。
Bのインスタンスを作成したとき、
BのコンストラクタではB::func(theta)を用いて処理を行って欲しいのですが
なぜかA::func(theta)が呼び出されてしまうようです。
どのように書けば意図した動作をしてくれるのでしょうか…?


class A{
protected:
virtual void func(double theta)=0;
public:
A(double theta){func(theta)を使った処理}
};

class B:public A{
protected:
virtual void func(double theta){オーバーライドさせたい処理}
public:
B(double theta):A(theta){;}
};

705 : ◆hMJAPH9PWA :02/11/12 17:48
コンストラクタ内では仮想関数は呼べないはずだよ。
A*を返す擬似コンストラクタを使えばいい。

// こんな感じで。
A* A::create(){
A* self = new A;
func(...);
return self;
}

706 :デフォルトの名無しさん:02/11/12 18:05
mapの値に抽象クラスを入れるのは無理?

707 : ◆hMJAPH9PWA :02/11/12 18:15
普通に無理でしょ…値が作れたら抽象クラスじゃなくなっちゃうよ。
抽象クラスのポインタなら行けるだろうけど。


708 :デフォルトの名無しさん:02/11/12 20:03
vector<int> *vect;
ってなんなの?

709 :デフォルトの名無しさん:02/11/12 20:09
>>708
vectはstd::vector<int>を指すポインタ。

710 :デフォルトの名無しさん:02/11/12 20:09
>>880
qsort()ならsearch.hをインクルードしてるから大丈夫だよ。

711 :デフォルトの名無しさん:02/11/12 20:11
>>710は誤爆です。ス マ ソ

712 :デフォルトの名無しさん:02/11/12 20:22
>>708
vector<int>objectを将来指すであろうpointerのdeclaration。

713 :デフォルトの名無しさん:02/11/12 21:34
>>708の宣言のあと、

vect = new vector<int>;
vect->push_back(1);

とかでいいんですか?
使い方は。

714 :デフォルトの名無しさん:02/11/12 21:37
>>713
STLスレッドにおいで。議論がされてるよ。

715 :デフォルトの名無しさん:02/11/12 21:45
>>714
stlスレ見ました。
誘導ありがとうございますた。

716 :デフォルトの名無しさん:02/11/13 09:45
下みたいに、参照に null pointer を代入するのって、規格上許されてる?
g++ だとコンパイルできて期待通り動くんだけど、実装依存なんてことも
あるんでしょうか。

#include <iostream>
int main()
{
int& ri = *((int*)0);
if (&ri == 0) {
std::cout << "null reference" << std::endl;
}
}

717 :デフォルトの名無しさん:02/11/13 09:58
*((int *)0);

これってポインタなのか?
ポインタを間接参照しているようにみえるが。

718 :716:02/11/13 10:10
>ポインタを間接参照しているようにみえるが。
そう。まさしくそう見えるので不安なわけです(w

719 :デフォルトの名無しさん:02/11/13 10:32
規格はどうだか知らないけど、VC のリスティング見ると内部的にポインタに
なってるみたいだね。

int *p = (int*)0;
if (p == 0) { ...

と同じ処理になってる。
*p や ri を使おうとすると、たちどころにアクセス違反になる。

720 :デフォルトの名無しさん:02/11/13 10:48
C++3rdの5.5には初期化子は左辺値であればいいみたいなことが
書いてあるけども

721 : ◆hMJAPH9PWA :02/11/13 11:01
*((int*)0)はnull pointerを参照している事にはならないんだろうか。

722 :716:02/11/13 11:42
720> 初期化子は左辺値であればいいみたいな
つまりは、&(*((int*)0)) が有効な式になるかどうかってことかな。

723 :720:02/11/13 12:22
ということだと思うんですけども。
単項の * って左辺値つくり出んじゃなかったっけ、、

724 :デフォルトの名無しさん:02/11/13 12:32
参照への代入に限って違うとか。

725 :デフォルトの名無しさん:02/11/13 12:59
int main()
{
int &r = *((int*)0); //平気
int c = *((int*)0); //だめぽ
int &rr = r; //こっからダミー
int cc = c;
return 0;
}


726 :デフォルトの名無しさん:02/11/13 18:48
castは新しいのをね。

727 :デフォルトの名無しさん:02/11/13 22:47
みなさん、コンストラクタから例外投げてますか?

今までは「絶対に」投げてはいけないと思っていましたが、例外を投げても良い場合もあるんだという考え方もあるようで、

どっちが正しいのかよくわかんない。。。

 ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep02172000.asp

を読みましたが良くわかりませんでした。誰か頭の良い人、フォローしてください。


728 :デフォルトの名無しさん:02/11/13 22:49
exceptional C++ を読みましょう >>727



729 :デフォルトの名無しさん:02/11/13 22:52
exceptional C++ は買ったが読めないす。誰かフォローして。(今日はもう終電なので帰ります)


730 :デフォルトの名無しさん:02/11/13 22:53
>>727
そのページに
> 例外をスローすべき十分な理由があるなら、進んでその例外を
> スローして、それを文書化すればよいのです。例外をスロー
> するのが当然の場面で、例外のスローを回避する方法を
> 発明する必要はありません。複雑にすることで、制限された
> バージョンのクラスを誰かが誤用する危険よりもかえってひどい
> 保守の悪夢が生まれてしまいます。
と書いてあるではないか。

というか、あなたが何故『「絶対に」投げてはいけない』と思うのかが謎なのだが。

731 :デフォルトの名無しさん:02/11/14 00:29
main()
{
  const unsigned N = 1;
  try{ for(;;) new int[N]; }
  catch( ... ){}
}

↑のプログラムが、Aborted(core dumped) になってしまいます。
なにが起こっているんでしょうか?

N = 1024 にしたら無言で終了しました。(これが期待の動作)
環境は、 cygwin g++-3.1.1 です。

732 :デフォルトの名無しさん:02/11/14 00:36
後始末の処理にもヒープメモリを必要とするからじゃないの?

733 :731:02/11/14 01:25
ちょっと調べてみたんだけど、
漏れの結論は
「std::bad_allocを投げるのに動的メモリを必要とするようなg++の実装がクソ」
になりました。
・・・いいのかなぁ?

734 :デフォルトの名無しさん:02/11/14 09:29
>>727
例外安全にしたければ Pimpl パターンを使えってこった。


735 :デフォルトの名無しさん:02/11/14 09:41
>>734
いつも思うんだが・・
pimplってどう発音してる? ぴーいんぷる? ぴんぷる?


736 :デフォルトの名無しさん:02/11/14 10:00
C++ FAQでは、コンストラクタでスローしろと書いてあったような記憶がある…

737 :デフォルトの名無しさん:02/11/14 10:11
>>735
漏れはぴーいんぷる。

>>736
漏れも C++ FAQ でそういう話見た気がする。


738 :デフォルトの名無しさん:02/11/14 10:38
デストラクタでthrowする香具師はドキュソ。とりあえずそれだけでいい
んじゃないすか。>727



739 :デフォルトの名無しさん:02/11/14 11:02
>>735
俺はぴーいんぷり。

>>727
普通に投げる。何か問題ある?

740 :デフォルトの名無しさん:02/11/14 14:22
>>727
例外は、戻り値がない コンストラクタ で一番威力を発揮するもんだろうが。
>>735
ぴーいんぷる

741 :デフォルトの名無しさん:02/11/14 14:38
>>738
前から思ってたんけど 香具師 をきちんと辞書で調べたか?

742 :デフォルトの名無しさん:02/11/14 15:03
>741
既出の読みはガイシュツではない。とか言い出す予感

743 :デフォルトの名無しさん:02/11/14 15:15
2ちゃん用語でウンチク語りだすのか(w
恥ずかしいなぁ。まあ2ちゃん用語自体恥ずかしいが。

744 :困っています:02/11/14 18:34
マウスでドラッグ選択した部分の描画を拡大縮小する良い方法ありませんか?!参考になるものでも結構です。
お願いします。


745 :デフォルトの名無しさん:02/11/14 18:38
StretchBlt()


746 :デフォルトの名無しさん:02/11/14 21:33
>>743
2ちゃん内では別に恥ずかしくない

747 :デフォルトの名無しさん:02/11/14 21:38
むしろ 「(w」 りの方が恥ずかしい

748 :デフォルトの名無しさん:02/11/14 21:51
り?

749 :デフォルトの名無しさん:02/11/14 21:58
自分の為のライブラリ、作ってますか?

750 :747:02/11/14 21:59
漏れも恥ずかしい

751 :デフォルトの名無しさん:02/11/14 22:01
>>747
(w

752 :デフォルトの名無しさん:02/11/14 22:18
ちょっとMFC系の質問なのですが、(あえてC++)
CString s; に1文字格納されているとして、
それを char 型の変数に代入するにはどうすればよいのでしょうか?

753 :デフォルトの名無しさん:02/11/14 22:44
なにが「あえて」だ!ドシロウトめ!s[0]だ!読んだらすぐ氏ね!

754 :デフォルトの名無しさん:02/11/14 23:08
>752
char buf
_tcscpy(&buf, s);
こうすれば、代入できます。

>753
しぬのはてめえだよ。ドシロウト。
char に CStringが直接代入できるわけねーだろ!
試してみろ!
素人もいます。公開掲示板では以後、言葉を慎むように。



755 :デフォルトの名無しさん:02/11/14 23:11
>>754
お前が氏ねよ!!
s[0]をcharに代入すると書いてあるだろう!お前の目はふしあなか?(プ

756 :デフォルトの名無しさん:02/11/14 23:18
s は CString で宣言されていますよ。上では。

757 :752:02/11/14 23:31
>754
有難うございます。
黙ってみていてすいません。
本当に初心者ですが、これからもよろしくお願いします。

758 :デフォルトの名無しさん:02/11/14 23:35
アカン。ネタなのかマジなのか判らなくなってきた。

とりあえず>>752はCStringの[]演算子が何を返すかマニュアル見て来た方がいいぞ。
君はネタではないと信じているぞ。

759 :753:02/11/14 23:43
>>754
じつはMFC使ったことなくって今試してみたんだけど(って言うか試すまでもなく)
_tcscpyだとメモリ破壊してんじゃねえか!?

760 :デフォルトの名無しさん:02/11/15 00:33
754 晒し age

761 :デフォルトの名無しさん:02/11/15 00:46
おいおい、charに入れるんだぞ。TCAHRじゃねーぞ。
754は_tcscpyを使ってるくせになんでcharなんだ(致命的ミスは別にして)。
CString::operator[]もTCHARを返すだけだぞ。

char c;
CString s("a");
USES_CONVERSION;
c = T2A(s.GetBuffer(1))[0];
・・・たぶん、752が求めてるのはこんなんじゃないだろうな。
つーか、すれ違いだバカ野郎!

762 :デフォルトの名無しさん:02/11/15 01:10
761だが、GetBufferのパラメータは3以上にしろ。バカ野郎。

763 :デフォルトの名無しさん:02/11/15 01:56
おまえら、面白すぎだバカ野郎

764 :デフォルトの名無しさん:02/11/15 13:22
newで作ったポインタを破棄する関数を作ろうと、
CMyWnd* pWnd = new CMyWnd;

DelObject(pWnd);

DelObject(CMyWnd* pWnd){
delete pWnd;
}

としたんですが、これで正しく破棄されてるんでしょうか?

765 :デフォルトの名無しさん:02/11/15 13:30
>>764
そのコードの通りに実行されるなら (途中で DelObject() の実行の阻害に
なるような事をしていなければ) 破棄される。
CMyWnd ではなく、自作の簡単なクラスを使って確認してみればいい。

766 :デフォルトの名無しさん:02/11/15 15:44
VC6SP5用Loki
ttp://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

既出?

767 :C++なんだけど:02/11/15 16:26
どうして4度目のprintf()の行をコメントアウトすると
エラーが発生しなくなるんですか?

#include <iostream.h>

void f(char str){str++;}

main(){
char *str, **pp;
str = new char[5];
strcpy(str, "abc");
*pp = str;

f(*str);
printf("%#x %s\n", *pp, *pp);
f(*str);
printf("%#x %s\n", *pp, *pp);
f(*str);
printf("%#x %s\n", *pp, *pp);
f(*str);
printf("%#x %s\n", *pp, *pp);

delete [] str;
}

768 :質問!!:02/11/15 16:34
ベクターファンクションのプログラムでOperation+とOperation-のファンクションはどうやって作ったらいいか、分かる方返信お願いしますううう。

769 :デフォルトの名無しさん:02/11/15 16:36
>ベクターファンクションのプログラム
意味不明

>Operation+とOperation-のファンクション
意味不明

770 :デフォルトの名無しさん:02/11/15 17:34
>767
ppはどこを指してるのかな?

# ただポインタがわかってないだけで、全然C++じゃないけどな

771 :デフォルトの名無しさん:02/11/15 17:36
http://pc3.2ch.net/test/read.cgi/tech/1036597434/355
か?

772 :C++なんだけど:02/11/15 17:46
*pp = str;
によって、ppは、char*型のstrのアドレスを指しているんでしょ?

773 :デフォルトの名無しさん:02/11/15 17:47
やっぱポインタの基本からやり直しなさい

774 :デフォルトの名無しさん:02/11/15 17:48
char *str;
*str = 'A';

↑こうした時の動作については、どんな本にも書かれていると思うが。

775 :デフォルトの名無しさん:02/11/15 17:52
ゆんゆん。

776 :デフォルトの名無しさん:02/11/15 18:06
(´-`).。oO(漏れがあっちのスレで教えた事をもー忘れたのか。。。)

777 :C++なんだけど:02/11/15 18:11
ppの容量が確保されてないから
*ppも使えないってことかな?

778 :デフォルトの名無しさん:02/11/15 18:15
DJGPP
http://www.delorie.com/djgpp/

C++コンパイラらしいけど、どうよ?

779 :デフォルトの名無しさん:02/11/15 19:11
>>778
なんかえらく懐かしい記がする。よく知らんけど

780 :デフォルトの名無しさん:02/11/15 21:15
DOSエクステンダ時代に有名だったねえ

781 :デフォルトの名無しさん:02/11/15 23:52
>>778

これのおかげで 98 時代に UNIX のゲームで遊べた。
商用のコンパイラは高かったし、98 用のバイナリは殆ど無かったし。


782 :デフォルトの名無しさん:02/11/16 03:17
range_error と out_of_range の使い分けの仕方を教えてください。

783 :デフォルトの名無しさん:02/11/16 08:20
>>778
一瞬、 djbcpp に見えた。

>>782
http://www.coyotegulch.com/algorithm/cpp/exceptions.html
これじゃ参考にならんかね?

784 :778:02/11/16 17:48
俺も全然知らないんだけどstroustrupのwebサイト見てたら見つけたんで気になった。

785 :デフォルトの名無しさん:02/11/16 21:21
質問です。VC++ 6 で
コンストラクタの初期化リスト中で this を使うと

(this が) ベースメンバ初期化リストで使用されました。

という警告が出るんですが、これって何故いけないのでしょうか?
検索して調べたあるページには

非静的メンバ関数の中でのみ有効な this ポインタが基本クラスの初期化リストで使用された

という意味だと書いてあったのですが、コンストラクタですから
非静的ですし、問題ないと思うのですが…。

何がいけないのか、どういう事に注意するべきなのか教えてください。
よろしくお願いします。

786 :デフォルトの名無しさん:02/11/16 21:33
>>785
初期化リストは、コンストラクタの内側じゃないんだと思います。

787 :786:02/11/16 21:46
動作に問題がないならとりあえず、#pragma warning(disable:4355) で
黙らせていいんじゃないですか?

788 :デフォルトの名無しさん:02/11/16 22:21
>>785
まだ初期化が完了していないオブジェクトへのポインタを使ってることになるからだろ。

初期化済みのオブジェクトを期待している関数の引数に
コンストラクタの中から this を渡してもコンパイルは通ってしまう。

789 :デフォルトの名無しさん:02/11/16 22:22
>>785
致命的なのは、渡した this 経由で派生クラスの仮想関数を呼ぶ場合やね。

class CallFoo;
class Base {
  CallFoo call_foo_;
public:
  Base() : call_foo_(*this) {}
  virtual void foo() = 0;
};

class Deriv {
public:
  virtual void foo() {}
};

class CallFoo {
public:
  CallFoo(Base& obj) { obj.foo(); }
};

Deriv deriv;  // Base::foo() を呼んで実行時エラーで止まる。

コンストラクタの実行が終わるまでは this が指すのは Deriv クラスの
インスタンスとは限らない。Base クラスの初期化リストを実行する場合
は、まだ this は Base クラスのインスタンスになってる。

790 :デフォルトの名無しさん:02/11/17 00:03
蛇足。

>>789の場合だと、Base::Base()の中で this->foo(); しても落ちるね。

Javaと違うから両方やってる人は要注意

791 :デフォルトの名無しさん:02/11/17 02:36
落ちるかどうかは環境によるだろ
何事もなくベースのfooが呼ばれるコンパイラもある。

792 :デフォルトの名無しさん:02/11/17 02:53
>791
Base::foo() が純粋仮想関数でも?

もし Base::foo() が単なる仮想関数なら、何事もなく Base::foo() が呼ばれるのは
確かだが。ただし、プログラマの意図と異なる可能性が高い。

793 :785:02/11/17 03:19
皆さんレスありがとうございます。
>>786
確かにコンストラクタの内側ではないですね。
VC++ 用のプラグマの指定は教えてもらえて助かりました。
後少しで警告を我慢し続けなければいけないところでした。

>>788
そういえばそうですね。(今回は)参照に設定する為に渡すんだったので、
対象側のコンストラクタで渡す側のメンバを触る事まで気が回りませんでした。

>>789
これは気をつけないといけませんね。

>>791
報告:参照に代入して、構築完了後に使う限りでは
VC++6.0, Borland C++, g++ のいずれでも問題ありませんでした。

みなさんありがとう。

794 :785:02/11/17 03:22
age てしまいました。スミマセン。

>>792
その場合はどう考えても落ちますよね。


795 :785:02/11/17 11:13
お世話になってます。 >>785 です。またも質問です。
テンプレート引数にメンバ関数を渡したくて下記のようにしました。

#include <iostream>
template<typename T, void (T::*Use)()>
class Hoge
{
public: void Bomber(T arg) { (arg.*Use)(); }
};
class CFoo
{
public: void Use() { std::cout << "使われますた。"; }
};
int main()
{
CFoo honya;
honya.Use();

Hoge<CFoo, CFoo::Use> chome;

chome.Bomber(honya);

return 0;
}

Borland C++ だとちゃんとコンパイルできるのですが
vc++ 6.0 だと 'Hoge' : テンプレートの仮引数 'Use' が無効です。
g++ 2.95.3-5 だと テンプレート引数を `CFoo::Use' から `void (CFoo::*)()' に変換できない。
になってしまいます。テンプレートの宣言はコンパイル通るみたい(文法違反ではない)のですが
使う部分で実際の関数を指定すると駄目になってしまうみたいです。
この場合、解決方法はありますでしょうか?よろしくお願いいたします。

796 :デフォルトの名無しさん:02/11/17 11:18
d3d8.hくれ

797 :デフォルトの名無しさん:02/11/17 11:31
>795
&CFoo::Use

798 :デフォルトの名無しさん:02/11/17 11:32
>>795
VC++6でtemplateを使いまくろうというのがそもそも間違いだと思う。

解決法1 : VC++.NET を使う。
解決法2 : rebind風

template<typename T>
struct HogeTmpl {
 template<void (T::*Use)()>
 class Hoge
 {
  public: void Bomber(T arg) { (arg.*Use)(); }
 };
};

HogeTmpl<CFoo>::Hoge<CFoo::Use> chome;

799 :785:02/11/17 11:55
みなさんレスありがとうございます。

>>797
おぉ!g++ で動きました!やっぱり関数ポインタはテンプレートに渡すときも
アドレスを取る書き方じゃないと駄目なんですね。

>>798
ぬぉ!rebind 風なら VC++6.0 でも動きました!
しかし頻繁に使いたい物なので利用者側がネストしたインスタンスを書かなければならないのは微妙ですね…。

時代遅れの VC++6 はそろそろ切り捨てるべきなんでしょうか…。
ともあれ、みなさんありがとうございました。

800 :デフォルトの名無しさん:02/11/17 13:39
ダイナミックリンクライブラリ
の作り方を説明してるページってないですかね?
猫でもわかるC++をみてもわからないのですよ。

801 :デフォルトの名無しさん:02/11/17 14:50
質問します。newで領域を確保するプログラムを作成しているんですが
こういう系統のものってnewを行う順番によっては例外がでるものなんでしょうか?
今作っているプログラムは、newをする場所を少し手前に持っていくと
正常に動いたりするんですが・・・

802 :785:02/11/17 14:59
VC++ 逝ってよし!!かもの >>785 です。
助言に従って VC++7 Standard も実験環境に加えたのですが、
本当にやりたかった事をしようとすると VC++7 でも駄目でした。

template<typename T>
struct HogeTmpl{
 template<void (T::*Use)()>
 class Hoge{
  public: void Bomber(T arg){
   (arg.*Use)();
  }
 };
};
class CFoo{
 public: void Use() { std::cout << "使われますた。"; }
 public: HogeTmpl<CFoo>::Hoge<&CFoo::Use> chome;
};
void main(){
 CFoo foo;
 foo.chome.Bomber(foo);
}
BCC, g++ のいずれでも通るのに VC++ は 6pro 7std では

VC7 'CFoo::Use' : 外側のクラスのメンバは型名、スタティック、または列挙子ではありません。
VC6 認識できない型 'CFoo' が使われています。

となってしまいます。何か解決方法はありますでしょうか?
頼ってばかりで申し訳ないのですが、どうかよろしくお願いいたします。

803 :デフォルトの名無しさん:02/11/17 15:00
>>801
それは99.999999999%キミのプログラムミスだから心配しなくていいよ。

804 :785:02/11/17 15:03
たまには人の質問にも答えてみたり
>>801
例外って bad_alloc とかでしょうか?
それともシステムの例外?
ちょっと状況を判断するには情報が少なすぎる気がします。

シンプルにしたソースとか提示すると答える人もわかり易くて、
レスがつきやすいと思いますよ。

805 :デフォルトの名無しさん:02/11/17 15:29
#if false //だめぽ
#endif

bccとgccはOKなのですがvc++だけ通りません
#if 定数式 改行
こういう仕様だと思ってたのですが
標準としてはbcc, gccとvc++のどちらが正しいのでしょうか?

806 :デフォルトの名無しさん:02/11/17 15:40
>800
それは、処理系毎のスレに行って聞いた方が良いと思われ。VC あたりだと
ウィザードでプロジェクト作るのが一般的だし。

807 :デフォルトの名無しさん:02/11/17 22:46
>>805
通るが?
>Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
>Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.00.9466 for 80x86

808 :807:02/11/17 22:50
お、C++モードだと通らんのか。スマソ

809 :785:02/11/17 22:53
>>807
ウチでは通らない模様。

VC++6 #if ディレクティブ内には、式が存在しないか、定数の評価をしませんでした。
VC++7 整数定数式が無効です。

g++ はプリプロセスの順番が コメントの除去→マクロ展開、ディレクティブ処理
なのに VC++ は
マクロ展開、ディレクティブ処理→コメントの除去
らしいのは以前ぜんぜん関係ない事でハマって確認済み。


# 私の質問の方は進展なし…。誰かヘルプミーです。

810 :デフォルトの名無しさん:02/11/18 00:36
>>802
これじゃだめか?
class CFooBase {
public: void Use() { std::cout << "使われますた。"; }
};
class CFoo : public CFooBase {
public: HogeTmpl<CFooBase>::Hoge<&CFooBase::Use> chome;
};

811 :810:02/11/18 00:58
これならVC7でも通るね。
#include <iostream>
#include <functional>
class CFoo {
public: void Use() { std::cout << "使われますた。"; }
public: std::mem_fun_t<void, CFoo> chome;
public: CFoo() : chome( std::mem_fun(&CFoo::Use) ) {}
};
int main(){
CFoo foo;
foo.chome(&foo);
return 0;
}

812 :デフォルトの名無しさん:02/11/18 01:24
class base {
public:
 virtual base& operator=(const base&) = 0;
};

class derived : public base {
public:
 derived& operator=(const derived& d) {}
};

これが駄目なのを今知って驚いたんですがどういう風に理解すればいいでしょうか。


813 :デフォルトの名無しさん:02/11/18 01:35
継承前提のクラスを代入可能にするというのはあんまり見ないなあ。
代入とかするってことは値のように使う、という意図だろうし・・・

814 :デフォルトの名無しさん:02/11/18 01:41
>>812
純粋仮想関数が正しくオーバーライドされてないからエラーが出る。
戻り値も仮引数も全く同じ型の関数が必要。

815 :812:02/11/18 01:47
ども。

>>813
"baseから派生するクラスは代入演算を持つのだ"という点をはっきりさせる
ところ意図があります。そんだけです・・・。

>>814
とりあえず戻り値は違っていても↓は通りますね。(gcc-3.2)

class base {
public:
 virtual base& operator=(const base*) = 0;
};

class derived : public base {
public:
 derived& operator=(const base* b_ptr) {}
};


816 :デフォルトの名無しさん:02/11/18 01:59
>>815
但し、代入演算子関数は、継承されないという性質を持つため純粋仮想関数と
宣言しない方がよい。コンストラクタとデストラクタも純粋仮想関数からは除外
すべき。

817 :デフォルトの名無しさん:02/11/18 02:01
下に示すように、抽象クラスのメンバは自動的に代入してくれないので、
手動で代入しなければならず、なかなか厄介だよ。

class base {
public:
virtual const base& operator=(const base&) = 0;
int j;
};

class derived : public base {
public:
const base& operator=(const base& d) { j = d.j; return d; }
int i;
};

int main()
{
derived d, e;

e.i = 111;
e.j = 222;
d = e;
std::cout << e.i << " " << e.j << std::endl;
std::cout << d.i << " " << d.j << std::endl;
}

818 :812:02/11/18 02:01
>>816
りょかい。"すべき"と言ってもらえると安心できます。
おやすみなさい。

819 :デフォルトの名無しさん:02/11/18 02:02
>>818
「すべき」と書くといかにも語弊がありそう。実は、コンストラクタとデストラクタと
代入演算子関数を純粋仮想関数と宣言すると、リンカエラーになる処理系が
あるらしい。

820 :デフォルトの名無しさん:02/11/18 07:26
C++の入門書をやっていて、
「floatを返しcharを受け取る関数へのポインタを返し、intを引数とする関数へのポインタを宣言せよ」
という問題があって、

float *(char) Func1(int i){ /* 処理1 */ } // <--☆
float Func2(char c){ /* 処理2 */ }
int main()
{
float *(char) (*fp1)(int); // 'fp1'が問題に対する答え
fp1 = Func1;
float (*fp2)(char);
fp2 = fp1(109);
float f;
f = fp2('H');
}

としたのですが☆の部分で「宣言が正しく終了していない」というエラーが出ます。
何が間違っているのでしょうか。


821 :デフォルトの名無しさん:02/11/18 08:11
>>820
float XXXX(char); // 「floatを返しcharを受け取る関数
float (*XXXX)(char) // へのポインタ
float (*XXX(YYY))(char) // を返し
float (*XXX(int i))(char) // intを引数とする
float (*Func1(int i))(char) { /*処理1*/ } // 関数 = Func1
// へのポインタ」 にするにはFunc1の部分をさらに分解しよう。

つーかね、typedefを使えと。

822 :デフォルトの名無しさん:02/11/18 08:15
俺ならこうする。
typedef float (*c2f)(char);

c2f Func1(int i)
{
 ...
}

823 :デフォルトの名無しさん:02/11/18 08:34
ついでに言うと
float *(char) Func1(int i)
は、
float *
でfloatのポインタになってしまうので、
(char)
は何のことだかわからないので、
絶対間違っていると判んなきゃダメだと思うぞ。

824 :デフォルトの名無しさん:02/11/18 12:40
そんな事言わずに教えてくれよ。
気になって気になっておがで不眠症なんだ。

825 :824:02/11/18 12:40
誤爆

826 :デフォルトの名無しさん:02/11/18 14:18
>>824
なんだかこっちが気になるな…(*´Д`)
おがってのも…

827 :デフォルトの名無しさん:02/11/18 17:04
>>826
824じゃないけど「おかげ」のtypo

828 :デフォルトの名無しさん:02/11/18 19:47
かな打ちマンセー

829 :デフォルトの名無しさん:02/11/19 02:15
"カナ"当の半角カナの文字列を'kana'のようなローマ字に直すプログラムを作っています。

char buf[256];
memset(buf,'\0',256);
char roma[8];
while (*str != '\0'){
  ConvertOne(*str,roma);//これは一文字づつ'カ'→'ka'等に変換する関数
  strcpy(roma,"test");
  sprintf(buf,"%s%s",buf,roma);
  str++;
}

このようにしてみたのですが、
これだと'パ'や'ガ'など一文字だけでは
判別できない文字を直すことができません。
なにかよい方法はないでしょうか?

830 :デフォルトの名無しさん:02/11/19 02:17
>>829
そのような入力を想定しながら作り直せ。

831 :デフォルトの名無しさん:02/11/19 02:27
>>829
オートマトンを使って、濁音や半濁音になる可能性のあるカナを
別処理。

832 :デフォルトの名無しさん:02/11/19 02:47
とある教授は,彼の授業用ノートに「オートマント」と書かれている為,毎年「オートマント」と板書する。
1つ上1つ下2つ↓のやつらに聞いて確かめた。
それが教授のネタかどうかは定かではない。

833 :820:02/11/19 07:31
>>821
とてもわかりやすい答え、ありがとうございます。
おかげさまでコンパイルできました。
>>822
アドバイスありがとうございます。
なるほど、こんなtypedefの使い方があるとは知りませんでした。
勉強になりました。

834 :デフォルトの名無しさん:02/11/19 08:16
>>832
アドバイスありがとうございます。
なるほど、こんなオートマントの使い方があるとは知りませんでした。
勉強になりました。

835 :デフォルトの名無しさん:02/11/19 10:07
それ本当に教授かよ

836 :デフォルトの名無しさん:02/11/19 10:35
CppUnit 1.8 で、「きちんと例外が投げられるかどうか調べる」というのはマクロかなにかでかけますか?



837 :デフォルトの名無しさん:02/11/19 11:16
>>836
クエスチョンありがとうございます。
なるほど、こんな人任せの質問の仕方があるとは知りませんでした。
勉強になりました。

838 :デフォルトの名無しさん:02/11/19 11:32
>>837



839 :デフォルトの名無しさん:02/11/19 12:28
>>836
どこで調べたいんだ?
投げた側か受け取り側か。

840 :bloom:02/11/19 12:28

http://www.agemasukudasai.com/bloom/

841 :デフォルトの名無しさん:02/11/19 12:47
>>839
受け取り側ッス


842 :デフォルトの名無しさん:02/11/19 15:12
こんにちは。よろしければ教えてください。

現在、VC++のサンプルプログラムのチャット

プログラムをサーバ側とクライアント側のプログラム

を同一マシンで動かそうとしているのですが、

クライアントが接続するときに接続拒否をされているようです。

私のOSはWIN98ですが、やっぱりこれが原因でしょうか?

サーバー機能がないOSだからでしょうか? よろしくお願いします。


843 :デフォルトの名無しさん:02/11/19 18:25
>>841
それってハンドラ内に普通にチェック用マクロ書けばいいだけちゃうん?

>>842
Norton Internet Seculity とか

その手のファイアウォールツール入れてたり

しませんかーーーー?
つーか間に改行入れるのやめい。

844 :デフォルトの名無しさん:02/11/19 20:51
επιστημ氏が2ちゃんねらな予感な感じを受けるのは私だけでしょうか…

845 :デフォルトの名無しさん:02/11/19 20:52
>>844
アラブ人?

846 :デフォルトの名無しさん:02/11/19 20:57
えぴすてーめーは、毎回ちょっとづつ名前を変えているという噂がある。
この前は、επιστη µ だった(嘘

847 :デフォルトの名無しさん:02/11/19 21:12
http://www.trickpalace.net/cppll/

お前らエイピステーメですよ

848 :デフォルトの名無しさん:02/11/19 21:17
s/イ//;

849 :デフォルトの名無しさん:02/11/19 21:18
エピさん見てるなら返事してー

850 :επιστηχ ◆IGEMrmvKLI :02/11/19 21:21
みなさんこんにちわ。
エピステーキーです。

読み方知らないけど「きー」を変換してね。

851 :デフォルトの名無しさん:02/11/19 21:23
>>850 A点

852 :επιστηχ ◆IGEMrmvKLI :02/11/19 21:29
>>851
       ∧         ∧          ∧
        / ヽ      / ヽ_       / .∧
     /   `、   _/   `、⌒ヾ⌒ヽ/  ∧
    /       ̄ ̄/  u (.....ノ(....ノ   / ヽ
    l:::::::::        |           u .:(....ノノ
   |::::::::::  -=・=- / ̄ ̄ヽ        ::::::::::::::/`ヽ
   .|:::::::::::::::::  \_(___..ノ   u  ::::::::::::::::::::(....ノノ
    ヽ:::::::::::::::::::  \/ヽ  u    ::::::::::::::::::::::::::::ノ

853 :デフォルトの名無しさん:02/11/19 21:52
       ∧         ∧          ∧
        / ヽ      / ヽ_       / .∧
     /   `、   _/   `、⌒ヾ⌒ヽ/  ∧
    /       ̄ ̄/  u (.....ノ(....ノ   / ヽ
    l:::::::::        |           u .:(....ノノ
   |::::::::::  -=・=- / ̄ ̄ヽ        ::::::::::::::/`ヽ
   .|:::::::::::::::::  \_(___..ノ   u  ::::::::::::::::::::(....ノノ
    ヽ:::::::::::::::::::  \/ヽ  u    ::::::↑::::::::::::::::::ノ
                       |
               επιστηχ◆IGEMrmvKLI

854 :デフォルトの名無しさん:02/11/19 22:11
エピステーメーさんがブラインドタッチできないとは知らなかったなぁ…。

855 :デフォルトの名無しさん:02/11/19 22:45
VC++で

int a=30;
printf("%d",a);

を TextOutなどで実現するにはどうすればいいですか?

856 :デフォルトの名無しさん:02/11/19 22:47
TextPrintf("%d",a);

857 :デフォルトの名無しさん:02/11/19 22:47
sprintf

858 :デフォルトの名無しさん:02/11/19 23:04
>>844-854

悪意を感じるぞ。匿名をいいことに挑発するのは卑怯!
(俺は本人じゃないし、cppllにも加入してない)


859 :デフォルトの名無しさん:02/11/19 23:07
無理でした
それとも書き方が悪かったのかなぁ?
もうすこしちゃんとした書き方教えてください。

860 :デフォルトの名無しさん:02/11/19 23:10
秘密!

861 :854:02/11/20 12:24
>>858
エピステーメーがタッチタイプできないってのはてーめーがCマガの連載で
語ってた事だし、むしろ漏れは彼の熱心な読者だしー。

上のヤツはしらんが。

862 :デフォルトの名無しさん:02/11/20 13:43
ヱビスビールですが何か?

863 :デフォルトの名無しさん:02/11/20 13:54
つまらん。

864 :デフォルトの名無しさん:02/11/20 15:14
>>855
std::ostringstreamなどはいかがだろうか。
だめぽ?(ρ_;)

865 :デフォルトの名無しさん:02/11/20 15:55
BOOL TextOutFormat(HDC hDC, int nXStart, int nYStart, const char *fmt, ...)
{
 va_list vargs;
 va_start(vargs, fmt);
 const size_t BufSize = 8192;
 char *buf = new char[BufSize + 1];
 buf[BufSize] = '\0';
 BOOL ret = TextOut(hDC, nXStart, nYStart, buf, _vsnprintf(buf, BufSize, fmt, vargs));
 va_end(vargs);
 delete[] buf;
 return ret;
}

TextOutFormat(NULL, 7, 8, "%d", 1234);

866 :デフォルトの名無しさん:02/11/20 19:34
すみません、SGIのMIPSpro C++ 7.3ユーザーなのですが、
C標準ヘッダの取り込みが
#include <cctype>
などのように指定しても上手くいきません(file unavailable)

もちろん-LANG:std付けてます。
つうか/usr/include/CC以下にそんなの無いし。
かといってctype.hを取り込むと、namespaceが::で(゚д゚)マズーなんですが...。

プラットフォームdependな質問で申し訳ありませんが、詳しい方お願いします。

867 :デフォルトの名無しさん:02/11/20 20:40
ファイル名 cctype.h
namespace std
{
#include <ctype.h>
}

スクリプトで生成すれ。もちろん標準 C ヘッダとその他の標準 C++ ヘッダは分けて。

868 :867:02/11/20 20:40
ファイル名は cctype だった須磨祖

869 :867:02/11/20 20:43
ぜんぜん関係ないんだけどさ、dynamic_cast と VISITOR は
一般的にどちらが速度早い?

あまりにも頻繁にベースからサブを探り出す必要があるので VISITOR のトリックで
どうにかしようと思ってるんだけど、速度的には不利なのかなぁ?

870 :866:02/11/20 21:28
>>867
マジですか!?

いや確かにその方法は一瞬脳裏をよぎったんですが、
まさかそんなことはあるまい(((((((;゚д゚)))))))
と自己否定してました。

最新のコンパイラなのにぃぃぃ

871 :デフォルトの名無しさん:02/11/20 23:02
gccでSDLを使っています。初心者用の初期化サンプルを試したのですが
オブジェクトファイルが出てエラーになります。

#include <stdlib.h>
#include "SDL.h"

int main(int argc, char *argv[])
{
if ( SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
return(0);
}

872 :デフォルトの名無しさん:02/11/20 23:05
>>871
そうですか。

つか、エラーメッセージくらい貼れってばさ。

873 :871:02/11/20 23:06
すいません。続きです。
エラーは
make -k
gcc test.cpp -o test -Wall -I/usr/include/SDL
/tmp/ccqiKxRn.o: In function `main':
/tmp/ccqiKxRn.o(.text+0xc): undefined reference to `SDL_Init'
/tmp/ccqiKxRn.o(.text+0x20): undefined reference to `SDL_GetError'
/tmp/ccqiKxRn.o(.text+0x4c): undefined reference to `SDL_Quit'
collect2: ld returned 1 exit status
make: *** [test] エラー 1

874 :871:02/11/20 23:10
あれ?全部書いてるのに転送されてない…?
連続ですいません。makefileは
test : test.cpp
gcc test.cpp -o test -Wall -I/usr/include/SDL


875 :デフォルトの名無しさん:02/11/20 23:13
>>873
そのエラーは関数のプロトタイプだけで本体が定義されてない時に
出るエラー。

876 : :02/11/20 23:14
http://www2a.kagoya.net/~adults-toybox/sample1.wmv
http://www2a.kagoya.net/~adults-toybox/sample2.wmv
http://www2a.kagoya.net/~adults-toybox/

877 :871:02/11/20 23:15
???文が途切れてますすいません…。
gccの前にはちゃんとタブ入ってます。
ライブラリもちゃんとインストールされてます。
GTK等の他のライブラリは正常に動作します。
どうなってるんでしょうか?

878 :デフォルトの名無しさん:02/11/20 23:37
>>877
ライブラリはリンクしなきゃ。
`sdl-config --libs` もいれて。sdl-config が正しく
設定されていればそれでとおるとおもうけど。

879 :871:02/11/20 23:37
>>875
ありがとうございます。
テストコードはコンパイルできたのでmakeの仕方がおかしいみたいでした。
本体の定義を読み込みかたを探して来ます。


880 :デフォルトの名無しさん :02/11/20 23:42
CMyClass** pMyClass;
pMyClass[0] = new CMyClass;
pMyClass[1] = (以下続く)
という配列の要素をnewで確保したのですが、
終了処理のところで
delete [] *pMyClass;
とやると実行時エラーが出ます。
一度にdeleteする方法があったら教えてください。

881 :デフォルトの名無しさん:02/11/20 23:51
>>880
・pMyClass[0]ってちゃんと確保されてるの?
・delete[] *pMyClassに対応するnewってどこにある?

ポインタを勉強しませう。

882 :デフォルトの名無しさん:02/11/20 23:51
CMyClass** pMyClass;
pMyClass[0] = ..

あれ?pMyClassの実体は?

883 :デフォルトの名無しさん:02/11/20 23:54
new [] でないと delete [] はできないんじゃなかった?

884 :デフォルトの名無しさん:02/11/20 23:54
素人はboost::shared_ptrでも使っとけ

885 :880:02/11/21 00:15
>>880
書き忘れでした...(汗)
正しくは、CMyClass** pMyClass[4]; です。
pMyClass[0],pMyClass[1]...には一応インスタンスがあり
メンバ関数も呼び出せているのですが、delete時にエラーが出ます。

>>883
基本クラスのポインタで派生クラスを管理している状態なので、
new [] は使っていませんでした。
ただdelete pMyClass[0];...と一つづつdeleteしてもエラーが出ます。
何か根本的な理解不足でしょうか?
それともdeleteするタイミングが悪いのか...

886 :デフォルトの名無しさん:02/11/21 00:17
ほとんどの処理系が new=malloc、delete=free だとすると、880 がやろうと
してる事は大間違いだな。

887 :デフォルトの名無しさん:02/11/21 00:23
>>885
CMyClass* pMyClass[4];
じゃなくて、CMyClass**なのか?

888 :デフォルトの名無しさん:02/11/21 00:28
>>885
>正しくは、CMyClass** pMyClass[4]; です。
ほんとに?
CMyClass* pMyClass[4];
じゃなくて?


889 :デフォルトの名無しさん:02/11/21 00:31
質問シロート君。
エラーって何の事だい?

890 :デフォルトの名無しさん:02/11/21 00:31
>>885
これならわかるが。

class CMyClass {};

int main()
{
CMyClass** pMyClass;

pMyClass = new CMyClass*[4];
for (int i = 0; i < 4; i++)
pMyClass[i] = new CMyClass;
//
for (int i = 0; i < 4; i++)
delete pMyClass[i];
delete[] pMyClass;
}

891 :デフォルトの名無しさん:02/11/21 01:12
>>871
http://game.2ch.net/test/read.cgi/gamedev/1005469181/l50
に行ってあげて。

892 :880:02/11/21 02:10
>>887
すいません、さらに書き間違いをしていました。
CMyClass* pMyClass[4]; でした。

>>889
deleteを呼ぶときになると、アプリケーションエラーのダイアログが出て
「・・・メモリが"read"になることはできませんでした。」
という例外エラー?(←間違ってたらすみません)が出ます。

>>890
ソースを示していただいて、ありがとうございます。

頭の中が混乱していて、いろいろご迷惑をおかけしました。
まだnewとdeleteや配列について全然理解不足だということを痛感しました。
レス下さった方々、本当に感謝です。勉強になりました。

893 :デフォルトの名無しさん:02/11/21 02:19
>>892
> メモリが"read"になることはできませんでした。

どっかでメモリを壊している。

894 :デフォルトの名無しさん:02/11/21 02:35
>>892
その場合の正解は、たぶんこうだ。

std::auto_ptr<CMyClass> pMyClass[4];
for (int i = 0; i < 4; ++i)
  pMyClass[i].reset( new CMyClass );

delete を自分で書かないように心がけるのがコツだ。

895 :デフォルトの名無しさん:02/11/21 12:16
class hoge{...};
class hage:public hoge{...public:void poge();...};
int procA(){
...
 hoge *p=new hage;
 ((hage *)p)->poge();
...
}
は安全ですか?(poge()はhogeの仮想関数ではありません)
あとC++キャストの載ってるいい本を教えてください

896 :デフォルトの名無しさん:02/11/21 12:16
age忘れました

897 :デフォルトの名無しさん:02/11/21 12:46
確実にhageのインスタンスであることが分かっている場合はstatic_cast
他のクラスのインスタンスである可能性がある場合はdynamic_cast


898 : :02/11/21 13:56
λ...... ここ変だよ・・        λ......       λ......
  λ......            λ...... 失敗だったネ…
 λ......      λ......
        λ......                  λ...... 逃げていく…
    λ......             λ......
                λ......
 λ......       λ......          λ...... みんな逃げていく…
λ...... ここ変だよ・・        λ......       λ......
  λ......            λ...... 失敗だったネ…
 λ......      λ......
        λ......                  λ...... 逃げていく…
    λ......             λ......
                λ......
 λ......       λ......          λ...... みんな逃げていく…

899 :デフォルトの名無しさん:02/11/21 15:59
>>895
ATL はソレでいっぱいです。


900 :デフォルトの名無しさん:02/11/21 16:20
クラス名(例:Onigiriクラス)が
COnigiriの場合は、普通のクラス
IOnigiriの場合は、インターフェースクラス

みたいなプリフィックスありますが、
オリジナル(?)で

TOnigiri ・・・ テンプレートクラス。内部の型を設定して使う。
BOnigiri ・・・ 継承して使う用(Base)。ウインドウ(コールバック部分)やスレッドクラスみたいなやつ

みたいな感じで
勝手にやっていいのでしょうか?
もし、開発チーム内でこんなことされたら勘弁と思う人とか居ます?

あと、
構造体名の場合は、SOnigiriでいいのでしょうか?
何かプリフィックすあったら教えてください。




901 :デフォルトの名無しさん:02/11/21 16:45
I くらいは許すがあとは全部却下。

902 :デフォルトの名無しさん:02/11/21 17:00
>>898
ATL はソレでいっぱいです。

903 :デフォルトの名無しさん:02/11/21 17:34
>あとC++キャストの載ってるいい本を教えてください

Effective C++ or More effective C++ or its both!

904 :デフォルトの名無しさん:02/11/21 17:59
エピさんとこに載ってるよ < C++スタイルキャスト

905 :デフォルトの名無しさん:02/11/21 20:00
>>900
テンプレートかつインターフェイスだった場合にはどうするね?
TIXxx や ITXxx という手もあるが
旅行者を表すインターフェイス
ITraveler とかがあったり
Java Virtual Machine を表すクラス
CJVM とかがあったら大混乱だよね?

ってわけで俺はテンプレートはサフィックスにしてる(CXxxxTemplateとか)

あと、チーム内なら勝手にやるのはご法度だろ。
周りの了解を得てからだな。
俺的には C と I 以外は却下だけど。

906 :デフォルトの名無しさん:02/11/21 22:14
これは平気?
http://ccp14.semo.edu/ccp/ccp14/ftp-mirror/howardflack/pub/soft/crystal/fox/tmp/Anders.pdf

907 :デフォルトの名無しさん:02/11/21 22:37
ヤヴァすぎ

908 :デフォルトの名無しさん:02/11/22 00:29
>>900
TはなんかVCLっぽいしBはなんかBeOSのAPIっぽいので却下。

…というのは半分冗談にしても、
テンプレートは最初から template やら <> がくっついてるので
名前で区別する必要は無い気がする。継承の方は、
Ixxx にするとか AbstraceXxxx にするとか。

909 :908:02/11/22 00:29
×Abstrace ○Abstract

910 :デフォルトの名無しさん:02/11/22 12:53
>>906
俺は既に落としたので通報しますた

911 :デフォルトの名無しさん:02/11/22 12:58
☆ チン        ハラヘッタ〜
      ハラヘッタ〜
☆ チン  〃 Λ_Λ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ヽ ___\(\・∀・)< concrete keywordまだー??
    \_/⊂ ⊂_)_ \____________
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
  |  ̄  ̄ ̄ ̄  ̄ ̄:| :|
  |            |

912 :デフォルトの名無しさん:02/11/22 13:05
そういうのを
「西部労働レストラン」
っていうんです!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


913 :デフォルトの名無しさん:02/11/22 17:03
>>910
あんた 「すれ立てるまでもない」 スレにも居なかったか?

914 :910:02/11/22 17:42
ああ、いかにも俺はその805だが…(*ノノ)

915 :デフォルトの名無しさん:02/11/22 19:10
始めまして。質問です。
X *a;などと宣言したあと、(Xはクラス)
aの配列のメモリを一つずつ確保するにはどうしたら良いでしょうか?
本来、a = new X[個数];と宣言すれば済むのですが、
aの個数がファイルを読み終わるまでわからないため、
forのループ内で一つ一つ確保したいのです。
a[i] = new ???;みたいな感じで。
ご教授宜しくお願いします。



916 :デフォルトの名無しさん:02/11/22 19:17
new(ptr) X

917 :デフォルトの名無しさん:02/11/22 19:20
>>915
2回目だよな?

918 :デフォルトの名無しさん:02/11/22 19:37
>>917
初めてですけど、、、

>>916
(ptr) はどうすればいいのでしょうか><?


919 :デフォルトの名無しさん:02/11/22 19:46
嘘吐きsage

920 :デフォルトの名無しさん:02/11/22 19:48
>>915
vecor<X>
じゃだめなのかね。

921 :デフォルトの名無しさん:02/11/22 19:49
vector<X>ね

922 :デフォルトの名無しさん:02/11/22 19:54
>>915
ポインタ勉強せーよ

923 :デフォルトの名無しさん:02/11/22 20:05
X *a;
new(a)X; //replacement構文キタ?

924 :デフォルトの名無しさん:02/11/22 20:08
>>923
だから、その a がいくつ必要かわからないって話だろ。
vector でいいじゃん。

925 :デフォルトの名無しさん:02/11/22 20:15
これってSTL使わないと出来ないようなことなんですか?

926 :923:02/11/22 20:16
>aの個数がファイルを読み終わるまでわからないため、

ファイルを読んで個数を得てからX *a = new X[n];ではだめなのかね?


927 :デフォルトの名無しさん:02/11/22 20:19
単純に遅いだろ

928 :デフォルトの名無しさん:02/11/22 20:25
vectorとか言うc++では初めて聞くものをやろうとしてみてるんですが
何かコンパイルが遅くなるのが気になります。。。大丈夫なのでしょうか?

>>926
一応可能ですが、
個数得るだけじゃなく、そのファイルの途中で配列に(ファイルの)内容を代入させるため
ファイルを2度読むはめになっちゃうのです(TT)
それしかないですかね?


929 :デフォルトの名無しさん:02/11/22 20:30
>928
> vectorとか言うc++では初めて聞くものをやろうとしてみてるんですが
コードを書き始める前に、プログラミング言語 C++ ぐらいは読んどけ。


930 :デフォルトの名無しさん:02/11/22 20:32
>>929
http://www.pro.or.jp/~fuji/computerbooks/c/cpp.strou.html
これ図書館で借りてきたんですが載ってないですTT

931 :デフォルトの名無しさん:02/11/22 20:35
基礎本には STL が載っていない事が多いと思う。

932 :デフォルトの名無しさん:02/11/22 20:36
>>928
ヘッダー覗いてみればわかるけど、膨大な template を処理してる。
多少はガマンすること。

933 :デフォルトの名無しさん:02/11/22 20:36
http://www.ascii.co.jp/books/detail/4-7561/4-7561-1895-X.html
これには載ってるだろう。
>>930のは古いかな。

934 :デフォルトの名無しさん:02/11/22 20:38
C++のコンパイルは遅い。これ常識。

935 :デフォルトの名無しさん:02/11/22 20:40
g++なんかは特に遅い

936 :デフォルトの名無しさん:02/11/22 20:41
遅いのが嫌ならC++なんか使うな。

937 :デフォルトの名無しさん:02/11/22 20:51
実際そのほうがいいのかもしれない。

938 :デフォルトの名無しさん:02/11/22 20:56
>>933
「STL(標準テンプレートライブラリ)に関する情報を新たに加筆。」 とか書いてあるな。

939 :デフォルトの名無しさん:02/11/23 00:55
STL が嫌なら手動でリストにでもすればいいのでは?

独自リスト → std::list となって結局最後に std::vector 使う事になるような気もするが。

940 :デフォルトの名無しさん:02/11/23 03:28
いや、自分で作るにしても、別にリストなんかにはしないけどなあ。
アクセスが不便じゃん。

941 :デフォルトの名無しさん:02/11/23 10:11
ライブラリがインターフェースとしてstl使うのはどうかと思った。

942 :デフォルトの名無しさん:02/11/23 14:04
誰が次スレ行きますよ?

943 :デフォルトの名無しさん:02/11/23 14:05
どこに次スレが立つよ?

944 :デフォルトの名無しさん:02/11/23 14:15
>>950
義務を負うこと。

945 :945:02/11/23 15:11
新スレが尻上がりました。速やかな移行をおながいします。
http://pc3.2ch.net/test/read.cgi/tech/1038031395/l50

946 :デフォルトの名無しさん:02/11/24 18:55
1000

947 :デフォルトの名無しさん:02/11/24 23:14
ほほう、>>950 になると >>944 お墨付きの重複スレが立てられるって事だな。

948 :デフォルトの名無しさん:02/11/24 23:38
      _人人人人人人人人人人人人人人_
        >    な なんだってー!!    <
        ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
        _,,.-‐-..,,_       _,,..--v--..,_
    /     `''.v'ν Σ´        `、_,.-'""`´""ヽ
    i'   / ̄""''--i 7   | ,.イi,i,i,、 、,、 Σ          ヽ
.     !ヘ /‐- 、u.   |'     |ノ-、 ' ` `,_` | /i'i^iヘ、 ,、、   |
    |'' !゙ i.oニ'ー'〈ュニ!     iiヽ~oj.`'<_o.7 !'.__ ' ' ``_,,....、 .|
.   ,`| u       ..ゝ!     ‖  .j     (} 'o〉 `''o'ヽ |',`i
_,,..-<:::::\   (二> /      !  _`-っ  / |  7   ̄ u |i'/
. |、 \:::::\ '' /        \ '' /〃.ヽ `''⊃  , 'v>、
 !、\  \. , ̄        γ/| ̄ 〃   \二-‐' //`

949 :デフォルトの名無しさん:02/11/24 23:41
えへへ

950 :デフォルトの名無しさん:02/11/25 07:07
            < `ヽ  , '´ ̄ >
             ,.    ´ ̄ ` </ー- 、
            //,         ヽ\  ヽ
          '´ / .' / /,       ゙\ヽ.  ゙
          ( !/ i/(( リ |l〈 | ヽヽ.   |ヽ) )  i
           ヽY/!,ィ'il  'Tヽ, l i  l く(ヽ  !
           / l lr1,  ヒ1l | | ,.'  )' ) ノ
            , ' /ヽ´ ー `" ,| l´   ( l !   
         i(( {.   ` ーァ く,| |、    ヽト、
         ヽ. ヽ. '77´/ l'´/,! l' ヽ    ノ )
            ゙/ ,'/ /.† ! ! リ ノ 〃ヽ  ( ((
           〈ヽ. i !/、/|_!.l'(. !i  \ `ー-ヽ
    ,     / ヽ.∧ ヽ./  `,ー ' ヽ.  ヽ  /}
    lヽヽ._/  /   !      /l_    ヽ.  / .し '´
    ヽ`   ,. '     ,'  ー- /≪フノ    ヽ     二
       ー-'      /     '´ \`く_,. へ  ` ー 、 ヽ
           /     \ ヽ  ̄ ヽ〉
             / /  i     \ \ノリ_ノ
           /, '   l       `  `ー- 1
         , ' / /   !     ヽ     ノ
       く/   /   l     ヽ   ,.'´

951 :デフォルトの名無しさん:02/11/25 21:04
ageるよ〜

952 :デフォルトの名無しさん:02/11/25 23:14
>>950
次スレよろしく。

953 :デフォルトの名無しさん:02/11/26 08:47
>952
>945

954 :デフォルトの名無しさん:02/11/26 09:09
>>953
>>944

955 :デフォルトの名無しさん:02/11/27 22:59
保守

956 :埋子:02/11/30 05:43
埋め。

957 :デフォルトの名無しさん:02/11/30 12:18


958 :埋造:02/12/03 11:14
埋め。

959 :埋造:02/12/05 07:33
一日、一埋め。

960 :デフォルトの名無しさん:02/12/05 18:41
強力

961 :債務不履行の名無しさん:02/12/05 19:33
ume

962 :デフォルトの名無しさん:02/12/05 21:35


963 :デフォルトの名無しさん:02/12/05 22:32


964 :債務不履行の名無しさん:02/12/05 22:42
とく

965 :デフォルトの名無しさん:02/12/06 00:57
ふね

966 :埋造:02/12/06 03:43
今日もまた埋める。

967 :デフォルトの名無しさん:02/12/06 10:32
あまぐり

968 :デフォルトの名無しさん:02/12/06 12:43
むいて

969 :デフォルトの名無しさん:02/12/06 12:43
      |        ___|_              |   |
   _ー|ー-ー      | _      ヽ \    |     |
     __|_」      ̄~| ̄    /         レ    |
    / |ノ ^ヽ     _.、|    <               ノ
    (_ノ| ノ    ∠_ノ\    \            /

.         _」__               ̄──
          _|   \  |    ヽ      /
         (ノ^|.       |     |    |
           (_._」    レ     /     \


                       ●
                ヽ(;´Д`)ノ


970 :デフォルトの名無しさん:02/12/06 12:43
      |        ___|_              |   |
   _ー|ー-ー      | _      ヽ \    |     |
     __|_」      ̄~| ̄    /         レ    |
    / |ノ ^ヽ     _.、|    <               ノ
    (_ノ| ノ    ∠_ノ\    \            /

.         _」__               ̄──
          _|   \  |    ヽ      /
         (ノ^|.       |     |    |
           (_._」    レ     /     \


               ●
                ヽ(´Д`;)ノ


971 :デフォルトの名無しさん:02/12/06 13:25
ほい。


  ミ∴
  ∴∴

972 :デフォルトの名無しさん:02/12/06 20:00
ホントウニ ムカレテ シマッタ Σ(゚д゚lll)ガーン

973 :デフォルトの名無しさん:02/12/06 21:46
これは、終わりそう

974 :デフォルトの名無しさん:02/12/06 22:23
>>969-971
ワラタ
http://pc3.2ch.net/test/read.cgi/tech/1026793823/973-975

975 :デフォルトの名無しさん:02/12/06 23:04
>>974
引用する範囲が正しくない。
http://pc3.2ch.net/test/read.cgi/tech/1026793823/972-976

976 :デフォルトの名無しさん:02/12/06 23:20
>>975
おいおい、俺はこのスレと同じ部分だけを抜粋したんだよ。

977 :デフォルトの名無しさん:02/12/06 23:44
>>975
976 を含め忘れたくせに何を偉そうに。

978 :デフォルトの名無しさん:02/12/07 09:59
>>977
ん?975じゃないが,含まれてるぞ?

979 :977=975:02/12/07 14:02
すまん、宛先間違い。
976 宛て。

980 :埋造:02/12/07 16:51
やっぱり埋め。

981 :デフォルトの名無しさん:02/12/07 17:14
>>979
ああ分かった。

俺=>>972>>974 なんで,
自分のレスを含めて「ワラタ」と言うと自作自演になってしまうので恥ずかしかったから省いたんです。
許してちょ。


982 :デフォルトの名無しさん:02/12/08 02:45


983 :デフォルトの名無しさん:02/12/08 02:45


984 :埋造:02/12/09 03:43
あと少し。
埋め。

985 :デフォルトの名無しさん:02/12/09 10:36
俺も手伝うぜ。
一日人埋め

986 :デフォルトの名無しさん:02/12/09 16:02
me too

987 :デフォルトの名無しさん:02/12/09 22:26
memory too few

988 :デフォルトの名無しさん:02/12/09 23:27
umeume

989 :デフォルトの名無しさん:02/12/09 23:38
umauma

990 :デフォルトの名無しさん:02/12/10 00:16
mamatonton

991 :デフォルトの名無しさん:02/12/10 00:30
nullpo

992 :デフォルトの名無しさん:02/12/10 00:34
mou = dame + po

993 :デフォルトの名無しさん:02/12/10 01:30
eclipse-CDTのわかりやすい使い方のホームページ
誰か作って

994 :デフォルトの名無しさん:02/12/10 03:13
onogiri washowy

995 :埋造:02/12/10 05:24
今日で最後かな。
埋め。

996 :デフォルトの名無しさん:02/12/10 12:58
うめ

997 :デフォルトの名無しさん:02/12/10 13:17
ちんぴょろすぽーん

998 :デフォルトの名無しさん:02/12/10 13:25
チンポコビンビン

999 :デフォルトの名無しさん:02/12/10 13:25
まんこくさい

1000 :デフォルトの名無しさん:02/12/10 13:26
ageて終わり

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

233 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)