C++相談室 part34
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNGだから仮想関数とは何かを勉強しなよ。
>176が好意的に書いてくれた丁寧なレスの内容なんて、
本読むなりサイトの記述をチェックすればすぐにわかること。
調べたけどわからなかったからここで聞いているんですなんて
いうのは却下だよ。それは自分の無能さを公に宣言するような
ものだからな。
0180デフォルトの名無しさん
NGNGそのクラスのprivateメソッドとするべきかどうかで迷ってます。
クラス宣言が見づらくなるという、つまらない理由で
単なるstatic関数としてのみ扱うのは横暴でしょうか
0181デフォルトの名無しさん
NGNG意味がわかりません。
もっと詳しく、読んで理解できる日本語で説明するか、コードで語ってください。
0182デフォルトの名無しさん
NGNG*.cppにstaticで書いてるってことね。
関数内で関数定義が出来ればいいんだろうけど、出来ないんだよね。
そういう場合、俺はstructのoperator()で擬似的に関数内関数にしてる。
0183デフォルトの名無しさん
NGNG> そういう場合、俺はstructのoperator()で擬似的に関数内関数にしてる。
不要なハックは感心しない。
0184180
NGNGそうです、すいません
モジュール内でstatic(=ローカル)な関数の意味でした
うーん、無理矢理、関数内関数っぽくしちゃうわけですか
元々、切り分ける意味が薄い関数なんですよね。
再帰や、ちょっとしたまとまった処理程度で。
確かに散らすよりは気分はいいかも…
早速試してみます、レスありがとうございました
0185デフォルトの名無しさん
NGNGそもそもprivate関数とモジュール内staticな関数の違いとして、
メンバにアクセスできる、できない、があるんだが。
0186デフォルトの名無しさん
NGNGSTLと同じ流儀なんだから標準的技法なんじゃないかと
0187デフォルトの名無しさん
NGNG謝るこたーない、static関数で合ってるよ
>>181はどこが分からなかったんだ
0188デフォルトの名無しさん
NGNG俺も一瞬そう解釈した。
0189デフォルトの名無しさん
NGNGnamespace {} で囲っちゃえば?
0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNGオナニー以外の何物でもない。
>>180
横暴というかアホ。
0192デフォルトの名無しさん
NGNG何のためにoperator()が使われているか理解してないんだね。
関数内関数(←全然違うw)を模倣するためじゃないことくらい分からないと。
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNGん?無名namespace使えばいいだろ。
0196デフォルトの名無しさん
NGNG0197デフォルトの名無しさん
NGNG0198デフォルトの名無しさん
NGNG確か、コンテナ内部で使われるんだっけ?
フォローお願い。
0199デフォルトの名無しさん
NGNGstatic関数に頼らないC++的な解決法とか・・・?
0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG逆だ
オーバーライドとオーバーロードの区別をしろ
ポリモフィズムを理解しろ
0202デフォルトの名無しさん
NGNG無理に「C++流」にせず、「C流」で構わない部分ってのもあるとは思う。
staticもそうだけど、stdioの関数群とかキャストとか。
0203デフォルトの名無しさん
NGNGうむ。漏れもそう思う。
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNGstringstream使えとか言われたら
俺絶対泣くし。
0206デフォルトの名無しさん
NGNGstdio.hとか、strstreamとか、リテラルからchar*への変換とかと同等。
0207ぼるじょあ ◆yBEncckFOU
NGNGdeprecated
【形】 《コ》〔仕様{しよう}などが〕廃止{はいし}される可能性{かのう せい}がある、
廃止予定{はいし よてい}の、
将来{しょうらい}のサポートが保証{ほしょう}されない(ので使用{しよう}すべきでない)、
0208153
NGNGどうもありがとうございます。
>>168
ポリモフィズムの時のデストラクタのように、
試してみるだけでは気付かない事があるかも知れないと思って聞きました。
(ここで聞くより本やサイトで調べろって言われれば、そのとおりなんですけども)
皆様、ご迷惑おかけしました。
今度こそ、消えます。
0209デフォルトの名無しさん
NGNGだから「聞く」とか「本やサイトで調べる」とかじゃなくて、
その前に、自分でコード書いて実行すれば結果が分かるだろう?
っていう話をみんなしてる訳で・・・
0210デフォルトの名無しさん
NGNG>ポリモフィズムの時のデストラクタのように、
>試してみるだけでは気付かない事があるかも知れないと思って聞きました。
それこそ、試した方が簡単に、確実に、良くわかるだろ・・・
0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNGstatic関数よりも無名namespaceを使うべき、って聞いたことがあるんですけど、
(規格書にもそう書いてあった気がする。)
(1) なんでか知ってますか?
(2) みなさんはどっち使ってますか?
とりあえずワシは、規格書をもう一回読んできます。
0213デフォルトの名無しさん
NGNG同意。
まず試すことはとても重要。
でも、試して大丈夫だからといって安心してはだめ。
質問するときは
「こういう目的のために、こういうコードを書いてみました。試したら上手く動きました。でも正しいか不安です。教えてくれ。」
って感じでよろしく。
0214デフォルトの名無しさん
NGNG1. deprecated
2. neither
0215デフォルトの名無しさん
NGNG質問する側は相手からうまく情報を引き出すコツを身につけるべきだ。
相手の為ではなく自分の為にな。
0217デフォルトの名無しさん
NGNGstaticは使う場所によって意味が幾つにも分かれてしまう(のでわかりにくいと言われている)から減らすため
0218デフォルトの名無しさん
NGNGへえ。そんな理由だったんだ。
だったら、なんでクラスメンバにstaticなんてキーワードをあてたんだろう。
矛盾してるよね。
0219デフォルトの名無しさん
NGNGstaticというキーワードに複数の意味を持たせる事で
実際に混乱してるからね。
でも、絶対に「非推奨」が「不可」にはならないと思うけどね。
Cが無くならない限り。
むしろ(単語の意味はともかく)、staticメンバのするために、
既存の「static」というキーワードを利用したのが混乱の原因なんだから。
関数内staticな変数だって
C++がマルチスレッドを前提とした言語にならない限り
無くなることはないだろうし。
0220デフォルトの名無しさん
NGNGfile local = static
ってのは、staticって単語の誤用だからでしょ。
infinite existence = static
に統一したんでしょ。
>>219
> 関数内staticな変数だって
> C++がマルチスレッドを前提とした言語にならない限り
> 無くなることはないだろうし。
そんなことはないです。
マルチスレッドだってstaticなlock変数は極めて有効です。
0221デフォルトの名無しさん
NGNG> 相手からうまく情報を引き出すコツ
2chで一番有効なのは、
その場の人間達を小馬鹿にするような口調で間違った主張を披露して、
知識をひけらかすことに命を賭けてる厨が「正解」を携えて突っ込んでくるのを
待つって戦法ですね :-)
0222デフォルトの名無しさん
NGNG0223デフォルトの名無しさん
NGNGextern宣言は関数スコープでもファイルスコープでも同じように書けるのに
infinite existence変数の記法は関数内外で違う書き方が推奨されるってのがね。
違うのはスコープ(可視性)だけで、寿命その他は同じなのに。
(初期化タイミングは違うけど、「スコープが初めて有効になった時に初期化される」という意味では同じ)
0224デフォルトの名無しさん
NGNGクラスメンバと infinite existence って違う概念のような気がするなあ。
グローバル変数だって infinite だし。だからグローバルな static関数/変数は非推奨にしたって考えればいいのかな。
マルチスレッドで使うstaticなlock変数と、auto変数じゃないstatic変数って別ものじゃないかなあ。
再入可能性の制御ってこと?
0225デフォルトの名無しさん
NGNGstd::や#include <c...>あたりから、なんとなく
Cとの互換性(というよりCしか知らない人の移行しやすさ)を軽視する方向のような気もしてるけど
それならそれで仕方ないかなって気もするし。
0226デフォルトの名無しさん
NGNGオート変数へのstatic qualifierが「変更する」のは、
寿命でしょ。スコープは変えないよ。
qualifierの行う変更について、
static: 寿命
extern: スコープ(defaultだから基本的に意味なし)
と統一したんでしょ。
で、名前のスコープはnamespace使えと。
> 違うのはスコープ(可視性)だけで、寿命その他は同じなのに。
はとんちんかん。
グローバル変数の元から持っている性質とオート変数の
static qualifierが変えた性質が同じだからって何だって言うの?
0227デフォルトの名無しさん
NGNG> クラスメンバと infinite existence って違う概念のような気がするなあ。
infinite existence: クラスメンバの性質の一つ
オブジェクトが存在しなくても存在し続けるメンバ。
staticなオート変数が関数実行中でないときも存在するのと同じ。
後半については何言いたいのかサパリ
0228デフォルトの名無しさん
NGNG>寿命でしょ。スコープは変えないよ。
なにわけわかんないこと言ってるの?
auto変数は常にauto変数であって、決してstaticではないよ。
関数スコープのローカル変数に、autoとstaticの2種類があるだけ。
0229デフォルトの名無しさん
NGNG要するに、
「いろんなタイプの変数や関数が存在するけど、とりあえず寿命がinfiniteなものに付けるキーワードはstaticでいいや」
って標準化委員会が考えたってことだね。
変なのぉ〜とは思うけど、まぁ理解はできる。
0230デフォルトの名無しさん
NGNGプログラムの中でソケットを扱うのですけど、Cでは直接socket()等のシステム
コールを叩きますよね。
でもC++でそれをやるとC++らしくなくなる気がします。
特にselect/pollで多重化して非ブロックにして…、なんてのをやると
「オブジェクトは何所行った?」って感じがするんですよね。
そこで聞きたいのですが、みなさんはC++でネットワーク関連のプログラム
を書くときどういう設計にしますか。sourceforge.netで調べていたら
cppsocketというソケットのクラスラッパがあったりするので
そういうのをみなさんも使用(または自作)しているのかなと想像しているのですが。
ソケット周辺だけでなく、どうもC++を書いているとどこでシステムコールの
ような低レベルインターフェースを叩くか迷うんです。理想と現実というか…。
0231デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNGhttp://www.cs.wustl.edu/~schmidt/ACE.html
http://www.boost.org/
0233デフォルトの名無しさん
NGNG所詮通信路でしかないんだから、そこはそれで割り切って、
オブジェクトのシリアライズ経路のひとつとして考えたほうがいいと思う
0234デフォルトの名無しさん
NGNGhttp://www.kegel.com/dkftpbench/doc/Poller.html
0235デフォルトの名無しさん
NGNGレスありがとうございます。
ACEってのは気になるますね。
サイトの方に文章が大量にあるので、いまから読んでみます。
本も出てるみたいですね。
一方で無理にオブジェクト化すると標準入出力と同列に扱えなかったり
するんですよね。
>>232, 234さんらはやはりその手のライブラリを使うのでしょうか?
いろいろ考えてるとソケット自体をオブジェクトにするのでは無くて、
もっと上位のクラスを作って、その中で生のソケットを扱うのが良いのかなぁ、と。
例えばHTTPServerやFTPClientのようなクラスを用意して、その中で
プロトコルとソケットを管理するような感じ。
結局Socketクラスを作っても
Socket sock;
sock.setsockopt(HOGEHOGE);
sock.bind(Foobar);
みたいなことをやり始めると結局やってることはC流とは変わらないし。
0236230
NGNG0237デフォルトの名無しさん
NGNG0238230
NGNGデストラクタでソケットを閉じるということですか?
ソケットを閉じるときって結構デリケートな処理が必要になったりしますよね。
相手の為にできるだけ早く閉じたかったりすることも。
あ、そういうことをクラス内に隠蔽すると嬉しいという話か。
非同期IOなんかも隠蔽出来るとうれしいかな。
その場合select/poll等の関数は誰が保持しますか?
>>234のような専用クラス?
0239デフォルトの名無しさん
NGNG環境依存にしてスレ違い。
専用スレ逝ってください。
ネットワークプログラミング相談室 Port10
ttp://pc5.2ch.net/test/read.cgi/tech/1090385857/
0240デフォルトの名無しさん
NGNG黙れ。ここはCスレじゃないんだからそんなことにこだわるな。
0241デフォルトの名無しさん
NGNG0242デフォルトの名無しさん
NGNGいやいや、そうでもない。
特にサーバアプリの場合、完全に環境依存。
ちょっとやそっとのことで汎用的なラップをできるものじゃない。
0243242
NGNGメンバ変数に直接アクセス出来るようにしておく事をお奨めする。
デストラクタ機能はあくまでオマケ感覚のつもりで。
0244デフォルトの名無しさん
NGNG死んどけや
0245デフォルトの名無しさん
NGNG0246デフォルトの名無しさん
NGNGそうか?
プラットフォーム、実装が複数ある中では異例の成功だと思うけども。
0247242
NGNGなぜに死すべしや?
ついでに書くと、ソケットハンドルをいつでもAttach/Detachできるようにしないとかなりツライ。
デストラクタ処理がかえって邪魔になる事もあるからね。
0248デフォルトの名無しさん
NGNG0249デフォルトの名無しさん
NGNGまさか。あんなのtoy programでしか使わないよ
0250デフォルトの名無しさん
NGNG0251マイク ◆yrBrqfF1Ew
NGNGQtのSignal/Slotでいい感じじゃねえか。
0252デフォルトの名無しさん
NGNGなりません、まだ使われる可能性があるのにインスタンスを破棄するアホでもないかぎり。
0254デフォルトの名無しさん
NGNG0255デフォルトの名無しさん
NGNGタコ助だな
0256デフォルトの名無しさん
NGNG生のソケットを渡したりするから、生ソケットにアクセスする手段は
必要だって。完全なカプセル化じゃなくFacadeと考えた方がいい。
0257デフォルトの名無しさん
NGNGsetsockoptし忘れて・・・なんてことが
環境依存で起こりまくりですよもう
0258デフォルトの名無しさん
NGNG>>255
通信プログラム初心者は黙ってた方がいいね。
0259デフォルトの名無しさん
NGNG#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あとsignalも
0261デフォルトの名無しさん
NGNG#include <cstdlib>
0262デフォルトの名無しさん
NGNG必死でググりながら調べてるのかな?
勤勉で結構。
0263デフォルトの名無しさん
NGNG再インストールでしょうか。。。
0264デフォルトの名無しさん
NGNG0265デフォルトの名無しさん
NGNG0266デフォルトの名無しさん
NGNG> 環境依存部をラップする事が不可能って断言
具体的にどのレス?
0267デフォルトの名無しさん
NGNG0268デフォルトの名無しさん
NGNGそんなこと稀だし、ドキュメントに不備あるし、
OSのverupやパッチで動作変わったりするし
だから結局 >>256 のいうような形になると思うんだ
想像がつかない奴もいるようだが
0269デフォルトの名無しさん
NGNGだからカプセル化するんじゃねーのか?
つうかメンバ変数に直アクセス出来るようにしとくってギャグか?
0270デフォルトの名無しさん
NGNG>>269は、ソケットプログラム作ったことないの?
0271デフォルトの名無しさん
NGNG> メンバ関数でやれることは、限りなく「お約束」処理だけだよ。
んなわきゃない。
俺はネットわープログラミングは専門外のゲーム屋だが、メンバ変数を
直接触らせるような設計にはしてないぞ。機種固有のメンバ関数を定義
することはあるが。
実務経験があるから偉いってわけじゃなし、「ソケットプログラム作った
ことないの?」なんていわずに、もすこし具体的な指摘をしとけ。
あとネットワークの話に絞りたいなら、スレ違いだから続きは
よそで頼む。
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGラッピングの目的にもよるような気がしてきたなあ
javaやmfcみたいな、大勢向けのフレームワークなのか、
ちょっとした共通化を施したいだけの話なのか・・・
>>269
> だからカプセル化するんじゃねーのか?
仕様が決まればカプセル化できるのはアタリマエのような・・・
(と別のスレで似たことを書いたな)
>>270
ゲーム屋はそこで動けば済む話だから楽だよね。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG> ヒントをいうと、あまりカプセル化しすぎないこと。
> メンバ変数に直接アクセス出来るようにしておく事をお奨めする。
> デストラクタ機能はあくまでオマケ感覚のつもりで。
このくらい低い目標を持った方がいいということ。無理はいかん。
0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNGお約束なるものをコードで表現するのがクラスでありメンバ関数では?
約束(仕様)に沿って提供する機能(メンバ関数)を設けて、
その実装(内部仕様)は外部から見えなくするというのがクラスではないかと。
お約束以外にいろいろできるようにするというなら、そもそもクラスを使う
意義がなくなるような気がするんです。
メンバ変数を外部から操作できてしまうと、メンバ関数の動作において
状態を把握・管理できかねる状況が生じませんか?
なんでもありにするなら、最初からクラスにせず、普通にCのライブラリのように
直接的に使うほうが楽な気もします。
■ このスレッドは過去ログ倉庫に格納されています