■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
C++相談室 part20
251
名前:
246
:03/06/17 16:26
>>249
.netってコンソールアプリケーションつくれるんですか?
252
名前:
デフォルトの名無しさん
:03/06/17 16:31
作れるよ
253
名前:
246
:03/06/17 16:42
>>252
どうやって?
っていうかwinアプリから分割コンパイルってできないん?
254
名前:
デフォルトの名無しさん
:03/06/17 16:46
出来るよ
255
名前:
デフォルトの名無しさん
:03/06/17 17:07
>>246
新規作成⇒C++プロジェクト⇒WIN32⇒アプリケーション設定⇒コンソール
OK
256
名前:
246
:03/06/17 17:21
>>255
ごめんなさい
やっぱコンソールでやってもやっぱりできないや・・・・
なんでだろう?
やっぱ本を買ったほうが手っ取りばやいと思うんだけど
.netでプログラムするときのお勧めの本知りません?
257
名前:
デフォルトの名無しさん
:03/06/17 17:40
違います.
externというのを追加してますか。
extern void fun();//こんふうに使いたいcppソースに
258
名前:
デフォルトの名無しさん
:03/06/17 17:42
それかソリューションにファイルが追加されているか。
259
名前:
246
:03/06/17 17:47
>>257
ソースファイルはfile1とfile2というのがあるんですが
file2.cppのほうに
extern g;
extern nibai(){
g*=2;
}
と関数を定義してみたんですがエラーがでてしまいます。
>>258
はい。ソリューションのところに2つともちゃんと追加されてます。
260
名前:
デフォルトの名無しさん
:03/06/17 17:50
だから、エラーて何よ?
>未解決の外部シンボル _WinMain@16 が
ってリンクエラーまだ出てるなら
WinMain関数がプロジェクトの何処にも無えって言われてるんだから
>>255
。
261
名前:
デフォルトの名無しさん
:03/06/17 17:54
#file2.cpp
int f(){}
#file1.cpp
extern int f();
int main(){
f();
return 0;
}
262
名前:
デフォルトの名無しさん
:03/06/17 18:01
#こちらにしたら
#test.h
int x2(int);
#file.cpp
int x2(int i)
{
return i*2;
}
#main.cpp
#include "test.h"
int main()
{
x2(10);
return 0;
}
263
名前:
246
:03/06/17 18:04
>>260
コンソールファイルにしたらそちらのエラーは消えたみたいです。でも
もうひとつのほうのエラーが消えないです・・・↓
error LNK2005: "int __cdecl nibai(void)" (?nibai@@YAHXZ) は既に file1.obj で定義されています。
264
名前:
デフォルトの名無しさん
:03/06/17 18:26
そのまま解釈してfile1.cppのint nibai(void)がどこかでも
定義されています。それはいけないよ。と言う事。
#file.cpp
int g = 0;
void f(int i)
{
g = i*2;
}
#main.cpp
#include <iostream>
extern int g;
extern void f(int);
int main(){
f(20);
std::cout<<g;
return 0;
}
265
名前:
デフォルトの名無しさん
:03/06/17 18:31
>>256
どこかのサーバにupして指示を仰ぐのが一番早いと思われ
266
名前:
246
:03/06/17 19:17
>>264
できました
ありがとうございました。
externってメインの方に書くんですね
勘違いしてた・・・
267
名前:
デフォルトの名無しさん
:03/06/17 19:53
>>239
構造体がポインタを持っているときは、
場合によるがmemcpyはよろしくない。
268
名前:
デフォルトの名無しさん
:03/06/17 19:56
>>267
さらに、構造体のメンバにクラスや構造体の変数があれば・・
それがスマートポインタ(auto_ptrやboost::shared_ptr)やstringだったりすると
参照数の不整合が起きるな。
269
名前:
デフォルトの名無しさん
:03/06/17 20:49
クラスをcppに書くのと
ヘッダーファイルに書くのとでは
何がどう違うんでしょうふぁ?
270
名前:
デフォルトの名無しさん
:03/06/17 21:21
何も違わないよ
271
名前:
デフォルトの名無しさん
:03/06/17 21:29
>>267
メンバにクラスのインスタンスがあるときは問題が出るだろうけど、
ポインタの場合はmemcpyだろうが関係ない気がする
メンバを一つずつコピーする場合と動作は変わらないし
で、具体的にどのような場合に問題が出るの?
272
名前:
デフォルトの名無しさん
:03/06/17 21:32
コピー戦略は基本的なことだから解説しているホームページでも本でも見て
体系的に知っていたほうが良い
273
名前:
デフォルトの名無しさん
:03/06/17 21:34
>>272
意味不明
274
名前:
デフォルトの名無しさん
:03/06/17 21:47
>>271
struct my_string{ char *buf;int length;};
struct my_string s1,s2;
s1.buf = malloc(256);
strcpy(s1.buf,src);
s1.length = strlrn(s1buf);
memcpy(&s2,&s1,sizeof(struct mystring));
strcat(s2.buf,hoge);
s2.length = strlen(s2.buf);
これでやばいことになりますた。
275
名前:
デフォルトの名無しさん
:03/06/17 21:49
>>271
メンバが new で確保した領域を保持してるとか
struct T {
int* p;
T() : p(new int[3]) {}
~T() { delete[] p; }
};
276
名前:
274
:03/06/17 21:51
あ、ここC++スレか。なら
>>275
の方が適切な例だ。
classの場合、普通は代入演算子を定義して=でコポーするのがセオリーやね。
277
名前:
デフォルトの名無しさん
:03/06/17 21:59
>>269
cpp に書くと、他から参照しにくい。
278
名前:
デフォルトの名無しさん
:03/06/17 22:03
いっぱいきけんやな。
>>271
は何もわかってないとこ見るとCプログラマーやな。
279
名前:
デフォルトの名無しさん
:03/06/17 22:05
>>276
コポーってなんでつか?
280
名前:
269
:03/06/17 22:06
>>277
なぜ?
詳しく教えて。
281
名前:
デフォルトの名無しさん
:03/06/17 22:09
>>275
その例だと代入を利用しても、memcpyと同じように問題が発生する
282
名前:
デフォルトの名無しさん
:03/06/17 22:11
>>279
ぐぐれ
283
名前:
デフォルトの名無しさん
:03/06/17 22:16
>>278
代入する場合とmemcpyをする場合の比較の話なのに
コピーコンストラクタが存在するのが前提の話になっているんだが?
挙げられた例ではコピーコンストラクタが存在しておらず、
この場合、メンバにポインタがある時に、
代入では発生せずmemcpyでのみ発生する問題点が示されていない
で、クラスのインスタンスについては既に挙げたから、
それ以外で具体的に何が危険なの?
284
名前:
デフォルトの名無しさん
:03/06/17 22:25
>>283
memcpyだと、複製先と元で同じデータを共有している上に、お互い他のインスタンスがそのデータを参照していることを知らない。
だから、知らないうちにその共有データの内容を変更されたりして、処理の整合性が取れなくなる。
285
名前:
デフォルトの名無しさん
:03/06/17 22:26
C++ではC由来の古いライブラリは使うな。
****終了****
286
名前:
デフォルトの名無しさん
:03/06/17 22:27
>>283
挙げられた例ってどれ?
287
名前:
デフォルトの名無しさん
:03/06/17 22:29
あげあしとり中学校の予感
288
名前:
デフォルトの名無しさん
:03/06/17 22:31
おっと、ちょっと意図を外したかな。
この場合、コピーコンストラクタではなく代入演算子のオーバーライドの方が適切だよね?
クラスインスタンス生成時にmemcpyは使えない。
確かに代入演算子がオーバーライドされていない場合、memcpyでも代入でも同じ。
代入演算子がオーバーライドされている時には、memcpyで問題が発生する。
では最初の質問に立ち返ってみると、classを使用する場合一般に代入演算子がオーバーライドされているかどうかわからない。
それならば最悪の場合を想定して、一般にmemcpyを使わないほうがいい、ということで間違っていないとおもうよ。
289
名前:
デフォルトの名無しさん
:03/06/17 22:32
>>288
は284です。
290
名前:
デフォルトの名無しさん
:03/06/17 22:37
ちんぷんかんぷん。
291
名前:
デフォルトの名無しさん
:03/06/17 22:38
オーバーロードじゃないの?
292
名前:
デフォルトの名無しさん
:03/06/17 22:39
>>285
同感。
デフォルトでmemcpyなんて使わんでも、たしか、ビットレベルでの
コピーがされる、だか、なんだか、とう言う事をどっかで読んだ。
たしか、メイヤちゃんやったような気がする。
293
名前:
デフォルトの名無しさん
:03/06/17 22:39
>>248
だからメンバにインスタンスが含まれていた場合は除外しているんだけど、何故きちんと読まないの?
ポインタの場合はmemcpyでも代入でも結果は変わらないと言っているんだけど
>>288
>演算子のオーバーライド
オーバーライドとオーバーロードを混同してない?
>それならば最悪の場合を想定して、一般にmemcpyを使わないほうがいい
インスタンスが含まれている場合は当然memcpyを使うべきではないのは同意
294
名前:
デフォルトの名無しさん
:03/06/17 22:40
Cでmemcpy使うのも構造体を=で代入できなかった頃の名残だし
295
名前:
288
:03/06/17 22:40
そうでした。代入演算子の場合はオーバーロードだ。スマソ。
296
名前:
デフォルトの名無しさん
:03/06/17 22:41
>>292
C時代の代入についての挙動は処理系依存
古い規格だと根本的に構造体の代入自体が不可能だった
297
名前:
デフォルトの名無しさん
:03/06/17 22:42
>>293
構造体のメンバにポインタがあるとき、場合によっては
memcpy()は不適切だといってるのに、それに対する君の
突っ込みが意味不明。
298
名前:
デフォルトの名無しさん
:03/06/17 22:45
クラスをmemcpyでコピーなんて考えたこともないな。
299
名前:
デフォルトの名無しさん
:03/06/17 22:45
>>293
のところの最初のポイント先を
>>288
に修正
>>297
だからその問題点が示されてないんだけど
代入では発生せずmemcpyの場合のみ起こりえる問題点とは?
300
名前:
デフォルトの名無しさん
:03/06/17 22:47
>>298
クラスをmemcpyする話はだれもしてないよ
301
名前:
デフォルトの名無しさん
:03/06/17 22:48
>>299
問題点は示されてるから読み返したら?
それともオーバーロードされた代入演算子を使った代入は
代入じゃないとでも言いたいのだろうか。
302
名前:
298
:03/06/17 22:48
あ、構造体か。でもC++なら同じだろ。そもそもC++でmemcpy(ry
303
名前:
288
:03/06/17 22:48
>>299
ポインタを持つクラスが代入演算子をオーバーロードしていたとする。
それをmemcpyしても問題ないということ?
304
名前:
288
:03/06/17 22:50
そもそも、なんでそんな場合分けするのか分からない。
インスタンスを持っているのか、ポインタなのか、
オーバーロードがあるのか、
そんなの外から見ても分からないでしょ?
305
名前:
デフォルトの名無しさん
:03/06/17 22:50
=でできることをなぜmemcpyでやろうとするのか理解できないんですが。
306
名前:
デフォルトの名無しさん
:03/06/17 22:52
確かにオーバーロードがあれば挙動は変わる
>>278
>いっぱいきけんやな。
となっているんだけど他には?
307
名前:
デフォルトの名無しさん
:03/06/17 22:53
>>239
そのソースってのは本当にC++で書かれたもの?Cじゃなくて?
308
名前:
288
:03/06/17 22:53
さらに言わせてもらうと、
インスタンスだって
struct Point {int x;int y;};
こういう構造体のインスタンスを持っているだけなら、memcpyで問題は起こらないよ?
309
名前:
デフォルトの名無しさん
:03/06/17 22:54
>>305
実際にやるかどうかではなく、問題点の洗い出しをしてるんだけど
310
名前:
デフォルトの名無しさん
:03/06/17 22:54
>>309
そんな無意味なことをしていたんですか・・・ばからしい・・・・
311
名前:
デフォルトの名無しさん
:03/06/17 22:56
>>308
>>271
でクラスのインスタンスと言っているんだけど、
いつから構造体のインスタンスになったの?
312
名前:
239
:03/06/17 22:56
>>307
>そのソースってのは本当にC++で書かれたもの?Cじゃなくて?
スマソ。ROMらしてもらってますた。
1999年ごろのc++のコードです。
313
名前:
288
:03/06/17 22:57
>>311
C++ではどちらも本質的に同じだから混同して使っています。
314
名前:
デフォルトの名無しさん
:03/06/17 22:57
>>312
=で構造体をコピーできることをしらない頭の古いC厨の書いたコードの予感
315
名前:
デフォルトの名無しさん
:03/06/17 22:58
>>310
少なくとも
>>274-275
のような頓珍漢な例は洗い出せたけど
316
名前:
デフォルトの名無しさん
:03/06/17 22:59
>>306
仮想関数を持っていたら vtblを指すポインタまでコピーされるから
基底クラスレベルで memcpy() されればそれが書き換えられる可能性
もあり得るな。
317
名前:
デフォルトの名無しさん
:03/06/17 23:00
>>313
本質的に同じではないんだけど
クラスのインスタンスをコピーしてはいけない理由は分かってる?
318
名前:
デフォルトの名無しさん
:03/06/17 23:00
構造体はfunctor位にしか使わないなぁ
319
名前:
デフォルトの名無しさん
:03/06/17 23:00
c++使ってても、cやら、うんこVBやらに文字列渡すときに
しょうがなく、memcpyつかっておりますが
やっぱりstd::copyとか使ったほうがよさげなんですかね?
320
名前:
デフォルトの名無しさん
:03/06/17 23:00
>>316
構造体は仮想関数は持てない
321
名前:
デフォルトの名無しさん
:03/06/17 23:01
プログラムを新規で作るときって
新しいプロジェクトを作って新しいソースファイル作って
それを保存してソリューションに追加するって流れが
めんどくさくてしょうがないです。
どうにかなりませんか?
322
名前:
デフォルトの名無しさん
:03/06/17 23:01
>>320
やっぱり勉強し直せ。
323
名前:
デフォルトの名無しさん
:03/06/17 23:01
>>321
空気読め。質問できる雰囲気ではないだろ。
ちなみにスレ違い。
324
名前:
288
:03/06/17 23:02
>>317
あ、わからないかも。
class Point{int x; int y;};
こういうクラス、memcpyすると、何か問題起こるの?
純粋に知らない。
325
名前:
デフォルトの名無しさん
:03/06/17 23:02
=にはない、memcpyならではのメリットはある?
326
名前:
239
:03/06/17 23:03
>>314
いちおうCodeProjectに載ってた、幾度となくバグフィクス
されたっぽいものなんですが。。。
アドレスをば
ttp://www.codeproject.com/miscctrl/gridctrl.asp
327
名前:
288
:03/06/17 23:04
まぁ、確かに彼の最初の指摘は正しいな。
そのあとのレスのつけ方がどうもな。
まぁ、ここは2chだからいいんだけど。
どこか糞壁を思い出してしまいました。
328
名前:
デフォルトの名無しさん
:03/06/17 23:09
= を使うようにしておけば、
operator= をオーバーロードしても、
ソースコードを変更する必要が無い。
そのクラスが = オーバーロードしてあるかどうかも
気にしなくて良い。
329
名前:
デフォルトの名無しさん
:03/06/17 23:10
構造体の配列をコピーする時なんかは、memcpyのほうが効率いいことあるな。
もとろんmemcpyで問題のない構造体に限るが。
330
名前:
デフォルトの名無しさん
:03/06/17 23:11
>>325
大量のインスタンスをコピーする時に速い。
けど、危険冒してまでやりたくない気が・・・
まあcharとかintなどなら大丈夫だけど
331
名前:
288
:03/06/17 23:16
>>324
はどうなの?
ここで終わったら気になるじゃないか。
332
名前:
デフォルトの名無しさん
:03/06/17 23:20
>331
それなら問題ない。
std::stringとか入ったりデストラクタ加わったりするとだめだけど。
333
名前:
デフォルトの名無しさん
:03/06/17 23:21
>>324
public:つけろよ
334
名前:
デフォルトの名無しさん
:03/06/17 23:23
>>333
すまんス
アクセス指定子以外、C++のclassとstructは同じと考えてよいよね?
335
名前:
デフォルトの名無しさん
:03/06/17 23:26
良いよ。
336
名前:
デフォルトの名無しさん
:03/06/17 23:27
>>320
はなんなの?
337
名前:
デフォルトの名無しさん
:03/06/17 23:27
>>334
structの方が1文字多い
338
名前:
デフォルトの名無しさん
:03/06/17 23:28
構造体はBO(略
339
名前:
デフォルトの名無しさん
:03/06/17 23:32
Boxing?
340
名前:
デフォルトの名無しさん
:03/06/17 23:33
>>336
317、320 (=271?)は知ったかのアフォです。
341
名前:
デフォルトの名無しさん
:03/06/17 23:53
293は「インスタンス」の意味を間違えていると思われ。
342
名前:
341
:03/06/17 23:56
ごめん
343
名前:
デフォルトの名無しさん
:03/06/18 00:00
えーと急いで探してみたのだが
POD(Pure Old Data) typeはmemcopyでコピーできると書いてあるけど
一般のC++のクラスについては記述が見つからないんだよね。
わざわざPOD typeと限定しているところからして駄目に見えるのだが
だれか見つけられた?
344
名前:
343
:03/06/18 00:02
ちょい間違い。PODはPlain Old Dataだった
345
名前:
デフォルトの名無しさん
:03/06/18 00:12
>>343
例えば class Point { int x, y; }; とか
class Hoge { Point* ptr; } とかは POD だが。意味わかってる?
346
名前:
デフォルトの名無しさん
:03/06/18 00:31
つーか、Cいらね。
素直にoperator=とか、コピーコンストラクタとかを使え。
以上。
347
名前:
デフォルトの名無しさん
:03/06/18 00:57
>>345
A POD class is a class that is either a POD-struct or a POD-union.
であるから、それはPODではない。分かってる?
348
名前:
デフォルトの名無しさん
:03/06/18 01:28
345じゃないけどさ
>>347
どうみても
>>345
の例は POD だよ。
キーワードにだまされるな。
>>334-
>>335
のやりとりを見よ。
349
名前:
デフォルトの名無しさん
:03/06/18 01:29
>>348
だまされてるのは藻前だ。
PODはprivate非スタティックデータメンバをもてない。
350
名前:
デフォルトの名無しさん
:03/06/18 01:44
なんでこんなくっだらない言い争いでここまで伸びるんだ?
351
名前:
デフォルトの名無しさん
:03/06/18 01:56
結論
ごちゃごちゃ言わず = を使え、と。
352
名前:
デフォルトの名無しさん
:03/06/18 05:10
えーと、C++の質問なんでが
テンプレートを使わないで動的メモリの再確保をしたい場合(再確保前のメモリDATAも保護)
Cの方でrealloc()ってあるので使っちゃってるのですが、
別の領域にDATAコピーして、古い領域をdeleteして新たに必要な領域をnewして
そこにコピーしなおしてって感じで使える領域を増やすのを思いついたのですが
なにか別にC++ならではの良い方法はあるのでしょうか?
353
名前:
デフォルトの名無しさん
:03/06/18 05:50
>別の領域にDATAコピーして、古い領域をdeleteして新たに必要な領域をnewして
>そこにコピーしなおして
普通は、新たに必要な領域をnewしてそこにコピーしなおして古い領域をdelete、する。
という手順を踏む。標準ライブラリなども大体そうしているはず
354
名前:
デフォルトの名無しさん
:03/06/18 05:51
>>352
vectorのソースでも見てみれば?
ところで
http://oita.cool.ne.jp/ja6hfa/ja6hfa/dpfaq/singleton.html
↑のQ7で、staticオブジェクトはデストラクタが呼ばれないって書いてあるけどマジ?
それと同じくQ12でなぜかauto_ptrのデストラクタは呼ばれるような話してるんだけど矛盾してない?
355
名前:
デフォルトの名無しさん
:03/06/18 06:10
そんなばかな。mainからreturnまたはexitした後に
生成の逆順でデストラクタが呼ばれるとなっているが
356
名前:
デフォルトの名無しさん
:03/06/18 06:48
あんまりそのページの記述信用しないほうがいいと思うが。
auto_ptrは代入つかって開放することができるし。
357
名前:
デフォルトの名無しさん
:03/06/18 07:17
やっぱりそうだよね。
ちょっと安心したよ。
358
名前:
デフォルトの名無しさん
:03/06/18 14:57
>>355
main終了時の話ではないと思われ
359
名前:
デフォルトの名無しさん
:03/06/18 15:21
みてね〜♪
http://www1.free-city.net/home/s-rf9/page004.html
360
名前:
デフォルトの名無しさん
:03/06/18 16:50
>>354
static objectつくって実験してみればいいと思われ
361
名前:
デフォルトの名無しさん
:03/06/18 20:46
#Includeで別のヘッダを取り込んでいるのですが、その別のヘッダ
ファイル内での#Includeファイルがダブってしまいコンパイル
できません。
間接的にすでにインクルードされているかをチェックして
されてない場合のみインクルードするディレクティブって
ないのでしょうか?
#ifdef ならぬ #ifinclude みたいなの...
わかりにくい説明ですみません。
362
名前:
デフォルトの名無しさん
:03/06/18 20:52
>>361
標準ヘッダのソース見てみ
363
名前:
デフォルトの名無しさん
:03/06/18 20:52
>>361
-----------------------------
#ifndef HOGEHOGE_INC
#define HOGEHOGE_INC
定義
#endif
-------------------------------
ただし、includeファイルがお互いをinludeしていると上手くいかない。
364
名前:
デフォルトの名無しさん
:03/06/18 20:52
>>361
VCなら#pragma onceで一発
365
名前:
デフォルトの名無しさん
:03/06/18 20:54
>>363
お互いをincludeするのは論理的におかしいからうまくいかなくてもかまわないと思うぞ
366
名前:
デフォルトの名無しさん
:03/06/18 20:57
>>361
ぶっちゃけC++の話題ではない。
367
名前:
デフォルトの名無しさん
:03/06/18 21:04
お互いをインクルードて出来ないなら双方向関係ってどうやってやるんですか?
368
名前:
361
:03/06/18 21:08
みなさんありがとう。
初心者なものですんませんでした。m(__)m
369
名前:
デフォルトの名無しさん
:03/06/18 21:09
>>367
双方向関係が具体的に何を意味するのか知らんが
ヘッダの相互インクルードは全然必要ないとおもうぞ。
実装は普通ヘッダじゃなくてソースファイルに書くんだから。
370
名前:
デフォルトの名無しさん
:03/06/18 22:00
>>363
のようにしてれば、互いにincludeしてても別に問題ないだろ。
もしかして
>>363
のようにしててもうまくいかない処理系とかあんの?
371
名前:
デフォルトの名無しさん
:03/06/18 22:06
お互いにインクルードしてたらプリプロセスで無限に展開されないか?
372
名前:
デフォルトの名無しさん
:03/06/18 22:10
>>371
いや、だからそれを防ぐ意味ためのインクルードガード(
>>363
のようなコード)だろ。
373
名前:
372
:03/06/18 22:12
誤:それを防ぐ意味ための
正:それを防ぐ為の
スマソ。
374
名前:
デフォルトの名無しさん
:03/06/18 23:26
インライン関数がある場合や
クラステンプレートの場合にはこうやる。
// test1.h
#ifndef TEST1_H
#define TEST1_H
class Test2;
class Test1 {
// Test2* や Test2& を使って何やらする
};
#include "test2.h"
// Test2* や Test2& の実体を参照するインライン関数の実装
#endif
// Test2.h
#ifndef TEST2_H
#define TEST2_H
class Test1;
class Test2 {
// Test1* や Test1& を使って何やらする
};
#include "test1.h"
// Test1* や Test1& の実体を参照するインライン関数の実装
#endif
375
名前:
デフォルトの名無しさん
:03/06/18 23:30
あ、引数ならポインタや参照じゃなくてもいいね。
376
名前:
デフォルトの名無しさん
:03/06/19 00:19
あるライブラリのC言語のソースをC++へ書き直しているのですが、
int Func( arg1)
ARGTYPE *arg1;
{
.....
}
はどのように書き直せばいいのでしょうか?
int Func(ARGTYPE *arg1){
}
のように書き直してみましたが、別の箇所で引数の数が一致しないとコンパイラに
怒られます。何かキーワードのようなものがあれば教えてください。
377
名前:
_
:03/06/19 00:20
http://homepage.mac.com/hiroyuki44/
378
名前:
デフォルトの名無しさん
:03/06/19 00:24
>>376
それでいいはず。
379
名前:
デフォルトの名無しさん
:03/06/19 00:27
三角行列クラステンプレートを作ったんだけど、
テンプレート引数が double の時だけ
diagonalize(対角化)メンバ関数を定義する、ってことをしたい。
int とか char とかの時には diagonalize を定義したくない。
でも、うまく出来なくて困ってる。
1. partial specialization を使う。
partial specialization を使って
double 用のクラスを別に定義する方法でとりあえずは可能だけど、
その他の定義も全部やり直さないといけないのはエレガントじゃない。
2. diagonalize をデフォルトで無効にする。
デフォルトで例外を投げるとか。
あまり美しくない。
3. 継承して partial specialization する。
実体を返す関数は基底クラスを返すようになってるので、
これを再定義しないといけない。
あとはコンストラクタと代入演算子も。
また、その関数を呼んでいる関数も再定義する必要がある。
これなら 1. を使った方がすっきりして良い。
他に何かいい方法はない?
380
名前:
デフォルトの名無しさん
:03/06/19 00:32
STLの話になっちゃうけど、
mapに格納したデータをイテレータで全て表示させると、
キーをもとにして勝手にソートされるのって無効にできないのかな。
381
名前:
デフォルトの名無しさん
:03/06/19 00:37
>>379
デフォルトで無効にするのが一番すっきりしてわかりやすいと思うけど。
382
名前:
デフォルトの名無しさん
:03/06/19 00:40
>>379
試してないんでうまく行くかどうかわからんが
デフォで diagonalize の宣言だけ提供して
double 用の実装だけ書くって出来ないかな?
double 以外で使おうとするとリンクエラーではじけるかも
383
名前:
デフォルトの名無しさん
:03/06/19 00:44
>>380
キー以外に順序づける方法が無いのにそれ以外でいったいどんな順番で表示しろと
384
名前:
デフォルトの名無しさん
:03/06/19 00:49
>>382
迂闊!
それ試してなかった。
diagonalize 使わない限りはエラーにならないみたいね。
で、diagonalize 使うとリンクエラーになる、と。
double だけはうまくいく。
ありがとやんした。
385
名前:
デフォルトの名無しさん
:03/06/19 00:50
>>383
格納した順に表示させることはできないだろうか。
386
名前:
デフォルトの名無しさん
:03/06/19 00:51
>>385
mapは格納した順番を保持しているという保証はないよ。
387
名前:
デフォルトの名無しさん
:03/06/19 00:53
>
>>379
Policyでも使ってみれば?
388
名前:
デフォルトの名無しさん
:03/06/19 00:53
>>379
4. static_assert を使う。
diagonalize() {
// ここに型がdoubleでないとコンパイルエラーになる式を書く
// 対角化の計算
return *this;
}
5. CRTP を使う。
template<class TriM> class typespecific_impl {};
template<typename T>
class TriMatrix : public typespecific_impl< TriMatrix<T> > {
public: // 共通の関数いろいろ
//...
private: // 特定の型に限りたい関数色々
friend class typespecific_impl< TriMatrix<T> >;
TriMatrix& diagonalize_impl() { /*対角化*/ return *this; }
};
template<>
class typespecific_impl< TriMatrix<double> > {
typedef TriMatrix<double> Self;
public:
Self& diagonalize() {
return static_cast<Self&>(*this).diagonalize_impl();
}
};
389
名前:
デフォルトの名無しさん
:03/06/19 02:03
C#
これって、C言語の半音アップ版でつか?
シー が セィー って読む?
390
名前:
デフォルトの名無しさん
:03/06/19 02:23
C++は言語だけインクリメントされたがそのリターンはインクリメント前とおなじだった。
C#はせめて半音だけでもいいものをと考えられた。
391
名前:
デフォルトの名無しさん
:03/06/19 03:18
まぁくだらん言葉遊びよ
392
名前:
デフォルトの名無しさん
:03/06/19 08:06
C#だからツィスと読むんじゃないのか。
とどうでもよいレスをしてみるtest.
393
名前:
デフォルトの名無しさん
:03/06/19 09:05
>>380
vector に pair 代入すればいいではないか?
必要なときに、sort。
find遅そうだけどな。
394
名前:
デフォルトの名無しさん
:03/06/19 11:57
catchした内容をそのままthrow出来ますか?
395
名前:
デフォルトの名無しさん
:03/06/19 11:58
>>394
pass
396
名前:
デフォルトの名無しさん
:03/06/19 11:58
catch(...)
{
throw;
}
397
名前:
デフォルトの名無しさん
:03/06/19 14:23
>>389
スレ違い
と今更レスをしてみるtest.
398
名前:
デフォルトの名無しさん
:03/06/19 16:51
>>389
Cはツェーと読むぞ<ちなみに音階はドだ。
だからC#はドの斜め上にある黒い鍵盤だ。
いいかおまえら、C#はD(レ)になり損ねた黒い鍵盤だ!ワカッタカゴラァ!
激しく板違いなレススレtest
399
名前:
デフォルトの名無しさん
:03/06/19 19:48
C++ での無名インナークラスの書き方ってどうするか教えてください。
例えば、
class POINT { int X , int Y , … } ってのがあって、
Draw (POINT p) ってのがあるときは、
Draw ( POINT(10,20, …) )
で呼び出せますよね?
この場合 POINT クラスのデストラクタはいつ呼び出されるんですか?
400
名前:
デフォルトの名無しさん
:03/06/19 19:50
>>399
foo(){
POINT P(10,20,・・・);
Draw ( P );
}
とおなじ。
401
名前:
デフォルトの名無しさん
:03/06/19 20:08
>>400
できれば P(オブジェクト)は生成したくないんです。
相当数のオブジェクトが必要になりそうなんで、new 〜 delete の
繰り返しになりそう・・・。
402
名前:
デフォルトの名無しさん
:03/06/19 20:22
何をやりたいのか分からない。
沢山のインスタンスを持つならvecterとか使えばいいんじゃないの?
403
名前:
デフォルトの名無しさん
:03/06/19 20:25
ただ単にDrawを沢山よびたいだけなら。
for(int x=0;x<1000;x+=10){
Draw(Point(x,10));
}
とか。
スコープを抜ければ、インスタンスは解放されてデストラクタは呼ばれる。
404
名前:
デフォルトの名無しさん
:03/06/19 20:26
お邪魔します。m(__)m
おせてくさい。
typedefですが、これはなんのために
あるのですか?
#defineで十分だと思うのですが。。。
405
名前:
デフォルトの名無しさん
:03/06/19 20:31
>>404
関数ポインタの型はどうしましょう。
406
名前:
デフォルトの名無しさん
:03/06/19 20:31
>>404
#defineはいろいろ問題がある。
C++的には、More Exceptional C++のItem 35(#DEFINITION)と38(Typedef)を読むべし、
とかいってみたり
407
名前:
デフォルトの名無しさん
:03/06/19 20:31
>>404
#defineでどうやって、typedefの代わりをするの?
ちょっと例を書いて見せろ。
408
名前:
デフォルトの名無しさん
:03/06/19 20:33
typedef関数ポインタといわずとも
typedef unsigned int uint;
を#defineで定義するのは無理だね。
409
名前:
デフォルトの名無しさん
:03/06/19 20:38
>>401
引数に指定した一時オブジェクトは関数の呼び出し前に構築されて
呼出し後に解体される。ただし解体のタイミングが厳密にいつであるかは
規定されてない。
410
名前:
デフォルトの名無しさん
:03/06/19 20:41
>>401
一時オブジェクト自体はスタック上に配置され、別にnew/deleteはされないよ。
コンストラクタ、デストラクタも、それが定義されてるなら呼ばれるけど
単なる構造体みたいにそれらを記述してないならオーバーヘッドは無い。
まあDrawに値渡ししてる点でコピーコンスとラクトされるのが気になる程度?
411
名前:
404
:03/06/19 20:55
みなさん、しみませんでしたm(TT)m
412
名前:
デフォルトの名無しさん
:03/06/19 22:02
>>409
解体のタイミングは、その文を最後まで実行し終えた瞬間だろ?
413
名前:
409
:03/06/19 22:08
>>412
一時オブジェクトの生存が保証されるのは関数呼び出し式の終端まで。
その後いつ解体されるかは実装による。
414
名前:
デフォルトの名無しさん
:03/06/19 22:45
>>413
なるほど。確かに。
415
名前:
デフォルトの名無しさん
:03/06/19 22:59
>>408
なぜ?
416
名前:
デフォルトの名無しさん
:03/06/19 23:46
>>408
なんのこと?
417
名前:
デフォルトの名無しさん
:03/06/19 23:54
それなら
#define uint unsigned int
って書けないか、ってことだろ。たぶん。
(本人じゃないんで勘違いしてたらスマソ)
418
名前:
デフォルトの名無しさん
:03/06/20 00:43
>>417
マクロに渡した時のトークン結合での挙動が
マクロと typedef で違うね。
419
名前:
デフォルトの名無しさん
:03/06/20 01:29
>>413
んーと、たしか、完全式の終了までは生存しているはず。
たとえば、
struct A {
int x_;
A(int x) : x_(x) {}
int operator+(const A& a) const {
return x_ * a.x_;
}
};
const A& foo( const A& a ) {
return a; // ※良い子はこんなコードを書いちゃいけません
}
int main()
{
cout << foo(A(2)) + foo(A(3)) << endl;
}
420
名前:
デフォルトの名無しさん
:03/06/20 01:45
>>419
意味わかんない
421
名前:
413
:03/06/20 01:51
その通りです
>>399
の例では Draw(一時オブジェクトの生成を含む)の末尾までが
完全式になるので、保証されるのは Draw()の終了時までということに
なると思います。言葉足らずでした。
422
名前:
デフォルトの名無しさん
:03/06/20 01:51
>>420
+ 演算子を実行する時に A(2) と A(3) の
両方のオブジェクトが生存してることが保証されてるよ、
ってことでしょ。
423
名前:
デフォルトの名無しさん
:03/06/20 02:15
1つのコンテナに複数の要素を詰め込めて、要素ごとにソートしたり検索できる
ようなコンテナクラスってどこかにあります?
ようするにオンメモリで動くちょっとしたデータベース的なコンテナというか、
Excelなんかが一番イメージに近いんだけど。
要素の数が予めわかっていれば構造体のvectorとかでもいいんだけど、実行時に
要素数が変更されるような場合はどうしようって感じ。
424
名前:
デフォルトの名無しさん
:03/06/20 08:59
>>423
実行時に要素数が変更されるような場合でも、vectorは使えると思うが、
なんかvectorが使えない理由があるの?
425
名前:
r
:03/06/20 12:10
コンストラクタの呼ばれる順番がわかんねぇ!!!!
メンバ変数がどの順番で初期化されるのかわかんねぇです。
1. 初期化子の順に初期化される
漏れが最初に読んだC++の本、柴田望洋先生の
「CプログラマのためのC++入門(softbank)」には、そう説明してある。
ただし、これは C++ Release2.0の頃の本。
2. クラス内での、メンバ変数の宣言の順に初期化される。
ぐぐって見つけた「
ttp://www.kab-studio.com/Programing/Codian/Cpp/07.html
」
では、初期化子の順序は関係ないと書いてある。
3. 初期化子の逆順に初期化される。
cygwinのg++で実験したところ、どうも初期化子の逆順に
初期化されてるっぽかった...
なにがなんだかわかんねーよ!
この辺の事情に詳しい人、レスお願い。
426
名前:
r/425
:03/06/20 12:14
ちなみに、実験に使ったコードはこれ。
#include <iostream>
class Elem {
public:
Elem( int i ) { std::cout << "create : " << i << std::endl; }
};
class Col {
Elem e1;
Elem e2;
Elem e3;
public:
Col() : e3(3), e2(1), e1(2) { }
};
int main() {
Col c;
return 0;
}
実行結果は
constructed : 2
constructed : 1
constructed : 3
あと、
%g++ --ver
gcc version 3.2 20020927 (prerelease)
ですって。
427
名前:
r/425
:03/06/20 12:15
constructed じゃねーよ!
create だよ。てへっち。
428
名前:
デフォルトの名無しさん
:03/06/20 13:12
>>425
C++仕様書 12.6.2.5
初期化の順番は以下の通りである。
1.(仮想継承の場合の仕様。省略)
2. 直接の基底クラスのコンストラクタは、
継承宣言リストに書いた順番で呼び出される。
初期化指定子の順番は無視される。
3. 静的でないデータメンバはクラス宣言に登場した順番で初期化する。
初期化指定子の順番は無視される。
4. 最後に、自分自身のコンストラクタが呼ばれる。
註:デストラクタはこの逆順で実行される。
429
名前:
デフォルトの名無しさん
:03/06/20 14:54
>>424
vectorが使えないんじゃなくて、構造体が使えないってことです。
要素毎に型が違うから、vectorのvectorというわけにもいきませんし。
(同じ基底クラスから派生させとけばいいんだけどさ)
自分で作るのは大して難しいわけじゃないけど、既に効率的な実装があれば
知りたいなぁと。そこそこ需要のあるコンテナだと思うし。
430
名前:
r/425
:03/06/20 15:54
>>429
意味がわかんねぇ!!!
要素ごとに型が違うのにどうやってソートするんだ?
431
名前:
r/425
:03/06/20 15:58
operator<とか定義しとけばいいのか。そか。
...だったら別にvectorのvectorとかでもいいんじゃねーの?
432
名前:
r/425
:03/06/20 16:46
>>428
ありがと〜
そか...しかし何で宣言順、とかなんだろう....
自分のコード、コンストラクタでこゆの良く書いてる。
危険っぽいので、修正しヨット。
class HanageArray {
int lim;
Hanage* body;
HanageArray::HanageArray( int aLim ) : lim( aLim ), body( new Hanage[lim ] ) {}
};
limとbodyの宣言順が異なると死ぬはず。
...いや、g++ の動きはいいのか?
433
名前:
デフォルトの名無しさん
:03/06/20 16:53
>>432
g++ 使ってるという事なので、
-Wall 付けてコンパイルしてみ。
宣言順に初期化子書いてないと警告されると思う。
434
名前:
デフォルトの名無しさん
:03/06/20 16:57
>>433
そうそう。g++はそういう点で助かるよね。
435
名前:
r/425
:03/06/20 17:21
>>432
俺>...いや、g++ の動きはいいのか?
とか書きましたが、g++は、ちゃんと
>>428
の解説どおりに動いてますね。
>>433
-Wallだと警告してくれるんですねぇ。
ありがたき★
436
名前:
デフォルトの名無しさん
:03/06/20 19:54
C形式の入出力機能(printfなど)と、C++のストリーム形式の入出力機能のバッファを共有すると、
どういうことができますか?
437
名前:
デフォルトの名無しさん
:03/06/20 20:04
>>430
mapで言うところのpairの1番目と2番目の型が違うって意味だよ?
1番目の要素は全て同じ型だからソートは普通にできるかと。
438
名前:
デフォルトの名無しさん
:03/06/20 21:16
>>423
boost::graph とかは違うかな・・・。
やっぱ違うか・・・。
439
名前:
デフォルトの名無しさん
:03/06/20 21:24
c++では、ファイル名指定のとき、\\の代わりに/も許されているみたいですが、みなさんはwindoswの場合どっちを使っていますか?
440
名前:
デフォルトの名無しさん
:03/06/20 22:24
>>439
Windows では両方使える API と
片方しか使えない API とがあった気がするし、
パスを返す API はバックスラッシュ(円記号)使って返してくるので、
バックスラッシュを使うので統一しておくのがよろしい。
利便性からユーザがスラッシュも使えるようにしたい、
というのであれば、
それなりのカラクリを使ってバグの出にくいようにすべし。
441
名前:
デフォルトの名無しさん
:03/06/20 23:23
組み込み用のヒープ管理プログラムを書きたいんだけど、
ターゲットがまだ手に入らなくて、とりあえず Windows 上で
最低限機能が正しいかどうかテストしたいんだけど
アドレスとサイズをテンプレート引数にしちゃったから
ソースにアドレスを埋め込まなきゃいけない。
だけど Windows なので利用できるアドレスは実行時までわからない。
こんな時どうすればいい?
テスト環境でがっぽりメモリ確保して、そのアドレスをメモして
それをハードコートして再コンパイル以上にいいアイディアってありますか?
442
名前:
デフォルトの名無しさん
:03/06/20 23:30
placement newをオーバーロード
443
名前:
デフォルトの名無しさん
:03/06/21 00:36
>>441
VC++の__basedとかみたいな、コンパイラ拡張で頑張るとか。
444
名前:
デフォルトの名無しさん
:03/06/21 00:37
>>441
アドレスとサイズを実行時引数ではなくて
テンプレート引数にすることによるメリットが思いつかないんだけど、
どんなのがありますか?
445
名前:
441
:03/06/21 01:03
>>442
いや、そういう事じゃなくて
>>443
そんなのあるんですね。知らなかった。ちょっと便利かも。
でも VC もってないし、たとえそれでもベース位置が決められない以上は
状況は変わらないですよね。
>>444
アドレスの方は安心感だけですかね。構築もちょっとだけ速くなるでしょうけど
それは些細すぎますしね。
サイズの方は最大サイズのチェックの値がコンパイル時の定数にできるので
微量ですが割り当て時のコストが減らせるはずです。
まぁ総じて「安心感」というメリットがあるっていう感じですが
それを「くだらない」という人は C++ じゃなくて C か汗使えって事で。
446
名前:
444
:03/06/21 01:14
>>445
実行時引数にした場合のどんな危険に対する安心感が得られるのか
全然わからないのですが・・・。
> サイズの方は最大サイズのチェックの値がコンパイル時の定数にできるので
> 微量ですが割り当て時のコストが減らせるはずです。
実際に割り当て可能なサイズは結局実行時にしか決まらないのだから、
これもメリットとは思えません。
447
名前:
デフォルトの名無しさん
:03/06/21 02:18
素直にがばっと領域とって
そこの先頭アドレスからのオフセットでいろいろすれば
448
名前:
デフォルトの名無しさん
:03/06/21 02:20
javaのgenericsについてのスレを見てて思ったんだが
きっと445みたいなやつが増えるんだろうなあ。
449
名前:
デフォルトの名無しさん
:03/06/21 02:55
確かに。なぜにテンプレート?って感じだ
450
名前:
デフォルトの名無しさん
:03/06/21 03:36
なぜなにテンプレート
451
名前:
441
:03/06/21 04:07
>>446
> 実際に割り当て可能なサイズは結局実行時にしか決まらないのだから、
いや、なんか話誤解してると思う。
自分で物理アドレス切ってメモリ管理するって話なんですけど。
標準的な malloc の実装でいう所の初回の sbrk の戻り値を固定にするっていう意味ですよ。
(もちろん足りないからって OS から追加のメモリがもらえるわけではない)
>>447
その「がばっと取る領域」が決められないから困ってるんです。
>>448
Java の generics は駄目だね。あれこそ彼らの言う所の「シンタックスシュガー」そのもので
generic の先にある generative に対応してないね。
>>449
オブジェクトコードに展開された後の姿を思い浮かべてごらん?
452
名前:
デフォルトの名無しさん
:03/06/21 04:13
言いたいことがよくわからんのでコードみせてください
453
名前:
441
:03/06/21 04:49
>>452
つまりこういう事。
template <byte* addr, std::size_t size>
class CStaticHeap
{
public:
void* Alloc(std::size_t reqSize);
void Free(void* obj);
};
CStaticHeap<0x80000000, 1024> chibiHeap;
void Hoge()
{
int* p = chibiHeap.Alloc(sizeof(int)); // 0x80000000 にあるヒープ領域から int の為の領域か切り分けられるんだろうなぁ
chibiHeap.Free(p);
}
454
名前:
デフォルトの名無しさん
:03/06/21 04:49
普通に
char buffer[10000] ;
とかしといて、実際のときは
const char *buffer = 0x0f0f0f ;
とかに変えればいいんではないの
455
名前:
441
:03/06/21 04:53
ごめん byte -> void ね。
あとキャスト忘れてたけど気にすんな。
>>454
いや
>>453
に晒した擬似コード見てもらえれば
ぜんぜん違う話だってわかってもらえると思う。
456
名前:
デフォルトの名無しさん
:03/06/21 05:02
全然分からん。まず
const buffer_size=10000 ;
char buffer_temp[buffer_size] ;
const char *buffer_prac=(const char*)0x0f0f0f ;
template<char *p,int size> class hoge {} ;
hoge<buffer_temp,buffer_size> temp ;
hoge<buffer_prac,buffer_size> prac ;
のような話ではない?
457
名前:
454==456
:03/06/21 05:21
455で違うといわれているからなあ
それともWindows環境では動的に確保するというのが441の要請なのか
458
名前:
441
:03/06/21 05:23
>>456
あぁ、それでよかったんだわ。
なんで思いつかなかったんだろう?
っていうかなんでこんな簡単な事聞くのにこんなに手間取ってるんだろう。
鬱だありがとう。
459
名前:
441
:03/06/21 05:29
>>457
==454==456
みんなが「インスタンス確保時のサイズをテンプレート引数にしたがってる」と誤解していると誤解してたから
素直に読んでなかったみたい。
ごめんね、そしてありがとう。
460
名前:
441
:03/06/21 05:33
だいぶ蛇足だけど、よく考えたら
「インスタンス確保時のサイズをテンプレート引数にする」は妙案な気がしてきた。
これで実行時コストなしで大きなオブジェクト用のヒープと
小さなオブジェクト用のヒープを分けられるかも。
「なんでそんな事すんねん」って言われるかもしれないけど
マルチスレッド時の直列化部分を別にできるとか、ヒープの分断への対応としては
なかなかいい考えかも。なんて。
461
名前:
456
:03/06/21 06:36
ちょっと嘘だった。
const char *buffer_prac=(const char*)0x0f0f0f ;
のところは多分
extern char * const buffer_prac =...
に違いない
462
名前:
439
:03/06/21 14:15
>>440
勉強になりました
463
名前:
デフォルトの名無しさん
:03/06/21 15:38
コンストラクタの時で
引数の型名が違う時は、
aa(int n=10);
aa(char nn=20);
のようにデフォルト引数は使えないのでしょうか?
464
名前:
デフォルトの名無しさん
:03/06/21 15:39
aa()をどうやって区別するんだよ
465
名前:
デフォルトの名無しさん
:03/06/21 15:56
キャスト
466
名前:
444
:03/06/21 16:03
>>441
453と↓を比べたときの利点が未だにわからないのですが、解説お願いできますか?
class CHeap
{
public:
CHeap(void* addr, std::size_t size);
void* Alloc(std::size_t reqSize);
void Free(void* obj);
};
CHeap chibiHeap(reinterpret_cast<void*>(0x80000000), 1024);
467
名前:
デフォルトの名無しさん
:03/06/21 18:15
>>441
メモリ管理はアロケータでやってください。
そして、手持ちのコードは捨てて。おねがいだから。
468
名前:
デフォルトの名無しさん
:03/06/21 18:39
質問。
std::string str;
size_t pos;
で、pos >= str.size() のとき、str.find("hoge", pos); は正しく動作(nposを返す)しますか?
それとも未定義な動作でしょうか。
469
名前:
_
:03/06/21 18:43
http://homepage.mac.com/hiroyuki44/
470
名前:
デフォルトの名無しさん
:03/06/21 18:48
>>468
nposを返す、と定義されている。
471
名前:
デフォルトの名無しさん
:03/06/21 20:16
>>460
> 「インスタンス確保時のサイズをテンプレート引数にする」は妙案な気がしてきた。
いやたぶんそれ、7,8年前からの常識だと思う。
472
名前:
468
:03/06/21 20:32
>>470
ありがとう。実際、文字列にアクセスする前に結果がわかるわけだから、
例外を投げなくてもいいわけですね。
473
名前:
デフォルトの名無しさん
:03/06/21 20:51
> 文字列にアクセスする前に結果がわかるわけだから、例外を投げなくてもいい
ヘンな納得の仕方すんなよ。
474
名前:
デフォルトの名無しさん
:03/06/21 21:42
もまいら!こんばんわです。
会社勤めの人ご苦労さまですm(__)m
質問おながいします。
c++のdeleteオペレータですが、
char* psz=new char[10];
と宣言、初期化した場合
delete [] psz;
で破棄するとのことですが
これってコンパイラがpszには配列が入っている
と分かっているのになんで[]なんて書く必要が
あるのですか?
また
char* tmp;
tmp=psz;
delete [] tmp;
と書いてもちゃんと走りました。
コンパイラはポインタ変数を見たら
それが配列か配列でないかどうやって
わかるんですか?
長文スマソ。。。
475
名前:
デフォルトの名無しさん
:03/06/21 21:48
> コンパイラはポインタ変数を見たら
> それが配列か配列でないかどうやって
> わかるんですか?
それがわからないからdelete[]があるんだよ。
まぁそんなもん使わずになるべくvectorで済ましとけ。
476
名前:
デフォルトの名無しさん
:03/06/21 21:49
>>474
動いたのはたまたま。
477
名前:
474
:03/06/21 21:53
>>475
>それがわからないからdelete[]があるんだよ。
なるへそ。じゃあ次元はどうやってわかるんですか?
478
名前:
デフォルトの名無しさん
:03/06/21 21:55
>>477
次元は型からわかるだろ。
最も次元がわからなくてもdeleteは正しく動くだろうけど
479
名前:
デフォルトの名無しさん
:03/06/21 21:57
>>477
次元じゃなくて大きさだろう?
480
名前:
474
:03/06/21 21:59
>>478
すみません。次元ではなく要素数ですた。。。
481
名前:
デフォルトの名無しさん
:03/06/21 22:02
>>474
配列形式で new した場合、
本当に確保される領域は (クラスのサイズ)×(要素数)+α だ。
単体で new した場合にはこういう余分なものは付かない。
このαがいくつかはコンパイラ依存だけど、
大抵は確保した数を保存するための領域のサイズ
(多分4バイト)になると思う。
これはデストラクタを呼ぶときに必要になる。
+αを許している仕様は、こういうことができるようにするためらしい。
実際に new から返されるアドレスは、確保されたメモリの先頭+αになる。
ここで重要なのは、ポインタ変数を見ただけでは+αがあるか分かんないってことだ。
だから+αがあるものとないもので解放処理は変わってくるので、
delete [] と delete をきちんと使い分ける必要が出てくるわけだ。
そのコードがたまたま動いてるのは、多分基本型でデストラクタがないからだと思う。
そのコンパイラは基本型の場合はα=0にしてるんじゃないかな。
でもこういうのはコンパイラ依存なんで、それに頼ったコードは書いちゃダメ。
一応+αをつけるコンパイラがあったら、
メモリを解放させる位置がαだけずれるので変になる。
482
名前:
474
:03/06/21 22:05
>>481
確かにデストラクタはありませんです。
本当にすっきりしますた。TT
どうもありがとう。。。
483
名前:
デフォルトの名無しさん
:03/06/21 22:06
>char* tmp;
>tmp=psz;
>delete [] tmp;
>と書いてもちゃんと走りました
無問題。
484
名前:
デフォルトの名無しさん
:03/06/21 22:11
>>481
俺もすっきりした。
あんたみたいな良い人がいると本当助かるよ。
485
名前:
デフォルトの名無しさん
:03/06/21 22:26
>>481
そういう知識ってどこで手に入れるのですか?
486
名前:
デフォルトの名無しさん
:03/06/21 22:53
>>485
>>3
487
名前:
デフォルトの名無しさん
:03/06/21 22:55
>>486
m(__)m
488
名前:
デフォルトの名無しさん
:03/06/21 23:25
> const A& foo( const A& a ) {
> return a; // ※良い子はこんなコードを書いちゃいけません
> }
この関数を抜けた時点で、デストラクタが呼ばれてaがあぼーん
( ̄Д ̄;)
489
名前:
デフォルトの名無しさん
:03/06/21 23:28
>>488
実体持ってないのにデストラクトするの?
490
名前:
デフォルトの名無しさん
:03/06/21 23:40
>c++のdeleteオペレータですが、
>char* psz=new char[10];
>と宣言、初期化した場合
>delete [] psz;
>で破棄するとのことですが
>これってコンパイラがpszには配列が入っている
>と分かっているのになんで[]なんて書く必要が
>あるのですか?
仕様です。
>また
>char* tmp;
>tmp=psz;
>delete [] tmp;
>と書いてもちゃんと走りました。
>コンパイラはポインタ変数を見たら
>それが配列か配列でないかどうやって
>わかるんですか?
>長文スマソ。。。
たぶん区別せずに解放しちゃって、後々バグの元になると思います。
491
名前:
デフォルトの名無しさん
:03/06/21 23:43
>>490
うざい
492
名前:
デフォルトの名無しさん
:03/06/21 23:45
最近感じてることだけどC++って思ってたより普及していないような気が・・・
C#の方が勢いがあるような・・・
493
名前:
デフォルトの名無しさん
:03/06/21 23:47
>489
参照元のデストラクタが呼ばれる。
コピーコンストラクタと言う物を調べてください。
494
名前:
デフォルトの名無しさん
:03/06/21 23:48
このスレは玉石混交ですな。
495
名前:
デフォルトの名無しさん
:03/06/21 23:50
>>488
,
>>493
いいかげんなこといってんじゃねぇよ。
496
名前:
デフォルトの名無しさん
:03/06/21 23:50
クラスのメンバポインタ使う時ってありますか?
497
名前:
デフォルトの名無しさん
:03/06/21 23:51
>>493
コピーコンストラクトされる場所がないような・・
498
名前:
デフォルトの名無しさん
:03/06/22 00:00
>497
どういう意味ですか?
コピーされてないので、問題だと言ってるのですが?
499
名前:
デフォルトの名無しさん
:03/06/22 00:01
>>498
どんな問題が発生するのか、実例だしてくんろ
500
名前:
デフォルトの名無しさん
:03/06/22 00:05
例えるならこんなかんじだろ?
const A* foo( const A* a ) {
return a;
}
激しく問題ねーじゃねーか。
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.