トップページ⇒tech
1001コメント302KB

C++相談室 part34

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)vNGNG
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0243242NGNG
ヒントをいうと、あまりカプセル化しすぎないこと。
メンバ変数に直接アクセス出来るようにしておく事をお奨めする。
デストラクタ機能はあくまでオマケ感覚のつもりで。
0244デフォルトの名無しさんNGNG
>>243
死んどけや
0245デフォルトの名無しさんNGNG
Javaのsocketが大失敗こいてるからなあ・・・
0246デフォルトの名無しさんNGNG
>>245
そうか?
プラットフォーム、実装が複数ある中では異例の成功だと思うけども。
0247242NGNG
>>244
なぜに死すべしや?


ついでに書くと、ソケットハンドルをいつでもAttach/Detachできるようにしないとかなりツライ。
デストラクタ処理がかえって邪魔になる事もあるからね。
0248デフォルトの名無しさんNGNG
newしろや
0249デフォルトの名無しさんNGNG
>>246
まさか。あんなのtoy programでしか使わないよ
0250デフォルトの名無しさんNGNG
>>248はC/C++の開発から永久追放。
0251マイク ◆yrBrqfF1Ew NGNG
>230
QtのSignal/Slotでいい感じじゃねえか。
0252デフォルトの名無しさんNGNG
>>247 デストラクタ処理がかえって邪魔になる事もあるからね。

なりません、まだ使われる可能性があるのにインスタンスを破棄するアホでもないかぎり。
0253242NGNG
>>252
同期型ソケットしか使ったことない厨は1回氏ね。
0254デフォルトの名無しさんNGNG
非同期ソケットでも、ソケットの寿命とオブジェクトの寿命を同一にすればいいだけの話だが
0255デフォルトの名無しさんNGNG
>メンバ変数に直接アクセス出来るようにしておく事をお奨めする。

タコ助だな
0256デフォルトの名無しさんNGNG
どうせsetsockopt()みたいなのを呼んだり環境依存のフレームワークに
生のソケットを渡したりするから、生ソケットにアクセスする手段は
必要だって。完全なカプセル化じゃなくFacadeと考えた方がいい。
0257デフォルトの名無しさんNGNG
サーバソケットからacceptして生成した新インスタンスに
setsockoptし忘れて・・・なんてことが
環境依存で起こりまくりですよもう
0258デフォルトの名無しさんNGNG
サーバプログラムを書いた事ないヤシが多いのか、このスレ?

>>255
通信プログラム初心者は黙ってた方がいいね。
0259デフォルトの名無しさんNGNG
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''' のメンバではありません。
0260デフォルトの名無しさんNGNG
sockoptの挙動が環境ごとに違うことは知らない奴が多そう
あとsignalも
0261デフォルトの名無しさんNGNG
>>259
#include <cstdlib>
0262デフォルトの名無しさんNGNG
長時間かけて小出しに煽ってるところを見ると
必死でググりながら調べてるのかな?
勤勉で結構。
0263デフォルトの名無しさんNGNG
>>261 すみません、<cstdlib>をインクルードしても駄目でした。
再インストールでしょうか。。。
0264デフォルトの名無しさんNGNG
環境依存部をラップする事が不可能って断言してる香具師いるけど、wxWidgetsとか、想像も出来ない世界にすんでるんだろうな
0265デフォルトの名無しさんNGNG
>>242はアホだから放置しましょ
0266デフォルトの名無しさんNGNG
>>264
> 環境依存部をラップする事が不可能って断言
具体的にどのレス?
0267デフォルトの名無しさんNGNG
おまけに粘着(w
0268デフォルトの名無しさんNGNG
全プラットフォームの完全な仕様があれば作れるけどさ、
そんなこと稀だし、ドキュメントに不備あるし、
OSのverupやパッチで動作変わったりするし

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

想像がつかない奴もいるようだが
0269デフォルトの名無しさんNGNG
>OSのverupやパッチで動作変わったりするし

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


つうかメンバ変数に直アクセス出来るようにしとくってギャグか?
0270デフォルトの名無しさんNGNG
メンバ関数でやれることは、限りなく「お約束」処理だけだよ。
>>269は、ソケットプログラム作ったことないの?
0271デフォルトの名無しさんNGNG
>>270
> メンバ関数でやれることは、限りなく「お約束」処理だけだよ。
んなわきゃない。

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

実務経験があるから偉いってわけじゃなし、「ソケットプログラム作った
ことないの?」なんていわずに、もすこし具体的な指摘をしとけ。
あとネットワークの話に絞りたいなら、スレ違いだから続きは
よそで頼む。
0272デフォルトの名無しさんNGNG
>>242=>>270は滅茶苦茶レベルの低い自称プログラマ。
0273デフォルトの名無しさんNGNG
スレ違いのようでスレ違いじゃないと思ったが
ラッピングの目的にもよるような気がしてきたなあ
javaやmfcみたいな、大勢向けのフレームワークなのか、
ちょっとした共通化を施したいだけの話なのか・・・

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

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

>>270
ゲーム屋はそこで動けば済む話だから楽だよね。
0274デフォルトの名無しさんNGNG
ますます具体論が消えてきたな。
0275デフォルトの名無しさんNGNG
分かったことは、頭の弱い人は、

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

このくらい低い目標を持った方がいいということ。無理はいかん。
0276デフォルトの名無しさんNGNG
面罵変数をpublicにするってそんなに悪ですか?
0277デフォルトの名無しさんNGNG
>>270
お約束なるものをコードで表現するのがクラスでありメンバ関数では?
約束(仕様)に沿って提供する機能(メンバ関数)を設けて、
その実装(内部仕様)は外部から見えなくするというのがクラスではないかと。
お約束以外にいろいろできるようにするというなら、そもそもクラスを使う
意義がなくなるような気がするんです。
メンバ変数を外部から操作できてしまうと、メンバ関数の動作において
状態を把握・管理できかねる状況が生じませんか?
なんでもありにするなら、最初からクラスにせず、普通にCのライブラリのように
直接的に使うほうが楽な気もします。
0278デフォルトの名無しさんNGNG
>>276
場合によるが、ソケットやファイルでスクリプタを public にするのは
かなり終わってると思われ。
0279デフォルトの名無しさんNGNG
具体論って特定の問題の解決方法ってこと?
それだとそれに最適な実装方法を持ち出して、それで終わりだからなー。

とはいえ >>278 は何もわかってないな
0280デフォルトの名無しさんNGNG
> お約束以外にいろいろできるようにするというなら、そもそもクラスを使う
> 意義がなくなるような気がするんです。

これも頭痛いな。
0281デフォルトの名無しさんNGNG
>>279-280
コテハンつけてくれ。

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

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

Win32 のハンドルのように、すでに OS 側で管理機能が入ってる場合は
ともかく、生のソケットやファイルでスクリプタを直接ユーザに露出すると
誤用に対してきわめて脆弱なライブラリになってしまう。小規模なプログラム
ならそれでも良いんだが、規模がちょっと大きくなったり、複数のプログラマが
共同で作業する場合には、そのエラー検出・バグ取りの時間が馬鹿にならん。
0282デフォルトの名無しさんNGNG
>>281
そういう奴にsocketを触らせる時点ですでに間違ってると思う。
0283デフォルトの名無しさんNGNG
>>281
で、終了でいいんじゃない?
後はOOP一般論スレにでも行って。
0284デフォルトの名無しさんNGNG
>>282
だからカプセル化するんだが? (w
0285デフォルトの名無しさんNGNG
279その他は、とにかくsocket(または他のリソース)のすべての機能を網羅、分類するための
ラッパーとしてだけにしかクラスを使う事が出来ないんだよ。
抽象化とかそういったことはハナから頭にない。
0286デフォルトの名無しさんNGNG
対象プラットフォームの挙動や仕様があらかじめ決まってる、
静的な世界のことしか考えてない人たちがライブラリ設計しちゃイカンと思う
0287デフォルトの名無しさんNGNG
仕様が流動的に変化するプラットフォームなんてあったらまともに追従する事は不可能ですがなにか。
0288デフォルトの名無しさんNGNG
スレが伸びてると思ったら、バカが一匹沸いて必死に自演してたのか
0289デフォルトの名無しさんNGNG
>>285
そういうことだね。
C++使って書かれsocketプログラムというのを何個かみたことがあるけどありゃC++じゃねぇ。
0290デフォルトの名無しさんNGNG
クラスというより名前空間でソケット汎用関数を用意するイメージの方が近いかもね。
0291デフォルトの名無しさんNGNG
プラットフォーム依存をなくすための抽象化を
なんでそこまで張り切るのかが分からん
ガチガチに作っても、OSのパッチひとつでダメになるのは目に見えてるのに
その例がjavaのsocket。

抽象化の工数はもっと意義のあるところに使おうぜ。
0292デフォルトの名無しさんNGNG
>>289 そういうことならOOスレもスレ違いだな。初心者スレあたりが妥当だと思うよ。
0293デフォルトの名無しさんNGNG
>>291
不必要なところまで低レベルな機能を提供しなけりゃいい。
socketなんてクラスはsocketそのまんまだし(.NETも然り)
0294デフォルトの名無しさんNGNG
>>290
結局そこに行き着くと思うんだがなあ・・・

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

この程度で抽象化なんてほざいてたらイタいが。
0295デフォルトの名無しさんNGNG
>>293
javaのsocketの歴史を見ると笑えるよ。
だんだん低レベルなメソッドが追加されてくの。

NIOではとうとう分離しちゃったけどな。つまるところ、破綻。
0296デフォルトの名無しさんNGNG
サーバ上で動くことを求められるJavaが初心者用socketクラスだけで事足りるわけがない。
0297デフォルトの名無しさんNGNG
初心者用ソケットクラス作って満足してる人たちが大半なのに
0298デフォルトの名無しさんNGNG
>>295
> だんだん低レベルなメソッドが追加されてくの。

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

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

プラットフォームの違いを、型システムで扱えるのだが?
0299デフォルトの名無しさんNGNG
C++スレなんだからACEの話してくれないかな。
Javaなんてどうでもいいから。
0300デフォルトの名無しさんNGNG
>プラットフォームの違いを、型システムで扱えるのだが?

意味わからん。
覚えたての単語を使ってみようなんて思わなくていいから。
0301デフォルトの名無しさんNGNG
>>294
満足してるのはお前だけ。お前用のクラスは
class socket { public: int socket; };
だけで良いじゃん、どうせメンバ関数すべて標準関数へのスタブにするんだろうし。
0302デフォルトの名無しさんNGNG
>>301==クラス設計もできない池沼
0303デフォルトの名無しさんNGNG
そろそろいいんじゃない?どうせ折り合おうと思って無いでしょ?
考え方が違うんだろうし、無理に意見一致させる必要も無いし。
0304デフォルトの名無しさんNGNG
>>301は
ACEの設計が理解できない池沼
0305デフォルトの名無しさんNGNG
>>294みたいな単純な置換は、C++初心者の勉強にはちょうど良いかもしれんね。

実戦でやられると迷惑なだけだが。
0306デフォルトの名無しさんNGNG
C++はJavaを生み出すための単なる足がかり。
こんなクソ言語を使ってるダメプログラマは腹をくくって死ぬべきだ。
0307デフォルトの名無しさんNGNG
そーいうことが言いたい貴方に

【厨房】言語叩き討論スレッド【隔離】
http://pc5.2ch.net/test/read.cgi/tech/1064841627/
0308デフォルトの名無しさんNGNG
typedef aaa<bbb> ccc

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

どなかた、ご教授お願いします。
0309デフォルトの名無しさんNGNG
ただのテンプ(ry
0310デフォルトの名無しさんNGNG
>>309
それではさっぱりわかりません!!!!!
0311デフォルトの名無しさんNGNG
ただのテンプレ(ry
0312デフォルトの名無しさんNGNG
>typedef aaa<bbb> ccc

という定義などない
0313デフォルトの名無しさんNGNG
typedef basic_string<char> string;
のような宣言のことだろうな
0314デフォルトの名無しさんNGNG
><313あ、そうです。
0315デフォルトの名無しさんNGNG
まちがえました・・・
× ><313
○ >>313
0316デフォルトの名無しさんNGNG
CORBAの質問はここでOKですか?
0317デフォルトの名無しさんNGNG
だからテンプレー(ryだって言ってんだろが
0318デフォルトの名無しさんNGNG
>>317

テンプレーって何ですか?
0319デフォルトの名無しさんNGNG
テ○○○ートだってば
0320デフォルトの名無しさんNGNG
>>319
あ、テンプレートか。
なるほどね。
0321デフォルトの名無しさんNGNG
CORBAのCORBA::W_String_varって何?

std::stringからCORBA::W_String_varに変換する方法を教えてください。
0322デフォルトの名無しさんNGNG
質問なんですが、

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

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

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

こう書けってことですか?
それとも他に書き方があるんでしょうか?
0323デフォルトの名無しさんNGNG
DWORD Dw;
::GetFileSize(FHnd,&Dw);
じゃダメか?
0324デフォルトの名無しさんNGNG
>>323
できました!ドウモアリガトウ
0325デフォルトの名無しさんNGNG
>>322、324
出来ましたじゃねーよ
お前はCやめるか必死でポインタ勉強するのどちらかだろ
GetFileSizeとか書いてる場合じゃねーよ
0326デフォルトの名無しさんNGNG
こういうスレもあるでよ。
【初心者歓迎】C/C++室 Ver.8【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1091264964/
0327デフォルトの名無しさんNGNG
C++とOOPの基礎を習得しようとするにはどの本を買って真剣に読めばいいんですか?
0328デフォルトの名無しさんNGNG
自分のレベルにあった本をその都度読んでいけばいい。
0329デフォルトの名無しさんNGNG
しつもーん
class B
{
private:
~B() {}
};
class D: public B
{
//~D() {}
};
これがコンパイルを通ってしまうんだけど標準的にはどうなの?
ちなみに、コメントを解除するとちゃんとエラーになるんだけど。
0330デフォルトの名無しさんNGNG
コンパイラ名とバージョンをかかないと、情報小出し君といわれちゃうぞ
0331デフォルトの名無しさんNGNG
>>329
おそらく

D d;

と実際に変数を定義すると、その段階で D::~D() をコンパイラが作ろうとして
コンパイルエラーになるんじゃない?
0332329NGNG
>330
まあ悪名高き某VC6だけど、
タダのVC Toolkit 2003でも試したら、警告は出たけどコンパイルは通った。

>331
それならVC6でもエラーになったけど。
D *d = new D;
delete d;
この場合だと通ってしまいます。
0333デフォルトの名無しさんNGNG
CodeWarrior for Win ver.8.3でチェックしてみた。コメントを解除
せずともD d;の時点でコンパイルエラーになって通らない。
ポインタに書き換えてもコンパイルエラーになって通らない。
0334デフォルトの名無しさんNGNG
12.4 Destructorより
5
デストラクタが暗黙的に宣言されているクラスがinaccessibleな
デストラクタを持った基底クラスを持っている場合、プログラムは
不適格(ill-formed)である。

多分>>329は、D d;としてもD* d=new D;としても通らないのが正しい。
0335デフォルトの名無しさんNGNG
>>332
悪名高くないだろVC6。
何と比較して言ってんの?
0336デフォルトの名無しさんNGNG
テンプレート特殊化に対応してないコンパイラはたくさんあるけど、
forのスコープがあんなにひどいコンパイラはVC++6くらいだろ
0337デフォルトの名無しさんNGNG
けなすと玄人っぽいじゃないですか。
0338デフォルトの名無しさんNGNG
VC++6は出た当初は非常に抜きん出ていたけど、今となっては…
0339デフォルトの名無しさんNGNG
>>337
素人まるだしだからやめとけ
0340デフォルトの名無しさんNGNG
逆にVC++6を付属のSTLのままで使ってる香具師がいたら知りたいぜ。
0341デフォルトの名無しさんNGNG
例外すら投げられないしな
0342デフォルトの名無しさんNGNG
>340
呼んだ?
■ このスレッドは過去ログ倉庫に格納されています