CからC++に移行中の人が質問するためのスレ

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
※回答する人も、質問する人も必ず読んでください 

これらに当てはまる人のための質問スレです。 
1.Cはだいたい理解している。 
2.最近C++を始めたばかり 
3.入門書を読んでも、Googleで検索しても、いまいち理解できない人 

【 回答してくださる方 】 
・ できるだけ優しく質問に答えてあげてください。 
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。 
 「ググれ」以外の回答でおながいします。 
・ 神ですら理解不能な質問は無視して下さい。 

【 質問する香具師 】 
・ どんな事で躓いているのか明確にしる。 
・ 長くならないなら躓いている部分のコードを晒してみれ。 
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書け。 
2デフォルトの名無しさん:2005/04/16(土) 10:55:43
>>1
普通にC++のスレで聞けばいいだろ?
甘えた態度はよろしくないな。
3デフォルトの名無しさん:2005/04/16(土) 12:59:03
3ちしげ3ゆ3様が電光石火の3ゲットなの!
                         >>1番かわいいのはさゆなの!
                    ノノハヽヽ〃ノハヾ /) >>2じ本はハゲすぎなの!
  後>>10は落ち目すぎなの! ∩*・ 。.・)从*・ 。.・)/ミ
                 〃ノハヾノノハヽヽノノハヽヽつ  い>>4川は黒すぎなの!
>>9ちもフケすぎなの!⊂(。.・从(・ 。.・*∩ノノノハ 。.・)ノハヽ
              ((  (\ゝノノノハノハ〃ハ v)っ彡*・ 。.・)
>>8やはフケすぎなの! ⊂`ヽ从*・ 。.・)・ 。.・))ノノノハヽつ ))>>5んのは顔ふくれすぎなの!
大の大人が>>7っちとか(プ⊂\  ⊂ )  _つ从*・ 。.・)
                   (/( /∪∪ヽ)ヽ)/ U  つ モー>>6すは売れなさすぎなの!
                   ∪ ̄(/ ̄\) ゝし'⌒∪              

              >>11-1000さゆのかわいさの前にひれ伏すの!
4デフォルトの名無しさん:2005/04/16(土) 13:11:28
とりあえず、コメントをC++に移行しますた
5デフォルトの名無しさん:2005/04/16(土) 23:20:18
1. C++では変数宣言がブロックの先頭に縛られないからなるべく使用するところで宣言するようにしろ。
宣言と同時に初期化できるのならそうするとなお良い。forで使うカウンタもfor内で宣言できる。for (int i = 0; i < N; i++)

2. フラグにはboolとtrue/falseを使え。

3. #defineは使わなくても済むなら消せ。
const使えば定数になる。つまり配列の添え字にも使える。
関数にinlineを付ければ(inline int f()など)コンパイル時にインライン展開される。

4. void *からその他のポインタ型への変換にはキャストが必要になった。(逆はC++でも平気) mallocなどには注意。

5. キャストもC++形式にしろ。今までのキャストは次のどれかに分類できる。(いくつか複合している場合もあるが)
const_cast(const外し)、reinterpret_cast(ポインタ←→整数など)、static_cast(その他一般)
static_castはdouble←→intとかvoid *→その他のポインタ型とかそういうときに使う。

6. malloc/freeの代わりにnew/delete new[]/delete[]を使え。
6デフォルトの名無しさん:2005/04/16(土) 23:26:21
インライン展開は、確実性がないぞ。
7デフォルトの名無しさん:2005/04/16(土) 23:46:30
そりゃそうだが気にするな。

7. 構造体変数を引数にする場合(関数内でそれを書き替えない場合)はconst参照にしろ。値渡ししたかのように . でメンバへアクセスできる。
関数内で書き替える場合はconstじゃない参照にすれば良いのだが、
(呼び出し側で&を書くことで)書き換えることを明示できるとポインタにする人もいる。
コーディングスタイルの問題なので言い出すとキリが無くなる。(俺は参照に出来るときは常に参照派)
参照ではNULLを表現できないからNULLを指定しても良いときは当然ポインタを使うしかない(わけではないが)。
これはクラスにも当てはまる。

8. std::stringを使うときにはメンバのc_str()を使うとconst char *型の文字列へのポインタを手に入れられる。const_castするなよ。

9. malloc/freeの代替としてはstd::vectorもある。realloc相当のことをしたければnew/deleteは使えないしな。

10. usingディレクティブ(using namespace 〜;)は使用禁止。namespaseを使う意味がなくなるじゃないか。
using宣言(using std::cout;)ならOK。
8デフォルトの名無しさん:2005/04/16(土) 23:53:17
>>10
んなこたない。
名前が衝突するときだけ修飾名を使えばいい。
9デフォルトの名無しさん:2005/04/17(日) 09:00:06
それもコーディングスタイルの問題なので言い出すとキリが無くなる。
とりあえず代わりにこっちを追加。
10.1. ヘッダファイル内ではグローバル名前空間でのusing禁止(ディレクティブ・宣言共に)。

8.1. 逆にconst char *→std::stringにはstatic_castが使える。
でもそういうときは一時オブジェクト作成のstd::string(p)の形式を使う人のほうが多い(と思う)。

11. C++では関数プロトタイプ宣言がないと関数を使えなくなった。

12. int f()とint f(void)は等価になった。int f()はCだと引数不定を意味するのは知っているよな。
10デフォルトの名無しさん:2005/04/17(日) 09:40:57
(´・ω・`)しらんがな
11デフォルトの名無しさん:2005/04/17(日) 21:45:57
どこで聞いたらいいのかわからないので、ここで質問させてください。
C++ は signed char と unsigned char と char を別の型として扱うとの
ことですが、なぜこのようなことをしたのですか?
int と signed int は同じとして扱うのに char だけなんでなのでしょう??
12デフォルトの名無しさん:2005/04/17(日) 22:01:33
>>11
え、Cでも同じじゃないの?
13デフォルトの名無しさん:2005/04/17(日) 22:16:09
Cは char を signed char として扱うか、 unsigned char として
扱うかは処理系により、よって、char は signed char か unsigned char
と同等なる、みたいな記述が今もっている本にあります.
なぜだろか
14デフォルトの名無しさん:2005/04/17(日) 22:57:19
なぜかというと、signedとかunsignedとか決めてしまうと、CPUの
種別によっては文字の扱いが遅くなる、しかしCやC++の文化では
それは許容できない。だからcharと書くとそのCPUでの「自然な」
(実行が速い)解釈を処理系が選べるように言語仕様を決めている。

ところで >>11 はCからC++に移行とは何の関係もない質問なのね。
15デフォルトの名無しさん:2005/04/17(日) 23:13:41
いやはや、大変お勉強になりました。ありがとうございます。
//関係ない質問だったならば、申し訳ないです。自分がC++に移行中だったもので
16デフォルトの名無しさん:2005/04/23(土) 12:45:17
VCやBCCについてくるソースなどを見ると、多くの場所で#defineを使っていますが、なぜconstを使用しないのでしょうか?
17デフォルトの名無しさん:2005/04/23(土) 12:45:49
VCやBCCについてくるソースなどを見ると、多くの場所で#defineを使っていますが、なぜconstを使用しないのでしょうか?
18デフォルトの名無しさん:2005/04/23(土) 12:46:28
VCやBCCについてくるソースなどを見ると、多くの場所で#defineを使っていますが、なぜconstを使用しないのでしょうか?
1916:2005/04/23(土) 12:47:17
ごめんなさい
20デフォルトの名無しさん:2005/04/23(土) 12:49:12
>>16-19
Cではconst付けても定数にならないから。
いちいちCとC++で切り替えるように作るのも面倒くさいだろうし。
21デフォルトの名無しさん:2005/04/24(日) 13:36:35
const変数は外部参照させるためにあります。
別のCファイルから読めるようになります。
数式の中に入れると最適化を阻みます。
プリプロセスが汚いト思うならenum定数。
Cでもenum定数で宣言しても良かったはずですが
柔軟性を残すために#defineにしてあるのではないでしょうか。
22デフォルトの名無しさん:2005/04/24(日) 14:18:55
>>21
>const変数は外部参照させるためにあります。
>別のCファイルから読めるようになります。
>数式の中に入れると最適化を阻みます。

………
23デフォルトの名無しさん:2005/04/24(日) 16:12:44
言いたいことははっきり言わないと伝わらんよ。
24デフォルトの名無しさん:2005/04/24(日) 16:30:44
>>21
> const変数は外部参照させるためにあります。
ちがいます。定数を定義するためにあります。

> 別のCファイルから読めるようになります。
それは const による効果ではありません。

> 数式の中に入れると最適化を阻みます。
コンパイラは値が定数であることを知ることができるので、
最適化を助けることはあっても阻むことはありません。
25デフォルトの名無しさん:2005/04/24(日) 16:34:27
defineだとデバッグ時に分かりにくいんだよね
26デフォルトの名無しさん:2005/04/24(日) 17:12:51
>>21
柔軟性が理由ではないね。enum定数という習慣がないだけだ。
27デフォルトの名無しさん:2005/04/24(日) 17:13:55
enumを整数として扱うなよ
28デフォルトの名無しさん:2005/04/24(日) 17:49:25
newでメモリを確保できなかった場合、ポインタにはNULLが入りますが、
deleteで削除した場合、ポインタはNULLになるのでしょうか?
29上田:2005/04/24(日) 17:51:08
なぜ試さないのか
30デフォルトの名無しさん:2005/04/24(日) 18:12:07
>>28
> newでメモリを確保できなかった場合、ポインタにはNULLが入りますが、
そうとは限りません

> deleteで削除した場合、ポインタはNULLになるのでしょうか?
いいえ
31デフォルトの名無しさん:2005/04/24(日) 18:50:29
>>28
> newでメモリを確保できなかった場合、ポインタにはNULLが入りますが
ちがうよ。 std::bad_alloc が飛んでくるんだよ。
ヌルが返るのは std::nothrow 使ったときだけ。
32デフォルトの名無しさん:2005/04/24(日) 19:08:58
昔はNULLが返ったものじゃったがのう
33デフォルトの名無しさん:2005/04/24(日) 19:27:27
>>24
extern constなんてのもCLSID/IIDでは使われているがな。
34デフォルトの名無しさん:2005/04/24(日) 19:36:17
>>33 何が言いたいの?
35デフォルトの名無しさん:2005/04/24(日) 22:13:37
>>31
それは try{} した場合だろ。
適当な回答者ばっかだなここ。
36デフォルトの名無しさん:2005/04/24(日) 22:21:54
>>35
tryで囲っていなくてもstd::bad_allocが投げられる。
terminate()などが呼ばれるのも例外を投げられた(けどtryで囲っていないからcatchされない)結果。
37デフォルトの名無しさん:2005/04/24(日) 22:24:17
tryする/しないで挙動が変わるの?初耳
38デフォルトの名無しさん:2005/04/24(日) 22:32:42
>>35 オマエガナー
39デフォルトの名無しさん:2005/04/24(日) 23:23:35
>>35はゆとり教育の犠牲者なので煽らないであげてください
40デフォルトの名無しさん:2005/04/24(日) 23:39:46
プログラマにゆとり教育も糞もあるか。
41デフォルトの名無しさん:2005/04/25(月) 01:59:40
newでコンストラクタを呼び出す機序がわからん。
例えば、グローバルスコープで
void* new( size_t size ) { return malloc( size ); }
で new をオーバーロードしてもちゃんとコンストラクタが呼び出される。
なんで?
42デフォルトの名無しさん:2005/04/25(月) 02:03:56
>>41
そりゃクラス内でオーバーロードしてないからだろ。
43デフォルトの名無しさん:2005/04/25(月) 02:27:22
>>42
いや、トレースするとちゃんと malloc()を使っている方が呼び出されているし。
new と delete ってとても特殊なキーワードなんだろうか?
オーバーロードされててもされてなくとも、new, delete があれば、アロケーたー
呼出し後に必ずコンストラクタ呼び出しするコードをコンパイラが埋めこんでいる
としか思えん。
4441:2005/04/25(月) 02:31:24
オーバーロードしている new が、
template < class T >
T* new( size_t size ) { T* p = malloc( size ); p->T(); }
だったら判るんだけどね。そうじゃないからどうしてかなと。
45デフォルトの名無しさん:2005/04/25(月) 02:40:56
>>41
関数(operator)形式のnewと演算子のnewの違いを調べろ
46デフォルトの名無しさん:2005/04/25(月) 02:51:26
ごめん、間違えてた。こうやってたんだ。
void* operator new( size_t size ) { return malloc( size ); }
話を整理すると、これをグローバルスコープで宣言してやると、
コンストラクタを呼んでないので new したclassのコンストラクタは
呼ばれない気がするんだけど、呼ばれるのはどうしてかなと。
例えば、bool T::operator == ( T& right ) { return T::compare( *this, right ); }
の compare を実行した後に、コンパイラが勝手に組み込みの == 比較演算をするのは
意味不明なわけじゃないですか。
47デフォルトの名無しさん:2005/04/25(月) 02:57:33
>>46
new = operator new + constructor
48デフォルトの名無しさん:2005/04/25(月) 03:06:58
>>47
operator new, deleteのオーバーロードは特殊で、そういうもんだということですね?
49デフォルトの名無しさん:2005/04/25(月) 03:08:43
>>48
operator new, deleteは全然特殊じゃない。
特殊なのは演算子のnew,delete。
50デフォルトの名無しさん:2005/04/25(月) 03:10:24
>>49
なら、なぜコンストラクタ呼び出しをするのでしょうか?
51デフォルトの名無しさん:2005/04/25(月) 03:13:16
だから何度も言っているように、
コンストラクタを呼ぶのは演算子のnewなの。
operator newだけを呼びたいなら
例えば void* m = operator new(sizeof(int));。
52デフォルトの名無しさん:2005/04/25(月) 03:38:34
実際にはコンパイラが newというアイデンティファーを見つけると、

push dword ptr [size]
call operator_new
mov ecx, [new されたポインタ]
call T::T 

のようなクラスのコンストラクターを呼び出すコードを
挿入するだけだと思います。
でないなら、オペレーターオーバーロードの機構からいって、
オーバーロードされた演算子の newがクラスのコンストラクタを
呼び出すのは不可能ですし。


5351:2005/04/25(月) 03:48:54
>>52 = 50?
大体そんなところ。
一応付け加えておくと、>>51で言ってる演算子のnewってのは
opeartor new のことじゃなく、new-expressionのことね。
54デフォルトの名無しさん:2005/04/25(月) 03:53:46
いつも自分でクラス作るとキモイクラスになってしまいます
だでがだぢげで
55デフォルトの名無しさん:2005/04/25(月) 04:01:46
友達につくってもらえ
56デフォルトの名無しさん:2005/04/25(月) 08:43:46
>>54
きもいと言う認識があるだけまし。
実際にどんなクラスを作ったのか晒してみ。
57デフォルトの名無しさん:2005/04/25(月) 12:31:58
>>54
見込みのある青年だな
58デフォルトの名無しさん:2005/04/25(月) 14:08:06
char a[100]の文字列をstring strにコピーするにはどうしたらよいのでしょうか。
str=a;はエラーになってしまいました。
59デフォルトの名無しさん:2005/04/25(月) 15:06:46
>>58
エラーの詳細を述べよ。
60デフォルトの名無しさん:2005/04/25(月) 16:43:18
クラスのメンバ変数をconstにしたい場合どうすればよいのでしょうか?
61デフォルトの名無しさん:2005/04/25(月) 16:46:42
>>60
普通にconstつけろ。
で、初期化子で初期化しろ。
62デフォルトの名無しさん:2005/04/26(火) 00:21:38
>>60
class A
{
  const int n;
public:
  A( const int k ) : n( k ) {}
};
63デフォルトの名無しさん:2005/04/26(火) 00:23:00
もしくは、
class A
{
  const int n;
public:
  A() : n( 100 /* 定数 */ ) {}
};
64デフォルトの名無しさん:2005/04/26(火) 00:55:03
>>62
わかって書いてるのかもしれないが、引数の const は不要だぞ。

>>63
そこに定数を書くなら、さらに static も付けて
宣言と定義を同時に書いてしまうのがいいだろう。
65デフォルトの名無しさん:2005/04/27(水) 17:33:08
コピーコンストラクタの使い方が 未だによくわからん....誰か教えて
66デフォルトの名無しさん:2005/04/27(水) 19:31:30
>>65
FOO a, b;
a = b;

67デフォルトの名無しさん:2005/04/27(水) 19:41:44
>>66
それって使い方じゃないだろ。訳わからんこと書くな
68デフォルトの名無しさん:2005/04/27(水) 19:45:56
>>67
使い方だと思うが。
>66のようなコードを書くと、FOOクラスのコピーコンストラクタが呼ばれるのだから。
69デフォルトの名無しさん:2005/04/27(水) 20:00:24
>>68
66のコードだとコピーコンストラクタは呼ばれず、operator =()が呼ばれる。
用途は同じようなものだけど。
7067:2005/04/27(水) 20:55:29
ごめん間違えた。こっちか。

FOO a;
FOO b = a;

71デフォルトの名無しさん:2005/04/27(水) 22:57:30
FOO a;
FOO b(a);
72デフォルトの名無しさん:2005/04/30(土) 03:06:45
>>69
バカですか?初期化と代入を混同するな。
73デフォルトの名無しさん:2005/04/30(土) 07:38:31
バカの72が来ましたよ。
74デフォルトの名無しさん:2005/04/30(土) 22:05:34
C++でlongjmpを使いたいのですが、
longjmp巻き戻り時にスタック上にあるオブジェクトのデストラクタの起動は
保障されますか?

それともlongjmpよりthrowの方が良いですか?
75デフォルトの名無しさん:2005/04/30(土) 22:09:50
>>74
throwって言いたいけど、なんだか例外と言えなさそうな状況である気配がするな……。
76デフォルトの名無しさん:2005/04/30(土) 22:15:04
メモリリーク回避なら スマートポインタをお勧めしておく。
77デフォルトの名無しさん:2005/04/30(土) 22:17:40
まあ74もそんなことは判ってると思うがね。
おれも昔、C/C++でSchemeの継続みたいなことしたいと思ったけど、
結局再帰は使わず処理の方を自前のスタックに押し込んで管理した。
理由は仕事だったから。
78デフォルトの名無しさん:2005/04/30(土) 22:23:37
>>74
VCはなんかSEHの構造的に保障されてるみたいだけど、
実際は環境・処理系依存っぽい。
どうしても使うならthrowが手段としては安全じゃないかな。
>>77みたいに関数のネスト自体をなくしてしまうという設計の仕方もある。
管理は多少大変だけど確実ではある。
79デフォルトの名無しさん:2005/04/30(土) 22:32:02
ありがとうございます。
とりあえずthrowで作ってみて、時間があったら設計を見直してみます。

一応処理の内容は、ワーカースレッド内でフォルダを再帰的に辿る
処理があって、その途中でGUIからユーザーがキャンセルしたときの
中断をどうするかというものでした。
80デフォルトの名無しさん:2005/05/02(月) 17:17:10
クラスをnewしなくてもよべるメソッドって作れましたっけ?

Delphiで言うClass Functionみたいな。
81デフォルトの名無しさん:2005/05/02(月) 17:19:27
>>80
> クラスをnewしなくてもよべるメソッドって作れましたっけ?
確実に間違った認識をしてるようだけど、たぶんstaticメソッドがそれに該当する。
82デフォルトの名無しさん:2005/05/02(月) 17:22:12
>>81
メソッドと言うな。静的メンバ関数と言え。
83デフォルトの名無しさん:2005/05/03(火) 01:33:43
CからC++へは「移行」すべきものなのかいな。
C言語のプログラム技術は維持しながら、C++というもう一つの技術を学習して、
選択肢を増やすのが正しい道だと思うんだが。
C++の本は、Cのやり方を否定的に書いてるのが多いのが気になるんだが。
そして、まだ完全にCを学んだわけではないのに、C++を学んだからと言って、
あたかもCを卒業したかのように考えるのもおかしいと思うんだが。
84デフォルトの名無しさん:2005/05/03(火) 02:16:15
>76
( ´_ゝ`)スマポ
85デフォルトの名無しさん:2005/05/03(火) 02:31:39
>>83
「Cのやり方」にはより良い代替手段が用意された部分が多い。
・ブロック先頭での未初期化変数定義 → 使用箇所での初期化付き定義
・忘れないように気をつけて初期化、破棄 → コンストラクタ、デストラクタ
・関数ポインタ+void*+キャスト → 仮想関数
・なんでもできる危険なキャスト → 限定的、明示的なキャスト
・型チェックの働かないマクロ → テンプレート
・名前のプリフィックス → 名前空間
・戻り値によるエラーチェック → 例外のスロー、キャッチ
この状況でそれぞれの前者が否定的に見られるのは自然。
C++コンパイラが問題なく動作する環境なら、
これらのより良い手段を使うためにC++に移行するのも自然。

Cによるライブラリを使うためとか、C++が使えない環境でも生きていけるように、
また、C++の仕様に対する理解を深めるためにも、
C言語のプログラム技術を学ぶことには大きな意義がある。

Cを卒業したかのように考えるのはただの勘違い。明らかにおかしい。
86デフォルトの名無しさん:2005/05/03(火) 04:00:19
c/c++ってまとめられるとちょっと困っちゃいますよね。
c++には自信あるけどcには自信なかったり。
87デフォルトの名無しさん:2005/05/03(火) 04:19:41
まぁいまどきstring.hで宣言されてるような危険な関数群の使いかたなんか覚えたくもないわな。
88デフォルトの名無しさん:2005/05/03(火) 04:52:43
>>86
つい最近まで//がCだと思ってた
89デフォルトの名無しさん:2005/05/03(火) 08:07:45
>>88
C99で//も導入されたがな。
90デフォルトの名無しさん:2005/05/03(火) 20:55:26
>>83
とは言え、俺はCを否定したい。
たかが定数やインライン関数ごときに#define使ったり、
classもnamespaceもないから関数名に汚いプリフィックスつけたり、
あんな糞環境は一刻も早く消し去るべきだ。
91デフォルトの名無しさん:2005/05/03(火) 22:32:25
インライン関数にdefine...?
92デフォルトの名無しさん:2005/05/03(火) 23:27:59
>>91
#defineの関数形式マクロのことだろう。
93デフォルトの名無しさん:2005/05/05(木) 16:32:37
>>90
Cにもconstはあったはずだが。
94デフォルトの名無しさん:2005/05/05(木) 20:10:57
>>93
しかし定数ではないから、たとえば配列変数を宣言するときの要素数に使えない。
95デフォルトの名無しさん:2005/05/05(木) 20:17:11
C99だとできなかったっけ?気のせい?
96デフォルトの名無しさん:2005/05/05(木) 21:05:47
可変長配列はどこでも使えるわけではありません。
可変長配列が使えるのは、ブロックの中か関数引数/プロトタイプの中だけで、
グローバル変数として宣言したり、struct や union の中のメンバとして宣言したり
することはできません。加えて、static や extern 付きの配列は、可変長配列に
できません。
97デフォルトの名無しさん:2005/05/05(木) 21:12:41
>>96
それがどうした
98デフォルトの名無しさん:2005/05/05(木) 21:56:43
99デフォルトの名無しさん:2005/05/08(日) 10:00:25
クラス名ってどのようにつけていますか?
やはりC〜とすることが多いのでしょうか?
100デフォルトの名無しさん:2005/05/08(日) 12:37:07
俺はCはつけていない。
関数名みたいに単語の頭を大文字にしているだけ。
101デフォルトの名無しさん:2005/05/08(日) 17:27:42
半角英字の大文字始まりとし、半角英数文字のみで半角英字の大文字区切りとします
102デフォルトの名無しさん:2005/05/09(月) 00:38:14
型は全部〜_t
クラスも〜_t
103デフォルトの名無しさん:2005/05/09(月) 03:10:28
class A
{
 int x;
public:
 void InitX( void ) { x = 0; }
}

というクラスAを,
void func( const A& r ) { r.InitX(); }
と引数で constの参照で取るとA::InitX()が const の関数でないので
エラーになるじゃないですか。この引数を、"const A& r" → "A& r"と変更することなしに
対処する方法はないですか? あくまでも func()が直接 class Aを書き換えるわけではないので
納得いかないんですが。
104デフォルトの名無しさん:2005/05/09(月) 03:14:45
エラーにはならないと思う。
105デフォルトの名無しさん:2005/05/09(月) 03:24:56
>>103
Aと言うクラスの、引き数rとして渡された参照先をInitX()で書き換えるんだからエラーが出て当然。
納得いかないのは学習不足を棚に上げた所為。
106デフォルトの名無しさん:2005/05/09(月) 04:08:56
>>105

「あくまでも func()が直接 class Aを書き換えるわけではないので 」

って書いてんだろ。意味わかんねーのか?
なんでそんな偉そうなわけ?
107デフォルトの名無しさん:2005/05/09(月) 04:12:04
>>105
じゃあついでに質問してやるが、
allocator::construct(pointer p, const T& val)
の実装をせよ。
108107:2005/05/09(月) 04:32:21
質問を取り消します。
どうもすみませんでした。
109105:2005/05/09(月) 04:43:11
「納得いかないのは学習不足を棚に上げた所為。 」なんて放言するのは
自分の学習不足を棚に上げた所為でした。107様には、心よりお詫び申し上げます。
>>108 で成りすましをしてごまかそうとしましたが、自分はなんて卑劣な人間なんだろうかと
今、恥ずかしくて死にたい心境です。これより精進し、allocator::construct
位普通に実装できるような普通のPGにならなければならないと反省しております。

110デフォルトの名無しさん:2005/05/09(月) 04:43:40
>>104
class A {
 int x;
public:
 void InitX( void ) { x = 0; }         // 定義(1):OK
 static void InitXS( const A& r) { x = 0; } // 定義(2):NG(constは変更できない)
};


static void func( const A& r ) {
 r.InitX();  // (1)の呼び出し:NG (たぶんthisはconstであるべきではない)
 r.InitXS(r); // (2)の呼び出し:OK
}

int main() {
 A a;
 const A& ar = a;
 func(ar);
}
111デフォルトの名無しさん:2005/05/09(月) 04:55:25
// (1)の呼び出し:NG (たぶんthisはconstであるべきではない)
とは、class Aのメソッド InitX のシグネーチャが、

  ○ void A:InitX(A& this);

  × void A:InitX(const A& this);

ということ

112デフォルトの名無しさん:2005/05/09(月) 04:56:37
夜食の唐揚うまうま
113デフォルトの名無しさん:2005/05/09(月) 05:13:47
http://YahooBB219169016004.bbtec.net/
wwwwwwwwwwwwおkwwwwwwwwwおkwww
うはっwwwうぇwwwっwwwwww
www
うぇwwwうぇwwwっwっうぇうはっwwwうぇwww
114デフォルトの名無しさん:2005/05/10(火) 04:17:19
なんだ、返事もできねぇ屑か
115デフォルトの名無しさん:2005/05/10(火) 04:21:32
perlでいうCPANみたいなのってC++にはありますか?
116デフォルトの名無しさん:2005/05/10(火) 04:26:14
ない
117デフォルトの名無しさん:2005/05/10(火) 04:59:41
オーバーロード実験

void func(const char* str)
{
 cout <<"const"<<endl;
}
void func(char* str)
{
 cout << "not const" << endl;
}
/*できなかったもの
void func(const char* const str);
void func(char* const str);
*/

int func2(int i)
{
}
//int func2(const int i);はできなかった。
func("moji")ではconstは表示されない。

tukareta・・・おやすみなさい
118デフォルトの名無しさん:2005/05/10(火) 05:18:19
http://dhcp3037.orihime.ne.jp/
wwwwwwwwwwwwwwwwwwwwwwwwっ
wっ
wwwっっうぇwwwっうぇうぇwww
っうぇwww
っwwwwwwwwwwwwwwwwおkwww
119デフォルトの名無しさん:2005/05/11(水) 15:48:59
>>117
void func(const T foo);

void func(T foo);
は呼び出し側にとっては区別がつかないのでオーバーロードできない。
従って同様に、
void func(char * str)とvoid func(char * const str)、
void func(const char * str)とvoid func(const char * const str)
はそれぞれオーバーロードできない。
120デフォルトの名無しさん:2005/06/04(土) 14:34:37
C++約束事が多すぎて
ムズイ・・。
121デフォルトの名無しさん:2005/06/04(土) 14:39:32
まー、憶えることは多岩魚。
いきなり詰め込んでも身にならない。
使ってみて、「あ、これ使うと、こーゆーことができるんだー」ってのに気がつけば習得したといえる。
C++に限らん話。
122デフォルトの名無しさん:2005/06/04(土) 15:33:11
多岩魚?? ・・まあいいか ^^

単純に、構造体をクラスに置き換えればC++だと思って、
軽い気持ちで始めようとしたら、練習本が500ページもありやがる orz

一週間で余裕だぜ!とか思ってた自分が恥ずかしい。。
123デフォルトの名無しさん:2005/06/04(土) 16:50:28
>>122
> 単純に、構造体をクラスに置き換えればC++だと思って
いるうちは恐らくC++は使いこなせない。
Cを構造化言語として使っていたのなら数回の劇的なパラダイムシフトを繰り返して
ようやっとC++の言語としての機能を全部使いこなせるようになるですよ。
一年くらいかけてゆっくりそして確実に行くのが良いかと存ずる。
124デフォルトの名無しさん:2005/06/04(土) 17:54:22
「多岩魚」 = 「おおいわな」かーー!!
っと。

>>123
>使いこなせない・・
そうですか。あぁ orz

取り合えず、500ページ終わらせてみます。
てゆか、500ページ終わる頃には
最初の200ページ分ぐらい完全に忘れてて、
途方にくれる予感もビシビシしてるんですけどねえ。。


現在137ページ。
参照仮引数引渡しとか、、もう全部ポインタ渡しでいいやん (´・ω・`)
125デフォルトの名無しさん:2005/06/04(土) 18:14:09
参照がないと演算子オーバーロードとかをエレガントに実装できんのよ
126デフォルトの名無しさん:2005/06/04(土) 18:32:45
オーバーロードって、関数の多重定義ってやつですよね?
あー、参照となんの関係があるのかわかんねー orz

うへへ、500までがんばりまっす (`・ω・´)
127デフォルトの名無しさん:2005/06/04(土) 19:08:12
>>126
C++やそれより後の言語には演算子オーバーロードというものが存在する。
例えばstd::cout << 〜;というのも<<演算子のオーバーロード。
std::coutはstd::basic_ostreamクラスのオブジェクトであるが、std::basic_ostreamのメンバには
basic_ostream& operator <<(int n);
basic_ostream& operator <<(const char *);
と言った具合に並んでいる。
そしてstd::cout << 5 << "個";という式は(cout << 5) << "個";と解釈されまず5を引数にしてoperator <<が呼ばれる。
この戻り値は元のオブジェクト自身への参照を返すので次にcout << "個"ということになる。
128デフォルトの名無しさん:2005/06/04(土) 19:13:33
>>127
だから、<<出力演算子や>>入力演算子が適用される度に(inlineで
なければ)毎回関数CALLが起きるわけで、ここら辺がCのprintf()、scanf()
に比べて弱点だと言われてるけど、逆に言えば出力(入力)書式はコンパイル時
に既に決定しているので、解析する必要がない。

Cでもprintf/scanfは動作が重い関数の内に入る。C++になって、俺は入出力
が遅くなるという理由で<< >>を使わなかった事はない。
129デフォルトの名無しさん:2005/06/05(日) 13:00:49
>>127-128
>>126です。丁寧な説明感謝です。
とりあえず、

int g_a;
int & func()
{ return g_a; }

ってやって、

main()
{ func() = 10; }

で、func()の返したアドレスの場所に
値が代入できることまではわかったのですが、
これをどううまく使えるのかがわからず・・

私のレベルでは無理なようなので、引き続きお勉強しまっす。
ありがとうございました m(__)m
130デフォルトの名無しさん:2005/06/05(日) 13:30:21
>>129
あと関数の仮引数ではポインタ渡しに比べて呼ぶ側がいちいち変数に&をつける必要がなくなる。
特に今までクラス・構造体のconstポインタ渡しだったものをconst参照にすると、
呼ぶ側も呼ばれる側もポインタ渡しを意識する必要がなく、あたかも組み込み型の値渡しのように扱える。
131デフォルトの名無しさん:2005/06/05(日) 13:34:00
クラス・構造体・組み込み型いずれにも当てはまるけど、
ポインタにはNULLポインタが存在するが、参照にはそのようなものは存在せず、
常に何かを指していると思って扱えるのでいちいちポインタ引数のNULLチェックをする手間も無くせる。
132デフォルトの名無しさん:2005/06/05(日) 14:29:02
>>130-131
なるほど。使う側の混乱をちょっと抑えられるかもですね。

てことは、Cでポインタ渡ししてた場面でも、
C++では参照渡しを積極的に使ったほうがいいんでしょうか?
133デフォルトの名無しさん:2005/06/05(日) 15:48:10
組み込みのポインタ VS 参照 なら、NULLを渡さなくていい時は参照を使うべきだと思う。
ポインタは 参照 と イテレータ っていう2つの役割がごっちゃになってる物だから、ポインタの負担は軽くしてあげたほうがコードが読みやすくもなるはずだ。
実際にはそのうちオブジェクトの所有権とか考え出すとスマートポインタとかを使う場面が多くなると思うので
そんなに気にしなくてもいいと思うけど。
簡単にまとめると「参照で困らないときは参照を使え」だな。
134デフォルトの名無しさん:2005/06/05(日) 20:06:21
>>133
どうもありがとー。
私が今お勉強してる本には、

参照とは、基本的には暗黙的なポインタ定数の事で、実質的には
ほかの変数または引数の別名として使うことができます。
参照仮引数を使う利点として、引数のコピーが作成されない
ということが挙げられます。

と、ありました。
コピーが作成されないってことは、
速度的にも問題なさそうですね。
速度はポインタと同じかな?

うし、これからバリバリ使うことにしまっす (`・ω・´)

スマートポインタとか、イテレータってのは
なんのことかわからずww
135デフォルトの名無しさん:2005/06/05(日) 20:56:01
>>134
ポインタ「定数」ってのはおかしいな。参照は変数だ。

参照は結局内部ではポインタで実装されている.
これは間違っていない。そうでない処理系なんて聞いたことない。
136デフォルトの名無しさん:2005/06/05(日) 20:59:18
参照先を変えられないconstポインタに近いものであるという意味で
ポインタ定数と書いたのではなかろうか
137デフォルトの名無しさん:2005/06/06(月) 11:50:40
double g; で作ったgを
Function(g, 〜) で
void Function(float g ,〜〜〜) の方にワーニングなしで送れるってのはVCの仕様ですか?
138デフォルトの名無しさん:2005/06/06(月) 16:52:45
>>137
警告Lvを上げたら警告されると思うのだが。
139デフォルトの名無しさん:2005/06/07(火) 18:21:05
あー、C++覚えること多い〜 (ToT)
もうコンストラクタとデストラクタは無くていいよ
これがあるせいで、ややこしいこと多すぎー
140デフォルトの名無しさん:2005/06/07(火) 18:44:06
>>139
少なくともコンストラクタ・デストラクタは大したことないと思うけど。
ローカル変数を宣言した or newしたときにコンストラクタが呼ばれて、
ローカル変数のスコープを抜けたとき or newしたポインタに対してdeleteを呼んだときにデストラクタが呼ばれる。
ようするにそんだけでしょ。たった2行。

例えばうまく使った例では
std::auto_ptrクラスはコンストラクタでnewしたポインタを受け取り、デストラクタでdeleteを呼んでくれる。
だからdeleteし忘れによるメモリリークを防ぐ手当てになる。
141デフォルトの名無しさん:2005/06/07(火) 19:19:12
>>140
わかりやすい説明どうもです。

コピーコンストラクタの説明でちょっとキレちゃって ^^
オブジェクトを引数にしたり、
戻り値にして代入しようとしたりすると
呼ばれるとか呼ばれないとか言われて、、あああー!
142デフォルトの名無しさん:2005/06/07(火) 19:21:41
コンストラクタは暗黙の型変換で呼ばれたりするので注意汁
C++ではそのようにしてテンポラリのオブジェクトが作られることも良くある
143デフォルトの名無しさん:2005/06/07(火) 22:17:16
>>141
つまりこういうこと?
class hoge {};

int main()
{
  hoge a, b; //aとbに対してそれぞれコンストラクタが呼ばれる。
  hoge c = a; //cに対してコピーコンストラクタが(aを引数にして)呼ばれる。
  b = a; //bは今ここで変数宣言したわけではないのでコピーコンストラクタは呼ばれない。
} //もちろんここでa, b, cのデストラクタが呼ばれる。
144デフォルトの名無しさん:2005/06/08(水) 16:55:28
>>143
そですね。
あと、
myclass func ();
って関数つくって、
myclass ob1;
ob1 = func();
というふうに戻り値を代入したときとか、

void func (myclass ob);
って宣言して、
myclass ob1;
func(ob1);
てな感じで引数にしたときなんかも
呼ばれるみたいです

まだほかにもありそうだし・・勘弁して欲しいよ。
145デフォルトの名無しさん:2005/06/08(水) 17:09:32
>>144
関数の戻り値は結局143の話と同じ。変数が関数の戻り値に置き換わっただけ。
関数定義の時、仮引数はブロックの頭で宣言された変数という扱いで、そこへ実引数を元にコピーコンストラクタが起こる。
あんまり神経質にならなくてもコピーコンストラクタかoperator =()のどっちかが呼ばれると思っておけばいい。
146デフォルトの名無しさん:2005/06/08(水) 17:47:29
>>145
どもです。
実際使い始めたら、後からクラスに付け足した変数とか
コピーコンストラクタに入れ忘れたりしそうで怖いよお。

operatorってのは、まだお勉強中なのでわかりません。
そこまで行ったら、また違う景色が見えるのだろうか。
147デフォルトの名無しさん:2005/06/08(水) 17:59:46
>>146
operator =()ってのは>>143-144の例でコピーコンストラクタが呼ばれないときに呼ばれる関数。
そのうち出てくると思うけど。
148デフォルトの名無しさん:2005/06/09(木) 01:10:36
最初のころから出てくる<<もoperatorじゃないの?
149デフォルトの名無しさん:2005/06/09(木) 05:53:44
>>148
勿論operatorですとも。
150デフォルトの名無しさん:2005/06/09(木) 21:09:17
>>149 どうもです。
151デフォルトの名無しさん:2005/06/10(金) 17:50:43
演算子のオーバーロードまで キタ━(゚∀゚)━!!!!!

>>127さんの書き込みが、やっと少しだけ理解できるようになったよー。
てゆか、こんなん自分で定義しまくったら、組んだ人以外
ワケワカメになりそうだけどなあ。
152デフォルトの名無しさん:2005/06/10(金) 22:59:59
>>151
うまく使えば便利。
例えば文字列クラスに+=や+とか不等号演算子での比較
複素数や多倍長整数に四則演算など、配列クラスに[]
リストの全要素へのアクセスにポインタっぽく演算子をオーバーロードしたクラスを使ったり
153デフォルトの名無しさん:2005/06/11(土) 00:57:57
便利だからといって、文字列クラスに-オペレータとか/オペレータとかで
抽出とか分割をやり始めると自分でも混乱する羽目に陥る罠。
154デフォルトの名無しさん:2005/06/11(土) 01:03:43
まあなんだ、いらんのなら別に演算子オーバーロードを使う必要はない訳だが

1) operator=はデフォルトで作られてしまうから、その動作でまずい場合は
正しい実装をするか、単にprivateにする

2) STLなどのテンプレートライブラリでクラスを使う場合、特定のoperatorの
存在が必要になる場合がある

ってとこかな。
155デフォルトの名無しさん:2005/06/11(土) 20:03:24
わけわかんなくなりそうっていうか、
何でもやっちゃうクラスやら
何でもできちゃうインターフェイス(プロトコルクラス)を作ったら
実際、わけわかんなくなる。
クラスの役割と責任をしっかり考えて分離すれば問題ない。
156デフォルトの名無しさん:2005/06/11(土) 20:53:46
質問です。
int func(string& str)やfunc(string str)に対して、
func(string("str"))は通るのですが、
func(int i, string& str)やfunc(int i,string str)に
対して同様のことを行うと
func(int,string)に相当する関数が見つからない
という感じのエラーが出てしまいます。
理由がわかりません。

それから、これ( class名+() )の名称か何かを見かけ
た気がするのですが、メモとり忘れてて、調べように
も調べることができません。

よろしくお願いします。
157デフォルトの名無しさん:2005/06/11(土) 23:35:47
>>156
エラーになったコードを見せてくれないと答えようがない。

型名()ってのは一時オブジェクト作成とか関数スタイルキャストとかコンストラクタ呼び出しなどと言われる。
クラスに限らず、intなどの組み込み型や構造体などにも使える。
158デフォルトの名無しさん:2005/06/12(日) 00:25:21
その前に、
int func(string& str);
に、func(string("str")); は通らん。右辺値じゃないか。
159デフォルトの名無しさん:2005/06/12(日) 00:39:38
VC++だと通っちゃうんだよね、それ
VC++の独自拡張だけど
160デフォルトの名無しさん:2005/06/12(日) 00:43:19
へえ、通るんだ。でも、一時オブジェクトを参照引数に渡したら、ユーザの
想定外の挙動になるよな
まあ本来const リファレンスにすべきものであったなら、問題は
なかろうが。
161デフォルトの名無しさん:2005/06/12(日) 01:39:59
結果を捨てるだけだから問題ないっしょ。
162デフォルトの名無しさん:2005/06/12(日) 11:59:24
>>161
long& に値を返す関数に int 変数を渡したときとか、死ねる予感。
163デフォルトの名無しさん:2005/06/12(日) 16:39:18
ダメだこりゃ
164デフォルトの名無しさん:2005/06/12(日) 20:47:40
皆さん有り難うございます。(遅くなってすいません)
えーと、、、何故かエラーが再現不能になりました。
本当にすいません。

BCB5を使用しているのですが、
string func(string& a, string& b){a+=b;b+=a;return b;}
に対して
cout << func(string("ma"),string("to")) << endl;
cout << func("111","222") << endl;
としても、「一時変数を作成する」という警告(多分string)が二つだけで
通るようです。
これはやはり問題有りなのでしょうか。
165デフォルトの名無しさん:2005/06/12(日) 20:57:41
>>164
string c = "ho", d = "ge";
func(c, d);
こういう風にでもすれば実引数が書き換えられているのを確かめられるが、
164コードではにするとそれができないという警告。規格でも駄目ということになっているし。
166デフォルトの名無しさん:2005/06/12(日) 21:00:35
>>164
標準に準拠したコンパイラでエラーになるという問題が有る。
167デフォルトの名無しさん:2005/06/12(日) 21:37:18
>>165-166
結局のところ164のように書くべきではないみたいですね。
有り難うございました。
168デフォルトの名無しさん:2005/06/14(火) 14:19:22
>>151 です。いまだに演算子のオーバーロードをやってるのですが、

文字列の連結やコピーをする↓のクラスをつくってみました。
http://www.vipper.org/vip30009.txt

operator += はたぶんできたのですが、
operator + のとこで悩んでいます。

cStrType & cStrType::operator + (const cStrType &ob)
{
cStrType temp;

strcat(str, ob,str) // 文字くっつける
strcpy(temp.str, str); // くっつけた文字をtempに入れる


return temp;
}

↑みたいにやりたかったのですが、
cStrTypeクラスには、文字列がもう一個あって、
それはオブジェクト自体の名前が入ってるんです。
↑のようにtempを返してしまうと、代入先のオブジェクトの名前が
変更されてしまうのですが、
こういう場合はどうすればいいんでしょうか?

わかりにくいプログラムですみませんが、どなたかお願いします m(__)m
169デフォルトの名無しさん:2005/06/14(火) 18:16:28
>168
ソースはよく見てないが、 += が出来たのなら

cStrType & cStrType::operator + (const cStrType &ob) {
  return cStrType(*this) += ob;
}

でいいような気がする。
ソースを見たらコピーコンストラクタ無かったっぽいから、それを定義するか、
  cStrType tmp;
  tmp = *this;
  tmp += ob;
  return tmp;
だな。
+ と += みたいなのは1つ定義したらそれを使って他を定義するのが基本だと思う。
170デフォルトの名無しさん:2005/06/14(火) 18:21:21
間違えたというか見落としてたが、
operator + が返すのは参照じゃなくて実体だから、
戻り値の型は cStrType& じゃなく cStrType な。
171デフォルトの名無しさん:2005/06/14(火) 18:29:14
operator +()を>>169のように実装するのは定石だよ。
operator !=をoperator ==の戻り値を ! で反転させて作るのもよくやる。
172168:2005/06/14(火) 19:25:55
>>169-171
おー、それは楽ちんな感じですね。
似たやつは即利用できるのか。

ちょっと質問とはかけはなれてるっぽいんですが、
凄い便利そうなので、明日あたり>>168のを簡略化して、
>>169-171を組み込んでみまっす!


クラスって、自分で始めて本とか極力見ないで組んでみたんですが、
普通の構造体とかと違って、作る前に考えなくちゃ
いい動きするヤツはできないっぽいですね。。

>>168のを作ってる途中、何回か破綻して、
つくり直しましたよ ^^
あー、早く使いこなせるようになりたい。

れすさんくすです。
173168:2005/06/15(水) 18:07:05
できました。
モロ>>169と一緒になっちゃったんですが
http://www.vipper.org/vip31149.txt
どもです m(__)m

それで、あの、ちょっと質問なんですが、
return cStrType(*this) += ob;
↑でもいけるようなのですが、
これはなにをやってるんでしょうか?

return *this += ob;
↑だと *this の値にも影響を与えちゃうんでダメなのですが、

return cStrType(*this) += ob;
↑だとOKってことは、、、、、なんだろ??
174デフォルトの名無しさん:2005/06/15(水) 18:15:23
>>173
cStrType(*this)でオブジェクトを生成している。
175デフォルトの名無しさん:2005/06/15(水) 18:20:01
お、即レスさんくすです。

return cStrType temp = *this += ob;

みたいな感じなんでしょか?
うーん、新しい。
176デフォルトの名無しさん:2005/06/15(水) 18:26:01
>>175
微妙に違う。それでは*thisが変更されてしまう。
むしろ、
cStrType temp = *this;
temp += ob;
return temp;
177デフォルトの名無しさん:2005/06/15(水) 18:30:20
>>176
あー、そっか ^^
でも、変数名すら決めてないオブジェクトが
返るなんて、不思議っちゅーか、便利っちゅーか

使いこなせる自信はないですな・・。
178デフォルトの名無しさん:2005/06/15(水) 18:53:02
>>177
podと同じように考えたら?
ex.
double func(int v) {return double(v);}
179デフォルトの名無しさん:2005/06/15(水) 19:15:12
あー、その記述のしかたも初めて見ました。
型キャストとも違いますよね return (double)v
普通のC言語からあったんでしょうか。

pod と ex. ってのも、意味不明なんですけど (T_T)
180デフォルトの名無しさん:2005/06/15(水) 19:34:03
>>179
・POD
as Plain-Old-Data
ttp://www.informit.com/guides/content.asp?g=cplusplus&seqNum=32
・ex.
=for example.
181デフォルトの名無しさん:2005/06/15(水) 19:45:14
>>180
ご親切に、どもです。
ex.の方は把握。
plain old data の方は、
なんとか日本の解説ページを探してみます。
お手数をかけてしまって、マジすみません orz
182デフォルトの名無しさん:2005/06/15(水) 20:23:42
#include<stdio.h>
void main(void)
{
  while(1)
    printf("ぬるぽ\n");
}
183デフォルトの名無しさん:2005/06/15(水) 21:06:29
>>5
これの1番はどうして?
184デフォルトの名無しさん:2005/06/15(水) 21:07:58
>>183
全部先頭で宣言してたら発狂しそうになって困るだろ
185デフォルトの名無しさん:2005/06/15(水) 21:12:15
>>184
途中で宣言すると「iって宣言したっけなぁ」とか分かんなくなるので、
先頭で宣言すること多いんだけど、明確な理由があればスタイルを
変えようと思っております。(そもそもそんな長い関数書くなは置いと
いて)
186デフォルトの名無しさん:2005/06/15(水) 21:32:23
void f(bool flag)
{
if(!flag)
return;
socket x("127.0.0.1, 80); // 先頭においても初期化に時間がかかるが全くつかわれない
vector<string> y(10000); // これも重い
}

すべて先頭で宣言すると、重いクラスやら、時間食うクラスなんかの不必要な
初期化コストがかかってしまい、宣言しても使わないのなら無意味に重くなるのだそうな。
187デフォルトの名無しさん:2005/06/15(水) 21:39:27
>>181
PODはようするにCでもそのまま使える構造体・クラス・共用体のこと。
参照型メンバ変数・operator =()・デストラクタ・非PODメンバ変数の存在しない構造体・クラス・共用体が該当する。
188デフォルトの名無しさん:2005/06/15(水) 23:43:38
>>185
先頭で宣言するスタイルを C++ で貫こうとすると、
・初期化をしないことが珍しくなくなるので、初期化忘れの危険が増える。
・コンストラクタで重要な処理を行うクラスが扱いにくくなる。
・クラス作成時に意味無くデフォルトコンストラクタが要求される。
・初期値が決まったタイミングで「代入」が必要になるので、
 ・「代入」できない型では通用しない。
 ・ローカル変数に const を付けることが不可能になる。

デメリットしかないな。
189デフォルトの名無しさん:2005/06/16(木) 12:21:20
クラスについて質問させて下さい
#include "CMyChar.h"

class CMyWeapon
{
public:
CMyWeapon();//コンストラクタ
virtual ~CMyWeapon();//デストラクタ

void Init();/●初期化●
void Process(CMyChar* pMyChar);//★メイン処理★
};
このProcessで [error C2061: 構文エラー : 識別子 'CMyChar' がシンタックスエラーを起こしました。]
となってしまいます。
includeしてますし・・構造体のようには使えないんでしょうか?
ちなみに参照を使っても同じエラーが出ます
レスをよろしくお願いします
190デフォルトの名無しさん:2005/06/16(木) 12:36:05
>>189
CMyChar.hを晒せ。
191デフォルトの名無しさん:2005/06/16(木) 12:36:40
>>189
>void Init();/●初期化●
これは何かの冗談か?
192189:2005/06/16(木) 12:42:40
>>190
#include <d3d9.h>
#include <d3dx9.h>

#include "Global.h"
#include "CMyWeapon.h"

class CMyChar
{
private:
int w;//キャラ幅
int h;//キャラ高さ
public:
float x;//自キャラ 左上座標 X
float y;//自キャラ 左上座標 Y
float vy;//VX
float vx;//VY
〜変数宣言が続きます〜
CMyChar(float xpos,float ypos,float vecx,float vecy,int width,int height,int tex,int tey);
virtual ~CMyChar();

void Init();//●初期化●
void Process();//★メイン処理★
void Move();//移動と移動の制限
void Scroll();//スクロール管理
〜以下関数が続きます〜
};
です privateをpublicにしてみましたが同じエラーが出ました

>>191 すいません /を1個削りすぎましたw
193デフォルトの名無しさん:2005/06/16(木) 12:52:26
>>192
> #include "CMyWeapon.h"
これだろ。要らないなら消せ。
194189:2005/06/16(木) 12:55:46
ありがとうございます!!通りました!
前にincludeしたのをそのままにしてました・・・スレ汚しすいませんでした
195デフォルトの名無しさん:2005/06/16(木) 19:41:59
>>194
(今回のとはちょっとずれるが)
VC使いなら#pragma once使え。
使う理由も考えてな。
196189:2005/06/16(木) 20:00:08
はい 使ってます 
クラスはいつも右クリしてクラスを作成してますのでデフォルトでついてます。
197デフォルトの名無しさん:2005/06/16(木) 22:01:52
なるほどIDEに甘やかされて育つとこうなるのか
198データボックス:2005/06/17(金) 01:11:22
しかし、関数の先頭で変数を宣言をしないプログラムなんか、だらしのない書き方
のような気もする。そして、初期化忘れの危険もあるかも知れないが、そこらへん
は、しっかりしていて不注意を犯さない人間であるという前提でコーディングでき
るようでないとだめじゃないかとも思うし。
VBは手続きや関数の先頭以外でも宣言できるのは知ってるが、先頭でしか宣言した
ことがない。

また、その一方で、Cでは関数の先頭で変数の宣言をしているものばかりで、関数より
も内側のブロック内の先頭で宣言するのは、あまり一般的ではないようで、俺自身は
まだそういうソースコードを目にしたことはない。メモリやパフォーマンスで問題
になるときなど、場合によっては、それを使わない手はないと思うが、世の中には、
ちゃんとそういうソースコードもあるのかな。
199デフォルトの名無しさん:2005/06/17(金) 01:23:07
>>198
>>188をちゃんと読んだのか?「だらしない」とかそういう問題じゃないんだよ
C++では。

コンストラクタというものが存在しないCのような言語では関係のない話だがな。
200データボックス:2005/06/17(金) 01:38:42
まあ俺はポインタを宣言して、newとdeleteしてるけどな。
201デフォルトの名無しさん:2005/06/17(金) 01:55:34
>>200
そういうコードは例外安全じゃないんで現在のC++プログラミングでは
推奨されない。
202デフォルトの名無しさん:2005/06/17(金) 01:57:14
>>200 バカジャネーノ
203デフォルトの名無しさん:2005/06/17(金) 01:58:31
>>201
「newとdeleteしてる」だけで「例外安全じゃない」と言えるの?
204デフォルトの名無しさん:2005/06/17(金) 02:09:05
>>203
まあ言えないかもしれないわなあ
*大抵は*例外安全じゃないけど
205デフォルトの名無しさん:2005/06/17(金) 02:11:30
>>198
Cでブロック内部での変数定義を余り見掛けないのは、まさしくあんたみたいな技術者が多いから。
ましてCommonCの時代の人間は変数の使い回しも含めて、まさにマクロアセンブラ的に書く。
逆に、C++慣れしているプログラマはCでもブロック内で定義している。
206デフォルトの名無しさん:2005/06/17(金) 11:50:29
>>205
ブロック内定義はソースの見通しという意味でも漏れもCであっても積極的に使っているけど、
使いまわし変数の不要な文脈依存性が減って
オプティマイズもかかりやすくなるような気がするがどうなんだろう。
207205:2005/06/17(金) 12:24:52
>>206
私もそう思う。昔のコンパイラの例だが、レジスタへの割り当て方が随分違った記憶がある。
208デフォルトの名無しさん:2005/06/17(金) 14:57:20
すいません、最近c++を勉強し始めたのですが
クラスを使うメリットがよくわかりません。誰かわかりやすく教えてくださいお願いします
209デフォルトの名無しさん:2005/06/17(金) 15:08:26
int i;
int arr[10000];

for(i=0;i<10000;i++){
  int *p=&arr[i];

}
こんなのはどうなんだろ。最適化してくれるのかな
210デフォルトの名無しさん:2005/06/17(金) 15:18:33
>>209
一番エキセントリックな最適化をさせると、おおよそ次のようなコードと同等に最適化すると思われ。
int i = 10000;
int arr[10000];
211デフォルトの名無しさん:2005/06/17(金) 15:22:58
>>210
すまん例が悪かった

int i;
int arr[10000];

for(i=0;i<10000;i++){
  int *p=&arr[i];
 dosomething(p);
}
とした時にループする毎にint *pをスタックにpushして使い終わったらpopして・・
とかバカ正直にしないだろうなと思って
やっぱり関数入り口でいっぺんに確保して使いまわすのかなとか
212208:2005/06/17(金) 15:45:39
誰かさっさと教えてください
213デフォルトの名無しさん:2005/06/17(金) 16:01:14
変数の使い回しって・・・それがタブーでない人がいるのか
214デフォルトの名無しさん:2005/06/17(金) 16:09:10
>>212
ヒント:オブジェクト指向プログラミング

調べてもなおメリットが感じられないのならば、Cを使い続けろ。
215208:2005/06/17(金) 16:13:17
オブジェクトっつーかただ何の変数使ってるかわかりやすくなるだけだろ。
調べても、とかほざいてるあたりお前はただ適当に使ってるだけなんだろうな
216デフォルトの名無しさん:2005/06/17(金) 16:19:11
>>215
情報(この場合はおまいの理解)小出しにするなよ、アフォ。
何が分からないのか書かない限り答えられねーだろ。

おまいの理解が「ただ何の変数使ってるか分かりやすくなるだけ」
程度のものだったら、なおさら「オブジェクト指向」とは何たるかを勉強しろボケ。
217デフォルトの名無しさん:2005/06/17(金) 16:20:02
結局のところ、効率を取るか安全を取るかって話で、
多くの人はデフォルトで安全をとる。それだけのことじゃん。
218208:2005/06/17(金) 16:25:22
>>216
うるせぇよバーカ
219208:2005/06/17(金) 16:28:01
結局は「自分で調べろや」そこら辺に書いてある受け売りのように「オブジェクト指向勉強しろ」だもんなwwwwwww
ちゃんちゃら可笑しいぜwwwwwww結局はお前が一番理解してないから説明できないだけだろうがwwwwwカスがでしゃばんなよタコ
220デフォルトの名無しさん:2005/06/17(金) 16:31:51
晒し上げ
221デフォルトの名無しさん:2005/06/17(金) 16:33:51
>>211
コンパイラは一般的に、ブロック内変数を関数ローカルのスタックに確保する。
但し、レジスタで事が足りたり最適化で消える場合はその限りではない。
そのロジックではループ部は恐らく、
for (i = 0; i < 10000; ++i) {
dosomehing(& arr[i]);
}
と同等のコードになる。

いずれにしても、ブロックの出入りでスタック操作することはない。

>>213
10年以上制御系に携わってきた人のC++のコードの実例(抜粋)
for (char * tret = (char *) -1; tret != NULL; i++) {
tret = fgets(..., fp);
...;
if (...) {
tret = NULL;
}
}
...;
if (...) {
tret = (char *) -1;
}
...;
if (tret == NULL) {
...;
}


>208=>215なら釣りか。
222208:2005/06/17(金) 16:40:50
まぁ馬鹿が説明できないから釣りとしかいいようがないか。所詮このスレの資質はこんなもんよな
223221=210:2005/06/17(金) 16:45:59
>221
あー、forループのブロックの位置がおかしい気がする。
まぁ、適当に。

>>222
そのスレの資質未満が何言ってんだか。
224208:2005/06/17(金) 16:54:09
わざわざ数字コテにして自分の存在をアピールしても
他と同様、カスであることに変わりはないんだから無理すんなwww
225デフォルトの名無しさん:2005/06/17(金) 17:02:14
208さん、あとはこちらでどうぞ。

http://pc8.2ch.net/test/read.cgi/tech/1118072681/l50
226デフォルトの名無しさん:2005/06/17(金) 17:09:50
>>223
>>221はとてもC++のコードには見えないなぁ。
fgets()はいいとしても、Cスタイルのキャストとか。

そもそもまともなC++コンパイラだと>>221はコンパイル通らないよね。
(forブロックの位置が違うというのはそのこと?)

というか、このソース晒しのポイントはどこにありまつか?
227デフォルトの名無しさん:2005/06/17(金) 17:37:07
なんつーか宗教戦争してますね。
いい加減余所でやってくれんかな…。
228デフォルトの名無しさん:2005/06/17(金) 17:47:40
>>226
>221のfor以下のコード全体がforブロックね。
で、ループ継続条件はそれようにbool変数でも用意すればいいのに
わざわざここまでポインタ変数使い回す辺りが気色悪いと言う話。
#char *に-1を代入するなんてねぇ。
229デフォルトの名無しさん:2005/06/17(金) 19:55:31
すみません。
Cのスレからやってきました。
suffixarrayのC++Verなのだそうですが
C++が少ししか分かりません。
どなたかCに書き換えていただけませんでしょうか

vector<int> make_suffixarray(const string& str) {
 vector< pair<string, int> > v;
 for (int i = 0; i < str.size(); ++i)
  v.push_back(pair<string, int>(str.substr(i), i));
 sort(v.begin(), v.end()); // sort by first elements

 vector<int> suffixarray;
 for (int i = 0; i < v.size(); ++i)
  suffixarray.push_back(v[i].second);
 return suffixarray;
}
230デフォルトの名無しさん:2005/06/17(金) 20:11:26
>>229
むずかしいからやだ
231デフォルトの名無しさん:2005/06/17(金) 20:16:45
>>229

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct pair { const char *s; int n; };

int cmp(const void *a, const void *b)
{
    const struct pair *aa = a;
    const struct pair *bb = b;
    return strcmp(aa->s, bb->s);
}

size_t make_suffixarray(const char *str, int *array)
{
    size_t i;
    size_t len = strlen(str);
    struct pair *holder = malloc(sizeof(struct pair) * len);
    
    for (i = 0; i < len; ++i) {
        holder[i].s = str + i;
        holder[i].n = i;
    }
    qsort(holder, len, sizeof(struct pair), cmp);
    for (i = 0; i < len; ++i)
        array[i] = holder[i].n;
    free(holder);
    return len;
}
232デフォルトの名無しさん:2005/06/17(金) 20:17:43
>>231
ありがとうございます。
勉強したいと思います
233デフォルトの名無しさん:2005/06/18(土) 01:50:44
クラスの定義の中に関数の実体を直接書くとインライン関数になるそうですがクラス定義の外に関数の実体を書いたときにインライン関数にするにはどうすればいいのでしょうか
234デフォルトの名無しさん:2005/06/18(土) 01:59:18
inlineでいいんじゃね?
235233:2005/06/18(土) 02:10:48
>>234
その場合クラス定義の中身のみ 関数の実体部のみ 両方 のどれでしょうか?
全て試したのですがどれもエラーも警告も出なかったのでどれが正しいのか分からなくなりました
236デフォルトの名無しさん:2005/06/18(土) 06:25:27
ちょっと上の最適化の話もそうだが、
なぜ、コンパイルされた後どういうコードになってるか調べないかの〜。
IDE上だと.sファイル作らないからかの〜。
ちょっと年取りすぎたかの〜。
237デフォルトの名無しさん:2005/06/18(土) 07:06:42
>>236
読めないんだよ、きっと。
VC++だってプロジェクトの設定などで設定できるんだけどね。

>>233
inline指定はヒントにしかならないので要注意。
#確かbccだと「インラインにできない」警告が出たと思うが。
238デフォルトの名無しさん:2005/06/18(土) 08:55:19
>>237
BCCのinlineにできない警告はメンバ関数を外に書くだけでは出ない。
繰り返しとかswitchとかクラスなどを値渡ししたりとかそういうことをすると出てくるものだったはず。
239237:2005/06/18(土) 09:18:57
言葉足らずだった。
ヒントにしかならないから、inline化できないことがある。
ということで。
240デフォルトの名無しさん:2005/06/18(土) 12:03:56
>236
ある特定の環境下での実際問題な話だけなら良いが、
言語自体について語るなら、それじゃ困るって事じゃねーの?
さすがに必要ならやれる人だっているだろ。
241デフォルトの名無しさん:2005/06/18(土) 12:13:35
>>240
言語自体について語るなら、inlineキーワードはただのヒントであって
実際にインライン化されるかどうかは実装系による、ということで
終了な訳だが。
242デフォルトの名無しさん:2005/06/18(土) 12:19:10
>>241
それが>>233に対する答えになるわけ無いだろ。
243デフォルトの名無しさん:2005/06/18(土) 12:21:11
同じ関数でも場所によって
インライン呼び出しされたりされなかったりするから、
全ての読み出し箇所を調べる必要がある。
244デフォルトの名無しさん:2005/06/18(土) 12:27:02
>>235
どれでも間違いじゃない。ただ、両方に書くのは冗長。

インライン関数であるかどうかが実装の詳細である
という見方をすれば、宣言に書かずに定義に書くのがいいだろう。
逆にインライン関数であることが重要なのであれば、宣言に書くことも考えられる。
後者の場合はクラス定義内で関数定義することで済ませるのが一般的。
245デフォルトの名無しさん:2005/06/18(土) 17:40:43
1つの関数の呼び出しに、同じ inline 関数を複数回使ったときに
その inline 関数が static なデータを使っているときに、おかしな答になるので要注意
bc は、そんな inline 関数は inline にはしないのでだいじょうぶなのだが。。
vc は自分で注意する必要あり。
246デフォルトの名無しさん:2005/06/19(日) 00:05:03
質問です。
引数iが0以外のときはファイルに文字を出力したいのですが、
あまりいいのが思いつきません。

bool func(int i=0){
ostream * const out = (i)? new ofstream("out.txt"):&cout;
/*ファイル開く失敗の処理がわからない*/
if (ファイル開けない) return false;

文字とかを出力したりする。
*out << .....

if (out!=&cout) delete out;//この部分が見苦しい気がする。
return true;
}
それと、
new ofstream(1)とかできるものもあるようですが、この場合
デリートしても大丈夫なのでしょうか。
お願いします。
247デフォルトの名無しさん:2005/06/19(日) 00:15:14
>>246
引数をstd::ostream&で受けるようにしたらどう?
あとファイルオープンが失敗したかどうかにはgood()がある。
248デフォルトの名無しさん:2005/06/19(日) 01:00:50
参照の配列が宣言できないってことは・・・関数に渡す時はポインタにしてループさせないといけないんですか?
249デフォルトの名無しさん:2005/06/19(日) 02:19:30
>>247
レス有り難うございます。試してみました。
bool func(const string& str=string("no string"),ostream& out=fstream("out.txt"))
{
if (out.good())
{
out <<str << endl;
}
else{cerr << "ふあいるあかない"<< endl;return false;}
return true;
}
こんな感じでよいのでしょうか。
それと!fstreamというのを見つけました。これはgood()とほぼ同じなのでしょうか。
bad()というのがあるようですが、good()と反対の機能でしょうか。
(fstream(1)としてファイルに出力する場合のみclose()してopen("out.txt")したかったの
ですが、これはうまくいきませんでした。)
250デフォルトの名無しさん:2005/06/19(日) 04:01:54
>>248
参照の配列はないけれど配列の参照はある
251デフォルトの名無しさん:2005/06/19(日) 04:27:51
3重ポインタを使い、熱伝導方程式を解こうと思いました
5×5×5の立方体型配列のうち、表面にある要素は1.0、
内側にある要素は0.0として、適当なアルゴリズムに従い
内側に熱が伝わっていくようなものです。

それで、まずC言語で
int i,j,k;
int count=0;
double a[5][5][5];
double ***s;

s= (double***)malloc(125*sizeof(double**));
for(i=0;i<5;i++)
{
s[i]=(double**)malloc(25*sizeof(double*));
for(j=0;j<5;j++)
{
s[i][j]=(double*)malloc(5*sizeof(double));
for(k=0;k<5;k++)
{
if(i==0 || j==0 || k==0 || i==4 || j==4 || k==4)
{
s[i][j][k]=a[i][j][k];
}
}
}
}
などとして、sを計算結果を一時的に溜める配列にするのは成功しました
252251:2005/06/19(日) 04:31:54
しかしその真似をして、C++で
int i,j,k;
double a[5][5][5];
double ***s;
double ***s=new double **[5];

for(i=0;i<5;i++)
{
double **s=new double*[5];
for(j=0;j<5;j++)
{
double *s=new double[5];
}
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
for(k=0;k<5;k++)
{
if(i==0 || j==0 || k==0 || i==4 || j==4 || k==4)
{
s[i][j][k]=a[i][j][k];
}
}
}
}
などとしても、最初のdouble *s=new double[5];の部分で「sに代入した値は使われない」
というエラーが出てしまいます
253251:2005/06/19(日) 04:33:56
最初のmallocではどうにか動いたので、C++でもやるかと思って
同じ形式で作ったら動かずショックでした。
2重ポインタまでは参考資料を見ながらCでもC++でも
出来たのですが、3重ポインタをC++で使う段階で困っております

どのようにして解決できるでしょうか。ご教示お願いします
254デフォルトの名無しさん:2005/06/19(日) 05:23:59
よく分からんが、固定サイズの配列であるのなら、なぜわざわざ
動的に確保するの?
255デフォルトの名無しさん:2005/06/19(日) 06:35:36
ブロック内宣言は
256デフォルトの名無しさん:2005/06/19(日) 07:59:53
>>252
それじゃC++とCとでまったく別物になっているが……。
あとなぜ125個やら25個も確保しているのかわからん。
s= (double***)malloc(5*sizeof(double**)); → s = new double **[5];
s[i]=(double**)malloc(5*sizeof(double*)); → s[i] = new double *[5];
s[i][j]=(double*)malloc(5*sizeof(double)); → s[i][j] = new double[5];
257251:2005/06/19(日) 09:03:09
>>256さん、無事動くようになりました。
本当にありがとうございました。助かりました
258デフォルトの名無しさん:2005/06/19(日) 13:18:02
仮想関数で陥りやすい罠なんかを紹介しているサイトはないですかね?
まさに今自分がハマったっぽくて、
ソースをうpしたいところなんですけど、ちょっと長いんで。。。
259デフォルトの名無しさん:2005/06/19(日) 13:25:39
>>258
ソースを詰めるいい訓練だと思って。
つーか、案外その過程で罠が見つかるかも知れんし。
260258:2005/06/19(日) 13:50:08
事故解決しますた。
ハマってた問題は、
派生クラスの仮想関数は問題なく呼べるのに、
基底クラスの仮想関数を呼ぶとAccess Violation、
というものだったのですが、
基底クラスのコンストラクタの
memset(this,0,sizeof(*this));
が原因ですた。
classって謎のメンバ変数を勝手に付け加えるんですね。
自分で定義したメンバ変数はint型のが5つで20バイトのはずなのに、
sizeof(*this)が24バイトなんですもの。
C++訳わかんね。('A` )
あ、>>259さんありがとう。
261デフォルトの名無しさん:2005/06/19(日) 13:51:49
>>260
memset はいかんね。
vtable でも知れば、納得できるようにはなるだろう。
262デフォルトの名無しさん:2005/06/19(日) 14:08:03
void CEnemy::Init()
{
for(int i=0; i<MAX_ENEMY; i++)
{
x = 100+i*20.0f  //とりえあえずずらして表示;
y = 100+i*20.0f; //同上
w = 64;
h = 64;
tx = 0;
ty = 0;
//pEnemy++; のような感じで次の番号に行きたい
}
}
っていうのは
void CEnemy::Init(CEnemy* pEnemy)
{
for(int i=0; i<MAX_ENEMY; i++)
{
pEnemy->x = 100+i*50.0f;
pEnemy->y = 100+i*50.0f;
pEnemy->w = 64;
pEnemy->h = 64;
pEnemy->tx = 0;
pEnemy->ty = 0;
pEnemy->fAct = ACT;
pEnemy++;//次の番号に行きたい
}
}
こうするしかないんでしょうか? ++とかで配列の次の番地にアクセスできないんですかね?
263デフォルトの名無しさん:2005/06/19(日) 14:11:48
>>262
配列なら ++ で次の要素にアクセスできるよ。配列ならね。
264デフォルトの名無しさん:2005/06/19(日) 14:18:55
newで確保したのを「配列のように」使ってる場合も ++; で次の要素にアクセスできるんですか?
265デフォルトの名無しさん:2005/06/19(日) 14:37:34
>>264
確保した個数を越えなければ別に問題はないだろうけど、クラス設計としてはなんだかなぁ……
266デフォルトの名無しさん:2005/06/19(日) 14:39:18
>>264
「配列のように」なんて曖昧な言い方されても意味がわからん。
配列を new で確保したのなら大丈夫。
267262:2005/06/19(日) 14:43:46
>>265 是非クラス設計の仕方を教えて頂きたい・・・
>>266 すいません そうですね
268デフォルトの名無しさん:2005/06/19(日) 14:46:28
>>267
単純な話。
CEnemyが敵個体を表すクラスならば、そのメンバであるInit()はそのメンバ変数を初期化するに留めるのが普通の発想。
269デフォルトの名無しさん:2005/06/19(日) 14:47:19
関数に渡すなら
・配列とそのサイズを引数で渡す
・サイズをメンバに持たせたクラスをつくる
・STLのコンテナを使う
270デフォルトの名無しさん:2005/06/19(日) 14:47:27
>>267
何がしたいのかわからないと、設計なんかできませんよ。
自分以外の人が読むことを考えて書き込みましょう。
271262:2005/06/19(日) 15:03:00
>>270 CEnemy* pEnemy = new CEnemy[MAX_ENEMY]; で宣言して
BOOL Initialize(HINSTANCE hInst,HWND hWnd,CMyChar& rMyChar,CMyWeapon& rMyWeapon, CEnemy* pEnemy)
に送り そこから pEnemy->Init();か pEnemy->Init(pEnemy); で初期化をしようとしています
全てを初期化するには・・・ 中でループを回そうと思ってるんです
そこで・・・ pEnemy->Init();の場合だと 次の要素にアクセスできない?ので困ってます
272デフォルトの名無しさん:2005/06/19(日) 15:08:50
アホかい。

敵複数を初期化する関数から、個別に初期化する関数を呼ぶって発想はできないんか?

もう少し突き詰めて考えてみよう。
どうやらInit()で書いていることから察するに、敵個体間には初期状態で一定の間隔を置いて配置したいのだろう?
それは、敵個体の特性か? それとも敵複数の特性か?
#或いはフィールドの特性の可能性もありそうだが。
それを敵個体の特性と位置付けてしまうと、敵の配置を変えた新しいフィールドを作るたびに設計変更になるぞ。
273デフォルトの名無しさん:2005/06/19(日) 15:09:15
>>271
外でループ回せば解決じゃないの?
274262:2005/06/19(日) 15:18:15
>>272, 273 あ そうですね 敵を初期化する関数っていうワンクッション置いてから個別に初期化するのがいい方法でしたか・・・ rCMyChar.Init();で自キャラは全て初期化してますし
同じようにやりたかったので 外ではループを回したくなかったんですよ
ワンクッション置いてやってみることにします

敵個体の特性っていうのはどういったことですか?・・よく解りませんorz
275デフォルトの名無しさん:2005/06/19(日) 15:21:16
初期化はできるだけコンストラクタを使うようにしてください。
276デフォルトの名無しさん:2005/06/19(日) 15:28:45
>>274
敵個体の座標というのは敵個体の特性(言い方悪かったなぁ属性というべきだったか)だろ。
敵個体の初期位置というのは敵個体の特性かどうかを考えよ、と言ってる。

多対一の対戦を行なうゲームか何かだと思うが、何が何でも敵を全体として扱うのはナンセンスだ。
大雑把に考えると、
敵全体
├敵1
├敵2
 :
└敵n
と言う関係にあるだろうから、
ゲーム全体の初期化
 ├→自キャラの初期化
 └→敵全体の初期化
  ├→敵1の初期化
  ├→敵2の初期化
   :
  └→敵nの初期化
となることに別に問題はなかろう。
277262:2005/06/19(日) 15:38:31
>>276 おぉ ありがとうございます。 ものすごい解りやすい・・・
私は今アクションゲームを作ってまして、ものすごい参考になります
ありがとうございました。
278デフォルトの名無しさん:2005/06/19(日) 18:46:05
これで敵が群れになって移動してくるなら、
敵全体
+敵グループ1
 +敵1
 +敵2
+敵グループ2
 +敵1

とかになるわけだなw
279デフォルトの名無しさん:2005/06/20(月) 16:59:38
そこで Compisitパターンですよ
280262:2005/06/23(木) 23:41:54
すいません ちょっとつまづいたので教えて下さい
グローバル変数で

CEnemy* pEnemy = new CEnemy[MAX_ENEMY];

という風に敵を作ってます。 それで今から敵を追加していくところなのですが
敵の種類を宣言時に持たせたいため

CEnemy* pEnemy(1) = new CEnemy[MAX_ENEMY];
↑敵の種類 (コンストラクタでCEnemyのメンバのkindに代入)
というようにしたいと思ったのですが これはできないみたいで・・
どのようにしたら解決できますでしょうか・・ 
281デフォルトの名無しさん:2005/06/24(金) 00:03:23
>>280
やはりそこにきたか。
[ ] による配列では各要素のコンストラクタを制御するのは不可能。
すべてデフォルトコンストラクタが使用される。
基本的な代替は以下のふたつ。

// ポインタの配列
// - いっこずつ生成するのが面倒
// - アクセスが面倒
// - delete が面倒
CEnemy* enemies[MAX_ENEMY];
enemies[0] = new CEnemy(1);


// std::vector
// - いっこずつ生成するのが面倒
// - CEnemy のコピーコンストラクタ、代入演算子を確認する必要がある
std::vector<CEnemy> enemies;
enemies.push_back(CEnemy(1));
282262:2005/06/24(金) 00:14:47
なるほど・・・ int a(5)とかがあるなら配列の初期化としてつけてもいい機能ですよねぇ
ポインタの配列でやってみます。。。しかしながら他に方法はないのかと思ってしまいますw
283デフォルトの名無しさん:2005/06/24(金) 00:26:28
>>281
ポインタの配列なら、
std::auto_ptr<CEnemy> enemies[MAX_ENEMY];
にすると、「delete が面倒」という問題は解消される。

ただし std::vector<std::auto_ptr<CEnemy> > は不正だ
ということを理解していないのなら使わないことをお勧めする。
284デフォルトの名無しさん:2005/06/24(金) 00:28:57
>>280-281
関係ないが、「〜の数」を MAX_〜 にするのはどこの文化だ?
いろんなところであたりまえのように見るが、激しくキモイ。
285262:2005/06/24(金) 00:29:13
>>283 そこらへん全くもって解りません・・・ 学校ではいつも
#include <iostream>
using namespace std; を使ってますが理由っていうか効果が解ってませんしw
286デフォルトの名無しさん:2005/06/24(金) 00:32:17
「〜の最大数」をMAXで表現しないでどうするの?
相手を理解しようとしないでキモイと言うのは如何なものかと
287デフォルトの名無しさん:2005/06/24(金) 00:33:49
チョンだなw
288デフォルトの名無しさん:2005/06/24(金) 00:35:14
イタタタw
289284:2005/06/24(金) 00:41:14
>>286
MAX_〜 は「最大〜」という意味なのに、「〜の数」の意味まで含むようになってるのがキモイ。
「敵の最大数」が MAX_NUM_ENEMIES じゃなくて MAX_ENEMY なのがキモイって話。
290デフォルトの名無しさん:2005/06/24(金) 00:43:39
キモイを連発してまで本筋でないところにツッコミ入れている
輩のほうがよっぽど(ry
291デフォルトの名無しさん:2005/06/24(金) 00:44:24
>>287
詳しく
292デフォルトの名無しさん:2005/06/24(金) 00:44:38
ほんとに関係ないな
293デフォルトの名無しさん:2005/06/24(金) 00:45:39
MAXとかNUMとか略してるのはキモくないのかw
294デフォルトの名無しさん:2005/06/24(金) 00:48:17
>>293
もうね、そんなレベルじゃない。
俺の思想以外は全部キモイw

もう書き込まずには居られない。
295デフォルトの名無しさん:2005/06/24(金) 00:50:40
MAXIMUM_ENEMY
とかって強そうだな
296デフォルトの名無しさん:2005/06/24(金) 03:14:24
THE_MAXIMUM_NUMBER_OF_ENEMYS
297デフォルトの名無しさん:2005/06/24(金) 07:42:17
どうでもいいようなことまでケチつけるから、
ソース公開する人が減るんだと言っt
298デフォルトの名無しさん:2005/06/24(金) 09:14:42
ごめん、ENEMYSだけは許せない
299デフォルトの名無しさん:2005/06/24(金) 13:30:34
>>298
俺も。
英語弱いんだね、という印象。
300デフォルトの名無しさん:2005/06/24(金) 14:07:38
うはwwオレ、ENEMY_S だwww
301デフォルトの名無しさん:2005/06/24(金) 19:34:58
MOBS でいいじゃん
302262:2005/06/24(金) 21:23:31
あ〜 解りません・・・未だにつまづいてるのでご教授お願いします
CEnemy* pEnemies[MAX_ENEMY];
pEnemies[0] = new CEnemy(1);
として宣言しようとすると[error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました]
が出てきます。 あと中身についてなんですが pEnemies[0] = new CEnemy(1);というのは1個だけしか生成されませんよね?
ってことは同じ種類の敵を複数出す時は
pEnemies[1] = new CEnemy(1);
pEnemies[2] = new CEnemy(1);
pEnemies[3] = new CEnemy(1);
みたいにするんですかね?・ ホントに初歩的?なところだと思うんですがよろしくお願いします
303262:2005/06/24(金) 21:25:10
あとdeleteが面倒というのは
delete[] pEnemies[1];
delete[] pEnemies[2];
delete[] pEnemies[3];
のように1個づつ解放しないといけないってことですか?
304デフォルトの名無しさん:2005/06/24(金) 22:38:06
>>302
MAX_ENEMYがおかしいんじゃないの?

>>303
newで割り当てているからdelete、delete[]ではない。
そう1つずつやらなくともforとかforeachとかが使える。
305デフォルトの名無しさん:2005/06/24(金) 22:38:13
deleteが面倒とか言ってる奴は
ポインタ使うな。
C言語使うな。
C++使うな。
javaなりC#なりに行って帰ってくんな。
306デフォルトの名無しさん:2005/06/24(金) 22:38:32
#include <iostream>
using namespace std;
class CEnemy
{
  int a;
public:
  CEnemy(int x) : a(x){ cout << "construct" << endl;}
  ~CEnemy(){cout << "destruct" << endl;}
};

#define MAX_ENEMY 5
int main()
{
  CEnemy *p = new CEnemy[MAX_ENEMY](1);
  delete[] p;
  return 0;
}

[実行結果]
construct
construct
construct
construct
construct
destruct
destruct
destruct
destruct
destruct

おや、コンストラクタ、デストラクタちゃんと呼ばれてるな。
gnu gcc 3.3.3 (cygwin)
307デフォルトの名無しさん:2005/06/24(金) 22:41:25
>>306
元は要素のコンストラクタにはそれぞれ別々の引数を渡したいという話だったと思うが。
308デフォルトの名無しさん:2005/06/24(金) 22:49:59
factory class でもつくれ。
309デフォルトの名無しさん:2005/06/24(金) 23:00:25
こうだな。
class CEnemy
{
  float x,y,w,h,tx,ty;
public:
  CEnemy() : x(0.0),y(0.0),w(64.0),h(64.0),ty(0.0),tx(0.0){}
  void SetPos(float xpos, float ypos){ x = xpos; y = ypos;}
};
#define MAX_ENEMY 10
int main()
{
  CEnemy *p = new CEnemy[MAX_ENEMY];
  for(int i = 0; i < MAX_ENEMY; ++i)
  {
    float f = 100.0f + i * 20.0f;
    p[i].SetPos(f, f);
  }
  //
  delete[] p;
  return 0;
}
310262:2005/06/24(金) 23:19:58
うーん BOOL Init_Enemy(CEnemy* pEnemy, int no) という関数を作り
if(no==1){ 敵1の初期化 } とした方がいいですかね
アイテムも同じように作るつもりなので、あまり関数が複雑化するのは避けた方がいいですよね
311デフォルトの名無しさん:2005/06/24(金) 23:43:35
std::vector<CEnemy>にしてpush_back()で詰め込んでいくってのは駄目?
312デフォルトの名無しさん:2005/06/24(金) 23:55:36
>>311
CEnemyから派生させたいからダメ
std::vector<boost::shared_ptr<CEnemy> >
ならおけ
313デフォルトの名無しさん:2005/06/25(土) 00:05:03
>>310
その説明じゃ、やりたいことが全然わからん。

複雑でもないと思うし、複雑化をそんなに厭う意味もない。
複雑な処理は関数化して、いつでも使いまわせるようにするのが、
構造化なりオブジェクト指向なりなわけだから。
314262:2005/06/25(土) 00:19:28
あ はい、すいません
宣言は
CEnemy* pEn1 = new CEnemy[MAX_ENEMY];
CEnemy* pEn2 = new CEnemy[MAX_ENEMY];
とし初期化する関数へは
pEn1->Init(pEn1,1);
pEn2->Init(pEn2,2);
とするということです
315デフォルトの名無しさん:2005/06/25(土) 00:26:37
それじゃ、それぞれのオブジェクトが別々の配列にはいっちゃって
キモチよく一緒につかえないだろ
316デフォルトの名無しさん:2005/06/25(土) 00:38:44
Initの中では何をするの?
317262:2005/06/25(土) 00:42:30
それが難点で・・。。。 ゲームを作ってる方々はどのように管理してるんですかねぇ
それと ゲームを作る際におおまかな関数の作り方が載ってるサイトとかありませんかね?
私は 初期化 処理 表示に分けて
更に 
初期化 - テキスト読み込み
         - 画像読み込み
     処理 - 移動
         - 攻撃
表示 - 表示
といった感じにして 当たり判定は別個に作ってます・・ 
就職用作品なのでできればソースを綺麗にしたいのでよろしくお願いします
318デフォルトの名無しさん:2005/06/25(土) 00:56:29
コードを書く前に、なにがやりたいのか伝える訓練が必要だな。
319デフォルトの名無しさん:2005/06/25(土) 00:59:45
そして面接ではそちらの方が重視されたりもする
320デフォルトの名無しさん:2005/06/25(土) 01:20:03
キャラクターのクラス情報は共有してフライトウィジパターンにする。
インスタンス情報の初期化はループをまわして、全員スタンスに対して行う。
321デフォルトの名無しさん:2005/06/26(日) 06:15:58
普段、関数などを調べる際に新ANSIC言語辞典(平林)を使用しているのですが、
C++でそれに似たようなものはないでしょうか?
322デフォルトの名無しさん:2005/06/26(日) 06:43:37
googleマジレス
323デフォルトの名無しさん:2005/06/26(日) 06:47:06
>>321
オライリーから出てる
C++ランゲージクイックリファレンス/C++ライブラリクイックリファレンス
324デフォルトの名無しさん:2005/06/26(日) 07:23:03
平林は「ANSI C/C++辞典」も出してたよ
325デフォルトの名無しさん:2005/06/27(月) 01:50:21
このスレ読んでて思ったけど、やっぱりEffectiveシリーズのような推薦図書スレで
挙げられてる必読書って読む価値あるんだな〜。
あれを読まずにC++でいきなりクラスを実装できる人っているんだろうか
326デフォルトの名無しさん:2005/06/27(月) 05:01:09
>>325
半年くらい試行錯誤しながらクラスを作っていたら、
その間に身につけたノウハウが全てEffectiveC++に書かれていた。
327デフォルトの名無しさん:2005/06/27(月) 05:10:19
いきなりEffective読んでも、実感がわきにくいからな。
328デフォルトの名無しさん:2005/06/27(月) 07:16:15
とりあえずいきなりジェネリッククラスから。
再利用可能なコンポーネントは美しい

とりあえずWTLのオーナーデータリストビューとかに生かしている
329デフォルトの名無しさん:2005/06/28(火) 15:43:39
C++ではコンストラクタを持ったクラスを
共用体のメンバとして持つことは不可能なのでしょうか?
330デフォルトの名無しさん:2005/06/28(火) 16:37:04
>>329
できない。逆にできたら困る。
ただし、もしかしたらboost::variantが代わりになるかもしれない。
331デフォルトの名無しさん:2005/06/28(火) 22:30:05
>>330
やはりできませんか。。。
よく考えたら確かに2つ以上のクラスが
ある場合とかだと大問題ですね。
boost::variant調べてみます。
ありがとうございました。
332デフォルトの名無しさん:2005/06/29(水) 00:07:34
C++でプログラムをするには、クラスを作らなければならないから、面倒だな。
クラスを作ってる間に、Cで目的のプログラムを作れてしまいそうだ。
クラスを作ることそのものが目的で、学習のためならともかく、実用ではなかなか
使う機会がないんだが。
333デフォルトの名無しさん:2005/06/29(水) 00:10:01
小規模なプログラムならクラスは別に必要ない
334デフォルトの名無しさん:2005/06/29(水) 00:11:00
>>332
クラスを作らなくてもプログラムは動くだろ。
好きにすればいい。
335デフォルトの名無しさん:2005/06/29(水) 01:37:29
>>332
別にクラスつっても、ライブラリについてるようなフル装備の
汎用的な型にする必要はないからな
そんなに構える必要は無い

どのみちJavaやC#なら、全部クラスなんだから
336デフォルトの名無しさん:2005/06/29(水) 04:38:00
フル装備の汎用型てww
337デフォルトの名無しさん:2005/06/29(水) 04:56:42
>>336
クラス作る際にstd::stringやSTLコンテナみたいな気合の入った設計を
毎度毎度する必要は無いよ、という程度の意味。
338デフォルトの名無しさん:2005/06/29(水) 07:47:45
そもそもCの書き方も使えるというのもC++の売りの1つ。
Better Cとしてもそれなりに使う価値はあるよ。
339デフォルトの名無しさん:2005/06/29(水) 16:47:51
C++は、他人の作ったライブラリを使うなり、
自分でライブラリをそこそこ作り上げてからが本番な気がする。
行数とかで比較すりゃ全体的にはどうやったってC++の方が多くなるからな。
340デフォルトの名無しさん:2005/06/29(水) 16:54:35
C++にはSTLがあるから、そんだけで
格段に短く書けることが多いぞ

まあ簡単なプログラムなら手続き+STL利用
ぐらいで全然かまわんわなあ。
341デフォルトの名無しさん:2005/06/29(水) 19:02:52
>>332
クラスを作るのが面倒って、構造体を作るのと手間は変わらんと思うんだけど。
342デフォルトの名無しさん:2005/06/29(水) 20:05:05
>>341
それは流石に違う
343デフォルトの名無しさん:2005/06/29(水) 20:13:15
>>341
自分が理解できてないことに対する言い訳だろ。

>>342
構造体もまともに設計できていないなら兎も角、きちんと構造体を設計できるなら
クラスの設計も概ね巧くいくと思うぞ。

まぁ、継承まで考え始めれば話は別だが。
344デフォルトの名無しさん:2005/06/29(水) 20:22:03
GUIはCよりC++の方が楽だろう。
コレクションもC++の強みだな。

この二つだけのためだけでもC++は使う価値がある。
345デフォルトの名無しさん:2005/06/29(水) 20:24:24
>>343
Cの構造体設計とクラス設計をごっちゃにするのは流石にどうかと。

構造体はただのデータの入れ物であって、ADTではないから
その演算や振る舞いを考える必要は無い。
346343ではないが:2005/06/29(水) 21:53:56
>>345
「継承まで考え始めれば話は別」って書いてるのに何言ってるの?
347デフォルトの名無しさん:2005/06/29(水) 22:15:44
継承以外にも考えるべき要素はあるだろ
348デフォルトの名無しさん:2005/06/29(水) 23:24:31
はー、重箱
349デフォルトの名無しさん:2005/06/29(水) 23:53:07
ハァ?
350デフォルトの名無しさん:2005/06/30(木) 02:37:45
質問。
メンバにユーザー定義型が入った構造体でテーブル作ろうとすると、
初期化のときに該当するメンバじゃなくて構造体に代入しようとするのは
なんでですか?
メンバが組み込み型なら普通に構造体のメンバに代入してくれるのに。

例:
typder struct {
CString str;
int i;
} foo;

foo Arrayfoo[] = {
{"abc", 1}
,{"efg", 2}
}

"abc"をfoo[].strに代入してるつもりなんだけど
fooにキャストとしようとして失敗する。
351デフォルトの名無しさん:2005/06/30(木) 02:47:25
そういう仕様だから。
そして深くは考えない。

structはデフォでメンバがpublicなクラス
(ただしコンストラクタを持たないstructはC構造体互換といえる)


ちなみにCStringはコンストラクタを持つので、C構造体スタイルの初期化には対応して無い、と。
352デフォルトの名無しさん:2005/06/30(木) 03:00:31
>>351
こんな遅い時間にレスどーもです。
fooをstructからclassにしてみてもダメでした。
要はテーブル作るときは組み込み型に限定するか、
諦めて他に代わりのデータ構造を考える、と。
あまり深く考えず、覚えてしまうことにします。ありがとうございました。
353デフォルトの名無しさん:2005/06/30(木) 03:18:02
>>350,352
まずC++だからtypedef struct {} foo; などと書かずに素直に struct foo {}
と書けばよろしい(Cだとしても構造体のタグ名は定義しておいたほうが
いいことが多いが)。

で、この場合は、素直にfooにコンストラクタを定義すればいいんじゃないの。
そうすれば、
foo Arrayfoo[] = { foo("abc", 1), foo("efg", 2), ... };
と書ける。
354350:2005/06/30(木) 03:27:57
>>353
なるほど、今の仕事で見てるソースではtypedefしてない人もいたから
もしやと思ってたけど、C++だとstructつけなくても構造体変数の定義ができるんですね。
>>foo Arrayfoo[] = { foo("abc", 1), foo("efg", 2), ... };
これは自分では思いつきませんでした。参考になります。
355デフォルトの名無しさん:2005/06/30(木) 03:43:26
>>354
念のため書いておくが、別にCでもtypedefは必須というわけではない。
struct foo {};
でよい。ただしこの場合、使うときにはいつも
"struct"を付ける必要があり面倒だからtypedefする人が
多いというだけだ。
C++ではstructに対するそういう差別は無い。

356デフォルトの名無しさん:2005/06/30(木) 07:35:39
VC7.1だと>>350のは平気だったけど。
357デフォルトの名無しさん:2005/06/30(木) 08:34:27
なんだ。VC6か。
358デフォルトの名無しさん:2005/07/01(金) 09:25:15
>>341
クラスを作るほうがかなり面倒だ。

>>343
理解できてようが、クラスを作るのが目的ではなく、また、必要としないときにわざわざクラスを作るのは無意味だ。
359デフォルトの名無しさん:2005/07/01(金) 10:25:17
>>358
>クラスを作るほうがかなり面倒だ。
理解できてない証左だ。
360デフォルトの名無しさん:2005/07/01(金) 12:51:06 BE:337147586-
>>359
class と struct の機能がほとんど同じだからといって
クラスと構造体を同じように実装するとでも考えてるのか?
361デフォルトの名無しさん:2005/07/01(金) 13:10:25
データ型としての性格が強ければ構造体、
メソッドパッケージとしての性格が強ければクラス、
きっちり線引きできるもんじゃないっしょ?
362デフォルトの名無しさん:2005/07/01(金) 13:37:07
俺は基本的にクラス使う方向だな。
struct Point { int x, y; };
みたいに単純なのは構造体にしたくなるってのもあるけど、拡張しようと思ったら結局クラスにしたくなるし。
よっぽど使い捨てにしか使わない自信があって且つpublicと書くのが面倒な時は気まぐれで構造体使うかも。
363デフォルトの名無しさん:2005/07/01(金) 16:37:40
1. とりあえずstructで書く。
2. コンストラクタやメンバ関数を追加してみる。
3. 折角なのでアクセサ付けてメンバ変数をprivateにしてみる。
4. 「…アレ?」
364デフォルトの名無しさん:2005/07/01(金) 17:08:36
5 structをclassへ書き換える。
365デフォルトの名無しさん:2005/07/01(金) 17:11:47
>>358
クラスなんぞつかわんでも
要するにCだけでカーネルもエディタもコンパイラも組めるから
「必要としないときに……」
と言ってしまうと、ほぼ常に「必要でない」と言えてしまう。

その方がラクかどうか、対象をより適切に見通しよくモデル化できるかどうか、
といった視点も必要だろう。
366デフォルトの名無しさん:2005/07/01(金) 17:13:48
なくても作れる≠必要としない
367デフォルトの名無しさん:2005/07/01(金) 17:20:50
>>366
反例を述べよ
368!=366:2005/07/01(金) 22:59:30
>>367
彫刻を掘る時、ノミではなくミシン針でやってやれないことはない。
= 無くても作れる = 必要としない

とすると、ノミ = ミシン針
ということになるが、逆に、ノミで裁縫することは不可能である。よって矛盾する。

従って、なくても作れる != 必要としない。
369デフォルトの名無しさん:2005/07/01(金) 23:05:43
>>368
それは

A) 彫刻を彫るにはノミは必要じゃない

という命題から

B) 裁縫するにはミシン針は必要じゃない

という命題は導出できないと言ってるだけで、
Aそのものを否定していることにはならない。
370!=366 && !=368:2005/07/01(金) 23:18:31
必要でない -> 必ず要るわけではない
これに対し「なくても作れる」はなくてもよい事象を作るに限定したものである。
∴なくても作れる≠必要としない
371デフォルトの名無しさん:2005/07/01(金) 23:20:58
>>370
だから、反例を述べよといっておるのだ。
その「なくてもよい事例」に該当しない例を上げよ、と。
372デフォルトの名無しさん:2005/07/01(金) 23:22:50
まあ、「C++専用ライブラリを使うプログラム」とかは
C++じゃないと書けないわけだが

そんなんを例といわれても僕困っちゃうわけだが
373=370:2005/07/01(金) 23:23:56
>>371
逆に質問するが みかん≠スイカ の反例を述べよ。
君の質問はこれに等しい。
374デフォルトの名無しさん:2005/07/01(金) 23:33:00
よくわからんなあ。

クラスが無くても作れるとしたら、そのときにクラスは必要じゃなかったんだと
思うのだが。

無くても作れるけど、必要、という状態の例って、どんなだ?
375デフォルトの名無しさん:2005/07/01(金) 23:41:44
>>374
バニラアイスクリーム作りにおけるバニラエッセンスのようなもんでないの?
なくても作れるけど、完全なバニラアイスではないよ、完全なものを作るにはどうしても必要だよ、と。


んで反例だけど、Cでプログラム書くのに、Pascalのコンパイラ環境はなくても作れるし、そもそも必要
ないってことでFA?
376デフォルトの名無しさん:2005/07/01(金) 23:46:39
完全て、どんなだ(w
LinuxカーネルはCでかかれているから不完全なのであって、
C++なら完全なものにできた、とでも言いたいのか(w

俺の主張は>>365だ。後ろの二行。

ちなみにその反例は、反例になってない気がする。

1) クラスがないと作れない、という例
2) クラスがなくても作れるが、クラスは必要、という例

を俺は問うているんだが。
377デフォルトの名無しさん:2005/07/01(金) 23:52:29
>>376
日本語理解できるか?
「無くても作れるけど、必要、という状態」の一般的な例を挙げただけで、誰もLinuxだのC++だの
固有名詞は挙げてないぞ。

後は知らん。
378デフォルトの名無しさん:2005/07/01(金) 23:54:06
くだらん論理学的な遊びはよそでやってくれ、ここのスレタイ読めてるか?
もっと実際的な話をしろよ
379デフォルトの名無しさん:2005/07/01(金) 23:56:15
>>377
なるほど、そういう文意だったのは理解したが、
その例は正しくないな。

バニラエッセンスがなければ、バニラエッセンスつきのバニラアイスは
作れない

んだから。
それは「作れている」とは言えない。
380デフォルトの名無しさん:2005/07/01(金) 23:56:47
正直スマンカッタ。

暇で暇で、むしゃくしゃしていた。どのスレでもよかった。今は反省して(ry
381デフォルトの名無しさん:2005/07/02(土) 00:31:25
おもしろいから、もっと議論してくれ。
382デフォルトの名無しさん:2005/07/02(土) 07:52:22
事実:バイナリエディタさえあればプログラムは作れる。
→では、ありとあらゆる高級言語は「必要ない」のか?
383デフォルトの名無しさん:2005/07/02(土) 15:16:23
>>382
時間の制約があるので実質上必要。
384デフォルトの名無しさん:2005/07/02(土) 18:00:55
>>382
そういうことは実際ある程度の規模のプログラムをバイナリエディタで
組んでみてから言ってくれ。

理論的に出来る、だけなら作れないと言ってるのと同じ。
できなければ、高級言語はあんたには、「必要」なんだ。
385デフォルトの名無しさん:2005/07/02(土) 20:02:32
おそらく、384は誤解をしてるようだ。
382は、384の言うようなことを喚起するような意図で、問題を投げかけたのだと
思われる。
386デフォルトの名無しさん:2005/07/02(土) 20:05:05
高級言語から入ったプログラマでも、やはり言語というものが
発展してきた歴史を学ぶことは必要だね。
387デフォルトの名無しさん:2005/07/02(土) 22:19:37
俺は今更FORTRANだのCOBOLだの触りたくないぞ
388デフォルトの名無しさん:2005/07/03(日) 01:52:46
まさに不毛ですな
389デフォルトの名無しさん:2005/07/03(日) 07:17:55
 既存のクラスを利用するだけなら、まだいいが、いつもクラスをわざわざ作るのが、あたかも
必須であるかのような考えには疑問を抱く。
 俺の場合は、プログラムは大規模にはならず、クラスを作ることはどうでもよく、それよりもまずは、
目的の処理を実現するアルゴリズムを考えることに頭を使わなければならないことが多い。
 C++をやるなら、クラス設計よりも、STLをうまく使いこなせるようになるほうが重要だと思ってる。
390デフォルトの名無しさん:2005/07/03(日) 07:36:15
>>389
> C++をやるなら、クラス設計よりも、STLをうまく使いこなせるようになるほうが重要だと思ってる。

うむ、確かにそうだな。いいこと言った。が、

> 俺の場合は、プログラムは大規模にはならず、クラスを作ることはどうでもよく、それよりもまずは、
> 目的の処理を実現するアルゴリズムを考えることに頭を使わなければならないことが多い。

まずデータ構造(クラス)を定義したほうが、アルゴリズムに頭を悩まされる負担が減るってもんだ。
とは言っても俺も

> いつもクラスをわざわざ作るのが、あたかも
> 必須であるかのような考え

ではないので、この部分も同意。
ところで>>389のこの話、やや唐突だなw
どこにレスしたんだ?
391デフォルトの名無しさん:2005/07/03(日) 07:49:10
>>390
>ところで>>389のこの話、やや唐突だなw
>どこにレスしたんだ?
>>332で書き込んでが、かなりの反響があったようで、それについて議論してる人全体が
対象ってもんで、特定の一個人へのレスではないし。
392デフォルトの名無しさん:2005/07/03(日) 08:01:05
>>390
アルゴリズムとデータ構造の決定について
どっちが先ってことはないんじゃない?
ほぼ同時に決定するって感じ
393デフォルトの名無しさん:2005/07/03(日) 10:41:54
でも,STLだと(シーケンスに限っていえば)アルゴリズムとデータ構造の
独立・直交性が高いので,とりあえずで進んでいって後で
詰まったときにある程度の手戻りが効く.
これもある程度以上は限界があるけれど.
394デフォルトの名無しさん:2005/07/03(日) 12:05:21
クラスを使わないほうが効率がいいときにわざわざクラスを使うのは無能。
クラスを使ったほうが効率がいいときにクラスを使わないのと同様に。
395デフォルトの名無しさん:2005/07/03(日) 14:46:34
で、そもそも「クラスを作るのが面倒」って言い始めた理解の足りない>>332はどこへ逝った?
396デフォルトの名無しさん:2005/07/03(日) 16:09:37
汎用関数はともかく、汎用クラスなんか
使いこなせる気がしねええぇぇーー orz
397デフォルトの名無しさん:2005/07/03(日) 16:11:53
汎用関数、汎用クラスって何ですか?
398デフォルトの名無しさん:2005/07/03(日) 16:23:15
>>397
テンプレートを活用したもの。
399デフォルトの名無しさん:2005/07/03(日) 16:26:03
×汎用関数 ○関数テンプレート
×汎用クラス ○クラステンプレート
ってことか?

何で関数テンプレートとクラステンプレートって
使ってる感覚はいっしょだと思うけどなぁ。
>396 がクラス使うのに慣れてないだけじゃない?
400396:2005/07/03(日) 16:29:11
×汎用関数 ○関数テンプレート
×汎用クラス ○クラステンプレート

↑の変換でいいかと。


クラスは慣れてないです。
最初は使わなくてもいいですかね?
401デフォルトの名無しさん:2005/07/03(日) 17:25:44
>>400
クラスの利点を知らないのなら、使う意味は無いよ。
402デフォルトの名無しさん:2005/07/03(日) 17:29:16
>>400
使わずにどうやってなれるつもりだい?
403デフォルトの名無しさん:2005/07/03(日) 17:31:22
いいよ。
C++なんか生きていく上で必要ない。
忘れなさい。
404デフォルトの名無しさん:2005/07/03(日) 17:37:09
>>401 >>402
あー、ごめんなさい。
クラステンプレートは使わなくていいかな?
ってことです。言葉足りなくてスマソ。

クラスに慣れてから、ちょっとずつ
ステップアップしたほうがいいのかなーと。
405デフォルトの名無しさん:2005/07/03(日) 17:41:32
>>404
クラスとクラステンプレートとに同時に慣れる必要はないと思うよ
406デフォルトの名無しさん:2005/07/03(日) 17:44:18
何かクラステンプレートを作るのはずっと後でいいが、使うのには慣れろ。(STLとか)
407デフォルトの名無しさん:2005/07/03(日) 17:46:09
トップダウンに「クラスを見つける」ことになれていない、それが
難しいと感じるのであれば、ボトムアップにやればよいんじゃないかな。

Cスタイルで構造体やそれを操作する関数は使ってると思うが、そういうものを
クラスにしてみることだ。
ただの構造体よりはコンストラクタがついている方が扱いやすいし
メモリの開放が必要ならデストラクタを付けてみる。
構造体を操作する関数をメンバにしてみる。

408デフォルトの名無しさん:2005/07/03(日) 17:56:36
構造体が理解できていれば、クラスに入るのも難しくないだろう。
409デフォルトの名無しさん:2005/07/03(日) 17:57:06
>>408 んなこたーない。
410デフォルトの名無しさん:2005/07/03(日) 17:59:43
普段からどういう風にCを使っているかによるよな。
411デフォルトの名無しさん:2005/07/03(日) 18:01:36
つまり、人による、と。
412デフォルトの名無しさん:2005/07/03(日) 18:04:31
そういうことだな
413デフォルトの名無しさん:2005/07/03(日) 18:12:48
>>405-408
レスありがとうございます (ノω`)・゚・。。
STLはやぱ、使っといたほうがいいのか。。


恥ずかしついでに言っちゃいますと、

クラステンプレート
例外処理 (スローとかなんとか・・)
実行時型情報 (typeinfo・・なにそれ?)
テンプレートライブラリ (いっぱいありすぎ orz)
C++の入出力システム (cout.??? とかios::??? みたいなやつ)
ファイルの入出力 (<fstream>ヘッダの中のやつかな?)

あたりを全部すっ飛ばしちゃおうかと考えてるんですが、
↑で挙げてるやつで、これは最初にやっといたほうがいいってやつは
ありますか?

ちなみに、今の所の近場の目標は、
windowsスケルトン組んで、絵を出して色々やろうかと
思ってます。
Cは一通りやりました。
414デフォルトの名無しさん:2005/07/03(日) 18:17:53
>>413
例外処理を学べばいろいろついてくるぜ。
415デフォルトの名無しさん:2005/07/03(日) 18:19:22
>>413
STLは使うと使わないでは著しく開発効率が変わってくる。
ちょっとしたプログラム以上のものでは大概STLで提供される
コンテナやアルゴリズムを必要とするからな。
昔からコンテナライブラリみたいなものはあるが、STLはそうしたものに
比べると、革命的なほど強力で洗練されたライブラリだ。これのためだけに
C++を使う、というヤツも多い。

で、「すっとばす」と言ってるヤツだが、クラステンプレート、例外処理は
使えるようにはなっておけ。全く知らないと、そういうものを利用した
ライブラリが使えなくなる。

RTTIやiostreamはすぐには知らなくてもいいかもしれん。特に後者は
Win32で開発するならば、今後もあまり世話になることは無いかもしれない。
416デフォルトの名無しさん:2005/07/03(日) 18:29:33
>>414 >>415
なるほど、説得力ありますね。

この2ヶ月ほどC++の言語の勉強ばっかしてきて
まともにプログラムを打ってないので、
なんかもう、とにかく早くクラスを使って慣れたほうが
いいんじゃないかと思ってまして。。
ちょっとキレ気味で orz

とりあえず、例外処理を一通りやってみます。
どうもありがとー m(__)m
417デフォルトの名無しさん:2005/07/03(日) 18:36:14
>>413
実行時型情報はたしかにどうでもいい。そんな機能もあると知っているだけでいい。
入出力は<<で出力して、>>で入力ということさえ知っていればとりあえずは困らない。
例外だけはWindowsの世界へ足を入れる前にやったほうがいいな。

テンプレートと言えばSTLじゃないが、std::stringは知っておいて損はない。
演算子とlength()とc_str()を知っているだけでも全く違ってくる。
418デフォルトの名無しさん:2005/07/03(日) 18:37:46
まあWin32ならCStringTや_bstr_tを使う機会のが多いだろうけどな(w
419デフォルトの名無しさん:2005/07/03(日) 18:41:18
そうか?
俺はWindowsでもtypedef std::basic_string<TCHAR> tstring;で通しているが。
420デフォルトの名無しさん:2005/07/03(日) 18:45:41
>>419
幸せなヤツだな

そんなことをやっても
find_first_ofなどのメンバ関数で_tcs系の関数が使われるわけではないから
MBCSでは全然NGだし
CStringTや_bstr_tにあるMBCS<->WCSの変換機能も無いだろ
421デフォルトの名無しさん:2005/07/03(日) 18:52:00
まぁあれだ、CObArrayは使うなと。
422デフォルトの名無しさん:2005/07/03(日) 18:53:57
>>417
std::stringはこの板でよく見かけますね。
char型の、文字列専用強化版みたいなものでしょうか。
文字列はwindowsプログラムでも使う予定ですし、
ヒーヒー言いながら、やってみたいと思います。ども。

いただいたレスを読み返してみると、
クラステンプレートも、作り方と使い方は知らないとダメっぽいですね。


あと、
C++の勉強を始めたら、やたらとリスト構造(自己参照構造体?)
をよく見かけるのですが、
C++使うなら理解を深めとく必要があるんでしょうか。

C++はstaticをあんま使わないらしいので、
newで確保したメモリを、リスト構造で管理することが多くなるのかな。
でも、リスト構造ちょっとややこしいよ、ママン。
423デフォルトの名無しさん:2005/07/03(日) 18:54:43
>>422 そこで std::list ですよ。
424422:2005/07/03(日) 18:55:56
>>423
うはwwSTLwwww
425デフォルトの名無しさん:2005/07/03(日) 19:03:11
まあ何だ、MFC/ATLのコンテナは使い物にならんから、コンテナや
アルゴリズムはSTLのを使え。ただしマルチスレッド環境では気をつけろ

std::stringに関しては、CStringTのがWin32では良いサポートを提供
しとるから、後者を使え

ってとこかな
426デフォルトの名無しさん:2005/07/03(日) 19:46:18
みなさん、お詳しいですね。
能書きは要りませんので、原典だけお教え願えませんか?
427デフォルトの名無しさん:2005/07/03(日) 20:09:38
>>426
原典?規格書買えよ。

英語が読めれば↓でほとんど十分だが。
http://www.kuzbass.ru/docs/isocpp/
http://www.open-std.org/jtc1/sc22/wg21/
http://www.research.att.com/~bs/C++.html
428426:2005/07/03(日) 21:19:45
>>427
あり!
429419:2005/07/03(日) 22:09:37
>>420
MBCSが問題になるようなときは専らstd::wstringを使う。
MBCSとWCSとの変換はATL::Cx2xを使っている。
いちいちc_str()を呼ぶのはダサいと思うが仕方ない。
430デフォルトの名無しさん:2005/07/03(日) 22:26:24
C++を覚えるにあたりAccelerated C++を購入し読んでいるのですが、P.20で出てくる『不変量の表明(不変な表明)』という用語があるのですが、これってどういう意味でしょう?
読んでても、よくわからないのですが...
431デフォルトの名無しさん:2005/07/03(日) 23:10:35
>>429
そこまでしてstd::basic_string<>にこだわる意味は全く無いと思うんだが...

GetBuffer()も無いから、無用なalloca()、またはstd::vector<>との
変換も、結構必要だろ?

432≠429:2005/07/04(月) 00:45:31
>>431
いや、私はstd::stringとバッファを組み合わせて使いたいときには
(どうせそのバッファは一時的でいいはずだから)固定char配列かnewして使う。

まぁ、GUI絡みだとCString使うけどね。
433デフォルトの名無しさん:2005/07/04(月) 09:58:28
しーぷらぷらちょーまじおもしれーwwwwwwwwwwwwwwwwwww
434426:2005/07/04(月) 11:29:16
>>433
どのへんがどうチョーおもしれーのかも語ってちょ
435デフォルトの名無しさん:2005/07/06(水) 00:17:16
    〃〃∩  _, ,_
     ⊂⌒( `Д´) < 参照渡しじゃなきゃヤダヤダ
       `ヽ_つ ⊂ノ
              ジタバタ
      _, ,_
     (`Д´ ∩ < char*じゃなく、std::stringじゃなきゃヤダヤダヤダ
     ⊂   (
       ヽ∩ つ  ジタバタ
         〃〃

     〃〃∩
     ⊂⌒(  _, ,_)  <うにコードって何?SBCSの国に産まれたかったよ・・・。
       `ヽ_つ ⊂ノ
             グスン・・

>>430
そのへんはスルーして問題なし(と思う)。
ていうか、俺はした。
436デフォルトの名無しさん:2005/07/06(水) 00:29:21
>>435
何が言いたいんだか(w
437デフォルトの名無しさん:2005/07/06(水) 00:33:46
うにコードは別にCからC++への移行とは何の関係もないな。
438デフォルトの名無しさん:2005/07/06(水) 10:03:23
あるオブジェクト指向ロマンスの一場面。

A: 「あなた、いつまでも変わらないでいてね」
B: 「安心しろ。ぼくはconstだ」

…の一節が好きなのでC++使います
439デフォルトの名無しさん:2005/07/06(水) 10:40:30
A: 「あなた,あの時変わらないって言ったじゃない!!」
B: 「うるさいな.const_castしたんだ.」
440デフォルトの名無しさん:2005/07/06(水) 10:41:27
>>439
うまいなw
441デフォルトの名無しさん:2005/07/06(水) 14:44:31
コンパイル時に下記のようなエラーが出ます。
acx.cpp:124: error: cannot call member function 'void acx<Type>::PB(int, int) [with Type = float]' without object

エラー内容がオブジェクトなしではPBという関数を呼び出せないという事はわかるのですが、その原因がわかりません。

呼び出し行は
if (ii==0)PB(k,endpnt);
なのですが、エラーとなる原因は何なのでしょうか?


442デフォルトの名無しさん:2005/07/06(水) 15:02:53
>>441
>エラーとなる原因は何なのでしょうか?
オブジェクトがないのでしょう。

メンバ関数以外から呼び出したいなら、オブジェクトを指定する必要がありますね。
或いは、静的なメンバ関数からの呼び出し場合もオブジェクトを指定する必要があります。
#メンバ関数のつもりで非メンバ関数を書いている気もするが。
443デフォルトの名無しさん:2005/07/07(木) 12:16:40
スコープは解決できてるみたいなんで静的なメンバ関数から普通のメンバを呼び出そうとしてるんでしょ。
444デフォルトの名無しさん:2005/07/15(金) 07:53:32
C++を習得した君
そこで安心してはいけない 次はC++0xだ
445デフォルトの名無しさん:2005/07/15(金) 12:59:50
は?
446デフォルトの名無しさん:2005/07/15(金) 19:31:00
C++ のつぎは C+++ にきまっとる。
俺なんか C++++++++++++++++++++++++++++++++++++++++まで習得したぞ。
447デフォルトの名無しさん:2005/07/15(金) 21:03:25
>>446
     ∧∧
∧    < え >
  ヽ.   <  |  >
 ノ |   <  |  >
 ()|   <  |  >
u____つ / !!? >
[_____ U  ̄∨∨
  ノ
ヽr
  ヽ
448デフォルトの名無しさん:2005/07/16(土) 21:39:14
C++++ = D だから D++++ == E と考えると、
>>446は C++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ ++++ == M まで習得したんだな。
449デフォルトの名無しさん:2005/07/17(日) 20:08:42
M、つまりマゾ言語
450デフォルトの名無しさん:2005/07/18(月) 16:08:48
参照とポインタの使い分けについて教えて下さい
参照はint a など1つしか宣言&初期化しない時に使うと便利で
ポインタはint a[10]など配列で宣言し、Init(a);などで関数に送り
ループで配列を全部初期化する時に便利ってことで理解してもよろしいでしょうか?
また参照で送った場合はどのようにして次の要素にアクセスできますか?
(参照でポインタの pEnm++のような事を実現できるんでしょうか?)
451デフォルトの名無しさん:2005/07/18(月) 17:50:45
>>450
仮にポインタを使うと*か->しか使わず、その他のポインタ演算を全く使わないような場合なら参照。
それ以外はポインタ(あるいはイテレータ)。

> また参照で送った場合はどのようにして次の要素にアクセスできますか?
> (参照でポインタの pEnm++のような事を実現できるんでしょうか?)
int&のような場合は無理。&でポインタを取得すればできるw
そういうのはポインタ(あるいはイテレータ)の出番。
452450:2005/07/18(月) 19:23:38
>>451 dd ポインタ演算を使わない場合は参照でまとめることにします。
イテレータについてググってきますw
453デフォルトの名無しさん:2005/07/19(火) 21:38:04
すまんが誰か俺に >448 がどういう理屈なのか教えてクレ
454448:2005/07/19(火) 22:27:26
C++の次がDということで C++++ → D って書いたけど、
C++とDは別物だとか、そういう厳密な話じゃないから気にしないで
455デフォルトの名無しさん:2005/07/23(土) 00:50:35
C++ => D
C-- => C#
456デフォルトの名無しさん:2005/07/23(土) 02:40:10
C-- => C♭
457デフォルトの名無しさん:2005/07/23(土) 08:54:00
もうそういうつまんない記号遊びはいいから
458デフォルトの名無しさん:2005/07/26(火) 19:31:39
iostreamって全く魅力を感じないんだけど、stdioじゃな
くてiostreamを使うことで、得られる利点てありますか?
C++ぽくみえるとかそれだけかな。
459デフォルトの名無しさん:2005/07/26(火) 20:12:32
>>458
algorithmと一緒に使いやすいようになってるとか。
460デフォルトの名無しさん:2005/07/27(水) 03:44:05
>>458
・型ごとのフォーマット指定をおぼえなくていい
・template 内の型とか、 typedef された型とかの実際の型を意識しないで済む
・実際にアクセスするデバイスを拡張しやすい
・エラーに例外を使える

現状ではこれらを覆すだけのデメリットがある。
実行速度とか、プログラムサイズとか、コンパイル速度とか。
461デフォルトの名無しさん:2005/07/27(水) 04:33:12
>・型ごとのフォーマット指定をおぼえなくていい

でも、iostream でのフォーマット指定は printf 系のフォーマット指定より16倍マンドクサイ('A`)
462デフォルトの名無しさん:2005/07/27(水) 07:43:37
>>461
そういうときは適宜使い分ければいい。
463デフォルトの名無しさん:2005/07/27(水) 08:59:41
中には混ぜると美しくないって言う人が…
464デフォルトの名無しさん:2005/07/27(水) 10:20:41
そこでboost::formatですよ。
465デフォルトの名無しさん:2005/07/27(水) 18:08:00
>>462
誰かがsync_with_stdioをいつの間にか弄ってて…
466デフォルトの名無しさん:2005/07/30(土) 00:45:11
sprintfで書式組み立てて流してる漏れはアホですかそうですか
467デフォルトの名無しさん:2005/07/30(土) 07:28:02
アホだ。
可変個引数なんてせっかくのC++の厳しい型の安全性が台無しじゃないか。
468デフォルトの名無しさん:2005/08/10(水) 16:56:40
質問です。
CHoge *p = new CHoge();

とした場合コンストラクタが呼ばれ

CHoge *p = (CHoge*)mallock(sizeof(CHoge));

とした場合呼ばれないのが何故だか分かりません。
newは特別なのでしょうか?

newをオーバーライドし、すでにmallockしてある領域のアドレスを返してやったら、
これまたコンストラクタが呼ばれました。

とても基本的なことかもしれませんが、どなたかご教授お願いいたします。
469デフォルトの名無しさん:2005/08/10(水) 17:05:12
>>468
ポインタをキャストしてもコンストラクタは呼ばれません。
つーか、そういうCスタイルのキャストはできる限り使わないようにしましょう。
470デフォルトの名無しさん:2005/08/10(水) 17:12:48
なるほど。
C++のクラスという機能を使うのですから、C++の流儀にしたがってnewするのが正しいですよね。

ですが気になるのは
newをオーバーライドして、すでにmallocしてある領域のアドレスを返してやった場合にもコンストラクタが動作したことです。

void* operator new(size_t t){
void* p;
p = malloc(t);
return p;
}

として
CHoge* p = new CHoge();

としたところ、コンストラクタが呼ばれたのです。
これはnewという記述の魔法とも思える動作で、非常に納得がいかないのですが…。
471デフォルトの名無しさん:2005/08/10(水) 17:18:54
newはコンストラクタを呼びます。仮令オーバーライドしていても。
472デフォルトの名無しさん:2005/08/10(水) 17:22:28
なるほど。
コンストラクタが呼び出されるのは「そのクラス用のメモリーが確保される」という動作が誘発するのではなく、
newそのものに備わっているわけですね。

つまり、newが「ポインターと返し、それがクラスであった場合コンストラクタを呼び出す」
という機能を持つ演算子であると考えればよろしいのでしょうか。

なかなか小癪な奴ですね。
(もちろん、実体を宣言したときにもコンストラクタが呼ばれることは知っています)
473デフォルトの名無しさん:2005/08/10(水) 17:28:42
>>472
考え方が逆。
処理系定義の方法(或いはオーバーロードして)確保したメモリで
コンストラクタを呼び出すようにnewが作られていると考えればよい。
同じように、デストラクタを呼び出してからメモリを解放するのがdelete。

あーそうそう、コンストラクタはクラスに限らず呼ばれるのでその積もりで。
例えばPOD型なら0で初期化されることが保証される。
474デフォルトの名無しさん:2005/08/10(水) 17:41:35
さらに詳しい解説ありがとうございます。
ネイティブなものでもコンストラクタ呼ばれてるんですね。
475デフォルトの名無しさん:2005/08/10(水) 19:01:51
本嫁
476デフォルトの名無しさん:2005/08/11(木) 09:39:02
このスレの存在意義を否定する発言するなw
477デフォルトの名無しさん:2005/08/11(木) 22:27:29
>>473
new POD だとCと同様に不定値で
new POD() でゼロ初期化じゃなかったっけ?
478デフォルトの名無しさん:2005/08/12(金) 04:06:55
a
479デフォルトの名無しさん:2005/08/12(金) 23:44:36
>>477
8.5-7 と、8.5-9 と、8.5-5 にある value-initialize の部分ですね。
480デフォルトの名無しさん:2005/08/22(月) 04:21:51
C++でboostは将来標準になるのですか?
今からガンガン使って大丈夫でしょうか?
あとで廃れてしまうなんて事はあるのでしょうか?
481デフォルトの名無しさん:2005/08/22(月) 07:54:36
C++自体使われなくなってるから大丈夫
482デフォルトの名無しさん:2005/08/22(月) 08:56:06
何年か前にも同じ台詞を見たなw
483デフォルトの名無しさん:2005/08/22(月) 14:35:38
>>480
ヒント:マイクロソフトの次世代OS
484デフォルトの名無しさん:2005/08/22(月) 20:41:47
>>480
boost全てが標準になるわけではない。
boost::lambdaとか標準になっても困るっしょ。

少なくともC++は当分の間は消えない。
485デフォルトの名無しさん:2005/08/23(火) 00:53:40
>>480
boost の一部は標準への取り込みを意図しているものもあります。

基本的にソフトウェアは時間で変質しないので、
今使って大丈夫なものはあとで使っても大丈夫です。
「大丈夫」の意味に依るのかもしれませんが。

将来、 boost が廃れる可能性はあります。
C++ が廃れる可能性もあります。
486デフォルトの名無しさん:2005/08/23(火) 00:54:24
とある本に「VisualC++はC++を拡張したオブジェクト指向型言語」とあったのですが、VisualC++って言語名だったんですか?俺はてっきりIDEの名前だとばかり思っていたんですが。
487デフォルトの名無しさん:2005/08/23(火) 00:57:34
>>486
Visual C++ は言語名ではありません。
とある本の名前を晒して、さっさと燃やしてしまいましょう。
488486:2005/08/23(火) 01:20:53
>>487
http://www.kohgakusha.co.jp/books/detail/4-7775-1138-3
書いてある箇所は冒頭だけど、よくみたらこの紹介文もちょっとおかしなこと言ってない?
489デフォルトの名無しさん:2005/08/23(火) 01:38:09
>その開発環境の1つである「Visual C++」は、プロの技術者もよく利用する、
>C++言語を基盤としたオブジェクト指向型言語で

環境と呼んだり言語と呼んだり、なんなんだ。
490デフォルトの名無しさん:2005/08/23(火) 01:40:13
>>488
言語と開発環境の区別が曖昧だなぁ。ちょっと信用できないね。
491デフォルトの名無しさん:2005/08/23(火) 01:49:19
ん?Visual C++は言語名じゃないだろ。皮肉ならともかく。
492デフォルトの名無しさん:2005/08/23(火) 02:24:37
boostが将来標準になった場合、boost/xx.hは変わらないのでしょうか?
493デフォルトの名無しさん:2005/08/23(火) 09:01:33
>>492
C++標準ライブラリと同列にヘッダが用意されるのだろうが、
当面は互換性のためにboostからもヘッダが提供されるだろうと俺は思う。

C++が廃れるとか喚いている奴がいるが、別にどんなプログラミング言語でもいつかは廃れる。
そのとき新しい言語にうまく乗り移れればそれで問題ないさ。
494デフォルトの名無しさん:2005/08/23(火) 19:12:18
boostに、boost/xx.h なんてヘッダはない。
495デフォルトの名無しさん:2005/08/27(土) 15:13:14
struct HOGE
{
std::string name;
long x, y;
}
という構造体を初期化したいのですが、どのように記述すればよいのでしょうか?

HOGE hoge = { "hogehoge", 0, 0 };

HOGE hoge = { 0 };
ではだめでした。

それともstringは構造体に使用しないほうがいいのでしょうか?
496デフォルトの名無しさん:2005/08/27(土) 16:32:14
>>495
アナクロな初期化をしたいのならstd::stringは使えない。
std::stringを使いたいなら自前でコンストラクタを書けばいい。
497495:2005/08/27(土) 17:51:41
>>496
どうもありがとうございます。
ちょっと考えて見ます。
498デフォルトの名無しさん:2005/08/27(土) 23:38:55
>>495
そういう初期化はできる。
ところで } の後に ; がないよ。

>>496
だからそれは間違っている。
const char *からstd::stringへの暗黙の変換があるから問題ない。
499デフォルトの名無しさん:2005/08/29(月) 04:12:55
暗黙なのか?
変換できるようなヘッダを読んでるから出きるのではないか?
用語として暗黙の変換というコトバはあるが、
初心者には意味が通じないのではないか?
500デフォルトの名無しさん:2005/08/29(月) 04:35:04
無理に通じないと思い込んでるだけだな、そりゃ。
どうせ、暗黙の変換なんて他人に教えたこともないんだろ?
501495:2005/08/29(月) 08:00:56
>>498-500
VisualC++6.0ではコンパイル通りませんでした。
コンパイラが原因?
そうは思いたくないです…。
502デフォルトの名無しさん:2005/08/29(月) 08:04:47
>>501
ざんねんながら、コンパイラが原因。
VC6では対応していない。
503デフォルトの名無しさん:2005/08/29(月) 08:48:30
>>502
ありがとうございます。他の方法を考えて見ます(´・ω・`)
504498:2005/08/29(月) 10:23:46
>>499
キャスト・一時オブジェクト作成式を使わずに変換できればそれは暗黙の変換と言う。
それに少なくとも496は初心者ではないと思った。
505496:2005/08/29(月) 13:12:48
あー確かにconst char *を引き数に取るコンストラクタがあった。失敬。
VC6のMSDN見る限り、VC6にもありそうだけど。
506デフォルトの名無しさん:2005/08/29(月) 19:18:08
C の
double* p = malloc(10*sizeof(double));
は、C++ では
double* p = new double[10];
と書くことは分かりました。

では、C の
memcpy(dst, src, 10*sizeof(double));
は、C++ ではどのように書くのでしょうか。
507デフォルトの名無しさん:2005/08/29(月) 19:26:10
>>506
std::copy(src, src + 10, dest)
508506:2005/08/29(月) 20:05:14
>>507
ありがとうございます。
509デフォルトの名無しさん:2005/08/29(月) 21:06:51
C では opendir(), readdir(), closedir() でディレクトリ内の列挙ができましたが、
C++ ではどのようにしたらいいですか?
510デフォルトの名無しさん:2005/08/29(月) 21:19:19
ところで、いまだにVC6を使う理由ってmsvcrt.dllだよね?

だよね?
511デフォルトの名無しさん:2005/08/29(月) 21:20:50
だよねだよねウザイ
512デフォルトの名無しさん:2005/08/29(月) 21:26:21
>>509
ディレクトリ操作は特にC++にはない。
boostという拡張ライブラリにはBoost.Filesystem てのがあるが。

標準では、Cと同じ関数で操作するのが普通。
513デフォルトの名無しさん:2005/08/29(月) 21:40:49
VC6で動かないコードはクソ
514デフォルトの名無しさん:2005/08/29(月) 21:42:54
>>509
それはCの標準関数で無い以上、C++ではどうしたらいいかというのは答えられない。
boostのようなC++のライブラリ使えとも、Cのopendir()とかをそのまま使えとも答えられるから。
515デフォルトの名無しさん:2005/08/29(月) 21:50:10
無名関数(lambda)がCやC++にないのは、それが意味をなさないから?
誰からも明示的に呼べない関数作ってどうするんだろう??
LISP(scheme)やpythonってlambdaよく使うけど、何の役にたつんだYO!
そのままコードかくだけ・・・じゃないの?cみたいに。。。
なんのための無名ってあるんだ!
516デフォルトの名無しさん:2005/08/29(月) 22:02:33
明示的に呼べないというより、
そこにあるから名前がなくてもいいって感じ。
インラインであるがゆえ。
517デフォルトの名無しさん:2005/08/29(月) 22:03:59
>>515
Lisp を使いこなるようになれば分かる。
lambda ってのは、つまり、first-class object だから役に立つんだ。
環境をいっしょくたに抱え込んだ closure としてね。
518デフォルトの名無しさん:2005/08/29(月) 22:28:08
>>515
lambdaが欲しければboost::lambda。
519デフォルトの名無しさん:2005/08/29(月) 22:39:28
>>513
> VC6で動かないコードはクソ

俺、今仕事で VC6 縛りなんだが

  list<int> l;
  for (int i = 0; i < 10; ++i)
    l.push_back(i);
  
  set<int> s;
  s.insert(l.begin(), l.end());

これが通らなくて悲しい。
520デフォルトの名無しさん:2005/08/29(月) 23:36:20
>>519
VC6でも、それが通るように書けるんだけど、契約の関係でほったらかしだからな。
521デフォルトの名無しさん:2005/08/29(月) 23:47:40
cygwinというのをインストールして、
Cをやろうと思う。
cygwinから、
make
実行したら
main.c
./main.c: line 3: syntax error near unexpected token `('
./main.c: line 3: `int main(void){'
みたいなエラーがでる・・・
コードは以下のとおり
#define __RETURN__ 3

int main(void){
return __RETURN__;
}
なんだろう。。。英字使ってないから文字コード問題はないよね?
522デフォルトの名無しさん:2005/08/30(火) 05:26:27
>>521
>gcc version 3.3.3 (cygwin special)
普通にコンパイルできるけど。makefileはどうなってんの?
523デフォルトの名無しさん:2005/08/30(火) 07:21:10
>>521
つ.cpp
524522:2005/08/30(火) 07:47:10
>>523
で?
gccでもg++でも拡張子がどちらであろうともコンパイルできるんだけど。
525デフォルトの名無しさん:2005/08/30(火) 08:07:42
>>524
ヒント:スレタイ
526デフォルトの名無しさん:2005/08/30(火) 08:23:58
移行中の人はcを使っちゃいけないらしい。
527デフォルトの名無しさん:2005/08/30(火) 10:02:05
>>521
関数定義をしたつもりが、変数定義扱いになってる。
だから’(’なんていらねーよと言われてる。
ではなぜ変数扱い?

とか言ってみる。
528521:2005/08/30(火) 23:42:11
>>みなさん
ありがとうございます。
特に>>527さんの翻訳は助かりました。

変なトークンじゃない?(って
って感じでしか訳せなくて、意味わかめでした。

原因はまだ探索中、わかったら報告しますじぇ!
529デフォルトの名無しさん:2005/09/01(木) 01:04:54
すいません、質問です。
C++で構造体を使うと、よろしくないですか?
530529:2005/09/01(木) 01:18:32
はじめは「ベターC」的な使い方で使うのが良いかなぁと、、。
531デフォルトの名無しさん:2005/09/01(木) 01:51:15
>>529
使ってよい。
class hoge
{
    // ...
};

struct hoge
{
private:
    // ...
};
と全く同じものだから、何ら問題はない。
532デフォルトの名無しさん:2005/09/01(木) 02:46:02
>>531
さすが^^
ご回答有難うございます
533デフォルトの名無しさん:2005/09/01(木) 02:58:38
>>531
別にそうなってるから使ってよいわけじゃなくて、
元々何の問題も無いだけだよね。
534デフォルトの名無しさん:2005/09/02(金) 02:11:52
× と全く同じものだから、何ら問題はない。
○ と全く同じもの。何ら問題はない。
535デフォルトの名無しさん:2005/09/02(金) 03:51:28
>>535
いっしょやん
536535:2005/09/02(金) 03:53:37
↑すまん、無限ループ作ってしまった。>>534に訂正。内容がある意味的を得てるw
537デフォルトの名無しさん:2005/09/02(金) 03:57:44
そして「的を得る」墓穴を掘る>535。
538デフォルトの名無しさん:2005/09/02(金) 04:10:48
お前ら…2人そろって日本語間違えるなよ…
539デフォルトの名無しさん:2005/09/02(金) 16:32:55
「的を射る」か?
540デフォルトの名無しさん:2005/09/02(金) 17:38:32
または「当を得る」。つか、
>>535
違うやん。
541デフォルトの名無しさん:2005/09/02(金) 18:28:39
同じやん。
542デフォルトの名無しさん:2005/09/02(金) 18:37:36
「と全く同じもの」を「何ら問題はない」の根拠にしているかどうか。
543541:2005/09/02(金) 18:49:40
レス元を見ずにレスを付けた俺が激しく謝罪しに来ましたよ (;・∀・) <`∀´ >
544デフォルトの名無しさん:2005/09/05(月) 08:29:23
分数を扱うにはどうしたらよいのでしょうか?
545デフォルトの名無しさん:2005/09/05(月) 08:54:57
class 分数 {
int 分子;
int 分母;
};
546デフォルトの名無しさん:2005/09/05(月) 10:20:07
547デフォルトの名無しさん:2005/09/06(火) 03:26:18
ofstreamを使ってファイルの入出力をしているのですが、
ファイルポインタすなわち FILE型構造体へのポインタを利用する関数(例えばflock)を使用したい場合
どのようにすればよいのでしょうか?
548デフォルトの名無しさん:2005/09/06(火) 03:33:20
>>547
とりあえず、標準の範囲では無理。
flock って FILE* だったか?
549デフォルトの名無しさん:2005/09/06(火) 03:47:41
ofstreamを使ってファイルをロックすることは出来ないのでしょうか?
550デフォルトの名無しさん:2005/09/06(火) 08:40:30
>>549
とりあえず、標準の範囲では無理。
551デフォルトの名無しさん:2005/09/06(火) 11:43:33
メンバ関数ポインタの配列を宣言しようとしたのですが、
private メンバにアクセスできないとエラーが発生してしまいます。
これは public メンバにするしかないのでしょうか?

class CHoge;
typedef int (CHoge::*HogeFunc) ( void );

class CHoge {
int A( void );
int B( void );
int C( void );

static HogeFunc func[3];
};

HogeFunc CHoge::func[3] = {
CHoge::A,// エラー
CHoge::B,// エラー
CHoge::C,// エラー
};
552デフォルトの名無しさん:2005/09/06(火) 11:51:45
C++使えねー

まあそれはflockとかはUNIXの文化だから、実は

UNIX使えねー

なわけだけど。
553デフォルトの名無しさん:2005/09/06(火) 13:20:02
>>551
普通にコンパイルとおるけど by VC7.1
あと、メンバ関数ポインタの初期化子は、&CHoge::A と書くのが基本だ。
554551:2005/09/06(火) 19:20:58
>>553
自己解決したのですが、お馬鹿なミスでした。
確かに>>551は問題無いようです。
自分のプログラムの>>551で言うところの
HogeFunc CHoge::func[3] = {
の部分を
HogeFunc func[3] = {
としていたために発生したエラーでした。
ありがとうございました。
555デフォルトの名無しさん:2005/09/06(火) 19:22:30
名前空間を ::にしてるのはなんで?

std.fill()とかじゃいけなかったの?
556デフォルトの名無しさん:2005/09/06(火) 19:37:10
>>547
「FILE*で」 flock()ができるって、どこの国の話でしょうか?
557デフォルトの名無しさん:2005/09/06(火) 19:38:33
>>555
stdクラスのfill()メソッドなのか
std名前空間のfill()というグローバル関数なのかが分からないでしょ
558デフォルトの名無しさん:2005/09/06(火) 20:01:59
っていうかいちいち定義に理由を求めるな
559デフォルトの名無しさん:2005/09/06(火) 21:29:46
::書きにくい。。
JAVA最高!
560デフォルトの名無しさん:2005/09/06(火) 21:31:40
>>555
D&Eには型名と同名の変数を作ったときに曖昧性が生じるから :: を使うようにしたと書いてある。

>>558
それを書いているのがD&E。
561デフォルトの名無しさん:2005/09/06(火) 21:33:13
型名と同名の変数を書く方が悪い
もしくは変数と同名の型名(r
562デフォルトの名無しさん:2005/09/06(火) 21:47:41
そもそもそんなことをできるようにしたCが悪い。
563デフォルトの名無しさん:2005/09/07(水) 19:52:43
C++ で printf と同じことを cout でできますか?
564デフォルトの名無しさん:2005/09/07(水) 21:09:11
>>563
同じ入力から、書式の等しい出力は可能。
書式文字列の使用は、標準の範囲では不可能。
565521:2005/09/07(水) 22:27:33
おひさびさです。
いまだに解決できずなやんでいます。

また、gcc や、bcc32
にて、コンパイルはできました。
make
ができません。。。。

whichしたところ、/bin/make
566デフォルトの名無しさん:2005/09/07(水) 22:32:15
>>521
今更だけど__RETURN__をRETURNにしてみたらだめか?
567521:2005/09/07(水) 23:10:19
>>566
非常に不可解なことが起こりました。

支持どおりRETURNに書き直したところ、うまくいきました。
echo $?
としたところ、3と表示されました。
_RETURN_
にしたらコンパイルエラーなんだろうなと思ったんですが、、、、
なんと_RETURN_もうまくいくようになりました。。。。

なにもしていないんですが。。。
”何かあるとすれば”cygwinのsetup.exeにて、cvsutilsパッケージを
インストールしたぐらいです。

それ以外はギコネコとcygtermしか使ってないっす。。。

めでたしなんですかね?
568デフォルトの名無しさん:2005/09/08(木) 00:01:15
改行コードがおかしかったか非表示文字が混じっていたか2バイト文字が混じっていたか、
いずれその辺だべ。
569デフォルトの名無しさん:2005/09/08(木) 08:36:13
_の代わりに_が入っていたに1票
570デフォルトの名無しさん:2005/09/08(木) 12:44:17
もともと元ファイルの記述がおかしかったには違いないが、
>>568-569
それだとまず別のエラーでは? 自分で試してから喋ってる?
まあ、質問者自身、まったく信頼できないので、実際どんなエラー
だったか確認しようが無いが。
つか、驚くべくは、それしきをようやくdebugできたのかよ……
571デフォルトの名無しさん:2005/09/08(木) 14:44:54
#define __RETURN__3int main

こう定義されてたかも。

572デフォルトの名無しさん:2005/09/08(木) 15:10:26
>>565
>また、gcc や、bcc32
>にて、コンパイルはできました。
なので、2バイト文字とかじゃなさそうだけれど…
>make
>ができません。。。。
どのコンパイラで問題だったか確認しきれてなさそで話にもならんのでは。
うがっ!!
573デフォルトの名無しさん:2005/09/08(木) 17:02:34
>>571
実は改行されてなくてエディタ上で折り返してただけとか?
574デフォルトの名無しさん:2005/10/19(水) 21:30:01
age
575デフォルトの名無しさん:2005/10/24(月) 09:20:06
クラスのデフォルト引数は宣言の方に書くのでしょうか?
576デフォルトの名無しさん:2005/10/24(月) 09:47:19
それでいいんじゃね?
577デフォルトの名無しさん:2005/10/24(月) 09:47:41
宣言に書き、定義には書かないのが通例。
578デフォルトの名無しさん:2005/10/24(月) 17:15:25
むしろそうしないと、デフォルト引数が2箇所以上で指定されているというエラーになる。
579デフォルトの名無しさん:2005/10/26(水) 00:59:54
C++の標準ライブラリには時間関係の関数が見当たらない気がするのですが、
これらはCのライブラリから持ってくるしかないんでしょうか?
580デフォルトの名無しさん:2005/10/26(水) 02:00:55
>>579
いいえ、Cから受け継いだものをそのまま使うと言うことです。
581デフォルトの名無しさん:2005/10/26(水) 05:29:17
じゃあ、あのちょっとキモイ静的領域を共有するような関数ライブラリを
そのまま使え、とあなたは仰ると?
582デフォルトの名無しさん:2005/10/26(水) 05:40:06
>>581
いやならシステムコール呼べ
583デフォルトの名無しさん:2005/10/26(水) 07:18:36
どっちもいやですね。
お得意のboostとかでなんとかしてくださいよ。
584デフォルトの名無しさん:2005/10/26(水) 07:35:45
>お得意のboostとか
いや、得意じゃないから。つーか、なにが気に入らないのやら。
585デフォルトの名無しさん:2005/10/26(水) 08:54:03
boostで解決しないことなんてあるのか?
586デフォルトの名無しさん:2005/10/26(水) 10:40:51
見付かりました。

Boost Date-Time Library Documentation
http://boost.cppll.jp/HEAD/libs/date_time/doc/index.html

これでとりあえず我慢します。
587デフォルトの名無しさん:2005/11/07(月) 11:52:34
STL では、動的な1次元配列を生成するために
vector が定義されていますが、2次元以上の
動的な配列を生成するための型は定義されていません。
(もちろん、Boost には定義がありますが)

そこで、いろいろと調べてみたところ、下記のように
記述をすれば何とか2次元の動的な配列を生成できる
ことがわかりました。

vector< vector<int> > matrix(10, 100);

ただ、上記のようにして2次元配列を生成した場合、
配列の拡張をしようと思うと、

matrix.resize(99);
for( i = 10; i < 99; i++ ){
  matrix[i].resize(100);
}

のように記述をする必要がありそうで、今ひとつな感じがします。

もっと、エレガントに配列の拡張ができると良いなぁ...と思いますが、
そんな夢みたいな方法ってあるのでしょうか?

# matrix.resize(99,100) と記述できれば良さそうな気はします。。。
588デフォルトの名無しさん:2005/11/07(月) 18:32:13
>>587
cppllの過去の投稿をコピペすることの意味を教えてくれ
589デフォルトの名無しさん:2005/11/08(火) 00:56:22
うるせー馬鹿
590デフォルトの名無しさん:2005/11/08(火) 05:32:22
単に記述の問題であればLISPを覚えるのが吉
C++でセコセコやってるのがアホらしくなるよ
591デフォルトの名無しさん:2005/11/08(火) 05:46:42
>>590
lispで何ができんの?emacsのすくりぷティングか?
シェル上でASCIIアートか?
592デフォルトの名無しさん:2005/11/08(火) 06:05:03
>>587
その場合、デザイン的には、matrix classを組んだ方がいいんじゃない?
メンバー関数として、void resize( size_t m, size_t n ); を定義。
行列をクラスにする事による恩恵は大きい。オペレーターオーバーライドとか、
vectorを使うならコピーコンストラクタは必要だし。
593デフォルトの名無しさん:2005/11/08(火) 23:02:40
使い古された話だから、山ほど実例があるよ。
594デフォルトの名無しさん:2005/11/09(水) 08:39:09
あっそ
595デフォルトの名無しさん:2005/11/09(水) 13:45:27
先日「AspectJによるアスペクト指向プログラミング入門」という本を買って、
読んでいたのですが、アスペクト指向ってログ機能だけぢゃない、のですね。
(と、4月にこの本が平積みになっているときに「他に何が使えるの?」
 と思っていた)

White Doc Project
http://untrod.keihanna.ne.jp/whitedog/aspect.jsp <http://untrod.keihanna.ne.
jp/whitedog/aspect.jsp> 
では、Javaで作られたお絵かきツールを AspectJ を使って
ネットワーク機能に早代わり、ということができるそうです。

調べてみると、C++ の実装である AspectC++
http://www.aspectc.org/Home.1.0.html <http://www.aspectc.org/Home.1.0.html
というのがあるそうで、プリプロセッサレベルですが、
アスペクト指向プログラミングできるそうです。

AspectC++ のほうは、まだ研究段階っぽいのですが、
使ってみた方はおられるでしょうか?
596デフォルトの名無しさん:2005/11/12(土) 01:01:46
try & catch の理屈がわかりませぬ
597デフォルトの名無しさん:2005/11/12(土) 01:05:40
>>596
setjmp() / longjmp() のような物だと思いなせえ。それプラスα。
598デフォルトの名無しさん:2005/11/12(土) 01:48:27
余計ワカラナサスw
599デフォルトの名無しさん:2005/11/12(土) 03:12:17
例外以外では使えないlongjmp
600デフォルトの名無しさん:2005/11/12(土) 03:19:27
try 〜 catch を大域脱出に使うと、コスト高杉。そういう用途向けには
作られてない。サンデープログラマなら別に好きなようにすればいいけど。
601デフォルトの名無しさん:2005/11/12(土) 09:11:27
>>596
try 〜 catchの例外処理はエラー処理を1箇所でまとめて行うためにある。

たとえばmallocと違いnewはメモリが確保できないと例外を投げる。
そこでtry 〜 catchを使えばメモリ確保するたびにいちいちNULLチェックをする必要がなくなる。
(この例ではメモリの解放が出来ないのがまずいけど)
try
{
    int *pHoge = new int[100];
    double *pFoo = new double[100];
    char *pBar = new char[256];
    /* 〜 */
    return true;
}
catch (const std::exception& e)
{
    return false;
}
602デフォルトの名無しさん:2005/11/12(土) 09:53:31
603デフォルトの名無しさん:2005/11/12(土) 10:24:14
>>601
try 〜 catch書くと5行ぐらいに増えるけど、
いちいちNULLチェックしたら1行で済んだよ
604デフォルトの名無しさん:2005/11/12(土) 11:13:21
>>603 だから何だ?
605デフォルトの名無しさん:2005/11/12(土) 13:25:50
try 〜 catch で例外状態からの脱出って言っても、
そのエラー要因を後で知りたい時には、どうすりゃいいんだよ。
606デフォルトの名無しさん:2005/11/12(土) 13:27:26
>>605
catch 節に必要な処理を書け。
607デフォルトの名無しさん:2005/11/12(土) 16:57:03
>>601
おぃ。
メモリリークはどうする。
608デフォルトの名無しさん:2005/11/12(土) 19:27:31
>>607
boost::scoped_ptrでなんとかしてくれ。
609デフォルトの名無しさん:2005/11/13(日) 01:04:44
もれはNULLなんて返ってきたことが無いんだが何か?
610デフォルトの名無しさん:2005/11/14(月) 23:23:17
確かにw
611デフォルトの名無しさん:2005/11/17(木) 19:33:49
newで例外が発生する?
それ以降の代入とかで初めて例外が発生する気がするんだが。
MS VC++の場合。
612デフォルトの名無しさん:2005/11/17(木) 20:11:42
>>611
最適化で、newが実行される位置がコード上とはずれているのではないか?
613デフォルトの名無しさん:2005/11/19(土) 00:14:50
>>611 いいかげんに VC6 は捨てようぜ。
614デフォルトの名無しさん:2006/01/22(日) 18:10:17
gccなんですけど。
615デフォルトの名無しさん:2006/01/22(日) 18:43:12
>>614 いきなりどうした?
616デフォルトの名無しさん:2006/01/22(日) 21:41:25
catch 節に書いた処理でさらに例外が発生したら、どうなるのだ?
617デフォルトの名無しさん:2006/01/22(日) 21:47:15
>>616
さらに外の catch 節で処理されるか、 terminate() する。
つまり通常の例外発生時と特に変わらない。
618デフォルトの名無しさん:2006/01/23(月) 06:09:51
C#はJavaのパクリとか言われてるが
初めてJavaを見た時C++のパクリだと思った
以上チラシの裏
619デフォルトの名無しさん:2006/01/23(月) 17:18:19
今となってはJavaはC++の悪いとこだけ持っていった言語になるな
620デフォルトの名無しさん:2006/01/23(月) 19:59:04
String型は素晴らしいと思うが
621デフォルトの名無しさん:2006/01/23(月) 20:07:45
>>620
Javaのことはほとんど知らないんだけど、それはライブラリではなく、組み込み型なの?
前者だとしたら素晴らしいのはライブラリであって言語じゃないっす。
622デフォルトの名無しさん:2006/01/23(月) 20:15:26
Stringは組み込みじゃなかったっけか・・・あ、適当なこと言うのは止めて置こう
叩かれそうだw
623デフォルトの名無しさん:2006/01/23(月) 20:20:13
>>622
別に叩かれてもいいじゃんぬるぽ、匿名なんだしぬるぽ。
624デフォルトの名無しさん:2006/01/23(月) 20:21:25
>>623
ガッ
625デフォルトの名無しさん:2006/01/23(月) 22:06:15
JavaのStringはデフォ。オペレータオーバロード出来ないJavaが文字列の
足し算できるのはデフォで贔屓されているから。
626デフォルトの名無しさん:2006/01/24(火) 00:04:59
>>625
Stringだけ特別扱いで美しさにかけるぜよ
627デフォルトの名無しさん:2006/01/24(火) 20:45:12
いまだに例外がサポートされない環境がいっぱいあるし、newはNULL返して欲しいよ。
コンストラクタの中でエラーするようなことスナ!
628デフォルトの名無しさん:2006/01/24(火) 20:52:27
>>627
newの失敗時にNULLが欲しいのなら
new(nothrow) T;

ただ、個人的には戻り値のNULLチェックは、
忘れてしまいがちな処理の上位に入るので例外を投げる仕様のほうが好み
629デフォルトの名無しさん:2006/01/24(火) 23:52:23
>>628
nothrow で抑制できるのは
operator new から飛んでくる例外だけだったような。
630デフォルトの名無しさん:2006/01/25(水) 00:26:38
>>627
「いかなるコンストラクタからもスローしてはいけません」
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep01202000.asp

  ,j;;;;;j,. ---一、 `  ―--‐、_ l;;;;;;   
 {;;;;;;ゝ T辷iフ i    f'辷jァ  !i;;;;;   
  ヾ;;;ハ    ノ       .::!lリ;;r゙
   `Z;i   〈.,_..,.      ノ;;;;;;;;>
   ,;ぇハ、 、_,.ー-、_',.    ,f゙: Y;;f   そんなふうに考えていた時期が
   ~''戈ヽ   `二´    r'´:::. `!   俺にもありました

「今はもう、私は C++ 標準規格の振る舞いが正しいと信じています」
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep02172000.asp
631デフォルトの名無しさん:2006/01/25(水) 23:38:46
VC++.net2003を使って、C++の勉強とDirectXの勉強をかねて色々やっています。

ベクトル等の構造体同士を加減算させるために演算子のオーバーロードを
メンバ関数でやっていたのですが、ふと d3dxmath.h を見てみると、
自分では分からない記述でオーバーロードされていました。

D3DXVECTOR2 operator + ( CONST D3DXVECTOR2& ) const;
D3DXVECTOR2 operator * ( FLOAT ) const;

これらはどういった動作をするのでしょうか?
632デフォルトの名無しさん:2006/01/25(水) 23:43:15
DirectXの勉強もいいが、数学の勉強しろ。
動作を理解したところで、旨みが理解できねーから
633デフォルトの名無しさん:2006/01/25(水) 23:48:57
甘みと言われましても。

今はCで書いていた自前の算術ライブラリをC++に置きかえつつDX9に対応させてる状態で
その過程でオーバーロードを使っていこう、というわけですので。

数学の勉強とはまた違う話なんですが。
634デフォルトの名無しさん:2006/01/25(水) 23:50:18
甘み->旨み
変換がおかしいな・・
635デフォルトの名無しさん:2006/01/26(木) 00:16:18
わからないと言うのはいいが、一体どこがわからないのだ?
ざっと候補を挙げるだけでこんなにある。
D3DXVECTOR2
operator +
CONST
&
const
operator *
FLOAT
ベクトルとベクトルの加算
ベクトルとスカラーの乗算
636デフォルトの名無しさん:2006/01/26(木) 00:35:02
凡用的な質問させて下さい。
現在CからC++を勉強するための良い本はプログラミング言語C++第3版くらいしかなさそうです。
(他のC++の本では絶版の物が多いようなので)
プログラミング言語C++第3版とEffective C++を二つ買って14'000円です
他にC++を勉強する良い方法は何か無いでしょうか?
637デフォルトの名無しさん:2006/01/26(木) 00:43:19
ちょっと関係ないけど買うなら古本屋とかに寄ってみた方がいいぞ。
俺はC++第3版をBOOKOFFで3000円で買った。
638デフォルトの名無しさん:2006/01/26(木) 00:48:25
>>636
プログラミング言語C++第3版
Effective C++ 第2版
More Effective C++
Exceptional C++
Effective STL
C++ FAQ 第2版
C++ Coding Standards
Modern C++ Design
C++の設計と進化

これらを全部読む
639デフォルトの名無しさん:2006/01/26(木) 00:50:18
>>637
それは3'000円以上の価値のある買い物をしましたね。
私も古本屋でちょっと探してみたいと思います
640デフォルトの名無しさん:2006/01/26(木) 00:55:01
>>638
高価そうな本が並んでいますね(@_@;)
でも、レス有難うございます。参考になりました。
641デフォルトの名無しさん:2006/01/26(木) 01:21:01
>>636
「凡用的」ってなんだ?
642デフォルトの名無しさん:2006/01/26(木) 02:16:47
移行に限って言うなら、「憂鬱なプログラマのためのオブジェクト指向開発講座」を一通りやって感覚を掴んだら、
EffectiveC++やMoreEffectiveC++、EffectiveSTLのような「定番」を読んでC++に理解を深めつつ
JavaやC#でもいいから、オブジェクト指向について解説した本を読んで、オブジェクト指向開発の基礎を学ぶ。
で、ある程度慣れてきたらModernC++DesignやExceptionalC++、D&Eのような、ちょっと深めの本を読むといいと思うけど…

漏れはこの順番でやったってだけで、他の方に合うかはワカンネ。
643デフォルトの名無しさん:2006/01/26(木) 15:55:52
Bjarne Stroustrup インタビュー (?)
ttp://www.kh.rim.or.jp/~nagamura/misc/stroustrup-interview.html
644デフォルトの名無しさん:2006/01/26(木) 18:46:42
>>643
そしてそれに対するBjarneからの回答
ttp://public.research.att.com/~bs/bs_faq.html#IEEE
645デフォルトの名無しさん:2006/01/26(木) 19:43:51
流石に捏造かw
しかしそういうジョークが成り立つぐらい規模が大きくなったってことでもあるしな
646デフォルトの名無しさん:2006/01/27(金) 02:26:49
>>643-645
タイムスリップしたかと思った。
647デフォルトの名無しさん:2006/01/28(土) 03:44:55
648デフォルトの名無しさん:2006/01/28(土) 15:58:27
>>647
次期C++標準
649デフォルトの名無しさん:2006/01/30(月) 22:27:05
安全性のために、
基本的にはメンバ変数はprivateもしくはprotectにして、直接触らない。
値の変更、参照はメンバ関数を使用する。
と習ったのですが、一々メンバ関数を用意するのは面倒です。
値の変更はやむを得ないとして、メンバ変数を擬似的にリードオンリー
みたいにするアイデアないでしょうか?
650デフォルトの名無しさん:2006/01/30(月) 22:35:56
>>649
だからJavaやC#などC++を基にしてできた後の言語では、
みんな、メンバ変数へのアクセスのようだけど実際にはメンバ関数の呼び出しになる「プロパティ」という機能がある。

ちなみにprotectedなメンバ変数も少し気を付けておいた方がよいと思う。
651デフォルトの名無しさん:2006/01/30(月) 22:40:04
>>649
あるよ。 template 使って property を実装すればいい。

しかし「一々メンバ関数を用意する」という考え方自体に意味が無い。
大雑把でもクラスの役割とインターフェースをひととおり決めて、
その後にどんなメンバ変数が必要かを決めるようにしたほうがいい。
652デフォルトの名無しさん:2006/01/31(火) 15:24:42
質問させてください.
new, delete, コンストラクタ回りを理解するために
Better C スタイルで, 以下のようなコードを書きまして…
653デフォルトの名無しさん:2006/01/31(火) 15:28:20
class X
{
public:
char szData[4];

X();
virtual ~X();

void* operator new( size_t );
void* operator new[]( size_t );
void operator delete( void* );
void operator delete[]( void* );
};
654& ◆D3ra0B2LiQ :2006/01/31(火) 15:29:35
X::X() {
putchar('.');
}
X::~X() {
putchar('.');
}
void* X::operator new( size_t size ) {
printf( "\n/メモリ確保中. operator new( size=%d )/", size );
return ::malloc(size);
}
void* X::operator new[]( size_t size ) {
printf( "\n/メモリ確保中. new[]( size=%d )/", size );
return ::malloc(size);
}
void X::operator delete( void* obj ) {
printf("/メモリ開放中. delete( obj )/\n" );
::free(obj);
}
void X::operator delete[]( void* obj ) {
printf("/メモリ開放中. delete[]( obj )/\n" );
::free(obj);
}
655デフォルトの名無しさん(653):2006/01/31(火) 15:30:39
class ChildX : public X
{
public:
char szData[4];

ChildX();
~ChildX();
};
ChildX::ChildX() {
putchar('.');
}
ChildX::~ChildX() {
putchar('.');
}
656& ◆D3ra0B2LiQ :2006/01/31(火) 15:32:15
int main(void)
{

puts("\n");

{
X* pData = new X;
X* pDataArray = new X[10];
putchar('\n');

printf("オブジェクトのサイズ: sizeof(X* pData)=%d, sizeof(X)=%d)\n"
, sizeof(pData), sizeof(X));

printf( "オブジェクトの場所: pDataArray[0]=[%p],\n"
" pDataArray[1]=[%p],\n"
" pDataArray[9]=[%p]\n"
, &pDataArray[0], &pDataArray[1], &pDataArray[9] );
printf( "&pDataArray[9] - &pDataArray[0] = [%d]\n"
, &pDataArray[9] - &pDataArray[0]);

delete pData;
delete [] pDataArray;
}
657653:2006/01/31(火) 15:38:56
puts("");

{
X* pData = new ChildX;
X* pDataArray = new ChildX[10];
putchar('\n');

printf("オブジェクトのサイズ: sizeof(X* pData)=%d, sizeof(X)=%d)\n"
, sizeof(pData), sizeof(X));

printf( "オブジェクトの場所: pDataArray[0]=[%p],\n"
" pDataArray[1]=[%p],\n"
" pDataArray[9]=[%p]\n"
, &pDataArray[0], &pDataArray[1], &pDataArray[9] );

printf("&pDataArray[9] - &pDataArray[0] = [%d]\n"
, &pDataArray[9] - &pDataArray[0]);

delete pData;
delete [] pDataArray;
}

puts("");


return 0;
}
658653:2006/01/31(火) 15:40:14
で, コンパイル実行した結果は, 以下のようになったのですが…
659653:2006/01/31(火) 15:40:52
--- Visual C++ 6.0 でコンパイル・実行した結果:

1: /メモリ確保中. operator new( size=8 )/.
2: /メモリ確保中. new[]( size=84 )/..........
3: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
4: オブジェクトの場所: pDataArray[0]=[00431AB4],
5: pDataArray[1]=[00431ABC],
6: pDataArray[9]=[00431AFC]
7: &pDataArray[9] - &pDataArray[0] = [9]
8: ./メモリ開放中. delete( obj )/
9: ........../メモリ開放中. delete[]( obj )/
10:
11:
12: /メモリ確保中. operator new( size=12 )/..
13: /メモリ確保中. new[]( size=124 )/....................
14: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
15: オブジェクトの場所: pDataArray[0]=[00431A84],
16: pDataArray[1]=[00431A8C],
17: pDataArray[9]=[00431ACC]
18: &pDataArray[9] - &pDataArray[0] = [9]
19: ../メモリ開放中. delete( obj )/
20: ..................../メモリ開放中. delete[]( obj )/
660653:2006/01/31(火) 15:43:51
--- Borland C++ 5.5.1 でコンパイル・実行した結果:

1: /メモリ確保中. operator new( size=8 )/.
2: /メモリ確保中. new[]( size=84 )/..........
3: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
4: オブジェクトの場所: pDataArray[0]=[00902DA4],
5: pDataArray[1]=[00902DAC],
6: pDataArray[9]=[00902DEC]
7: &pDataArray[9] - &pDataArray[0] = [9]
8: ./メモリ開放中. delete( obj )/
9: ........../メモリ開放中. delete[]( obj )/
10:
11:
12: /メモリ確保中. operator new( size=12 )/..
13: /メモリ確保中. new[]( size=124 )/....................
14: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
15: オブジェクトの場所: pDataArray[0]=[00902DA4],
16: pDataArray[1]=[00902DAC],
17: pDataArray[9]=[00902DEC]
18: &pDataArray[9] - &pDataArray[0] = [9]
19: ../メモリ開放中. delete( obj )/
20: ........../メモリ開放中. delete[]( obj )/
661653:2006/01/31(火) 15:44:45
--- GNU GCC 3.3.4 (MinGW special) でコンパイル・実行した結果:

1: /メモリ確保中. operator new( size=8 )/.
2: /メモリ確保中. new[]( size=84 )/..........
3: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
4: オブジェクトの場所: pDataArray[0]=[003D4944],
5: pDataArray[1]=[003D494C],
6: pDataArray[9]=[003D498C]
7: &pDataArray[9] - &pDataArray[0] = [9]
8: ./メモリ開放中. delete( obj )/
9: ........../メモリ開放中. delete[]( obj )/
10:
11:
12: /メモリ確保中. operator new( size=12 )/..
13: /メモリ確保中. new[]( size=124 )/....................
14: オブジェクトのサイズ: sizeof(X* pData)=4, sizeof(X)=8)
15: オブジェクトの場所: pDataArray[0]=[003D49BC],
16: pDataArray[1]=[003D49C4],
17: pDataArray[9]=[003D4A04]
18: &pDataArray[9] - &pDataArray[0] = [9]
19: ../メモリ開放中. delete( obj )/
20: ..[!!! ここで Windows により強制終了. !!!]
662653:2006/01/31(火) 15:49:12
出力の 20 行目で, それぞれ挙動が違ってしまい,
その理由がいまいちよく解らないのです.

virtual ~X()
のところを
~X()
としてコンパイル実行すると上手くいくのですが,
20 行目の点が足りなくなってしまい, 困ってます.

アドバイス下さい;;

(652-662 長文失礼しました.)
663デフォルトの名無しさん:2006/01/31(火) 15:56:36
>>662

X*p=new X[10];
delete[]p;
は問題ないが

X*p=new ChildX[10];
delete[]p
は実はC++では駄目。
なぜなら、これを実現しようとすると型のサイズと要素数の二つを暗黙的に管理する必要になるので、
そんなもったいないことは貧乏くさいC++では許さないのだ。

ChildX*p = new ChildX[10];
delete[]p;

のように正しい型の配列にするか、

X**p=new X*[10];
for(int i=0;i<10;++i)p[i] = new ChildX;

for(int i=0;i<10;++i)delete p[i];
delete[]p;

のようにポインタの配列にするのがC++のルール。
664653 (652-662):2006/01/31(火) 16:22:59
>>663

そうだったのか….
ありがとうございました.

助かります.
665デフォルトの名無しさん:2006/02/20(月) 06:35:55
new int a[10];
で作成した後、
a[9]だけ削除したいのですが、どのようにしたらよいのでしょうか?
666デフォルトの名無しさん:2006/02/20(月) 08:02:56
>>665
意味わかんね。
4or8byte程度ほっとけ。
667デフォルトの名無しさん:2006/02/20(月) 08:37:50
>>665
reallocみたいなのはnew , delete の仲間には無い。
668デフォルトの名無しさん:2006/02/20(月) 15:11:59
>>665
要素数を動的に増減させたいなら vector 使え。
669デフォルトの名無しさん:2006/02/22(水) 05:46:58
<<演算子をオーバーロードするさいにfriend関数を用いる必要があるのでしょうか?
670デフォルトの名無しさん:2006/02/22(水) 08:12:45
>>669
それだけの目的なら必要はないと思うけど?
671デフォルトの名無しさん:2006/03/10(金) 17:02:47
今更ながら恥ずかしい限りですが教えてください。

char* s;

という変数があって、上記変数に値を代入した後

int hogehoge( const char* a )

という関数に渡したいのですがエラーになります。
どうすればいいのでしょう?
672デフォルトの名無しさん:2006/03/10(金) 17:19:53
誤爆しました。初心者スレに逝ってきます_| ̄|○
673デフォルトの名無しさん:2006/03/14(火) 07:37:29
リストで済むなら、ベクタでなくリストを使うべきですか?
メモリ使用量とか動作スピードとかはリストの方がエコですか?
674デフォルトの名無しさん:2006/03/14(火) 08:52:31
んにゃ、listを使うべきとき以外はvectorで充分。
少なくとも、メモリ使用量はlistの方が多くなるし、頻繁な要素の入れ替えや中間への挿入削除以外は速度も遅くない。
675デフォルトの名無しさん:2006/03/14(火) 09:55:10
頻繁な要素の入れ換えを予期するときはリストですか?
676デフォルトの名無しさん:2006/03/14(火) 10:15:14
>頻繁な要素の入れ換えを予期するとき
設計を見直す。
677デフォルトの名無しさん:2006/03/14(火) 11:56:39
ベクタがあるのにリストの存在意義が分かりません><
678デフォルトの名無しさん:2006/03/14(火) 12:22:38
dequeがあるのにvectorの存在意義が分かりません
679デフォルトの名無しさん:2006/03/14(火) 13:02:08
vectorについて詳しいサイト
http://www.vector.co.jp/
680デフォルトの名無しさん:2006/03/14(火) 17:44:58
一次元の要素しか扱わないのか。
681デフォルトの名無しさん:2006/03/14(火) 18:00:12
>>678
dequeよりvectorのほうが実装が単純に出来るだろうし、実装が単純ということは速くなるだろうし。

これは実装の問題ではないが、規格ではvectorしかメモリ上での要素の連続が保障されていないというのも大きい。
682デフォルトの名無しさん:2006/03/14(火) 18:41:09
面白くないで直してまいれ
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
684デフォルトの名無しさん:2006/04/02(日) 05:38:59
boostを使うために、クラスの定義の中に
lagged_fibonacci1279 gen;
normal_distribution<> dst( 100.0, 20.0 );
variate_generator<lagged_fibonacci1279, normal_distribution<>> rand( gen, dst );
と書いたのですが、2行目と3行目で定数、及び識別子構文エラーが出てコンパイルできません。

クラス外に書いたときは問題ないのですが、クラスごとにseedなどを管理したいので
クラス内に書きたいのですが、どのように書けばよいのでしょうか?
685デフォルトの名無しさん:2006/04/02(日) 13:29:39
normal_distribution<>> 
normal_distribution<> > 
686デフォルトの名無しさん:2006/04/03(月) 02:29:43
cを勉強してc++へ移行するのはそんな難しくないだろうと
思ってたんですけど、もうc++って言語をcと分けないと
訳がわかんなくなってきました
で、お勧めの書籍ってあります?
推薦図書のスレあんま参考になんないっす。
687デフォルトの名無しさん:2006/04/04(火) 00:15:26
>>686
憂鬱な(ry
688デフォルトの名無しさん:2006/04/04(火) 23:05:49
いっそC++から離れてJavaとかC#やってみたら?
(オブジェクト指向ならSqueakとか)

一通りやってからC++に戻ったら、
パワーアップした自分に気がつく(はずw)
689デフォルトの名無しさん:2006/04/05(水) 04:09:35
>>688
ういっす
そうします。
690デフォルトの名無しさん:2006/04/10(月) 21:00:53
抽象クラスが抽象クラスから継承される事って出来るよね?
691デフォルトの名無しさん:2006/04/10(月) 21:40:57
>>690
できる
692デフォルトの名無しさん:2006/04/11(火) 14:01:49
accelerated c++のP230から質問です。
class Core{
public:
double grade() const;
protected:
double midterm,final;
std::vector<double> homework;
}
double Core::grade() const{
return ::grade(midterm,final,homework);
}
class Grad: public Core{
public:
double grade() const;
}
double Grad::grade() const{
return min(Core::grade());
}

この様に書かれている場合でも、Grad::grade()から呼び出されたCore::grade()内の
midterm,final,homeworkは全てCore::ですよね?
だとすると、Gradオブジェクトは
Core::midterm,final,homeworkを持つという事でしょうか?
Grad::midterm,final,homeworkを持つのではなく。

よろしくお願いします。
693デフォルトの名無しさん:2006/04/11(火) 17:52:51
>>692
どちらかというとmidterm, final, homeworkはCoreのメンバだけど、
GradはCoreの派生クラスだから、GradではCoreのメンバもGrad::でアクセスできるという感じ。
694デフォルトの名無しさん:2006/04/23(日) 08:46:15
age
695デフォルトの名無しさん:2006/05/17(水) 22:37:29
>>601
エラー処理を1カ所にまとめてしまうと、
new int[100];
new double[100];
new char[256];
のどこでメモリ確保に失敗したのかを知ることはできるのでしょうか?

メモリ確保失敗が1つでも発生すればプログラムは期待通りに動かないわけですから、
成功した分を解放してから抜ける必要があるかと思いますが。
696デフォルトの名無しさん:2006/05/17(水) 23:21:25
>>695
vector<int> i(100);
vector<double> d(100);
vector<char> c(256);
これでも失敗した箇所を知ることはできないが、成功した分の解放は問題ない。

失敗した箇所を知ることによって何かできることがあるだろうか?
697デフォルトの名無しさん:2006/05/18(木) 00:22:45
できることと言えばせいぜいデバッグの際に少しは役立つかもしれないということしか思い付かない。
698695:2006/05/19(金) 00:15:51
>>696
レスサンクスです。

>成功した分の解放は問題ない。
そうなんですか。
もう少し勉強してみます。
699デフォルトの名無しさん:2006/05/19(金) 16:36:43
どうしてnew[]を使う必要があったとしても、
boost::scoped_arrayやshared_arrayがあるしな。
700デフォルトの名無しさん:2006/05/20(土) 20:55:42
どうしてnew[]を使う必要がああるのはなぜなんだぜ?
701デフォルトの名無しさん:2006/05/20(土) 21:23:59
まぁ、new[]が必要となる場合は設計を見直した方がいいと思う。
これは別にそーゆー設計が悪いってんじゃなくて単にそーゆー設計がC++と相性が悪いから。
702デフォルトの名無しさん:2006/05/31(水) 10:43:53
やりたいこと
 AのプログラムからBのプログラムを非同期で起動する。(Aはその後終了)
 CのプログラムからBのプログラムを終了させる。

やってみたこと
 AのプログラムはCreateProcessでBのプログラムを単純に起動してそのまま終了。
 BにはサンプルによくあるコールバックのWndProcに、WM_CLOSEとかを作っておく。
 Cのプログラムで、イメージ名(B実行体)をキーにプロセス一覧からプロセスIDを取る。
  プロセスIDをOpenProcessに引き渡してプロセスハンドルを得る。(PROCESS_ALL_ACCESS)
  そのハンドルにPostMessageでWM_CLOSEを投げてみる。
   ★何も起きない
   ・そのハンドルにTerminateを実行すると強制終了はできる。

何か根本的に間違っていたらごめんなさい。
703デフォルトの名無しさん:2006/05/31(水) 17:15:05
>>702
プロセスハンドルにPostMessageで投げる?
PostMessageはウィンドウに投げる関数だからウィンドウハンドル渡さないと駄目だろ。
704デフォルトの名無しさん:2006/06/02(金) 08:37:30
newをクラス内で使っていない場合、コピーコンストラクタを作成せず初期化しても問題ありませんか?、
705デフォルトの名無しさん:2006/06/02(金) 09:33:45
>>704
それだけの条件じゃ「問題ない」とは言い切れないなぁ。
心配している問題について正しく理解するのをお勧めする。
706デフォルトの名無しさん:2006/06/03(土) 12:29:28
コールバック関数について質問です。
クラス内にある関数をコールバック関数として登録し、そのコールバック関数内でメンバー変数を変更したいのですが
うまいやり方がわからずに悩んでおります。
現状のソースはこんな感じです。

ヘッダ
class ProcessManager {
static void m_SigChildHandler();    //コールバック関数として使用したい関数
int status;               //状態
void m_Init_Application(); 
};

ソース
typedef void (*THREADFUNC)(int);

void ProcessManager::m_Init_Application() {
signal(SIGCHLD, (THREADFUNC)m_SigChildHandler); /* signal監視 */
}

void ProcessManager::m_SigChildHandler() {
status = 1; //状態変化したいけれどできない。
}

int main() {
ProcessManager cProcessManager;
cProcessManager.m_Init_Application();
}
707デフォルトの名無しさん:2006/06/03(土) 12:33:32
>>706
クラス内の静的(static)な関数は、クラスの中にあるということ以外、普通の関数と変わらない。
つまり静的でないメンバー変数にはアクセスできない。
708デフォルトの名無しさん:2006/06/03(土) 12:42:25
ナニ言ってやがる。staticなんてする必要無い。
でもって、コールバックの使い方自体が間違ってる。

つうか、コールバックの意味知ってるのか?

相手関数コール時点で、「私に返事ください。お返事先はここです。」と、コールバックアドレスを教えれ。
709デフォルトの名無しさん:2006/06/03(土) 12:46:51
コールバックをする関数自体は、コールバックされる関数のクラスを知っているんだから、
継承されたクラスから継承元クラスにコールバクという使い方が一般的。
710デフォルトの名無しさん:2006/06/03(土) 12:47:05
>>707
そうするとみなさんどのように実装しているのでしょうか。
コールバック関数のみクラスの外に出して、状態はグローバル変数で持つなどしなければいけないのでしょうか?
711デフォルトの名無しさん:2006/06/03(土) 12:48:04
>>708
別に間違ってないと思うぞ?
712デフォルトの名無しさん:2006/06/03(土) 12:48:16
>>708-709
で、signalを相手にしている706はどうするの?
713デフォルトの名無しさん:2006/06/03(土) 12:48:40
>>708, 709
調べて、試してみます。
714デフォルトの名無しさん:2006/06/03(土) 12:48:50
>>710
statusも静的メンバー変数にしてしまえばいい。
715706:2006/06/03(土) 12:49:58
あ、番号付け忘れた
710と712は私です。
716デフォルトの名無しさん:2006/06/03(土) 12:52:49
ま、早い話、オブザーバークラスとか、ノーティファイ関数とか調べれ。
717デフォルトの名無しさん:2006/06/03(土) 12:55:08
>>712
シグナルを相手にするのはコールバックする方のクラスじゃなくって、コールバックされるのを待っている方のクラスだろ?
そっちに全部集約しておけばいいじゃん。
718デフォルトの名無しさん:2006/06/03(土) 12:59:00
>>717
どのみち実際にハンドラ呼ぶのは signal で、
そこにどうやって this ポインタ渡すんだっつー問題が
解決していない。
719デフォルトの名無しさん:2006/06/03(土) 13:02:06
>>706
監視したい子プロセスが1つしかない場合は、>>714の通り、statusをstaticにしてしまえばいい。

子プロセスが複数あり、各プロセスごとに個別のコールバックを呼び出したければ、
CProcessManagerにプロセスIDとコールバックを納めたクラスのインスタンス(やポインタ)をstd::mapで保存しておいて、
sigactionでシグナルを監視する。
sigactionはコールバック時に、シグナルを発生させた子プロセスのIDが分かるから、
IDから逆引きでプロセスのインスタンスを取得し、コールバック関数を呼び出してやればいいかと。
720デフォルトの名無しさん:2006/06/03(土) 13:05:33
つうか、C++使ってる時点でコールバック関数なんて概念、捨てれば?
721706:2006/06/03(土) 13:12:02
皆様、勉強不足ですみません。
今、色々皆さんから教わったキーワードでググっているところです。
結構ヘタレなので、理解に時間がかかっています。
722デフォルトの名無しさん:2006/06/03(土) 13:17:53
でもさ、staticで宣言された関数って、そのクラスのインスタンスの生成前でも呼べるんだぜ?
どういう事か、考えてね/
723デフォルトの名無しさん:2006/06/03(土) 13:48:46
http://www.cmagazine.jp/src/kinjite/cpp/scale.html#index4
コールバックこれオヌヌメ
724デフォルトの名無しさん:2006/06/04(日) 13:33:28
STLでのソートをしていますが、

struct foo
{
  int number;
  std::string name;
};

のような構造体を作り

std::vector<foo> team;

のような動的配列を作り、がしがし追加していきます。
あとでnumber順にソートしたくなったとき

std::sort( team.begin(), team.end() );

では比較できないため、関数オブジェクトを作りました。
725724:2006/06/04(日) 13:35:03
class comp
{
public:
  bool operator()( const foo &left, const foo &right )
  {
    return left.number < right.number;
  }
}

そののち、

std::sort( team.begin(), team.end(), comp() ); // compの一時インスタンスを作る

するとソートされます。
分からないのは、構造体やクラスを抱えたコンテナのソートをするには、
その度に関数オブジェクトを作らないといけないのでしょうか。
intとかstd::stringならgreater<>が用意されているのは調べました。

調べた本はSTL標準講座、あとはぐぐりましたが、そこまで書いてあるものは見つけられませんでした。
726デフォルトの名無しさん:2006/06/04(日) 13:38:07
>>725
クラス自体の順序付けを定義する operator < をつけてしまえば
関数オブジェクトを渡さなくてもソートできる。そうでなければ
関数オブジェクトを渡す必要がある。

これが面倒なんで、 boost::lambda とか使って楽をしようという道もある。
727724:2006/06/04(日) 14:44:29
>>726
operator<を定義しておけばいいのですね、ありがとうございます。
いまのところ、ソートのキーは1つだけなので、それでいきます。
将来、複数のキーでソートするときはboost::lambdaを調べます。
728702:2006/06/05(月) 08:21:54
>703
プロセスハンドルとウィンドウハンドルの違いも分からずお恥ずかしい限りです。
ということは、この方法ではメッセージを投げることはできないのですね。
FindWindowを使えば…とは思いますが、クラス名とウィンドウ名で判断するのはなんとも…。

ありがとうございました。
729デフォルトの名無しさん:2006/06/05(月) 17:04:14
>>728
例えばEnumWindowsで、各々に対してGetWindowThreadProcessIdするとか。
730デフォルトの名無しさん:2006/08/25(金) 08:59:50
C++って、Cで使っていたものをより安全・便利に利用できる ってだけ?
C++形式で書くとわかりやすくはあるけど、Cでできなかった〜がC++にしたからできる、という状況に遭遇しない。
731デフォルトの名無しさん:2006/08/25(金) 09:07:03
>>730
1からC++を勉強し直す事をお勧めする。
732デフォルトの名無しさん:2006/08/25(金) 10:10:24
>>730
>Cでできなかった〜が
具体的に何かある?
733デフォルトの名無しさん:2006/08/25(金) 19:33:45
>安全・便利に利用できる
これに何の価値も見いだせないなら、Cを使っていればいい。
734デフォルトの名無しさん:2006/08/26(土) 18:27:32
>>732
何もない
メールを使わずに郵便封筒でもいい
勤務表をエクセルでなく、手書き+時間計算をすればいい、要はコスト削減

具体的にはクラスってやつでくくるのよ、コードをパックにする(カプセル化)
カプセルにしたら、ネット上で公開されてる別のカプセルを使えるのが利点
Cなら関数のコピペでしょ、それがファイル単位になる
735デフォルトの名無しさん:2006/08/28(月) 11:14:57
>>734
じゃなくて、「Cでできない事」って何さ。
736デフォルトの名無しさん:2006/08/28(月) 12:14:21
Cで出来ない事。例えば例外処理とか。
Cでlongjmp/setjmpを使っても、例外処理と全く同等の機能を
実現する事は出来ない。
737デフォルトの名無しさん:2006/08/28(月) 23:55:48
>>735
うんむ、デザパタとかじゃなく、不可能なことてことか
ま、1本1本線引いたらGUIもできるしな〜
PGが1万人いたら何でも可能ってとこかな
738デフォルトの名無しさん:2006/09/09(土) 00:11:00
とにかくC++という字面を見るな。
CとC++は無縁。
Cのテクニックは全て忘れろ。

Cはアセンブラの亜種とでも思っておくと丁度しっくりくる。
739デフォルトの名無しさん:2006/09/09(土) 12:31:57
effectiveC++買ってきた
740デフォルトの名無しさん:2006/09/11(月) 21:57:41
Cではインラインアセンブラがあるように、
C++では、インラインでCも書けると思うのがよいのかもしれない。
741デフォルトの名無しさん:2006/09/17(日) 00:26:11
Cを全く知らないんですが、いきなりC++から始めようと思います。
そこでCの知識を全く必要としないC++の書籍を探していますが、
私の目にした多くの本はCを知っていることが前提となっていました。
なにかお勧めのものはないですか?
742デフォルトの名無しさん:2006/09/17(日) 07:58:04
>741
Accelerated C++
743デフォルトの名無しさん:2006/09/17(日) 19:03:52
 多くの言語がCを模倣しているからたいていの本はそう見えるとと思う(変数や条件分岐や繰り返しはどのプログラミング言語でも共通している)。薄っぺらいcの本で少しc勉強してから、c++に手を出してみたら。accelateded c++ は何冊か読んでからの方がいいと思う。
744デフォルトの名無しさん:2006/09/17(日) 19:41:40
>>741
まずアセンブラをやれ
すこしかじるだけでいい
実際、C++の本にはメモリやアドレスの「定義」が載っていないので
それ無しではかならず詰まる。これは君の責任ではない
ただCはやらなくてよい
745デフォルトの名無しさん:2006/09/17(日) 20:10:41
C++ == C + オブジェクト指向
だからC言語を知らないとC++は使えない。


なんてアホな事を言う奴の話は聞くなよ。
C++の奥義はboostの中にある。
746デフォルトの名無しさん:2006/09/18(月) 04:42:12
かといって、いまどきのアセンブラ教科書を買ってしまうと…
747デフォルトの名無しさん:2006/09/18(月) 10:35:13
つーかいきなりC++から始めようと思っても、やはり情報が無い、
もしくは極めて少ない、加えて超いばらの道だよね。
やっぱCかじってから入った方がいいんでねぇの?
748デフォルトの名無しさん:2006/09/18(月) 15:19:52
普通Cからじゃね?
749デフォルトの名無しさん:2006/09/18(月) 15:48:22
技術者同士の会話で「普通」はねぇだろ。何の根拠にもならん。
750デフォルトの名無しさん:2006/09/18(月) 16:54:48
それもそうだな
751デフォルトの名無しさん:2006/09/23(土) 04:55:07
C++を0から教えるにしても最初の方はCと大差ない講義にしかならんと思うけど?
752デフォルトの名無しさん:2006/10/10(火) 01:20:32
オブジェクト指向から入れば?
753デフォルトの名無しさん:2006/10/10(火) 12:31:54
いきなりTMPから始めちゃえばいいよ
754デフォルトの名無しさん:2006/10/20(金) 23:27:32
古典的なCの教科書から入った人と
オブジェクト指向の概念からかじるような本で始めた人では会話が噛み合わない
そんな偏見を持ってたり
755デフォルトの名無しさん:2006/10/22(日) 02:38:27
>>224
わざわざ数字コテにして自分の存在をアピールしても
他と同様、カスであることに変わりはないんだから無理すんなwww
756デフォルトの名無しさん:2006/10/22(日) 15:17:29
757デフォルトの名無しさん:2006/10/22(日) 15:41:12
>>735
OOP
758デフォルトの名無しさん:2006/10/22(日) 15:48:49
>>757 馬鹿発見
759デフォルトの名無しさん:2006/10/24(火) 10:16:29
最近のヘッダファイルに拡張子が付いていない理由を教えてください
760デフォルトの名無しさん:2006/10/24(火) 13:30:41
>>759
C++ではnamespaceに属することが推奨されるようになったが
stdio.hやiostream.hなどのライブラリをstdの名前空間に入れてしまうと
今まで作られてきたソースがみんなコンパイルエラーになってしまう。
そのため苦肉の策としてC++のヘッダうちstdに属するもののは.hをはずし
iostream.h→iostream
C言語標準のヘッダはさらに先頭にcをつけて
stdio.h→cstdio
として昔の仕様との互換性をもたせたらしい。
761デフォルトの名無しさん:2006/10/25(水) 01:57:18
エッチじゃないから♪
762デフォルトの名無しさん:2006/10/28(土) 23:16:27
>>739
俺も昨日買って来たぞ。
C++は入門したばっかだけど、読み物としても面白いな。
含蓄の部分は徐々にわかっていくのだろうと期待。
763デフォルトの名無しさん:2006/10/29(日) 07:50:24
継承もとと同じクラス名で継承するにはどのように書けばよいのでしょうか?
そもそもそのようなことはできるのでしょうか?
764デフォルトの名無しさん:2006/10/29(日) 09:01:11
>>763
別の名前空間なんだよな?
継承元に名前空間の指定を付ければいいんじゃない?

これで違ってたら、ソースとエラーメッセージ晒せ。
765デフォルトの名無しさん:2006/12/15(金) 19:45:17
名前空間はCでも使えますか??
766デフォルトの名無しさん:2006/12/15(金) 19:50:02
使えない。
767デフォルトの名無しさん:2006/12/18(月) 19:15:24
すまん。

文字列定数の配列をクラス定義の中に埋める方法教えてくれ<(_ _)>
768デフォルトの名無しさん:2006/12/18(月) 22:32:35
それを返す静的なメンバ関数をインラインに書くしかないと思う。
769デフォルトの名無しさん:2006/12/19(火) 10:30:22
>>767

class CHoge {
public:
  static const char *A[];
};

const char *CHoge::A[] = { "HOGE1", "HOGE2", "HOGE3" };

こんな感じ?
770デフォルトの名無しさん:2006/12/19(火) 19:38:21
まいどどうも。
771デフォルトの名無しさん:2006/12/20(水) 01:00:52
>>769 const が足りねぇ。
772デフォルトの名無しさん:2006/12/20(水) 03:39:25
C++ってCよりポインタは簡単なんですか?
773デフォルトの名無しさん:2006/12/20(水) 04:55:47
>>772
一緒です。
774769:2006/12/20(水) 10:13:54
>>771
指摘サンクス。
static const char* const A[];

const char* const CHoge::A[] = { "HOGE1", "HOGE2", "HOGE3" };

ってことですね。詰めが甘いな俺orz
775デフォルトの名無しさん:2006/12/20(水) 10:24:19
だから const は右につけておけと
776デフォルトの名無しさん:2006/12/20(水) 19:00:56
ちなみにそれどう展開されるの?
777デフォルトの名無しさん:2006/12/20(水) 20:12:28
こうでもすれば、ヘッダだけで用が足りる。
class CHoge {
public:
static const char** GetA() {
static const char *A[] = {"HOGE1", "HOGE2", "HOGE3"};
return A;
}
};

>>772
参照・イテレータによって多少は使う機会が減るかもしれない。
スマートポインタによって動的メモリの解放し忘れは減るかもしれない。
そういう点では楽になるかもしれないが、学ぶべきことが減っているわけではないので、
結局簡単になったとは言えないと思う。
778デフォルトの名無しさん:2006/12/20(水) 20:26:12
>>772
Cのポインタすら理解して無い人には、C++はハードル高いと思う
779デフォルトの名無しさん:2006/12/20(水) 20:47:42
反復子ってポインタより簡単なんですか?
780デフォルトの名無しさん:2006/12/20(水) 21:22:20
ポインタをも包括する概念。
別に簡単になるわけではない。
781デフォルトの名無しさん :2006/12/20(水) 21:25:10
>>779
ポインタみたいに使えるけども
仕組みを理解するのには、ポインタ理解するよりめちゃめちゃ難しい。
782デフォルトの名無しさん:2006/12/20(水) 21:34:50
そうかな?
聞くより手を動かしたほうぐあ
783デフォルトの名無しさん:2006/12/20(水) 21:55:21
使うのは簡単だけど作るのが面倒
784デフォルトの名無しさん:2006/12/20(水) 23:12:18
コンテナおもしろがってつかってみたんさ。


劇重くてたいへんなことになっちゃた(T_T)
どーしよ。
785デフォルトの名無しさん:2006/12/21(木) 00:15:10
最適化オプションを目一杯指定する。
reserveを適切に使う。
(特にclass/structを格納する場合)オブジェクトのコピーをなるべく起こさせないようにする。

(メモリの割り当てに時間を取られている場合)アロケータを標準のものから高速なものへ取り替える。
786デフォルトの名無しさん:2006/12/21(木) 18:38:45
ofstreamで書き込みバッファの容量は指定できないでしょうか?
787デフォルトの名無しさん:2007/01/04(木) 19:58:39
ofstreamのバッファの容量はどこで指定できますか?
788デフォルトの名無しさん:2007/01/04(木) 21:28:43
>>787
標準的方法は存在しない
789デフォルトの名無しさん:2007/01/05(金) 02:42:17
>>787
filebufのpubsetbuf()が、stdioのsetvbuf()に相当する。

char mybuffer[8192];
of.rdbuf()->pubsetbuf(mybuffer, sizeof mybuffer);
790デフォルトの名無しさん :2007/01/06(土) 04:55:12
>>784
そんだけ、コンテナ内部で色々してるって事
重いのはしゃーねー
791デフォルトの名無しさん:2007/01/06(土) 05:52:38
>>790
そんな見方じゃ C++ の魅力がほとんど無いだろ。
効率を落とさずに抽象化できるのが C++ の重要な特徴の一つだ。

どうせ >>784 は最適化かけずに比較してるんだろ。
792デフォルトの名無しさん:2007/01/06(土) 18:59:45
STLのstringの簡易版のような自作文字列クラスのインスタンスを
直接char型ポインタ引数とかに渡しても大丈夫な(ちゃんとchar型ポインタとして使える)
ようにするにはどうすればよろしいですか
793デフォルトの名無しさん:2007/01/06(土) 19:06:00
>>792

class 俺string
{
    typedef char value_type;
    valut_type *value;
    ...
    operator const value_type *() const
    {
        return value;
    }
    ...
};
794793:2007/01/06(土) 19:08:01
可変長引数部分に渡しても大丈夫にする為にはデータメンバを char * ひとつだけにして、仮想関数を使わないこと。
795792:2007/01/06(土) 19:22:41
>>794
ありがとうございます
要は*のオペレータオーバーロードをするってことですか?
796デフォルトの名無しさん:2007/01/06(土) 20:06:27
>>795
そうだけど、それだけだと printf の第一引数には使えても第二以降の引数には使えない。
第一引数は printf 関数の第一引数が const char * だと型が明示されているから変換オペレータが
呼び出されるからいいんだけど、第二以降の引数は型が明示されていないから
変換オペレータが呼び出されないから >>794 のルールを守ってないとアウト。
797792:2007/01/06(土) 20:32:14
>>796
可変長引数に渡す場合に気をつけろということですね
詳しく、サンクスです
798デフォルトの名無しさん:2007/01/18(木) 23:02:38
valarrayってSTLに含まれるんですか?
799デフォルトの名無しさん :2007/01/19(金) 02:33:30
>>798
STLと完全互換ではない
800デフォルトの名無しさん:2007/01/19(金) 05:25:46
800
801デフォルトの名無しさん:2007/01/19(金) 14:21:12
#defineをconstで置き換えています。

void f(void)
{
    const int x=10;
}

void f(void)
{
    static const int x=10;
}
では何か違いが出ますか?
クラス内の定数は、複数のconstのインスタンスが作られないようstaticをつける様にしているのですが、
通常の関数の場合はどうなのでしょうか?
802デフォルトの名無しさん:2007/01/19(金) 14:27:00
>>801
定数式で初期化してて、アドレスや参照を取ってなければ違いは無いだろうね。
実際はコンパイラによるだろうから、アセンブリ吐かせて確認したほうがいいだろう。
803デフォルトの名無しさん:2007/04/13(金) 09:53:01
文字列を空にするのにどうして
strcpy(s, NULL);
じゃいけないのでしょうか?
804デフォルトの名無しさん:2007/04/13(金) 10:12:29
>>803
スレタイ100回音読の刑に処す。
805デフォルトの名無しさん:2007/04/13(金) 10:52:44
>>803
たった数行の質問で、色々と間違いをしてるのがすごいな
806デフォルトの名無しさん:2007/04/19(木) 13:47:15
*s=NULL;
807デフォルトの名無しさん:2007/04/19(木) 19:38:19
キモ
808デフォルトの名無しさん:2007/04/22(日) 18:24:01
ディスクに完全に書き込むためにfsyncを使いたいのですが、ofstreamでのファイル記述子は
どのように取得したらよいのでしょうか?
809デフォルトの名無しさん:2007/04/22(日) 21:32:40
移植性のある方法は存在しない。
逆にファイル記述子を通じて読み書きするストリームバッファを
自分で作れというのが正攻法だが面倒。
最近ではBoost.Iostreamsが支援してくれるけど。
810デフォルトの名無しさん:2007/05/25(金) 01:08:57
CからC++に移行するためにCの勉強はじめた。

#include <stodio.h>

int main(void)
{
printf("Hello, World!!\n");
}

(゚∀゚)=3 ムッハー!!
811デフォルトの名無しさん:2007/05/25(金) 06:12:25
が、がんがれ〜w
812デフォルトの名無しさん:2007/05/25(金) 08:52:56
C++とCは別物的な書き込みもあるようですね。
みんなどのあたりからC++へ移行したの?

とりあえず入門本は理解したから、あとはポインタとかをしっかり勉強してから
C++へ移行しようかとか思ってたんだけどアドバイスください。
813デフォルトの名無しさん:2007/05/25(金) 09:40:31
奥村先生の本がお薦めだよ
814デフォルトの名無しさん:2007/05/26(土) 01:56:39
ヘッダに関数の中身の書いてあるソースや
ヘッダに構造体がtypedef structじゃなくてstructだけで宣言してあるソースが
たくさんあるソースを綺麗にする作業にあたった・・・逃げ出したくなった・・・orz

結構つらいなこれ
引数に

int getSub(struct RGB_LL_COLOR col)

とかあって、こんな使い方正直みたことなかった・・・
どうしてstructをtypedef structに直すとエラーが出るのかさっぱりわからんかった

今日、ちょっとだけ理解できた・・・気がするw
815デフォルトの名無しさん:2007/05/26(土) 15:14:44
それってC++どころかCでもかなり初歩じゃん
816デフォルトの名無しさん:2007/05/26(土) 18:16:54
>>815
どうするのが普通なんだろ?
817デフォルトの名無しさん:2007/05/26(土) 20:16:05
struct RGB_LL_COLORのままで構わないと思う
818デフォルトの名無しさん:2007/05/27(日) 10:29:38
>>817
それだとヘッダが重複するとインクルードガードがあっても
エラーがでるやんか?
819デフォルトの名無しさん:2007/05/27(日) 12:20:07
それはtypedef使うと解決できる問題と思えない
820デフォルトの名無しさん:2007/05/27(日) 12:50:42
>>819
そもそも俺がtypedefもstructもどういう命令文なのか理解できてないのが問題だな
構造体はこうやって宣言するんだぞ。以上
って入門書読んだだけだったからなーw

最初こんな↓風になってた

ヘッダ部(ここから)

構造体定義
struct RGB_LL_COLOR{
  int *R;
  int *G;
  int *B;
}Rgb;

関数定義
int setRgbColorXXX(struct RGB_LL_COLOR *out,int a,int b);

ヘッダ部(ここまで)

このヘッダを#includeしようとすると一箇所でしか#includeできない
#includeしてるヘッダも一箇所でしか#includeできない

って状況だった
821デフォルトの名無しさん:2007/05/27(日) 12:56:54
ところでこんなスレにいるからには、ついでにC++化しているということでいいのか?
ならtypedefを使わずともstruct RGB_LL_COLORではなく、RGB_LL_COLORと使えるぞ。
822デフォルトの名無しさん:2007/05/27(日) 13:05:28
>>821
こまかいことは気にするなw

ああ、ちなみに間違えた>>820の関数定義は内容も書いてあった
int setRgbColorXXX(struct RGB_LL_COLOR *out,int a,int b){
内容が書いてある
}

まあ、>>820を普通にこう直したんだ

ヘッダ部(ここから)

構造体定義
typedef struct{
  int *R;
  int *G;
  int *B;
}RGB_LL_COLOR;

関数宣言
int setRgbColorXXX(RGB_LL_COLOR *out,int a,int b);

ヘッダ部(ここまで)

823デフォルトの名無しさん:2007/05/27(日) 13:07:21
ソース部(ここから)

ヘッダのインクルード
#include "rgb_color.h"

関数定義
int setRgbColorXXX(RGB_LL_COLOR *out,int a,int b){
内容が書いてある
}

ソース部(ここまで)

という感じにしてどこからでもヘッダを呼べるようにした
>>820の状態ではヘッダとソースでわけることもできんかった
824デフォルトの名無しさん:2007/05/27(日) 13:15:13
まず「宣言」と「定義」の区別が曖昧だから、しっかり意味を確認しような。

>>820 が駄目なのは struct ... Rgb; という変数がヘッダで定義されてるから。
>>822-823 ではその変数の定義が消えてるんだが、いいのか?
825デフォルトの名無しさん:2007/05/27(日) 22:35:17
>>824
そうそう、グローバル変数になってたから消した
826デフォルトの名無しさん:2007/05/28(月) 00:01:52
> このヘッダを#includeしようとすると一箇所でしか#includeできない
> #includeしてるヘッダも一箇所でしか#includeできない
インクルードガードかけろよ
まあヘッダでインライン関数でない関数を定義するのは論外だけどさ
827デフォルトの名無しさん:2007/05/28(月) 02:40:59
>>826
いや、だからダメだったんだって
書いてあるっしょー
828デフォルトの名無しさん:2007/05/28(月) 02:44:10
ちなみにインクルードガードをつけてもダメだったから

struct RGB_LL_COLOR{
  int *R;
  int *G;
  int *B;
}Rgb;

こう↑なってたのを

struct RGB_LL_COLOR{
  int *R;
  int *G;
  int *B;
};

こう↑やってみたりもしたけどやっぱり駄目だった希ガス
まあ、とにかく色々いじってダメだったんだ
829デフォルトの名無しさん:2007/05/28(月) 03:37:04
>>828
その変更はインクルードガードが正常に機能するでしょう。
そろそろスレ違いなんで適切な場所に移動しませんか。
830デフォルトの名無しさん:2007/05/28(月) 11:53:07
つまり、>814も>814が預かったソースもダメ過ぎってことだろ?
831デフォルトの名無しさん:2007/05/29(火) 14:47:45
有り体に言えば、そう。
832デフォルトの名無しさん:2007/05/30(水) 00:39:14
=演算子をオーバーロードしたときに
return *thisを使うのはなぜですか?
+演算子でつかっていた
return tmp;ではどうしてだめなのですか?
833デフォルトの名無しさん:2007/05/30(水) 09:10:49
副作用が起こるのが=だから、普通はtmpなんて宣言しないしtmpなんて返さない。
834デフォルトの名無しさん:2007/05/30(水) 10:56:24
どういうしくみでその副作用が起こるのかがよくわかりません・・・・
835デフォルトの名無しさん:2007/05/30(水) 10:58:36
副作用の意味を辞書で調べてきなさい
836デフォルトの名無しさん:2007/05/30(水) 11:05:15
>>832
Effective C++ くらい買っとこうや。
837デフォルトの名無しさん:2007/05/30(水) 16:13:32
>>832
1. 値を返すより参照を返すほうが効率的だから
2. (x = y) = z;のような病的な例に対応するため
 一般に(複合)代入演算子の結果は組込型だと左辺値になるはずで、それと同じ挙動を目指していると考えればいい
838デフォルトの名無しさん:2007/05/30(水) 21:23:48
effectiveC++って独習C++とAccelerated C++の演習を
一通りやった程度の経験で理解できるでしょうか?
なんか書評見ると中級者向きって書いてあってなんか難しそうなんですが・・・・
839デフォルトの名無しさん:2007/06/01(金) 12:17:31
>>838
>effectiveC++って独習C++とAccelerated C++の演習を
漏れはどっちもやったことないけどEffectiveC++は理解できたよ。
つーか、半年C++と悪戦苦闘して見つけたノウハウが全部書いてあって笑えた。
840デフォルトの名無しさん:2007/06/06(水) 01:03:43
841デフォルトの名無しさん:2007/07/04(水) 00:00:36
すげえ基本的なことなんですが・・・。
Cの時ってDBとかファイルとかからデータもってき足りする場合は大体構造体で管理してました。
a[i].name=なんたらって感じで
これってC++ではクラスで定義するかと思うんですが、メンバ変数がいままでの構造体データに相当して、
メンバ関数を色々定義して便利に使う、という解釈でいいんでしょうか?
(ンストラクタとかデストラクタとかは自分で定義して)

後、一々書くの面倒だからこれ使えば?ってのはあったりします?>STLの様なもので。
842デフォルトの名無しさん:2007/07/04(水) 02:39:06
>>841 好きにしろ。
843841:2007/07/04(水) 19:51:08
>>840
ちょw冷たいww

ってよくみると誤字脱字ひどいですな、スマソ。

Effective C++ 買ったし、読んで好きにしてやるうううううう。
844841:2007/07/04(水) 19:51:46
840は842の間違い・・・orz
845841:2007/07/04(水) 21:44:40
Effective C++読んだらいかに馬鹿馬鹿しい質問かというのが分かり申した。
大人しくconstで定義させていただきマッスル。
自分で全定義書くのもありだし、vectorあたりでその辺省略するのもありですな・・・素晴らしい。
846デフォルトの名無しさん:2007/07/05(木) 17:49:09
クラスのコンセプトについてわかりやすく解説しているサイトを教えてください
847デフォルトの名無しさん:2007/07/05(木) 22:55:57
848デフォルトの名無しさん:2007/07/13(金) 06:12:23
C++でやるならクラスは使ったほうが良いの?
俺が組むプログラムはstructで事すんじゃうんだけど
たまにわざわざクラスを使ってみたりしてる
クラスだと何がどう良いのかマジわかんない教えて
849デフォルトの名無しさん:2007/07/13(金) 10:12:04
>>848
そう思うのなら、使わなくていいんじゃない?
私が作るC++のプログラムも、1/3はクラスを使わないし使ううちの半数はstructで済むし。
850デフォルトの名無しさん:2007/07/13(金) 10:19:36
1、C++の場合、class だとデフォルトで private、struct だと public。違いはこれだけ。
2、classが使いたくなるまでは、無理して使う必要はない。
3、クラス使わないのにC++を使う理由は?

いろいろあります、好きなのをどぞ。
851デフォルトの名無しさん:2007/07/14(土) 01:29:18
>>849-850
レスありがとう
使いたくなるまでは使わないでみる
852デフォルトの名無しさん:2007/07/16(月) 16:59:14
1.だね。
いつも明示的にprivate等はつけてるので、違いは無いって思ってる。
まあ好きなほうで書けば。
853デフォルトの名無しさん:2007/09/04(火) 13:17:37
参照ってどんなときに使うものなのでしょうか?
854デフォルトの名無しさん:2007/09/04(火) 23:14:06
ポインタを変更しないことが分かりきっていて、かつ * を打つのが面倒なとき
855デフォルトの名無しさん:2007/09/05(水) 01:10:55
でっかいものを渡すとき
普通に渡すとでっかいもののコピーが渡されて容量を無駄に食ってしまうので
その代わりに参照を渡してやればコピーが生成されない分節約になる
856デフォルトの名無しさん:2007/09/05(水) 01:21:38
あとはコピーを生成してはいけないときなどに使うんだが
これは現段階で色々説明するのは難しいと思う
857デフォルトの名無しさん:2007/09/05(水) 07:10:32
>>855
Cだとconstなポインタを使っていたところだな。
858デフォルトの名無しさん:2007/09/24(月) 07:44:50
>>855
でっかいものって、もともと配列はコピーされないんじゃないの?
859デフォルトの名無しさん:2007/09/24(月) 09:55:00
クラスとか構造体とか配列以外にもでっかいものは色々ある。
860デフォルトの名無しさん:2007/09/24(月) 13:34:53
北海道?
861デフォルトの名無しさん:2007/09/26(水) 18:56:27
俺の夢とかもな
862デフォルトの名無しさん:2007/09/26(水) 20:20:12
ちっちぇ〜w
863デフォルトの名無しさん:2007/09/26(水) 22:59:51
漏れのぬるぽはでっかいですよ。
864デフォルトの名無しさん:2007/09/27(木) 01:54:51
♣アッー♠おっきい♥
865デフォルトの名無しさん:2007/09/28(金) 05:37:31
なんで ウホッ♦ が無いんだ?
866デフォルトの名無しさん:2007/10/06(土) 00:52:44
このスレは勉強になるな。やっぱり。
867デフォルトの名無しさん:2007/10/06(土) 01:21:35
ならやらないか
868デフォルトの名無しさん:2007/10/06(土) 01:41:46
入れさせてくれるのなら?
869デフォルトの名無しさん:2007/10/12(金) 17:12:11
テンプレートを使い始めたら、コンパイル時にリンカエラーが出るようになりました。
ネットで調べてみたところ、ヘッダファイルに本体もすべて書けばいいとのことですが、
こんな方法しか解決方法はないのでしょうか?
870デフォルトの名無しさん:2007/10/12(金) 17:14:05
テンプレートの明示的実体化という方法もある。
こちらからコンパイルして欲しいものを指定するというやり方。
871デフォルトの名無しさん:2007/10/12(金) 18:57:37
>>870
kwsk
872デフォルトの名無しさん:2007/10/13(土) 05:30:00
ktwr
873デフォルトの名無しさん:2007/10/13(土) 11:48:12
>>870
テンプレートの明示的実体化というのはどのようにやればよいのでしょうか?
874デフォルトの名無しさん:2007/10/13(土) 11:55:23
875デフォルトの名無しさん:2007/10/21(日) 17:03:59
Cでは配列を関数に渡すのにポインタ経由してましたが、
C++で参照を駆使してどうにかなりますか?
配列への参照、って可能?
876デフォルトの名無しさん:2007/10/21(日) 18:32:04
>>875
参照は実際のプログラミングではまず使わないから安心して
877デフォルトの名無しさん:2007/10/21(日) 18:33:50
>>876
こらこら嘘を教えちゃいかん
878875:2007/10/21(日) 21:13:36
ごみん自己解決
879デフォルトの名無しさん:2007/11/29(木) 23:21:54
というか、C++では「配列」をまず使わない。
みんなstd::vector。当然渡すのもvectorへの参照。
880デフォルトの名無しさん:2007/11/29(木) 23:33:08
>>879
そんなアホな
881デフォルトの名無しさん:2007/12/01(土) 07:14:10
C時代に

void strhoge(void);
void wcshoge(void);
#ifdef _UNICODE
#define _tcshoge wcshoge
#else
#define _tcshoge strhoge
#endif
_tcshoge();

って書かれてたコードを

void str::hoge(void);
void wcs::hoge(void);
#ifdef _UNICODE
namespace tcs = wcs;
#else
namespace tcs = str;
#endif
tcs::hoge();

と書き換えてみたんだけどC++的にはあり?

namespace ってマニュアル読むとCのマクロ並に他の識別子を隠す危険機能みたいなのに、詳しく説明してる本とか見つからない。
namespace 名前付け規約みたいのってあります?
882デフォルトの名無しさん:2007/12/01(土) 13:08:30
そういうコードはもちろん可能。

名前空間の名前付け規約というようなものはない。
みな勝手に名前を付けてる。
883デフォルトの名無しさん:2007/12/02(日) 00:16:39
そうなんですか、怖いですね。
名前の上書き力はマクロの次ぐらいに強いのに。
オープンだからダブっても気にしないってことなのかな。

無名 namespace が絡むと途端に繊細になるし...

namespace A{ namespace{
hoge;
}}

namespace{ namespace A{
hoge; // 別物!
}}

A::hoge // 解決できない! アクセス方法は?
884デフォルトの名無しさん:2007/12/24(月) 18:47:14
名前空間は識別子をだぶらせないための仕組みだけど、
名前空間をだぶらせない方法はない。
いや、あるにはあるけどそれは結局名前空間という無限再帰。
885デフォルトの名無しさん:2007/12/29(土) 20:17:23
>>876
CとしてC++をつかう状況であるならひどい。例えば・・・

あるプロジェクトのリーダがC++をよくしらないとする。
自分がレビューできないもんだから、C++特有のコード
はかかない規約をつくっちまう。

そうするとC++が適切につかわれず、コストかけてC++
を勉強したチームメンバはモチベーションがさがる。
886デフォルトの名無しさん:2007/12/30(日) 18:31:52
あるある。
#define で数値を定義するときははカッコでくくれ、とか。
887デフォルトの名無しさん:2008/01/07(月) 12:13:01
>>886
括弧で括るのは当然じゃないか。
問題は、数値をdefineマクロで定義することの方だろ。
888デフォルトの名無しさん:2008/01/07(月) 17:37:07
は?だからstatic const を知らずに変な規約作るおかしさを書いたわけだが?
889デフォルトの名無しさん:2008/01/07(月) 18:05:46
その規約自体は(過去の柵などの理由があれば)おかしくはないだろ。
別途、「定数値は(原則として)static const を使え」とでもしておけばよろしい。
890デフォルトの名無しさん:2008/01/21(月) 20:14:21
Cプログラマの為に、ポイントをまとめたドキュメントを販売しています。
プロのプログラマでもあまりにレベルが低い人が多すぎます。
そんな人に限って、自分のレベルの低さを自覚していない、、、
 本人は構わないかもしれませんが、その下についた新人プログラマは
たまったものではありません。(私が経験しました。)
 今になって分かりました。
彼らもまた、理解できていなかったのです。
 プログラミング言語の一番の習得の近道はきちんと理解している人にアドバイスをもらうこと。です。
私のC言語に取り組んだ7年間をすべてぶつけたつもりでテキストを作りました。
 私の会社の後輩からは、どんなテキストよりもわかりやすかった!や、
今まで教えてくれていた先輩や、テキストたちが、ちゃんと理解できていないことがわかりました。
と、嬉しいコメントをたくさんもらいました。
そしてなにより、彼らの社内での評価がとても高いということが、私の誇りです。
 興味がある方はどうか、下のサイトをみてみてください。
http://mori.eco.to/
891デフォルトの名無しさん:2008/01/31(木) 05:58:17
>>879
iteratorもしらんのか
892デフォルトの名無しさん:2008/03/02(日) 21:26:57
C言語の知識、経験はあるのですが、C++を覚え始め難しいと感じています。

C++の文法を解説した本、オブジェクト指向について解説した本をいくつか読み、
そろそろ手で打ちながらより実践的に覚えていこうと、C++を使ったシューティング
ゲームプログラミングの本を片手にやろうとしているんですが、内容が難しく感じます・・・。

段階的にC++を身につけていけるような書籍をご存知ないでしょうか?
クラス図なんかを見ていると楽しいですし、規模の大きなプログラムが作り易そうな
期待が持てます。
ちょっとずつ身につけていけたらと思っています。
893892:2008/03/02(日) 21:28:08
ageます。
894デフォルトの名無しさん:2008/03/02(日) 21:56:41
仲間クラス×4(攻撃、回復)
ボスクラス(攻撃、全体攻撃)

を作成してドラクエのようなターン制戦闘ができるプログラムでも作ってみれば
全員HPと攻撃力、防御力、素早さあたりのパラメータを持つとして。
895デフォルトの名無しさん:2008/03/02(日) 21:58:39
そうだな、
仲間2人は攻撃しかできない戦士クラスで
もう2人は攻撃と回復ができる僧侶クラスとでも名付けて、
僧侶クラスは戦士クラスを継承したクラスとして作ってみるといい
継承やオーバーロードといったものが理解できてないと作れない
896デフォルトの名無しさん:2008/03/02(日) 22:01:05
制限時間は一日ぐらいを目安な
ちゃんと基礎がわかってるなら一時間ぐらいで作れるはず
897デフォルトの名無しさん:2008/03/02(日) 22:04:10
>>892
解説書を理解していたらシューティング程度であれば難しくないはずだが…。
流し読みか?
898892:2008/03/05(水) 00:55:36
みなさん、ありがとうございます。
ご指摘いただいたことを目安に取り組んでみます。
899デフォルトの名無しさん:2008/03/05(水) 06:04:05
ワロタ
900デフォルトの名無しさん:2008/03/06(木) 20:56:32
__stdcallが よくわかりません
関数に__stdcallをつけるとつけないと何が違うのでしょうか?
つけるメリットは何?
901デフォルトの名無しさん:2008/03/07(金) 00:03:12
C++への移行とはなんの関係もないな。

stdcallは関数呼出の方法の1つ。引数を渡すのに使ったスタックポインタを戻す役目が
呼び出された関数側にあるのが普通と違う。

呼び出された関数側でスタックを戻すと、x86ではややコードを短くできるので
16ビット時代には重宝された。今では結構どうでもいい。
(16ビットのときにはstdcallなんてなかったけど)

32ビットWindowsが__stdcallを多用している関係上、
こっちが作る関数でも__stdcallの指定を要求されることがある。
また、Windowsでは他の言語でも
stdcallのDLL関数は呼び出せるというものが多い(VBとか)というのは利点と言える。
だから、DLLで公開する関数には付けておけ。
あとはWinMainとか必要なものに付けるという感じ。




902デフォルトの名無しさん:2008/03/07(金) 06:54:41
DLLで公開する関数って WINAPI でないの?
903デフォルトの名無しさん:2008/03/07(金) 07:06:10
__stdcallの別名がWINAPI
904デフォルトの名無しさん:2008/03/08(土) 14:09:51
関数名におまんこぜんかいって名付けると運気アップ
905デフォルトの名無しさん:2008/03/08(土) 14:24:16
574 名前:デフォルトの名無しさん[] 投稿日:2008/03/08(土) 14:23:43
585 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/08(土) 14:20:47
http://yutori.2ch.net/test/read.cgi/news4vip/1204952244/

   1 名前:以下、名無しにかわりましてVIPがお送りします。[] 投稿日:2008/03/08(土) 13:57:24.68 ID:oVsMTN3J0
     次世代言語”D言語”を使ってプログラミングをしてみよう!
     C++で挫折した君も、プログラミング初心者の君も今日からプログラマーだ!

     D言語入門 http://www.geocities.jp/tor_park/Dlang/d2.html
906デフォルトの名無しさん:2008/03/10(月) 00:07:27
初歩的な質問ですみません、c++で下記のような動作をするクラスを作る場合、
Test2宣言についてどうやればいいのかわかりません。
検索エンジンでクラス定義について調べたのですが参考となるものが見つからなくて…
ご教授してくださると助かります。

#include <stdio.h>
class Test1{
public:
Test2 *pT2; // ←意図的にTest2のクラスを呼び出したい
void print(){printf("test1\n");}
void test(){
pT2 = new Test2();pT2->print();delete pT2;
print();
}
};
class Test2{
public:
Test1 *pT1;
void print(){printf("test2\n");}
void test(){
pT1 = new Test1();pT1->print();delete pT1;
print();
}
};
void main(){
Test1 t1;Test2 t2;
t1.test();t2.test();
}
907デフォルトの名無しさん:2008/03/10(月) 00:35:43
Test1の定義より先にclass Test2;と書いておく。
これ、前方宣言という。
908デフォルトの名無しさん:2008/03/10(月) 01:24:45
>>907
ご教授ありがとうございます。
前方宣言をしてみたところ、
クラス、構造体、共用体にデフォルト コンストラクタがありませんなど、
他3つのエラーが出て困っていたのですが、”前方宣言 c++”で検索をして
同様な処理の対処方法が書いてある下記のページにたどり着きました。
ttp://archive.mag2.com/0000251805/20080129090000000.html

ありがとうございました。
909デフォルトの名無しさん:2008/03/10(月) 01:35:35
上記を元にこのように修正しました。
// 前方宣言
class Test2;
class Test1{public: Test2 *pT2;void print();void test();};
class Test2{public: Test1 *pT1;void print();void test();};
void Test1::print(){printf("test1\n");}
void Test1::test(){printf("Test1::test()の呼び出し :");pT2 = new Test2();pT2->print();delete pT2;}
void Test2::print(){printf("test2\n");}
void Test2::test(){printf("Test2::test()の呼び出し :");pT1 = new Test1();pT1->print();delete pT1;}
void main(){Test1 t1;Test2 t2;t1.test();t2.test();}
出力結果
Test1::test()の呼び出し :test2
Test2::test()の呼び出し :test1
お世話になりました。
910デフォルトの名無しさん:2008/03/10(月) 14:27:03
>>908
そのメルマガ、著者の知識が偏っているから要注意ね。
--
C++言語では、

struct _stFoo
{
int member1;
double member2;
};

と定義すればそのまま、

_stFoo stfoo;

と、型として変数定義することができる。
--
流石にこれはないだろw
911デフォルトの名無しさん:2008/03/10(月) 22:23:13
>>910
引用箇所の問題点がよく分からん。予約名を使ってるのが悪いのか?
912デフォルトの名無しさん:2008/03/11(火) 22:39:53
Cだと、
struct hoge { ... };
struct hoge hage;
としなければならないのを、
C++では、
struct hoge { ... };
hoge hage;
でもおkだよ、というのを説明してるんだろうけど、何が問題なのかはよく分からんな。
913デフォルトの名無しさん:2008/03/12(水) 19:59:14
namespaceの意味が分からん・・
914デフォルトの名無しさん:2008/03/12(水) 20:13:57
事務課の田中小枝子さんと
秘書課の田中小枝子さんを区別するためにある

秘書課に田中小枝子さんが二人いた場合は
部長の愛人の田中小枝子さんと
課長の愛人の田中小枝子さんで区別しろ
915デフォルトの名無しさん:2008/03/13(木) 10:19:20
>>914
みな同一人物のヤリマンというわけですね!
916デフォルトの名無しさん:2008/03/13(木) 10:30:11
>>913

俺ライブラリ
namespace oreore{
 template<class Ty>
 void foo(Ty x) {
  bar();
 }
}

自作プログラム
namespace oreore {
 void bar() {
 }
}

int main() { ... }

このように既存のライブラリに機能を付け加えて、
どの関数が呼ばれるのか分かりにくくする目的がある
917デフォルトの名無しさん:2008/03/18(火) 01:09:24
STDMETHODつけるとなにがいいのかな?
918デフォルトの名無しさん:2008/03/18(火) 07:33:27
タイプ数削減。virtual HRESULT __stdcallの短縮になっている。
919デフォルトの名無しさん:2008/03/23(日) 01:36:00
ありがとう
920age:2008/03/23(日) 22:11:20
ユニドライバのソースにでてくるPOEMDEV とはなんですか?
型なのはわかるんですが。。。あとユニドライバの開発に詳しい人
いたらお金を出すので専属で俺に指導してくれませんか?

質問はメール。場合により電話
報酬は月5万円固定。

でお願いします。「俺はユニドライバにくわしいぜ!」というやつ
いたら [email protected] におねがいします。m(_ _)m
921デフォルトの名無しさん:2008/03/25(火) 22:16:50
>>920
pOemDev
922デフォルトの名無しさん:2008/03/31(月) 12:34:24
__stdcallの中でDのクラス生成したりすると速攻で落ちるのはなぜですか?
923デフォルトの名無しさん:2008/03/31(月) 15:39:16
ma ti ga i ma si ta
924デフォルトの名無しさん:2008/04/03(木) 09:32:35
>>921
いい事いうじゃねえか。
で、やれるんだな?
今すぐ頼むぞ。
925デフォルトの名無しさん:2008/07/07(月) 21:22:41
すいませんが、
構造体の代入についてなんですけど、

struct papa{
int number; int mama_number;
}

struct papa menber[5000];

for(i=0;i<5000;i++){
menber[i]={i,i};
}

これをC++なら実現可能ということなので、
ヒントだけでも教えてください。すいません。
926デフォルトの名無しさん:2008/07/07(月) 21:47:13
Cでもキャストしたら入らないかな?
= (struct papa){i,i}
とりあえず手元のGCC4.1.2ではできたけど...
927926:2008/07/07(月) 21:50:07
連投失礼。C++の場合はCスタイルのキャストは余り好ましくないとされるので注意。
メンバ変数はprivateにして、メンバ関数でアクセスが普通のやり方じゃないかな?
928デフォルトの名無しさん:2008/07/08(火) 05:44:24
>>926
それ確か//なんかと同じでgcc拡張
929デフォルトの名無しさん:2008/07/08(火) 08:16:13
>>928
C99から標準。
930デフォルトの名無しさん:2008/07/17(木) 21:39:08
クラス指向の概念は理解できましたが、その設計構築がいまいち理解できません
どこかクラス設計の解説に長けているサイトや書籍はありませんか?
931デフォルトの名無しさん:2008/08/11(月) 00:52:55
VC2005以外のC++でも1つのクラスに属する関数を複数のcppファイルに
分けて記述することは可能ですか?
Cのextern宣言みたいなものは必要でしょうか。
932デフォルトの名無しさん:2008/08/11(月) 06:39:01
#include
933デフォルトの名無しさん:2008/08/11(月) 20:01:46
できるお
classを宣言したヘッダをインクルードしておけばいいお
934デフォルトの名無しさん:2008/08/11(月) 20:36:17
>>932-933
ありがとうございました
935デフォルトの名無しさん:2008/09/22(月) 13:08:26
char[]ではなくstringクラスを使うにあたって
itoa()やatoi()にあたるコードはC++ではどう書くべきでしょうか
936デフォルトの名無しさん:2008/09/22(月) 13:14:23
>>935
std::istringstream is(str);
is >> a;
937デフォルトの名無しさん:2008/09/22(月) 13:15:10
もしくはboost::lexical_cast

というかlexical_castは内部的に>>936のようなPSEUDOコードを
使っている
938デフォルトの名無しさん:2008/09/22(月) 13:17:40
>>935
大仰にしたくなければatoi(str.c_str())でもOK。
itoa()は使わないに越したことはないからstringstreamかね。
939デフォルトの名無しさん:2008/09/22(月) 14:42:12
>936
なるほど、stringstream系を通すと変換できるのですね。

>937
boost はまだ試していないのですが、色々便利そうです。
そのうち試してみます。

>938
折角C++なのでC++流に書いてみます。
本来ならCでもsprintf()やsnprintf()を使う場面ですが
説明しやすいためitoa()と書いてしまいました。
940デフォルトの名無しさん:2008/09/22(月) 17:58:05
凄い基本的な(?)ことで申し訳ないんですが

coutとprintfは同時に使えないんでしょうか?
コンパイルは通りますが、実行時にprintfのところでエラーが出ます。
ヘッダを色々変えてみたり、using namespace std;をつけたり外したりしましたが駄目でした。

よろしければお願いいたします。
941デフォルトの名無しさん:2008/09/22(月) 18:12:39
確か使える保証はないと書かれてたはず……だがどこに書いてあったか思い出せない。
一応バッファリングの問題とかがあるからね。
Boostが使える環境ならcout、そうでないならprintfの方が便利だと、俺は思う。
942デフォルトの名無しさん:2008/09/22(月) 18:18:21
>>940
処理系は?
943デフォルトの名無しさん:2008/09/22(月) 18:20:03
>>940
エラーメッセージは何て言ってる?
944デフォルトの名無しさん:2008/09/22(月) 18:42:31
>>940
混在させるとバッファリングの関係で出力に影響があるかも知らんが、
実行時エラーにはならないと思うんだ。
何かprintf()の使い方を間違っているんじゃないか?
# printf(str.c_str())していて、strの中身に%が含まれているとかw
945デフォルトの名無しさん:2008/09/22(月) 19:29:56
>>944
初心者の頃にやったなあw
最初の頃はprintf("%s",str);とか思いつかなかった。
946940:2008/09/22(月) 20:26:06
ありがとうございます
てことは私が何かポカしてる可能性が高いんですね
明日もう一度確認してみます

>>942
VC2005です

>>943>>944
今手元に無いんですが
「メモリが“read”になることができない」
「メモリが"written"になることはありませんでした」みたいなエラーです
まずい領域を参照したみたいな
でも printf("a"); でもエラー吐くんですよね
947デフォルトの名無しさん:2008/09/22(月) 20:26:35
げ、sage忘れたorz
948デフォルトの名無しさん:2008/09/22(月) 20:46:28
>>940
std::sync_with_stdio()はtrueを返すよね?
949デフォルトの名無しさん:2008/09/23(火) 05:36:17
>944-945
って言うか printf(変数) は危ないよ
第一引数は必ずフォーマットか文字列中に%を含まないと確実に保証できる文字列にすべき
それが問題になったソフトウェアは結構あるらしいしな
950940
解決しました
別の場所で配列に値を入れるところで、変なアドレスに値を入れていたみたなんですが
どういうわけかprintfの部分でエラーが出るようになっていたようです
そもそも最小構成で試してみたら全く問題ありませんでした

お騒がせして申し訳ありません