- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/
- 809 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:02:47 ]
- CUIでのゲームプログラムを作ろうと思ってるんですが、
保存したデータ内容の編集はCの標準ライブラリのみで出来るのでしょうか。 追記は出来ても一部分のみ書き換えや削除等の方法が分からなくて。
- 810 名前:809 mailto:sage [2007/11/22(木) 02:04:00 ]
- 説明不足でした。
ファイル処理の話です。
- 811 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:06:36 ]
- C以外でやった方が楽だし早いんじゃね?
- 812 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:08:50 ]
- >>809
ファイルの途中への挿入や削除は標準関数ではできない。 サイズが変わらないなら、方法はある。
- 813 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:09:58 ]
- >>811
仰るとおりですが、まだ授業でCの勉強しかしてなくて。 javaも独学で勉強してるもののいまいちピンと来ないんですよ…。
- 814 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:12:26 ]
- >>812
書き換えや削除するとサイズが変わってしまうのでは? もし宜しければ参考のためにご教示願えますか。
- 815 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:12:50 ]
- テキスト操作したいならPerlとかPHPでいいんでない?
CとかJavaよりよっぽど楽に扱えるし、新しく勉強するに してももそれほど時間かからないと思うよ
- 816 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:18:22 ]
- ファイルがそこまで大きくないなら起動時に一気にすべて読み込み、終了時に新規に出力しなおすとかじゃだめ?
- 817 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:18:59 ]
- // >>814
// for Example. #include <stdio.h> int main() { FILE * fp = fopen("foo", "w"); fprintf(fp, "a\nb\nc\n"); fclose(fp); fp = fopen("foo", "r+"); fscanf(fp, "%*s"); fprintf(fp, "B\n"); fclose(fp); return 0; }
- 818 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:29:42 ]
- >>815
暇潰しにする程度なので、新たに勉強する気力がなくて…。 基本的に学校のPCでしてるので環境がないのもあるんですが。 >>816 その方法が一番確実そうですね。 内容はユーザ情報とスコアランキングくらいなので。 >>817 無知で申し訳ないんですが、%*sってどういう意味でしょうか。 *はワイルドカードって事ですか? あと試しにコンパイル実行してみましたが特に変化が分からなかったです…。
- 819 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:37:26 ]
- >>803
> wgtinit(w,s1,inival,flag) /*initialize random weight matrix*/ wgtinit関数に引数w, s1, inival, flagを渡して呼び出す、という意味。 セミコロンがあるはずだが、写し忘れか? こういうのはキーボードでタイプし直したりせず、コピペしような。 > drawrest(xps+50,50,200,200,yellow) > line(xp,250,xp,yp,white,0,0) この2つも同様に、drawrestやlineという名前の関数を呼び出している。
- 820 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:38:12 ]
- >>807
ダイアログに表示されたメッセージの内容を理解せずにYesやOkを押すような人は、 プログラムを書くのに向いてない。やめたほうがいい。
- 821 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:40:51 ]
- >>818
気力がなかったら、暇潰しで頭を使うようなことをせず、酒でも飲んで寝てたらどうよ。 > 無知で申し訳ないんですが、%*sってどういう意味でしょうか。 読み飛ばす・・・だったような。 こういうのは覚えておくものではなく、都度scanfのリファレンスで確認刷るものだよ。
- 822 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:14:43 ]
- >>818
知らないことは調べるだけの話。 それをする気がないのは「無知」ではなく「無気力」。 刻苦を厭う怠惰は人を虎に変えてしまうのだよ。
- 823 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:51:59 ]
- 怠惰には、
無気力な怠惰 = メンドクサイから、何もやらない と、 前向きな怠惰 = メンドクサイことをしなくても良いように努力・工夫する がある。
- 824 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 19:50:07 ]
- 本当に怠惰な人間ならこんな便所の落書きに長文書いていつ来るとも知れぬ無責任な名無しの回答を待つ前に
さっさとグーグル先生でも聞いて済ますと思う
- 825 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:19:04 ]
- *は代入抑止文字ですか。
変数に格納されないって事ですね。 ご迷惑おかけしました。
- 826 名前:807 mailto:sage [2007/11/22(木) 21:43:11 ]
- すみません。実行できました
VBではよくプログラムをしてるんですがCの勝手がわからなくって。 まだよく分からないのですが、 SDKとかDXライブラリとかの設定をしてなかったから見たいです 出力に DxLib.exe': 'なんとかかんとか' を読み込みました。必要な DBG ファイルが見つからないか、開けません。 等など沢山でているのは大丈夫でしょうか?
- 827 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:51:04 ]
- >>826
「何が」大丈夫なのか否かを知りたいの?
- 828 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:38:53 ]
- >>827
すみません プログラムが変な動作をしたりしないのか、とか バグじゃないのか、とか プログラムに問題があるというメッセージなのか、それとも これらのメッセージが出ているのは普通で問題はないのか そういう意味です なんだかVBと全然違うんですね
- 829 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:44:39 ]
- >>828
> プログラムが変な動作をしたりしないのか 基本的には、しない > バグじゃないのか 基本的には、バグではない > プログラムに問題があるというメッセージなのか 基本的には、違う > これらのメッセージが出ているのは普通で問題はないのか 基本的には、普通で問題ない デバッグのための情報がないので、シンボルデバッグできないぞ、というメッセージ。
- 830 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:45:37 ]
- 自分が作ったクラスを入れるlistをsortするため、operator<を定義してるんですが詰まっています。
class Data{ int x; int y; public: Data(int a = 0, int b = 0){ x = a, y = b }; int getx(){ return x; }; bool operator<(const Data&); }; bool Data::operator<(const Data& obj){ return x < obj.getx(); } const Dataのobjからgetx()を呼び出しているせいか(?)、以下のコンパイルエラーが出ます。 passing `const Data' as `this' argument of `int Data::getx()' discards qualifiers getx()はxを変更しないのに、objをconstにしたらダメなのでしょうか?
- 831 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:55:52 ]
- >>830
int getx() const { return x;}
- 832 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:04:43 ]
- >>831
ありがとうございます。 const int getx()は試したんですけどねぇ。 この辺ややこしくなってるので勉強し直します。
- 833 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:58:10 ]
- >>829
本当に親切に答えてくださってどうもありがとうございます。 凄く助かったし安心しました。 これからもっと精進して頑張ってゲームを作ります。
- 834 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 05:31:13 ]
- 8bit以外のchar型の処理環境ってどんなのがあるの?
- 835 名前:デフォルトの名無しさん [2007/11/23(金) 15:12:38 ]
- #include <iostream>
using namespace std; class Base { public: static int m_iVal; void SetValue(int val) { m_iVal = val; } void Show() { cout << "m_iVal: " << m_iVal << endl; } }; class Hoge1 : public Base{ }; class Hoge2 : public Base{ }; int Base::m_iVal = 0; void main() { Hoge1 hoge1; Hoge2 hoge2; hoge1.SetValue( 100 ); hoge2.Show(); } このプログラムで hoge2.m_iVal = 100 となるんですが よかったでしょうかね? 確認のためですけど
- 836 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:48:08 ]
- >>834
ttp://ja.wikipedia.org/wiki/ACOS-6
- 837 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:48:32 ]
- 良い。
- 838 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:55:53 ]
- charは少なくとも8ビットじゃなかったか?
あーsizeofが1になることが定義されてるだけだっけか
- 839 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:58:11 ]
- RISCだと、longからcharまで全部32bitってのがあるんじゃね?
- 840 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 16:15:40 ]
- 確かに規格上 char ≦ short ≦ int ≦ long だから全部同じサイズでも許されるな
- 841 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 17:00:18 ]
- >>838
char は1バイト、1バイトが何ビットかって? そんなこと、好きに決めて良いよ
- 842 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 17:09:35 ]
- >>838
少なくとも8ビットだよ。
- 843 名前:デフォルトの名無しさん [2007/11/23(金) 17:31:57 ]
- 初心者ですが、質問です。
#include <stdio.h> int main (void) { int i = 1000, j = 40, k = 3000; printf ("iが%dで、\njが%dで、\nkが%dです。\n",i,j,k); return 0; } こう書いた場合はエラーにならないのに、こうする↓と、 printf ("iが%dで、\n jが%dで、\n kが%dです。\n",i,j,k); 構文エラー : ')' が、識別子 'jが' の前に必要です。 と言われて、コンパイルでエラーになってしまいます。 C言語では、;を文末をみなすため、どこに改行を入れてもいいと聞いていたのですが、 入れる位置が決まっているのでしょうか?環境は Visual C++ 2005 Express Edition です。
- 844 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 17:38:55 ]
- printf ("iが%dで、\n"
"jが%dで、\n" "kが%dです。\n",i,j,k);
- 845 名前:デフォルトの名無しさん [2007/11/23(金) 17:45:07 ]
- >>844
実行されました! printfの""の中だと改行するには一度"で終わらせてあげないといけないんですね。 ありがとうございました。
- 846 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:08:01 ]
- >>845
printfに限らず、文字列は1行ごとに""で終ってないといけない。
- 847 名前:デフォルトの名無しさん [2007/11/23(金) 18:14:05 ]
- プログラムの初心者ですがSQLを書いていますが、C言語と似てると
思いますので、わかる範囲で答えて頂けると助かります 以下のようなプログラムを書いたのですが、パソコンに複数のメールが 送られてきます。 メール送ったら終了のように直したいのですが、 どのようにしたら良いでしょうか if ((fasterLWMAnow > slowerLWMAnow) && (fasterLWMAprevious < slowerLWMAprevious) && (fasterLWMAafter > slowerLWMAafter)) { CrossUp[i] = Low[i] - Range*0.5; Alert(Symbol(), " hit "); SendMail("Mail Alert", Symbol()+" hitdesu ");
- 848 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:22:20 ]
- >>847
――これは、新しい釣りですね…。
- 849 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:26:58 ]
- >>847
100どんだけぇを軽く超えてるよ
- 850 名前:デフォルトの名無しさん [2007/11/23(金) 18:32:18 ]
- すいません。まじめに質問したつもりですが、何がいけなかったでしょうか?
- 851 名前:デフォルトの名無しさん [2007/11/23(金) 19:05:38 ]
- >>846
分かりやすく教えていただき、ありがとうございました!
- 852 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 19:18:01 ]
- >>847
そうなっていたんですか! 疑問が解決してすっきりしました、ありがとうございます!!
- 853 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:01:54 ]
- C++ってCと比べてどれだけ遅いのですか?
- 854 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:05:15 ]
- 午後のこーだの作者曰く話しにならんぐらいとのこと
- 855 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:11:12 ]
- そりゃ
午後は アセンブラァばりばり
- 856 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:40:08 ]
- ただし、一般的には機能を使おうとすればそれに応じてオーバーヘッドがかかるようになる。
Cと全く同じコードを書けば、Cと全く同じ速度にはなる。 まずはアセンブリ出力を見比べてみたり、実測することから始めようか。
- 857 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:02:16 ]
- >>853
昔は、コンパイラが生成するコードがC++の場合は遅く、 同じことをするにしてもCで書いたほうが速かったのだろう。 C++で書いたコードを、手作業でCに変換しても、 速度的には大して変化しないと思うよ。 すべてのクラスにvtableを持たせるようなことをしなければ、ね。
- 858 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:09:20 ]
- Cの範囲で書いていたら、C++としてコンパイルしても、生成されるコードは同じだよ。昔から。
- 859 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:28:17 ]
- 一歩C++の領域に踏み入ると劇的に変わるけどね
デストラクタ一つで激変
- 860 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:30:12 ]
- C++ は参照とかインライン関数とかテンプレートとか駆使したら、
C と同じ速度でより安全なプログラムが書けると思う。
- 861 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:32:01 ]
- std::sortは比較操作がインライン展開できるから、
qsortよりも速くなりやすいなんてのは有名だよね。
- 862 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:35:56 ]
- そうそう。
まあ、qsort をマクロ化すれば C でも速いの書けるんだろうけど。
- 863 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:36:29 ]
- C++は例外に備えないといけないので
Cと同じコードを吐ける場面は少ない
- 864 名前:デフォルトの名無しさん [2007/11/23(金) 22:37:14 ]
- テンプレートとか、STLとかどのくらい手間掛けているか不明なやつ使うと鈍くなる
charやintを直接あやつる範囲ではアセンブラに匹敵する
- 865 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:40:22 ]
- アセンブリ言語っつっても、
速いコード書くノウハウ無かったら コンパイラの最適化の方が速かったりするもんな。
- 866 名前:デフォルトの名無しさん [2007/11/23(金) 22:59:52 ]
- とりあえず初心者が動かせる3Dライブラリを開発しますか
- 867 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:08:38 ]
- >>859
それは、 不必要にデストラクタをvirtualにする という愚をやらかしているだけだろ。 >>863 それはどこの何というコンパイラ? 例外をthrowする、throwされたものをcatchする、それにはコストは要するが、 例外中立なコードにはオーバーヘッドかからないと思うが。
- 868 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:10:33 ]
- catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない
さっきg++で試してみた virtualかどうかは関係ない
- 869 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:10:35 ]
- デストラクタから virtual を外すのは
どうしても必要な時だけにするのが無難だべ。
- 870 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:17:58 ]
- 逆だろ? 仮想関数を使う必要がある時だけ付けるよな。
- 871 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:19:40 ]
- 馬鹿が飛びつくつまらない話が出てきちゃった
- 872 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:22:00 ]
- あとから仮想関数が必要になった時に付け忘れても知らんべ。
- 873 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:24:00 ]
- JavaやC#みたいに継承禁止ができたら、安心してvirtualをはずせるけど。
- 874 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:24:09 ]
- 使われ方によって、virtualをつける必要があったりなかったりするC++は糞言語。
- 875 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:29:11 ]
- final/sealed 欲しいよなあ。
Final ですってコメントつけて非仮想デストラクタにすることはあるけど、 コメントだけじゃ心もとないよな。
- 876 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:31:57 ]
- クラス設計時点で継承の有無はわかるだろ。
あとから必要になったら、その時点で必要な修正を行えばいいと思うが。
- 877 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:33:10 ]
- C++しか知らないと、そういう物の考え方するんだ
- 878 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:33:54 ]
- うん
- 879 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:35:06 ]
- そういう意味で言うと、後から必要になったときでも修正の必要がないように、
デストラクタは必ずvirtualで、っていうのも、あながち間違った選択ではないと思える。
- 880 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:35:29 ]
- 一体誰がどう使うクラスの設計してるんだ?
- 881 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:36:14 ]
- とりあえず virtual を付けとけば、
どういう変更が必要になろうが何の心配も要らない。 virtual を付けてないと、後の変更でバグを発生させる可能性がある。 その変更を行うのが自分とは限らないわけで、 どっかのバカが変な事をするかもしれない。 そう考えると、デストラクタを非仮想にするのは、 よほど非仮想にするメリットがある場合じゃないと怖くてできない。
- 882 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:37:33 ]
- C++って、そういう本質的でないところにも気を使わせるのが、糞言語たる所以だね。
- 883 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:38:31 ]
- 速度やデータサイズは本質的な問題だよ。
- 884 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:39:30 ]
- じゃ、Javaなんてとてもじゃないが使えないってわけだ。
- 885 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:39:57 ]
- そこが本質的な問題になることがあるから。
- 886 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:41:02 ]
- 速度やデータサイズを気にする必要があれば
Java なんてとてもじゃないが使えないってわけだよ。 気にする必要がないなら使えばいい。
- 887 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:42:07 ]
- 道具は選んで使うべきだ
- 888 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:42:50 ]
- Cで書けばいいのに(^^
- 889 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:13:35 ]
- >>868
> catchしなくても例外が通り抜けるときにデストラクタを呼ばないといけない 当たり前だろ。 正常にreturnする時にもデストラクタは呼ばれるのだから、 それは、例外のオーバーヘッドとは言わないだろう。 >>869 それなら、virtual なんて書かずとも全てがvirtual で、 nonvirtual などと書いたものだけがvirtual でなくなる、 そういう言語仕様になるだろうに。
- 890 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:15:24 ]
- >>889
色々とお話しにならない。
- 891 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:19:11 ]
- >>872
それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。 >>873 継承できないようにするハックはあるけど、まぁ、オススメしないわな。 もっと別の方法で、管理すべきだろうな。 >>874 使い方によって、だろ。 キャストしたポインタでdeleteするような使い方をする側が、 デストラクタがvirtualであることを確認し、そうでなければ、 継承するのではなくメンバに持つように実装すべきなんだ。
- 892 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:21:26 ]
- >>890
具体的に
- 893 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:21:33 ]
- >>891
> それをもってして、C++は実行時オーバーヘッドが大きな言語だと言われてもなぁ。 別にそんなこと言っとらんわ。
- 894 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:22:58 ]
- >>891
> 継承できないようにするハックはあるけど、まぁ、オススメしないわな。 何か特殊なクラスを継承して、結局仮想関数が必要だったような気がする。
- 895 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:25:12 ]
- C++が糞言語であることには、誰も異論はないだろう。
使っている道具を糞だと言っているだけで、 それを使う人間が糞だと言っているわけでもないのに。 C++が糞言語だと言われて顔を真っ赤にするのは、 Stroustrupだけで、いいんじゃないか。
- 896 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:26:07 ]
- >>893
話の流れを無視した独り言だったのか。
- 897 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:26:23 ]
- >>889
下記の f と h のコンパイル結果を比べてみるといい struct S { ~S(); }; int g(); int f() { S s; g(); return 0; } int h() { S s; return 0; }
- 898 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:28:39 ]
- そういう言語仕様になるだろうにとか言われても、
今実際にそうなってないんだから、そういう事言っても無駄だよな・・・。
- 899 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:32:50 ]
- >>894
ttp://article.gmane.org/gmane.comp.lib.boost.devel/101260 これかな。 それなりのコンパイラなら、 vtableは作られるが、使われないので、リンカによって削除されるだろう。
- 900 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:35:05 ]
- >>898
そういう言語仕様になっていない ということは、 というのが言語仕様を決めた人達は、 基本的にvirtual で例外的にvirtualではなくする というポリシーではなかった、ということだね。 互換性のために、そういうポリシーだという可能性もあるが。
- 901 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:36:20 ]
- >>899
あ、別に仮想関数は要らんかったか。
- 902 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:37:39 ]
- >>900
デストラクタはデフォで virtual な方がいいけど、 他の関数は virtual がデフォである場合も nonvirtual がデフォである場合も 一長一短なので何とも言えない。
- 903 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:46:09 ]
- >900
Stroustrupに聞いてみ、と言おうと思ったら、本人のページに書いてあったわ。 www.research.att.com/~bs/bs_faq2.html#virtual 「多くのクラスは、基底クラスとして使われるように設計されないから」だって。 基底クラスは、「基底クラス」と意識して最初から設計しろ、ってことか。
- 904 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:47:20 ]
- 仮想関数が1つでもあれば自動的にデストラクタもデフォで仮想関数になってくれればいいのにね。
- 905 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:55:29 ]
- >>904
virtualなメンバ関数があるからといって、virtualなデストラクタが必要とは限らないしなぁ。 結局、どのようにdeleteするのかは、そのクラスを使う人が決めることだから。 使う人が決めることなのに、作る人が決めないといけないのは変だがね・・・。
- 906 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:18:27 ]
- >>897
何が言いたいのか理解した。 ~S()の呼び出しコードがhでは1個なのに対して、fでは2個になるってことか。 たしかにコードサイズは肥大するが、正常系のルートの実行速度には影響しないだろう。 ちなみに、 struct S { ~S(); }; というのは、 struct S { ~S() throw() ; }; とすべきだろうな。 デストラクタで例外をthrowしちゃいかんよ。 実行速度のために例外を(部分的に)使わないという選択もC++では可能だぞ。 int g() ; を int g() throw() ; とすれば、f()やh()内では例外のためのコードが生成されない。
- 907 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:21:06 ]
- 結局、C++は遅い と言っている人は、
Cと同じことをするコードをC++で書いて遅いと言っているのではなく、 Cよりも複雑なことをするコードをC++で書いて遅いと言っているわけだ。
- 908 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:30:37 ]
- >>907
少なくとも自分はそう言ってる で、Cよりも複雑なことをしないのは難しい まあ、Cとしてコンパイルできるコードを書けばいいだけだけど
- 909 名前:デフォルトの名無しさん [2007/11/24(土) 01:42:10 ]
- stlとか複雑な機能を簡単にするやつを使うとCで書いた方が速い
たとえばstringなどは確保したときにサイズは確保されない もし文字列の最大長が分かっていればchar[]で取っておいた方が速い
|

|