1 :
デフォルトの名無しさん :
05/01/24 09:49:52
STLつかうと一気に実行ファイルサイズが10倍に?!
>>9 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
>>10 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
>>11 #include <stdafx.h>
後氏ね。
>>12 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
14 :
デフォルトの名無しさん :05/01/24 13:16:43
ageておくか 個人的に技術系スレで【】は勘弁
重複?
?
C++Templateスレあたりで、STL関係をC++相談室に統合って話になったんじゃなかったか。
déjà vu?
20 :
デフォルトの名無しさん :05/01/24 15:16:25
C++(STL含む)相談室 とか?
或いは38スレの伝統を守って C++相談室(STL含む) part39 とか。
STLに関しては、スレタイに含めず
>>1 に書けば十分な気もするけどな。
どのみちtemplateスレもstlじゃ引っかからないんだし。
stl単体でスレ立てるバカがいるから明記しないと駄目
24 :
デフォルトの名無しさん :05/01/26 21:58:08
このコードがコンパイルとおらない理由がどうしてもわからんです。 class point{ private: int x; int y; public: point(int a,int b){x = a; y = b;} virtual void show(); }; void point::show() { cout << "x:" << x << endl; cout << "y:" << y << endl; } class 3Dpoint:public point{ private: int z; public: 3Dpoint(int a,int b,int c):point(a,b){z = c;} void show(); }; void 3Dpoint::show() { cout << "x:" << x << endl; cout << "y:" << y << endl; cout << "z:" << z << endl; }
>>24 3Dpoint ←数字で始まる識別子は許されない。
>>24 あと、基底クラスのメンバをprivateにしているが、これだと派生クラスからアクセスできない。
protectedにすべき。
27 :
デフォルトの名無しさん :05/01/26 22:14:31
28 :
デフォルトの名無しさん :05/01/27 09:52:58
News 2005-01-26: The C++ Standard Library Issues List (Revision 34) is available
test
test
C++で、RS232からデータを得て、このデータでxファイルの3d画像が動かせたい(
例え:車3d画像)、サンプル source code がございませんか?
教えて頂ければ、幸いです。有難う。
Email:
[email protected]
>>24 なんでエラーメッセージを読まないのか知りたい。
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); でリークチェックしたんですが、ファイル名、行番号が表示されない。 どなたか原因分かる方いらっしゃいませんでしょうか。 リーク情報は表示されますがファイル名、行番号のみが表示されません。 #define CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> の順で記述してます。 _CrtSetDbgFlagマクロは、プログラムエントリポイント始めに記述。 VC++スレが無いのでここで質問させて頂きました。
俺の目はドーナツだ。
質問etc.の後に "Thank you." みたいな語句をつけるのは 日本以外では共通なのかな。 私は英語とタイ語ぐらいしか分からないけど
test
test
41 :
デフォルトの名無しさん :05/03/04 01:54:21
42 :
デフォルトの名無しさん :05/03/04 02:18:41
さぁ、みなさんあったまってきたところで テキストファイルの一行の処理1024バイトについて。
向こうのスレでも書いたけど、1024と言う数字は兎も角1行全部読み切らなくていい応用ならfgets()もありジャマイカ。 1行全部読みきる必要があるならそれなりに処理しなければいけないのは言うまでもないとして。 私のところでは、設定ファイルみたいなものを処理するときには1行200バイト以内という前提で書くことが多い。 あー、そう言えば1024なんて仮定はしたことないな。その長さのテキストファイルを想定するなら素直に全部読みきる対処するから。
見えない人のためにもう一度age
でもistream + getline の組み合わせでいいんじゃないの? fgets使う意味でもさ。
v(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)vv(^・^)v
>>43 状況によるんじゃ。
テキストファイル 「全般」 に対して処理することが要求されるなら、
一行の文字数によって、無条件に読めない部分があってはならない。
プログラムのconfigファイルを処理したいなら、そのconfigファイルの仕様によって変わる。
configファイルでは(おそらくコンソールの横幅との歴史的関係で)一行80文字くらいにすることが多い。
この場合は1024文字でも(あるいは256文字でも)差し支えないだろう。
最も、configファイルに限定するなら、boost::program_optionsの使用を検討した方が良いかもしれない。
付け加えるなら、行という概念で扱うより、XMLなど行依存のないフォーマットを採用するのも手だ。
クラスのコンストラクタあたりに
class X {
const size_t size_;
public:
X(const size_t& size = 1024) : size_(size) {};
};
とデフォルト値を忍ばせる手もあるのかな。スマートじゃないな。
前スレのダライアス継承をテンプレに入れるべき
50 :
938 :05/03/04 11:26:44
ダライアス継承: A B C /\ /\ /\ D E F G | | | | H .I. J K \/ \/ \/ L M N /\ /\ /\ O P Q R \ | × | / S T \/ U
fgetsつかうと一気に行サイズが1024バイトに?!
>>50 利用用途を考えて見たが、
A B
/\ /\
D E F
まずここから用途が無い
getlineも文字数を引数で指定できるよね? つまり、一行読むのに可変長で読むか固定長で読むかは C++の範囲で選択できるんじゃないの? C言語の関数使う必要ない気もする。 streamにしとけば、いろいろSTLの恩恵受けられる可能性あるしさ。
>>53 std::istream::getlineは選べるが、std::stringに文字列を格納するstd::getlineは文字数を指定できない。
百戦錬磨の尾舞らに聞くが Windowsのc++コンパイラでコンパイル時間が一番速いのってどれよ?gcc?やっぱVCのcl?
Windowsのコンパイラとは? Windowsにコンパイラがバンドルされているとは聞いたことがないのだが。 コンパイル時間が速いとは? 時間が速いと言う概念は理解しかねるのだが。 #俺の時間は速いがお前の時間は遅いとでも言うのかな?
質問者が質問者なら回答者も回答者だな
百戦錬磨じゃ全然無いけど、使ったことのある中では コンパイル開始からビルドが終わるまでにかかる時間はbccが速かった。 ただしbccはnamespaceやtemplate周りがイマイチ。最適化もイマイチ。 そもそも漏れはtemplate厨なのでビルド時間はデフォルトで長いのと 言語の標準サポート具合や最適化の質のが重要なファクタなので Win32/64環境で動作するC++コンパイラのビルドに要する時間は気にしない方がいいんじゃ。 Boostに書いてあったコンパイラリスト↓ * GNU C++ 2.95.x, 3.0.x, 3.1.x, 3.2 * Comeau C++ 4.2.45.2 * SGI MIPSpro 7.3.0 * Intel C++ 5.0, 6.0 * Compaq's cxx 6.2 * Microsoft Visual C++ 6.0, 7.0 * Borland C++ 5.5.1 * Sun WorkShop 6 update 2 C++ 5.3 * Metrowerks CodeWarrior 8.1
こうなったらCOBOLでも使うしかないな。
>>44 >その長さのテキストファイルを想定するなら素直に全部読みきる対処するから。
全部読みきる時点で素直ではないでしょ。
単に、チョー長い行を扱う場面に遭遇しなかっただけだと思う。
普通は弾く。自分の想定外の長さは弾いてこそ、安全なわけで。
>>44 ・・・スマン。文章よく読んでなかった。吊ってくる。
まー、別にどの関数使おうが、どんなポリシーで処理しようが何でも構わないとは思うが。仕様に沿ってれば。 どんな入力がくるか分からない、ということを想定する程度には、どんな仕様があるか分からない、 ということも想定するべきではないか? その意味で 1024 超えは想定(゚听)イラネ には釈然としないものを感じる。
> 仕様に沿ってれば。 これが全てだろう。 で、どんな仕様が良いのかって話が別に存在するんだろうて。
型定義と変数定義をいっきにやっちゃう書き方をtemplateな型でもやりたいのですがうまくいきません struct aaa{ void f(){} } a; template<class T>struct bbb{ void f(){} } <int> b; int main() { a.f(); b.f(); return 0; }
>>64 クラステンプレート使う意味がないジャン。
あるよ
>>64 これはだめ?
template<class T>struct bbb{void f(){}static bbb x;};
template<class T>bbb bbb::x;
int main()
{
bbb<int>::x.f();
}
2行目しくじった。 template<class T>bbb<T> bbb<T>::x;
71 :
デフォルトの名無しさん :05/03/05 18:16:21
// ここ の部分は、規定クラスのコンストラクタだけを 使いたいのですが、こうやって空関数を作らないと、コンパイルが通りません。 何か、空関数を使わないで、コンパイルを通す方法無いでしょうか?(VC6) class CAa { public: CAa() {printf("bone aa\n"); } CAa(string s) {printf("bone(%s)\n", s); } virtual void print() = 0; }; class CMona : public CAa { void print() { printf("mona\n"); } public: CMona(string s) {} // ここ }; class CGiko : public CAa { void print() { printf("giko\n"); } public: CGiko(string s) {} // ここ }; void main() { string s = "hage"; CMona mona(s); CGiko giko(s); CAa* pAa; pAa = &mona; pAa->print(); }
>>71 コンストラクタは継承されない。
よって、省略できない。
>>72 デフォのコンストラクタは継承されるのに?
>>73 継承されるわけではなくて、自動生成されると考えた方が分かりやすいと思う。
struct base {base(){}};
struct derived : public base{};
の場合、derivedのデフォルトコンストラクタが次のように生成される。
struct derived : public base { derived(){}};
で、これはbaseのコンストラクタを明示的に呼び出していないから、
baseのデフォルトコンストラクタが使われる。
struct derived : public base {derived() : base() {}};
結果的に、継承されたように見える。
言い忘れたけど、明示的に書かれたコンストラクタが一つでもある場合、
デフォルトコンストラクタは自動生成されない。
たとえば、
>>71 の例でCMonaにデフォルトコンストラクタはない。
このことからも、デフォルトコンストラクタが継承されないと分かると思う。
77 :
332 :05/03/06 03:48:20
virtualについてなんだが、 ・仮想関数=上書きされちゃう関数 ・仮想継承=共用されちゃうクラス ・仮想デストラクタ=派生デストラクタも呼ぶデストラクタ という事になるよな? 一貫して無くないか?皆はどうやってこの紛らわしい物を納得してるんだ。
同じ名前に異なるセマンティックを与えるのが C++流。static とかもそうだな。
キーワードをむやみに増やせなかったという事情があるらしい 純粋仮想関数の =0; ってのもなかなか苦しいよな
まぁその辺のなぜなにに関してはC++ D&Eを読め、となるわけだが。
C++使うケースだとOO使わないでtemplateにしちゃうんだよね。 C#みたいに気持ちよくOOできないし
標準C++のどの規格に準拠しているかは__cplusplusマクロで知ることができますが 使用しているコンパイラが何か(マニファクチャとバージョン)を識別するマクロが 掲載されているところを知りませんか?
83 :
デフォルトの名無しさん :05/03/06 09:40:48
typename みたいな藁もあるな・・・
>>81 > C++使うケースだとOO使わないでtemplateにしちゃうんだよね。
それだとコンパイル時に確定しない動的バインディング使えないじゃん。
ありえんよ。
>>84 でも、コンパイル時にできることはコンパイル時にやっちゃおう、って気にはなる。
86 :
デフォルトの名無しさん :05/03/06 13:01:40
別に virtual なんて必ずしも使わなくたってオブジェクトを作ることを指向するプログラミングはやればできるさ
>>86 その手の極論を言うなら、アセンブリ言語でも OO できる、というところに辿り着く。
なんか詭弁のガイドライン通りの展開でアレだが。
88 :
デフォルトの名無しさん :05/03/06 15:41:03
アセンブラでOOは現に色んな分野でやってることで極論でも詭弁でもないぜ
要するに、OOPとOOP言語は違うってことだ。C++とVC++くらい違う。
つまりあれか 毛の生えた女と生える前の女くらいのさ。
・どちらも女じゃないか ・毛が生えているからこそ女だ ・毛の生えていない女しか無理だ ・実は毛のない方が好きだが、生えていても問題なく行える <- 俺は、この辺 ・どちらも駄目だ
C++とVC++は、別に大差ないだろ。 毛の生えた女と生える前の女は、雲泥の差だがな(・∀・)
>>77 virtualな継承・・・・ 一度だけ菱形継承するためにやった
いまは反省している
シンプル伊豆ベスト
95 :
332 :05/03/06 21:48:56
>>94 「遠出するよりも近場で済ませてしまおう」
98 :
デフォルトの名無しさん :05/03/07 21:00:40
>>97 全然外道じゃない。そういう考え方もある。
基本クラスからの継承より融合の方がイイ
>>91 毛が生えていれば剃ればいいじゃない
マリーアントワネット
毛が嫌なら、ょぅι゛ょとつきあえばいいじゃない マリー
C++が嫌ならJAVAを使えばいいじゃない
>>102 全然外道じゃない。そういう考え方もある。
マリーは101くらい無茶じゃないとな
105 :
デフォルトの名無しさん :05/03/09 09:10:06
メモリの管理に関して質問です. ↓のように STL の map に値を格納した場合,pair のメモリの解放は どのように行えば良いのでしょうか? hmap->insert(new pair<hoge, int>(new hoge(), 0)); 「new hoge()」の方は以下のコードでクリア出来るのは分かるのですが,pair の方はどうすれば良いのか分からず困っています. for (typename hoge_map::const_iterator i = hmap->begin(); i != hmap->end(); i++) { delete i->second; } アドバイスお願いします.
typename? pairへのポインタを格納してるなら、delete *iでいけるべ。
hpair = new pair<hoge, int>(new hoge(), 0); hmap->insert(hpair); delete hpair; でいけました. (念のため,memset で hpair を上書きした後も hmap を通じてアクセス出来ることも確認しました.) delete *i はダメみたいです. あと,もとのコードでは typename つけないと implicit declaration とかい うエラーが出てました.gcc v3.3.5 です.
>>109 boost::shared_ptrでも使ったら?
>>106 std::mapにはstd::pairを格納するわけだが、そのポインタをinsertするって?
ポインタでなかったとして、std::map<hoge*, int>なのにi->secondをdeleteって?
delete i->first;の間違いだったとして、std::mapのkeyを変更するって?
deleteするくせにconst_iteratorって?
うーん、どうやってコンパイル通してるんだ(?_?)
あ、そうかmapならpairをそのまま格納してるはずだよな いったいなぜpairをnewで生成する必要がある?根本的に間違っている。
>>106 何もかもnewしようとしているところを見ると、もしかして君は普段
JAVAをやってるんじゃないか?ソースをさらした方が何をしたい
のかも分かるし、それに対してC++ではどういう風にソースを書く
のかも示される可能性が高いぞ。
115 :
デフォルトの名無しさん :05/03/09 23:49:34
ワラタ
>>114 BCBもnew多用する罠。(Delphi型クラスはnewでしか生成できない)
あ,たしかにいろいろ変になってますね.要点だけ切り出そうとして,意味不明になってました. 本当はこんな感じです.(まだおかしなところがあるかも) fbpair = new pair<foo , bar>(new foo(), new bar()); fbmap->insert(*fbpair); delete fbpair; > いったいなぜpairをnewで生成する必要がある?根本的に間違っている。 ある関数から,pair<foo , bar> * を返して,それを map に格納してるからそういう構成にしてます. pair<foo , bar> だと NULL が返せないので,いまのところ,ポインタを使ってます.また, pair<foo , bar> hbpair(new foo(), new bar()); return &hbpair; とかだと,return した直後に hbpair がなくなるのでダメですよね?NULL 使 わずに例外を使え,ていう話もあるかもしれませんが,NULL を返すのはそれほ ど例外的な状況ではないので出来れば避けたいです. > 何もかもnewしようとしているところを見ると、もしかして君は普段 > AVAをやってるんじゃないか?ソースをさらした方が何をしたい > のかも分かるし、それに対してC++ではどういう風にソースを書く > のかも示される可能性が高いぞ。 はい,その通りです.構文としては理解できても,new しないオブジェクトと いうのがどうにも自分のなかで整理できてくて困ってます.
>>118 map::insert()の仕様をよく読むのが先決。
>いうのがどうにも自分のなかで整理できてくて困ってます. 落ち着け。さもなくばもっと注意深くあれ。
>>121 君のやりたいことは次で事足りる。むやみにnewを使うな。
std::pair<foo, bar> make_foo_bar()
{
return std::make_pair(foo(), bar());
}
int main()
{
std::map<foo, bar> fbmap;
fbpair = make_foo_bar();
fbmap.insert(fbpair);
}
>>121 というか1からC++の勉強をしなおせ。そもそもメモリについて理解してない。
なんかチョコチョコ間違ったから、通るソースを。 #include <map> #include <utility> struct foo{int x;};struct bar{}; bool operator<(const foo& a, const foo& b){return a.x < b.x;} std::pair<foo, bar> make_foo_bar() { return std::make_pair(foo(), bar()); } int main() { std::map<foo, bar> fbmap; std::pair<foo, bar> fbpair = make_foo_bar(); fbmap.insert(fbpair); }
STLについて理解したからった本くらい買え。 2ch上で教えてもらおうなんて虫が良すぎる。
どなたか、
>>106 さんに
「知ってるが、お前の態度が気に入らない」
のAAおながいします。
>>118 多分お前はJavaすらまともに理解してない。
そんな状態でC++をやったら混乱してさらにひどいことになるぞ。というかなってる。
STLのコンテナのsetについて教えてください。 setにはinsertするためのメンバ関数が2つ ありますよね。値のみを指定するものと、 ヒントとなる位置を反復子で一緒に渡すものと。 で、setはユニークでなくてはならないので、挿入失敗 のケースがあるかと思います。前者のメンバ関数だと pair型が帰ってきてbool値で成功失敗が判断できますが 後者のメンバ関数の戻り値は反復子だけですよね? なぜ後者は成功失敗のフラグを返さないのでしょうか?
std::pair<foo, bar> make_foo_bar() { return std::make_pair(foo(), bar()); } 情報不足ですみません.これだと,make_foo_bar() から NULL を返せないので, ダメなんですが.元のコードは以下のようになってます. std::pair<foo, bar> *hbpair; while ((hbpair = make_foo_bar_p()) != NULL) { hbmap.insert(*hbpair); delete hbpair; } そもそも C++ ではこういった書き方はしないものなんでしょうか?
>>130 悪いことはいわんからC++の入門書100回読み返せ。
>>130 deleteしてどうする。
どう考えても筋悪すぎ。
ここまで理解力のない香具師は久しぶりだな。 C++やりたいんだったら入門書一冊くらいは 読めっつーの。
; 稚拙な質問につきあって頂きありがとうございます. つまり,C++ では(普通)そういった書き方はしない,ということで良いでしょうか? >> 130 std::pair<foo, bar> *hbpair; while ((hbpair = make_foo_bar_p()) != NULL) { hbmap.insert(*hbpair); memset(hbpair, 'a', sizeof(std::pair<foo, bar>)); delete hbpair; } のようにしても,後から hbmap の中身に問題なくアクセス出来たんで, delete しても問題ないと思ったんですが,違うのでしょうか? すぐ delete するなら new するな,というのは分かるんですが,それだと make_foo_bar_p() から NULL 返せないのでどうしたものかと. 手元に プログラミング言語 C++ あるんで,大体どのあたりが参考になりそう か教えて頂けないでしょうか?
ごめん、漏れ入門書読まずにC++やってるよ。 初めて半年経ってからEffectiveC++は読んだけど。
センスがないだけかと。 勉強しても身に付かないよ、きっと。 C++ とか、言語どうこうじゃない。
>>135 それは読んでるっていうだろ
ってわざとか?
>>137 いやぁ、昔から入門と名のつくものは読まないもんで。
EffectiveC++も読んで驚いたよ。半年試行錯誤したことがみんな書いてあったから。
それから半年経つからそろそろ何か読もうと思ってるところ。
うーん,センスうんぬんの話が出るということはもしかして std::map<foo *, bar *> fbmap; foo *f; bar *b; while (make_foo_bar_x(&f, &b)) { hbmap.insert(std::pair(f, b)); } のようにしろ,ってことですか?
というかその程度の操作ならポインタは一切不要だ
リファレンス使ってことでしょうか?
・キーfooと値barのペアを返す関数make_foo_barを作成したい。 ・make_foo_barが返す値はいつでも有効というわけではない。そのため、返り値が有効かどうか確かめる手段が必要。 ・有効な値だった場合、そのペアをmapに挿入したい ・無効な返り値は結構な頻度で発生するため、例外は使えない ということですか?
>> 142 はい,その通りです.
>>139 への補足なんですが,ああいった感じで処理すると pair の中身がむき出しになってしまって,
情報隠匿の点からいってちょっと気持ち悪く感じるのですが,C++ ではそこは
我慢するものなんでしょうか?
>>144 たぶんあなたはJavaもわかっていない。
Cからやり直せ。あとオブジェクト指向について勉強しろ。
無礼な初心者を散々叩いているところ恐縮だが、
誰も
>>122 ,124に突っ込まないのか?
>>144 >ああいった感じで処理すると pair の中身がむき出しになってしまって,
>情報隠匿の点からいってちょっと気持ち悪く感じるのですが,
それならそもそもmapは使うな。
foo*, bar*をメンバにもつ十分隠蔽されたクラスを定義して
それをsetなりvectorなりに格納汁。
ともかくC++以前にヴァカ過ぎ。
>>124 もさることながら、
map::insert()の引数渡し時にstd::make_pair()の利用を推奨する
愚劣な解説書の存在も問題だな。
・・・ま、俺も持ってるんだけどね、その解説書。
>>144 書いた直後に typdef とか使えばいいじゃん,ということに気づきました.
なんかつっこまれそうなんで,補足. 他にも,いろいろとやりようはあるでしょうけど,手軽にやるなら typdedef ってことで.
>>149 typedefで何をどうするのか説明きぼんぬ
>>139 ポインタをキーにするってか。
つか、挿入できたかどうか見ないなら
hbmap[f] = b;
でいいじゃんか。態々 pair 使わずとも。
> ポインタをキーにするってか。 あー,なるほど.入門書よめっていわれてた理由が分かりました.ありがとうございます. 現段階では,map に入れた後は,iterator を通してしかアクセスしてなかった ので,ダメダメだということに気づけませんでした. > つか、挿入できたかどうか見ないなら > hbmap[f] = b; > でいいじゃんか。態々 pair 使わずとも。 いわれてみればそうですね.
>> 144
で
> ああいった感じで処理すると pair の中身がむき出しになってしまって,
といったのは誤りで,
> ああいった感じで処理すると pair の定義がむき出しになってしまって,
の方が正しかったです.つまり,どの型とどの型の pair かがむき出しになっているという意味です.
pair で使う型変えたときに,make_foo_bar の宣言も書き換えるの面倒じゃん,ってことです.
なので
>>149 で typedef の話が出てきてます.
さらに補足, map や pair の方は当たり前のように typdef してますです. 変なこといってすみません.
鮮やかにスルーされそうなので、誰かお答えいただけませんか? それとも設計者にしかわからないことなんでしょうかね。
>>156 他のコンテナとインターフェースを合わせるため。
挿入に失敗=すでに同じ項目があった
だから、特別に失敗をチェックする理由が無いなら
問題にはならない。
レスどうもです。 統一のためですか。 でもまぁ引数1つだけのバージョン使えばいいだけですよね。 挿入のヒントになる反復子ってのもよくわからないし。
iteratorを取るinsertがないとinserterとか使えなくて不便だぞ。
でもsetやmapは常にソートの基準にしたがってソート状態を 自動的に保とうとしますよね?内部構造は木構造のようですが。 ということは挿入位置は自動的に決まるわけなんですが、 それでもヒントになるiteratorを与えるとすこし速くなるとか なんでしょうか。ヒントっていってもいまいちピンとこないですが。
辞書引くときに2分探索すればある程度の効率はでるが、頭文字とかで大体の位置がわかってればもっと早く引けるだろ?
>>160 自分でset風のものを実装してみるとわかるけど、何かの初期化などで沢山の
ものを挿入したいときのために、N個の追加を O(N^2)とか O(N log)N ではなく
O(N log log N)程度で実行するための手段を用意したくなるのは人の常。
・・・あとでメンテが面倒になって、インタフェイスだけのこって実装はタダの
O(N log N)の挿入に変更されてしまう、というのもありがちだけど。
>>162 車輪を再発明した人たちが必ず通過する。
お前だけじゃない。安心汁。涙
>>163 それは、若いほどダメージが少ないw
若い頃にSTLみたいなのをまねして作るのは良いこと。
年食ったら無駄な時間
ということは、ヒントの位置の意味は、検索はそこ以降からするって ことにできるってことですか?じゃ、ヒントの位置が先の位置だったら 遅くなるのですか?
とりあえずVC++7.1の実装だとヒントのすぐ前後が正解じゃない場合はヒント無視してるが。
>>165 2分木風の構造に対する要素の追加ってのは、
a. 追加するべき位置を探す処理
b. 追加する処理
c. 追加した後の木の構造を適当に保つ処理
からなるわけだけど、初期化や以前に保存したファイルからの読み込みなどで
大量追加したい場合、「昇順に追加するから a は省略できんか」と思うでしょ?
そのためのヒントですよ。
分けることにより、ラベル付けしてるだけ
つまり、どの位置のヒントが有効かは 実装に依存してるってことですか?
ぎゃははは、いやスマンソ。
>>169 実際のトコは昇順か降順に前回のinsertが返してきた iter をヒントにしてinsertすると効率が良い、
ってことだと思ってるけど。ランダムな要素を追加していくならヒントは使えない、と。
173 :
デフォルトの名無しさん :05/03/12 22:36:18
うんこ
>>173 クソレスしてんじゃねぇ知的障害。
おまえどうせ無職だろw
175 :
デフォルトの名無しさん :05/03/12 22:39:43
ちんこ
>>175 クソレスしてんじゃねぇ痴女。
おまえどうせ無職だろw
177 :
デフォルトの名無しさん :05/03/12 22:55:38
222.150.31.107はキモヲタです 死んで下さい
178 :
デフォルトの名無しさん :05/03/12 23:01:55
同性愛系のスレでは、ウザイ女のことをまんこって呼ぶんだよ。
179 :
デフォルトの名無しさん :05/03/12 23:08:13
教えて下さい。 class A と class B があったとして、 class A { class B ...................... } 上記のように、class A の中に class B と書くのは どういう意味でしょうか? 関連のときは、B *b 集約のときは、B b と書くのはわかりますが。。
>>179 インターフェイスは公開されているが
実装は完全に隠蔽したいケースかな。
AbstractFactoryで使うことが多いかな。
181 :
デフォルトの名無しさん :05/03/12 23:21:40
池沼?
名前を外に見せる必要がないってことだね
そうじゃないだろ
184 :
デフォルトの名無しさん :05/03/12 23:39:37
馬鹿ばっかり
手取り足取りお・し・え・て・あ・げない
186 :
デフォルトの名無しさん :05/03/12 23:45:13
182 が正解
馬鹿じゃないの? 見えちゃうけど、Bって言うのはAを使う人にも見えてるYO
188 :
デフォルトの名無しさん :05/03/12 23:51:14
あー、そりゃすまん private は可視性制御ではなくアクセス制御だな確かに
どっちでもいいよ
皆さん、どうもありがとうございます。 名前を外に見せる必要がないと言われても、よくわからないです。。 すみません、もう少し詳しく書くと、 class A { class B; ..................... vector < B *> b;. } vector で関連を定義しているのに、さらにclass B と書く意味が わからないのですが。
名前空間的には namespace A { class B { /* ・・・ */ }; } と同じだよね?
>>190 前方宣言。
Bというクラスがありますよ、とコンパイラに知らせてる。
普通はBをincludeするんだけど、それができない理由があるんだろ。
>>192 どうもありがとうございます。納得がいきました。
194 :
デフォルトの名無しさん :05/03/13 00:06:03
API(HTML含む)で質問です。 任意のURLをブラウザ(IE)で表示させるときに、ShellExecuteを使用しています。 ShellExecute(Handle, "open", URL, NULL, NULL, SW_SHOWNORMAL); 上記だと、リンクするたびに同じIEウインドウ上に表示されてしまいます。 これを別のウインドウに表示させる方法はありますか? 具体的にイメージしているのはHTMLのtargetタグのようなコントロールです。 よろしくお願い致します。
マルチここにもいたのか
環境に依存しているのでわかりません
よく分からない現象に悩んでいます。知恵をかして頂けないでしょうか? gcc で分割コンパイルを行うと、a.cpp で throw runtime_error("あいうえお"); みたいに投げた例外を、b.cpp で try { } catch(exception &ex) { cerr << "Error: " << ex.what() << endl; } として catch すると ex.what() の中身が St9exception になってしまいます。 何が問題なのでしょうか? a.cpp で catch した場合は正しく「あいうえお」となります。 以下の用にして確認しました。 } catch(exception &ex) { cerr << "Error: " << ex.what() << endl; throw ex; }
199 :
デフォルトの名無しさん :05/03/13 04:27:58
http://www.open-std.org/jtc1/sc22/wg21/ News 2005-03-11: The C++ Standard Library Issues List (Revision 35) is available
News 2005-03-11: C++ Standard Core Language Issues List (Revision 34) is available
>198 throw ex; → throw;
201 :
デフォルトの名無しさん :05/03/13 21:00:57
みなさん、auto_ptrってどのくらい使ってますか? メンバ変数をコンストラクタで初期化中に例外が発生すると、 デストラクタが発動しない。だからスマートポインタを使え・・・ ってのはよく聞きますが、実際どのくらい使われているのかと思って。
202 :
デフォルトの名無しさん :05/03/13 21:06:58
>>201 あんまり使わない
欲しい機能がいちいち保証外だから
203 :
デフォルトの名無しさん :05/03/13 21:15:45
>>201 俺はよく使うかな。
でもコンストラクタ中での例外に対処するために使うことはない。
bad_alloc以外が発生しそうな処理はコンストラクタに含めないようにしてる。
>>202 保証外の欲しい機能って何?
不完全型によるインスタンス化ができないのは痛いと思ってるけど、
ほかにもあれば教えて。
>>203 メンバやベースクラスの初期化時に bad_alloc が発生したらどう対処してんの?
その基準じゃ、結局 auto_ptr 相当の必要性に変わりが無いんじゃない?
205 :
デフォルトの名無しさん :05/03/13 21:34:58
コンテナに使えない
^^^^^^^^^^^
STLのcontainerに使えない(Effective STL Item 8)。
コンテナに入らないのが理由で auto_ptr 使わないって、アホか。 コンテナに入らないから参照型も使いませんってか?
std::auto_ptr は割と使えるぞ 何より標準で入ってるってのがでかい
教えてください。 クラスを作るときに、コンストラクタを1つも定義しなかった場合、 そのオブジェクトを作るときに何もしないデフォルトコンストラクタが 呼び出されるのかと認識していたのですが、とある本には、コンストラクタを 1つも定義しない場合は、コンストラクタが呼び出されないという表現になって いました。動きとしては変わらないですが、どちらが正解なんでしょうか? てっきりデフォルトコンストラクタを自分で定義することは、オーバーライド することだと思ってましたが、デフォルトコンストラクタを定義せずに他の コンストラクタを定義した時点で、デフォルトコンストラクタが使えなくなる という点では、ちょっと異質ですよねぇ。
>>210 「何もしないデフォルトコンストラクタが呼び出される」が正解。
だがデフォルトコンストラクタを自分で定義することは、
ちょっと異質な点があることからわかるように、オーバーライドすることではない。
>>210 その「とある本」の題名を晒した後、焼き払え。
レスどうもです。 そうですか、やはりコンストラクタはいかなるときも呼び出される わけですね。 ちなみに読んだ本は「C++ Primer」ですが、翻訳本ですし、自分の とり方が間違った可能性もあるので、もう一度読み返してみます。 今は手元にないですが・・・。
次のようなクラスcomplexを定義したとします(§11.3[Stroustrup, 1997])。 class complex { T re, im; public: complex& operator+=(complex a) { re += a.re; im += a.im; return *this; }; // ... }; この定義で、complex a, b; a += b;といったコードが書けるようになります。 このクラスに、例えばdouble型の値を加算する、double d; a += d;を実現するには complex& operator+=(double a) { re += a; return *this; }; をメンバに追加します。 ここで、double型に限らず、T型とのoperator+=が定義されている任意の型との加算を 実現するには、 template<class T> complex& operator+=(T a) { re += a; return *this; }; と書きたくなります。ところが、これではテンプレートのTがcomplexを含んでしまうため、 template<> complex& operator+=<complex>(complex a); と特殊化を定義します。が、これはコンパイルが通りません、、 このように、「complex型(自分自身)」の場合と、それ以外の型の場合とで処理を分けるには どう書けば良いのでしょうか。
>>214 「complex型(自分自身)」の場合を非templateで宣言して、
それ以外の型の場合に使われるtemplateを宣言したのではダメですか?
>>214 コンパイルが通りませんって、エラーメッセージくらい貼れよ。
>>214 書き写しミスでしたので訂正します。
- T re, im;
+ double re, im;
const complex& aのようにリファレンス使えといった点は、単純化のため考えないとしてください。
>>216 main.cpp:42: error: explicit specialization in non-namespace scope `class complex'
main.cpp:42: error: invalid use of undefined type `class complex'
main.cpp:37: error: forward declaration of `class complex'
main.cpp:42: error: abstract declarator `complex&()(complex)' used as declaration
main.cpp:42: error: syntax error before `{' token
main.cpp:44: error: syntax error before `+=' token
main.cpp:47: error: syntax error before `}' token
main.cpp: In member function `complex& complex::operator+=(T) [with T = complex]':
main.cpp:54: instantiated from here
main.cpp:41: error: no match for 'operator+=' in 'this->complex::re += a'
37: class complex {
38: double re, im;
39: public:
40: complex() : re(0), im(0) { };
41: template<class T> complex& operator+=(T a) { re += a; return *this; };
42: template<> complex& operator+=<complex>(complex a) {
43: re += a.re;
44: im += a.im;
45: return *this;
46: };
47: };
>>215 その場合、template<class T> 〜operator+=(T a)の定義はインスタンス化は行われないのですか?
つまり、コンパイラは、正確に一致する場合(§7.4[禿3rd]の[1])と、それ以外とを識別するので
テンプレートの特殊化を使わなくてもいいということですか?
次のコードはコンパイルが通り、望み通りの動きをします:
complex& operator+=(complex a) { re += a.re; im += a.im; return *this; };
template<class T> complex& operator+=(T a) { re += a; return *this; };
それ以前になぜ引数でconst 参照渡しをしないの? コピーコンストラクタの大量発生が起きない?
DLLで、スレッド + newでメモリ確保したとする。 ・複数のプログラムからそれぞれDLLがロードされたら 1.スレッドもメモリも共有される 2.そんなバナナ ・同じプログラムから複数回DLLがロードされたら 1.スレッドもメモリも共有される 2.そんなバナナ
独り言はMeadowにでも書いてろボケが
>>220 上:2(やろうと思えばメモリの共有は出来る)
下:1
同一プロセスなのかどうかが分かれ目。
>>219 実際には const 参照渡しすべきですが、
>>217 で書いたとおり、単純化のためと考えてください。
>>218 調べ直したところ、「§13.3.2 関数テンプレートの多重定義」[禿3rd]に
多重定義解決規則が載っていました。疑問は晴れました。
例(これも引数は本来const T&とすべきです):
class complex {
double re, im;
public:
complex() : re(0.0), im(0.0) { };
complex(double a, double b) : re(a), im(b) { };
virtual complex& operator+=(complex a) { re += a.re; im += a.im; return *this; };
template<class T> complex& operator+=(T a) { re += a; return *this; };
};
これを使い、
complex a(5.0, 3.0), b(2.0, 4.0); double d = 10.0;
a += b; // ok, 多重定義解決規則[4]適用
a += d; // ok, T=double
complexを継承した場合、すなわち
class dcomplex : public complex {
public:
friend class complex;
dcomplex(double a, double b) : complex(a, b) {};
};
の場合の挙動について微妙に気になる点がありますが、それについてはもうちょっと整理します。
>>224 TlsAlloc()で取得したインデックスってどうやってスレッド毎に管理してるんだ?
呼び出しもとのスレッドから引数が渡されてるようにも見えんし、dllマネージャ
みたいのがいて、管理してんのかな。
つーか環境依存だし
質問です。setやmapってソートの基準を動的に変えることが可能ですよね? たとえばソートの基準の型(クラス)でMyCmpクラスをつくってですね、 MyCmp mcmp; set<int> iset(mcmp); のようにsetのコンストラクタ引数にソートの基準を定めるオブジェクトを わたしてやるという寸法です。このMyCmp自体は、コンストラクタ引数で なんらかの情報をうけとり、それによりソートの基準を変化させるように すれば、動的に基準を変えることができるかと思います。 MyCmp mcmp(MyCmp::desc); //クラス内でenum型{asc, desc}を定義 デフォルトはasc set<int> iset(mcmp); ここで思ったのは、一時オブジェクトわたせばいいのでは?ということでやってみると set<int> iset(MyCmp()); // ok set<int> iset(MyCmp(MyCmp::desc)); // エラー VC++.net ということになってしまいました。 もともと一時オブジェクトを渡すこと自体が、文法エラーなのでしょうか? それとも渡し方に問題があるのですかね。 あと、エラーメッセージが、関数がどうたらとわけわからんものでしたので、 もしや関数の宣言としてとられたりとか、そういうことなのでしょうか? ちなみにこれは「標準C++ライブラリ チュート&リファ」の内容を参考にした のですが、同書ではいったんオブジェクトを作成してましたね。 この問題は、どう考えればいいのでしょうか?
>setやmapってソートの基準を動的に変えることが可能ですよね? 不可能
基準の型そのものじゃなくて、基準の話ですよ?
あ、ちょっと訂正 set<int>じゃなくてset<int, MyCmp>ですかね。
コンテナの比較基準を変更した瞬間ソートの保証が壊れる。やるな阿呆
比較基準を変更というのは、あくまでsetのインスタンスを確保する 前の話ですよ?その前の段階でMyCmpオブジェクトの振る舞いを制御 するということですよ。一度setオブジェクト作ったら基準は変えませんよ。
それじゃ静的・・・
>227 要するに述語のインスタンスに(降順か昇順か等の)状態を持たせて, それをsetやmapに渡してソートの基準を制御しようとしているんですか? だとすると言えるのは以下です. -setやmapには述語のインスタンスを渡す方法は存在しない. テンプレート引数として渡すことができるだけ -そもそも述語に状態を持たせるのは基本的に避けるべき -set<int> iset(MyCmp());が通るのはいわゆる「最も奇妙な解析」の結果. 227さんが期待しているものとは全く異なる
動的という意味は、プログラムの実行時にという意味ですよ? setのインスタンスを確保する前段階で、MyCmpオブジェクトの パラメータを動的にいじり、振る舞いを変えることは可能ですよね? 動的の意味を、setの生存期間中にという意味にはき違えてるのでは? というかなぜ質問してる自分がレクチャーしてるのだろう・・・鬱
うひゃあ.すごい間違いしてしまった. >-setやmapには述語のインスタンスを渡す方法は存在しない. > テンプレート引数として渡すことができるだけ これ間違いです.すいません.
>set<int> iset(MyCmp(MyCmp::desc)); これが関数宣言として認識されているんじゃないですか? set<int> iset((MyCmp(MyCmp::desc))); としてみるとか.
> set<int> iset(MyCmp()); 「引数を取らずMyCmp型を返す関数」へのポインタを引数として取り、 set<int>型を返す関数isetの宣言ですな。
>>234 おお、ようやく本題に・・・w
MyCmp mcmp(MyCmp::desc); //クラス内でenum型{asc, desc}を定義 デフォルトはasc
set<int> iset(mcmp);
これは可能ですよね?というか、可能です。
setやmapのコンストラクタには、ソートの基準を引数として受け取るものがあるので。
これができるということを受けて、一時オブジェクトでは?という話です。
リロードしてから書き込もうよ。
Effective STL くらい嫁と言いたい
>>235 >>230 でいけるはず。
>>234 explicit set( const Compare& comp = Compare(),
const Allocator& allocator = Allocator() );
setのデフォルトコンストラクタは比較関数オブジェクトを引数にとるんだよ。
ただし一度生成されたsetの持つ比較関数オブジェクトの状態を変更する
ことは当然出来ないが、227氏はそれを承知しているみたいだ。
set<T, C> hoge(C(moge)); ならできるだろ? Cがmogeをコンストラクタ引数に取れる関数オブジェクトである必要があるが。
>>238 やっぱりそう解釈されてしまいますかね。
それを回避するテクニックで、
set<int, MyCmp> iset(MyCmp(MyCmp::desc));
において、コンストラクタの引数となっているMyCmp(MyCmp::desc)をさらにカッコで囲み
set<int, MyCmp> iset((MyCmp(MyCmp::desc)));
とやってもダメなようです。たとえ関数宣言の誤解を解いたとしても
一時オブジェクトを渡すのはだめなのでしょうかね。
>それを回避するテクニックで パラメータを括弧でかこってもダメだから問題になってるんあろ アホか
>>245 パラメータってなんのこと言ってるんですか?
>>245 パラメータを括弧でくくったら宣言としては不正だよ
>>227 VCはその初期化を関数宣言だとみなした上で文句を言っている。
確か、規格では、関数宣言として正しくなければ、
初期化として見直さなければいけないはずだから、これはVCが悪いと思う。
g++3.4.1(mingw)だと通ったし。
>244 いや,それで通らないのはおかしいです.一時オブジェクトを受け付けるはずです. 疑うとすればMyCmp::descあるいはMyCmpのコンストラクタかと.
ここらでエラーメッセージが知りたい
MyCmpのコンストラクタ、コピーコンストラクタ、operator()のどれかがまともじゃないに1カノッサ
くだらない解決策だけど、 std::set<int, my_cmp> s(my_cmp(static_cast<my_cmp::order>(my_cmp::desc))); (orderはdescの型)
>>227 cl ver13.10.3077でコレ通った。多重の括弧を除くと、insert()の行で
「isetが'overloaded-function'だ」と言うお叱りを受ける。
#include <set>
struct MyCmp
{
enum rule {asc, desc} r_;
MyCmp() : r_(asc) {}
MyCmp(rule r) : r_(r) {}
bool operator()(int x, int y)
{
return r_ == asc ? x < y : x > y;
}
};
int main()
{
std::set<int, MyCmp> iset((MyCmp(MyCmp::desc)));
iset.insert(3);
}
>>227 氏は
set<int,MyCmp> iset( MyCmp( MyCmp::desc ) );
set<int,MyCmp> iset( ( MyCmp( MyCmp::desc ) ) );
この2つでテストしてダメならエラーメッセージを提示してくれ。
上はともかく下は通るはずだ。
通らなかったら、MyCmpが怪しい。
g++では二重の括弧は要らなかった。念のため。
規格では
>>254 の上のやつでも規格上問題ないよね?
MyCmp::desc は変数名としても型としてもおかしいし
了解しました。 昨日実験してだめだったコードは、本から引っ張ってきたものですが 今、家ではないので正確にはわかりません。 帰宅してから、貼り付けます。夜になってしまうと思いますが。
Visual C++ .NET 2003で試しました. #include <set> class MyCmp{ public: enum order{asc, desc}; MyCmp(order const &o) { } }; int main(){ std::set<int, MyCmp> iset(MyCmp(MyCmp::desc)); //std::set<int, MyCmp> iset((MyCmp(MyCmp::desc)));は通る } error C2751: 'desc' : the name of a function parameter cannot be qualified 一重のカッコが通らないのはVCの欠陥でしょうね,恐らく.(>248)
2005 beta 持ってる人にも
>>254 試して欲すぃ
>>261 トンクス
VC は相変わらず詰めが甘いですなあ
>>258 Metrowerks CodeWarrior for Windows v8.3でも
std::set<int, MyCmp> iset(MyCmp(MyCmp::desc));が関数宣言だとみなされる。
次のwに似てないか? struct S { S(int); }; void foo(double a) { S w(int(a)); } (ISO/IEC 14882:1998 8.2 Ambiguity resolution -1 Exampleより)
>>264 そのwはint型引数aをとるSを返す関数でしょ
今回のとはちと違うと思う
>>211 無いものを呼び出すことはできんがなあ……
暗黙に何もしないデフォルト・コンストラクタが合成されることはないはず……
Effective C++の45項ネタかな
45P だな。
struct onepair { std::string first; std::string second; }; は、safe だろうか、out だろうか。 コンストラクタを定義しないと、インスタンスを作った時に 何もされないと思ったので、std::string のコンストラクタも 呼ばれなくて、まずいんちゃうかと思ったんだが… 実際、BC++ で実験してみたが、特に問題なく動作してしまっている。 std::string を自前のクラスにしてみたところ、ちゃんと メンバーのコンストラクタも呼ばれているみたいなんだが、 これって、処理系依存コードなんだろか。規格上は、どうなってんだろ。 (その Effective C++ とかの本を持ってないので、教えてくれー)
>>269 そいつは包含(コンポジション)だから、クラスそのもののコンストラクタの有無に
関わらず、クラスメンバのデフォルトコンストラクタが呼び出される。
メンバ変数のコンストラクタは普通に呼ばれるんじゃないの?
すまん、リロードするべきだったな。
>>270 >>271 ありがとん。それを聞いて一安心だ。
マジで感謝!
# C言語経験済みのC++初心者に、
# 「std::string 使えー」と言っちゃった時に
# struct の中で使われて、ハマらないか心配だったんだ。
#
# コンストラクタを説明するのが面倒というわけじゃないんだけど
# 一度に説明すると、頭があふれちゃう人が多いから…
>>269 コンストラクタを宣言しなければ、 class C に対して
C() {} というコンストラクタが暗黙のうちに定義される。
コンストラクタの初期化リストに現れないメンバに対しては
それぞれデフォルトの初期化が適用される。
デフォルトの初期化では、PODは不定値となり、
それ以外はデフォルトコンストラクタが実行される。
(PODに対しては「何も行わない」という実装が可能)
そうだね。クラスの初期化リストに現れているメンバについては デフォルトコンストラクタは呼び出されないや。規格書だなこういう時は。
>>274 ふむふむ、なるほど。
POD って、文脈からすると、古典的な型(int とか、コンストラクタの無い構造体)っぽく
聞こえますが、そういう認識でオケーでしょうか?
あと、調子に乗って、も一つお聞きしたいんですが、
以上を踏まえると、コピーコンストラクタの未定義時の動作も
メンバ単位でのコピーコンストラクタ呼び出しを試みてくれると
考えてよろしい…んでございますよね?
いや、実験はして、呼び出してくれてるみたいなんで、
多分、そうなんかなとは思うんですが。
(この夜中にしょうもない質問につきあっていただき、実にありがたく)
>>276 そんなに心配なら、規格なりFDISなり読めよ。
>>277 あー、たしかに調子に乗りすぎました。
とりあえず、ここまで教えていただいただけでも
とても助かりました。どうも、ありがとうございました。m(_ _)m
std::string このやり取り見てて思ったんだが(馬鹿な質問だったらすまん)内包クラスのことだよな? つまり、クラスの中で宣言されてるクラスの事、と認識したんだけど合ってる? 合ってるなら話を先に進めて、内包クラスって外からもクラス定義として見えるの? 見えるんだったら内包する意味がわからないし、 見えないんだったらこの会話がおかしいよな。 っていうか、俺がおかしいのか?
>>279 「内包クラスのことだよな?」って、何を指して言ってるのかもわからないし、
「内包クラス」自体もはっきりわからない。
つまり、おまえがおかしい。
pugya-
>>279 > std::string
> このやり取り見てて思ったんだが(馬鹿な質問だったらすまん)内包クラスのことだよな?
> つまり、クラスの中で宣言されてるクラスの事、と認識したんだけど合ってる?
多分あっているような。。
> 合ってるなら話を先に進めて、内包クラスって外からもクラス定義として見えるの?
見えるように、内包クラス(?)の型宣言を、そのソース(あるいは#include している
ヘッダ)の中に置かないと、そのクラスのインスタンスを(別のクラスのメンバーとしても)
宣言できないし(参照やポインタだけなら、その限りにあらず)
あ、見える/見えないの話が private/public とかに絡んだ話だったら、 この限りにあらず。多分、ちゃうと思うけど
用語の使い方がいい加減な者の相手をするのは時間の無駄。
>>280 ,
>>282 無駄にスレ消費してしまうだけから回答するな。
>>279 言ってる事はオカシイが、言いたい事は解る。
お前、内部クラスと間違ってないか?JAVAの世界に帰れ。
内包(コンポジット)ってのは、その、まあ、簡単に言うと、
メンバにオブジェクトを持つ事だ。「オブジェクトコンポジション」で検索して来い。
>>279 269が心配してるのは、
---------------------------------
struct onepair {
int first;
int second;
};
メモリは確保されますか?
---------------------------------
とかそのレベルの話だ。お前の考えてる事とはかなり違う。
すみません、出直してきます・・・・・・・
メンバ変数ってm_つけないですか?
データメンバはサフィックスにアンダバー。 初心者はよく`m_'のサフィックスを使う。
いやプレフィックス。
>279 スレの無駄だし、馬鹿にしてる気がするが一言、 stdがnamespaceだってのは当然分かってるよな?
delete thisの話はFAQなんだけど、 似たようなケースで 自分自身を再構築するというのもありだよね? あるclassが、内部に持っている別のデータ(のポインタ)に極端に依存していて そのデータが大幅に更新されていた時に作り直したいんだけど、 具体的には class hoge { Data *data; ...; hoge(Data *) { ... } void update() { Data *np = check_update(data); if (np != data) { this->~hoge(); new (this) hoge(np); } //以下、何事もなかったかのように続行 } }; のような。 メンバ関数を、「thisを引数に持つ以外は普通の関数と同じ」と仮定すれば 当然動くはずなんだけど 以後も処理が継続するメンバの内部でこれをやるのは 規格上はあまりよろしくないのかな。
んー、もう一度考えると 最初のthis->~hoge()が終了した時点でもthisの値が有効であることは、 規格上はおそらく保証してないんだろうな。 とするとnew (this) hoge()の呼び出しをする時のthisは どこを指しているかわからないから やっぱり鼻から悪魔なのかも。
あれ、でもそれだけなら thisを直接使わないで 一時変数に代入してそれを使って再構築すれば 仕様上も問題ないか。
>>295 あれこれ試行錯誤するのは構わないから、検証してから報告してくれ。
レスを読んでると、コンストラクタってのは、未定義で自動的に起動する 何もしないコンストラクタまたは定義したコンストラクタの初期化メンバ リストにないメンバーは、自動的にデフォルトコンストラクタを呼びだすの? じゃ、クラスをメンバにもってたら、そのクラスのデフォルトコンストラクタ を読んだあと、そのクラスのメンバのデフォルトコンストラクたも呼びだす みたいなループになったりもするの?
>>297 EffectiveC++でも読め。
それから日本語も勉強しとけ。
クラスのメンバであるクラスは、大きなクラスの初期化に先立って初期化リストに従って初期化される。
コンストラクタやデストラクタって、 明に呼び出したりするものなんですか?
昨日コード貼っつけることになってましたが、寝ちまいました失礼。 ソートの基準クラスはこれ。昨日参加してない人はスルーしてください。 template<class T> class MyCmp{ public: enum cmp_mode{asc, desc}; MyCmp(cmp_mode m=normal):mode(m){} bool operator()(const T& t1, const T& t2) const{ //要素の比較 return mode == asc ? t1 < t2 : t2 < t1; } bool operator==(const MyCmp& mc){ //ソートの基準の比較 return mode == mc.mode; } private: cmp_mode mode; };
ドライバは適当に作りました。 #include <iostream> #include <set> using namespace std; int main() { MyCmp<int>::cmp_mode vmode; char c; do{ cout << "Input order(a or d)=>"; cin >> c; switch(c){ case 'a': vmode = MyCmp<int>::asc; break; case 'd': vmode = MyCmp<int>::desc; break; default : c = '\0'; break; } }while(!c); MyCmp<int> mcmp(vmode); set<int,MyCmp<int> > iset(mcmp); // 代替案(一時オブジェクト) TEST: Borland C++ 5.5.1 //set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー //set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok //set<int,MyCmp<int> > iset(MyCmp<int>()); //エラー //set<int,MyCmp<int> > iset((MyCmp<int>())); //エラー iset.insert(4);iset.insert(3);iset.insert(5); iset.insert(1);iset.insert(6);iset.insert(2); copy(iset.begin(),iset.end(),ostream_iterator<int>(cout," ")); }
>>302 > cmp_mode m=normal
コレ、コンパイル通るのか?
もともと.net非2003で起きたことでしたが、昨日時間なくて再テスト できませんでした。今はBorlandしか試せません。コンパイラによって クセがあるのかもしれませんね。著者もそのあたりを気にして 一時オブジェクト使わなかったのかもしれません。
setは使わないほうがいいよ。以外に消費メモリが大きい。 map > set > list > vector 後々、順序づけの方法を変えたくなるのが人の常。仕様変更に弱い。 並べ替えされた配列も欲しくなる。setだけでなく、mapも仕様変更に弱い。 素直にvectorにするというのが普通だと思う。
あ、編集ミスでしたw。 cmp_mode m=asc にしてください。昨日asc,descでやったので、本のコードも それに書き換えたのですが、漏れがありました。(本はnormal,reverse) ってことで、デフォルトコンストラクタのものもエラーに なりませんかね。失礼。
テスト結果には影響なかったみたいです。しかしnoramlのままで コンパイル通るbcc素敵ですね。
vectorは使わないほうがいいよ。以外に挿入のコストが大きい。 vector > deque > map > set > 後々、要素数の規模を変えたくなるのが人の常。仕様変更に弱い。 無効化されないイテレータも欲しくなる。vectorだけでなく、dequeも仕様変更に弱い。 素直にsetにするというのが普通だと思う。
>>303 cl ver13.10.3077
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>())); //ok
Metrowerks CodeWarrior for Windows v8.3
//set<int,MyCmp<int> > iset(MyCmp<int>(vmode)); //エラー
//set<int,MyCmp<int> > iset((MyCmp<int>(vmode))); // ok
//set<int,MyCmp<int> > iset(MyCmp<int>()); //ok ←コレは誤りだろ…鬱
//set<int,MyCmp<int> > iset((MyCmp<int>())); //ok
すごいばらつき。 .netがクソというオチでは済まなかったようですね。
>>309 vector::reserve()を知らないの?
配列の途中にinsert()する意味は何なの?
無論、不可能ではないがわざわざinsert()する人は稀。
あらかじめ全体サイズの概要がわかっている、
あるいは、大きく余裕をもって確保して大丈夫という場合が多い。
この条件に該当してないかどうか、よく吟味してみることだ。
あらためて
>>309 を読んだが、ますます
>>309 がアフォだと確信した。
哀れな
>>309 ・・・。
良い上司・仕事に恵まれない、自己満足の世界に長く居すぎたのだろう。
言っちゃいけないことなのかもしれないが、STLってク
>>313 相手にすんな。
>>309 は、該当機能があたかもsetだけのもののように思い込んでる真性だ。
listを検討対象から除外している時点で完全に真性。
そもそも
>>227 がどういう用途に供するつもりかも分からない状態で
コンテナの選択について議論すること自体が不毛。
>>312 reserve() しても途中に insert() するときの要素移動にかかるコストは消えない。
set の替わりに vector 使うなら途中に insert() するのは当たり前。
> あらかじめ全体サイズの概要がわかっている、
> あるいは、大きく余裕をもって確保して大丈夫という場合が多い。
それが理由になるのであれば、逆に
あらかじめ順序づけの方法がわかっている、
且つ、並べ替えされた配列はイテレータで代用して大丈夫という場合が多い
とも言える。
vector で代用したほうがいいケースがあるのも確かだが、
特に前提が無い場合は素直に set を使ったほうが、
ソースコード量、複雑さともに優れている。
>>309 は挿入位置の後の参照とiteratorうんぬんのことじゃないの?
>>227 がset/mapだけを使うことにとりつかれた亡者にしか見えない。
std::vector::reserve()って、コンテナへの要素の挿入中に、メモリの再割り当て が起きないようにあらかじめ空コンテナを用意しておくだけの話だぜ。別に呼び出さなく ても、空コンテナがなくなると自動的にreserve()してくれるしな。 ただし、デフォルトコンストラクタを呼び出すstd::vector::resize()とは違い、要素 の数が増えるわけではない。
誤解しないで欲しいのは、質問したのはあくまで 言語学習の過程で起きた疑問からです。 何を作ってるわけでもないです。 まぁ設計論もけっこうですが、自分は関わりませんw
素直に選ぶならsetじゃなくてlistじゃないの。
>>322 俺も設計論はどうでもいいが、
>まぁ設計論もけっこうですが、自分は関わりませんw
馬鹿かお前。
>>324 どちらかというと、その突っ込み(というか言いがかり)のほうが
馬鹿だと思いますがw
>>325 偽者が現れたところで退散しますw
後は好きにどうぞ
どうもでした〜
どうでもいいが、ム板で[w]使わないほうがいいぞ アホにしか見えん 使ってる奴探してみ
そういう見方しかできないお前がアホだ
>>327 俺も君の意見に賛成できるな。
技術系スレの真剣な質問・回答のハザマに出現する荒しは、かなり見苦しい。
wはともかく、論拠を一切示さないレスはアホっぽいな
具体的には
>>313 とか、勝ち馬に乗りたいだけな気がする
荒らしと、'w'使うこととは、別のことだろ 荒らしってのは、無根拠に馬鹿とかアホとかいって煽ってる 連中だな。 それに、むしろム板とか言ってここに精通してますみたいな奴の方が 人間として終わってる場合が多い。
とりあえずset厨はlistを使わなかった理由を100字以内で書け。 限りなく反省文・始末書に近くなるだろうが、逃げずに頑張れ。
まずset厨とは誰のこと言ってるのか それを明らかにする必要はあるな 少なくとも227は、単に解説書を読んでいて 躓いた箇所を質問しているだけのようだし コードも解説書から引用してるだけなので set厨ではないわけだが…
>>333 人が vector 使ってるのを見つけて
「素直に set にするのが普通」などと
莫迦な事をいう
>>309 の事じゃないかと推測。
人が set 使ってるのを見つけて
「素直に vector にするのが普通」などと
莫迦な事をいう
>>306 はvector厨?
なぜ「アプリケーションの要件に依る」という当たり前の結論がでませんか
>>337 簡単だ。それは誰も求めない結論だからだ。
>>337 お前、対人コミュニケーションできないだろ?
なんだこの流れ?悪いのはおれか?そんなわけないよな?
>>339 お前のほうができなさそうなのは、一種の自爆ギャグ?
ワロス
set厨の
>>336 が必死にlistの話を避けているのが涙ぐましい。
>>343 やっぱりわからんな。
set厨ってのは
>>309 を指して言ってるんじゃないのか?
listの話ってなんだ?
ちゅうか使い分けるだけだと思うが、コンテナ。
もういいだろ、その話は。 ハッシュ最強ということで。
ハッシュ関数がウンコだと最弱になる
boostにハッシュないよね? なぜ?
>>348 STLportにあったから。
…かどうかは知らんが今作ってる最中。
標準C++ライブラリにunordered_mapって名前で入ることになったしな。
次の標準化への動きって、どうやって知ることができるの? なんかサイトがあるの?
351 :
デフォルトの名無しさん :05/03/17 12:34:33
>>350 あるけど、お前にだけは教えてやら無い。
どうせ晒しても日本語版は無いですかとか聞き返されるのがオチ
>>342 見てて悲しくなってきた。日本人の知能の低さ…
日本語版は無いのですか?
>>353 お前、ひょっとして「竹島問題」でファビョり中の、話題の韓国人か?
ム板でこの手の話題みるようになっちゃ終わりだな
じゃあ竹島問題を解決するプログラムをC++で 開発するということにしよう
>>359 竹島のライフラインを停止するプログラムか?
Kの御世話にならないように心とは裏腹に反対と言っておこう。
#define TakesimaDay 02/22 if( korea.claim() ){ use_atomic_bomb(); } else{ std::cout << "Yonsama Saiko-" << std::endl; }
C++なのに#defineかよ
お前の声は半音上がってるぞ
しかも八進数
C++でもふつうに#define使いますが
##とかでプリプロセス結合するとか、ディレクティブで使用するとかいった場合は#defineだな。 単なる定数とかはstatic constで型チェックさせる。 マクロもinlineにして型チェックさせる。
static使うの? 無名namespaceは使わないの?
無名ネームスペース使うとタイプ数がだいぶ増えるからなあ… ブロック開いて閉じる手間も増えるし。
>>368 テキストエディタの自動インデント機能がうざくなる瞬間でもあるね。
シリアルキー解析集「ALTEA」
大好評発売中!
http://openuser10.auctions.yahoo.co.jp/jp/user/dancexxx1960? 市販SOFTやオンラインSOFTのパスワード集です。
オークション関係から画像・OS・表計算・CAD・・・・etc
国内・国外のあらゆる分野のSoftを解析済です。
これを初めて手にされた時には、驚愕される事でしょう。
そして・・・手当たり次第にインストールを始める筈ですw
パソコンをご使用の方なら、必ず!満足されると思います。
解析結果のデータベースには15,000点を越えるパスワードが入ってます。
このパスワード集から検索するだけで、登録や制限解除が出来てしまいます。
シェアウェアを購入して、正規登録したのと同じ状態になります。
余りにもデータが多すぎる為、辞書引のようなパスワード検索SOFTで提供します。
シェアウェア以外にもパッケージ版をVectorなどでオンライン販売してるSOFTにも
多数対応しています。これらをダウンロードして無期限に試用する事も可能です(^^;
WindowsXPやOfficeなどのCDキー(プロダクトキー)ジェネレーターを使えば複数のパソコンに
インストールする事も可能です。デスクトップとノートPCなど2台以上持ってる場合は特に有効ですね。
オンラインSOFTを購入した経験は有りますか?
ありとあらゆる分野の優れたSOFTが、数多くありますよね。
しかし、ほとんどが試用期間や機能制限をして、「気に入ったら購入してください」です。
もう少し使いたいが使用期限切れで、削除・・・再インストールを繰り返していませんか?
クラスのメンバ定数でstaticつけない意味なんてないですよね?
staticをつけなかったらそもそもクラスのメンバ定数って意味じゃないし。
ああ、そういう言い方にはならんですか。 ただのconstの場合は、初期化したら不変のままで オブジェクトごとに値が違うみたいな使い方ですかね。
374 :
デフォルトの名無しさん :05/03/18 01:50:06
皆さんC++で何の仕事してますか。 私C++のプログラマでがんばりたいのですが 派遣とかに声掛けると、制御系の知識あるかとか ネットワーク知ってるかと聞かれて凹んでます。
数日前からC++に手付けてるんだが、 結構とっつき難いね。 参考書籍買う金もないのでWeb探しまくってお勉強中だけど。 ('A`)普通にプログラム書ける人間がすげー偉く思える。いや、実際偉いのか
>376 やっぱそうですか。Web上のだけじゃ足りないですよねぇ… ちょっと明日(今日)にでも本屋行って見てきます。どもです
378 :
デフォルトの名無しさん :05/03/18 04:20:26
C++を書いていくうちに、自分用関数がどんどんふえていくじゃないですか。 int→char[]とか、都合のいい16進数解釈関数とか、。 そういったのが多くなったので、これまでother.cppとしてまとめていたものをこの際分割して管理しようと思います。 何かこうしたほうがいいとか、陥りやすいmissとかありますか?
>>378 陥りやすいmiss
「自分用関数がどんどんふえていく」
趣味や勉強程度で、コードの再利用を考えるのは無駄なことが多い。
プロジェクト内で完結させておけばいい。
コピペの手間 << コードの管理
380 :
デフォルトの名無しさん :05/03/18 07:20:34
>379 マジですかー。 自分用関数が増えていくのが楽しかっただけにちょっとショック。 ありがとうございました。
>>378 いや、16進数解釈関数程度ならば、役に立つよ。
CライブラリをつかわずWindowsAPIだけを使いたい場合、
atoi()の代用品をCライブラリ非依存で作っておくと、重宝する。
>CライブラリをつかわずWindowsAPIだけを使いたい場合、 なんでこんなバカなことをする必要があるん?
379 に従うと COBOLer のようになるわけだが
>>382 んー、思考停止かな?
「_ATL_MIN_CRT」でぐぐってみて。
君が知らない世界があるから。
>>384 _ATL_MIN_CRTを使うのはバカだ、ということが分かった。
お前バカなん?
386 :
デフォルトの名無しさん :05/03/18 09:53:14
C++の多重継承って、同じメソッドがあった場合、どちらがコールされるんだっけか?
コンパイルエラー
え”、それ本当の話(゚Д゚)?
名前も引数も同じならコンパイラはどちらを呼び出せばよいか判断できないのでエラーになる。
>>388 メソッド名が曖昧になるから。
その場合は、foo::hoge()とかbar::hoge()って感じで呼び出す。
ダイヤモンド継承も同じ。
>>384 俺も知らなかったからググって見た。
この間抜けな仕様は何の為に存在するんだろ、と思った。
// なんだよ、C++ の例外が使えないって…
392 :
デフォルトの名無しさん :05/03/18 11:48:02
ダイヤモンド継承ってはつみみなんですが、多重継承より凄いヤツでつか?
>>384 25KBのコードサイズとランタイム添付の手間のためにコードが糞になるんですかそうですか
>>394 継承は知ってるけど、そのページダイヤモンド継承について書いて無くない?
仮想継承=ダイヤモンド継承
なんか?
A / \ B C \ / D この形のことをダイアモンドっていうんだろ?
多重継承すると、継承先では継承元のクラスは個別に保持される。
だから、
>>389-390 のように、foo::hoge()とかbar::hoge()って感じに明示的にアクセスしなければならない。
一方、仮想継承の場合は、その共通部分を全部くくってしまうケース。
A
/ \
B C
\ /
D
この例だと、クラスAにメンバーhogeがあった場合、クラスDにはA::hoge、B::hoge、C::hogeが出来る。
仮想継承だと、その共通部分であるhogeは一つしか出来ない。
これで間違っていないよね?
間違えた。orz クラスDに出来るのは、B::hogeとC::hogeだ。
399 :
デフォルトの名無しさん :05/03/18 14:24:21
C++では記憶域クラス指定子が無いconst型修飾された識別子は 内部結合の識別子として認識するという記述を読んだのですが namespace { const int foo; static const int bar; class X { public: const int baz; static const int qux; }; } 上のコードでfooとbar、bazとquxは同じ意味になるという理解で 良いのでしょうか?
>399 >C++では記憶域クラス指定子が無いconst型修飾された識別子は 「"名前空間スコープにある"記憶域クラス指定子が無いconst型修飾された識別子は」ですね. 無名名前空間とstaticはほとんど同じ効果を持ちますけれど微妙な違いがありますよ. bazとquxですが,クラスの非静的データメンバに対するconstは リンケージとは関係ないですし,staticの指定もリンケージとは無関係です. そもそもクラスの非静的データメンバにはリンケージの概念がないような・・・?
コンストラクタでこんな感じで書いてあるのはどういう意味なのでしょう? CLASS_A:CLASS_A():Hensu1(0),Hensu2(1) { 処理 } CLASS_A:CLASS_A():Hensu1(0),Hensu2(1) ~~~~~~~~~~~~~~~~~~~~<=ここの意味がわからん。 Hensu1とかはprivate変数らしい 以上、暇だったら教えて・・・
★ずれたので再書き込みごめん コンストラクタでこんな感じで書いてあるのはどういう意味なのでしょう? CLASS_A:CLASS_A():Hensu1(0),Hensu2(1) { 処理 } 上記の記述のなかで Hensu1(0),Hensu2(1) の意味がわからん。private変数らしいが・・・。 以上、暇だったら教えて・・・
>>401 なるほど 399が適用されるのは名前空間スコープ上、fooとbarに
対してなんですね。クラススコープ上の場合は異なり、baz は
staticではないので非staticメンバに準ずるということなのですか…。
複雑ですね。(^^;
とても勉強になりました。ご指摘ありがとうございます。
みなさんD言語、どう思いますか? ゆくゆくは移行してもいいかとお考えですか? ここで聞くなと言われるかもしれませんが、C++に熟達した 人の意見も聞いてみたいと思って…。 一部にはC++で挫折した人間がDへ、とも言われてるようですし。
はやってから乗り換えたんでも遅くないし、まあ様子見だな。
409 :
デフォルトの名無しさん :05/03/18 16:52:44
void Hage(); class Hoge{ public: DWORD(Hoge::*m_pFunc)(); Hoge(){g_pHoge=this;} void Func00(){;} ...}; Hoge *g_pHoge=NULL; void Hage(){ g_pHoge->m_pFunc=Hoge::Func00} Hageで設定したHoge::Func00はHogeが複数の場合、 どのHogeを指すことになるのでしょう? また、クラス外(Hage())からg_pHoge->Func00()を明示的に m_pFuncに代入する方法を教えてください。
>>409 メンバ関数へのポインタの値は、メンバ関数の「名前」に相当する。
従って、特定のインスタンスを指すものではない。
例: void (Hoge::*pFunc)() = &Hoge::Func00; Hoge a, b; a.*pFunc(); // a.Func00(); と同じ。 b.*pFunc(); // b.Func00(); と同じ。
412 :
デフォルトの名無しさん :05/03/18 17:01:01
>>410 即レス有難うございます。
インスタンスが複数ある場合、どのインスタンスのメンバ変数を操作することになるのでしょう?
この場合だとg_pHoge->m_pFunc=で入れているのでg_pHogeが使われるということでしょうか。
>>412 よく読め。
使われるときに決定される。
415 :
デフォルトの名無しさん :05/03/18 19:38:43
もしスレ違いな質問だったらすみません。 以下のソースプログラムをコンパイルしようとしたところ、下のようなエラーメッセージが出てしまいました。 コンパイラは、lcc-win32 です。 【バージョン情報】 Logiciels/Informatique lcc-win32 version 3.8. Compilation date: Jul 25 2004 22:17:17 【ソース(ファイル名:cout.cpp)】 #include <iostream.h> int main(int argc, char** argv) { cout << "Hello, world!\n"; return 0; } 【コンパイル時の状況】 C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>\lcc\bin\lcc cout.cpp ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~ ↑作業ディレクトリ ↑入力したコマンド C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test>\lcc\bin\lcclnk cout.obj cout.obj .text: undefined reference to '_cout' cout.obj .text: undefined reference to '__op_leftshift_piostream_pchar' C:\Documents and Settings\・・(個人情報があるため省略)・・\lcc\test> 【以上】 lcc-win32 は C:\lcc 以下にインストールされていて、C:\lcc\include の中には iostream.h がちゃんとあるので、 恐らくコンパイラのバグなどが原因だと思うのですが、どうすれば良いのでしょうか?
大切なことを忘れていました。 作業環境は、 【本体の商品名】e machines 【OS】Windows XP 【CPU】celeron 2.20GHz 【Memory】128MB 【HDD】40GB です。よろしくお願い致します。
いや、コンパイラは悪くないよ。 その前に自分を疑えよ。さすれば汝は救われる。
よくよく考えると、iostream.hが公には使われなくなってからもう10年経つんだね……。
419 :
415 :05/03/18 19:54:11
>>417 自分を疑えとはどういうことでしょうか?
>>415 のソースプログラムは、g++ だと正常にコンパイル・実行出来ました。
よって、ソースプログラムは(C++として)問題ないと思われます。
もしかして、lcc-win32 はそもそも C++ をコンパイルできないのでしょうか?
iostream.h 等が入っているから C++ にも対応していると思ったのですが・・・・・・
>>418 本当ですか?それは初耳です。
C++ を使い始めたのはおよそ8年前ですが、当時の入門書には iostream.h が出て来ました。
それとも、C++ のプログラムで標準入出力を扱う他の新しい方法が出来たのでしょうか?
そうでなければ、stdio.h 等を使うしかないのでしょうか?
尤も、Windows のプログラムでは標準入出力という概念が無いかもしれませんが・・・
そのかわり <iostream> は使うんだろ
>>421 使う、というか「使いたい」のですが・・・
すみません、421さんのおっしゃることが分からないので、もう少し噛み砕いていただけますか?
<iostream.h>を<iostream>に直す、とか言うのは論外ですよね
iostream.hなんて使ってる位だから 名前空間なんて知らないよね
| | | | /V\ ,J /◎;;;,;,,,,ヽ _ ム::::(;;゚Д゚)::| ジー ヽツ.(ノ::::::::::.:::::.:..|) ヾソ:::::::::::::::::.:ノ ` ー U'"U'
426 :
デフォルトの名無しさん :05/03/18 20:22:02
ファイル名をcin.cppにする
> 恐らくコンパイラのバグなどが原因だと思うのですが > g++ だと正常にコンパイル・実行出来ました。 > よって、ソースプログラムは(C++として)問題ないと思われます。 > iostream.h ……
ぷ、おまえらまともな回答でいないのに偉そうだな
lcc-win32ってそもそもC++対応してたっけ?Cコンパイラだったような‥‥
ところで俺が知る限りlcc-win32ってCコンパイラだった気がするんだがいつの間にかC++にも対応したのか?
431 :
デフォルトの名無しさん :05/03/18 20:37:53
iostream.hがあるからC++でしょ g++でコンパイルできたのがなによりの証拠
434 :
デフォルトの名無しさん :05/03/18 20:50:05
>>432 C++ の規格は ISO/IEC14882
この規格では iostream.h の添付を義務づけていない
よって iostream.h がない処理系も大手を振って C++ を名乗れる
iostream.hは次世代標準!
リンクファイルが古いは、コンパイラによって修飾された関数名が競合するはで、 std空間を使わないバージョンをインクルードするのは鬼のように嫌われる昨今。 Linuxでさえ、そういう状況。
437 :
415 :05/03/18 21:12:39
>>432 さん、
>>415 は私ですけど・・・・・・書き間違いでしょうか??
ググってみたら、「lcc-win32 は C++ コンパイラではないけど、一部 C++ の機能が付いている」
というようなことが書いてありました。lcc-win32 は Cコンパイラ+α といったところでしょうか。
では、Windows 環境で使える無料の C++ コンパイラってあるのでしょうか?
もしご存知でしたら、是非教えて下さいm(_ _)m
438 :
デフォルトの名無しさん :05/03/18 21:17:56
>>438 gcc って、Windows 環境対応のものもあるんですね。早速インストールしているところです。
ありがとう御座いましたm(_ _)m
>>441 ご親切にどうもありがとうございます。
lcc を使いやすい設定にしてしまっているので、cygwin 向けの環境に切り替えるまでの間は
しばらく lcc を使うことになると思うので、少し助かりました。
>>440 gcc(g++)のwin32環境対応版には
cygwinエミュレーション版とmingw版とがある
文字コードの関係やライセンスの関係から、漏れはmingw版(IDEはDev-C++)を使用している
SubVersionやLaTeXも使うので、競合を恐れたというのもひとつだが
もしcygwinが使いづらいということがあれば、mingwがお勧めだ。
gccでWin32な環境っつーとC++ BuilderX Personalもあるな。ライセンスが微妙でアレだが。
デストラクタってinlineにすると、無駄なコードが生成される可能性が あったり、デストラクタのアドレス取得の問題とかあるようですが、 コンストラクタってinlineにしても副作用ないですか? というか普通はinline?
>デストラクタってinlineにすると、無駄なコードが生成される可能性が >あったり、デストラクタのアドレス取得の問題とかあるようですが、 ここからして初耳なんだが。 詳細キボン。
>デストラクタのアドレス取得の問題 ここで問題が起きるような糞コンパイラならそもそもinline指定してもインライン化されないから大丈夫
コンストラクタのinline・非inlineの判断は 普通のメンバ関数と同じ考え方でいいんですか?
コードコードって、そんなにシビアに問題になるような環境で 開発している人ってたくさんいるんですか? それとも単に祭り好きな人がたくさんいるってだけですか?
無駄なコードと冗長なコードを混同している人が若干いらっしゃるね。
452 :
デフォルトの名無しさん :2005/03/21(月) 21:26:04
ストリームに関する質問です。 basic_ofstreamって、ファイルに対する出力ストリームで、 オープンモードでバイナリを指定すれば、バイナリーで 書き出せるわけですが、メモリーに対するバイナリー出力の ストリームってないのでしょうか。
>>452 std::basic_ostringstream
454 :
452 :2005/03/21(月) 21:43:18
>>453 あ、ほんとだ。openmodeがありました。
ありがとうございます。
C++の前にC言語学んでおいたほうがいいの?
別にやらんでいいとストラウストラップ先生 (禿) は言っている 俺もそう思う
そりゃCの上位互換だからねぇ。 Cと同じ書き方もできるから。 問題はプログラミングスタイルだね。 初心者はまずアルゴリズムとデータ構造を勉強せにゃならん(異義は却下)から、 オブジェクト指向の事は後回しでよろしい。
『Cを理解する事が前提』ではないのに『Cを拡張した形』を取る言語として存在するってのも変な話だね。 俺もCやらずにC++から今勉強してるけど
先人であるCへの理解抜きには納得できない仕様も多いだろう。 だが先に学ぶ必要は無いな。
>>458 なに言ってるのか良く解からない。
Cの構文規則が基礎なんだから、C++を理解するのにCが必要なのは当り前だろ??
>>458 一度D&Eを読んでみるといい。
その辺に対する禿の見解が書いてある。
>>454 Fileに保存するとき以外はバイナリモード、テキストモードの区別なんて無いよ。
464 :
デフォルトの名無しさん :2005/03/21(月) 22:40:42
C++ の前に C から憶えたほうがいいとかいう奴に限って C++ の前に Simula67 を憶えたわけでもない
465 :
デフォルトの名無しさん :2005/03/21(月) 23:21:41
C++のフーリエサンプルが欲しいげど、 どこにあるのかな?
フーリエはいつも君の心の中にあるよ
467 :
デフォルトの名無しさん :2005/03/21(月) 23:27:49
>>466 自分でやれってか?
C言語で書いたのはあるけど、ダルイ。
468 :
デフォルトの名無しさん :2005/03/21(月) 23:29:23
C -> C++ のポーティングができないような香具師に何渡しても無駄
469 :
デフォルトの名無しさん :2005/03/21(月) 23:35:44
>>468 技術的なことを言ってるの?
それは見当違いだね。
ここは、素人専門かい?
>>467 「C言語で書いたの」をC++でコンパイルした(できるように調整した)ものでは何が不満なのかね?
種明かしすると、
>>467 はCもC++も知らないのでした。
472 :
デフォルトの名無しさん :2005/03/21(月) 23:57:12
そもそもフーリエサンプルってなんだよ。 ただ、フーリエって言いたかっただけだろw
473 :
デフォルトの名無しさん :2005/03/21(月) 23:58:10
474 :
デフォルトの名無しさん :2005/03/23(水) 03:34:39
C++勉強するのにLINUX入れようかと思ってるんですけど、 microsoft visual stdioとどっちがいい?
gcc bcc dmcあたりでいいんじゃない?linuxは関係ないと思う。
最近はLinuxでもstd::wstringがコメントアウトされてるような馬鹿な環境はなくなってきたのか?
もしかしてC++の自作ヘッダの拡張子って .hppにするのが一般的なのですか?.hしか使ってなかったけど たまに.hppもみかけるし、ソースも.cppだし・・・。
C++ FAQ では hpp を推奨してたような希ガス。 でも好きな方使えばいいと思う。
480 :
デフォルトの名無しさん :2005/03/23(水) 11:40:38
俺は hh と cc しか使ってない。
でも以前は hpp と cpp 使ってた。
知り合いには仕事以外では h++ c++ を貫いてるやつがいる。
GNU Make がデフォルトで hh と cc を認識するから
それを使ってるだけ。
>>479 よかったら URL 教えて。
ヘッダー++なんてものは仕様にないんでしょ? 無いならhでいい。あればちょっと考える。
483 :
478 :2005/03/23(水) 12:57:45
そうですか、それほどスタンダードっていうものがあるものでも ないんですね。仕事ではチームの風潮に合わせるみたいな感じですかね。
また1つ優秀なデスクトップ開発環境がなくなりました。
ttp://www.metrowerks.co.jp/information/2005/info0323.html お客様各位
2005年3月23日
メトロワークス株式会社
CodeWarrior Desktop製品販売終了のお知らせ
拝啓 時下ますますご清栄のこととお喜び申し上げます。平素は格別の
ご高配を賜り、厚くお礼申し上げます。このたび弊社では、2005年4月30日
をもちまして下記のDesktop向けCodeWarrior各製品の販売を終了いたし
ます。一部の日本語版製品につきましては在庫終了のため、本日をもって
販売を終了させていただきます。長年にわたり弊社製品にご愛顧を賜り
誠にありがとうございました。今後もGame、Embeddedシステム向けに、
より良いCodeWarrior開発ツールとサポートを提供してまいる所存です
ので、何卒よろしくお願い申し上げます。
(後略)
>>484 残念…
CodeWarrior1.7からのユーザだったから、ちょっと感慨深い
486 :
デフォルトの名無しさん :2005/03/23(水) 19:20:22
void main(void){ Func(); } void Func(void){ double *d; d = malloc(沢山); <中略> free(d) ←ここ } 関数Funcが終わったらポインタdは使えなくなるんですよね? それでもfree(d)は必要なんですか?
>>486 例えば、土地を借りて(malloc)住所を紙に書いて(d)
その紙を捨てたとしても(dがスコープから外れる)土地を返したことにはならないよね。
488 :
486 :2005/03/23(水) 20:02:33
>>487 ありがとうございます。
5レベルくらいレベルアップしました。
489 :
デフォルトの名無しさん :2005/03/23(水) 21:25:37
>>484 あれだけ有名な製品でもある日突然消えちゃうんだね。
Borlandも心配。
次のlonghornとかいうWindowsではVC++がなくなるorネイティブコードはけなく なるって本当?!
壮大な勘違い。
誤解を生む記事は多いけどな
C#を押してるMicrosoftだけど、さすがにC++なくしたら 開発者に.NETは見向きもされないってことになるかな。
みんなに.NET Frameworkでプログラム書かせて、 Intelに儲けさせようという壮大な計画です。
ニャホ・ニャホタマクローが頭から離れないよー
>>490 ネイティブと.NETの立場が入れ替わるんじゃないの?
.NETがネイティブになって今のネイティブがエミュレーション動作
vectorの要素は、標準では必ずしもメモリ上に連続配置しなくても いいとなってるのが、今後、連続配置を標準で保証する動きがあるとか 本で読んだのですが、今どうなってんですかね。
>>497 今はメモリ上で連続してることが保障されてるはず。
ばかばかしい質問ばかりだ。
そういうこと気にしないといけないというのは、全てC++のちぐはぐさのせいなんだよね。 もうこの言語、限界なんじゃない? 言語仕様に対して無理しているように見える。
>>501 随分前からそう言われてるけど、結局生き残ってるわけだ
503 :
デフォルトの名無しさん :2005/03/24(木) 00:46:16
別に難しい仕様、使用しなければいいんじゃね?なんちて。
そのうちシステムズプログラミングもC#やらDやらでやることになるんだろうか
505 :
デフォルトの名無しさん :2005/03/24(木) 00:54:25
システムズプログラミングってなんですか
アレだよ
もうそろそろアセンブラから卒業する時代が来たんだよ。
というわけで、OCamlがオススメだよ☆
マネージコードをネイティブに実行できるCPUが作られれば、あながち あり得ない話とも言えない。
ハードウェアでガベージコレクションねぇ…
そういえば、Javaプロセッサって計画が昔あったよね
教えてください。 メンバ関数の実体って、オブジェクトごとに確保されるのでしょうか? staticメンバ関数というのがある以上、普通のメンバ関数はそういう ことになると思えるのですが。でもどのオブジェクトでも処理としては 同じなのに、複数用意するのも変に思えるのです。せいぜいthisポインタが 指すオブジェクトが違うだけですよね。実際はどういう仕組みなのでしょうか?
>>513 せいぜいthisポインタが違うだけなので、
一般的な実装ではthisポインタを引数に取る関数がひとつ生成される。
このため、非staticメンバ関数の型は宣言(見た目)どおりの型とは違う。
staticメンバ関数はthisポインタを受け取らないので、
宣言どおりの型を持つ関数が生成される。
> せいぜいthisポインタが > 指すオブジェクトが違うだけですよね。 これが大問題だと思うのは気のせいでしょうか? メンバ変数がひとつもないのであれば、それこそstaticでいい
thisポインタが違うのが問題ということでしょうか。 なんとなく、thisポインタだけを動的に差し替えてみたいな 感じでいけないのかなぁ・・・と思ったんですよね。 処理としては同じで対象が違うってことなので。 そういうわけにもいかんのですか。
>>516 読解力ないな。
>514が書いているとおり、一般的にはthisを引き数として受け取る関数のように実装されるのだけどね。
つまり、オブジェクトごとに存在するのは(staticじゃない)メンバ変数と仮想化に必要なポインタのみ。
コンストラクタを含めて関数はオブジェクトごとに生成されるわけではない。
class A { public: int i; void func() { i = 0; } }; A a; a.func(); は、Cではこんな感じかな。 struct A { int i; }; void A_func(A* this) { this->i = 0; } A a; A_func(&a);
519 :
513 :2005/03/24(木) 11:12:37
あ、失礼、なぜか514さんのレス読み飛ばしてました。 十分納得できました、どうもです。
実際、旧いC++処理系はCのソースを生成していたから まさしく>518のようなことをしていたと思われ。 #いや、関数名は型も含んだ長い名前になるけど。 今時のコンパイラはthisはスタックに積まずにレジスタで渡すなどしているから 厳密には違うんだろうけどね。
メンバ関数でない単純なCの関数でも場合によってはレジスタで引数を渡すような最適化も存在するから大してかわってないとも言える。。
ファイル分割の設計ってどういう思想でやってますか? 例えばクラスは、ヘッダファイルにインタフェース、実装ファイルに 実装、という様にわかりやすくできると思いますが、main関数の 実装ファイルにおいて、そういったインターフェースをどうやって 取り込むのか、グローバル変数の取り込み方とか、いろいろ悩むところが。 いろんなヘッダをまとめて取り込んだ代表ヘッダみたいなのを使う方法や、 依存関係を極力少なくした取り込み方もあると思いますが、何を基準に 判断していいのか・・・。それによってコンパイル速度とかも変わって くるんでしょうか?
>>522 C++で書かれたソースを公開しているフリーソフトウェアがいくらでもあるだろ。
そういうのを読むんだよ。
まずは真似ることからはじめようね。
あとはオープンソースプロジェクトのコーディングガイドラインを読むのも参考になるかも
525 :
522 :2005/03/24(木) 15:38:56
そうですか、オープンソースなるもので勉強するのですか。 すみませんが、勉強になるもので何か1つ適当なのを 紹介してもらえませんか?
STLとかboostとかのソース読んでおもいっきし可読性の低いソースを書くようになる可能性について:
ガワさえ綺麗なら中身なんて・・・
>>527 可読性ってなんですか
おいしいですか?
530 :
デフォルトの名無しさん :2005/03/24(木) 16:51:37
コンストラクタで例外が発生してがくがくぶるぶる。
>>530 コンストラクタの気持ち…ちゃんと受け止めてあげましたか?
>>530 恐がってはダメです。
前向きに、向き合っていかないと…
でないと…
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [COS1345] 幻のソース 「どろソース」 兵庫・神戸 ========ソース(株) ソースタンクの1番下で、どろどろとした、原料の野菜の旨みを吸い込 んだ 「どろソース」は、一部のグルメにしか知られていなかった幻のソースです。 ”そばめし”には欠かせないソースで、その他カレーの隠し味に、焼きそば・ お好み焼きや、他のソースと ブレンドしてトンカツやフライ系に幅広くご利用いただける万能調味料ソース です。 ピリリと辛く、その豊かな味わいは癖になります。 360g ¥400− [0]本[かごに入れる]
ある時例外の使い方に目覚めてから、コンストラクタで例外が起きても怖くなくなった。
例外”前提”プログラミングはだめだぞ
ここでcloseしなくてもこのタイミングで例外が飛んでくるから〜みたいなプログラム
>>537 よく分からん。簡単なコード例を挙げてくれないか?
>>535 Breakの変わりに使うことを推奨している言語もあるよ。
一概にそうとは言えない。
例外という言葉に惑わされてはいけないよね。
try { hoge.open(hage); } catch(AlreadyOpenException e) { hoge.close(); hoge.open(hage); }
×変わり ○代わり ね。
オープンソースを見るときに、どのファイルにmain関数があるのかは 検索するしかないのでしょうか。
検索してもいいし、書いてある場合もあるし、Doxygenファイルがくっついてる場合もある
grepすりゃ一発でわかるだろ。
移植性の確保のためにマクロ化されてたりするけどな
まぁ、普通はファイル名で見当がつくけどな。
552 :
デフォルトの名無しさん :2005/03/24(木) 22:41:46
>>541 すみません、馬鹿なので理解できません
どの辺がいけないポイントなのでしょうか
>>552 AlreadyOpenなんてしょっちゅうありえそうな事態だからちっともExceptionではない。
554 :
デフォルトの名無しさん :2005/03/24(木) 22:53:09
エントリポイントがmain以外にされていたりするのは 単なる意地悪か何かでしょうかね。
だから例外前提はダメなんでしょ?
質問です。よろしくお願いします。
仕様コンパイラ:MinGW(mingw-jp-20040224.zip)
環境:WindowsXP SP2
char型とかは1バイトですよね?
http://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html ここによると符号付charは-127 〜 127 となっております。
しかし、例えば
char ch;
ch = 1024;
としても最大値を超える値が代入できてしまいます。
出力結果は無茶苦茶になりますが。
10進1024は2進で0111 1111 1111で、
char型が1バイトなら、最大値は2進で1111 1111だと思うのですが、
char型に1024を代入した場合、あふれた0111の部分はどこへ行ってしまうのでしょうか?
質問が少しわかりにくいかと思いますがよろしくお願いします。
558 :
デフォルトの名無しさん :2005/03/24(木) 22:59:39
>>556 桁あふれしてる分は消える。それだけ。
式があってれば代入は可能。その式に意味があるかどうかは
コンパイラの判断するところではない。プログラマが決めるとこ。
signed charの「有効な」値の範囲が-127 〜 127てだけ。
>>556 あふれた部分は捨てられる。
signed charの範囲が-127〜127と言うのは規格が要求している最低限の値。
それ以上の範囲になっている事もありえる。(具体的には2の補数を使って-128〜127としている実装が多い)
自分のはどうなっているのか知りたければSCHAR_MAX/SCHAR_MINを読めばいい。
>>556 > char ch;
> ch = 1024;
> としても最大値を超える値が代入できてしまいます。
> 出力結果は無茶苦茶になりますが。
それは代入できているとは言わないだろ。
あふれた場合、代入後の値は実装依存。
>>558 それでは、有効な値を超えた場合、例えば
最大値が127なのに1000を代入した場合、
代入された変数には何が代入されるのですか?
char ch;
ch = 1000;
の場合chには1111 1111が代入されているのですか?
そんな器用なことせんだろ 下位ビットが入るだけ(実装依存?)
563 :
560 :2005/03/24(木) 23:06:19
>>558-559 かぶった。
・・・と思ったら、
「桁あふれしてる分は消える。それだけ。」?
「あふれた部分は捨てられる」?
そんなルール決まってんの?「実装依存」じゃなくて?
実装依存はMinGWの場合の振る舞い等はどの辺を読めば書いてありますか?
>>564 コード書いて試せばいいじゃん
>>563 char hoge[4];
hoge[1] = 10000;
とかなら捨てられないと困らない?
566 :
デフォルトの名無しさん :2005/03/24(木) 23:13:43
定義されてるかどうかと言われれば、されてないだろうなあ。
>>562 の言うように、下位ビットが入るだけ。
CPUでの実際の演算がレジスタで行われていることを考えれば、
有効なビット幅をメモりにストアすると考えるのが普通。
567 :
デフォルトの名無しさん :2005/03/24(木) 23:14:18
>>561-564 1000(DEC) = 3E8(HEX)
だから
char = 8bit の場合は E8
char = 9bit の場合は 1E8
char = 12bit の場合は 3E8
が入る。
568 :
560 :2005/03/24(木) 23:16:07
>>565 捨てられようが捨てられまいが、
代入しようとした値と結果の値が同じにならない時点で困る。
そのコードで「捨てられる」のなら困らないってこと?
その話はつまんないからおしまい
>>568 他の領域まで書き込まれちゃ変数の単位の区切りなんて意味なくなるじゃん
(char)1で代入するなら上位ビットを0で埋めるというより、下位ビットを代入するだけだと思うけど
JIS X3010:2003 6.5 式 6.5.16 代入式 6.5.16.1 単純代入 (略) 意味規則 単純代入は,右オペランドの値を代入式の型に型変換し,左オペランドで指し示されるオブジェクトに格納されている値をこの値で置き換える。 6.3 型変換 6.3.1 算術オペランド 6.3.1.3 符号付き整数型及び符合無し整数型 整数型の値を_Bool型以外の他の整数型に変換する場合,その値が新しい型で表現可能な場合,値は変化しない。 新しい型で表現できない場合,新しい型が符合無し整数型であれば(略) そうでない場合,すなわち,新しい型が符号付き整数型であって,値がその型で表現できない場合は,結果が処理系定義の値となるか,または処理系定義のシグナルを生成するかのいずれかとする。
>>570 いや、レベルが低すぎ。
このすれ以前にも益してレベル下がってる。
574 :
デフォルトの名無しさん :2005/03/24(木) 23:21:31
>>568 >「代入しようとした値と結果の値が同じにならない時点で困る。」
そもそも桁あふれする値を入れて「結果が違う」なんて言うのは糞プログラマ。
hoge[1] = 10000; で「捨てられ」無かった場合どうなるか。
ヘタするとhoge[0]やhoge[2]が上書きされる。困るだろ。
575 :
572 :2005/03/24(木) 23:26:56
しまった。ここはC++だった OTL
577 :
560 :2005/03/24(木) 23:34:48
>>574 なんで配列を持ち出してきたんだろうと思ってたら、そういう意味か。
「捨てられない」=「どこかに書き込まれる」なんて思ってなかったから意味がわからなかった。
代入先以外の変数まで触られちゃ困る。当たり前だ。
検査の結果
>>560 はCPUの仕組みを分かってないことが判明しました。
intもcharもchar[4]も実際に消費するメモリ量は同じだっけ?(32bitマシンの場合)
>>579 struct a {
int b;
char c;
char d;
char e;
char f;
char g[4];
} h;
>>573 そのわりにはちゃんと理解してる人や、
今再確認にした人が多いみたいだね。
585 :
560 :2005/03/24(木) 23:46:41
>>578 そんなことは無いぞ。
言語の規格とCPUの仕組みをごっちゃにしないように。
typedef union tag { char hoge_c[8000]; int hoge_i[2000]; double hoge[1000]; } MICCHIRI; 無駄がない。鯖で試そうと思ったけど何と無くやめておいたネタ。
桁溢れが起きると例外を発生するようにしてほしいよね。 そう思わない? ところで、ボクはCPUとは無関係だと思うなぁ、ハハハ
588 :
デフォルトの名無しさん :2005/03/24(木) 23:57:40
言語の規格とCPUの仕組みは完全には分離できないよ。 特にCでは。最適化を考慮して、アセンブラにどう展開 されるかを考えてプログラムするだろ、Cの場合。
589 :
デフォルトの名無しさん :2005/03/25(金) 00:02:42
>>588 > 特にCでは。最適化を考慮して、アセンブラにどう展開
> されるかを考えてプログラムするだろ、Cの場合。
しない
591 :
デフォルトの名無しさん :2005/03/25(金) 00:07:46
>589 しない? 漏れは結構考えるけど。 ところで今は何が争点になっているのやら。
>特にCでは。最適化を考慮して、アセンブラにどう展開 >されるかを考えてプログラム しないだろ。そんな事考えなくちゃいけない環境なら最初からアセンブラ使うでしょ
>593 いやそこまで厳密にどうアセンブラに展開されるかを考えるんじゃなくて(それなら直接アセンブラで書く)、 アルゴリズムとかを考えるとき、どうすればアセンブラに落としたときに 効率のいいコードになるかとか考えたりしない? CPUの命令の種類とか、メモリのキャッシュとか、C言語から直接は見えないけど 透かして見て考えるくらいならできるでしょ。
SSEやらを使うときは考えるけど、 あからさまに効率が悪いコードを書かなければ、 最近はコンパイラの最適化の方が優秀な希ガス
596 :
デフォルトの名無しさん :2005/03/25(金) 00:32:11
>>595 うむ、だから「最適化を考慮して」と言ったんだ。
最適化がうまくいくようにコードをかく。
>>596 それはCPU等のハードウェアを透かして見ていると言えるのかな。
>>596 「最適化がうまくいくように」は言語の規格を意識するべき話だろう。
「アセンブラにどう展開されるか」はCPUの仕組みを意識するべき話だろう。
まぁ、つまりは
>>590
そこまで処理の重さが気になるコードなんてそんなに書く? 書くとしてもインラインアセンブラ使うと思うんだが
おまいらたまには女性を意識した格好をしてくださいよ。
速度がいらないならC++という選択肢はないし そうでなくても普段から速度を意識してしまうのは病気みたいなもんだ
糞言語使っているなら兎も角、C++で書くときに単純なループを 0との比較は最適化されやすいからという理由でカウントダウンループになんぞしない。 #こういう8bitCPU時代のノウハウを得意げに語る携帯Javaプログラマはうざい。
時代が変わったんだ!オールドタイプは失せろ!
ハイハイ、CPUもアセンブラも分からないオコチャマはおねんねしましょうネ
今でも0との比較って速いの?
>>605 速いかどうかは兎も角、命令語長が短くなるとKVM使いがほざいてた。
真っ当なコンパイラならもし速くなるのなら最適化でそう言うコードを吐くべきだし、
プログラマはそんなことに頓着する必要はない。
>556 >10進1024は2進で0111 1111 1111で、 |・ω・`) どうしても誰もコレをつっこまないの?
>>607 書いた本人です。
0100 0000 0000ですね。
ポカミスです。
>>607 焦点がそこじゃないから気づかなかった・・・
自作自演だからじゃないのか?
本質じゃないから放置した。
612 :
デフォルトの名無しさん :2005/03/25(金) 14:07:30
Visual Studio 2005からOpenMP対応でしょ。 コンパイラが並列処理最適化ができるようにforループを書かないならないよ。
その辺、Intelのコンパイラと統一してくれるとうれしいんだよな とは言いつつ自分はIntelのコンパイラを使い続けるんだろうけど
サンデープログラムに高級な最適化なんていらん
>>605 RISC 系の CPU だとゼロレジスタ持ってるから、多少は速くなると思われ。
0 以外の数字だと、レジスタにその数字をセットする命令が必要になる。
もっとも、そんなところで速度稼いでも大局的には意味はないと思うが。
C++/CLIの話題はどこですればいいんでしょ
managedじゃない?
619 :
616 :2005/03/25(金) 22:58:24
ManagerがModuleA/B/Cを管理しているとして、 それぞれを別クラスCMgr/CModuleA/B/Cとします。 CMgrはメンバにCModuleA/B/Cのインスタンスを持っています。 普通はCMgrから各モジュールに命令します。 でも、諸事情でModule同士で直接やりとりしたいのですが、 どのようにすればよいのでしょうか? CModuleAのメンバ変数にCModuleB、CModuleBのメンバ変数にCModuleAを 定義すると当然ながらコンパイルエラーになってしまいます。 どう解決するのでしょうか? (C++というかモジュール化の問題?)
>>620 Manager経由で通信するってのはダメなの?
>>620 相互に参照する必要があるなら、公開するメンバ関数のみをインタフェイスとして
class IModuleA {
public:
virtual int foo() = 0;
};
のように分離して、CModuleA はそれから派生させて実装を追加するという手も定番。
CMgr には IModuleA* GetA() { return &m_moduleA;} みたいなのを追加して、
CModuleB などからはこれで得たインタフェイス経由でCModuleAのインスタンスを
操作する。
624 :
620 :2005/03/25(金) 23:51:38
>>621 Module固有のIFをMgrに入れるのは避けたいので、、、
>>622 なるほどポインタならOKですね。
すいません、実体しか試してませんでした。
でも、これってModuleAはModuleBのクラス定義を全て
インクルードするんですよね?
publicしかアクセスできないとはいえ気持ち悪いなぁ。。。
C→C++変換をしてるんですが、
Cではモジュール毎に外部公開ヘッダと内部用ヘッダに分けてました。
C++だと両方をクラス定義に押し込んで外部ヘッダはPublicに
内部用はPlivateと考えています。
>>623 これだとIModuleAのヘッダだけのインクルードで済むんで嬉しいんですが、
CMgrにGetAを追加するのが、気になりますねぇ。。。
A a; B b; C c; D* d = new (a, b, c) D; このようにnewした場合、対応するdeleteはどのようになるのでしょうか。 d->~D(); D::operator delete(d, a, b, c); といちいち書く必要があるんですか?
626 :
デフォルトの名無しさん :2005/03/26(土) 15:26:07
こうなる % rm src.cpp
627 :
624 :2005/03/26(土) 15:51:38
ないということで自己解決しました。 >626 参考になりました。どうもありがとうございます。
628 :
625 :2005/03/26(土) 15:52:30
>627 すいません。624ではなく625でした。
629 :
デフォルトの名無しさん :2005/03/26(土) 16:34:16
633 :
630 :2005/03/26(土) 20:12:03
煽ってはみたものの不安になってきた。 D* d = new (a, b, c) D; こんな構文あったっけ?
void* operator new(std::size_t, A&, B&, C&);
636 :
630 :2005/03/26(土) 20:44:53
ご め ん な さ い
new D(a,b,c)との違いが分からない
A* a = new (b, c, d) A(e, f, g); 簡単に言うと、これはoperator new(sizeof(A), b, c, d)でメモリを確保し A(e, f, g)を用いてオブジェクトを作っている
つまりnewの引数とコンストラクタの引数に分かれてるわけかthx
STLの本読んでたら T& map::operator [] (const key_type& key) この演算は (*((insert( make_pair(x, T()) )).first)).second に等しいとあったのですが、これって納得できますか? まず、mapで[]演算子を使うと、キーが同じものがない場合は 強制的に挿入されるということなので、pair型を作ってinsert に行きますよね。それはいいのですが、insertが返すのは挿入した 要素の位置(反復子)ですよね。それに対して.firstってできる? pair型そのものじゃなくて、反復子に対して.firstとやることって できるんですか?またその.firstで何を得てさらに間接参照して .secondで何を得るのかいまいちわからんのです(まぁ普通に考えれば 最終的には要素の値(キーではなく)のリファレンスを取得するので しょうけど・・・)
その形式のinsertが返すのはpair<iterator, bool>。
OH! そうなんですか。 それでガテンがいきますね。 メンバ関数ではないinsertがポイントなんですね。 どうもです。
あ、メンバ関数ですね、map仕様のinsertということですね、しっけい
646 :
デフォルトの名無しさん :2005/03/27(日) 03:53:13
正常にコンパイル/リンクが通っているソースなのですが 下記の一文を追加するとコンパイルは通りますがリンクエラーがでまくります。 (runtime_errorクラスが使えません) throw std::runtime_error("TEST"); 環境は Vine Linux2.6 gcc-2.95.3-2vl22 メッセージmain.o: In function `main': main.o(.text+0xd3): undefined reference to `runtime_error::runtime_error(basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > const &)' main.o: In function `__malloc_alloc_template<0>::_S_oom_malloc(unsigned int)': main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x1a): undefined reference to `endl(ostream &)' main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x27): undefined reference to `cerr' main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x2c): undefined reference to `ostream::operator<<(char const *)' 長いので略 リンクオプションは特になにも設定せずデフォルトのままですが これがまずいのでしょうか。
つい最近、Unixスレでほぼ同じ理由によるエラーの質問があったな。 ま、ここは環境依存スレじゃないんで。
>>647 -lstdc++ つけたらうまく行きました。ありがとうございました。
650 :
デフォルトの名無しさん :2005/03/28(月) 09:14:55
hppはヘッダファイルのc++版でよいの?
bool型の配列変数hairetu[5]の中で、どれか1つでもtrueであれば処理を行いたいのですが、 if(hairetu[0,1,2,3,4,5] == true){ 処理; } というのは不可能でしょうか?やはりfor文で一つ一つチェック? また、同じくbool型の変数hairetu[5]を一括でfalseにするには、 hairetu[]=false; hairetu[0,1,2,3,4,5]=false; といったかき方はダメでしょうか? 初心者のくせに大きめのプログラムを構築しているもので、 コンパイルして実行できないんです。教えていただけません?
>>652 その書き方は×
STLのfindとfill使えばいいのでは
>>652 >というのは不可能でしょうか。
不可能
>やはりfor文で一つ一つチェック?
for文でも&&でずらずら並べるでも好きな様に。
>といったかき方はダメでしょうか?
ダメ。
>教えていただけません?
ません。
>>653 早速のレスありがとうございます。
findを使って構文を書き直しておきました。
一大ミスにつながるところでした^^;
>>655 仮令大きなプログラムの一部を書いているのでも、小さな単位で確認する習慣をつけるべき。
まさか、机上コーディングしているわけじゃなかろ?
hairetuでいいかarrayにすべきかここで議論
658 :
デフォルトの名無しさん :2005/03/28(月) 15:16:37
while
659 :
655 :2005/03/28(月) 17:42:58
>652 それ以前にC++の基本的な文法を覚えるのが先じゃないのか? >hairetu[0,1,2,3,4,5] こんなのあり得ないし
>>660 別に文法的に間違ってはいないけどな
hairetu[5]と同義になるだけだけど
危ないから目を合わせてはいけません
664 :
デフォルトの名無しさん :2005/03/28(月) 19:17:12
struct A{ char data[4]; }; struct B{ char data[4]; virtual B~(){} }; 仮想関数がないクラスをnewしても メモリ確保されてないんだがなぜ? (最適化されてるからかな?) new A[1000000];//メモリ消費しない new B[1000000];//メモリ消費する
最適化オフで試してみたか?
666 :
デフォルトの名無しさん :2005/03/28(月) 19:24:05
バーロー
>>664 メモリへの書き込みがあるまではメモリが増えない、という
実装になってるんじゃないかと。
>>661 …コンマ演算子の詳細を忘れていたよ。サンクス
669 :
デフォルトの名無しさん :2005/03/28(月) 20:11:02
質問です。 英語ソフトの日本語化でハマっているものです。 ・こちらの開発環境はMS社のVC++ Ver6 日本語版。 ・英語版のソースは海外の開発元から頂いております。 ・私はVCもCもほとんど触ったことがありません。 ボタンやメニュー上の英語は、フォント名の変更と日本語名称の入れ替えでなんとかなりました。 しかし、印刷の日本語が文字化けしてしまい、上手くいきません。この部分が質問です。 フォント名の指定は日本語も通るように「MSゴシック」に変更しました。印刷上でもフォント名の変更が反映されました。 日本語名称の入れ替えた部分は、見事に文字化けになっています。 考えられる問題点を教えて頂きたいのですが。 自分なりに疑いのありそうな部分を並べますと。 ・インストーラ形式で作成していないので、コアらしきexeファイルの 入れ替えのみで日本語化している。(DLL等も入れ替えないとダメ? ・変数の指定が二バイト文字を受け付けない。(そんなことがありえ るのか全く知りません.. ・1バイト文字しか通過できない何かがまだ隠されている。 ・開発環境が間違っている。 何方か、アドバイスいただければ幸いです。 よろしくお願いします。
670 :
664 :2005/03/28(月) 20:20:27
>>665 ,667
VC6最適化なしRelease ->増加なし
VC6最適化なしDebug ->増加
667の通りかも、
これだと頻繁アクセスする時だとvirtual使うデメリット大きいなぁ.....
でもどのタイミングで確保されるんだろう?
頻繁に使うときはvirtualの方がいいってケースもありうるかも
671 :
670 :2005/03/28(月) 20:21:50
× これだと頻繁アクセスする時だとvirtual使うデメリット大きいなぁ..... ○ これだと頻繁アクセスしない時だとvirtual使うデメリット大きいなぁ.....
>これだと頻繁アクセスしない時だとvirtual使うデメリット大きいなぁ..... デメリットは無い >頻繁に使うときはvirtualの方がいいってケースもありうるかも そんなケースは無い
>>670 >でもどのタイミングで確保されるんだろう?
メモリにアクセスしたとき。
仮想関数があるBはvtableへのアドレスを設定するため、newするときに各要素にアクセスがある。
デバッグが有効だと未初期化のメモリは0xCDCDCDCDで埋めるコードが生成されるので
どちらもアクセスがある。
newが実際にメモリ確保に使ってるHeapAllocはアドレスだけ予約して、物理メモリをマッピングしてないっぽい。
で実際アクセスがあったときに物理メモリを割り当てる、と。
>664 newしてメモリが確保されていないってどうやって確認したの?
>>669 スレ違い。
そもそも説明が冗長で肝腎な情報が抜けている。
>>669 >何方か、アドバイスいただければ幸いです。
・C/C++未経験者が他言語へのポートをする事がそもそも間違い。
・Windows 自体の知識も怪しい。
・ていうか、スレ違い。
煽ってるわけではなく、マジで。
677 :
669 :2005/03/28(月) 23:02:33
>>675 さん
>>676 さん
すいません。
GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。
Web系でCやPerl、PHPを少々触れていたのですが、場違いだったようです。
この件、自分もタッチしたくなかったのが本音ですが、緊急事態で助けを求められたもので..。
明日、自分なりにもう少し頑張ってみます。
ありがとうございます。
678 :
669 :2005/03/28(月) 23:04:35
うーん..。 > GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。 GUI環境は、MS社のVBをちょっとかじった程度でした。 駄目だこりゃ。
679 :
675 :2005/03/28(月) 23:58:38
>>678 スレ違いだからこれ以上は避けるが、最後に一言。
>669を読んで、何を印刷しようとしているのか判る?
こちらはどんなプログラムか、どんなデータを扱うのか、何を印刷するのか何もわからない。
それでアドバイスができると思う?
リソースの言語を日本語にしてからMSゴチとかの設定にする
681 :
デフォルトの名無しさん :2005/03/29(火) 02:34:41
シリアライズで質問があります。 共通の基底クラスを持つ A, B, C などのクラスがあって、ファイルに保存したり 読み込んだりしようと思いました。 そこで、保存する時にクラス名を先頭に書き込んでおいて、読み込むときには クラス名をキーにして、それぞれのクラスの static な読み込み関数のポインタを 得るマップを作って、それで生成しています。 でも、これだと新しいクラスを追加した時に、先ほどのマップに別の場所で登録 しなければならなくて、なんとなくいやな感じです。 こういうことをもっとスマートにできる方法は、無いのでしょうか?
boost::serializationでも使ってみてはどうだろうか。
とりあえずBoost.Serializationでも読んでみる。
684 :
681 :2005/03/29(火) 03:13:50
685 :
681 :2005/03/29(火) 05:58:27
>>682-683 試してみましたが、すごい便利ですね。
STL のコンテナに対応して、派生クラスの面倒も見てくれるので、
えらくすっきりしそうです。
ありがとうございました。
staticなメンバ関数で、さらにそれを仮想関数にするなどという テクニックもありですよね?
なし
クラスのメンバ変数って、コンストラクタで特に初期化しなかった場合、 例えばメンバにクラスをもっていたら、デフォルトコンストラクタで 初期化されるんでしたよね?でも組み込み型は、未初期化のようなんですが、 デフォルトで初期化されるのはクラス型のメンバだけということでいいので しょうか?
コンパイルエラーで、 >dllimport 関数 の定義は許されません。 これが表示されたときにもっとも疑うものはなんですか?
691 :
デフォルトの名無しさん :2005/03/29(火) 14:13:37
頭
>>691 言われると思った。
それで、なんですか?
>>692 dllimportはDLLからその関数の定義を読み込むって意味だから
自身のソースで関数を定義すると多重定義になるんでは?
>>690 dllexportとdllimportを切り替えるマクロの不備。
>689 いいのです
クラスのアクセス指定子に関して今まで物凄い誤解をしていたかもしれないのですが、 それも某HPに次のような説明があったためです。 public継承 親のpublicメンバ ---> 子のpublicメンバ 親のprotectedメンバ ---> 子のprotectedメンバ 親のprivateメンバ ---> 子のprivateメンバ protected継承 親のpublicメンバ ---> 子のprotectedメンバ 親のprotectedメンバ ---> 子のprotectedメンバ 親のprivateメンバ ---> 子のprivateメンバ private継承(デフォルト) 親のpublicメンバ ---> 子のprivateメンバ 親のprotectedメンバ ---> 子のprivateメンバ 親のprivateメンバ ---> 子のprivateメンバ これをぱっと見て、あぁなるほどね、と最初は思ったのですが、 ものすごい誤解ではないですか?
>697 親のprivateメンバ → 子からアクセスできない
やはりそうですよねぇ
700 :
669 :2005/03/29(火) 20:56:01
>>680 さん
ありがとうございます。
お陰さまで、印刷上でも日本語化できました。
キャラクターセットのシフトJISが鍵だったようです。
十数年ぶりのc++、開発環境に慣れるまでが面倒でした。
あとは力作業のみ。
ある可変引数のグローバルC関数があります。 ラッパークラスのメソッドを経由してこのグローバルC関数を呼び出したいのですが、 このさい、ラッパークラス側のメソッドは、呼び出される側と同じインタフェースの可変引数にした いと思っています。ソース公開されているので、呼び出される側のグローバルC関数の方を弄っ て(vfprintfのように)va_list引数にすれば実現可能なのはわかっているのですが、呼び出される 側に一切手を加えずに、このようなことを実現はできますか。 オーバロード関数を死ぬほど用意するとか、そういうのは無しで。 スタックフレームに依存したコードで、ポータビリティはなくなってもかまいません。(redhat linux)
何回か同じ意図の質問は見たことがある 定番のやりとりが嫌だから、俺は回答を書かないけど
>>701 自分の環境でのvfprintfの実装を参考にしてください。
環境非依存の方法はありません。
それでも一応書いとくか。 Cスレの過去ログ倉庫で、最近の方から順番に検索すれば 概ね実現可能な方法が見つかると思うよ。 もちろん、そのまま渡せる引数の最大個数等は コンパイル時に決定されちゃうけどね。
インラインアセンブラ使ってごにょごにょとか
>703,704 サンクス。 かなり面倒くさそうですが、 勉強のため調べてみます。
707 :
デフォルトの名無しさん :2005/03/30(水) 10:09:46
VC++でクラス内のメンバ関数呼び出すと、スタックフレーム上の戻りアドレスの 前に4バイト分オブジェクトインスタンスだかなんだかのポインタが入るけど、 ここら辺の資料どっかない?構造体が知りたいんだけど。
構造体?
クラスメソッドならthisポインタ入ってるの当たり前じゃないか?
分からない事があるので、質問です。 if(m_Heap.find(Text)!=m_Heap.end()){ return(true); } else{ return(false); } VC++.NETのSTLのMapを用いて上記のソースを記述したのですが、 trueが返る筈の場所でfalseが帰ってしまいます。 で、トレース実行してみたところ if(m_Heap.find(Text)!=m_Heap.end()){ (1)return(true); } else{ (2)return(false); } と、何故か実行されるステートメントの矢印が移動します。 こんな事は、普通ありえないと思うのですが何か原因があるのでしょうか?
>>710 ステップデバッグの正常な動き。
自分で似たコードを書いて、returnしたときにどこに矢印がいくか調べてみれば?
ところで、その動作だったら return m_Heap.count(Text); のほうが良いと思う。
>>710 矢印の動きが腑に落ちないなら、最適化が切られていることを確認した上でリビルドしてみ。
あと、スレ違い。
>>705 リンカ使って、static メンバ関数のシンボルを C 関数の別名扱いに
するとか。思い切り処理系依存だが。
>>707 ATLのソースでも見てみよ。とエスパーしてみる。
717 :
デフォルトの名無しさん :2005/03/31(木) 01:45:41
>>715 ATLなんて糞みてーなライブラリのソースなんて見ても何の価値もなし
718 :
デフォルトの名無しさん :2005/03/31(木) 02:10:45
文字列初期化の時、どれが正しいのでしょうか char *a="hoge"; char a[]="hoge"; char a[]={'h','o','g','e','\0'};
配列とポインタについて勉強しろ。 せめてC FAQは読め。
>>718 ・一番目はポインタであり、それ以外は配列である。
・2番目と3番目は同じ。
2番目と3番目は同義 初期化だけならどれでも問題ない どう使うかによる
722 :
デフォルトの名無しさん :2005/03/31(木) 02:17:02
つまらない質問に答えてくれて ありがとうございました
723 :
デフォルトの名無しさん :2005/03/31(木) 02:52:58
CStringArrayに入っている文字列を"\n"で連結して一つの文字列にしたいのですが、 どうやればいいのでしょうか?
あの〜すれちがいですけど...
725 :
デフォルトの名無しさん :2005/03/31(木) 03:09:29
はぁ?
つまらない質問なんですけど、 一度も呼び出される事のない関数をコンパイラの判断で 省いてくれる(実行形式ファイルにコードとして含まれない) ような事ってあるんですか。 構造体のメンバ変数を呼び出すのと、メンバごとに分割した 変数を使用するのとでは、できあがるファイルは同じになりますか。 (例えば、pos.x;pos.yをpos_x pos_yのように分割する。) int length = str.length;のようにメンバ変数を直接、読み出すのと、 int length = str.getlength();のように、単に単一の変数をメンバ関数か らreturn length; のように値を返すのは同じバイナリを吐き出しますか。
>>726 インラインでない限りcall命令は省かれることないと思うけど
今のコンパイラはまだそこまで頭良くないと思う
>>726 最後のお題は関数に inline を付けるか
コンパイルオプションで設定すれば
おそらく同じバイナリだな
あと真ん中の例は分かりにくいからもう少し詳しく
早くしないとネムネム...
>>730 俺知らんかったよ
背のビーして人にアバドイスするもんじゃないね
反省、反省
>>726 です。
みなさんお答え頂きまして有難う御座います。
真ん中のは、構造体内の変数にアクセスする時に、わざわざ
オフセットを加えたりしないのかという事です。
staticやautoの構造体の場合は、その手間は必要ないのでは
ないかということです。
(ポインタの場合でも同様なのか良く分かりません)
。。つまらないとこ拘ってすいません。。
あと、struct pos[500000];/*int x;int yがメンバ*/
とかした場合には、int pos_x[500000]int pos_y[500000]
とかするよりCPUのメモリのキャッシュヒットが良いかもしれないと
かどうとか、どこかに書かれていた記憶があります。
なんか混乱してきた
>>732 構造体に纏めるか纏めないか、ということかな?
具体例を書いてくれると判りやすいのだが。
struct Pos {int x; int y;};として、
Pos pos;
と
int pos_x; int pos_y;
を
Pos.x = 0; Pos.y = 0;
と
pos_x = 0; pos_y = 0;
のように使うなら全くといっていいほど同じコードになる筈。
Pos pos[10000];
と
int pos_x[10000]; int pos_y[10000];
の場合、ループ内でx, y を同時に使用するなら確かにキャッシュヒット的には構造体の方が有利。
つーか、C++の場合、構造体化することによって様様なコンストラクタを用意したり、
ちょっとしたハンドリング用のメンバ関数を用意するなどの便利さを重視するべきかも。
>>732 そういうレベルが気になるならこんなとこで質問してないでアセンブラの読み方覚えてコンパイラが吐いたコード眺めたほうがはやい。
どのみち状況とコンパイラ次第なんだから。
>>733 さん有難う御座います。
言いたかったのはそういうことです。
やはり同じコードになってくれるんですね。
(なってくれなかったりしたら嫌だなと思いまして書かせていただ
きました。)
利便性とか隠蔽とか(環境によってはコード補完とかも?)も考えた
ら素直にメンバ関数使うべきみたいですね。
>718が普通にスルーされてるが、まずいんじゃないのか? (一応720とかに書いてあるけどさ) ポインタと配列なのでsizeofの結果が違うことと、ポインタの方はconstな 文字列を指してるんで変更できない。 int main(int argc,char** argv){ char *a="hogehoge"; char b[]="hogehoge"; //a[1]='a'; //これをやると環境にもよるがSegmentation fault b[1]='a'; printf("a - %d %s\n",sizeof(a),a); printf("b - %d %s\n",sizeof(b),b); } > ./a.exe a - 4 hogehoge b - 9 hagehoge
ってか、春休みでなきゃ「初心者スレに逝け」で済まされる質問だし。
『プログラミング言語C++』を絶版にするらしいね。
っていうか、ひとりのレスだけを鵜呑みにして信じちゃって良いのか? いや、ケチつけんじゃなくてマジでさ。
740 :
デフォルトの名無しさん :皇紀2665/04/01(金) 12:24:19
皇紀じゃつまんないな。 他の板はいろいろバリエーションあるのに。
>>740 ム板なだけに、エポック秒で表示しろってか?
>>741 それいいね、酸性
管理人にリクエストすれば良かった
743 :
デフォルトの名無しさん :皇紀2665/04/01(金) 16:41:07
16進表記がいいんじゃないか?
皇記2665/04/01(金)16:45:02 皇記A69/04/01(金)10:2D:02 皇記101001101001/100/01(金)10000:101101:10
read.cgiの負荷を考えなければ、datにエポック秒で持っていれば 2ch用ブラウザとかで好き放題表示変更できるのにな。
なぜ割り込み
747 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 21:59:23
>int 2ch =05/04/01(金) 21:40:59 int まず有り得ない。char使うとしても""が足りない。 2ch 変数名の先頭に数字は使えない。 = 全角。超有り得ない。なでしこでも使ってろピザ
せめてtime_tの方がふいんき(なぜかryが出るだろうに。
もまえらDOSのシステムコールしらなすぎ。
main関数で何もreturnしなかった場合は、自動で0がリターンされる ことになるのはC++独自の仕様?C言語は違うよな?
>>751 Cでも同じ
ISO/IEC 9899:1999 5.1.2.2.3 Program termination -1
If the return type of the main function is a type compatible with int,
... reaching the } that terminates the main function returns a value of 0.
あれ、そうなのか。なんかCの書籍だときっちりreturn 0書いてて C++の書籍だと省略してるのが多い気がしたのは、単なる気のせいか。 それともC言語は昔は自動でリターンしてなくて、そのころの書籍を 見てたのかな。
755 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 23:27:42
それは 0 をどんな実行環境に対して返しているつもりなのか明確に定義している本か?
756 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 23:28:56
処理系非依存のつもりで自己陶酔してるヴァカ著者のデムパ本
VC++を使っています。 MFCを使わずにコントロールを作ろうとしています。 継承なしの class CHogeCtrl を定義し、 Create メソッドで CreateWindow を呼んでウインドウを生成していてます。 ところが RegisterClassEx に渡す WindowProc をインスタンスメソッドにできないため、 WindowProc の中で呼び出し元のインスタンスにアクセスする方法が思いつきません。 コントロールのメッセージ処理はどうやって実装するのでしょうか。 知恵をお貸し下さい。お願いします。
758 :
デフォルトの名無しさん :int 2ch =05/04/01(金) 23:38:10
>>758 おお、感謝です!
毎回コールするしかなさそうなのが辛いところですが・・・
>>757 SetProp()やWNDCLASSEX::cbWndExtraとSetWindowLongPtrを使う方法や、std::map<HWND, CHogeCtrl *>を使ったり
ATL/WTLみたいにウィンドウ毎にWndProcのHWNDをCHogeCtrlに書き替えてメンバ関数のWndProcを呼び出したり色々手段はある。
>>760 ありがとうございます。
色々手段があるのですね。
とても勉強になりました。
C++からC関数はEXTERN "C"を使って呼び出せるようなんですが、 この時にコールバック関数を渡して、C++からC関数を コールバック呼出しすることってできるのでしょうか? 関数呼出し時のスタック内容が違うみたいなんでダメっぽいですが。。。
763 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 00:41:55
C++関数とC関数はどう違うのですか? int hoge(){} はどっち?
>>763 でも、おそらくコンパイルすれば同じ結果になる。
>>760 バカヤロウ、スレ違いのネタ引っ張るんじゃねえ。
Cおっぱい { float m_radius; float m_height; int m_segmentU; int m_segmentV; float m_milk; public: void SetRadius( float m_radius ){ this->m_radius = m_radius; } float GetRadius( void ){ return m_radius; } void もみもみ(void); void つまむ(void); void わしづかみ(void); int しぼり( int force ){ return m_milk; } } void main(void) { Cおっぱい m_cCup; m_cCup.SetRadius( 20.0f ); } オブジェクト指向ってこんなかんじ?
__cdeclとかってどうなのよ?>エロイ人
壮絶な誤爆をしたようで。
orz
>>767 駄目だ駄目だ駄目だ!
そんなんじゃオブジェクト指向は程遠いぞ!
乳輪のメンバ変数と、個人的に舐めるメソッドを追加しないと!
773 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 01:45:52
↑ ばか?
とりあえず名前の付け方がキモ過ぎる
775 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 02:06:43
変数名やら関数名でm_で始まるのってなんか意味あるんですか?
>>775 メンバ変数だということを体現している。
777 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 02:09:22
そうなんですかありがとうございます。 てっきりmyを略した物だと思ってました
/** Cカップおっぱいクラス(おっぱいクラスの派生クラス) ほかはおっぱいクラスで宣言されているのでいらない */ class Cおっぱい : public おっぱい { public: Cおっぱい(radius = 20.0) : おっぱい(radius) {} virtual ~Cおっぱい(); public: virtual void Doもみもみ(); virtual void Doつまむ(); virtual void Doわしづかみ(); virtual double Doしぼり(); } int main() { Cおっぱい cCup; cCup.Doもみもみ(); return 0; }
780 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 02:24:53 BE:37800926-###
あとすいません、変数名の先頭に~が付いてるのもありますが、 何か特殊な意味があるのでしょうか?
…変数?
変数と関数は区別できない λ式ってどうして導入されないんだろう。
784 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 02:55:33
>>783 そんな貴方も、明日からboost::lambdaで変態に!
C++の参考書として、独習C++の購入を考えてました。 が、テンプレに載ってない事で不安になって(;´Д`) ボンビーなんで・・・コレを買えば間違いないという名著を教えてエロい人! ちなみに、Cは入門書程度ならイケます
787 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 10:51:26
>ちなみに、Cは入門書程度ならイケます 程度ならC++は100年早い
788 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 11:12:33
>>786 禿本。(
>>4 を見よ)
誰だって始めは初心者だ。モノになる人材に必要なのは手加減より必要事項が書いてあること。
俺が「初心者」だった頃は、これとコンパイラのマニュアルしかなかった。(初版だったが)
今だって、新しい仕事のたびに何かの初心者で大抵は英語版のマニュアルで必死に憶えている。
>>785 それは本当のλ式じゃないじゃん。Cの関数ってカリー化もできないんじゃん。
本当のλ式はCで実装されています
791 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 12:00:02
C/C++ に何かが「ない」って騒ぐやつ 結局一番肝心なことがわかってねえなw
793 :
デフォルトの名無しさん :int 2ch =05/04/02(土) 12:22:20
class の「参照を返すメンバ関数」についての質問です。 整式の加減乗除のプログラムを(趣味で)作っているのですが、 class poly { private: int max_dim; double* coefficients; public: /* 中略 */ poly& operator=(const poly& x); /* 以下略 */ }; /* 中略 */ poly& poly::operator=(const poly& x) { /* 代入処理 */ return (*this); } とすると、 poly.cc: In member function `poly& poly::operator=(const poly&)': poly.cc:59: error: passing `const poly' as `this' argument of `int poly::getdim()' discards qualifiers というエラーメッセージが出てしまうのですが、どう解決したらよいか分かりません。 よろしくお願い致しますm(_ _)m
>>793 メッセージの中に書いてあるint poly::getdim()が怪しいと思わないのか?
795 :
793 :int 2ch =05/04/02(土) 12:31:49
>>794 そうでした!!
こんなヴァカな質問に答えてくださってありがとうございますm(_ _)m
自分のヴァカさが嫌になったので吊ってきます。
>>784 「変数」とか言っちゃう時点で、Cすら怪(ry
>>791 いや、だから、Cの仕様は数学的におかしいとこだらけなんだって。
>>797 数学的な正しさよりも、システムズプログラミングと
アプリケーションプログラミングの両方を
扱えることのほうが重要だから。
まぁ、それはある意味正しいよね。 そして目も当てられないようなバグに悩まされるんだよね。 苦労が絶えないねぇ。
ごめん、なんだかスレ間違ってたよ。 ずっとバグの出にくい言語仕様スレだと思って書いてた。
>>799 それはCの話?C++の話?
C++を知らずにCのことを前提として
C++も似たようなものだと思って
いっしょくたに批判してない?
>>797 ではCのことを書いてるようだからそう思ったわけだが。
なんじゃそりゃーー
>>801 基本的なところは何も変わってないと思う。
STLも歪にしか見えない。
その「基本的なところ」ってなに? ポインタとか?ガーベッジコレクションがないとか?
というわけで、とりあえず雲に巻いていいですか? スレ違いっぽいので。
それを言うなら「煙(けむ)に撒く」でしょう。
アホが「何か知ってるふり」をし続けてるのを見るのって ちょっと辛いものがあるね。
>>812 僕は自分が解からないことならなんでも批判したがる人を見るとちょっと辛くなる
>>812 と
>>813 の意見は
別に背反する意見じゃなくてどちらも正しいと思う。
それはどうでもいいから
CとC++において基本的なところである「型」のせいで
「目も当てられないようなバグに悩まされる」具体的な例を
示していただければ幸いです。
struct Hoge { int a; double b; } main() { return 0; } コンパイルデキネー
816 :
デフォルトの名無しさん :int 2ch =5年,2005/04/02(土) 15:27:41
>>815 struct Hoge {
int a;
double b;
};
int main()
{
return 0;
}
typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type; std::locale system_locale(""); std::locale::global(system_locale); char from_buf[BUFSIZ]; std::cin >> from_buf; char const * from = static_cast<char const *>(from_buf); std::size_t from_size = strlen(from); char const * from_end = from + from_size; char const * from_next = 0; boost::shared_array<wchar_t> to_sp(new wchar_t[from_size]); wchar_t * to = to_sp.get(); wchar_t * to_end = to + from_size; wchar_t * to_next = 0; std::memset(to, 0, sizeof(wchar_t) * (from_size)); codecvt_type::state_type state; std::memset(&state, 0, sizeof(codecvt_type::state_type)); codecvt_type const & cvt = std::use_facet<codecvt_type>(system_locale); if (cvt.in(state, from, from_end, from_next, to, to_end, to_next) == codecvt_type::error) { std::wcout << std::strerror(errno) << std::endl; std::exit(1); } std::codecvt を使って char * から wchar_t * を作るコードを書いたんだけど、 std::locale::global(system_locale); しないと動かないのは、こういうものなの?
std::cinからどれだけ読まれるのか不明だな(▽
Effective C++ 43項で、多重継承する際の多義性について、回避策を あげていますが、これってどういう原理なんですかね。クラスの継承で 1クッション置いてるようですが・・・。 それにVC++.netじゃコンパイルでこの例のdarw()の多義性解決できなかったし。 あんまり使えるもんじゃないのかな。
>819 解らないなら解るまで読め。 >それにVC++.netじゃ〜 理解してもいないのに使いこなせないのをコンパイラのせいにするな。
821 :
819 :2005/04/03(日) 00:07:31
というか書いてない部分でわからないんですが、 なんで片方のdraw()を限定して呼び出せるのかというところです。 あと、使いこなす以前に、エラーになるという意味ですよ。
Effective C++持ってない俺にはさっぱりだ
持ってるがまだ43項までいってない
>821 >なんで片方のdraw()を限定して呼び出せるのか それぞれlotteryDraw()とgraphicalObjectDraw()とに、呼び出す名前を変えたから。
825 :
819 :2005/04/03(日) 01:42:38
ん?呼び出す名前変えたっていっても 最初に呼び出してるのはdraw()ですよね、その例だと。 そしてどちらかのdraw()を呼び出すことが決まった結果、 そのdraw関数内の実装により、lotteryDraw()かgraphicalObjectDraw()が 呼び出されますよね。 ポインタの型がLottery*型だとなぜAuxLotteryの方のdarw()と決まるのか。
>825 >最初に呼び出してるのは 最初ってなんやねん >ポインタの型がLottery*型だとなぜAuxLotteryの方のdarw()と決まるのか。 AuxLotteryを継承したクラス(LotterySimulation)でdraw()をオーバーライドしてないから。
827 :
デフォルトの名無しさん :2005/04/03(日) 05:42:42
cinってなんて読むの?「ちん」って言ったら笑われたのだが
シーイン
じゃあcoutは「ちょうと」か
シーアウト
じゃあendlは「えんでる」か
エンドライン
オンドゥル
>>826 >AuxLotteryを継承したクラス(LotterySimulation)でdraw()をオーバーライドしてないから。
でも、AuxGraficalObjectも同じ条件ではないのですか?
こちらにもdraw()があってそれを継承したときにオーバーライドしてませんよね。
835 :
デフォルトの名無しさん :2005/04/03(日) 11:27:49
【keybd_eventリピート入力】
keybd_eventを使って別のアプリに方向キー押下を伝える処理でつまずいています。
手動でキーを長押しすると、WndMessageにキーイベントが連続して入力されますよね。
例えば、
keybd_event(VK_DOWN,0x50,KEYEVENTF_EXTENDEDKEY,0);
で下キーダウンさせれば、
keybd_event(VK_DOWN,0xd0,KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP,0);
でキーアップするまでの間は、キーがリピートされても良い様な気がするのですが、
如何なものでしょうか?
スキャンコードは、ここから拾ってきました。
http://www.microsoft.com/whdc/device/input/Scancode.mspx
すいません。 C言語について 初心者なので教えていただきたいのですが、 @『ある計算を1万回計算して、その結果をすべて出力する プログラム。』 A『ある計算を1万回計算して、その結果は出さずに、 その1万回計算した結果の平均だけを出力するプログラム』 この@とAのプログラムはどうやって書いたらいいんですか? 簡単に書けるプログラムですか? かなり初心者なので、すいませんが教えていただきたいです。
簡単に書けます
838 :
デフォルトの名無しさん :2005/04/03(日) 11:39:39
>>836 ここは C++ スレなんで、C の話は他でやれ。
宿題は宿題スレへ池。以上。
839 :
836 :2005/04/03(日) 11:42:10
>836はマルチにつき放置推奨で。
>>839 本人なら謝れ。成り済ましならそれくらいにしとけ。
>>839 出来るところまで自分で書いてから来なさい。
書こうにも全く書けないなら宿題スレが初心者スレへ行け。
>>836 while(1){
printf(1+1);
}
2バイト値を4バイトのポインタにCキャストした時、 上位2バイトは0で埋められるというのは、 C++の仕様で定義されていますか? それと、C++スタイルで書きたい場合こういうキャストはreinterpret_castでいいのですか?
>>843 定義されてない。ポインタ型と同サイズの整数型に関しては、reinterpret_cast で
可逆変換が可能だと規定されてるが、そのマッピング方法は処理系依存。
ただ、一般的なアーキテクチャの CPU を前提とするとビットパターンを保って
変換するのが妥当なので、それで期待通りの動作をすると思うよ。いずれに
せよ処理系依存なので、詳しくは処理系のマニュアルを読むか、処理系を
晒してくれ。
>834 なんでそこでAuxGraficalObjectが出てくる? Lotteryと継承関係はないだろ。 AuxLotteryでLotteryのdraw()をオーバーライドしてlotteryDraw()を呼んでるから、 それ以降の継承でdraw()をオーバーライドしない限りAuxLotteryのdraw()が継承されてlotteryDraw()が呼ばれる。 あー、らちがあかん。 おまえのいう >VC++.netじゃコンパイルでこの例のdarw()の多義性解決できなかった このソースをあげろ。
std::ofstream fout("test.txt"); は、コンパイルを通り、 std::ofstream fout = std::ofstream("test.txt"); は、コンパイルを通りませんでした。 何が間違っているのか教えてください。 c++初めて2日目なのであまりよくわかりません。
847 :
デフォルトの名無しさん :2005/04/03(日) 17:27:41
>>846 コピーコンストラクタが protected だから
最適化で呼ばれなくなったコピーコンストラクタも
アクセス制限のチェックは回避されないことになっている
848 :
デフォルトの名無しさん :2005/04/03(日) 17:35:13
VC++6.0でPanelコントロールってあります?
スレ違い
850 :
846 :2005/04/03(日) 18:01:46
>847 今の自分には理解不可能なようです。 ありがとうございました。
>>850 おいおい、簡単に投げ出しすぎだぞ。
前者は、std::ofstream型の実体を一つだけ(fout)作成している。
後者は、std::ofstream型の実体を一時的に作成してからそれを使ってもう一つ(fout)作成しようとしている。
このとき、コピーコンストラクタを使用するわけだが、それがprotectedなのでエラーになるわけだ。
通りすがりの者なんですが、
>>846 の書き方は、どんな違いがあるのですか?処理で。
どちらもインスタンスを初期化するんですよね?
やさしいc++には
class名 インスタンス名(引数)
は
class名 インスタンス名 = class名(引数)
と書くことができる。と記述されているんですが、
>>847 によると違うんですよね?
853 :
852 :2005/04/03(日) 19:00:24
あれー。投稿文書いてる最中に答えが投稿されたよ。
>>851 そうなのですか。全く同じ処理で書き方が違うのかと思ってました、今まで。
参考になりました。有り難うございました。
>>852 を読む限りでは「やさしいC++」ってクソっぽいな。。
先生質問! コンストラクタを書かないとデフォルトコンストラクタが用意されるんですよね? そう本に書いてありました。 てことは引数ありとかなしとかのコンストラクタを書けば、デフォルトコンストラクタは用意されないんですよね? 引数ありのコンストラクタ、デフォルト引数付き、を一つだけ書いたプログラムがあるんですが、 クラス名 変数名();と書いたら、デフォルト引数が代入されたコンストラクタが呼ばれると思ったら、そのコンストラクタが呼ばれないようなんです。 てかまるでデフォルトコンストラクタが呼ばれているようなんです。 もしかして、デフォルトコンストラクタが定義されるのは、 「コンストラクタを定義しなかったとき」ではなくて 「引数無しのコンストラクタを定義しなかったとき」なんですか? 私は何を勘違いしてますか?先生助けて!
856 :
デフォルトの名無しさん :2005/04/03(日) 19:29:53
>クラス名 変数名();と書いたら、 関数宣言になるだけだな
857 :
855 :2005/04/03(日) 19:50:33
>>856 マジっスか!?
main()の中に書いてるんですけど、定義も書いてないんですけど。
関数を宣言して、どうやって使うんでしょうか?
興味が湧いてきたんですが資料がないです。ネットにイイところないですかね。
858 :
デフォルトの名無しさん :2005/04/03(日) 19:55:45
禿本にはっきり書いてあるよ へたに手加減した入門書に頼るからわからない・・・
859 :
デフォルトの名無しさん :2005/04/03(日) 20:16:28
>>859 プログラマが決まってねーじゃんwwwwうんこwww
俺がやってやろうか、OCamlで良ければ。
あ、サーバ用意しないといけないのか。だったらダメだ。金払ってまでやりたくねー。
>(言語はC#限定)開発環境、サーバーを用意できるプログラマを緊急募集! C#っていうのはまぁいいとして、なんでsourceforgeとかじゃいけないのかがわからん。
865 :
デフォルトの名無しさん :2005/04/03(日) 20:42:30
C#限定って低脳丸出しやん
>>857 関数を宣言したらあとは呼ぶなりなんなりご自由に。
宣言なんだからコンパイラはどこか別のファイルにでも関数の定義があってリンカが解決してくれるだろうと思っている。
>>852 コンストラクタの引数が1つだけのとき、次の2つは同じ扱いなのは知っているだろ。
class名 インスタンス名(引数);とclass名 インスタンス名 = 引数;
class名(引数)は一時オブジェクトの作成を意味する。
そして普通、クラスは自分自身のクラスを引数に1つ取るコンストラクタ(コピーコンストラクタ)を持っている。
つまりclass名 インスタンス名 = class名(引数)ってやると、
そのインスタンスは一時オブジェクトが実引数のコピーコンストラクタで初期化されていると言うことになる。
散髪屋:500回に一回散髪失敗する。(失敗髪型を用意、NPCコメント「変な髪形になりましたねw」) 髪型は、リアルで、2ヶ月は変更不可。
>>866 関数宣言だけで、定義が何処にもなくてもコンパイルが通って実行ファイルが出来てしまうんですが、どういうことでしょう?
定義がないと実行ファイルまでたどり着かないんでないんですか?
>>869 その関数を実際に使おうとしない限り、定義がなくても問題ない
872 :
817 :2005/04/04(月) 13:11:55
誰も真面目に答えてくれてない…(´・ω・`)ショボーン
874 :
817 :2005/04/04(月) 15:56:57
>>373 STL の質問じゃなくて、C++ のロケール周りについての質問ですが?
STLport の codecvt の実装見て、唖然とした記憶がある。 ただ単純に 1文字づつキャストしてコピーしてただけだった。
877 :
817 :2005/04/04(月) 17:33:21
>>876 > std::codecvt を使って char * から wchar_t * を作るコードを書いたんだけど、
> std::locale::global(system_locale); しないと動かないのは、こういうものなの?
そのスレではこの質問の答えが見付からない。
880 :
817 :2005/04/04(月) 19:18:02
>>879 サンクスコ。
マルチロケールの場合は std::codecvt を使ってても、
適宜 std::locale::global() を毎回呼び出さにゃならんのか。
自前で std::codecvt 使って変換するより、stream に imbue した方が良さげやね。
人に物聞く態度じゃねぇなぁ。
882 :
デフォルトの名無しさん :2005/04/04(月) 22:36:00
【C++】int (integer) 相談室 ↑ こんくらい馬鹿げた分類だ 俗に STL と呼ばれるライブラリは ISO/IEC14882 で定義されている C++ そのものの一部にすぎない
動的配列扱うテンプレートクラスをstd::vector使わずに自作してる漏れはアフォですか?
>>883 自作するのは悪くない
できの悪い自作を使っていればあふぉ
>>882 つか、もう STL って呼称は不要じゃないかとおもゆ。
クラスをmemset()で0埋めするのって、論外だと思うんだけどどうよ。
888 :
STL :2005/04/05(火) 04:53:41
>>887 >817がcodecvt::state_typeに対してやってるな。<ZeroFill
890 :
デフォルトの名無しさん :2005/04/05(火) 07:44:37
>>886 ・全てのデータメンバが public(メンバ内メンバについても再帰的に適用)
・vtbl を持たない
つまり、memset を書く側が全ての責任を掌握しているならOK。
>>887 PODでも、ポインタや浮動小数点数に対する memset が
意味を成さない事を考えると、やっぱり論外だろ。
892 :
886 :2005/04/05(火) 09:54:31
つまり、オーソドックスなCの構造体でもない限りやるべきでないと。 つーか、クラス設計側からmemset()せよと言ってこない限りやるなって感じか。 それだったら寧ろ、クラス側で初期化関数でも用意して欲しいもんだ。
構造体でも厳密にはやっちゃいけないって話じゃなかったっけ
894 :
817 :2005/04/05(火) 12:48:54
>>889 codecvt_type::state_type == std::mbstate_t です。
これは C の構造体なので、memset() しました。
でもなんかキモイ。
>>894 構造体の初期化なら、こっちの方がわかりやすいのでは。
codecvt_type::state_type state = {0};
>>891 アーキテクチャに依存して良いこと確定なら、そういうコードを
書いても構わんと思う。ぶっちゃけ Win32 API 使ったプログラム
書いてるなら、そこだけ気をつかっても移植性ないわけで。
>>897 > アーキテクチャに依存して良いこと確定なら
memset や ZeroMemory で埋めること自体にたいしたメリットが無いのに、
そんな曖昧な条件付で認める意味がわからない。
既に書かれたコードを修正してまわる必要は無い、ということなら話はわかるが。
fstreamとワイド文字の関係について聞きたいのですが wofstream a; a << L"ABCDEFG"; のようにやればワイド文字も出力できるらしいことを知ったのですが 同じように日本語を出力すると a << L"あいうえお"; ファイルを見ても出力されてません。 日本語は無理なんでしょうか。 よろしくお願いします。
>>899 #include <locale>
int main()
{
std::locale::global(std::locale("japanese"));
901 :
899 :2005/04/06(水) 09:55:42
>>900 Winアプリのログ出力用に使おうと思って
早速やってみたんですがうまくいかず、
コンソールでやってみたら、うまくいきました。
Win32だとできないんでしょうか・・・。
質問ばかりですみません。
>>901 WindowsアプリならWinMainとかへ移せよ。
main()じゃなくてもとにかくワイド文字を使ったストリームを使うより前にstd::locale::global(std::locale("japanese"));があれば出来るはず。
903 :
899 :2005/04/06(水) 10:13:04
>>902 いろいろテストしてみて分かったのは
std::locale::global(std::locale("japanese"));
する前にwofstreamが宣言されているとダメ。
=グローバル変数だとダメ。
とりあえずポインタをグローバルにして
std::locale::global(std::locale("japanese"));
のあとにnewでやってみたいと思います。
ありがとうございました。
ポインタだとかグローバル変数だとか……
>>903 それならこうするとどう?
wofstream ofs("hoge"); //グローバル
ofs.imbue(std::locale("japanese")); //WinMainかどこか
素直にCのロケール関数を使うというのはこのスレでは禁忌かね? setlocale( LC_ALL,"" );
>>898 > memset や ZeroMemory で埋めること自体にたいしたメリットが無いのに、
構造体のサイズが変わっても大丈夫。いや、そのためのコンストラクタなんだが、
C/C++ ハイブリッドでプログラミングせにゃならん場合もまだあるんで。
ついでに構造体の要素に構造体サイズを書き込むようにしておくと、関数
呼び出しインターフェースの後方互換性を保ちつつ拡張しやすい。
移植性の話は無視して、そもそもゼロ埋めの利点って何? 単にバグ発見を遅らせるだけのような気がするのだが
ゼロ埋めが許される条件って?? sockaddr_inとかレガシーな構造体をmemsetしてるの結構 みかけるんだけど
>>908 逆だろ。ポインタが含まれてればアクセスしたとたん落ちる。
>>908 メンバをひとつひとつ 0 クリア (整数・実数) または NULL クリア (ポインタ)
するのが面倒っちいとき、memset() なら一行で、かつメンバ変数の増減が
あっても気にしなくていい、とか。
個人的には気持ち悪さが先にたつけどね。
HOGE hage = {0}; ってやればmemsetすらいらないんだけどな。
C++厨はこれだから困る、COBOLでもやっとけ
>>912 HOGE *hage
hage = malloc(sizeof(HOGE));
*hage = {0};
こうできなきゃ実質意味無い
だからコンs
>>914 HOGE const zero_initialized_HOGE = {0};
*hage = zero_initialized_HOGE;
こっちのほうがマシ。
PODならnew hoge()って括弧付ければ0クリアしてくれるだろ
919 :
916 :2005/04/07(木) 11:07:34
>>918 あ、それじゃぁ
*hage = HOGE();
でいいのか。
zero_initialized_〜 はCで使ってた方法だったようだ。
>>922 static つけるか、 namespace スコープに定義を移すか、 どっちかすればいいだろ。
HOGE hage();
俺のVC7ゼロ初期化しねーよ!タココンパイラだな
POD型のみのメンバで構成された構造体はPOD型なの?
932 :
925 :2005/04/08(金) 10:13:30
>>920 はpodかどうかを標準では判定できないことを体現したのです
もしかしてfstream等のストリームは例外をthrowしないんですか? newをわざと例外をthrowするようにしてstringstreamにoperator<<で書き込んでみたけど 例外は飛んで来ませんでした。
>>935 自分でいじったnewがoperator<<で呼ばれなかっただけじゃない?
937 :
935 :2005/04/11(月) 01:42:37
>>936 いえ、自分のoperator newが呼ばれていることは
std::coutへの出力とデバッガで追っかけるので確認しました。
>>937 ストリームは例外をthrowする。
原因を知りたければソース晒せ。
>>935 streamは古いC++との互換性を重視し、デフォルトでは例外を飛ばさない
ようにしてあるが、意図的に飛ばす事もできる。
それがメンバ関数 exceptions()。但し飛ばせる例外はstd::ios_base::failure
クラスに含まれるフラグに限られる。具体的にはstd::ios::eofbit、std::ios::failbit、
std::ios::badbit等。
おっと。送出される例外は、std::ios_base::failureオブジェクト、でした。
>>939 ユーザーがテンプレートを介して例外を飛ばす処理を混ぜた場合は
ストリームの例外マスクは関係ないだろ。
こんな簡単な例でもちゃんと例外は飛んでくるな。ふむふむ。 #include <iostream> #include <sstream> class Except { }; std::ostream& operator<<(std::ostream& os, const Except& ex) throw(int) { throw 1; } int main() { std::ostringstream ostr; Except ex; try { ostr << ex; } catch (const int&) { std::cout << "int thrown from ostringstream\n"; } }
944 :
935 :2005/04/11(月) 12:28:43
exceptionsを呼ぶことで例外が飛んでくるようになりました。 exceptions周辺のソースを見たところ ストリームバッファやnew等が例外を投げた場合はその例外がそのまま飛んできて 例外が投げられなくてもストリームバッファの処理がエラーで返った等の場合はfailureがthrowされるようですね。
class A { class C; class B { public: class B(C& r) { int i = r.i; } }; class C { public: int i; }; }; A::BのコンストラクタはCの完全な宣言が必要なはずなのにコンパイルが通ってしまいます。(VC++6) このB, CをAの外に出すとCが認識できない型とエラーになります。 この振る舞いは言語規格として正しいのでしょうか?
>>945 g++ (GCC) 3.4.1 (cygming special)
:7: error: expected `)' before '&' token
VC7.1はそのままコピペで通っちまったぜぃ
sign(x) = { 1(x>=0), -1(x<0) } となるような、引数の符号を返してくれる関数って標準にありませんか?
(x>0)-(x<0)
>>949 なるほど、こんなもんかな。
template<class T> int sign(const T& a){return (a > 0) - (a < 0);}
< と > のオーバーロードを要求する時点で終わってる
>>950 「符号」が意味を成すような型に、大小比較を要求して何が悪いの?
953 :
952 :2005/04/12(火) 09:58:02
アンカーミスった。 ×950 → ○951
<だけで十分事足りるって事
じゃ、 template<class T> int sign(const T& a){return (0 < a) - (a < 0);} で。std::min()/max()にあわせて < のみ必要ということで。
950がダメで955が良い理由を教えてプリーズ
>957 ∩∩ (x0 )
符号有りなしを比較するのに < しかオーバーロードしないケース ってあるのか?
>>959 そう言う横着する香具師もいるかも知らん。
少なくとも、敢えて両方使う必要がないと納得した。
#実際、自分でもそう言うクラス作ってるし。
##まぁ、符号判断はしてないが。
Effective C++ の第3版って、Sutterの C++ Coding Standards と内容かぶってない?
end()で得られるイテレータに対しインクリメントをした場合の動作は どう定義されているのでしょうか? 自分で作ったクラスにvectorやlistのiteratorと同じものを実装しようとしてます。
>>960 そこでboost::operatorsですよ
964 :
960 :2005/04/12(火) 14:03:07
>>963 仕事ではboostを使いにくい事情があるし、個人ではSTLを一通り理解してからと思ってるので
boost::operatorsは知らなかった。よければ簡単に解説してくれないかな。
965 :
945 :2005/04/12(火) 15:05:48
>>965 問題はそこではなくて、
単純なシンタックスの方。
>class B(C& r) { int i = r.i; }
これがおかしいと>946は指摘している。
967 :
945 :2005/04/12(火) 15:51:35
>>966 ああ、直す前のコードを貼ってしまった様で・・・
そこのclassは取ってください・・・
>>964 let's boostをそのまま引用
「特別な理由がなければ、a > b と b < a は同じ意味にすることが多いと思います。
要するに、operator< を定義してしまえば即 operator> の定義も決まると言うこと。
operator== と operator!=、あるいはこれらと operator<=、operator>= の関係も同じですね。
こういうのを、最低限の演算子だけは定義してから残りを boost::operators に任せることで、
自動的に生成することができます。」
operator>を定義すれば勝手にoperator<も定義してくれる…とかそういう話
operator+=からoperator+ なども。
template<class T> int sign(const T& a){return (T(0) < a) - (a < T(0));} の方がいいんでねぇかなぁ。
970 :
964 :2005/04/12(火) 19:06:13
>>968 THX!
やはりboostも勉強しておいた方がいいなぁ……
どんなものがあるかぐらいは知っておくといいかもしれないです
>>955 も
>>969 も結局"0"に関するコンセプトが必要になりますよね.
>>961 >Effective C++ の第3版
第2版と第3版の差分って何ですか?
>>962 end()で得られるイテレータはそもそもインクリメントの事前条件を
満たさないので結果は未定義です.
973 :
961 :2005/04/13(水) 01:04:27
>>972 さらに汎用的にするなら、比較の基準となる値を特性クラスで渡すとか。
// 必要なら特殊化する
template <typename T> struct traits { static T const base = T(0); };
// ここも必要なら U に適当なクラスを渡す
template<class T, class U = traits<T> > int sign(const T& a)
{ return (U::base < a) - (a < U::base); }
>>945 ,965
いや。gccでも(>967の修正が済んだ状態で)通る。
VCもgccも、メンバ関数内ではネストされたクラスはすでに完全な型になっているようだった。
しかし規格(FDIS)中にOK/NGを明確に決定するような記述は見つからなかった。
ただ、 9.2.2 に
"the class is regarded as complete within function bodies"
とような記述は有る。
一応関係はしていると思うけど、これで
ネストされたクラスについても同様とは言えないはず。
976 :
972 :2005/04/13(水) 01:48:12
Effective C++の第3版が日本語化されるのはいつ頃だろか?
978 :
962 :2005/04/13(水) 10:29:02
>>972 鼻から悪魔が出るコードでいいってことですね。ありがとう。
>>977 ゴシップ雑誌と大して変わらない価値しかない。
>>981 お前のレスはゴシップ雑誌と大して変わらない価値しかない。
>>982 ほう、俺の意見はそんなに価値があるのか。
>>985 お前まだ仕事してんのか!?2chなんか見てる暇あるんなら、さっさと仕事片付けろよ!
元の話題でやり込められたから仕事に論点をずらしたんですね ;-)
元の話題って何だろ。 というか、コレでやり込めたつもりだったんだ。 はは、すげー脳内回路してんな。
>>988 元の話題は
>>977 だろ。
というか、コレでやり込めたつもりだったんだ。
はは、すげー脳内回路してんな。
うぜぇよおまえら
>>989 >>977 の話題で、やり込めたと思えるお前は一体なんだ。
そして、俺は「やり込めた」とか言ってないからさ。
頭悪い鸚鵡返しはダメでしょ。お前の脳内回路はやっぱアレやね。
ソロソロ次スレ立てないと
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
997
とりあえず次スレ立ててくる
999
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。