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


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

C++相談室 part24
251 名前:デフォルトの名無しさん :03/10/22 21:33
>>250
>ヘッダでのメンバ変数の宣言順とコンストラクタでの初期化順
ここまではやらないと余計な事で混乱するハメになるよ

252 名前:デフォルトの名無しさん :03/10/22 21:35
そもそも
HP,MHP
MP,MMP
あたりの対応はテンプレートクラスにするべきだろう。


253 名前:デフォルトの名無しさん :03/10/22 21:35
入出力の対応をとれば良いだけだから、内部の宣言順は気にする必要なし。
ファイルのフォーマットが変わっても、入出力メソッドの書き換えだけで済む。


254 名前:デフォルトの名無しさん :03/10/22 21:39
template<typename T> class ValueHaveMax
{
private:
 T current_;
 T max_;
public:
 T getCurrent() const throw();
 T getMax() const throw();
 T setCurrent() throw(OutOfBoundsException);
 T setMax() throw();
 //(実装略)
};

255 名前:デフォルトの名無しさん :03/10/22 21:42
>>254
void setCurrent(T current) throw(OutOfBoundsException);
void setMax(T max) throw();

256 名前:デフォルトの名無しさん :03/10/22 21:56
Exceptinal C++ に Stack の Pop は例外安全にできないと書いてあったのですが、
参照を返すようにすれば大丈夫なんじゃないでしょうか。

257 名前:デフォルトの名無しさん :03/10/22 22:09
>>256
そいつの実体は、誰がどのようしてに押えておくんだ?

258 名前:デフォルトの名無しさん :03/10/22 22:13
>>257
Stack クラスの中のバッファでしょう。

259 名前:デフォルトの名無しさん :03/10/22 22:18
>>258
popしたのに、まだ残ってるのか?

260 名前:デフォルトの名無しさん :03/10/22 22:19
>>256
39ページの脚注とか読む気はございませんか?

261 名前:256 :03/10/22 22:21
>>260
その通りでした。すみません。

262 名前:デフォルトの名無しさん :03/10/22 22:40
250ではないが
>251
> >ヘッダでのメンバ変数の宣言順とコンストラクタでの初期化順
> ここまではやらないと余計な事で混乱するハメになるよ

ただの組み込み変数の初期化に神経質になるのもどうかと。
俺、数が多いときは割とコンストラクタ内部で下のように書くけど。
level = hp = mp = ... = 0;

263 名前:デフォルトの名無しさん :03/10/22 23:07
>>262
コンストラクタなら
Character::Character()
: level(1), hp(40), mp(10)
{
// 名前の登録とか?
}
でいいと思うのだが。勿論0でも使えるし。

264 名前:デフォルトの名無しさん :03/10/22 23:19
コンストラクタでマジックナンバーで与える初期値は0だろ
つーかデフォコンないメンバ入れるの?

265 名前:デフォルトの名無しさん :03/10/22 23:36
組み込み型はデフォルトコンストラクタは存在するが自動的には呼ばれないぞ、と。

266 名前:デフォルトの名無しさん :03/10/23 00:05
初期化がめんどいだけなら
inner structをメンバーにしてmemsetしちゃえばいいじゃん

267 名前:デフォルトの名無しさん :03/10/23 00:10
>memset
いたたた

268 名前:デフォルトの名無しさん :03/10/23 00:31
>>memset
>いたたた
いたたw

269 名前:デフォルトの名無しさん :03/10/23 00:33
memsetマンセー

270 名前:デフォルトの名無しさん :03/10/23 00:33
そういやvirtualがあるとまずいんだっけか

271 名前:デフォルトの名無しさん :03/10/23 00:35
inner structがPODなら大丈夫だろ

272 名前:デフォルトの名無しさん :03/10/23 00:36
>>270
はぁ?

273 名前:デフォルトの名無しさん :03/10/23 00:37
どうせ藻前裸は今PODを必死にぐぐってるんだろ。
レベルの低いスレだな。

274 名前:デフォルトの名無しさん :03/10/23 00:41
w

275 名前:デフォルトの名無しさん :03/10/23 00:43
Punipuni Oppai DQN

276 名前:266 :03/10/23 00:45
class A {
 struct {
  int data1;
  int data2;
  ...
 } data;
public:
 A() {
  memset(&data, 0, sizeof(data));
 }
};
こういう意図で書いたんだけど、そんなに変かい?
std::fillでも使えってこと?

277 名前:デフォルトの名無しさん :03/10/23 00:45
情報隠蔽も結構だけど、データクラスなら 221 の最初(二番目か?)の設計みたいなので
別段構わないと思うけど。。。

>>221 のコードの問題は、データクラスっぽいクラスに Character なんていうアクターっぽい
名前をつけてること。 class CharacterSpec とか class CharacterAttribute とかにすべき。

278 名前:デフォルトの名無しさん :03/10/23 00:48
>>276
変じゃない

279 名前:デフォルトの名無しさん :03/10/23 00:53
とりあえずmemsetしとけ

280 名前:デフォルトの名無しさん :03/10/23 00:57
>>267とか>>271
イタタタ

281 名前:デフォルトの名無しさん :03/10/23 01:04
↑結局PODが分からなかった香具師

282 名前:デフォルトの名無しさん :03/10/23 01:12
PODなんかで誇る方が正直恥ずかしい…

283 名前:デフォルトの名無しさん :03/10/23 01:13
それさえも分からない香具師はもっと恥ずかしい

284 名前:デフォルトの名無しさん :03/10/23 01:14
次スレ案
POD相談室 Part25

285 名前:デフォルトの名無しさん :03/10/23 01:16
せっかく禿がバスサイクルの問題に気がついてたのに

286 名前:デフォルトの名無しさん :03/10/23 01:18
うわぁ、自分の尺度だけでしか香具師ガイルな。

287 名前:デフォルトの名無しさん :03/10/23 01:19
C++厨の実力の知れるスレでつか?


288 名前:デフォルトの名無しさん :03/10/23 01:20
>>300取ったら香具師がPODについて説明する事

289 名前:デフォルトの名無しさん :03/10/23 01:22
>>280
確かに何をいまさらって感じではあるな

290 名前:デフォルトの名無しさん :03/10/23 01:24
このスレくだらね

291 名前:デフォルトの名無しさん :03/10/23 02:35
Perlでおなじみのドキュメンテーションのことだろ。

292 名前:デフォルトの名無しさん :03/10/23 07:42
ひとりでアプリつくってんのに
情報隠蔽も抽象化も糞もあるかっての。ぼけ。


293 名前:デフォルトの名無しさん :03/10/23 08:15
ひとりで作ってても十分利点はある。

294 名前:デフォルトの名無しさん :03/10/23 08:21
低脳にはそれがわからんのです

295 名前:デフォルトの名無しさん :03/10/23 08:31
俺なんかアドレス指定して書き換えちゃうもんねー。
もちろんアセンブラでプロセシ保護された空間をね。

296 名前:デフォルトの名無しさん :03/10/23 09:21
>>292
君みたいな低能は君だけじゃないから気にするな


297 名前:デフォルトの名無しさん :03/10/23 09:47
PODは、Modern C++ Designの49ページに書いてあるよ。


Cライクなstruct中にプリミティブ・データしか保持されていない場合、
つまり平凡な古いデータ(plain old data─以降、PODと略します)構造


だとさ。これ以外でPODって記述は見たことないから、
ぐぐっても見つけるのはつらいと思う。

298 名前:デフォルトの名無しさん :03/10/23 09:50
POD C++ でおよその意味がわかるページは見つかりましたが。

299 名前:デフォルトの名無しさん :03/10/23 09:51
PODでも整数型しかない場合以外はmemsetなんかで初期化するな。

300 名前:デフォルトの名無しさん :03/10/23 09:52
>>297
ISOも読んだ事無いのかよ

301 名前:デフォルトの名無しさん :03/10/23 09:52
>>299
PODの事分かってないだろ(プゲラッ

302 名前:デフォルトの名無しさん :03/10/23 09:55
>>301
浮動小数点型が入っていたらPODじゃないの?

303 名前:デフォルトの名無しさん :03/10/23 09:57
浮動小数点"数"型か。どうでもいいけど。

304 名前:デフォルトの名無しさん :03/10/23 09:58
>>302
浮動小数点の事分かってないだろ(プゲラッチョ

305 名前:デフォルトの名無しさん :03/10/23 09:59
>>304
もしかして全ビット0が0.0になると保証されていると思っているの?C++で。

306 名前:デフォルトの名無しさん :03/10/23 10:00
>>305
指数部とか仮数部とか分かるか?(ワラ

307 名前:デフォルトの名無しさん :03/10/23 10:03
little endianだろうがbig endianだろうが全ビット0の浮動小数点数は0だろ。

308 名前:デフォルトの名無しさん :03/10/23 10:04
>305
え、memsetって全bitを0にするんじゃないの?
(それが0.0を表すかはともかく)

309 名前:デフォルトの名無しさん :03/10/23 10:05
>>306
CのFAQだが、http://www.catnet.ne.jp/~kouno/c_faq/c7.htmlの7.31

310 名前:デフォルトの名無しさん :03/10/23 10:06
>>308
全ビットを0にするだけだからこそ、浮動小数点型に使って0.0になることを期待してはいけない。

311 名前:デフォルトの名無しさん :03/10/23 10:07
>>309
それCのFAQだろ。C++だとポインタにしてもちゃんと0で埋めればぬるぽが入るだろ。

312 名前:デフォルトの名無しさん :03/10/23 10:08
カ゚ッ

313 名前:デフォルトの名無しさん :03/10/23 10:09
本物はあまりの恥ずかしさに逃げますた

314 名前:デフォルトの名無しさん :03/10/23 10:11
>>313
本物ってなに?

315 名前:デフォルトの名無しさん :03/10/23 10:11
>>311
本当に?

316 名前:デフォルトの名無しさん :03/10/23 10:12
つーか、この中でついさっきまでDelスレで煽ってた香具師何人かいるだろ?

317 名前:デフォルトの名無しさん :03/10/23 14:06
浮動少数のフォーマットはIEEE754だけじゃないぞ
0を代入すれば0.0になることは保証されているけど
0-fillしても0になることは保証されていない

実質外がないといえばそのとおりだが

318 名前:デフォルトの名無しさん :03/10/23 17:21
整数は0で埋めると0になる保証あったっけ?

319 名前:デフォルトの名無しさん :03/10/23 17:22
整数の0で埋めれば0になるだろ


320 名前:デフォルトの名無しさん :03/10/23 17:31
memset相当だから
int a;//とか
for( int i = 0; i<sizeof( a ); ++i )
reinterpret_cast< char* >(&a)[i] = 0;
この場合。

321 名前:デフォルトの名無しさん :03/10/23 17:50
memsetって1バイト毎に埋めるから遅くない?
DWORDとかで回すmemset無い?

322 名前:デフォルトの名無しさん :03/10/23 18:53
>321
とりあえず手元のWindowsXP/VisualC++2003の環境だと
WindowsAPI(もしかするとマクロか?)のCopyMemoryが
32bitで回してくれてるみたいよ。
まあ、逆汗して確認しただけなんで
どの環境でもそう展開されるかどうかは知らないけど。

323 名前:322 :03/10/23 18:55
マチガタ。コピーじゃなくて0初期化か…スマソ。
でも類似品に ZeroMemory() とかあるんでこれでどーかな。
確認してないけど。

324 名前:デフォルトの名無しさん :03/10/23 19:54
>>322-323
ZeroMemoryもCopyMemoryもmemset呼んでるだけだバカ。

325 名前:321 :03/10/23 19:55
VC7はサイズがn*sizeof(int)とかで、intとかのポインタ渡すと
rep stosdで回してくれるっぽいですね。
何か勘違いしてました。

326 名前:デフォルトの名無しさん :03/10/23 19:55
あとmemsetが遅いのも嘘。
http://www-6.ibm.com/jp/developerworks/linux/010824/j_l-rt2.html

327 名前:デフォルトの名無しさん :03/10/23 19:57
というかそういう古くさい話はC++スレでやってくれません事?

328 名前:デフォルトの名無しさん :03/10/23 19:58
C++スレ->Cスレ

329 名前:デフォルトの名無しさん :03/10/23 20:35
>>327
ここがC++スレだが。

330 名前:329 :03/10/23 20:36
328は修正だったのか(鬱

331 名前:デフォルトの名無しさん :03/10/23 21:00
お前らC++スレに行けってさ

332 名前:デフォルトの名無しさん :03/10/23 21:01
どなたか教えてください
class person{
int no;
string name;
int age;
}
見たいなクラスがあるとして、それをlistに積んでいます。
このうち指定されたnoを検索するようなプログラムを組んでいますが

list<person> plist;
list<person>::iterator i;

for (i=plist.begin(); i!=plist.end; i++){
if (plist.getno()==N)
return i
}
みたいなのしか思いつきません。
もっと効率的な検索方法を探しています。
ネットで調べてみるとmapやsetを使うと検索が早いようなことを見かけますが、
そこにある例題だと単純なinttとかばかりで、このような場合どうやれば良いのかいまいちわかりません。
どなたか教えてくださ

333 名前:デフォルトの名無しさん :03/10/23 21:03
>>327のような薄っぺらなガキ見てると気が滅入ってくる
何というか育て甲斐がなくてコレがずーんとやる気にひびくんだよ

334 名前:デフォルトの名無しさん :03/10/23 21:08
>>332
struct PersonNoComparetor
{
 operator()(const person& a, const person& b) const { return a.getNo() > b.getNo(); }
};
typedef set<person, PersonNoComparetor> PersonSet;
PersonSet personSet;
PersonSet::iterator it;
it = personMap.find(N);

335 名前:デフォルトの名無しさん :03/10/23 21:08
×it = personMap.find(N);
○it = personSet.find(N);

336 名前:デフォルトの名無しさん :03/10/23 21:13
>>334
× Comparetor
○ Comparator

337 名前:デフォルトの名無しさん :03/10/23 21:47
>>317
> 浮動少数のフォーマットはIEEE754だけじゃないぞ
とはいえ IEEE754 じゃないアーキテクチャを相手にすることを想定する必要があるかは、
書いてるプログラム次第だよな。俺の仕事だと IEEE754 以外は考えてない。

だいたい IEEE754 前提にしないと演算精度とかも変わってくる可能性があるわけで
(非正規化数が無いかもしれない)、やるならそこまで対応しないと意味ないし。

338 名前:デフォルトの名無しさん :03/10/23 22:12
>>337
まあ、曲がりなりにもC++スレなんだからスケーラブルに逝くべきじゃない
ほんの少しのオブジェクト初期化コストを惜しんで
memsetするくらいなら組み込みコンストラクタに任せたりゼロを代入するべきだと思うな。
初期化コストが大きくてどうしようもないなら、必要になる前にプールすればいいんだから

339 名前:デフォルトの名無しさん :03/10/23 22:27
浮動小数点って時点でどうあがいても近似値でしかない

340 名前:デフォルトの名無しさん :03/10/23 22:34
>>332

332です
ありがとうございます
私のレベルでは難しくて、いまいち良く分からないのですが解析してみます。

341 名前:デフォルトの名無しさん :03/10/23 22:34
>>339
アフォですか? そんなことは問題にしていないのだが。

342 名前:デフォルトの名無しさん :03/10/23 22:47
じゃIEEE754でないことの何が問題なんだ?

343 名前:デフォルトの名無しさん :03/10/23 22:50
このスレでわかったこと
どうでもいい事でもめるから会議は長いんだな〜と思った。

344 名前:デフォルトの名無しさん :03/10/23 22:55
>>342
memsetで0フィルしたときに値が0.0である保証が無いかもしれないって話だった気がするが

345 名前:デフォルトの名無しさん :03/10/23 23:01
で結局IEEE754じゃないアーキテクチャは相手にする必要はあるのか、ないのか?
どっかのバカタレがIEEE754以外を考えていないことや精度が一致しないことを公に必要はあるのか、ないのか?
「そこまで対応」する方法がちゃんと用意されているのに、なぜmemsetなんだ?

346 名前:デフォルトの名無しさん :03/10/23 23:06
クスクス

347 名前:デフォルトの名無しさん :03/10/23 23:07
「そこまで対応しなきゃいけないソース」はmemset使っちゃ駄目
「使われる環境がわかっているソース」はmemset使った方が楽

348 名前:デフォルトの名無しさん :03/10/23 23:18
自分で作ったヘッダファイルがインクルードできない・・・。

349 名前:デフォルトの名無しさん :03/10/23 23:21
ほほー。

350 名前:デフォルトの名無しさん :03/10/23 23:32
何で〜
わからーん。
開くことができないっていわれるのよ。
ただのmapコンテナのクラスをつくっただけなのにさ。
はじめたばっかだからよくわかんないよ

351 名前:デフォルトの名無しさん :03/10/23 23:33
>>345
IEEE754と精度の話ってどこから出てきたんだ?


352 名前:デフォルトの名無しさん :03/10/23 23:33
もひかひて8.3とか?

353 名前:デフォルトの名無しさん :03/10/23 23:34
日本語のフォルダ名orファイル名とか?

354 名前:デフォルトの名無しさん :03/10/23 23:40
空笑を呈している患者がいるな

355 名前:デフォルトの名無しさん :03/10/23 23:43
折角コンパイラがデバッグしやすいように固定の初期値を入れてくれるオプションがあったりするのに、
わざわざ自分でmemset()でクリアしてしまってデバッグを困難にするのは理解できない。

ま、「そこに構造があるから取り敢えずmemset()」なんて香具師とはどっちみち話が合わないこと夥しいのだが。

356 名前:デフォルトの名無しさん :03/10/23 23:44
>>355
 それはVC++だけの話じゃないか?


357 名前:デフォルトの名無しさん :03/10/23 23:45
>>355
藻前はコンストラクタで初期化しないんですか?

358 名前:デフォルトの名無しさん :03/10/23 23:55
そうか、どうも変だと思ったら
コンストラクタで初期化しない人だったのか。

そもそも始まりは(配列ではない)メンバーをまとめて初期化したいって話だったのに

359 名前:デフォルトの名無しさん :03/10/23 23:57
しかも「IEEE754以外の場合は」とか言いながら
特定の処理系のコンパイルオプションまで持ち出して。

360 名前:デフォルトの名無しさん :03/10/24 00:07
最近はコンパイルオプションもIEEEで標準化されつつある


と言ってみる

361 名前:デフォルトの名無しさん :03/10/24 00:13
なんかこのスレ、ネチネチしてるね

362 名前:デフォルトの名無しさん :03/10/24 00:13
日本のC++コミュニティはどこもネチっこいよ

363 名前:デフォルトの名無しさん :03/10/24 00:14
まあここはレベル低いしな。

364 名前:デフォルトの名無しさん :03/10/24 00:14
レベル高い日本のC++コミュニティはどこですか?

365 名前:デフォルトの名無しさん :03/10/24 00:15
cppll以外で

366 名前:デフォルトの名無しさん :03/10/24 00:16
cppllの話題に付いていけないからって妬むなよ

367 名前:デフォルトの名無しさん :03/10/24 00:20
>>366
このへんがネチネチしてるね

368 名前:デフォルトの名無しさん :03/10/24 00:22
あーあ

369 名前:デフォルトの名無しさん :03/10/24 01:45
いつまでもしつこくネチネチとか言うな

370 名前:デフォルトの名無しさん :03/10/24 02:03
アイーン対応

371 名前:デフォルトの名無しさん :03/10/24 02:04
あいーん754対応しますた!

372 名前:デフォルトの名無しさん :03/10/24 03:27
やった!ついにアイーン対応だ!!

質問お願いします。下のを通す正当な手段はないのでしょうか。
class B{
public:
    B& operator=(const B& rhs){}
};

class D : private B {
};

int main(int argc, char* argv[]){
    B b;
    D d;
    b = d; //コンパイルエラー 変換は存在するがアクセス不能
    return 0;
}

373 名前:デフォルトの名無しさん :03/10/24 03:38
public継承に汁

374 名前:デフォルトの名無しさん :03/10/24 03:42
>>373
レスサンクスです。すいません、それ以外でひとつ…。

375 名前:372=374 :03/10/24 03:45
いや、なんかこう眺めてたら抜け道ある気がしちゃいまして。
(キャストではなく、「基底クラスで〜があればいける!」みたいな)

やっぱり無理ですよねぇ。お騒がせ失礼、寝まする、アイーン

376 名前:デフォルトの名無しさん :03/10/24 03:46
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
のcap26.cppのプログラム実行結果をテキストに保存するプログラムをください。
どこに実行結果の数値をテキストに書き込む処理を入れれば、
いいのでしょうか?




377 名前:デフォルトの名無しさん :03/10/24 04:41
staticで確保したメンバ変数(正確にはSingletonです)の
デストラクタが、デバッガで見ていても一向に呼ばれた気配がなくて不安です。
こういうものなのでしょうか?

378 名前:377 :03/10/24 04:44
すいません、トンチンカンなこと訊いてました。
そりゃ自分で呼ばなければですよね・・・。

379 名前:デフォルトの名無しさん :03/10/24 05:07
>>374
protected継承に汁
つーか、private継承なんて使わんぞ

380 名前:デフォルトの名無しさん :03/10/24 05:16
>>372
もう寝ちゃったみたいだけど、usingを使えば出来るんじゃないかな。

381 名前:デフォルトの名無しさん :03/10/24 08:13
b = d;

b = (B const &) d;
と書くとかって話か?


382 名前:デフォルトの名無しさん :03/10/24 08:19
>>372
class D;
class B{
public:
B&operator=(const B&){return*this;}
B&operator=(const D&);
};
class D:private B{};
inline B&B::operator=(D const&d){return operator=((B const&)d);}
int main(int argc,char*argv[]){
B b;D d;
b=d;
return 0;
}


383 名前:デフォルトの名無しさん :03/10/24 09:40
>>382
いやそれ、コンパイラは通してくれるだろうけど、C++プログラマの倫理観としては、ナシだろ?
って、それは372に言うべきか。

384 名前:デフォルトの名無しさん :03/10/24 15:20
class B{
public:
    B& operator=(const B& rhs){return *this;}
};

class D : private B {
    inline friend int main(int argc, char* argv[]){
        B b;
        D d;
        b = d;
        return 0;
    }
};


mainをクラス内に書くのは妙な気分だね。

385 名前:デフォルトの名無しさん :03/10/24 15:21
Javerですもの。

386 名前:デフォルトの名無しさん :03/10/24 15:23
>>385
 Javaerでもstatic void mainになるで、ちょっとおかしくない?

387 名前:デフォルトの名無しさん :03/10/24 15:24
>>386
Javerは細かいことは気にしないのさ☆

388 名前:デフォルトの名無しさん :03/10/24 15:24
そういえばJavaはvoid main()なんだね。
C/C++はint main()なのに。

389 名前:デフォルトの名無しさん :03/10/24 15:25
>>388
Javaで世界が完結してるからリターンコードなんてたいしたことないのさ

390 名前:デフォルトの名無しさん :03/10/24 19:13
>>384
さすが、friend最凶伝説。気持ちワル〜

391 名前:デフォルトの名無しさん :03/10/24 23:19
>>383
private継承しておきながら
型変換の明示 (>>381のようなもの) を行なわず
暗黙の型変換を利用しようとしてる時点で倫理は消えているので
382でも無罪


392 名前:372 :03/10/25 01:22
ウホッ、情報イパーイ。コードの読み応え満点。
皆さんレスありがとうございました。

正当な手段があるわけない事がよく分かったので、protected継承にしておきつつ、
Javarの漢気を胸に刻んだり、小粋なテクニークを後世に伝えたりしながら生きて逝きます。感謝感激。

393 名前:デフォルトの名無しさん :03/10/25 15:51
ISO/IEC 14882:2003が出たと少し前cppllで騒いでいたけど何なのよそれ。

394 名前:デフォルトの名無しさん :03/10/25 16:46
#define と enum ってどう違うんですか?

#define NONE 0
#define SPADES 1
#define HEARTS 2
#define DIAMS 3
#define CLUBS 4
も、
enum hoge {NONE = 0,SPADES,HEARTS,DIAMS,CLUBS}
も同じに見えるんですが。
#defineじゃなくてenumじゃないといけない例とかplz

395 名前:デフォルトの名無しさん :03/10/25 16:57

#define NUM 10

struct A{
int NUM;
};

どうなるよ

396 名前:デフォルトの名無しさん :03/10/25 16:57
VCだと名前で出るので便利
defineだと数字だけで(+д+)マズー

397 名前:デフォルトの名無しさん :03/10/25 17:04
C++で定数値のためにを#defineを
使う利点ってあるのかなあ?

398 名前:デフォルトの名無しさん :03/10/25 17:11
>>397
あんまり変らないと思うが。
 コンパイラで処理するかプリプロセッサで処理するかの
 好みの問題じゃない。


399 名前:デフォルトの名無しさん :03/10/25 17:17
そうじゃないよ。

400 名前:デフォルトの名無しさん :03/10/25 17:20
>>398 は知能の低さを露呈してしまいました。


401 名前:398 :03/10/25 17:20
まあたしかに#defineじゃデバック情報はのこらないな。

402 名前:デフォルトの名無しさん :03/10/25 17:21
>>398
395,396が指摘しているように
名前空間無視やデバッガのシンボルテーブルに
載らない点だけでも問題だと思うが。

403 名前:398 :03/10/25 17:22
>>400
なさけない、あと1分早ければねぇ。

404 名前:デフォルトの名無しさん :03/10/25 17:25
>>393
(ノ・ω・)ノ お前は cppll へ帰れー
(ノ・ω・)ノ cppll へ帰れー
(ノ・ω・)ノ 帰れー

405 名前:デフォルトの名無しさん :03/10/25 17:25
C++でdefine定数値を使う奴は低脳だと、かなり前に結論付けられているはずだが?

406 名前:デフォルトの名無しさん :03/10/25 17:33
#defineは条件付きコンパイルをするうえで必須だと思うが。

407 名前:デフォルトの名無しさん :03/10/25 17:38
>>406
それは >>394 の例とはズレてるような。正確には

 整数型の const 定数の代わりに #define 使うヤツはバカ

かね。浮動小数点は template 実引数として渡せなかったり、クラススコープのメンバとして
インライン定義できなかったりと、扱い微妙だが。

408 名前:デフォルトの名無しさん :03/10/25 17:38
>>406
はぁ?オマエの頭ではdefine全否定っていう流れになってんの?馬鹿か?

409 名前:デフォルトの名無しさん :03/10/25 17:40
>>408
明らかなバカは放っておこうよ

410 名前:デフォルトの名無しさん :03/10/25 17:41
>>408
>>405が全否定しているから。

411 名前:デフォルトの名無しさん :03/10/25 17:42
ところでVC++7.1とか使ってる人はみんな
class A{
 static const int PI = 3.15;
};
って感じですか。6.0な俺はできないわけですが。

412 名前:デフォルトの名無しさん :03/10/25 17:44
>>410
おまえは会話の流れを読まないから私生活でも浮いてるんだヽ(`Д´)ノ!

413 名前:デフォルトの名無しさん :03/10/25 17:52
enumの利点
・定数を増やしたときにナンバリングしなおさなくていい
・enumからintへのcastは安全だがintからenumのcastは危険なので
 範囲チェックを省略できる(危険なキャストをする馬鹿がいないと仮定してだけど)

例:
enum TYPE {
 TYPE_A = 0,
 TYPE_B,
 TYPE_C,
 TYPE_D,
};

void SampleFunc(TYPE type) {
 switch (type) {
  TYPE_A:
   :
   :
  default:
   // この関数が別のプログラマに呼ばれても
   // ここにくることはないハズ
   // (まあ強引に整数型からキャストする馬鹿が居ればその限りじゃないが
 }
}

また、TYPE_B2が増えても、C、Dを手でナンバリングしなおす必要がない。

414 名前:デフォルトの名無しさん :03/10/25 18:02
外部データに出力した場合、
明示的にナンバリングする必要が出る可能性もあるわけだが

415 名前:デフォルトの名無しさん :03/10/25 18:05
>>410
>>405
>define「定数値」
と言っている。

>>413
>・enumからintへのcastは安全だがintからenumのcastは危険なので
nを最大の列挙子の値として
2^([log2 n]+1)-1 (^は累乗記号;[]はガウス記号)
以内の整数は安全にキャストできるからそうとも言えぬかと。

416 名前:デフォルトの名無しさん :03/10/25 18:32
>>394
えーと、まあ。enumは型を形成するのに対して
#defineは単純な文字置換でしかない、というのが大きな違いだろうと思う。
確かに単に定数値を抽象化するだけの目的なら
「#defineではなくenum(もしくはconst整数型)でないとなにがどうあっても絶対ダメ」
ということは多分ないだろうが、コンパイラのチェックを受けられるかどうかとか
型として使えるかどうかの違いはそれなりに大きいのではないかな。

ちなみに定数値を抽象化する目的でないなら
「#defineじゃなくてenumじゃないといけない例」は
たとえばテンプレートあたり使ってるとででてきたと思う。

417 名前:デフォルトの名無しさん :03/10/25 18:34
> nを最大の列挙子の値として〜以内の整数は安全にキャストできる
でたらめかな?

418 名前:デフォルトの名無しさん :03/10/25 18:40
>>417
手元の入門書によると

> 整数型を列挙型に明示的にキャストするのは危険です。
> 整数型の値が列挙型の範囲を超える場合、または、
> 列挙型の要素の値が重複している場合のキャスト結果は
> 保証されません。

とのこと。
要するに重複してなくて範囲を超えない場合は安全なのかね?

419 名前:デフォルトの名無しさん :03/10/25 18:41
> ISO/IEC 14882:2003
〜:1998 の改訂版。
変更はtypo修正と曖昧な文章の明確化のみで、
新たな言語仕様の追加・変更はなし。

余談だが、JIS規格のC++は〜:2003の方を訳したものになる。

420 名前:デフォルトの名無しさん :03/10/25 18:57
定数が常にintだとは限らないんだがな


421 名前:デフォルトの名無しさん :03/10/25 18:57
>>420
それがどうした。

422 名前:デフォルトの名無しさん :03/10/25 19:00
定数で有名なものといえば
光の速さ
自然対数の底
円周率


423 名前:デフォルトの名無しさん :03/10/25 19:17
enumとconstの話に

 ス コ ー プ が 出 て こ な い

このスレはアフォばかり

424 名前:デフォルトの名無しさん :03/10/25 19:24
>>423
どちらもクラスやネームスペース内で定義する事は可能だけど。enum も const
(暗黙のウチに static) 変数と同様にファイルローカルにしたければ、anonymous
namespace 内で定義すれば良いだけ。

そういう話じゃなくて、何かあるの?

const 変数と enum の最大の違いは

o const 変数は signed/unsigned など、複数の型を使える
o const 変数は定義と宣言を分離できる。enum は宣言 = 定義。

っつー点だと思われ。

425 名前:デフォルトの名無しさん :03/10/25 19:29
>>424
なぜ「int/doubleなど」ではなく「signed/unsignedなど」なんだろう

426 名前:デフォルトの名無しさん :03/10/25 19:36
器の小さい人間はsigned/unsignedといった小さな違いに目を奪われて
もっと大きな違いなんか思いもつかないものだ


427 名前:デフォルトの名無しさん :03/10/25 19:37
> const 変数と enum の最大の違いは
最大の違いっていったら、enumが独自の型を形成する点だろ。

428 名前:デフォルトの名無しさん :03/10/25 19:38
なんでこんな馬鹿ばっかりなんですか?

429 名前:デフォルトの名無しさん :03/10/25 19:40
>>428
お前というとんでもない馬鹿がいるから他は見劣りするな。

430 名前:デフォルトの名無しさん :03/10/25 19:42
>o const 変数は定義と宣言を分離できる。enum は宣言 = 定義。
定義と宣言を分離すると定数式じゃ使えなくなるがな。

431 名前:デフォルトの名無しさん :03/10/25 20:00
>>424
#define との違いの話をしてるんじゃなかったのか。

432 名前:デフォルトの名無しさん :03/10/25 20:15
>>430
ヘッダーに
extern double const PI;
と宣言を記述して
どこかのファイルに
double const PI = 3.14;
と定義を書くような方法も不可能ではない


433 名前:デフォルトの名無しさん :03/10/25 20:17
>>432
配列の大きさとかじゃねーの?

434 名前:デフォルトの名無しさん :03/10/25 20:18
>>427
そういや、以前

 enum XXX_FLAG { X_READ, X_WRITE };
 int func(XXX_FLAG flag);
 ...
 func(X_READ | X_WRITE);

と書いてハマった経験がある。

435 名前:デフォルトの名無しさん :03/10/25 20:54
>>433
C時代の時代遅れな老人じゃあるまいし
vectorとかlist使え


436 名前:デフォルトの名無しさん :03/10/25 21:07
>>435
それは言い過ぎ。

プログラムの内容によっては、固定長でバイト列を取りたい場合もある。
ぺりふぇらるとの通信用バッファとかさ。

437 名前:デフォルトの名無しさん :03/10/25 21:40
リンカの仕事とコンパイラの仕事の区別が付かないお馬鹿さんばかりだね。
ここは。

438 名前:デフォルトの名無しさん :03/10/25 21:42
>>436
>>435はたぶんreserveしてそこに無理やり書き込ませるんだろ
c_strで得たバッファのconstをためらいもなくはずす人種だ

439 名前:デフォルトの名無しさん :03/10/25 21:46
>>432
> extern double const PI;
> と宣言を記述して

これは、定数値の宣言じゃないよ。
変更できない「変数」の宣言だよ。

extern double volatile const PI;

なんて宣言もできるんだからさ。

440 名前:デフォルトの名無しさん :03/10/25 21:50
浮動少数点数がコンパイル時定数である必要性はあるのか?

いや無い。つまり変更できない変数で十分。

441 名前:デフォルトの名無しさん :03/10/25 22:57
immediateの意味で定数という言葉を使っている人と
constantの意味で定数という言葉を使っている人がいるようだ


442 名前:デフォルトの名無しさん :03/10/25 23:04

// hoge.h
class Choge
{
private:
static const int T = 100;
int m_a[T];
};

ってのも書けるようになったの?
今使ってるコンパイラ、捨てようかな。


443 名前:デフォルトの名無しさん :03/10/26 00:02
>>442
当然のように書けるよ。

444 名前:442 :03/10/26 00:15
>>443
ありがとう! 捨てます。


445 名前:デフォルトの名無しさん :03/10/26 00:22
>>442
具体的になにを捨てるの?

446 名前:422 :03/10/26 00:42

http://www.geocities.co.jp/Milano-Cat/1568/throw.swf?b64=VkMrKzYuMILwDZGLgqmC5w%3D%3D%0Dk4qCsI7MgsSC6w%3D%3D%0DhKGEn4SfhKINhKBWQzaEoA2EoIFAgUCBQISgDYSgTVOBQISgDYSkhJ%2BEn4Sj



447 名前:デフォルトの名無しさん :03/10/26 03:38
>>446
http://www.geocities.co.jp/Milano-Cat/1568/i575.swf?b64=jsyCxILIgqKCxQpjbC5leGWC8AqO5oLokdaCpoLr

448 名前:デフォルトの名無しさん :03/10/26 05:23
>>447
Intelのものに?

449 名前:デフォルトの名無しさん :03/10/26 12:52
>>411
そんなあなたにBOOST_STATIC_CONSTANT

#include <boost/config.hpp>

class A{
BOOST_STATIC_CONSTANT(int, PI = 3);
};


450 名前:デフォルトの名無しさん :03/10/26 13:00
むしろboost使うならVC7.1が欲しい

451 名前:デフォルトの名無しさん :03/10/26 13:27
VC++使ってるなら最新のコンパイラ買えよ。
GCC使ってるなら、3.4のパーサのデバッグしろよ。

452 名前:デフォルトの名無しさん :03/10/26 14:06
ほんと、買えるものならVC++7.1Proだけで買いたいよ

453 名前:デフォルトの名無しさん :03/10/26 14:51
VC++使わずGCC使え

454 名前:デフォルトの名無しさん :03/10/26 14:53
だってGCCはBoost100%じゃないんだもん。

455 名前:デフォルトの名無しさん :03/10/26 15:23
Boostの犬かい

456 名前:デフォルトの名無しさん :03/10/26 15:31
Web上で見かけたんだけど

class parent{
public:
virtual void func( void ){ cout << "parent\n"; }
};

class child: public parent{
public:
virtual void func( void ){ cout << "child\n"; }
};

void main()
{
child a;
parent b;
parent &c = ( true ) ? a : b;
parent &d = a;
c.func();
d.func();
}

結果
parent
child

はVC++6.0のバグ?

457 名前:デフォルトの名無しさん :03/10/26 15:49
>>456
VC++6.0でこれだとどうなるの?

#include <iostream>
class parent{
int x;
public:
parent(int i):x(i){}
virtual void func(void){cout<<"parent "<<x<<"\n";}
};
class child:public parent{
public:
child(int i):parent(i){}
virtual void func(void){cout<<"child "<<x<<"\n";}
};
int main()
{
child a(1);
parent b(2);
parent&c=(true)?a:b;
parent&d=a;
c.func();
d.func();
}


458 名前:デフォルトの名無しさん :03/10/26 15:53
いい加減VC++6.0は捨てろ。それにスレ違い。

459 名前:デフォルトの名無しさん :03/10/26 15:55
スレ違いではありませんので458を無視してください

460 名前:デフォルトの名無しさん :03/10/26 16:00
BCCでもそうだった。なんでなんで?

461 名前:デフォルトの名無しさん :03/10/26 16:09
virtual関数の実装が別コンパイル単位(ファイル)だったら起きない問題か。
クラス宣言内に実装があるので、可能ならインライン展開しようとするから
そんときのクラスの選択がバグってると。
さすがに >>457 の数字はちゃんと正しく(共に1が)出るんじゃないか。

VC6持ってる人検証キボン

462 名前:デフォルトの名無しさん :03/10/26 16:13
参照だからじゃない


463 名前:デフォルトの名無しさん :03/10/26 16:23
>>462
参照じゃなかったら文法違反だと思はれ。

464 名前:デフォルトの名無しさん :03/10/26 16:26
>>461
俺もinline化に関わるバグと思う


465 名前:デフォルトの名無しさん :03/10/26 16:33
vc6でやったよ。
xはprivateだからコンパイル通らんよ。
publicにしてさらに
//parent&c=(true)?a:b;
parent&c=a;
にしたら直ったよ。

466 名前:デフォルトの名無しさん :03/10/26 16:34
安心したければGCC使えということで

467 名前:デフォルトの名無しさん :03/10/26 16:45
GCCかよ(笑

468 名前:デフォルトの名無しさん :03/10/26 17:09
VC++6なんていう、ANSIC++以前のコンパイラが
ANSIC++に対応してないっていう話はいい加減やめれ。
そんなの当たり前もいいところ。
それを鬼の首でもとったかのように喜んでるのはただの知的障害者。

469 名前:デフォルトの名無しさん :03/10/26 17:23
>>468
規格制定前にその規格を満たす実装は存在していないという妄想の例


470 名前:456 :03/10/26 17:30
>457
> VC++6.0でこれだとどうなるの?
parent 1
child 1
三項演算子は正しくaを返してます。

>461
念のため関数定義を別のファイルにまで持っていきましたが再現したので
inlineは関係無いと思います


いろいろ試してみた結果、三項の部分は、どうも
parent &c = parent(( true ) ? a : b);
こんな風に解釈されているっぽいです。


ちなみに参照をポインタに変えたら、当然?期待通りに動いてくれます。

471 名前:デフォルトの名無しさん :03/10/26 17:32
>>470
コンストラクターの呼出し回数を数えてみるといいかも

472 名前:471 :03/10/26 17:33
あ、その場合は
コピーコンストラクターを明示的に定義して
その中でカウントするなり、coutに向かって何かを書くなり


473 名前:デフォルトの名無しさん :03/10/26 17:34
ANSIC++はある日突然現われたのではなく長い年月の議論の末に生まれているから
ANSIC++が確定する以前であってもANSIC++の概要を知ることは可能。
ANSIC++が確定する以前に作られたVC++6が
ANSIC++に書かれてあることの全てに対応できていなくても部分的に対応できていれば、
どこまで対応できているのかについての議論は今でも意味がある。
その議論そのものの存在意義を否定することができるのは
VC++6がANSIC++に書かれてあること全てに対応していない
ということが明確である場合だけとなる。

>>468
てことでVC++6はANSIC++に書かれてあること全てに対応していない
と言いたいということでよろしいか?


474 名前:デフォルトの名無しさん :03/10/26 17:40
そんな古いコンパイラの話せずにおとなしくBoost100%のVC++7.1を使えばいいよ

475 名前:デフォルトの名無しさん :03/10/26 17:45
>>463
ポインターってこと
parent* c = ( true ) ? &a : &b;

476 名前:デフォルトの名無しさん :03/10/26 17:50
>>470
ということは、ポインタでなく値が式の結果となる三項演算子は
両者の型が違うときは共通化できる型に変換し、変換されるほうは
一時オブジェクトを生成して返してるってことになるのか。

477 名前:デフォルトの名無しさん :03/10/26 17:51
VC++7.1 を使いたいのは山々なんだけど、いろいろなしがらみから現実には
まだまだ VC++6 をつかわにゃならんケースが多いんだろ。
実際問題、今現在でも VC++6 がもっとも使われている C++ コンパイラなんじゃないの?

478 名前:デフォルトの名無しさん :03/10/26 17:54
>>477
そんな統計あるならソース出せ


479 名前:デフォルトの名無しさん :03/10/26 17:57
>>477
 winだけならな

480 名前:デフォルトの名無しさん :03/10/26 18:00
>>474
いっとくけどvc7.1も>>456のもんだい解決できないぜ


481 名前:デフォルトの名無しさん :03/10/26 18:11
VC++はまずいよ。
こういうコンパイラーのおかしな動きで
システムに障害が出て
損害賠償請求されたらたまったもんじゃない。


482 名前:デフォルトの名無しさん :03/10/26 18:13
>>481
納める前に動作確認するだろ。

483 名前:デフォルトの名無しさん :03/10/26 18:14
>>482
馬具が必ず再現できるとは限らないよな
テスト至上主義には分からんか


484 名前:デフォルトの名無しさん :03/10/26 18:16
>>483
まあそうだが、
コンパイラは規格に合致していることを契約しているわけではないので
従っていないことを理由に文句を付けることはできないよな。
コンパイラを選んだ時点で、現状のそのコンパイラの挙動に合わせて作る
しかない。
挙動を確認せずに間違って使ったほうが悪いんでは?

485 名前:デフォルトの名無しさん :03/10/26 18:17
>>483
開発者の怠慢ですね

486 名前:463 :03/10/26 18:17
child a;
parent b = a;
が通ったんだけど・・・

もしかして漏れとんでもない勘違いしてる?

487 名前:デフォルトの名無しさん :03/10/26 18:17
その前にポリモーフィズムと言ったら普通ポインターでは

488 名前:デフォルトの名無しさん :03/10/26 18:17
virtual関数周りの動作は実際に動いてみるまで分からないから怖い。
>>456のようなバグも
そのバグが発生しても日常的には問題がなくて気付かず、
珍しい条件が揃ってから初めて症状が出てくるようなシステムだと
動作確認で問題を見付けられないだろうな。


489 名前:デフォルトの名無しさん :03/10/26 18:18
>>486
勉強し直し

490 名前:デフォルトの名無しさん :03/10/26 18:19
>>484
一般的に、コンパイラーを選ぶのも開発側の責任に含まれることが多いから、
コンパイラーのバグが原因であっても、そうでなくても、
すべてひっくるめて動作の不具合は開発側の責任になって
開発側の負担にて修正することになる。
契約によっては損害賠償もあるだろう。


491 名前:デフォルトの名無しさん :03/10/26 18:21
>>490
人命に関わるバグだったりすると・・・ね

492 名前:デフォルトの名無しさん :03/10/26 18:21
Windows上のシステムだと
コンパイラーの不具合でシステムが挙動不審になる確率より、
先にOSが勝手に落ちてくれる確率が高いから気にしない文化あり。

Windows以外の環境だと
VC++の選択はありえないのでこれまた問題ない。


493 名前:デフォルトの名無しさん :03/10/26 18:24
>>492
別に開発環境のバグで起きたことについての損害賠償云々ってのはWindowsに限ったことではないんだが。

494 名前:デフォルトの名無しさん :03/10/26 18:29
結局>>456のサンプルはVC++6でも7.1でも駄目なのか?


495 名前:デフォルトの名無しさん :03/10/26 18:30
>>494
自分で試せ

496 名前:デフォルトの名無しさん :03/10/26 18:33
つーかVCの挙動が正しいんじゃないか?

497 名前:デフォルトの名無しさん :03/10/26 18:38
>>496
理由は?


498 名前:デフォルトの名無しさん :03/10/26 18:41
VCが正しいとしても、constではない参照がテンポラリオブジェクトを指していることにならないか?

499 名前:デフォルトの名無しさん :03/10/26 18:43
>>497
式'(true) ? a : b'の型はparent(parent &ではない)になるのが自然だと思われるから。

500 名前:デフォルトの名無しさん :03/10/26 18:44
>>498
確かにそうだ。


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