1 名前:デフォルトの名無しさん mailto:sage [2006/12/30(土) 20:07:25 ] スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
263 名前:デフォルトの名無しさん [2007/02/02(金) 11:26:29 ] あるn次元空間において、全ての点から遠くなるような点(最遠点)の効率のよい計算方法を探してます。 ただし、最遠点の範囲はそれぞれの軸で決まっていて、 例えば下図のような2次元空間上でこのように点があった場合、 赤点の位置を算出したいのです。 ttp://kjm.kir.jp/pc/?p=29115.gif ttp://kjm.kir.jp/pc/?p=29117.gif 上の場合は、点が偏っているために範囲ぎりぎりの点が選択されてる様子で、 下は周囲に点が偏っているので中央が選択されてる状態です。 このような点を探索する場合は、 全ての座標において点までの距離を計算し、最も遠くなるような座標を求める、 みたいな総当たりで調べていくしかないのでしょうか。 それともなにか効率のよいアルゴリズムはありますか?
264 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 13:42:23 ] >>263 点に接する円の径を最大化するように円の中心点を範囲内にとればいいのかな? 最急上昇法を使うのはどう? ローカルマキシマムに気をつけないといけないけど
265 名前:263 [2007/02/02(金) 15:24:35 ] >>264 つまりこういうことでしょうか? ttp://kjm.kir.jp/pc/?p=29123.gif ttp://kjm.kir.jp/pc/?p=29124.gif 3次元以上に使えるのかが分からないのですが、ひとまず調べてみようと思います。 回答本当にありがとうございます。
266 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 15:50:57 ] 点が疎な領域で風船(円)を膨らましていくイメージじゃないの? 3次元以上でも使える。
267 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 16:02:02 ] >>255 constがらみの文法は、わかりにくいですね。 他の人も言っているように、アンチョコを作りましょう。 頭の中に記憶しておく必要はないのです。 あやふやな記憶に頼ってコーディングをするのは、とても愚かな行為です。 (セキュリティのために、裸一貫でしか入退場できない場所での仕事は別だが・・・) constはちゃんと理解して使えるようにならないと、 他者の書いたコードやライブラリを使うことができません。 >>258 自分はtypedefを使って、なるべくわかりやすくするよ。 typedefを勝手にやるな! というルールのところもあるけどね。
268 名前:264 mailto:sage [2007/02/02(金) 16:56:55 ] >>265 言いたかった事は>>266 kjm.kir.jp/pc/?p=29126.gif kjm.kir.jp/pc/?p=29127.gif これはローカルマキシマムにはまった例 kjm.kir.jp/pc/?p=29128.gif
269 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 21:09:52 ] とりあえず適切に荒くマス目に区切って総当たりし、 その中から有望そうな部分についてマス目を細かくして総当たりし、 さらにその中から・・・ という具合に、ニュートン法みたいに繰り返していくのが無難そうよ。
270 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 22:21:45 ] 配列の宣言において、要素数にキーボードから入力した値を用いるにはどうすればよいでしょうか?
271 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 22:30:36 ] 配列は静的に確保しなきゃいけないから無理 vector使え
272 名前:デフォルトの名無しさん mailto:sage [2007/02/02(金) 22:51:59 ] >>270 int int_array[ #include "CON" ]; これでおk。
273 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:04:54 ] >>270 // for C(99) int num = キーボードから入力する関数(); AnyType_t array[num]; // for C++ // use std::vector. // for (regacy)C // try malloc() / free().
274 名前:270 mailto:sage [2007/02/03(土) 00:09:48 ] >>271 ,272 ありがとうございます。 説明不足で申し訳なかったのですが、 C++ではなく、Cで実現させたいのですが、 >>271 のおっしゃる通り不可能なのでしょうか?
275 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:11:11 ] >>274 >273
276 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:22:00 ] >>273 ,275 ありがとうございます。 初心者なもので、具体的に教えていただきたいのですが、 float型で変数nを要素数とするxという配列を作りたいときは scanf("%d",&n); float x[n]; でよろしいのでしょうか? やってみたところ、 ここでは宣言はできない(関数 main ) 定数式が必要(関数 main ) とのエラーが float x[n]; の行に出てしまいました。 ご教授願います。
277 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:33:06 ] >>276 今時、8年も前の規格も満たせないような半端モノのCコンパイラではなく、真っ当なCコンパイラを使ってください。 それがいやなら、C++でも使ってください。
278 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:53:05 ] >277 すみません、フリーのBorland C++Compiler 5.5です。 月曜日に学校のVisual C++コンパイラでやってみます。
279 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 00:55:42 ] いや、一緒だから。
280 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 01:03:41 ] C99がまともにコンパイルできるコンパイラで身近なものはiccしかない。 部分的にサポートならgccでもよいが完全ではない。 こういう状態だから「C99は死んだ規格」と呼ばれる。
281 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 01:34:13 ] >>277 まともなコンパイラを教えてください
282 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 03:47:23 ] >>281 >280
283 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 13:17:31 ] >>280 >こういう状態だから「C99は死んだ規格」と呼ばれる。 でも、決して無駄にはならないハズ。 なぜならその屍をC++0xが乗り越えてくれるから。
284 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 13:50:00 ] なーんだ結局C++に乗っかかるつもりかよ。やめてくれ。 ただでさえ複雑怪奇なC++の言語仕様をさらに複雑にする気か。 まあC++0xは文法を複雑にするというより、足りない部分を補う だけで、今の文法でも出来る事を焼き直すわけではないからな。
285 名前:263 [2007/02/03(土) 14:32:19 ] >>266-269 回答ありがとうございます。 ローカルマキシマムも図で説明しただいてよく分かりました。 ひとまず269の方法で試してみたいと思います。
286 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 19:03:10 ] C++で他のアプリケーションの画面の色を取得したり、クリックしたりできますか? できないなら言語は何がオススメですか?
287 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 19:25:09 ] それはC++かどうかよりもGUIのAPIもしくはライブラリの問題。
288 名前:デフォルトの名無しさん mailto:sage [2007/02/03(土) 20:31:25 ] はいはい、HSPHSP
289 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 14:53:13 ] ↓ですが、@がAとして認識されるということですが、 私はAがどういう場合に使われるのかがわかりません。 externで定義ってどういうことでしょうか? 大きな非互換項目の一つにconst型修飾子の取り扱いの違いがある。 C言語では記憶域クラス指定子を持たず、const型修飾されたファイル 有効範囲の識別子は、外部結合の識別子として取り扱われる。 一方、C++言語では内部結合の識別子として取り扱われる。 つまりC言語ではexternが補完されるのに対し、C++言語ではstaticが 補完されると考えればわかりやすい。多くのプログラマは、C言語での プログラミングにおいて、extern型修飾子は、変数の外部参照宣言を行 なう時にのみ使用し、変数の定義においては使用していない。 この問題は、const型修飾子を使用している多くのプログラムで発生する と予想される。 const int a=10; @ (C言語で認識される型) extern const int a=10; A (C++言語で認識される型) static const int a=10; B
290 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 15:28:27 ] >>289 どういうこともそういうことも、Cには昔const修飾子がなかったので const int a = 10はint a = 10と同じスコープを持つしかなかっただけなんだが。
291 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 15:48:37 ] >>289 CでもC++でもグローバル変数の定義にはexternを付けてもいいんだよ。 /* hoge.h */ extern int foo; /* グローバル変数fooの宣言 */ extern int bar; /* グローバル変数barの宣言 */ /* hoge.c */ int foo = 4; /* グローバル変数fooの定義 */ extern int bar = 2; /* グローバル変数barの定義 */
292 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 16:00:40 ] 定義に「付けてもいい」ってところがミソだな
293 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 19:11:39 ] >>290 、>>291 ご回答感謝します。 よくわかりました(助かりました)。
294 名前:デフォルトの名無しさん mailto:sage [2007/02/04(日) 19:12:09 ] >>292 >定義に「付けてもいい」ってところがミソだな どういうことでしょうか?
295 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:04:19 ] >>289 > 私はAがどういう場合に使われるのかがわかりません。 C言語では(1)と(2)は同じだから、どっち使うか自由なので (2)を使わなければいけない場面なんてないんじゃないのかな。 C++だと(1)は(3)の意味になる。 (3)では複数のファイルに同じものがあって無駄に感じるが そんなの気にしないで(2)を使わず(1)を使うようだね。
296 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:10:04 ] >>295 生半可な知識しかないなら回答しないでください。 >(3)では複数のファイルに同じものがあって無駄に感じるが 全くの思い違いです。
297 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:12:40 ] >>296 そうでしたか。 ごめんなさい。
298 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:36:07 ] C++で 複数のファイルに const int a=10; などがあっても 変数aというより値10が直接使われる。 複数のファイルに const int a=10; const int *p=a; とした場合はそれぞれのファイルで異なるポインタのaが存在るんじゃないの。
299 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 00:37:44 ] >>296 >無駄に感じる どう感じるかは自由だ
300 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 01:09:35 ] 同じ定義を複数のファイルに書いたりしない。一個をインクルードするだろ。常識的に考えて。
301 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 02:02:43 ] >>300 そういうこといっているんじゃないと思うが。 その通り実際にはヘッダファイルに書くけど ヘッダファイルにstatic const int a=10;を書いて複数のファイルからインクルードするのと 複数のファイルにstatic const int a=10;を書きのとで staticやexternの動作は変わらないでしょ。 それとも別の話?
302 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 14:30:40 ] 質問です、class Aを継承したclass Bが存在したとします。 class Aに仮想デストラクタが存在しない場合、class Bのデストラクタが呼ばれないと聞きました。 これは、常に真なのでしょうか? B Obj;などと動的に生成しなくても、デストラクタはやはり呼ばれないのでしょうか?
303 名前:デフォルトの名無しさん mailto:sage [2007/02/05(月) 14:55:20 ] >>302 A *obj = new B; みたいな使い方した場合。 Aに仮想関数が存在しなければobjはすべてAとして動作するから、 デストラクタもAのデストラクタが動けばいいけど 仮想関数が存在した場合、objはBとして動作することがある。 そのときBの動作してAのデストラクタしか動かなかった場合、危険でそ? B *obj = new B; のように宣言するならちゃんとobjが破棄されたときにBのデストラクタが動くはず。 でもそんなリスキーなこと考えず、仮想メンバ関数のあるクラスには virtualなデストラクタを置くのが常識。
304 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 00:48:51 ] >>300 に同意 ま、スレの題名通りの流れだから良いけど。
305 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 02:03:28 ] >>300 そもそも、 複数のファイルに書かれた static const int a=10; が、同じ定義かどうかは、わからないぞ。 ファイル内のローカルスコープなわけで、 ファイルによって aの値は違うかもしれないし、 今は同じでも今後変るかもしれない。
306 名前:デフォルトの名無しさん [2007/02/06(火) 11:36:10 ] blowfishをやろうと思っているのですけど、暗号化できません #include <stdio.h> #include "blowfish.h" #include "blowfish.h2" #define FilePath "text.txt" #define Key "keyword" #define BUF_SIZE 256 FILE *fp; char buffer[] = "asdfghjk"; char newbuffer[255]; CBlowFish *blow = new CBlowFish; blow->Initialize( Key, strlen(Key)); blow->Encode( buffer, newbuffer, BUF_SIZE); delete blow; fp = fopen(FilePath,"w"); fprintf(fp,newbuffer); fclose(fp); どこが間違っているのでしょうか?
307 名前:デフォルトの名無しさん [2007/02/06(火) 11:40:52 ] 質問です メインで使うクラスにデストラクタの中で 終了時にメンバ変数の領域をdeleteにより手動で開放する 意味はあるのですか?
308 名前:306 mailto:sage [2007/02/06(火) 11:55:53 ] すみませんけど、自己解決しました
309 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 14:56:08 ] >>307 確保したものは解放するのが当然。まして、「メインで使う」ことが何度もあるなら。
310 名前:デフォルトの名無しさん [2007/02/06(火) 15:11:02 ] ではもう使わないんなら解放しなくてもいいですね
311 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 16:15:41 ] デバッガでメモリリークを検出するようにしてるような場合、 そういうことを適当にしてるとせっかく検出したリークを 見落とすようなことになる。 それに限らず、「もう使わないから」って理由で開放漏れを 容認しだしたら、本当に深刻なリークが発生したとき あちこちに疑わしい箇所が散逸してて泣くことになると思うぞ。 一人で責任持てるなら良いかもしれんがチームのときは迷惑極まりない。
312 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:23:21 ] >>307 いや、さすがに冗談だよな……?
313 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:28:58 ] どうせOSが後始末をしてくれるし、終了処理してたら重くなるから リリースバージョンではabortで終了する。という人もいるみたい。
314 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:29:37 ] free論争は秋田
315 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:29:55 ] まさか307はこういうことを言いたいのか? class Hoge { public: ~Hoge() {delete &x;} private: int x; };
316 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:42:06 ] >>315 なんかおかしな事になりそうだから試したくないけど それしたらどうなるの?
317 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 17:49:39 ] おそらく未定義の動作。どうなろうと標準規格の関与するところではない。 鼻から悪魔が(ryとよく言われるやつ。
318 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 18:57:47 ] 同じオブジェクトを二回破壊しようとしたら実行時エラーでないか?
319 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 19:34:00 ] >>307 じゃないけどデストラクタでdeleteするのってダメなんですか? デストラクタって破棄される直前に呼ばれるんですよね?
320 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 19:44:22 ] メンバ変数がnewで確保されたものなら、デストラクタでdeleteするのは当然だが。
321 名前:デフォルトの名無しさん mailto:sage [2007/02/06(火) 19:52:51 ] ああ、>>315 をよく見て無かっただけですた びっくりしたぜ、サーセン
322 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 03:11:03 ] >>316 おそらく何も起きない。 というのも、スタック上にあればdeleteは、 んなポインタ知らないよとスルーするし、 ヒープ上にあっても、 んなポインタ知らないよとスルーするから。 デバッグ版なら、変なポインタをdeleteするな、って叫ぶかもしれない。 だがしかし、実装依存であり、何が起きても泣かない覚悟が必要だ。
323 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 03:59:03 ] へ?最近のdeleteはそんな親切設計というか過保護設計というかになってるの?
324 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 06:49:00 ] というか、そういう過保護な実装が存在するのか?だな。
325 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 07:55:33 ] しないだろ。
326 名前:デフォルトの名無しさん [2007/02/07(水) 10:30:05 ] クラスのメンバ変数についての質問です グローバル変数としてビュークラスの外で宣言したクラスの メンバ変数は0や空文字で初期化されてるんですが そのクラスをビュークラスのメンバとして宣言するとそのクラスの メンバ変数が初期化されないのはどうしてですか?
327 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 10:43:10 ] c++ 変数 初期化 の検索結果 約 145,000 件中 1 - 10 件目 (0.19 秒) ぐぐったら見つかるだろ
328 名前:デフォルトの名無しさん [2007/02/07(水) 10:46:50 ] >>327 わからないんなら答えなくていいよ
329 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 10:58:04 ] >>326 仕様です
330 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 11:13:14 ] >>326 向こうにちょっと書いたが・・・ グローバル変数はコンパイル時に場所を決定して0で初期化したブロックにできるが ヒープの場合実行時に割り当てられるので、わざわざ0クリアするコードを入れるわけ ではないので初期化はされない。 しかし期待した答えをもらえないからって文句言うな
331 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 11:13:54 ] ヒープの場合 を ヒープやスタックの場合 に
332 名前:デフォルトの名無しさん [2007/02/07(水) 11:14:54 ] すいませんありがとうございます
333 名前:デフォルトの名無しさん [2007/02/07(水) 19:07:36 ] C++の勉強したいんですけど、 ゲーム作りしながら学べるような本はありませんか? 持ってるのはVisualC++の6.0なんですけど…。
334 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 19:13:30 ] www.kohgakusha.co.jp/books/detail/978-4-87593-295-6 ゲーム作りではじめるMFC
335 名前:デフォルトの名無しさん [2007/02/07(水) 19:28:10 ] mallcoを使って二次元配列の領域を確保したんですけど, その配列の値を他の関数に渡すにはどうしたらいいんでしょうか?
336 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 19:43:56 ] 値で渡す場合は値渡しだね
337 名前:デフォルトの名無しさん [2007/02/07(水) 19:49:31 ] >>335 たとえばintなら int (*array)[10]; // int[10]型のポインタ変数array array = (int (*)[10])malloc(sizeof(int) * 10 * 5); // int [5][10] func(array[0][0]); // call 良く使うならint[10]型をtypdedef汁
338 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 19:58:36 ] 337はfuncの引数がint*となっている場合だね。 void func(int [][10]);などと宣言されていれば、func(array)と呼べる。
339 名前:337 mailto:sage [2007/02/07(水) 20:11:41 ] >>338 array[0][0]でちゃんと値を渡してるよ。 コンパイル通してみたから間違いないかと。
340 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:28:09 ] typedef版。要は配列の基底となる要素数を[10]です、と明示的に 宣言してやらないと領域だけあっても2元配列としては使えない。 typedef int ArrayType[10]; ArrayType *array; array = (ArrayType *)malloc(sizeof(ArrayType) * 5); // int [10]を5個分 func(array[0][0]);
341 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:53:06 ] >>323 WindowsのVC++のdeleteは、不正なポインタを渡すとint 3してくれたと思う。
342 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 20:55:49 ] >>333 2つのことを同時にやろうとするのは無駄が多いよ。 C++とゲーム作りと、別々に勉強することをお勧めする。 C++の良い参考書はいくつもあるが、 ↑と同レベルの、ゲームを作りながらC++を学ぶという本はないから。
343 名前:338 mailto:sage [2007/02/07(水) 21:31:32 ] >>339 ごめん。337ではfunc(&array[0][0])と書いてあるかと勘違いした。
344 名前:デフォルトの名無しさん [2007/02/07(水) 23:52:01 ] 構造体をヘッダファイルに定義して適当にインクルードしたら 二重定義ということで怒られてしまいました。 #pragma once を使用することで解決しましたが、今まで C言語をやっていて気になったことはありません。 コンパイルエラーになったのはC++ですが、C++でエラーになる ようになったのでしょうか? それともエラーにならなかったコンパイラが寛容だったということでしょうか?
345 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:52:48 ] お前がまともな規模のコードを書いてこなかっただけ
346 名前:344 mailto:sage [2007/02/07(水) 23:56:13 ] >>345 規模と何の関係があるんですか?
347 名前:デフォルトの名無しさん mailto:sage [2007/02/07(水) 23:59:42 ] >>344 C言語でもまともなコンパイラならエラーになる。 大きな規模のプロジェクトならば名前の衝突は経験することがあるはず。
348 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:05:11 ] >>344 Cでも「構造体をヘッダファイルに定義して適当にインクルードしたら二重定義ということで怒られ」ます。
349 名前:デフォルトの名無しさん [2007/02/08(木) 00:20:11 ] >>348 今Borland C++ 5.5.1をダウンロードして試してみましたが全く エラーになりません。 <struct.h> typedef struct test_st { int a; int b; }TEST_ST; <main.c> #include"struct.h" void testFunc(void); int main(void) {testFunc(); return 0; } <sub.c> #include<stdio.h> #include"struct.h" void testFunc() { printf("Hello\n"); } main.cとsub.cで2回構造体の定義(struct.h)をインクルード していますがエラーにならずに実行できます。 ちなみにエラーになったのはVC++でC++を使ったときでした。 これはエラーにならないコンパイラが甘いということでしょうか?
350 名前:344 mailto:sage [2007/02/08(木) 00:21:08 ] どうもVC++のバージョンを上げてから弾かれるようになったように 記憶しているのですが・・・
351 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:24:54 ] >>344 "piyo.h"というヘッダを作ったとします そしたらヘッダ内に #ifndef INC_PIYO_H #define INC_PIYO_H ・ ・ #endif /* INC_PIYO_H */ のような形の文を必ず書きなさい そうすればと二重インクルードガードとなる
352 名前:344 mailto:sage [2007/02/08(木) 00:32:02 ] >>351 いや、それは知っています。 それの代わりに#pragma onceでもいいってことも。 気になっているのはなぜ今までエラーにならなかったのかと いうことです。 実際、さきほどbccで試したらエラーにならなかったし。
353 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 00:44:43 ] struct.h をインクルードする struct2.hを作って main.cから #include "struct.h" #include "struct2.h" ってしてみれ 規模が大きくなるとそういう事が多くなる
354 名前:344 mailto:sage [2007/02/08(木) 00:54:32 ] >>353 ありがとうございます。 なんとなく分かった気がします。 同一ファイル内で1回なら問題ないということですね。 Cで自分で意識してインクルードした場合は、1ファイルにつき 1回しかインクルードしないので問題がなかったのですが、VC++で MFCを使うと勝手にインクルードとかされてエラーになるように なったんじゃないかと思います。
355 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 01:03:19 ] どんな名前になるのかわからないファイルを勝手にインクルードなどできるはずがない。
356 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 01:03:41 ] だからそれはCとかC++とかの問題ではなくて お前の書くプログラムの規模が小さかったから現れてこなかっただけだ。 ところで分割コンパイルと二重インクルード防止は基礎中の基礎だと思うんだが 最近の入門書じゃ教えてないっぽいな。 嘆かわしいなあ…
357 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 01:57:01 ] >>356 まともな入門書には書かれてるよ。 まともじゃない入門書でも、説明しているものがあるけどね。
358 名前:デフォルトの名無しさん [2007/02/08(木) 02:35:10 ] 質問です。以下のように、変数を自作クラスを使うベクタを使って作成する場合 どのようにして作成していけばよいのでしょうか。push_backメンバが使えると思うのですが いまいち自作クラスを使ったベクタでの使い方がわかりません。よろしくお願いします。 class A { int a; int b; public: void set_a(int seta) { a = seta; } void set_b(int setb) { b = setb; } int get_a() { return a; } int get_b() { return b; } }; int main() { vector<A> vec_a; /* vec_aに要素を追加する */ return 0; }
359 名前:358 mailto:sage [2007/02/08(木) 02:38:02 ] 訂正します。 どのようにして要素を作成していけばよいのでしょうか。
360 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 02:48:54 ] >>358-359 vec_a.push_back(A());
361 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 03:12:35 ] >>358 class Aに引き数をとるコンストラクタを用意した方が何かと便利かもね。 仮に、A(int seta, int setb);というコンストラクタがあるなら、 vec_a.push_back(A(0, 0));って感じで設定も同時に行なえる。
362 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 03:44:42 ] >>361 セッターの戻り値を *this にして vec_a.push_back(A().set_a(0).set_b(0)); なんてやるのもいいと思うけどね。 コンストラクタでやるのに比べるとちょっと冗長だけど、 このスタイルのほうがいろいろと都合がいいことってあるし。
363 名前:デフォルトの名無しさん mailto:sage [2007/02/08(木) 07:36:19 ] それマジ?