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


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

C++相談室 part15
251 名前:デフォルトの名無しさん :03/02/01 16:32
atexit()に念のため登録しておくとかw

252 名前:デフォルトの名無しさん :03/02/01 16:44
>>247
正確には main が終わった後、プログラムの実装終了前、だな。

253 名前:デフォルトの名無しさん :03/02/01 16:54
>>244
>>178

254 名前:デフォルトの名無しさん :03/02/01 17:50
質問です。
2^0=1
2^1=2
2^2=4
2^3=8
2^4=16
...
となるように記述するにはどうすれば宜しいでしょうか?
『^』だと変な結果になるもので…
例:
int k;
for(i=0;i<5;i++){
 k=2^i;
 cout<<k<<",";
}
結果:
2,3,0,1,6,

255 名前:デフォルトの名無しさん :03/02/01 17:53
>>254
超既出質問
cmathインクルードしてpow

256 名前:デフォルトの名無しさん :03/02/01 17:54
ちなみに^はビットごとの排他的論理和

257 名前:デフォルトの名無しさん :03/02/01 18:04
>>252
>プログラムの実装終了前

すまん・・・もう少し詳しくきぼん

258 名前:デフォルトの名無しさん :03/02/01 18:11
>>257
実装→実行の typo と思われ

1 プログラム実行開始
2 非 local static 変数のコンストラクト
3 main 実行開始
4 …
5 main 実行終了
6 非 local static 変数のデストラクト
7 プログラム実行終了

259 名前:デフォルトの名無しさん :03/02/01 18:16
>>255
Thanksd

260 名前:デフォルトの名無しさん :03/02/01 18:43
>>248
たいていの場合はmain終わった後にデストラクタが呼ばれるのかと思ってますた。

261 名前:デフォルトの名無しさん :03/02/01 19:01
呼ばれますがな・・・
呼ばれる順番によっては悲惨なことに・・・

262 名前:デフォルトの名無しさん :03/02/01 19:18
>>261
いや new で確保したオブジェクトに関しては、delete しないとデストラクタ呼ばれんよ。

263 名前:デフォルトの名無しさん :03/02/01 19:24
あ、グローバルなオブジェクトの話じゃなかったのか
スマソ

264 名前:デフォルトの名無しさん :03/02/01 20:16
istreamの話なんですが、STLスレじゃなくてココのほうがいいのかな?

日本語文字コード変換などといったようなことをしてくれるostreamフィルタクラスを
作るにはbasic_streambufを継承させたクラスが必要なんでしょうか。
basic_streambufクラスは大きいので矛盾なく子クラスをつくるのは大変なんですが。

javaではかなり簡単に入出力フィルタクラスを作れるんですが。

265 名前:プログラム中に新しい顔文字発見 :03/02/01 20:40
(-r) フーン

266 名前:デフォルトの名無しさん :03/02/01 20:50
>>264
ttp://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/loc_io/booktoc.htm

267 名前:デフォルトの名無しさん :03/02/01 20:53
>>264
> 作るにはbasic_streambufを継承させたクラスが必要なんでしょうか。
Yes.
> basic_streambufクラスは大きいので矛盾なく子クラスをつくるのは大変なんですが。
そうか?streambufって、そう簡単に矛盾出来る設計になってたっけ。

> javaではかなり簡単に入出力フィルタクラスを作れるんですが。
http://village.infoweb.ne.jp/~fwhk9290/gimite/cppmess.htm
のsimple_streambufとかをお薦めする。

268 名前:デフォルトの名無しさん :03/02/01 22:07
>>267
おお、このフィルタクラスは便利そう。参考になりますな。

269 名前:デフォルトの名無しさん :03/02/01 23:59
とある本のサンプルなんだけど。

string from, to;
...

ifstream is( from.c_str() );
istream_iterator<string> ii( is );
istream_iterator<string> eos;

vector<string> b(ii, eos); ← ここでエラー

メッセージは
「この変換を実行可能な
ユーザー定義変換演算子がないか、
または演算子を呼び出せません」

なにが悪いのかさっぱり。
だれかー。



270 名前:デフォルトの名無しさん :03/02/02 00:07
>>269
コンパイラ何?
BCC5.6ではオッケーよ。

271 名前:269 :03/02/02 00:10

恥ずかしながら
vc6 sp5


272 名前:デフォルトの名無しさん :03/02/02 00:12
>>269
なにが悪いかといえばVC++のSTL関係の実装が標準に準拠しきれていない点。
ちなみにSTLportつかえば通った気がするが。

273 名前:デフォルトの名無しさん :03/02/02 00:14
>>271
VC6はちょっとなあ。
VC.NETでやったら通ったよ。

274 名前:デフォルトの名無しさん :03/02/02 00:20
VC6をバカにするな!

275 名前:269 :03/02/02 00:26
>>272

thanx.

別のSTL使えばOKになるんだろうけども、
そのSTLの何が悪かったのかわからずじまい
になってしまう。
どうしよう...

276 名前:デフォルトの名無しさん :03/02/02 00:26
98年リリースなんだから標準に準拠してなくても仕方ないさ

277 名前:デフォルトの名無しさん :03/02/02 00:33
その標準も98年にリリースされたんじゃなかったっけ

278 名前:デフォルトの名無しさん :03/02/02 00:36
標準がリリースされて数ヶ月で対応できたら、もはや神の領域だろう。

279 名前:デフォルトの名無しさん :03/02/02 00:38
お遊びなら.net Framework SDKのコンパイラを使えばいいよ。
仕事ならVS.net買ってもらえ。

280 名前:デフォルトの名無しさん :03/02/02 00:43
お遊びならMingwでいいじゃないか。

281 名前:269 :03/02/02 00:46

vs.netかぁ。ママ買ってくれるかなぁ。

282 名前:269 :03/02/02 03:15
vc6のvector<string>は適切な
コンストラクタを選択できないとこまでは解った。
んで、copy()使って見たらなんとかうまくいった。

//vector<string> b(ii, eos);
vector<string> b(100);
copy( ii, eos, b.begin() );

サイズ100で初期化はまずいので、
このbへコピーされるサイズをあらかじめ
知るにはどうしたらいいんだろう。。。

283 名前:デフォルトの名無しさん :03/02/02 03:23
std::distance()

284 名前:269 :03/02/02 03:50
おお。取れた。

int i = static_cast<int>(distance( ii, eos ));
vector<string> b( i );
copy( ii, eos, b.begin() );

でも、なんか期待通り動かない。。。
なんでだろう。。。

285 名前:11歳 :03/02/02 04:12
コンソールアプリケーションとSDKによるWindowsアプリケーションとは
何でしょうか?

286 名前:デフォルトの名無しさん :03/02/02 04:20
>>285
スレ違い。
Windows とか Win32API とかすれ立てるまでもないとかその辺り。

287 名前:11歳 :03/02/02 04:29
VC++上でのことを聞いてるんです。

288 名前:デフォルトの名無しさん :03/02/02 04:32
>>287
VC++スレ逝って

289 名前:11歳 :03/02/02 04:35
>>288
どこがスレ違い?勘違いしたの?

290 名前:デフォルトの名無しさん :03/02/02 08:40
クラスのコンストラクタの定義で
one_image::one_image(unsigned char *R, unsigned char *G, unsigned char *B,
int size_x, int size_y, int b_x, int b_y)
{
HSize = size_x;
VSize = size_y;
}
としたら、

error C2144: 構文エラー : ')' が型 'unsigned char' の前に必要です。
error C2059: 構文エラー : ')'
構文エラー : ';' が '{' の前に必要です。
とかエラーが出て、おまけに
error C2065: 'size_x' : 定義されていない識別子です。
と、定義されてないことになっちゃいます。
どういうことか、さっぱり分かりません。
どうしたらいいでしょう?



291 名前:290 :03/02/02 08:59
Microsoft Developer Stdioを使ってるのですが、
oneimage::one_image();
のオーバーロードと関係があるんでしょうか?

292 名前:デフォルトの名無しさん :03/02/02 09:32
>>290
クラス定義の最後のカンマを忘れてそうな気がする。
class one_image {
 // ...
};←これね。

違ってたらスマソ

293 名前:290 :03/02/02 10:35
>>292
ありがとうございます。解決しました。
そんな事にもきずかないなんて僕は本当に馬鹿でした。
くだらない質問であなたの大切な時間を無駄にして本当に済みませんでした。
僕のようなゴミの質問を真剣に考えてくださって心から感謝します。

294 名前:デフォルトの名無しさん :03/02/02 10:38
笑った笑った。

295 名前:デフォルトの名無しさん :03/02/02 10:43
大体、数ヶ月に一度パテント料が支払われていたのですが、
大仁田さんは。ときにはその半分の500万円を持って行ってしまします。
大仁田さんはどこの興行に出ても。「客が入ったのは俺のおかげじゃ!」と言い。
毎回20〜30万のギャラを持ってゆくのです。
前項でポーゴさんのギャラが破格だったと書きましたが。それでも1試合8万円です。
私たち程度の団体ではまったく考えられない金額でした。★故荒井氏著「倒産FMW」より抜粋
□自殺についての詳細はこちら
http://www.yomiuri.co.jp/hochi/battle/may/o20020516_40.htm
http://www.nikkansports.com/jinji/2002/seikyo020517_2.html
http://www.zakzak.co.jp/top/t-2002_05/2t2002051704.html
荒井元FMWプロレス団体社長を自殺に追い込んだ
大仁田議員に清き一票おながいします!
http://kenji03.hp.infoseek.co.jp/cgi-bin/kage/votec.cgi

296 名前:デフォルトの名無しさん :03/02/02 11:06
日本人の50人に1人は自殺で死ぬという罠。
珍しくもなんともない。

297 名前:デフォルトの名無しさん :03/02/02 11:15
>>295-296
板違い。

298 名前:デフォルトの名無しさん :03/02/02 11:57
次のスレをたてるときは、

VC++でWindowsプログラミングをしている人はまずVC++スレに行きましょう。
おそらくあなたの質問はC++の問題ではなくVC++/Windows特有の問題です。

とか書いておきたいね。

299 名前:デフォルトの名無しさん :03/02/02 12:53
->

こn記号の意味は?
厨房でごめんちゃい。

300 名前:デフォルトの名無しさん :03/02/02 13:14
a->bは(*a).bと同じ

301 名前:デフォルトの名無しさん :03/02/02 13:46
>>299
わからない。
大抵は、>>300 で合ってると思うが、C++ は演算子を定義できるから、他の意味に定義されているかもしれない。

302 名前:デフォルトの名無しさん :03/02/02 16:09
:->

:-P

303 名前:C++厨 :03/02/02 16:17
<C++> ::= <色々>|<最高>|幼女

304 名前:デフォルトの名無しさん :03/02/02 16:23
>>301
->ってオーバーロードできたっけ?

305 名前:デフォルトの名無しさん :03/02/02 16:23
スマートポインタには必須だと思うが・・・

306 名前:304 :03/02/02 16:26
http://black.sakura.ne.jp/~third/cpp27.html
できるか。

307 名前:デフォルトの名無しさん :03/02/02 17:58
C++初心者です。
ポインタを勉強して理解をしたつもりでしたが、次に「クラス」
を勉強していてポインタと言うものを実は理解していないのでは?という
不安にかられています。

と言いますのも、ポインタでは変数の「アドレス」を変えたり出来たのですが、
これはイメージ的に掴む事が出来ました。変数の値を置いてある番地のことが「アドレス」
であり、ポインタとはそのアドレスを保有する事のできる「変数」と。
ところがクラスのポインタというものが出てきて面食らっています。
あるクラスの置かれている番地=そのクラスのアドレスというのがピントきません。
変数に比べてクラスは色んな情報を持っているため・・・。
変数、クラスもひっくるめて、全ての「オブジェクト」にアドレスがあるのでしょうか?
よろしかったら、「アドレス」というものを初心者にもわかるように説明をお願いしたいのですが。

よろしくお願いします。

308 名前:デフォルトの名無しさん :03/02/02 18:04
charのポインタが判るなら、charの配列のポインタも判るよな、
配列のポインタが判るなら構造体のポインタもわかるだろう。
なら構造体のポインタが判ればクラスのポインタもわかるってもんだ。


309 名前:デフォルトの名無しさん :03/02/02 18:05
>>307
C++ になったら、あまりアドレスには拘らずに、オブジェクトを指すものだと
思っておいた方が。
(特に多重継承や仮想継承が絡むと、内部でオフセット調整とか入るし、
仮想関数へのポインタとかになるとアドレスそのものではないし)

> 変数、クラスもひっくるめて、全ての「オブジェクト」にアドレスがあるのでしょうか?
「クラス」ではなく「インスタンス」あるいは「オブジェクト」な。クラスといったら構造体や
int と同様、型のこと。

アドレスがあるかって話だけど、原則として Yes。例外は register 指定した変数と
this ポインタ、あと仮想関数へのポインタかな。詳しく知りたければ、書籍
Inside the C++ Object Model を読むと良い。

310 名前:デフォルトの名無しさん :03/02/02 18:41
charの列へのポインタの指す文字列をcharの配列へ
列全体をコピーする関数にはどんなのがあるでしょうか?
char dist[32];
char *src;
strcpy(dist,src);//文字列のコピー。
ってのはありでしょうか 御教授お願いします


311 名前:デフォルトの名無しさん :03/02/02 19:02
質問です。
整数型の変数 m, n の値を受けて、動的に二次元配列を作りたいのですが、
int **h;
for(i=0;i<m;i++){
h[i] = new int[n]
}
とかすると、強制終了してしまいます。
どのようにすれば実現できるでしょうか?

312 名前:デフォルトの名無しさん :03/02/02 19:04
>>310-311
Cの質問なのでそっちへ逝け。

313 名前:デフォルトの名無しさん :03/02/02 19:08
>>311はかろうじてnewを使っている

314 名前:デフォルトの名無しさん :03/02/02 19:12
int *h[m];

315 名前:デフォルトの名無しさん :03/02/02 19:26
>>314
m は変数なわけで。

316 名前:デフォルトの名無しさん :03/02/02 19:26
>314
試しましたが、mは定数ではないのでコンパイルエラーとなります。

h = new int*[m];

for(i=0;i<m;i++){
h[i] = new int[n];
}
これもダメでした…

317 名前:デフォルトの名無しさん :03/02/02 20:04
vector< vector<int> > h;

318 名前:デフォルトの名無しさん :03/02/02 20:06
std::vector< std::vector<int> > h(n, std::vector<int>(m) );


319 名前:デフォルトの名無しさん :03/02/02 20:25
constにすれってことじゃ

320 名前:名無しさん :03/02/02 20:34
>>319
いや,動的に確保したいんでしょ。

321 名前:デフォルトの名無しさん :03/02/02 20:42
いや、mが定数じゃなくてエラーだって言うから

322 名前:デフォルトの名無しさん :03/02/02 20:57
int **h;
h=(int **)malloc(m*sizeof(int));
for(int i=0;i<m;i++){
h[i]=(int *)malloc(n*sizeof(int));
}

323 名前:デフォルトの名無しさん :03/02/02 21:21
>322
Thanxd
>h=(int **)malloc(m*sizeof(int));
がなんとなく気持ち悪いけど、いけました!

new使う方法は無理なんでしょうか?

324 名前:名無しさん :03/02/02 21:25
>>322
Cやん,これ。

>>323
vector使った方が早いと思うが。

325 名前:デフォルトの名無しさん :03/02/02 21:27
>324
まぁその通りなんですが、
変な挙動を示した事があるのであんまり初心者向きではないかと。

326 名前:デフォルトの名無しさん :03/02/02 21:33
変な挙動?

327 名前:デフォルトの名無しさん :03/02/02 21:36
キーボードから漢字と半角英文字の混ざった文字列(例えば"abc亜意宇")を読み込んで
そのn文字目を指したいときどのようにすればいいのでしょうか…?
(wchar.hをインクルード)
wchar_t s[256];
gets(s);
として"abc亜意宇"をキーボードから入力して
'亜'の一文字を出力するために
putwchar(s[3]);
としてみたんですがうまくいかなくて・・・


328 名前:デフォルトの名無しさん :03/02/02 21:37
>326
using namespace std;
ってコードを入れると、
それまで動いていた特定のコードが動かなくなるという現象です。
VisualC++6.0で起きていました。

329 名前:デフォルトの名無しさん :03/02/02 21:39
for(int i=0;i<m;i++){
free(h[i]);
}
free(h);

330 名前:デフォルトの名無しさん :03/02/02 21:41
>>323
>>h=(int **)malloc(m*sizeof(int));
>がなんとなく気持ち悪いけど、

どのへんが?

331 名前:デフォルトの名無しさん :03/02/02 21:41
>>328
using namespace しなきゃいいのでは?

332 名前:デフォルトの名無しさん :03/02/02 21:44
>330
sizeof(int)のところ。
>331
そのままでvector使えるのですか?

333 名前:デフォルトの名無しさん :03/02/02 21:45
sizeof(int*) ...

334 名前:デフォルトの名無しさん :03/02/02 21:47
>>332
std::vectorってネームスペースを指定すれば使えるジャン。


335 名前:デフォルトの名無しさん :03/02/02 21:52
>333
あ、これコンパイルできたのですか…
>334
不勉強なもので…
参考文献スレのお世話になってきます…

336 名前:デフォルトの名無しさん :03/02/02 22:00
>.335
そりゃお前の環境がたまたまsizeof(int) == sizeof(int*)だっただけだ。
もっとも違っててもコンパイルエラーにはならんで実行時に死ぬだけだが。

337 名前:デフォルトの名無しさん :03/02/02 22:07
以下のコードを実行すると、2回リターンを押さないと終了してくれません。
どうしてでしょうか?
int main(int argc, char* argv[])
{
 std::string s;
 std::getline(std::cin, s);
 return 0;
}

338 名前:デフォルトの名無しさん :03/02/02 22:09
ネタ?

339 名前:デフォルトの名無しさん :03/02/02 22:14
>>337
あー、VC++6だろ?
STLportにしたら直る税。

340 名前:327 :03/02/03 01:54
テメェら!とっとと教えて下ちい!

341 名前:デフォルトの名無しさん :03/02/03 02:13
>>340
wcinでも使っとけ。ここはC++スレ

342 名前:327 :03/02/03 03:06
>>341
スマソ。C言語ならあっしに聞けスレがあったのね・・・
ちなみに340は漏れじゃないから。。


343 名前:デフォルトの名無しさん :03/02/03 14:06
scanf("%s end", str) を istream をつかって書くとどうなるんでしょうか。
cin >> str >> "end" みたいな感じに簡単には書けないんですか?

344 名前:デフォルトの名無しさん :03/02/03 14:36
>343
ofstream str(filename);
str<<"end";
とかで(・総て・)イイ!!んじゃねーの?

345 名前:デフォルトの名無しさん :03/02/03 14:58
>>343
オイラはダミー一個作っといて
cin >> str >> dummy;
みたいにしてるけど・・・なんかもっといい案無いのかなぁとも思う。

346 名前:C++厨 :03/02/03 15:21
同感

347 名前:デフォルトの名無しさん :03/02/03 16:01
sscanf() とかラップして scanf_stream 作るべし

348 名前:デフォルトの名無しさん :03/02/03 16:18
マニピュレーター自作して cin >> str >> check("end") // "end"じゃなきゃfailbitたてる
ってのはどう?

引数付きのマニピュレーターってどうやって作るのかしらないけど。

349 名前:デフォルトの名無しさん :03/02/03 16:25
string を内包する class でも書けば ok かと

350 名前:デフォルトの名無しさん :03/02/03 18:05
>>349
それってstringコピーする分、無駄が出ると思うんだが。

351 名前:デフォルトの名無しさん :03/02/03 18:26
じゃあ char* でいい
あとは istream& operator>>(istream&, T) とかで

352 名前:デフォルトの名無しさん :03/02/03 18:35
質問です。
friend 関数に テンプレート関数は使えないのですか?
クラス自体はテンプレートではないです。

353 名前:デフォルトの名無しさん :03/02/03 18:40
>>352
使えるよ。クラスでテンプレート宣言しておけば。

template <typename T>
friend ostream& operator << <>(ostream& str, T t);

みたいな感じで。gcc3.2.1では通るがBCC5.5.1ではだめだった。

354 名前:デフォルトの名無しさん :03/02/03 20:53
struct List {
  List *m_next;
  List *m_prev;
  CString m_text;
public:
  List() {};
  List(const CString&text) : m_text(text) {};

  void link(List *next)
  {
    m_next = next;
    next->m_prev = this;
  };
};

双方向リストの構造体なんですが、
  List() {};
  List(const CString&text) : m_text(text) {};
の部分が何をやってるか分かりません。
詳しく解説してもらえないでしょうか?
List() {};は、コンストラクタで、各メンバを0かNULLで初期化してると思うのですが。
List(const CString&text) : m_text(text) {};の「&」とか「:」が何を意味してるのかも
よく分かりません・・・。

355 名前:デフォルトの名無しさん :03/02/03 20:56
>List() {};は、コンストラクタで、各メンバを0かNULLで初期化してると思うのですが。
いや、何も初期化してないんだと思うんだが

356 名前:233 :03/02/03 20:57
お前の目はfusianasanか!

357 名前:デフォルトの名無しさん :03/02/03 20:59
質問でつ。

とあるstatic変数をもったクラスを、いくつかのオブジェクトが継承してるとしますね。
こういう場合・・・
1:このstatic変数は1個しかなくて、継承したオブジェクト達はこの1個しかないstatic変数を
  参照する。
2:このstatic変数のコピー的なものが、継承したオブジェクト達にそれぞれ存在して、
  どこかのオブジェクトのstatic変数が変更されると、ほかのオブジェクトの同じstatic変数
  も変更される。

のどちらですか?

358 名前:デフォルトの名無しさん :03/02/03 21:01
>>357
どちらでもないよ

359 名前:名無しさん :03/02/03 21:03
>>354
C++ってここらへんでつまずく人が多いような気が・・・

List(const CString &text) : m_text(text) {} ;

'&'は参照,":"はListのメンバであることの明示。
この行では,Listのメンバm_textをtextに代入している。

360 名前:名無しさん :03/02/03 21:05
>>359
> この行では,Listのメンバm_textをtextに代入している。
逆だ。textをm_textに代入。

361 名前:デフォルトの名無しさん :03/02/03 21:06
代入じゃなくて初期化では。

362 名前:360 :03/02/03 21:09
>>361
ごちゃごちゃとうるせーよ

363 名前:デフォルトの名無しさん :03/02/03 21:25
>>362
コンストラクタと同じシンタックスにしてるところから
考えてやっぱり初期化と呼ぶのが正しいんじゃない?

364 名前:デフォルトの名無しさん :03/02/03 21:26
んじゃ、初期化でいいよ。

365 名前:名無しさん :03/02/03 21:43
>>362 は 359=360 ではありません。

>>354
俺も昔はここでつまずいた。
言語仕様だから慣れるしかないね。


366 名前:デフォルトの名無しさん :03/02/03 21:52
>>365
> >>362 は 359=360 ではありません。
それはたぶん皆わかってるが、代入と初期化って
全く別物だから、間違えない方がいいぞよ。

367 名前:生兵法 :03/02/03 21:59
CStringのm_textをtextで初期化する っていうのは
CString m_text(text);
こんなふうに メンバ変数を
コンストラクタで初期化する場合には
>>354みたいな文法を使う。

代入っていうのは
CString m_text;    //デフォルトコンストラクタで初期化
m_text = text;     //operater=で代入。
っていう流れ。 いっぺん空のオブジェクト作ってからそこに
放り込むので、初期化が途方も無く重たい場合なんかはロスがでると。
漏れはこんな認識だけど、問題あったら教えてー。

368 名前:354 :03/02/03 22:05
>>355
え?そうなんですか?
じゃあ一体これはどんな意味があるんでしょうか?
C++の構造体って、コンストラクタが使えたりしてよく分かりません。
Cしか経験が無いので。

>>359
なるほど、&は参照の&でしたか。
元にしたソースに空白無しでくっついて表記されてたので、気付きませんでした。
「:」はメンバにアクセスするときに使うんですか。
メンバにアクセスするには「.」か「->」だと思ってました。
C++の「:」は継承に使うものだとばかり思ってました。

369 名前:デフォルトの名無しさん :03/02/03 22:09
>>368
> 「:」はメンバにアクセスするときに使うんですか。
それは

 コンストラクタで
 メンバ変数の初期化 or 明示的に親クラスのコンストラクタを呼び出す

ときだけ。

基本が抜けすぎてるから、とりあえず「プログラミング言語 C++」を買ってきて
読んだ方が良いと思うぞ。

370 名前:名無しさん :03/02/03 22:18
>>366
拝承。代入は演算子が絡むもんな。

371 名前:デフォルトの名無しさん :03/02/03 22:45
そして、
CString str = "test";
で躓く罠。

372 名前:デフォルトの名無しさん :03/02/03 22:47
構文砂糖だっけ?

373 名前:デフォルトの名無しさん :03/02/04 00:13
お尋ねします。
新しく作った構造体をメンバ変数として定義しますよね。
struct kouzoutai aa;
というふうに。
それをメンバ関数での引き数として使うことはできるのでしょうか?
というのは、メンバ関数内にそのままaaとして書けばいいのですが、
メンバ変数にbbもあってそれもメンバ関数に使いたかったらaaと書いては
できないですよね。だから引数として渡すしかないと思いまして・・・

374 名前:デフォルトの名無しさん :03/02/04 00:21
>>373
何を言ってるかサッパリ分からんので、サンプルコードを書いてみてくれ。

375 名前:デフォルトの名無しさん :03/02/04 00:23
構造体が引数として渡せるかどうかってだけか。渡せる。

376 名前:デフォルトの名無しさん :03/02/04 00:26
すいません。
まず、メンバ変数として
struct kouzoutai aa, bb;
と宣言します。

そしてあるメンバ関数の引数として
void function(int Val, kouzoutai cc)
というようにすることはよくあるのでしょうか
aaやbbをfunctionで使いたいのですが、aaやbbはメンバ変数だから
別に引数として使わなくても使うことはできますよね?でもあるときは
aa,あるときはbbを使いたいからfunctionに引数として使いたいわけで。
すいません、また意味不明っぽくて

377 名前:デフォルトの名無しさん :03/02/04 00:33
>>376
普通はややこしいから、メンバとパラメータは違う名前にする。
どうしてもやりたければ、aaでパラメータ、this->aaでメンバにアクセスできる。

378 名前:デフォルトの名無しさん :03/02/04 00:34
変数、配列、構造体といろいろあるから学びにくい。
構造体だけにしてしまえばいい。

379 名前:デフォルトの名無しさん :03/02/04 00:36
>>378
( ゚Д゚)

380 名前:デフォルトの名無しさん :03/02/04 00:38
>>379
そういうのは放置しようや

381 名前:デフォルトの名無しさん :03/02/04 00:40
標準ライブラリとか関数とか使うときに
どのヘッダをいんくるーどすればいいのかって
というのはどうやって知るんですか・・・
googleっていうのはなしで・・・・
教えてたも〜

382 名前:デフォルトの名無しさん :03/02/04 00:40
>>379
(゚д゚)

383 名前:デフォルトの名無しさん :03/02/04 00:42
>>381
雰囲気で分かる。

384 名前:デフォルトの名無しさん :03/02/04 00:43
>>382
確かに意外と正しいよな(w

385 名前:デフォルトの名無しさん :03/02/04 00:44
>>383
( ゚Д゚)

386 名前:デフォルトの名無しさん :03/02/04 00:46
>>381
manを見れば書いてありますが。

http://www.linux.or.jp/JM/
とか。

387 名前:デフォルトの名無しさん :03/02/04 00:58
>>386
manって・・・・
gccとかじゃなくて、
bcc使ってるまろは
どうしたらいいんでおじゃるか・・・

388 名前:デフォルトの名無しさん :03/02/04 00:59
そもそもどうしてgoogleは無しなのか

389 名前:デフォルトの名無しさん :03/02/04 02:19
>>381
まともなヘルプなら大抵書いてあると思うが。
ヘルプがなければ適当にインクルードしとけばいい。
どれかに当たりがあるだろう。
それが嫌ならインクルードファイルが置いてあるところにいって
検索すればいい。

慣れれば雰囲気で分かるんだけど。

390 名前:デフォルトの名無しさん :03/02/04 04:53
>>378
構造体のメンバは?

391 名前:デフォルトの名無しさん :03/02/04 05:23
>>390
きっと整数型とかも構造体として扱うんだよ。
値は関数を使って取得して、
その内部構造は言語的に隠蔽されてるんだよ。きっと。

392 名前:デフォルトの名無しさん :03/02/04 06:02
構造体の中身にも変数を使ってはいけないのか。
それは大変だな。

393 名前:デフォルトの名無しさん :03/02/04 14:47
//関数の呼び出しで標準変換を禁止する方法はないものなのでしょうか?

#include<iostream>
struct CStrin
{
CStrin(char a){//explicitは使いたくない}
};
void test( CStrin s )
{
std::cout << "test(CS)";
}
void test(float a)
{
std::cout << "test(float)";
}

template <typename T> struct A
{
void operator() (T a){}
};

int main()
{
test('a');//test(float)

A<const char>()('a');//関数オブジェクトを使うしか...

}

394 名前:デフォルトの名無しさん :03/02/04 14:54
test(CStrin('a'));

395 名前:デフォルトの名無しさん :03/02/04 14:56
void test(char c){}を用意

396 名前:デフォルトの名無しさん :03/02/04 16:27
VC++6.0を使っているんですっが、
switch文の中で、宣言して代入ってできないんでしょうか?

// エラー
UINT j = DT_TABSTOP | 0x00002F00;
DrawText(hdc, str, -1, &rect, j);

d:\temp\winapitest001\winapitest001.cpp(92) : error C2360: 'j' の初期化が 'case' ラベルによって行われませんでした。
d:\temp\winapitest001\winapitest001.cpp(85) : 'j' の宣言を確認してください。

//これだとOK
UINT j;
j = DT_TABSTOP | 0x00002F00;
DrawText(hdc, str, -1, &rect, j);

どうして前者だとエラーになるのでしょう?
文法的には問題なさそうなんですが。




397 名前:デフォルトの名無しさん :03/02/04 17:08
エラーコードぐらい調べろよ

コンパイラ エラー C2360
'identifier' の初期化が 'case' ラベルによってスキップされました。

指定された識別子の初期化は switch ステートメント内では行われない場合があります。

初期化を伴う宣言は、閉じたブロック内で行われない限り、スキップすることはできません。

初期化された変数のスコープは、switch ステートメント内の閉じたブロックの中で宣言されていない限り、switch ステートメントの最後まで続きます。

次にこのエラーの例を示します。

void func( void )
{
int x;
switch ( x )
{
case 0 :
int i = 1; // エラー, case 1 によってスキップされます
{ int j = 1; } // OK, 閉じたブロック内で初期化されています
case 1 :
int k = 1; // OK, 初期化はスキップされません
}
}


398 名前:デフォルトの名無しさん :03/02/04 17:10
DrawText(hdc, str, -1, &rect, DT_TABSTOP | 0x00002F00);


399 名前:デフォルトの名無しさん :03/02/04 17:39
>>397
どうもです。なるほど、仕様なんですね。

>>3988
もちろん、そうできるのは分かるんですが、デバッグで確認するために
敢えて一旦代入してみました。

400 名前:デフォルトの名無しさん :03/02/04 18:56
using namespace の逆って無いの?
define に対する undef みたいなの。


401 名前:デフォルトの名無しさん :03/02/04 19:06
ない。
ヘッダーファイルでは
std::string s ;
のようにして cpp で using namespace 使うのが一般的なのかな

402 名前:デフォルトの名無しさん :03/02/04 20:12
>>400
ないが、一時的に using したいなら anonymous namespace 使うのは手かも。

403 名前:デフォルトの名無しさん :03/02/04 22:14
anonymous namespace ?

404 名前:デフォルトの名無しさん :03/02/04 22:16
名無しさんのことだよ

405 名前:デフォルトの名無しさん :03/02/04 22:32
>>393
template<typename T> struct nise {
T t;
nise(T t) : t(t) {}
operator T() const { return t; }
};
//------------------------------------------
void test(nise<float> a)
{
std::cout << "test(float)";
}

とすると標準変換よりは優先度が下がるので、
test(CStrin) と test(float) が曖昧です、くらいにはなる。

406 名前:デフォルトの名無しさん :03/02/05 00:37
unnamedだろ。

407 名前:デフォルトの名無しさん :03/02/05 00:50
>>402
VC++6 で通っちゃうんですけど・・・。

#include <iostream>
namespace
{
  using std::cout;
  using std::endl;
}
int main()
{
  cout << "hello, world" << endl;
  return 0;
}

408 名前:名無し~3.EXE :03/02/05 13:10
http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
↑って何?これが本当なら面白いね。
2.1Mになっちゃう単純なHello Worldって何?

409 名前:デフォルトの名無しさん :03/02/05 13:38
>>408
散々ガイシュツ

410 名前:デフォルトの名無しさん :03/02/05 13:51
>>402
無名ネームスペースじゃだめな気が
あれはstaticの改良だよね?
そのファイルからしか見えなくなるという

411 名前:名無し~3.EXE :03/02/05 14:19
>>409
過去ログのどのあたりでやってたかわかります?
結論は?下らんジョークって落ちか。
元ネタは何なんだろう。。。

412 名前:デフォルトの名無しさん :03/02/05 14:26
usingをグローバルで使う奴はタコ

413 名前:C++厨 :03/02/05 15:55
>>408
Stroustrup FAQを読め

414 名前:デフォルトの名無しさん :03/02/05 23:06
すいません、ちょっと質問。
inputとoutputが同じファイルを指すストリームであるとして

書き込みプログラムで
int a = 0;
output.write((char*)&a, sizeof(int));

読み込みプログラムで
while (!input.eof())
{
input.read((char*)&b, sizeof(int));
cout << b << endl;
}

とすると
0
0
と二回結果が返ってきます。
一回しか書き込んでないのになぜ?

415 名前:デフォルトの名無しさん :03/02/05 23:13
while ( input.read((char*)&b, sizeof(int)) )
{
cout << b << endl;
}


416 名前:デフォルトの名無しさん :03/02/05 23:29
>415
なるほど。
実際にはいろんな型の複数のデータを扱っているので
構造体にでもまとめてその手法を使ってみます。
ありがと。

417 名前:デフォルトの名無しさん :03/02/05 23:32
しかし、>>414はどこがわるかったの?

418 名前:デフォルトの名無しさん :03/02/05 23:32
>>416
「手法」じゃねーよ。>414が間違ってるだけ。
ちゃんと理解してから先に進みやがれってんだ。

419 名前:デフォルトの名無しさん :03/02/05 23:36
(char*)とsizeof(int)がよくないんじゃないの?

420 名前:414 :03/02/05 23:38
>418
ごめん、精進します。

421 名前:デフォルトの名無しさん :03/02/05 23:38
>>417
最後のデータより後ろを読んだ時にeofbitがセットされる。
正しくデータが読み込めている限り、eofbitはセットされない。

>>419
それなら>>415でも治らないだろ。

422 名前:デフォルトの名無しさん :03/02/05 23:41
>>414
input.eof()がtrueになるのは、一度読み込んでみてからでないと
判断できない。

だから

while (true)
{
input.read((char*)&b, sizeof(int));
if (input.eof()) break;
cout << b << endl;
}

ではないかと思うのだが。

423 名前: ◆LLDJDNg/kE :03/02/05 23:46
どなたかメール送信ソフトを作成して頂けませんか?
希望としては大量に短時間で送信できることです!
システムの内容としては
ttp://www.arelax.net/pc/amailer/index.htm
このような機能は最低限欲しいです。
とにかく1時間で何万件も送れるメール送信ソフトが欲しいです!
興味にある方はメールください。
作成費用は交渉致します♪


424 名前:419 != 414 :03/02/05 23:53
俺がバカだったのは認める。
>>421 >>422の言うこともわかる。
しかし、>>414で、2度目の0の出力が不思議だ。

あ、2度目の読み込みでは、データは読めず、前の0がbに残ってるからかな。

425 名前:デフォルトの名無しさん :03/02/05 23:54
>>423
くさい飯でも食いたいのか?

426 名前:デフォルトの名無しさん :03/02/05 23:58
>>424
>>421 >>422の言うこともわかる。」なら、
「前の0がbに残ってるから」のほかに何があるってんだ?

427 名前:424 :03/02/06 00:02
自己レス。やっぱりそうだった。

>>414の設定で、

int b, c = 100;
ifs.read((char*)&b, sizeof(int));
cout << b << endl;
ifs.read((char*)&c, sizeof(int));
cout << c << endl;

としたら、

0
100

と出力された。

今晩は勉強になりますた。
サンキューです。 >>421 >>422 あんど >>414

428 名前:427 :03/02/06 00:05
>>426
かぶりましたな。

まあ、もう少し、やさしい人になってちょーね。

429 名前:デフォルトの名無しさん :03/02/06 00:05
>>423
お前馬鹿だろ?

430 名前:269 :03/02/06 00:10
話戻すようでわるいんだけど。

ifstream is( from.c_str() );
istream_iterator<string> ii( is );
istream_iterator<string> eos;
int i = static_cast<int>(distance( ii, eos ));
vector<string> b( i );
copy( ii, eos, b.begin() );

なんかうまくcopyされてないみたい。。。
この ii の値はdistanceの後変わってしまう?
あとeosってここではどんな意味が?


431 名前:デフォルトの名無しさん :03/02/06 00:32
>>430
istream_iteratorにdistance?
eosはend_of_streamだな。
distanceした時点で読み込みが完了するものとおもわれ。

入力が完了するまで要素数はわからないので、あらかじめ確保するのはムリ。
back_inserter使え。

432 名前:デフォルトの名無しさん :03/02/06 00:32
>>430
eosってのはstd::istream_iterator()という引数なしの
コンストラクタだから、EOFを示している。
distance()でeosまでの距離を取ったら、ストリームを一度最後
まで読むから、値がおかしくなるんじゃない?

std::copy(ii, eos. std::back_inserter(b)); ではどうか。

433 名前:431 :03/02/06 00:33
みごとなかぶりっぷり。

434 名前:デフォルトの名無しさん :03/02/06 00:33
ケコーン(w

435 名前:デフォルトの名無しさん :03/02/06 00:35
>>430
ifstream is( from.c_str() );
istream_iterator<string> ii( is );
istream_iterator<string> eos;
int i = static_cast<int>(distance( ii, eos ));
vector<string> b( i );
ii.clear();
ii.seekg(0, std::ios::beg);
copy( ii, eos, b.begin() );

こうやったらどう?

436 名前:デフォルトの名無しさん :03/02/06 00:43
おもいっきり戻ってるね。

ちなみに、何がしたいかわかんないけど、フツー

ifstream is( from.c_str() );
istream_iterator<string> ii( is );
istream_iterator<string> eos;
vector<string> b(ii, eos);

でない?

437 名前:デフォルトの名無しさん :03/02/06 00:56
>>436
漏まえは>>269まで戻れ。

438 名前:デフォルトの名無しさん :03/02/06 01:51
例えば参照カウント式のスマートポインタを作るとして、
ポリモーフィズムを扱いたい場合には

explicit counted_ptr(T* p = 0) : ptr_(p), count_(new long(1)) { }

template <typename U>
explicit counted_ptr(U* p = 0) : ptr_(p), count_(new long(1)) { }

という二つのコピーコンストラクタを作るのかなぁと思ったのですが、
良く良く見ると後者は前者を包含してるように思えます。
という事は前者はいらないのでしょうか?
ちょっとこの辺り(型の自動変換の問題とか?)にイマイチ自信が無いのですが、
後者だけでは何か問題があったら教えて頂けますでしょうか。

439 名前:438 :03/02/06 01:54
書き忘れた事を一つ。
前者で explicit を取ればいいような気もするんですが、それには
何か潜在的な危険は無いんでしょうか?なんか参照カウントならいいよう
な気がしなくもないんですが、boost::shared_ptr は後者のみみたいで、
その辺が良く分かっていなくて混乱しているのですが・・・

440 名前:デフォルトの名無しさん :03/02/06 04:31
>>438
explicitは、単にT*が暗黙にcounted_ptr<T>に変換されるのを防ぐ
ためだからちと違うんでない?
前者でも counted_ptr<Base> ptr(new Derived()); は書ける。
後者は前者を包含するけども、↑を書く時点では前方参照でもOK
らしい、ちゅうところが違うみたい。
#同じコンパイル単位に定義は必要だが。

#include "counted_ptr.h"

class Base; class Derived;
void func(Derived *p) { counted_ptr<Base> ptr(p); } // 前方参照のみ

class Base {}; class Derived : public Base {};

g++3.2では、前者はNG、後者ならOKでした。
テンプレートにマッチすることで、型のチェックが遅延するのかな?

441 名前:440 :03/02/06 04:45
ん、なんか>>438 の疑問をとりちがえたらしいや。
後者は前者を包含するし潜在的な危険もないので、後者だけでいいんじゃない?
と答えるところだったのか。
explicitの有無については>>440 になるんでないかの。

また、細かい話だがそれはコピーコンストラクタとは言わんと思う。
コピーコンストラクタっつたら、これ↓じゃない?
template <typename U> counted_ptr(const counted_ptr<U> &);

442 名前:デフォルトの名無しさん :03/02/06 07:55
コピーコンストラクタはtemplateから暗黙的に生成されないよ。
だから両方必要なはず。

ExceptionalC++に書いてあったと思う。

443 名前:デフォルトの名無しさん :03/02/06 08:01
>>442
言ってることがよくわからんけど、テンプレートでもコピーコンストラクタできるんじゃない?
やってみたらできたよ。

444 名前:443 :03/02/06 08:02
できる −> 暗黙に生成される

445 名前:デフォルトの名無しさん :03/02/06 09:10
んー(苦笑

446 名前:438 :03/02/06 12:31
>>440=441
ありがとうございます。とりあえず後者のみで良さそうって感じですかね。
boost::shared_ptr もそうなってるっぽいですし、まぁそうかなぁとは思ったので
すが、なんか前者が無いとイマイチ根拠の無い不安があるんですよね(苦笑
# たしかにコピーコンストラクタとは違いますね。スミマセン。

>>442,443
うー、ExceptionalC++持ってないから分からないのですが、とりあえず
後者だけでもg++3.2.1なら通るんですよね。僕の環境でも。ただ、g++も標準に準拠している
のかどーなのかまだ完全じゃないっぽいんで、判断が難しいんですよね・・・
# VC++で通らないと「きっとVCの準拠度の低さのせいだな」と結論付けちゃうんですけど(w

あと、boost::shared_ptr を見てて思った事。
operator=(T* p) じゃなくって reset(T* p) っていうのは、やはり
a = b = c = ...
とかっていう時にポインタと shared_ptr が混ざってると混乱するから
なんでしょうかねぇ?個人的には operator= でいいような気もするんですが・・・




447 名前:デフォルトの名無しさん :03/02/06 14:15
>>417
胃が悪かったんだ。

448 名前:443 :03/02/06 14:54
俺なんか悪いこと逝った?>>445

>>446は見ていて、めまいがしてきた。

449 名前:デフォルトの名無しさん :03/02/06 15:32
>>448
嘘を言ったように見える。
↓のコード、実行前に予想した結果と、実際に実行した結果が同じになるか?

#include <iostream>
struct X
{
  X(){}

  template<typename T>
  X(const T&){ std::cout << "template constructor" << std::endl; }
};
main()
{
  const X x;
  X copied(x);
};


450 名前:448 == 443 :03/02/06 16:11
>>449

予想:Xにはコピーコンストラクタが暗黙で生成されるので、実行してもX(const T&)は呼ばれない。
結果:その通りだった。

しかし、その前に、>>449のコードは、なんだか尋常でないものを感じる。
もう少しフツーのコーディングを覚えた方がいいんじゃないの?
コピーコンストラクタって言葉遣いもまちがってそうだし。

451 名前:デフォルトの名無しさん :03/02/06 16:19
ああそうか。
>>449は、X(const T&)から、X(const X&)が生成されるかもと思って、
そうでなかったので、それを「テンプレートからコピーコンストラクタが
暗黙に生成されることはない」と言ったんだね。

そりゃあ、用語がめちゃめちゃやん。
もう寝る。

452 名前:デフォルトの名無しさん :03/02/06 16:32
> >>449のコードは、なんだか尋常でないものを感じる。
うむ、mainの終わりにセミコロンがついてるのは尋常じゃぁない。

>>451
なにがめちゃめちゃになってるのかわからん。
起きたらまとめてくれ。

453 名前:デフォルトの名無しさん :03/02/06 18:22
コピーコンストラクタは、受け側と送り側が全く同じ型でないと
生成されないみたいだね。
で、テンプレートを使った一見コピーコンストラクタに見える定義
だけど、受け側と送り側が同じでない場合があるからという理由
で、コピーコンストラクタになる事を拒絶するようだ。
例え同じ型でも。

454 名前:デフォルトの名無しさん :03/02/06 18:26
しかしこういう全く同じ型だと明らかに分かる場合でもコピーコンストラクタを
呼んでくれないのはなぜ?(T_T)

#include <iostream>

template <typename T>
struct X {
X() {}
X(const T&) {
std::cout << "template constructor" << std::endl;
}
};

int main()
{
const X<int> x;
X<int> copied(x);
X<int> copied2;
copied2 = copied;
}

455 名前:デフォルトの名無しさん :03/02/06 18:38
>>453,>>454
なにがいいたいのかよくわかりません。

456 名前:デフォルトの名無しさん :03/02/06 18:42
>>454
どこが明らかなんだ?
X(const X&) 書く以外に、同じ型であることが明らかである場合があるのか?

457 名前:デフォルトの名無しさん :03/02/06 18:43
代入は代入演算子を(以下略

458 名前:デフォルトの名無しさん :03/02/06 18:44
>>455>>456
やっぱりだめか・・・・
基本的にテンプレートはコピーコンストラクタは全くだめなんですね。

459 名前:デフォルトの名無しさん :03/02/06 19:05
>>454
X<int> copied(x); において
const T& は const int& になるのであって、
const X<int>& にはなりません。

X< X<int> > copied(x); が正解です。

460 名前:デフォルトの名無しさん :03/02/06 19:08
>>459
本当だサンクス!
型が合えばテンプレートでもコピーコンストラクタを生成してくれました!

461 名前:デフォルトの名無しさん :03/02/06 19:10
>>460
確認しておくが、テンプレートからコピーコンストラクタは生成されんぞ。

462 名前:デフォルトの名無しさん :03/02/06 19:20
>>461
クラステンプレートではなくてメンバテンプレートでという意味ですか?

463 名前:461 :03/02/06 19:23
うん

464 名前:デフォルトの名無しさん :03/02/06 19:27
>>463
でもこれだとメンバテンプレートだけどコピーコンストラクタを生成
してくれたよ。

template <typename T>
struct X {
X() {}
template <typename U>
X(const U&) {
std::cout << "template constructor" << std::endl;
}
};

int main()
{
const X<int> x;
X<X<int> > copied(x);
}

465 名前:デフォルトの名無しさん :03/02/06 19:33
>>464
「コピーコンストラクタを生成してくれた」とは、
そのソースの実行結果がどうなることを言うんだ?

コピーコンストラクタの意味わかってる?

466 名前:デフォルトの名無しさん :03/02/06 19:35
>>464
T==Uの時、X(const U&)を呼んでくれたという事なんですけど・・・・
これはコピーコンストラクタと呼ばずに別の呼び方をするべきでしょうか?

467 名前:デフォルトの名無しさん :03/02/06 19:38
>>466
T==Uでも、X<T>::X<U>(const U&)はコピーコンストラクタじゃぁねぇ。
X<T>のコピーコンストラクタは、X<T>::X(const X<T>&)

468 名前:デフォルトの名無しさん :03/02/06 19:42
>>467
よくわかりました。
ありがとうございました。

469 名前:デフォルトの名無しさん :03/02/06 19:52
#include "iostream"
struct S_Base{public:float x,y;virtual ~S_Base(){;}};
class C_Child_S_Base:public S_Base{public:virtual ~C_Child_S_Base(){;}};
class C_GrandChild_S_Base:public C_Child_S_Base{public:~C_GrandChild_S_Base(){;}};
class C_Base{public:float x,y;virtual ~C_Base(){;}};
class C_Child_C_Base:public C_Base{public:virtual ~C_Child_C_Base(){;}};
class C_GrandChild_C_Base:public C_Child_C_Base{public:~C_GrandChild_C_Base(){;}};

int main(int argc, char* argv[]){
S_Base *p_SB=(S_Base *)new C_GrandChild_S_Base; delete p_SB;
C_Base *p_CB=(C_Base *)new C_GrandChild_C_Base; delete p_CB;
return 0;
}
structを継承する時に基底structでデフォルトデストラクタを使ってる例
をよく見かけますが、仮想デストラクタでないためかVC++.Netだと
ASERT落ちします(当然ながらclassも同じです)何故でしょう?
今までふつーに使って平気だと思ってたのですが・・・
上のソースのベースのデストラクタをコメントアウトして実行してみてください

470 名前:デフォルトの名無しさん :03/02/06 20:09
>>469
ASSERT 外せば?

471 名前:デフォルトの名無しさん :03/02/06 20:14
ASSERTEはメモリリークの警告ではないんですか?
structのデフォルトデストラクタはvirtualでないというのは
C++の仕様ですか?それともMSだけですか?あとclassもそうなんですか?
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
で落ちます

472 名前:デフォルトの名無しさん :03/02/06 20:18
>>471
おちつけ。まずは仕様書…とは言わんが、せめて「プログラミング言語 C++」と
MSDN Library 読んでからな。

473 名前:デフォルトの名無しさん :03/02/06 20:20
>>472
手元の本はEffectiveC++しかありません
MSDN見てみます

474 名前:デフォルトの名無しさん :03/02/06 20:32
だからあれほど規格書を仕様書と呼ぶなと

475 名前:472 :03/02/06 20:33
>>474
げ、ほんとだ。脳内で置換しておいてくれ。

476 名前:デフォルトの名無しさん :03/02/06 20:35
>>469
class A {
public:
 ~A() { cout << "~A" << endl; }
 void foo() { cout << "A" << endl; }
};

class B : public A {
public:
 virtual ~B() { cout << "~B" << endl; }
 virtual void foo() { cout << "B" << endl; }
};

class C : public B{
public:
 virtual ~C() { cout << "~C" << endl; }
 virtual void foo() { cout << "C" << endl; }
};

main() {
 A* a = new C; // 危険
 a->foo();
 delete a;

 B* b = new C;
 b->foo();
 delete b;
}

さて、何がどう呼ばれるでしょう?

477 名前:469 :03/02/06 20:41
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
MSDNで関係ありそうなのは、VC++6.0のメモリリーク検知の記述だけでした
上の順番で入れるといいらしいのですが、うちの環境では結局同じ所で
落ちました
structもclassも派生させるんならデフォルトデストラクタを使うな
ということですか?誰か教えてください
でも、DirectX関係でもstructから派生させてデフォルトデストラクタを使ってる
ような気がしますが・・・???

478 名前:469 :03/02/06 20:42
>>476
あ、ごめんなさい更新していませんでした。
今読みます

479 名前:469 :03/02/06 20:48
>>476
当然class Aは仮想デストラクタでないのですから~Aで止まりますが、
私が分からないのは「デフォルト」デストラクタは仮想かそうでないのかが分からないのです
特にstructから派生させる時は、「デフォルト」デストラクタを使う場合が多いのでは?

480 名前:デフォルトの名無しさん :03/02/06 20:50
>>479
まず、classとstructでの差は無い。
基底クラスが無い場合、デフォルトではvirtualにはならない。
基底クラスがある場合、デフォルトでは、基底クラスのデストラクタと同じになる。

481 名前:469 :03/02/06 20:54
>>480
ありがとうございます。それが知りたかったのです。
巷にある、structから派生させているのにも拘らず「デフォルト」
デストラクタを使っているサンプルは誤りということですね。

482 名前:デフォルトの名無しさん :03/02/06 21:01
>>481
仮想関数を1つも宣言しない場合は、誤りであるとは言えない。

483 名前:469 :03/02/06 21:05
>>482
>仮想関数を1つも宣言しない
デストラクタはclass派生させる場合は仮想にしなければならない
という認識ですが

484 名前:469 :03/02/06 21:07
>>483
自己レス
派生元のデストラクタを仮想にということです

485 名前:デフォルトの名無しさん :03/02/06 21:14
>>483
まぁまずはここでも読めや。
ttp://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.5

「とりあえずデストラクタvirtualにしとけ」ってのだけはやめとけ。
仮想関数を作るコストはゼロじゃぁないんでな、ちゃんと考えて判断するもんだ。

486 名前:469 :03/02/06 21:33
>>485
情報ありがとう
へっぽこ英語力でななめ読みですが、
ええと、仮想デストラクタにしない場合というのは
親族クラスのその階層以下でそれ以上「動的確保しない」場合のみですか?
それなら分かるのですが、階層以下で「動的確保してる」場合は
メモリリークですよね。意訳間違ってますか?
コストはあまり考えずに仮想ばっかやっていましたが・・・
サンプルを元に派生クラスを作る場合はサンプルのデストラクタの属性に
気をつけろということですね

487 名前:デフォルトの名無しさん :03/02/06 21:57
>コストはあまり考えずに
破門。C++以外の言語に乗り換えれ

488 名前:デフォルトの名無しさん :03/02/06 22:06
ちなみに以下のコードはVC6ではコンパイルエラーがおきる
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <stdlib.h>


489 名前:デフォルトの名無しさん :03/02/06 22:08
>>487
破門。Cでもやれ。

490 名前:469 :03/02/06 22:08
>>487
>破門。C++以外の言語に乗り換えれ
そんなぁ
デストラクタは主に動的確保の開放で使いますよね
それを途中で切ればコストは稼げますが、リソースの方が重要じゃないですか
安全に切る為にはその階層以下がNULLデストラクタってことですよね
NULLデストラクタだとあまりコストが稼げない気もしますが・・・???

491 名前:469 :03/02/06 22:12
>>488
あ、順番は必ず守れとMSDNに書いてました

492 名前:デフォルトの名無しさん :03/02/06 22:19
>>490
「クラス階層以下で動的確保」「デストラクタを途中で切る」「NULLデストラクタ」
デムパがびゅんびゅん飛び出してる。
自分にしかわからん造語をあたりまえみたいに書き散らすなボケ。

そりゃぁ破門したくもなるぜ。

493 名前:469 :03/02/06 22:28
>>492
はい、すみませんデムパ説明します
「デストラクタを途中で切る」
継承クラスで非仮想デストラクタを宣言する
「クラス階層以下で動的確保」
上(デストラクタを途中で切る)のクラスから継承されたクラスで
newなどの確保をする
「NULLデストラクタ」
NULL命令(これは造語ではありません)しかないデストラクタ


494 名前:デフォルトの名無しさん :03/02/06 22:28
頼むから469の相手をするのはやめてくれ。

495 名前:デフォルトの名無しさん :03/02/06 22:41
>>494
すまん。これで最後にさせてくれ。

>>493
 破 門 確 定 。
理由を聞かれても答えんからな。

496 名前:デフォルトの名無しさん :03/02/06 22:45
>>493
NULL命令?ぬるぽ?

497 名前:デフォルトの名無しさん :03/02/06 22:53
$ NULL
ぬるぽ!

498 名前:デフォルトの名無しさん :03/02/06 22:54
  ___   ガスッ
 |___ミ      ギビシッ
   .||  ヾ ミ 、      グシャッ
   ∩_∧/ヾヽ
   | ,| ゚∀゚). .|  |;,      ゲシッ
  / ⌒二⊃=|  |∵.
 .O   ノ %`ー‐'⊂⌒ヽ  ゴショッ>>493
   ) ) ) )~ ̄ ̄()__   )>>496
  ヽ,lヽ) (;;;;;;;;;;;;;;;;;)(_(>>497


499 名前::03/02/06 22:57
夢だ、夢だ、、

500 名前:デフォルトの名無しさん :03/02/06 23:01
ちんぷんかんぷん揚げ


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