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


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

C++相談室 part34
251 名前:マイク ◆yrBrqfF1Ew :04/08/14 15:13
>230
QtのSignal/Slotでいい感じじゃねえか。

252 名前:デフォルトの名無しさん :04/08/14 17:55
>>247 デストラクタ処理がかえって邪魔になる事もあるからね。

なりません、まだ使われる可能性があるのにインスタンスを破棄するアホでもないかぎり。

253 名前:242 :04/08/14 18:19
>>252
同期型ソケットしか使ったことない厨は1回氏ね。

254 名前:デフォルトの名無しさん :04/08/14 18:22
非同期ソケットでも、ソケットの寿命とオブジェクトの寿命を同一にすればいいだけの話だが


255 名前:デフォルトの名無しさん :04/08/14 18:25
>メンバ変数に直接アクセス出来るようにしておく事をお奨めする。

タコ助だな

256 名前:デフォルトの名無しさん :04/08/14 20:54
どうせsetsockopt()みたいなのを呼んだり環境依存のフレームワークに
生のソケットを渡したりするから、生ソケットにアクセスする手段は
必要だって。完全なカプセル化じゃなくFacadeと考えた方がいい。

257 名前:デフォルトの名無しさん :04/08/14 21:06
サーバソケットからacceptして生成した新インスタンスに
setsockoptし忘れて・・・なんてことが
環境依存で起こりまくりですよもう

258 名前:デフォルトの名無しさん :04/08/14 23:33
サーバプログラムを書いた事ないヤシが多いのか、このスレ?

>>255
通信プログラム初心者は黙ってた方がいいね。

259 名前:デフォルトの名無しさん :04/08/15 00:29
C++の勉強を始めようと思って、こういうコードを書いたのですが
#include <iostream>

int main()
{
std::cout << "hello\n";
}
こういうエラーが出てきます。どなたか解る方がいましたら教えてください。
cstdlib(22): error C2873: 'exit' : シンボルを using 宣言の中で使用することはできません。
cstdlib(19): error C2873: 'abort' : シンボルを using 宣言の中で使用することはできません。
cstdlib(22): error C2039: 'exit' : 'operator``global namespace''' のメンバではありません。
cstdlib(19): error C2039: 'abort' : 'operator``global namespace''' のメンバではありません。


260 名前:デフォルトの名無しさん :04/08/15 00:53
sockoptの挙動が環境ごとに違うことは知らない奴が多そう
あとsignalも

261 名前:デフォルトの名無しさん :04/08/15 00:58
>>259
#include <cstdlib>

262 名前:デフォルトの名無しさん :04/08/15 00:59
長時間かけて小出しに煽ってるところを見ると
必死でググりながら調べてるのかな?
勤勉で結構。

263 名前:デフォルトの名無しさん :04/08/15 01:03
>>261 すみません、<cstdlib>をインクルードしても駄目でした。
再インストールでしょうか。。。

264 名前:デフォルトの名無しさん :04/08/15 01:04
環境依存部をラップする事が不可能って断言してる香具師いるけど、wxWidgetsとか、想像も出来ない世界にすんでるんだろうな

265 名前:デフォルトの名無しさん :04/08/15 01:19
>>242はアホだから放置しましょ

266 名前:デフォルトの名無しさん :04/08/15 02:23
>>264
> 環境依存部をラップする事が不可能って断言
具体的にどのレス?

267 名前:デフォルトの名無しさん :04/08/15 03:10
おまけに粘着(w

268 名前:デフォルトの名無しさん :04/08/15 11:50
全プラットフォームの完全な仕様があれば作れるけどさ、
そんなこと稀だし、ドキュメントに不備あるし、
OSのverupやパッチで動作変わったりするし

だから結局 >>256 のいうような形になると思うんだ

想像がつかない奴もいるようだが

269 名前:デフォルトの名無しさん :04/08/15 12:06
>OSのverupやパッチで動作変わったりするし

だからカプセル化するんじゃねーのか?


つうかメンバ変数に直アクセス出来るようにしとくってギャグか?

270 名前:デフォルトの名無しさん :04/08/15 12:26
メンバ関数でやれることは、限りなく「お約束」処理だけだよ。
>>269は、ソケットプログラム作ったことないの?

271 名前:デフォルトの名無しさん :04/08/15 12:35
>>270
> メンバ関数でやれることは、限りなく「お約束」処理だけだよ。
んなわきゃない。

俺はネットわープログラミングは専門外のゲーム屋だが、メンバ変数を
直接触らせるような設計にはしてないぞ。機種固有のメンバ関数を定義
することはあるが。

実務経験があるから偉いってわけじゃなし、「ソケットプログラム作った
ことないの?」なんていわずに、もすこし具体的な指摘をしとけ。
あとネットワークの話に絞りたいなら、スレ違いだから続きは
よそで頼む。


272 名前:デフォルトの名無しさん :04/08/15 13:25
>>242=>>270は滅茶苦茶レベルの低い自称プログラマ。

273 名前:デフォルトの名無しさん :04/08/15 13:38
スレ違いのようでスレ違いじゃないと思ったが
ラッピングの目的にもよるような気がしてきたなあ
javaやmfcみたいな、大勢向けのフレームワークなのか、
ちょっとした共通化を施したいだけの話なのか・・・

>>269
> だからカプセル化するんじゃねーのか?

仕様が決まればカプセル化できるのはアタリマエのような・・・
(と別のスレで似たことを書いたな)

>>270
ゲーム屋はそこで動けば済む話だから楽だよね。

274 名前:デフォルトの名無しさん :04/08/15 13:53
ますます具体論が消えてきたな。

275 名前:デフォルトの名無しさん :04/08/15 13:59
分かったことは、頭の弱い人は、

> ヒントをいうと、あまりカプセル化しすぎないこと。
> メンバ変数に直接アクセス出来るようにしておく事をお奨めする。
> デストラクタ機能はあくまでオマケ感覚のつもりで。

このくらい低い目標を持った方がいいということ。無理はいかん。


276 名前:デフォルトの名無しさん :04/08/15 14:09
面罵変数をpublicにするってそんなに悪ですか?

277 名前:デフォルトの名無しさん :04/08/15 14:09
>>270
お約束なるものをコードで表現するのがクラスでありメンバ関数では?
約束(仕様)に沿って提供する機能(メンバ関数)を設けて、
その実装(内部仕様)は外部から見えなくするというのがクラスではないかと。
お約束以外にいろいろできるようにするというなら、そもそもクラスを使う
意義がなくなるような気がするんです。
メンバ変数を外部から操作できてしまうと、メンバ関数の動作において
状態を把握・管理できかねる状況が生じませんか?
なんでもありにするなら、最初からクラスにせず、普通にCのライブラリのように
直接的に使うほうが楽な気もします。

278 名前:デフォルトの名無しさん :04/08/15 14:10
>>276
場合によるが、ソケットやファイルでスクリプタを public にするのは
かなり終わってると思われ。

279 名前:デフォルトの名無しさん :04/08/15 14:13
具体論って特定の問題の解決方法ってこと?
それだとそれに最適な実装方法を持ち出して、それで終わりだからなー。

とはいえ >>278 は何もわかってないな

280 名前:デフォルトの名無しさん :04/08/15 14:14
> お約束以外にいろいろできるようにするというなら、そもそもクラスを使う
> 意義がなくなるような気がするんです。

これも頭痛いな。

281 名前:デフォルトの名無しさん :04/08/15 14:23
>>279-280
コテハンつけてくれ。

メンバ変数を公開しないというのは、それを公開すると状態の一貫性を
保ちにくくなるから。たとえば文字列クラスで文字列を記憶するバッファと、
文字列長をメンバ変数にしていた場合、それを公開したら容易に矛盾
する状態を作れてしまう。

ソケットも同様で、ソケットを直接ユーザに見せたらソケットのオープン・
クローズ状態などをライブラリ側で把握できなくなってしまい、エラー処理や
assert() による実行時検査が事実上不可能になる。

Win32 のハンドルのように、すでに OS 側で管理機能が入ってる場合は
ともかく、生のソケットやファイルでスクリプタを直接ユーザに露出すると
誤用に対してきわめて脆弱なライブラリになってしまう。小規模なプログラム
ならそれでも良いんだが、規模がちょっと大きくなったり、複数のプログラマが
共同で作業する場合には、そのエラー検出・バグ取りの時間が馬鹿にならん。

282 名前:デフォルトの名無しさん :04/08/15 14:28
>>281
そういう奴にsocketを触らせる時点ですでに間違ってると思う。

283 名前:デフォルトの名無しさん :04/08/15 14:29
>>281
で、終了でいいんじゃない?
後はOOP一般論スレにでも行って。

284 名前:デフォルトの名無しさん :04/08/15 14:29
>>282
だからカプセル化するんだが? (w

285 名前:デフォルトの名無しさん :04/08/15 14:33
279その他は、とにかくsocket(または他のリソース)のすべての機能を網羅、分類するための
ラッパーとしてだけにしかクラスを使う事が出来ないんだよ。
抽象化とかそういったことはハナから頭にない。

286 名前:デフォルトの名無しさん :04/08/15 14:36
対象プラットフォームの挙動や仕様があらかじめ決まってる、
静的な世界のことしか考えてない人たちがライブラリ設計しちゃイカンと思う

287 名前:デフォルトの名無しさん :04/08/15 14:38
仕様が流動的に変化するプラットフォームなんてあったらまともに追従する事は不可能ですがなにか。

288 名前:デフォルトの名無しさん :04/08/15 14:40
スレが伸びてると思ったら、バカが一匹沸いて必死に自演してたのか

289 名前:デフォルトの名無しさん :04/08/15 14:40
>>285
そういうことだね。
C++使って書かれsocketプログラムというのを何個かみたことがあるけどありゃC++じゃねぇ。

290 名前:デフォルトの名無しさん :04/08/15 14:41
クラスというより名前空間でソケット汎用関数を用意するイメージの方が近いかもね。

291 名前:デフォルトの名無しさん :04/08/15 14:43
プラットフォーム依存をなくすための抽象化を
なんでそこまで張り切るのかが分からん
ガチガチに作っても、OSのパッチひとつでダメになるのは目に見えてるのに
その例がjavaのsocket。

抽象化の工数はもっと意義のあるところに使おうぜ。

292 名前:デフォルトの名無しさん :04/08/15 14:47
>>289 そういうことならOOスレもスレ違いだな。初心者スレあたりが妥当だと思うよ。

293 名前:デフォルトの名無しさん :04/08/15 14:48
>>291
不必要なところまで低レベルな機能を提供しなけりゃいい。
socketなんてクラスはsocketそのまんまだし(.NETも然り)

294 名前:デフォルトの名無しさん :04/08/15 14:49
>>290
結局そこに行き着くと思うんだがなあ・・・

このスレで頑張ってる抽象バカって、単純に
socket_some_func_01(socket, params);

socket->some_func(params);
に置換して満足してるんだろうか。

この程度で抽象化なんてほざいてたらイタいが。

295 名前:デフォルトの名無しさん :04/08/15 14:50
>>293
javaのsocketの歴史を見ると笑えるよ。
だんだん低レベルなメソッドが追加されてくの。

NIOではとうとう分離しちゃったけどな。つまるところ、破綻。

296 名前:デフォルトの名無しさん :04/08/15 15:04
サーバ上で動くことを求められるJavaが初心者用socketクラスだけで事足りるわけがない。

297 名前:デフォルトの名無しさん :04/08/15 15:13
初心者用ソケットクラス作って満足してる人たちが大半なのに

298 名前:デフォルトの名無しさん :04/08/15 15:13
>>295
> だんだん低レベルなメソッドが追加されてくの。

メンバをpublicすることとは、全く別の話だが?

>>294
> このスレで頑張ってる抽象バカって、単純に
> socket_some_func_01(socket, params);
> を
> socket->some_func(params);
> に置換して満足してるんだろうか。

プラットフォームの違いを、型システムで扱えるのだが?


299 名前:デフォルトの名無しさん :04/08/15 15:16
C++スレなんだからACEの話してくれないかな。
Javaなんてどうでもいいから。

300 名前:デフォルトの名無しさん :04/08/15 15:19
>プラットフォームの違いを、型システムで扱えるのだが?

意味わからん。
覚えたての単語を使ってみようなんて思わなくていいから。

301 名前:デフォルトの名無しさん :04/08/15 15:21
>>294
満足してるのはお前だけ。お前用のクラスは
class socket { public: int socket; };
だけで良いじゃん、どうせメンバ関数すべて標準関数へのスタブにするんだろうし。

302 名前:デフォルトの名無しさん :04/08/15 15:27
>>301==クラス設計もできない池沼

303 名前:デフォルトの名無しさん :04/08/15 15:28
そろそろいいんじゃない?どうせ折り合おうと思って無いでしょ?
考え方が違うんだろうし、無理に意見一致させる必要も無いし。

304 名前:デフォルトの名無しさん :04/08/15 15:29
>>301
ACEの設計が理解できない池沼

305 名前:デフォルトの名無しさん :04/08/15 15:32
>>294みたいな単純な置換は、C++初心者の勉強にはちょうど良いかもしれんね。

実戦でやられると迷惑なだけだが。

306 名前:デフォルトの名無しさん :04/08/15 21:04
C++はJavaを生み出すための単なる足がかり。
こんなクソ言語を使ってるダメプログラマは腹をくくって死ぬべきだ。

307 名前:デフォルトの名無しさん :04/08/15 21:07
そーいうことが言いたい貴方に

【厨房】言語叩き討論スレッド【隔離】
http://pc5.2ch.net/test/read.cgi/tech/1064841627/

308 名前:デフォルトの名無しさん :04/08/15 21:37
typedef aaa<bbb> ccc

という定義があった場合に、これをどのように理解すればいいのでしょうか?
aaa<bbb>をcccとして置き換える、というところまでわかりまっす。
でもaaa<bbb>の括弧の部分がわかりません。
これは、C++独自の仕様なのでしょうか?

どなかた、ご教授お願いします。


309 名前:デフォルトの名無しさん :04/08/15 21:38
ただのテンプ(ry

310 名前:デフォルトの名無しさん :04/08/15 21:39
>>309
それではさっぱりわかりません!!!!!

311 名前:デフォルトの名無しさん :04/08/15 21:44
ただのテンプレ(ry


312 名前:デフォルトの名無しさん :04/08/15 21:45
>typedef aaa<bbb> ccc

という定義などない

313 名前:デフォルトの名無しさん :04/08/15 22:03
typedef basic_string<char> string;
のような宣言のことだろうな

314 名前:デフォルトの名無しさん :04/08/15 22:11
><313あ、そうです。


315 名前:デフォルトの名無しさん :04/08/15 22:12
まちがえました・・・
× ><313
>>313


316 名前:デフォルトの名無しさん :04/08/15 22:13
CORBAの質問はここでOKですか?


317 名前:デフォルトの名無しさん :04/08/15 22:14
だからテンプレー(ryだって言ってんだろが

318 名前:デフォルトの名無しさん :04/08/15 22:16
>>317

テンプレーって何ですか?


319 名前:デフォルトの名無しさん :04/08/15 22:18
テ○○○ートだってば

320 名前:デフォルトの名無しさん :04/08/15 22:27
>>319
あ、テンプレートか。
なるほどね。


321 名前:デフォルトの名無しさん :04/08/15 22:30
CORBAのCORBA::W_String_varって何?

std::stringからCORBA::W_String_varに変換する方法を教えてください。


322 名前:デフォルトの名無しさん :04/08/15 22:33
質問なんですが、

DWORD* Dw;
::GetFileSize(FHnd,Dw);

こう書くと"値のない変数を参照しました。"と警告がでます。
値があればいいのだから、

DWORD* Dw = 0;
::GetFileSize(FHnd,Dw);

こう書けってことですか?
それとも他に書き方があるんでしょうか?

323 名前:デフォルトの名無しさん :04/08/15 22:37
DWORD Dw;
::GetFileSize(FHnd,&Dw);
じゃダメか?

324 名前:デフォルトの名無しさん :04/08/15 22:39
>>323
できました!ドウモアリガトウ

325 名前:デフォルトの名無しさん :04/08/15 22:52
>>322、324
出来ましたじゃねーよ
お前はCやめるか必死でポインタ勉強するのどちらかだろ
GetFileSizeとか書いてる場合じゃねーよ

326 名前:デフォルトの名無しさん :04/08/15 22:57
こういうスレもあるでよ。
【初心者歓迎】C/C++室 Ver.8【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1091264964/

327 名前:デフォルトの名無しさん :04/08/15 22:59
C++とOOPの基礎を習得しようとするにはどの本を買って真剣に読めばいいんですか?

328 名前:デフォルトの名無しさん :04/08/15 23:05
自分のレベルにあった本をその都度読んでいけばいい。

329 名前:デフォルトの名無しさん :04/08/16 06:54
しつもーん
class B
{
private:
~B() {}
};
class D: public B
{
//~D() {}
};
これがコンパイルを通ってしまうんだけど標準的にはどうなの?
ちなみに、コメントを解除するとちゃんとエラーになるんだけど。

330 名前:デフォルトの名無しさん :04/08/16 08:21
コンパイラ名とバージョンをかかないと、情報小出し君といわれちゃうぞ

331 名前:デフォルトの名無しさん :04/08/16 10:09
>>329
おそらく

D d;

と実際に変数を定義すると、その段階で D::~D() をコンパイラが作ろうとして
コンパイルエラーになるんじゃない?

332 名前:329 :04/08/16 11:38
>330
まあ悪名高き某VC6だけど、
タダのVC Toolkit 2003でも試したら、警告は出たけどコンパイルは通った。

>331
それならVC6でもエラーになったけど。
D *d = new D;
delete d;
この場合だと通ってしまいます。

333 名前:デフォルトの名無しさん :04/08/16 13:45
CodeWarrior for Win ver.8.3でチェックしてみた。コメントを解除
せずともD d;の時点でコンパイルエラーになって通らない。
ポインタに書き換えてもコンパイルエラーになって通らない。

334 名前:デフォルトの名無しさん :04/08/16 14:01
12.4 Destructorより
5
デストラクタが暗黙的に宣言されているクラスがinaccessibleな
デストラクタを持った基底クラスを持っている場合、プログラムは
不適格(ill-formed)である。

多分>>329は、D d;としてもD* d=new D;としても通らないのが正しい。

335 名前:デフォルトの名無しさん :04/08/16 15:15
>>332
悪名高くないだろVC6。
何と比較して言ってんの?

336 名前:デフォルトの名無しさん :04/08/16 15:18
テンプレート特殊化に対応してないコンパイラはたくさんあるけど、
forのスコープがあんなにひどいコンパイラはVC++6くらいだろ

337 名前:デフォルトの名無しさん :04/08/16 15:24
けなすと玄人っぽいじゃないですか。

338 名前:デフォルトの名無しさん :04/08/16 15:28
VC++6は出た当初は非常に抜きん出ていたけど、今となっては…

339 名前:デフォルトの名無しさん :04/08/16 15:45
>>337
素人まるだしだからやめとけ

340 名前:デフォルトの名無しさん :04/08/16 15:46
逆にVC++6を付属のSTLのままで使ってる香具師がいたら知りたいぜ。

341 名前:デフォルトの名無しさん :04/08/16 15:56
例外すら投げられないしな

342 名前:デフォルトの名無しさん :04/08/17 00:07
>340
呼んだ?

343 名前:デフォルトの名無しさん :04/08/17 00:20
>>336 forのスコープがあんなにひどいコンパイラはVC++6くらいだろ
えーっと、「・・・」が帰ってくるのを期待してたのかな?
forのスコープ問題って散々既出だけど、コンパイルスイッチで制御できるし
出た当時の仕様には準拠していたはずだよね。

VC6が出た時代背景も考慮に入れるなら、
叩けるところはnewがbad_alloc投げない事くらいでないの?

>>340
付属STLはパッチ出ててバグ修正されてるはず
Dinkumwareのページになかったっけ?

344 名前:デフォルトの名無しさん :04/08/17 00:25
>newがbad_alloc投げない
これはかなり問題ではないかと…

345 名前:デフォルトの名無しさん :04/08/17 00:32
>コンパイルスイッチで制御できるし

そうだっけ?
本当にそうだったら、これほどいつまでもウダウダ言われないと思うし、
#define for if (0) ; else for
なんてのがまかり通る事もないと思うけど。

346 名前:デフォルトの名無しさん :04/08/17 00:36
>>343
Dinkumwareのページ古くて、SP5以降だといくつか直ってたり修正ファイルの方が古かったりする。
結局差分とってソース追って正しいか確かめるのに大変だった。

347 名前:デフォルトの名無しさん :04/08/17 00:44
>>344
_set_new_handler()でどうにかなるし。

>>345
forのスコープはコンパイラスイッチで変更できるが、変更した場合付属のライブラリ群の動作が保証されないとかだった気がするが。

348 名前:デフォルトの名無しさん :04/08/17 00:47
>>347
new_handler 書いたり、アロケータ用意したりとかマンドクセ

349 名前:デフォルトの名無しさん :04/08/17 01:09
using namespace std;
ってやるのと、必要になる都度
std::
ってやるのとどっちがいいですか?
あと、どっちの方が主流なコーディングですか?

350 名前:デフォルトの名無しさん :04/08/17 01:14
どっちもやるけど、主に std:: って、その都度つけてる。
using namespace std; しちゃうと string, vector, list, map 等々、
ありきたりな名称で名前空間を汚されるのが嫌。てかうっかり名前
被らせて知らぬ間にバグを埋め込みそうで怖い。

351 名前:デフォルトの名無しさん :04/08/17 01:16
そうですか
やはり std:: ってやる方がいいですか。
せっかく分けた名前空間をごっちゃにしちゃ意味ないですもんね。

ありがとうございました

352 名前:デフォルトの名無しさん :04/08/17 02:13
>>345
重要なのはコンパイルスイッチでの制御の可否じゃなくて、当時の仕様だ。

>>347
windows.hが通らないだけだった気がする

353 名前:デフォルトの名無しさん :04/08/17 03:28
>349
ヘッダのグローバルな部分ではusing namespaceは使っちゃ駄目、絶対。
でも小さなソースファイルとか、関数単位ならそれほど問題ない。

354 名前:デフォルトの名無しさん :04/08/17 03:46
>>353
自分でも using namespace std; って書いててかなり疑問に感じてました。
名前空間の持つそのものの利点が失われるので。

std:: とその都度打つ方が主流みたいですし、はっきりした利点もあるようなのでこれからはこう書いていきます

355 名前:デフォルトの名無しさん :04/08/17 07:57
>名前空間の持つそのものの利点が失われるので。

名前空間の持つ欠点も失われるけどね。

356 名前:デフォルトの名無しさん :04/08/17 10:48
欠点が失われるのはよいことでは?

357 名前:デフォルトの名無しさん :04/08/17 10:49
ズレたレスにズレたレスがついて
次どうなるかまったく予測がつかなくなった例

358 名前:デフォルトの名無しさん :04/08/17 18:04
得失点差による激しいバトルとなってまいりました

359 名前:デフォルトの名無しさん :04/08/17 20:23
>>357
読んでても一貫して無くて、むきーっとなるなw

360 名前:デフォルトの名無しさん :04/08/17 23:40
仕事で、UNIX環境での、C++のコーディングチェック&修正のための、ツールを、作りたいです。


で、やっぱ、こういうのって、文字列操作が、からんで、くるじゃないですか?

ってことは、やっぱり、PERLがいいのでしょうか?
それとも、C++?


皆さんも仕事で、コーディングチェックのための、ツールを、作っていると、思うのですが、
言語は、何が、おすすめでしょうか?



361 名前:デフォルトの名無しさん :04/08/17 23:50
>>360
文字列操作なんて言ってるようじゃ無理ぽ。
そんなの、先人の作ったオプソのツールを活用せい。
それと、手段を目的にしてるようじゃダメだね。


362 名前:デフォルトの名無しさん :04/08/18 00:17
>>360
> 皆さんも仕事で、コーディングチェックのための、ツールを、作っていると、思うのですが、
作ってないし使ってない。人が作ってるものを探してるなら C++ beautifier あたりで
検索かけてみ。

363 名前:デフォルトの名無しさん :04/08/18 00:23
>>360
コーディングチェックって、具体的にはなにをするの?

364 名前:デフォルトの名無しさん :04/08/18 00:24
ヘンな読点には突っ込まないのか。大人だなおまいら。

365 名前:>>360 :04/08/18 00:29
みなさん、レスありがとうございます。

なるほど、人が作っているものが、あるのですね。
そうします。

>ヘンな読点には突っ込まないのか。大人だなおまいら。
すいません、リアル中国人SEなので。
話すのは流暢なのですが、文章苦手です。
在日10年で、この7月に永住許可、もらっちゃいましたよ。(帰化ではないですよ)



366 名前:デフォルトの名無しさん :04/08/18 00:30
>>365
そうか。すまんかった。

367 名前:デフォルトの名無しさん :04/08/18 00:43
>>365
できれば>>363に答えて欲しい。

368 名前:デフォルトの名無しさん :04/08/18 00:48
>>367
南京大虐殺、の被害者数捏造とかです。

369 名前:デフォルトの名無しさん :04/08/18 00:49
>>364
>>360は西村京太郎だろ

370 名前:デフォルトの名無しさん :04/08/18 00:52
>>368
技術者の場でそういうネタを持ち込むはやめれ。

371 名前:デフォルトの名無しさん :04/08/18 00:55
>>370
いやあ、技術に国境は確固として存在するよ。それに伴う偏見や雑言もね

372 名前:デフォルトの名無しさん :04/08/18 01:07
見ていて、ウケないネタほど痛々しいものはないな。

373 名前:デフォルトの名無しさん :04/08/18 02:47
質問です。
言語はC++です。
int型の数値をchar型の文字列に変換したいときは
どのような関数を作ればよいですか?
同じように、
double→char
など。
初心者の質問で申し訳ないですが
宜しくお願いします。

374 名前:デフォルトの名無しさん :04/08/18 02:53
int n = 1;
char c = 2;
double d = 3.0;

c = static_cast< char >( n );
c = static_cast< char >( d );

こういうこと?

375 名前:デフォルトの名無しさん :04/08/18 02:54
>>458
sprintf()


376 名前:デフォルトの名無しさん :04/08/18 02:55
>>458
fgets()

377 名前:373 :04/08/18 03:15
>>374

374さんが書いたコードは、

int i;
char j;
j = (char)i;

といったかんじの普通のキャストとは
やはりどこか違うんでしょうか?

>>375
sprintfという便利なものが
あったのですね。
とりあえずがんばってみます!

ありがとうございました。

378 名前:デフォルトの名無しさん :04/08/18 03:16
>>375-376
ワラタ
暗にマルチポストを指摘しているな。

379 名前:デフォルトの名無しさん :04/08/18 03:21
>>458
そういうことなら
ostringstream ってのがある

380 名前:デフォルトの名無しさん :04/08/18 04:25
http://pc5.2ch.net/test/read.cgi/tech/1091264964/458

381 名前:デフォルトの名無しさん :04/08/18 07:06
STLにatoiのc++っぽいのはなかった?
boostかな?
うわおれc++忘れてる

382 名前:デフォルトの名無しさん :04/08/18 07:16
boostのlexical_castだな。

383 名前:デフォルトの名無しさん :04/08/18 14:18
戻り値で構造体を返す場合、どれが最も優れていると思いますか?
また他にもっと良い方法はありますか?

A get( ){
return a;}

const A a = get( );

この方法は値渡しがネックです。


void get( A& a ){
a = b;}

A a;
get( a );

この方法だと2行必要ですし、constが付けられません。

384 名前:383の続き :04/08/18 14:19
A& get( A& a = A() ){
return a = b;}

const A a = get( );

この方法はオーバーライドした際、バグの元になりやすいです。
例)
A& get2( ){
return get();}


A& get( ){
static A a; // TLSでも可
return a = b;}

const A a = get( );

この方法だとなんだか無駄が多い気がします。
キャッシュミスも起こりそう。

385 名前:デフォルトの名無しさん :04/08/18 14:22
>>383
NRV 最適化でググれ。

386 名前:デフォルトの名無しさん :04/08/18 15:16
>>383
NRVとは初めて知りました。
自分のコンパイラ(VC)で適用されるのか試してみます。
ありがとうございました。

387 名前:デフォルトの名無しさん :04/08/18 19:13
VCなら条件付で6のころからNRV適用される

388 名前:デフォルトの名無しさん :04/08/18 19:20
C++BuilderはNRVなんて無さそうだな。
あれほんとに何も最適化しないもんな。
定数式の最適化位だろ。

389 名前:デフォルトの名無しさん :04/08/18 20:50
自作クラスの複数のメンバ変数から、任意に一つ選んで比較キーとして、STLのアルゴリズムに食わせたい場合どうすればいいの?
class Personal {
string name, sex, tel, email;
int age;
}
例えば、こんなクラスで、あるときはnameで、あるときはageでソートや検索をしたいという場合です。
operator== や operator< はクラスで1つしか持てないので、別の比較関数(or関数オブジェクト)を用意する必要があると思いますが、
どこで用意するのが管理しやすいでしょうかね・・・。

マネージャクラスを別に作って、そこにstaticな比較関数を持たせるのが一番楽かなと思っているんですが・・・
class PersonalManager {
public:
static bool AgeCompareLessl(Personal &p1, Personal &p2){ return p1.age < p2.age}
;
}
としておいて、
vector<Personal> v;
sort(v.begin(), v.end(), PersonalManager::AgeCompareLess);

これじゃぁ、あんまり頭よさそうじゃないですよね。
もっといい案あったら教えてください。

390 名前:デフォルトの名無しさん :04/08/18 20:56
struct PersonalComparator
{
 bool operator() (const Personal &p1, const Personal &p2){ return p1.age < p2.age; }
}

vector<Personal> v;
sort(v.begin(), v.end(), PersonalComparator());

391 名前:デフォルトの名無しさん :04/08/18 20:58
×PersonalComparator
○PersonalAgeComparator

392 名前:デフォルトの名無しさん :04/08/18 21:01
>>389
ttp://www.tietew.jp/cppll/archive/549

393 名前:デフォルトの名無しさん :04/08/18 21:21
>>390
それだとやっぱりメンバの数だけ、関数オブジェクトが出来てしまいますよね。
なんか分散しちゃうのが感覚的に嫌な感じ・・・。

>>392
ありがとうございます。そういう奴がほしかったんです。
templateつかってうまいことできないかなぁと。
とりあえずそこ読んで研究してみます・・・・。

394 名前:デフォルトの名無しさん :04/08/18 22:02
c++でエスケープシーケンスはどうすれば使えますか?
printf("\x1b[30m");
とか。

VC++.NETを使っています。

395 名前:デフォルトの名無しさん :04/08/18 22:09
萌える法律読本
http://book.mycom.co.jp/user/preview/4-8399-1555-5/index.shtml

この本に日本の未来に光を感じました。
これのC言語版がほしいのですが、どこで売ってるのか教へてください。
おながいします。

はふはふ。

396 名前:デフォルトの名無しさん :04/08/18 22:10
憂鬱とAcceleratedを教えてくれたひと、本当にありがとう。

397 名前:デフォルトの名無しさん :04/08/19 00:06
intからstd::stringに変換するにはどうしたらいいですか?

ちなみにコーディング規約でsprintf使用禁止になっています。

std::stringにそのようなメソッドはないでしょうか?


398 名前:デフォルトの名無しさん :04/08/19 00:10
istringstream

399 名前:デフォルトの名無しさん :04/08/19 00:11
あ、この場合 ostringstream だね

400 名前:デフォルトの名無しさん :04/08/19 00:12
#include <sstream>
#include <iostream>
using namespace std;
int main(){
  stringstream ss;
  string s;
  int n;
  cin >> n;
  ss << n;
  ss >> s;
  cout << s << endl;
  return 0;
}

401 名前:デフォルトの名無しさん :04/08/19 00:15
>>389
メンバ変数ポインタと Boost Bind もしくは Boost Lambda を使う。たとえば名前をキーに
したければ

boost::bind(std::less<string>(), boost::bind(&Personal::name, _1), boost::bind(&Personal::name, _2))

あるいは

using namespace boost::lambda;
bind(&Personal::name, _1) < bind(&Personal::name, _2)

ってな感じで、望みの関数オブジェクトが作れる。

402 名前:デフォルトの名無しさん :04/08/19 00:17
>>397
馬鹿な規約ですね。

403 名前:デフォルトの名無しさん :04/08/19 00:20
立派な規約じゃないか

404 名前:デフォルトの名無しさん :04/08/19 00:30
自由に組ませてやれよ

405 名前:デフォルトの名無しさん :04/08/19 00:53
>>397
sprintf 禁止でも snprintf なら OK とか?

406 名前:デフォルトの名無しさん :04/08/19 00:54
ANSI使うなってことで、wsprintfならいいんだろう

407 名前:デフォルトの名無しさん :04/08/19 01:21
>389
>401
ちなみにlambdaなら

using namespace boost::lambda
&_1->*&Personal::name < &_2->*&Personal::name

こういう書き方もできますよ.

408 名前:デフォルトの名無しさん :04/08/19 01:23
書式設定しなきゃならんし型安全性もないし拡張性もない sprintf なんかいるか!!

409 名前:デフォルトの名無しさん :04/08/19 05:43
>>394
std::cout << "\x1b[30m";

410 名前:>>397 :04/08/19 08:04
皆、レスありがとうござ(ry



411 名前:デフォルトの名無しさん :04/08/19 09:11
>>409
できないです。
どうすればいいでしょう。

もしかしてVC++についているコマンドプロンプトみたいのを使ってるから?

412 名前:デフォルトの名無しさん :04/08/19 09:37
なんだわかっているじゃん。
VC++付属じゃないけどな。

413 名前:デフォルトの名無しさん :04/08/19 09:48
VC++で直接してもむりでした。

コマンドプロンプトでする方法ないですか?

414 名前:デフォルトの名無しさん :04/08/19 09:52
そもそもエスケープシーケンスはNT系なら不可能。

415 名前:デフォルトの名無しさん :04/08/19 09:59
ANSI.SYSの設定をしたらできるのでは?

416 名前:デフォルトの名無しさん :04/08/19 10:06
ハゲシク デジャヴ

417 名前:デフォルトの名無しさん :04/08/19 10:08
>>416
STLつかうと(ry

418 名前:デフォルトの名無しさん :04/08/19 10:27
>>413
こういうのはどうだ?
http://www.kumei.ne.jp/c_lang/intro/no_58.htm

419 名前:デフォルトの名無しさん :04/08/19 20:26
>>417
環(ry

420 名前:デフォルトの名無しさん :04/08/19 21:08
>>419
すげ(ry

421 名前:デフォルトの名無しさん :04/08/19 21:13
(ry

422 名前:デフォルトの名無しさん :04/08/19 21:15
(r

423 名前:デフォルトの名無しさん :04/08/19 21:34
(

424 名前:デフォルトの名無しさん :04/08/19 22:01


425 名前:デフォルトの名無しさん :04/08/19 22:03
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフウフフフフ

426 名前:デフォルトの名無しさん :04/08/19 22:47
バッファあふれてるぞ?


427 名前:デフォルトの名無しさん :04/08/20 00:56
char* はちゃんと初期化しる!


って話かとオモタ。

428 名前:デフォルトの名無しさん :04/08/20 07:04
C++ では

for( int i = 0; i < 10; ++ i ){
...
}

std::cout << i << std::endl;

みたいな風に、for を抜けても i を参照することって許されてるんですか?

429 名前:デフォルトの名無しさん :04/08/20 07:30
>>428 いいえ

430 名前:デフォルトの名無しさん :04/08/20 07:35
>>429
マジデスカ…

おのれ VC7.1 …

431 名前:デフォルトの名無しさん :04/08/20 07:53
>>430 http://www.microsoft.com/japan/msdn/library/ja/vccore/html/vcrefZcforScope.asp

432 名前:デフォルトの名無しさん :04/08/20 08:03
>>431
おぉ、THX!
これやってみます

433 名前:デフォルトの名無しさん :04/08/20 08:56
他にもこんな方法もある。
#define for if (0) ; else ; for

434 名前:デフォルトの名無しさん :04/08/20 09:07
forループのスコープ云々って
イテレータが2種以上あるとき無力だにょなあ

map::iterator im = m.begin();
for( int i = 0; i < 10; ++i, ++im)...

結局こうなっちゃうし。
俺は古い仕様のままでいいと思うけど。

435 名前:デフォルトの名無しさん :04/08/20 09:22
どっちでもいいけどどっちでもありうるのはいやだ

436 名前:デフォルトの名無しさん :04/08/20 09:56
for ( int i = 0, map::iterator im = m.begin;
    i<10;
    ++i, ++im) {}
でいいじゃん

437 名前:デフォルトの名無しさん :04/08/20 10:04
>>436
それ、コンパイル通る?

438 名前:デフォルトの名無しさん :04/08/20 10:06
for (xxx::iterator it = m.begin(), end = m.end(); it != end; ++it)
なら通るんだけどねぇ

439 名前:デフォルトの名無しさん :04/08/20 10:06
vc++.net2003で新しいプロジェクトを作ろうとすると
テンプレートが16種類もあるんだけど
どれが何用とか決まってんの?

440 名前:デフォルトの名無しさん :04/08/20 11:33
一つは昼用、他は夜用。どれが昼用かは使ってわかってね。

441 名前:デフォルトの名無しさん :04/08/20 11:54
>>436
int i = 0, map::iterator im = m.begin();
が、
int i = 0; int map::iterator im = m.begin();
と解釈されちゃうんだね。

forの初期化部には一つの型しか書けないわけか。

442 名前:デフォルトの名無しさん :04/08/20 12:00
{ //こうでいいじゃん
 map::iterator im = m.begin;
 for (int i = 0; i < 10; ++i, ++im)
 {
 }
}


443 名前:デフォルトの名無しさん :04/08/20 12:22
結論: C++ は糞

444 名前:デフォルトの名無しさん :04/08/20 12:38
>>442
禿げしく却下

445 名前:デフォルトの名無しさん :04/08/20 12:58
Cとかだと普通にやるけどな>ブロックスコープのでっち上げ

446 名前:デフォルトの名無しさん :04/08/20 13:18
スコープ便利やん
人にとって

447 名前:デフォルトの名無しさん :04/08/20 13:36
>434
んなアンコモンケースに対応することの方がどうでもいい。

448 名前:デフォルトの名無しさん :04/08/20 15:08
>>447
そうか?
つーか現状のfor構文の方に
不備があるだろ、どっちかって言うと。
for()内のカンマをセミコロンに、
セミコロンを別の適当な記号に置き換えれば
無問題になるし意味的にも自然だ。

449 名前:デフォルトの名無しさん :04/08/20 16:06
僕のキーボードには適当な記号がありません。

450 名前:デフォルトの名無しさん :04/08/20 16:21
そこでトライグラフですよ。

451 名前:デフォルトの名無しさん :04/08/20 16:30
??=include <stdio.h>
int main(int argc, char **argv)
??<
    printf("%d??/n", argc);
??>

452 名前:デフォルトの名無しさん :04/08/20 16:32
たとえば:とか。

453 名前:デフォルトの名無しさん :04/08/20 17:07
for(map::iterator im = m.begin; int i = 0;)(i < 10)(++i; ++im;) ...

454 名前:デフォルトの名無しさん :04/08/20 17:20
do{
map::iterator im = m.begin;
int i = 0;}
whlie( i < 10){
...
++i; ++im;);

455 名前:デフォルトの名無しさん :04/08/20 20:23
int* p = static_cast< int* >( operator new( 10 * sizeof( int ) ) );
operator delete( p );
と、
int* p = static_cast< int* >( operator new[]( 10 * sizeof( int ) ) );
operator delete[]( p );
は何か違いがあるのでしょうか?
あるのなら何を基準に使い分ければいいのでしょうか?

456 名前:デフォルトの名無しさん :04/08/20 20:35
>>455
reinterpret_cast ちゃうか?

457 名前:デフォルトの名無しさん :04/08/20 20:42
>>455
ここ読め。
http://www.fides.dti.ne.jp/~oka-t/cpplab-placement-new-3.html
new int[10]だと10 * sizeof(int)以上の領域を確保しなければならない可能性がある。

458 名前:デフォルトの名無しさん :04/08/20 20:58
char EndChr[10] = "n";
int flag = 1;
if (EndChr == "n"){
flag = 0;
}

このような式においてEndChr == "n"がfalseになります。
なぜなのでしょうか?

459 名前:デフォルトの名無しさん :04/08/20 21:00
>>457
>>455のような例では両者に領域の違いも何もないということですよね?
new 演算子で配列を確保場合、必要以上の領域を確保する可能性があると。

460 名前:デフォルトの名無しさん :04/08/20 21:01
>455
そもそもoperator newはnewから呼び出される為の物だということを忘れるな。

461 名前:デフォルトの名無しさん :04/08/20 21:06
>>460
は?

462 名前:デフォルトの名無しさん :04/08/20 21:08
>>458
アドレス比較してるから。char[10] の代わりに std::string 使うか strcmp() で比較。

463 名前:デフォルトの名無しさん :04/08/20 21:14
あれ、分からなくなってきた…
class C{ ... };

C* p = static_cast< C* >( operator new( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
    new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
    p[ i ].~C();
operator delete( p );

と、

C* p = static_cast< C* >( operator new[]( 10 * sizeof( C ) ) );
for( int i = 0; i < 10; ++ i )
    new( p[ i ] ) C( ... );
...
for( int i = 0; i < 10; ++ i )
    p[ i ].~C();
operator delete[]( p );

はどっちも正しい?

464 名前:デフォルトの名無しさん :04/08/20 21:14
アドレスが別だからじゃないの?

465 名前:デフォルトの名無しさん :04/08/20 21:17
>>463
どちらも正しくないんじゃない?動くとは思うけど。
malloc でも動くけどね。

466 名前:デフォルトの名無しさん :04/08/20 21:21
>>465
あ、スイマセン…
new( &p[ i ] ) C( ... );
です

467 名前:デフォルトの名無しさん :04/08/20 21:55
>>443
まー確かに、全く平等な条件で選んでた言語かって聞かれると・・・・だな。
市場のデカさは間違いなく判断基準に入ってる。

468 名前:デフォルトの名無しさん :04/08/21 00:12
今、C++を勉強しているのですが、オブジェクトが難しくて理解があまりできていません。
それで、オブジェクトの事を詳しく説明しているサイトがあれば、教えて頂けないでしょうか?
よろしくお願いします。

469 名前:デフォルトの名無しさん :04/08/21 00:27
「オブジェクトのことを詳しく説明しているサイトを教えてください」

は、人文で言うと、

「文化について詳しく説明しているサイトを教えてください」

くらい、条件が広くて絞り込めない。

470 名前:デフォルトの名無しさん :04/08/21 00:33
>>468
C++関連の書籍を扱っている書店に行ける環境ですか?
Amazonなどの通信販売でも構いませんので、
まずは1冊、自分で良さそうと思った本を読破することをお勧めします。
高くて買えないという場合は、立ち読みしちゃうとか図書館を覗いてみるとか。
時にはネット以外の情報源に当たるのもいいですよ。


471 名前:デフォルトの名無しさん :04/08/21 00:52
C++関連の本って大きい本屋じゃないと扱っていないんですよね。でも、探してみます☆
えっと、オブジェクトの事で知りたいのは、オブジェクト=オブジェクトとか、
クラスで、メンバ関数の引数でオブジェクトでの参照渡し、値渡しです。


472 名前:デフォルトの名無しさん :04/08/21 00:56
http://www.1point.jp/~book_2ch/program/cpp.html

473 名前:471 :04/08/21 01:07
ありがとうございます!!

474 名前:デフォルトの名無しさん :04/08/21 01:10
今まであたりまえだと思っていたんだけど

char hoge[256] = {0};  // hoge文字列の初期化

この書き方って一般的でない?
レビューで「わかりにくい」と言われてしまったんだけど。
#memsetやるより良いと思うんだけどなぁ・・・

475 名前:デフォルトの名無しさん :04/08/21 01:21
0限定なら別にどっちゃでも。

476 名前:デフォルトの名無しさん :04/08/21 01:22
char hoge[256];
hoge[0]='\0';

特に意味が無いのならこうすべきだ。
初期化指定子は無駄な領域も初期化するからな。

477 名前:デフォルトの名無しさん :04/08/21 01:25
char hoge[256] = "";
これで

478 名前:デフォルトの名無しさん :04/08/21 01:30
文字配列ならどうとでもなるな。
でも構造体配列だと・・・

479 名前:478 :04/08/21 01:30
あ、ごめん、ここC++だった。

480 名前:474 :04/08/21 01:32
>>476
char hoge[256];
hoge[0]='\0';

これってVC6のDebug(Releaseでは大丈夫だった)で起動するとこうならない?↓
hoge[0] : 0x00
hoge[1] : 0xcc
hoge[2] : 0xcc
・・・
hoge[255] : 0xcc

まあ、問題はないんだけど・・・。

481 名前:デフォルトの名無しさん :04/08/21 01:51
>>480
0で埋めたいわけじゃないんだろ?

482 名前:474 :04/08/21 01:56
>>481
0で埋めたいんです・・・

483 名前:デフォルトの名無しさん :04/08/21 01:59
え、C++でそんなお馬鹿コードが通るなんて聞いたことないぞ。
せめて
for (int i = 0; i < 256; i++) hoge[i] = '\0';
だろ。

484 名前:デフォルトの名無しさん :04/08/21 02:04
>>482
じゃぁコードが合っててコメントが糞ってことだな。
0で埋めるコードとしては、>>474のものが最も効率が良くなる可能性が高い。

485 名前:デフォルトの名無しさん :04/08/21 02:04
>>483
おまえはたぶん回答者に向いてない。もうちっとROMで雰囲気つかめ。

486 名前:デフォルトの名無しさん :04/08/21 02:05
>>483
C++ならせめて std::fill 使うだろ。

487 名前:484 :04/08/21 02:08
実はCしか知らん

>485
テメーで解答してから言え ぼけ

488 名前:デフォルトの名無しさん :04/08/21 02:08
>>483がレビューで「わかりにくい」と言った人。

489 名前:デフォルトの名無しさん :04/08/21 02:09
文字列操作しかしないバッファなら char hoge[128] = ""; で十分。

490 名前:デフォルトの名無しさん :04/08/21 02:11
>>487>>483

491 名前:484 :04/08/21 02:11
comdlgのopenフィルタ(W32API)のように、\0を区切りとして\0\0まで処理するような
関数を想定してるなら全部埋める必要があるだろ。0で埋めるってのはそういう話だと
思ったが。

492 名前:デフォルトの名無しさん :04/08/21 02:11
>>483
1byteずつ初期化すると遅いから4byteか8byteずつ初期化しなさい。

493 名前:デフォルトの名無しさん :04/08/21 02:12
>>490
あー、すまん。>>483=487=491だ

494 名前:デフォルトの名無しさん :04/08/21 02:12
この質問者のレベルだと、多分そこまで求められていない。

495 名前:デフォルトの名無しさん :04/08/21 02:14
>>493
Cしか知らんて、Cでも配列の初期化は={0}で同じことできる。
これが通らないとか言ってるからROMっとけと言ってるんだ。

496 名前:474 :04/08/21 02:15
特殊な文字コードとかも使っていて、ダンプ出力するのに「フ」の字が入るのはちと困ってしまうのですがw

>>489
全部0で埋まりました・・・。こっちの方がわかりやすいかしら?

497 名前:デフォルトの名無しさん :04/08/21 02:16
いや、やりたい事とコメントが微妙にずれてるから「わかりにくい」と言われたんだろ

498 名前:デフォルトの名無しさん :04/08/21 02:16
>>496
いや、意図は、hoge[0] だけ0で埋めるという意味だよ。
全部埋まったのは、そのコンパイラがたまたまそうだっただけ。

499 名前:デフォルトの名無しさん :04/08/21 02:18
俺も{0}で初期化は一般的だと思うけど、
レビューで文句言われたならとりあえず従っておいたら。
コメントが微妙にずれてるのがわかりにくいと言われたのなら直せばいいだけだ。

500 名前:デフォルトの名無しさん :04/08/21 02:19
>>495
知らなかった、正直すまんかった。
で、スレ違いではあるがよければK&Rのどのへんにそういうのが載ってるのか教えてくれないか。
索引で配列関連を引いてみたが見つからなかった。


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