1 :
(σ´∀`)σ :
2006/09/27(水) 15:56:21
2 :
デフォルトの名無しさん :2006/09/27(水) 15:59:42
今日はなんの日 フッフー
4様
STLつかうと一気に実行ファイルサイズが10倍に?!
環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない。
任意のタイミングでファイルオープンとファイルクローズが出来るデバックツール探してます。 CreateFileとかCopyFile等の動作チェック用です。 自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので探しています。 VisualStudioパッケージあるかもしれんがようわからん。 誰か知らないか?
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h> 後死ね。
言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
うわ、久しぶりに個別レス版の儀式乙w
いい具合にマナー違反が組み込まれたな。
class cls{}; class sub_cls : public cls { public: class cls{}; }; class sub_sub_cls : public sub_cls::cls{}; int main() { (sub_cls::cls)sub_cls::cls();//OK (sub_cls::cls)sub_sub_cls(); //ERROR!! (cls)sub_sub_cls(); //OK!! return 0; }
25 :
24 :2006/09/27(水) 18:48:48
>>24 のプログラムにおいて,sub_cls::clsの意味が場所に
よって変わってしまいます.
継承元に使用した場合: sub_clsの基底クラスであるcls
それ以外: sub_clsの内部クラスであるcls
このような振る舞いはC++の仕様でしょうか?
また,sub_clsの内部クラスclsを基底クラスに指定
する方法はあるのでしょうか?
環境: VC++.net2003
26 :
デフォルトの名無しさん :2006/09/27(水) 20:10:17
とても初歩的なことだと思いますが、質問させて下さい。 /* プログラム1 */ #include<iostream> using namespace std; void main() { char C[80]; cin >> C; } というプログラムのcharをintに変更するとエラーが出ます。 charとintは単にバイト数が違うだけの変数だと思うのですが、 なぜエラーが出るのでしょうか?cinの仕様でしょうか? また、上記プログラム1を /* プログラム2 */ #include<iostream> using namespace std; void main() { char C[80]; for(int i=0; i<80; i++){ cin >> C[i]; } } の様に書き換えてもうまくいくと思います。 しかし、プログラム1はアドレスCを、プログラム2は配列要素C[i]を cinに作用させていますが、なぜどちらとも問題なく動くのでしょうか? 本当に初歩的な質問だとは思いますが、どなたかよろしくお願いします。
ヒント:オーバーロード
28 :
26 :2006/09/27(水) 21:11:01
>>27 回答ありがとうございます。下の質問については理解できました。
ただ、やはりchar→intへの変換でエラーがでるプログラム1の
疑問が分かりません・・・。
よろしくお願いします。
>>28 C++においてchar配列は文字列を格納するのに使われるので、
ストリームにおいてもchar配列は文字列の入出力のために多重定義(オーバーロード)されている。
>>28 プログラム1を
char c[80] -> int c[80]
と変更すると、
コンパイラはoperator>>(int* rhs) を探すが、
そんなもんは無いのでエラーになる。
31 :
26 :2006/09/27(水) 21:27:39
>>29 ,
>>30 回答ありがとうございます。
つまり、charとintはバイト数の違いだけではなく、C++では、
その意味も微妙に違っていて(charは多重定義されていて)、
charは色々な意味の幅を持つので、関数cinは使えるが、
多重定義されていないintは使えないということでしょうか。
テンプレートについての質問です。 ■宣言部 template<typename T> class A { public: A(); int getValue(); }; ■定義部 A<T>::A() {} int A<T>::getValue() { return 0; } このテンプレートを使ったクラスの宣言部と定義部を一つの ファイルに書くと問題ないのですが、ヘッダファイルとcppファイルの 二つに分けて書くと、リンク時にエラーになってしまいます。 書き方が悪いと思うのですが、どこが悪いのか教えていただけないでしょうか。
32の質問ももはやテンプレに入れてもいいのではというほど既出。 テンプレートはコンパイル時に定義が見えていないとコンパイルできないのが原則。 ただし例外がある。 1. 宣言にexportを付ける。 - 正攻法だが対応しているコンパイラは絶望的に少ない。 2. ヘッダで定義したり、定義があるcppをヘッダでインクルードしたりする。 - ようするに諦めること。おそらく最もよく取られる手段。 3. cppファイルで明示的実体化を宣言する。 - テンプレート引数を使うだけ並べなければならず面倒。
35 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 22:03:51
テンプレートとかクラスとか使ったことないんだけどやばい? 普通に配列にアクセスしていく方がやりやすいんだけど 多数で開発とかじゃないといらなくない?
>>25 gcc 3.4.4 ではコンパイルできたんで VC のバグなのかも。
typedef sub_cls::cls sub_cls_inner_cls; で回避できない?
>>35 趣味で一人でやっていて、誰からも求められていないなら好きなようにやればOK
39 :
24 :2006/09/28(木) 00:30:55
>>37 回避できました.有難うございます.
色々試してみたところ,どうもVCのバクのようです.
自分で作ったコンテナっぽいものを 汎用アルゴリズムに投入したいのですが、 コンテナが満たさなければならない必要十分条件は何でしょうか?
STLスレのほうが食いつきがいいかなあ 引数なしコンストラクタ コピーコンストラクタ 代入演算子 があればいいんじゃなかったっけ。 あと デストラクタは例外を投げない 必要があった希ガス。
汎用アルゴリズム(<algorithm>ヘッダにあるようなのだよな?)に突っ込むって話なら 一通り機能備えたiterator持ってればいいんじゃないか?
アルゴリズムに対してはコンテナよりもイテレータの要件を満たす方が大事。 それはともかく、コンテナの要件はここに書くのは面倒だから規格書見ろ。
>>43 規格書(のドラフト)見るのが面倒だから
ここに書いたのに >_<
アルゴリズムとコンテナには何の関係もないんじゃないかね。 イテレータが対応するコンセプトを満たしていればそれでいい。 istream_iteratorとかコンテナと関連付けられてすらいないし。
>>44 http://www.jisc.go.jp/ JIS検索→規格番号 X3014
PDFの366頁(内容の365頁) 「23. コンテナ」からコンテナの要件が書いてある。
PDFの366頁「24. 反復子」から各種の反復子(イテレータ)の要件が書いてある。
>>47 ファイルが破損していますってメッセージが出て開けないけどどうなっとるの?
49 :
デフォルトの名無しさん :2006/09/28(木) 19:39:40
std::vector の一部分の要素、たとえば10番目の要素から20番目の要素を 取り出すのに便利な方法ってありますか?コピー元のイテレータ動かしながら からの vector に push_back しまくるとかですか?
適当にコンストラクタ使うとかinsert_iteratorつかうとか色々あるから好きにしろ。 vector<int>v; vector<int>v2(v.begin()+10,v.begin()+20); v2.assign(v.begin()+10,v.begin()+20); v2.clear(); copy(v.begin()+10,v.begin()+20,back_inserter(v2));
質問です。std::string に関してです。 今、マルチバイト文字列を使用する設定であるとして、 std::string hoge = "表表表"; int pos = (int)hoge.find('\\'); とすると、「表」の2バイト目を \ と認識してしまい、期待通りの動作になりません。 この場合、あくまでマルチバイト文字列を使いたいとすれば、 find を使わずに検索を自分で実装するしかないでしょうか? それとも、find に代わる何かいい道具はないでしょうか? よろしくお願いします。
マルチバイト文字のままでは無理。 自前で実装しなさい。
53 :
51 :2006/09/28(木) 21:05:10
>>52 ありがとうございます、ちまちま実装します。
>>53 事情が許す無いのはわかるけど、可能な限りwchar_tに乗り換えた方がいいよ。
マルチバイト絡みの悩み一切合財から開放される。
処理効率的には微妙でも、
MB->WCへ変換->フィルタ等で処理->MBに再変換
の流れの方がいいくらいの時も多い。
バグも減るしね…
>>51 c_str()使えば、const char*が得られる。
VC++の_mbsstrのようなマルチバイト対応の関数が使えるときにはこういう手もなくはない。
56 :
デフォルトの名無しさん :2006/09/28(木) 23:11:34
C++マスターするのにどれくらい時間かかるんですか?
>>56 どんなものにも、マスターしたなんて状態は存在しない。
常に上には上があり続ける。上を目指し続けなければならない。
まあC++だとそれが精神論に聞こえないというやつも多いと思うのだが、
別にC++に限ったことではないと俺は思っているよ。
ISOの規格票を完全に把握した上で各処理系毎の実装の問題を全て網羅し、 主要なライブラリ/フレムワークに精通すればC++をマスターしたといえるかもしれない。 んな奴いねーよ。
ある程度行くと納得して、勉強しなくなる。
Boostの議論に参加してC++そのものを作り始めたら プロフェッサーと呼ばれるかも知れない。
あー、それは思った。 ハゲとヒゲは大事だよな。
>>57 ピント外れの正論を一所懸命書くお前みたいな奴って
ほんと馬鹿だと思う。
>>61 彼の名前って正しく発音するとどう読むの?
びょーん?
誰かマジレスしてくれ…
ベンジャミン
びょーん・それ・しらんかっとってんちんとんしゃん
FAQのwav聞いた。声が若い気がするが本人なんだろうか。
Is "bjarne" an impostor? bjarneは「インポ」スターですか?
がウケた。辞書ひいたが。
まずは、
>>56 は、
1mm/秒くらいのものすごい勢いで禿げ上がれ。
毛穴の量を減少させよ。
次に、インポになれたら、発音しにくい名前に改名しろ。
規格はビヨーンと伸び続け 実装予定もビヨーンと伸びる 毛は伸びない
言語仕様と毛髪は規模に関して反比例する。
BASICやればフサフサになれますか?
Brainf*ckをやるとモサモサになりますか?
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない。 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。
ネタが無いけどとにかく何か書いてみたかったんじゃね?
>>77 これが書き込まれた当時は爆笑したものだ。
笑いどころがわからん。 解説してくれ。 しなくてもいいが。
あとから解説されてもわからんと思うぞ。 こういう、何て言うのかな、リアルタイムでマジ馬鹿に遭遇したおかしさは。
そういえば75にはうむご苦労が抜けているな。 最初にやっているからもういいけど。
上級プログラマ様ともなるとこれぐらいの厨で爆笑できるものなのですか
やっぱり笑いどころがわからん。 まあいいか。 次の話題。
そりゃわからんだろう。後から理解するには想像力が要るからな。
86 :
デフォルトの名無しさん :2006/10/01(日) 14:44:31
>>76 >>81 >>85 昨日今日のことなのに、当時ってなんだよ?
お前は、そろそろ現実に戻ってきた方がいいんじゃねーの?
>>86 よ、とりあえず当時ってなんだ?
お前こそ早くもどってくぁw背drftgyふじこlp;@:「
>>87 あんかーのつけまちがえじゃないか?
とくに
>>79 は嫌われてるからな・・
>>86 ?
とりあえずこのテンプレは俺がこのスレ来たときから有るが。
って言っても日が浅いからpart46からなんだけど。
>>86 うーん、過去スレ見てみるってのはどうかな?
そうだったのか。
何この流れ
ぬるぽ
∧_∧
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/←
>>93 (_フ彡
インヘリタンスなクラスはヴァーチャルなスーパークラスにインスタンスをオーバーライドですか?
ヴァーチャルなスーパークラスのメソッドをオーバーライドじゃね?
とりあえずなんでもカタカナを使えばいいってもんではないよ。
インヘリタンス:inheritance (n) 相続財産。先祖、前代などから受け継いだもの。 形容詞でも副詞でも無いのに、インヘリタンス”な”はちょっとなぁ
ネタでいったのに、微妙に意味がつながってしまった・・・シクシク
>>15 何のためにダイナミックリンクが存在するのかと。
>>100 何分間あるのよ。もしかして、延々と続くのか。
3時間経過・・・
>>102 ,103
男が説明してるだろ。webラジオだよ。
おーなつかしー SHOUTcastジャン
106 :
デフォルトの名無しさん :2006/10/02(月) 21:23:11
質問です。CのスレかC++か迷ったんですが、こっちに書き込みます 関数のプロトタイプ定義で、 void hoge(void)とvoid hoge()と書くのでは同じですよね? どちらを採用すべきでしょうか
void hoge()でいいよ
108 :
デフォルトの名無しさん :2006/10/02(月) 21:34:18
サンクス
>>106 C++では同じ。
だがCでは微妙に意味が異なり、引数を取らないという意味になるのは前者だけ。
後者はK&R流になり、引数の指定が無いということでvoid hoge(...)と同じような扱い。
ってここC++スレか、すまん。
>>109 キニスンナ、メンテの都合でCのコード引っ張ってくる事もあらぁな。
111 :
デフォルトの名無しさん :2006/10/03(火) 01:03:24
なんでもCで開発するやつ会社にいる。まぁそれはいいんだが 毎回車輪の発明を繰り返すのなんとかならんのかなぁ C++は遅いから使えないとかいってるし使い方しらねーだけじゃんって いいたいが上司だしいえんし みんなこうゆうばあいどうするのよ?
上司相手にも言う。 相手の目を見て真剣に何度でも言う。 ないしは上司が直接コードのメンテをするのは勘弁してもらって 進行管理や折衝仕事に回ってもらう。 ベテランプログラマの戦力は確かに馬鹿にならないんだが、 技術の新しさを伴った勉強熱心な若い子の方が役に立つ場合は 往々にしてあるのだし。 ベテランのベテランたる所以はコーディング能力ばかりによるものでもないし、 技術は若干古いが設計は優秀って人には、より上位の工程を管理してもらった方がいい。 まあ、理想論ですけっどもね。
113 :
デフォルトの名無しさん :2006/10/03(火) 01:19:51
しかもあれなんだよね、IEEEとソフトウェア系の論文読めばのってる 知識って普通に誰でも知ってるはずなのにさもすごいだろって自慢するのは 簡便して欲しい。早いといってもアセンブラレベルで比較したりしないし はぁやれやれ、だよ例外も何もかもつかえないからエラー処理のために 全部コールバックで受け渡すとかいうきもい設計だしまじ鬱になりそう
いつから愚痴スレに…
そんな会社、辞めちまえ!!
C++で例外使えない場合って、そこそこ多くないか? 俺が組み込みとかばっかりで、例外飛ばされたところで 回復させられる見込みがねえ&例外処理のコストを呑めねえって 場合が多いからってだけなのかもしれんが。
117 :
デフォルトの名無しさん :2006/10/03(火) 01:51:07
>>113 今の会社にいることが、お前の限界だと思うがな。
>>116 >例外飛ばされたところで回復させられる見込みがねえ
それなら返り値でエラー返しても何も出来ないんじゃないのか?
>>118 実際その通り。
bad_alloc飛ばされてガリガリ巻き戻って「ごめん無理」って出すか
ぬるぽ祭り開催かどっちかってなもんで。
どっちも大して変わらんので、最悪ぬるぽ祭りを後ろに控えつつ、
開催阻止運動にせいを出すと。
で、首尾よく阻止できてる限りは、そもそも例外が飛ぶシチュに縁がないと。
そんなノリですよ。
>>119 「ごめん無理」って出るのと未定義動作とでは全然違うと思うけどなぁ。
奥底で発生したぬるぽがすぐには問題として顕在化せずに潜伏してる可能性とか最悪。
バグの原因探すのに余計な気をまわさないといけない。
原因を例外として飛ばしてるんじゃないか。 それを回復できないんじゃ、 原因を例外で飛ばす意味をはじめっからやり直した方がいいだろ。
>>122 その程度のお前じゃ、C++例外は使いこなせないがよく分かる。
125 :
デフォルトの名無しさん :2006/10/03(火) 03:11:43
・意味をやり直す ・使いこなせないが分かる 言葉って日々変化しているんだなぁw
>>126 何をそんなに怖がってるんだ?
ところで、お前が直すとどんな日本語になるのか直してやってみてよ。
どうみても121の日本語が変だぞ。 さて、ご飯炊いて弁当詰めるか。 orz
元の分では正しい意味が伝わらないので、本人以外が直すのは無理でしょう。
> 直してやってみてよ これも(間違いとまでは言わないまでも)変だな。 留学生か?
>>127 おかしな日本語をおかしいと感じられない人間が氾濫のは、
おかしなC++のソースが氾濫するのよりも怖いな。
こんな時間に書き込んでる、おまえらの方がおかしいんと思うが?
133 :
デフォルトの名無しさん :2006/10/03(火) 04:41:33
>>130 >直してやってみてよ
これは普通に通じるし、日常使うだろ。
つまり、お前が言う「変」は感じないが?
ところでいつまでもしつこいようだが、
お前は日本語の教師か何かなのか。
134 :
デフォルトの名無しさん :2006/10/03(火) 04:48:49
確かにこの日本語教師じゃ例外は無理だなと思う。
>>126 は「使いこなせないのが分かる」と脱字なだけと思うけど。違うのか?
ヤクザがこっち見てえらい怒鳴ってるけど意味がさっぱり理解できなくて困っちゃう状態なスレですね
136 :
デフォルトの名無しさん :2006/10/03(火) 05:43:02
ところで、
>>120 は日本語だと思うが、
言ってることが理解できないのだが。
誰か解読を頼む。
どこまで自分で考えてどこでどうわからなくなったのか 言ってくれない奴って最悪だよね。
(ノ∀`) アチャー
日本語が変って言われたなら次から直せばいいだけなのに なんでくだらない言い訳に走るんだろう。
>>120 が何を言ってるのか俺も同じく分からないが
誰か解読してくれないか?
>>139 は、どの当たりがくだらない言い訳なんだ?
このままでは、みんながお前に合わせないといけないようだな。
>>140-141 日本語が変とかしつこい奴だけど、たまに現れるだよ。
これじゃ友達いないようだし、一番近づきたくないタイプだ。
こんなのに係わっても疲れるだけだぞ。
彼は亡くなったお祖父さんの 「日本語の使い方について指摘されても、決して自分の非を認めてはならん」 という遺言を忠実に守っているお祖父ちゃん想いの少年なのです そっとしておいてあげて下さい
>>120 はそんなにおかしいか?
俺は普通に理解できたが。
滝川人民キモイ
変かどうかはともかく、漏れも
>>120 は理解できた。
説明ったって、一体あれのどこがわからんのかわからん。
30レス近くも引っ張るような話題なのか?
char()やwchar_t()の値が、'\0'やL'\0'と等しい事は保証されてますか?
はい。
ありがとう
153 :
デフォルトの名無しさん :2006/10/03(火) 14:19:10
>>150 誤字脱字で細かい奴が一人いるんからだろ。
いつからここはオレ様専用スレになったんだろうな。
ずいぶんと自虐的なヤツだな
自分の非をやっと認めたようだな。 今後は釣られんじゃねーよ!
>原因を例外で飛ばす意味をはじめっからやり直した方がいいだろ。 「原因を例外で飛ばす意味をはじめっから学び直した方がいいだろ」 と書くべきでは? >その程度のお前じゃ、C++例外は使いこなせないがよく分かる。 「その程度のお前じゃ、C++例外は使いこなせないであろう事がよく分かる」 では? >ところで、お前が直すとどんな日本語になるのか直してやってみてよ。 「直す」が重複。 「ところで、お前が直すとどんな日本語になるのかやってみてよ」 では?
まだ在日が暴れてんのか
最近ム板も、朝鮮人がよく出入りするようになってから、荒れ出した。
161 :
デフォルトの名無しさん :2006/10/03(火) 17:05:59
>>157 こいつずいぶんと偉そうだ。
日本語勉強中のチョンだろう。
お前は嫌われてるんだからマ板にいけ。
/\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーた朝鮮人か!! | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
>>161 その「日本語勉強中のチョン」に遠く及ばない日本語を書く連中って・・・。
在日ってこんなにしつこいとは知らなかった… これじゃ、嫌われて当然だよな。
166 :
デフォルトの名無しさん :2006/10/03(火) 18:47:01
在日ってもう本国に帰れないんだろ。 日本でも嫌われて、本国にも帰れず、 確かにないするかわからない危険な奴らだ。 あー、こわい、こわいwww
一人で必死に在日をキーワードにしようとしてるけど 誰も乗ってくれないね。 相手を「まっとうな日本人」より下に位置づければ位置づけるほど それ未満だった自分の位置がえらいことになってしまう構図なのに、 その状況も考えず思いつきだけで抵抗しようとするからこうなる :-)
は?何惑わされてんだ?
言語野ぶっこわれた
>>121 が一人で必死なだけだろ?
そうなのか。やっぱり在日だったのか。 2世か?3世か? それよりも、もう半島人の言い訳見るの飽きたから、 だれかC++の相談ないのか?
お前らデスマーチでそんなストレス溜まってんのか
>>170 ×デスマーチ
○デスニート
デスマーチだったらこんなところで油売ってらんない。
template<typename T> struct Outer { template<typename T> struct Inner {}; }; こういう風にテンプレート引数の名前が被ってもいいんでしょうか?
>>171 慣用句「油を売る」の使い方がおかしい気がする。
無いところから無理矢理作り上げたプライドを保とうとすると 色々大変なんだなぁと思った。 間違いを認めるって、結構エネルギー要るしね。余計に敷居が高いよね。
おそらく環境依存になってしまうと思うんですが、 あるオーバーロードされた関数を呼ぶ時に どのバージョンの関数を呼ぶようにコンパイルされたかは どうやって調べるのがいいんでしょうか 今のところcoutして実行してみる方法しか思いつかないです・・ foo(int i){ cout << "int ver";} foo(hoge f){ cout << "hoge ver";}
今ふと思った
きっと
>>176 のところではオーバーロードを何度も繰り返す仕様の仕様書を書いちゃったんだろうな、と
オーバーロードってバージョン管理までしてくれたっけ?
完全に別個じゃなかった?
>>175 自分の事を書きたいならチラシの裏だけにしておけ。
>>178 は何を言いたいのかさっぱり分からないけど、誰か解読をヨロ
>>176 C++ デマングリング
でぐぐるべし。
>>180 × は何を言いたいのか
○ が何を言いたいのか
>>180 × 分からないけど、誰か
○ 分からないんで、誰か
>>177 あるライブラリを使用しているんですが、
そのライブラリがテンプレートとオーバーロードを多用していて、
ソースを一見読んだだけでは何が呼ばれるのかさっぱりでして
>>181 ぐぐって来ます
>>182-183 修正してニコニコしているみたいだけど、
それはスレと関係ないことだと思ってないのかな?
ねぇ、あらし君!迷惑なんだけど止めてくれるよね。
このスレはC++スレではなくて朝鮮人スレなのか。
直すな、アラシ!
中国人留学生ってやっぱりウザイ キモイから、早くお国に帰ってくれないかなぁ…
朝鮮人スレというより三国人スレ
191 :
デフォルトの名無しさん :2006/10/03(火) 23:27:43
中国人ってよりも在日三世だろ。 「自分は在日三世だ!!」ってみんなにばれたら 次の日から白い目で見られて避けられるだろうな… 細かい事ばかり気にして神経質みたいだし、そもそも友達いないかもな。 あんまり偉そうにしていると、身辺調査されて終いにばれちまうぞ。 でも、マ板だったら仲間が多いだろ。そっちにいけよ。
ageてまで語る事じゃないだろ この手の話題はスルーしろよ 本当にム板はこの手の耐性が低いな
日本に帰化しないって事は、朝鮮有事になったら、向こうの側に付くって 事だろ。そんな危険な存在をかくまっておくなんて、政府はどうかしている。 とっとと絞め殺せ。
そんなに「在日、在日」って言うな! これでも俺たちは必死に生きてるんだぞ!! 給料上げて欲しい・・・・
何この書きにくい流れ・・ けど気になるので質問するぽ 「もしもdeleteされていなければdeleteする」 というようなコードを書くことって可能でしょうか Type* t = new Type(); delete t; こんなコードがあり、後のほうでtが削除されたか気になって if(t)delete t; とやってみたけど、玉砕 NULLポインタに対してdeleteは大丈夫なようですが delete tの後に残ったものはNULLではないのですね 何かよい方法ってあるのでしょうか
>>195 ・クラスで隠蔽する。
・newを使わない。
・deleteしたらNULLを代入しておく。
>>196 deleteしたらNULLを代入しておく
コレ頂きます!感謝
クラスで隠蔽する
既にクラスなんですが、なんでクラスのポインタにしているかというと
NEWを返す関数の返り値を代入したりするからです
(今の代入演算子の実装だとデストラクタが呼ばれないようなので・・)
>>197 どもです、ただ俺のレベルでは自作は厳しいっす;
そういう方向だと
BOOSTのスマートポインタを使えば解決しそうだけど
今作っているプログラムで必要な箇所は本当に一部なんで
今回はNULL代入で乗り切ろうと思います
スマートポインタ使えよ
PS この方式だと宣言時に初期化しないものにも 全てNULLを代入しとく必要がありますね これ、クセにしようかな
そんな非効率で危険で幼稚な実装すんな
こいつ例外安全性とか全然考えてないんだろうな(笑) だいたいdeleteが散らばってる時点で設計がめちゃめちゃへたくそ
>>204 >参照カウントなので循環参照が危険かも
知りませんでした、ありがとう
auto_ptrはコンテナ使ってるから避けてます
コピーが発生すると所有権が移るんでしたよね?
マクロいいですね!思いつかなかったです
循環参照が気になるなら他のスマートポインタを使えばいい。 それより例外安全性の方が大きな問題だよ。
>>207 マクロよりtemplate関数にすべきだと思う。
設計から見直すべきだとは思うけど。
そうだね、大きな問題だね はいはい
>>205 すみません
ヘボなんで、まだ例外とか全然使いこなせてないっす^^;
例外が発生したらdeleteされなくなっちゃうんだよ。
newしたオブジェクトをコンテナに入れるのだったら、ptr_containerもあるぞ。
>>208 型安全性って全く詳しくないんだけど
型安全にするか、全く型安全にしないかの2択じゃなかったですか?
そうでないならちゃんと勉強せねば・・
今の例外の知識で作ると、中途半端になりそうなので
ちょっと怖いです、アドバイス頂いたのにすみません
>>209 どもです
テンプレートは、今は可読性もあるのでできるだけ使わないようにしてます
好きなんですけどね、テンプレート
>>214 型安全と例外安全は別物だよ。言葉からして違うし。
例外安全性はC++の用語なのでしょうか? どういうことだか教えてください。
怖いも何もスマートポインタに入れるだけでいいのに。君のコーディングの方が怖いと思う。
>>212 デストラクタで
if(t)delete tをやってみたところメモリリークしてました;
うーん、やっぱり例外学ばないとダメなんかなぁorz
new/deleteだけ気をつけるとかじゃ・・ダメ?w
>>213 それは初耳ですた!
調べてみます
>>214 どこに可読性の問題が…?
マクロを奨めないのは副作用の問題があるからだけど。
例外安全といえばExceptional C++。 ごめん、言ってみたかっただけ、俺もまだ読んだことない。
>>218 趣味でコーディングするならそれでもいいんじゃないか?C++始めたばかりだろうし、少しずつ覚えていけばいい。
まあスマートポインタは簡単に使えるしわざわざ生ポインタ使う理由はないと思うが。
>>215 あ、そうですね、プログラマのくせに適当ですません・・
>>217 他に理由をあげると、きちっと動作を理解してから使いたいってのがあります
スマートポインタにも色々あるみたいだし
>>219 そういわれるとちょっと悩みます
実際そんなにたいしたテンプレートにはならないだろうけど
他の人もこのコードにふれる可能性があるので
Exceptional C++ Styleの訳本も出たな。
>>220 持ってるけど、読んでなかった・・がーん
なんかむずそうだから後回しにしてた
うーむ、読まないと
>>221 ふむふむ
一つのカンタンな解としては
基本的には循環参照ってのだけ気をつけておいて
スマートポインタを使えばええんでしょうか
循環参照は・・これから調べますw
というかみなさんすごいいっぱいアドバイスくれて
ありがとうございます!
int a = new int[0]; ってどうなります?確保されないのか1つだけ確保されるのか・・・
0個確保される。
227 :
225 :2006/10/04(水) 02:01:49
・・・というとこのコードは意味なしということですか? それとも0個確保されるというのは何か意味があるのでしょうか・・・
>>227 実装次第では仮令0個でもdelete[]しないとメモリリークする。
アレ? スタック上に生成する配列の場合、 0 だとコンパイルエラーになっちゃうけど、 new の場合は 0 でもいいんだっけ?
230 :
225 :2006/10/04(水) 03:33:00
>>228 すいません・・・仕組みが理解できなくて
例えばどういった実装でメモリリークが起こるのでしょう?
よかないのが普通だろうが、コード自体は不正でもなんでもない。 mallocにサイズ0を渡してもNULLが返ってくるわけじゃなく、 大抵の場合newもそれに倣った動作をしてよこす。 つまりヒープの管理領域だけは消費されてしまう。 newが実値を返す以上はdelete[]しないとメモリリーク確定。
232 :
225 :2006/10/04(水) 03:43:48
なるほど、使えないけど領域だけは食うということですか deleteが必要というわけですね
>>230 >>229 例えば、こんなコードを考えれば0個確保はできないといけない。
int main(int argc, char ** argv)
{
int a = new int[atoi(argv[1])];
delete[] a;
return 0;
}
また、delete[]を実装するためには何個確保できたか記録する必要がある。
その記録をヒープ上に確保するなら、delete[]しないとメモリリークになる。
new int[0]がぬるぽを返すのはまずいのかな。
>223 マジで出てるし More Exceptional の方を先にするのが道理だと思うのだが……
>>234 new (nothrow) だったら確保の失敗と区別が出来なくなる。
それと
_
ミ ∠_)
/
/ \\
ウイーン Γ/了 | |
ウイーン |.@| | | ガッガッガッ
| / | . 人
|/ | < >_Λ∩
_/ | //. V`Д´)/ ←
>>234 (_フ彡 /
237 :
デフォルトの名無しさん :2006/10/04(水) 10:10:17
谷崎潤一郎
テンプレートクラスで、その型がfloatならAの処理をして、 それ以外なら何もしないといった処理はどうやればいいでしょうか? その(floatの)クラスを継承したクラスを作ればいいような気もするんですが、 出来ればfloatの時とそうでないときで、透過的に使えるようにしたいんです。
特殊化のこと?
>>239 すいません。ちょっと調べてみた所特殊化だと
同一の処理を行う部分も書き直す必要があるのではないでしょうか。
一部のメソッドのみを書き換えたり、メソッドを追加するだけのようなコトがしたいんです。
共通の部分をくくりだせばいいよ
共通部分を関数テンプレートで書く。
>>241 ,242
どういうことでしょうか?
ベースとなる汎用のクラスFooがあるときに、
Foo<double>で変更部分のみ記述したら
変更部分以外は無かったことにされました。
外部に template <class T> void foo2(T param) などの下請け関数を作り、共通部分はそこで処理する。
>>244 そういうことでしたか、大がかりな変更になるんですね。。
一度それでやってみます。ありがとうございました。
内容がほとんど同じなら、typeinfo(T) == typeinfo(float) などで 分岐させられないか?
247 :
とおりすがり :2006/10/04(水) 13:10:30
typeinfo はいや。 さしみ
>>246 typeinfoなんか使ったらコンパイル通せなくなるかもよ
>>243 下のコードを VC2005express で試してみたら期待通り f2() だけ特殊化されたよ。
なかったことにされたっていうのは具体的にどういうことなのか教えて。
#include <iostream>
using namespace std;
template<class T> struct G {
void test() { f1(); f2(); f3(); }
void f1() { cout << "G::f1" << "\n"; }
void f2() { cout << "G::f2" << "\n"; }
void f3() { cout << "G::f3" << "\n"; }
};
template<> void G<double>::f2() { cout << "Special G::f2" << "\n"; }
int main() {
G<int> gi;
gi.test();
G<double> gd;
gd.test();
}
UTF-8扱えるようにbasic_string<char>を改良しようと思うんだけど どこから手をつければいいの? class ustring : std::basic_string<unsigned char>{ この中に何が書けばいいのか解らない
>>250 まずはchar_traits<unsigned char>からなんだろうけど。
しかも、basic_string<>は仮想デストラクタを持ってないし、継承されることを
前提にしてない。
>>250 UTF-8 を扱うのに std::string に何の不満がある?
typedef std::basic_string<unsigned char> ustring;で十分な気がする。 char_traits も特に特殊化する必要があるものはないと思う。 後はwstringとの変換をする関数を作れば十分だろ。
>>251 private継承して公開するメンバをusingすれば安全じゃね?
面倒だけど。
private継承使うならコンポジションも考えよう
257 :
デフォルトの名無しさん :2006/10/06(金) 08:28:24
コンポジションってなに? private メンバとして持てばいいじゃないってこと?
そう。包含ってやつだ クラス間にis-a関係が成立しないなら なるべくそうした方がいいらしいぞ
259 :
デフォルトの名無しさん :2006/10/07(土) 09:00:47
重〜い計算ソフトの2次元版と3次元版を並行して作っており、 悩んでいることがあります。 例えば、2次元版で、 for (Vec2D vec(0, 0); vec[0] < maxVec[0]; vec[0]++) { for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++) { foo(vec); } } であった箇所が、3次元版では for (Vec3D vec(0, 0); vec[0] < maxVec[0]; vec[0]++) { for (vec[1] = 0; vec[1] < maxVec[1]; vec[1]++) { for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++) { foo(vec); } } } となります。 できれば、2D/3Dのソースの2元管理はしたくないし、 大量の #ifdef をソース中にばら撒くこともしたくありません。 ループの深さの違いをうまく吸収して、 2D/3Dを共用するアイデアはないでしょうか? (元々、巨大な計算なのでパフォーマンスに影響は与えたくありません)
261 :
(^-^) ◆MONSOON/qo :2006/10/07(土) 09:50:30
計算量の多いところ(3D)を高速化すれば2Dはそれに含まれそれ以下の速度
262 :
(^-^) ◆MONSOON/qo :2006/10/07(土) 09:56:22
回転とかだったら一度に全部が動くわけではないんだから結局は一次元とかに分割されるでしょ
for (vec[2] = 0; vec[2] < maxVec[2]; vec[2]++) { foo(vec); } だけくくり出してテンプレにでもしたらいいべや
>>254 typedef std::basic_string<unsigned char> ustring;
で十分なんだろうけど
operator<<とかこのへんは最低限実装しないとダメだよね?
265 :
デフォルトの名無しさん :2006/10/07(土) 14:00:13
java.util.concurrent にあるような「待機状態のない」FIFOキューの C++での実装って、どこかにない?
266 :
デフォルトの名無しさん :2006/10/07(土) 14:02:23
>>259 です。アドバイスありがとうございます。
>>260 問題依存のメンバー関数があったりするので blitz++ の利用は
見送りました。
それから、ご指摘の箇所がヤバイ理由はよくわからないのですが...
>>261 2Dでも十分遅いので...(涙)
>>262 最内ループの部分は、行数も含めて可変ですので template 化は
困難かと...
267 :
デフォルトの名無しさん :2006/10/07(土) 14:05:53
引き続き
>>259 です。
>>262 class abstract
{
virtual bool Scan() = 0;
}
class VecXD: public abstractVec
{
bool Scan();
}
あるいは、
class PolicyXD{ ... }
teplate<typename DimPolicy> Vec: public DimPolicy
{
bool Scan();
}
と定義しておいて、
while(vec.Scan())
{
foo(vec);
}
て感じでしょうか?
virtual を使いたくないし、後者もfor ループではなくなると、
無駄なコードが出力されるような予感がします。
template<int I> struct Loop{ template<class T> void calc(T& vec){ for(vec[I]=0; vec[I] < maxVec[I}; vec[i]++){ Loop<I-1>::calc(vec); } } }; template<> struct Loop<0>{ template<class T> void calc(T& vec){ foo(vec); } }; Vec3D vec; Loop<3>::calc(vec);
269 :
デフォルトの名無しさん :2006/10/07(土) 14:33:04
<<245 template<typename T> class Test { public: Test() { Val_[0] = 100; Val_[1] = 1000; } T GetVal() { return Val_[0]; } private: T Val_[2]; };
270 :
デフォルトの名無しさん :2006/10/07(土) 14:35:34
(続き) template<> double Test<double>::GetVal() { return Val_[1]; } としておいて Test<int> testInt; Test<double> testDouble; std::cout << "Int: " << testInt.GetVal() << " Double: " << testDouble.GetVal() << "\n"; とやったら、Int: 100 Double: 1000 とでましたが
>>270 >とやったら、Int: 100 Double: 1000 とでましたが
で、だから何?
>>271 std:queue は順列コンテナSequenceを自分では実装していないし
デフォルトのSequenceであるdequeが「 「待機状態のない」FIFOキュー」だなんて話はきいたことがない。
「待機状態のない」ってどういう事なの?
マルチスレッドで排他なしでちゃんと動くってこと
>>276 マルチスレッドを考慮していない現状の C++ 標準にそんなコンテナあるわけ無い。
何をどう考えたら、それが「待機状態のない」なんて表現になるんだ?
Lock-free と同義?
non-blocking ってことだしょ
実際には、要素の追加だけはブロッキング不要で取り出しはブロックかかるはずだけど まあそれはどうでもいいか。
Lock-free や Wait-free アルゴリズムを作るには、CPUが専用のアトミックな命令を提供し、それを使う必要がある。最も重要なのは、「比較して交換」(Compare and swap, CASと省略する)である。 つーわけで C++だけではこの機能は実装できない。
CPU、コンパイラ別のアトミックな命令の使用例は boost::shared_ptr の参照カウンタで使われてるのが参考になると思う。
LinuxとFreeBSDはカーネル読めばそこそこ悩めば実装できると思うよ
Google Code of Summer で Lock-free Container のプロジェクト提案されてたなぁ 結局誰も取らなかったのかな,あれ
290 :
デフォルトの名無しさん :2006/10/07(土) 21:26:26
>289 >Google Code of Summer 間違えた. Google Summer of Code だ
標準とやらをすぐに持ち出す規格厨ばっかでマジツマンネーな
それがこのスレのいいところ
時々規格厨の人につっこんでもらわないと、普段使ってる実装の挙動だけで脳内完結しちまうしな。 モヒカン乙というか。
このスレはC++規格票の人力検索エンジンです
適当なこと言ったり軽く煽ったりすると、規格を引用してくれるから便利だよねw
たまに
>>277 みたいな人の話を聞かずにレスするバカもいるけどな。
質問よろしいでしょうか…… クラス内クラスのアクセス制御て、クラス内クラスのメンバのアクセス制御には 影響しないんだっけ? とりあえずVC++ 8.0では通ったみたい。 class A { private: class B { public: void test() { std::cout << "test" << std::endl; }; }; B b_; public: B& b() { return b_; }; }; int main() { A a; a.b().test(); // ok? A::B b(a.b()); //NG }
>>297 影響しないよ。下は VC8 でも NG なんだよね?
何が問題なのか理解するまで30秒かかった。 なんだこりゃwこれ通っちまうのか、VC。見損なったわ!
303 :
297 :2006/10/08(日) 02:12:33
>298 そうか、OKなのか。サンクス 何かおもしろいことできそうかな……と思ったけど、 delete &(a.b()); が通っちまうのね…… class B { ~B() {}; friend A; public: void test() { std::cout << "test" << std::endl; }; }; とすりゃいいけど、これはこれで面倒か……
俺は関数定義の } の後に ; つける奴は信用しない。
いくらprivateにしても、参照を返したら何にもならんだろ。
>>297 ややこしいこと書いているが、
> A::B b(a.b()); //NG
< A::B x; //NG
の時点で駄目だぞ。
>299 >301 >306 ごめん。誤解しちまったか…… A::B b(a.b()); //NG 自体はコンパイル通らんです。コメントアウトしとけばよかったな。 >305 確かにそうか。 カスタマイズポイントに使えないかな?と思ったけど、よくよく考えたら クラス内クラスの時点で継承できない(カスタマイズできない)よね……
ちょいと質問だが、 複数のテンプレート引き数を取るテンプレート関数の、一部引き数だけの特殊化ってできるんだろか。 例えば template<typename T, int N>inline T factrial(T s = 1){return factrial<T, N - 1>(s * N);} template<>T factrial<T, 1>(T s){return s;} みたいなことがしたいんだけど。 template<>double factrial<double, 1>(double s){return s;} これなら巧くいくんだけどね。
できるよ。まぁ、コンパイラによるかもね。
313 :
310 :2006/10/08(日) 11:56:00
>>311 にえ〜、gcc@cygwinで通らない〜(TT
>310 >template<>T factrial<T, 1>(T s){return s;} 普通に特殊化しているように見えるけど…… template<T>T factrial<T, 1>(T s){return s;} の間違い?
316 :
310 :2006/10/08(日) 12:15:50
いや、それはTが未定義とエラーにされる。 TとNのうちNだけ特殊化ってのはできないのかねぇ。
>>315 typenameが抜けてますよ。(これでもダメだけど)
template<typename T>T factrial<T, 1>(T s){return s;}
テンプレート関数の部分特殊化は禁止されてるはず。
テンプレート構造体ならなんとかなる。
template<typename T,int N>
struct factorial
{
T operator()(T s=1){return factorial<T,N-1>()(s*N);}
};
template<typename T>
struct factorial<T,1>
{
T operator()(T s){return s;}
};
>>310 関数テンプレートは部分特殊化できない。
(関数テンプレートを部分特殊化できちゃう処理系があるかどうかは知らん)
クラステンプレートなら部分特殊化できるから、
実体はクラスにして入口だけ関数にする感じでがんばれ。
319 :
315 :2006/10/08(日) 12:52:57
>317 指摘サンクス >310 Exceptional C++ Styleにちょうどその話題が載ってるから、買って読んどけ そういや、More Exceptional C++の邦訳は出ないのか……?
D&Eには、関数テンプレートは部分特殊化はしてもいいかもしれないけど、 まだ良く分からないからやめてるんだと書いてあったはず。 頑張ってC++0xには入れてほしい。
321 :
310 :2006/10/08(日) 14:13:47
>>317-319 レスTHX、本も探してみる。
で、結局、>317 ではTへのキャストオペレータがなくて巧くなかったのでこうなった。
関数版と名前がぶつかるのも回避。
#include <cstdio>
#include <cstdlib>
template <typename T> inline T factorial(const int n, const T s = 1) {return n <= 1 ? s : factorial(n - 1, s * n);}
template<typename T, const int N> struct Factorial {operator T() const {return Factorial<T, N - 1>() * N;}};
template<typename T>struct Factorial<T, 1> {operator T() const {return 1;}};
int main(int argc, char ** argv)
{
printf("%d\n", factorial<int>(atoi(argv[argc - 1])));
Factorial<double, 10> foo;
printf("%.20g\n", double(foo));
printf("%.20g\n", double(Factorial<double, 21>()));
return 0;
}
テンプレート引き数だと定数性が求められるから、末尾再帰じゃなくても大丈夫ってことですかね。
Exceptional C++ Styleにまんま載ってるよ、それ staticメンバ使ってたけどな
323 :
デフォルトの名無しさん :2006/10/08(日) 16:55:05
質問です C++でC言語ライクなスクリプト言語を作ろうとしているのですが まずファイルを読み込み、string scriptに収納します。 次にscriptのコメント(/* */)を削除するのですが、 ここでbool DeleatComment(string &str);という自前の関数を使って while(DeleatComment(script));と、コメントが全て消えるまでループさせるのですが なぜかコメントが消えません。/*と*/が消えるだけなのです。 問題のDeleatCommentの部分は bool DeleatComment(string &str){ string::size_type com_begin = str.find_first_of("/*"); if(com_begin != string::npos){ string::size_type com_end = str.find_first_of("*/",com_begin); if(com_end != string::npos){ str.erase(com_begin,com_end-com_begin+2); return true; } } return false; } こうなってます。
英語勉強しな
>>323 find_first_of() ではなくて find() だと思うそこは
326 :
デフォルトの名無しさん :2006/10/08(日) 17:24:25
>>325 ありがとうございます!
なぜだかよく分かりませんが、findにしたら消えました
>>324 どこかでdelatCommentを使っちゃったんだろ。
初心者はよくやる。察してやろうZE
>>326 std::string::find_first_of(A, B)は文字列Aの中から
「文字列Bの中のどれか一文字が最初に見つかったindexを返す」
のでした
<algorithm>のstd::find_first_of()の説明を見るとなんとなくわかるかもしれない
330 :
デフォルトの名無しさん :2006/10/08(日) 17:37:17
>>324 すみません、deleatではなくdeleteでしたね
今気づきました
>>329 ごめん俺が馬鹿
find_first_of(A, B)
を
A.find_first_of(B)
に置き換えてみると俺が救われます
333 :
デフォルトの名無しさん :2006/10/09(月) 13:05:57
こんな意味不明な警告が出たんですけど、なんのことやらさっぱりです! warning C4786: 'std::reverse_bidirectional_iterator<std::list<std::basic_string<char,std::char_traits<char>,std::allocator<char> >, std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::iterator,std::basic_string<char,std::char_traits<char>, std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>, std::allocator<char> > *,int>' : 識別子が '255' 文字に切り捨てられました (debug 情報内)。 list<string>を定義したら出たので、その辺の警告なんだと思いますが・・・
日本語嫁
超FAQ
336 :
デフォルトの名無しさん :2006/10/09(月) 13:13:56
>>334 listの< >内が255文字以上あるということですか?
337 :
デフォルトの名無しさん :2006/10/09(月) 13:17:28
338 :
デフォルトの名無しさん :2006/10/09(月) 13:21:33
じゃあlist< >の中に同じSTLのstringとかstackとかが入るとまずいっていうことですか?
340 :
デフォルトの名無しさん :2006/10/09(月) 13:28:18
よくわからないので諦めます
341 :
デフォルトの名無しさん :2006/10/09(月) 13:40:20
>>338 違います。
336の方が正解に近いな。
>>333 俺にもさっぱりだが、
>339
を見る限り、
・VC++の環境依存っぽい
・キニスンナ
ということは解る。
343 :
デフォルトの名無しさん :2006/10/09(月) 13:45:00
読売 北朝鮮が核実験を実施・・・朝鮮中央通信 産経 北朝鮮が核実験を実施 毎日 北朝鮮:中央通信「核実験行った」報じる プルトニウム型 日経 「核実験を実施」中央朝鮮通信 --------------------ここまで日本の新聞---------------------- 朝日 北朝鮮「地下核実験に成功」
さっさと核戦争始まらないものかねー
STLが多様してあると読みずらいよね?
逆に読みやすいです
std::だらけになってお願いしますusing使わせてくださいって 思うときはある
>>348 上司に
「関数スコープ単位での"using namespace std;"は常識なんだよ」
って言うじゃない。
・
・
・
・
そしたら、あんたクビだからぁ〜〜。
usingとusing namespaceは別物。
351 :
(^-^) ◆MONSOON/qo :2006/10/09(月) 19:24:08
bsearchが正しい値を返さないのですがどこがいけないのかわかりますか? N=100; int *d = new int [N]; // dには適当な数値が入る k=13421030; q=(int *)bsearch(&k, d, N, 4, f); x=(int)(q-d)+1; //サーチした番号 int f(const void *a, const void *b) {return (*(const int *)a - *(const int *)b);}
352 :
(^-^) ◆MONSOON/qo :2006/10/09(月) 19:26:28
あと、比較関数を int f(const void *a, const void *b) {return (*(const int *)b - *(const int *)a);} に変更しても結果は同じになるんでしょうか? 別の番地が返ってくるのですが
int [N]はちゃんとソートしてる?
>>348 そういう時に export template<> だと実装側にusingが使いまくれて経済的
355 :
(^-^) ◆MONSOON/qo :2006/10/09(月) 19:34:02
>>353 ばっちりしてあります 出力して確認済みです
実際にはN=57928730なんですが
数字が大きいと誤作動したりするんでしょうか
んーnewした領域はたかだか220Mほどしかないし、誤動作するとすれば もしかしたらsizeof(int) != 4の環境かねえ。
>>351 C++なんだからlower_boundとか使えじゃ駄目?
358 :
(^-^) ◆MONSOON/qo :2006/10/09(月) 19:44:41
>>356 駄目でした 4でした
どんな値でも、初めの200番代くらいまでの番号しか返してきません
>>357 つかってみます!
例えばこれなんかちゃんと動作するよ。何か間違ってないか? int main() { const int N = 100; int* d = new int[N]; // dには適当な数値が入る int k = 13421030; std::fill(d, d + N / 2, 0); d[N / 2] = k; std::fill(d + N / 2 + 1, d + N, k + 1); int* q = (int *)std::bsearch(&k, d, N, sizeof(int), f); int x = (int)(q - d) + 1; //サーチした番号 std::cout << x << std::endl; } int f(const void *a, const void *b) { return *(const int *)a - *(const int *)b; }
レス番が飛んでる
361 :
(^-^) ◆MONSOON/qo :2006/10/09(月) 19:55:22
>>359 10個や100個の連番で実験するとうまくいくのですが本番では失敗します
ちゃんとソートされているかどうかをプログラムで確認してみます
>>361 んだね。std::qsortとかstd::sortの呼び出し方が間違っているのかもしれん。
363 :
(^-^) ◆MONSOON/qo :2006/10/09(月) 21:04:01
>>362 原因解明しますた 358にヒントがありました
xがunsigned char型だったのを忘れてしまっていたようです
そりゃ255までしか……って、何故そんなところにunsigned charなぞ使うw
最初っからコンパイルできるソースを貼れってことだな。
('A`)
(´ω`)
さすがにそこまでエスパーレスは出来なかったわ。
誰か比較関数の整数オーバーフローについてつっこんでやれよ。
>>370 あの比較関数だと a と b が取り得る全範囲の数値の組み合わせの中で
約半数の組み合わせで比較関数が期待されるのとは逆の結果を返すだろ。
ifもしくは?:演算子で分岐か。
switch〜caseで行ってみよう〜
374 :
デフォルトの名無しさん :2006/10/11(水) 20:54:23
C++ のソースコードのカバレージを測定するフリーのツールってありますぅ?
スレ違い
ソースコードのカバレッジってなんだろう? テストのカバレッジならわかるんだが。
>>376 PureCoverageみたいなやつのことでしょ?
カバチャン
誰がカバやねん!
ファイル分割し、それぞれのソースである1つのクラスを使用したいのですが、 オブジェクトの生成を何処ですればいいのでしょうか?
データでかくないなら、起動時がオススメ
383 :
380 :2006/10/12(木) 06:25:00
>>381 >>382 レスサンクスです!質問の仕方が悪かったです、すいません。
AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成
する場所は何処でするのか?という初心者丸出しの質問なんですが。
やはり共通のヘッダで宣言するといった形でよろしいのでしょうか?
そうそう。共有ヘッダーで宣言しないと、とっても、みずらくなっちゃうから、共有ヘッダーで、ぜんぶ、宣言してね
>384 こらこら
どう考えても「連鎖」って訳はおかしいだろ……
誤爆やん
>383が>380に比べて質問のしかたがよくなったとは思えんのだが てか,「生成する場所」を「ヘッダで宣言」て・・・?
>>383 extern の使い道を考えてみるといいかもしれません
390 :
389 :2006/10/12(木) 11:18:04
>>386 誤爆に正式爆撃先がマジレス
http://pc8.2ch.net/test/read.cgi/tech/1143608073/ 外国の単語にも複数の意味がついているのに
特定団体が利便性の為「だけ」で一つの日本の単語にあてはめる姿勢が駄目
だから単語の揚げ足取りばかりに終始して全く議論が進まない
Sequence という単語から複数本伸びている「枝(意味)」のうち私が選んだ一本を
私は日本の単語「連鎖」に当てました
しかし
連鎖という単語から複数本伸びている「枝(意味)」のうち貴方が選んだ一本が
Sequence という単語に当てられるかどうかまでは私には判りません
以降は上記スレで
スレ違い失礼致しました
392 :
390 :2006/10/12(木) 12:13:07
>>391 毎日が妄想嫁とのラブラブハネムーンです><
GAを使った卒論でFラン大でもできる題材ないですか?
>>390 いいから原文のみを貼り、変な訳語は一切付けるな。以上。
395 :
380 :2006/10/12(木) 21:33:11
レスして下さった皆様、感謝です。
まだまだ、言葉足らずで申し訳ないです。
1つのオブジェクトを複数のファイルから参照出来るようにしたい、
この場合のオブジェクトの宣言は何処でどのようにしたらいいのか。
と、この様な書き方(言い方?)でいいんでしょうか?うまく伝わるか自信ないのですが。
>>389 externを使えば出来るのですね。有難う御座います。
以前、変数に対してexternを使用した時はすんなり出来たのですが、
記述の仕方が悪かったのか、クラスの場合は出来なかったのです。
もうちょっと頑張ってみます。
要するに↓こういうことでっしゃろ? >AとBという二つのファイルでCというクラスを使用する際、オブジェクトを生成 >する場所は何処でするのか? ↓ AとBという二つのファイルでCというクラスのオブジェクトを使用する際、オブジェクトを生成 する場所は何処のファイルでするのか?
>>395 もしかしてこーゆーことがしたかったんかな?
// C.h
class C {
public:
static C& getInstance();
};
// C.cpp
C& C::getInstance() {
static C instance;
return instance;
}
ストロー・ストラップマンセー
お禿さま
あ〜,
>>380 は「クラス」と「オブジェクト(→インスタンス)」の区別がついてないのかな?
>>401 文脈からfile.objの事でないか?
Exceptional C++ Style日本語版買ってきた。今から読む。 取り敢えずめぼしい書籍はこれ位しかなかった。
Exceptional C++とか読むヤツ居るんだな・・・ 変態的と評される程ムズいと聞いて以来、 手に取ったことすら無いw
Exceptional C++ Styleってどんな内容? Exceptional C++は読んでるんだが想像つかん
そこまで難しいことも無い。
>>407 Exceptional C++を読んでいるなら、Exceptional C++ Styleは軽い読み物
だと思う。無理に買う必要はない内容。
410 :
380 :2006/10/13(金) 16:48:50
皆様、レスありがとです。度々すいません。
>>396 そうですね。それ+どのようにっていうのがあると助かります。
>>397 これが
>>400 氏が仰っているシングルトンと言う物(?)なのでしょうか?
ちょっと調べた感じではこれで良いような気がしました。どもです。
変態的なのは「Modern C++ Design」だよ。 あれはおもしろい。役に立つかどうかは不明。
Modern C++ Desgin は今改めて読むとめちゃくちゃ分かりやすい入門書だと思う。 Boost みたいに変態的な手段を使わず、基礎を知るには非常にいい本。
>>380 もしかして以下のようなこと?
//--- foo.h ---
class C {
....
};
extern C c; // どこかにあるグローバル変数cを参照するための宣言
//--- foo.c ---
C c; // グローバル変数cの実体を定義
//----aaa.c---
#include "foo.h"
void func_a()
{
c.meber_func1(100); // cにアクセス
}
//----bbb.c---
#include "foo.h"
void func_b()
{
c.meber_func2(); // cにアクセス
}
上の例はオブジェクトcをグローバル変数で定義しているから改めて生成はしていないけど、
グローバル変数としてCのポインタを定義、宣言するなら、オブジェクトの生成(c = new C)は
aaa.cでもbbb.cでもOK.
シングルトンって結局グローバル変数なんじゃないの カッコいいネーミングしてるが。 っと使ったこと無いが言ってみる
シングルdはクラスとインスタンスが必ず1:1の関係になる設計じゃね? っと使ったこと無いが言ってみる しかしEffectiveC++ホントに面白いな ここ数日必携の書になってる(*´ω`)
必要があれば複数のインスタンスを生成することも可能なのがSingletonの利点の一つ。
>>414 グローバル変数は生成されるタイミングを制御しにくい。
A a;
B b;
で、a のコンストラクタが b を使いたいときなど。
Modern C++ DesignのSingletonはいくらなんでも ライブラリ利用者疑いすぎじゃないかって思えてくるな。
atexitに登録された関数から使われたらまずいかも、とか考えてたんだっけw
なんか人が書いたソースを見てると、 ::AfxBeginThread(略); みたいな書き方で関数を使ってる部分があるんですが、「::」の意味がわかりません。 こういうのって左側にクラス名も書くものじゃないんですか?
ああ、なにも書かないと一番外側
namespaceに入っていないグローバルスコープな関数を呼んでる。 (でも多分実際はVSのインテリセンスを動かすため)
いや、MFCがWin32APIと同名のメンバ関数作りまくるんで、APIのほうを明示的に呼ぶときには::つきで書く習慣がある。
424 :
420 :2006/10/13(金) 23:00:41
大体わかりました。「::」は書かなくてもいいけど、 書いた方が明示的になるし入力候補も出るから便利ってことですね。
>>420 書かなきゃならん場合もある。てか、予めそーゆー事態も想定しての明示。
>>420 は namespace を理解できていない気がする。
>424 名前解決のやり方が変わるので、明示的にグローバルな名前空間の 関数を呼びたいときはこうすべき。
429 :
デフォルトの名無しさん :2006/10/15(日) 13:36:07
質問です。 仮想関数を持つクラスにはvtblなどの隠れたデータが挿入されますよね? で、純粋仮想関数をもつクラスには挿入されないと思いますが、それを継承したクラスには必ず隠れデータが挿入されてしまいますか?
>>429 純粋仮想関数を持つクラスにも vtable は要るよ。
431 :
デフォルトの名無しさん :2006/10/15(日) 13:48:30
インスタンス化されないのにですか?
>>431 継承されたクラスのインスタンスには基底クラスのインスタンスが含まれる。
433 :
デフォルトの名無しさん :2006/10/15(日) 14:00:49
多重継承の仕組み教えて。
434 :
デフォルトの名無しさん :2006/10/15(日) 14:03:43
なるほど。 では、純粋仮想関数と普通の関数のみを持つクラスにはvtableは挿入されないという解釈は正しいですか?
>>434 普通の関数の有無に関係なく、(純粋でも、そうでなくても)仮想関数があればvtableは必要でしょ。
つ C++STD 10.4 純粋仮想関数を特別扱いする規定は無さそうだから、普通の仮想関数と 同じように扱う必要があるんじゃね? 実際は(vtbl含めて)実装次第だと思うけど。 というか、何でそんなにこだわるのかわからん。
実装系に依存するやろ。
vtableは仮想関数(広く言うとメンバ関数)の実装方法だから。
つか
>>429 で「隠れた」って自分でいうとるやないか。
アホじゃね?
438 :
デフォルトの名無しさん :2006/10/15(日) 14:55:27
えーと、派生させる予定のないクラスA,Bがありましてそれらの共通するインターフェースを純粋仮想関数をもつクラスIとしてくくりだそうと思ったのです。 このときA,BをそれぞれIから継承したとすると自動的にA,Bも仮想クラスになってしまうのかと思ったのです。 つまり本来必要ない無駄なオーバーヘッドが生じてしまうのではないのかと思いまして、質問した次第です。
それならテンプレートでいいのでは?
A, Bを実行時多相で扱いたいならvtblのコスト払うのは至極真っ当 A, Bに実行時多相が必要なく単に共通の実装を括り出したいだけなら vtblのコストを払わずに実装を括り出す方法は他にたくさんある
441 :
デフォルトの名無しさん :2006/10/15(日) 15:10:39
分かりました。違う方法を考えてみます。 テンプレートってのは派生クラスをテンプレート引数にして基底クラスに渡せってことでしょうか。んで基底クラスを派生クラスにキャストすると。なるほど。
だから多態したいのは実行時なのかコンパイル前なのかと。
>>441 キャストが必要になった時点で何かおかしいと気付くように。
444 :
デフォルトの名無しさん :2006/10/15(日) 15:22:12
>>441 その方法だとインターフェースの継承には向かないと思うよ。
445 :
デフォルトの名無しさん :2006/10/15(日) 15:24:55
thisを派生クラスのポインタ型にstaticキャストしてインターフェースクラスから派生クラスのメンバ関数を呼び出せばよいのではないでしょうか…boostの何かでこんな実装をしてた気がします。
こんにちは。Visual Studio 2005 Visual C++ express editionを使っています #include <iostream> using namespace std; int main() { int num; int sum = 0; cout << "いくつまでの合計を求めますか?\n"; cin >> num; for(int i=1; i<=num; i++){ sum += i; } cout << "1から" << num << "までの合計値は" << sum << "です。\n"; return 0; } 上記コードがビルドできないんですが何故でしょうか?
447 :
デフォルトの名無しさん :2006/10/15(日) 15:32:27
>>445 それは、インターフェースじゃないでしょ。
見かけ上の基本クラスから派生クラスのメソッドを呼び出すだけなら
それでもいいよね。
エラーメッセージを貼れとママに言われなかったかい?
449 :
446 :2006/10/15(日) 15:33:04
エラーメッセージは下記です。 Sample34.cp error C3872: '0x3000': この文字を識別子で使用することはできません error C2146: 構文エラー : ';' が、識別子 ' ' の前に必要です。 error C2065: ' ' : 定義されていない識別子です。 どなたか原因の分かる方がいればお願いいたします
450 :
デフォルトの名無しさん :2006/10/15(日) 15:36:46
>>447 ああ、そっか。インターフェースっていうからまずかったのですね。すいません。
要は実行時のコストなしで共通する実装を括り出したいだけだったんです。煩わしい言い方してすいませんでした。
iterator_facadeでした今思い出しました。解決しました。
全角空白が入っている。エラーメッセージにも書いてあるよ。 なれないうちはエラーメッセージが出たというだけで、 何か分からないことが起きているとすぐ諦めがちだが、 とりあえずメッセージをよく読む習慣をつけるべし。 そのうち分かるようになるよ。
ここは本当に役に立たないインターネットですね
ダメな奴にはどんな情報も役に立たないからな
>450 ポリシークラス使え protected 非仮想デストラクタにするのを忘れるなよ
>>451 446
ありがとうございます!
何度見てもおかしな点がなかったので途方に暮れていたのですが、全角が入っていたとは・・・
エラーメッセージの読み方がまだわからないので、これから勉強したいと思います
ありがとうございました
>452 馬を水飲み場まで連れて行くことはできるが水を飲ませることはできない
457 :
デフォルトの名無しさん :2006/10/15(日) 15:59:31
>>454 共通する実装を派生クラスにして異なる実装をポリシーとして渡してそれを基底にするってことですか?
実はコンストラクタが異なるので派生クラスにしないといけないんですよ…う〜む。
>>456 「ミネラルウォーターじゃなきゃヤダ!」とか言って
そっぽ向く馬もネットにはたくさん居るしな。
459 :
デフォルトの名無しさん :2006/10/15(日) 17:38:53
template < class _Policy > class Interface
{
public:
void F()
{
policy_.F();
}
private:
_Policy policy_;
};
class Policy
{
public:
void F(){ /* impl */ };
};
こんなの?
>>454 protected 非仮想デストラクタにするのを忘れるなよ
ってのがよくわからんのだが。
>459 Policy クラスを継承することを想定しているんでしょう 継承する場合,459のような例ではEBCOが効く可能性があるという利点があります
template < class _Policy > class Interface :private _Policy
{
public:
void F()
{
_Policy::F();
}
};
class Policy
{
protected:
~Policy(){ /*ぷろてくてっどっと。*/ };
public:
void F(){ /* impl */ };
};
継承すれば最適化されてPolicyクラスが0Byteになることがあるよってことね
>>459
EBCOなんか聞いたことないぜー ググっても出ないし。 流れからするとEmptry byte class optimizationとかそんなの?
_Policy はマズイな。
>>462 Empty base class optimization
>>461 みたいな書き方どっかで見かけて
何で継承してるんだろうとか思ってたけど、そういうことだったのか…。
どっかで見たことあるなーと思ったらEffectiveC++に書いてあるんね 身についてねえ('A`)
>>465 empty base optimization, EBO ともいう。つーかEBOで覚えてた。
どっちの名前も使われてるっぽいね。
strlenとかprintfとかはstd名前空間に入ってるのに assertが入ってないのはなぜなんだぜ? マクロとかそういうオチですか? vc8だとstd::assertでエラーだった。 gcc3.2だと通ったけど。
470 :
454 :2006/10/15(日) 19:36:01
>457 >461のことですな。詳細はModern C++ Design参照。 カスタマイズポイントをユーザーに提供しないんだったら 単純に包含でもいいかもね? ポリシークラスてそんなにマイナーだっけ? >460 いや、「実行時のコストなしで共通する実装を括り出したいだけ」 つうてるから忠告しただけ。 何も言わなかったら非仮想publicデストラクタを使いそうだからね。 詳しくは C++ Coding Standards参照
>>469 assert() はマクロ。 std::assert() は不正。
ポリシークラスっていう「名前」がマイナーなんじゃね MC++D前から同じようなのはいっぱいあった
>>469 #include <cassert>
でstd名前空間にあった気がする
名は体を表す って言うしな
画像処理プログラムを組んでいます。 ビットマップを読み込む自作クラスに class Bitmap { public : bool readBmp( string str ) {} bool writeBmp( string str ) {} }; のような感じでファイルを読み込む関数を作っていますが、ファイルの読み込みエラーが起きたときに 上記のような感じでbool型のfalseを返すか、例外をthrowするかで悩んでいます。 どっちでもいいっちゃどっちでもいいんですが、どうしても気になって・・・。。。 bool型を返すと Bitmap pic; bool flag; do { flag = pic.readBmp( "xxx.bmp" ); } while( !flag ); のような感じでファイルが読み込めるまで繰り返す、という処理をかけるのですが、 こういった記述は例外処理でも可能でしょうか? ※"xxx.bmp"は、他のプログラムでも使用していて、読み込みのタイミングによってはロックされているため
>>476 for(;;) try { pic.readBmp( "xxx.bmp" ); break; } catch (...) {}
>>475 すみません、VC8の環境でですが、
cassertヘッダの内部では
assert.hをインクルードしてるだけでした。
よって、std名前空間には入りません
>>476 「なんでビットマップにファイルが関係するの?」という些細な問題は端に追いやってしまったわけね
とりあえず俺なら例外を発生させる
わざわざ例外機構があるのに利用しないで条件分岐で対応するのは分が悪い
481 :
476 :2006/10/15(日) 23:06:46
>>478 ありがとうございます!
それでやってみます
>>479 根本的に、 assert() はマクロだから名前空間に入れることができない。
>>471 で FA 。
>>478 せめて必要な例外だけをcatchするようにしようよ……。
484 :
478 :2006/10/15(日) 23:11:07
485 :
476 :2006/10/15(日) 23:11:48
>>480 他にいい設計の仕方があれば助言をお願いします。
自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・
>>475 俺もstd::assertで使った記憶がある…
何でだろ…
487 :
476 :2006/10/15(日) 23:13:31
>>438 ,478
ケンカしないで;;
もちろん例外は必要なものだけ実装します
>>485 readBmp() の中でループまわせ。
489 :
476 :2006/10/15(日) 23:14:25
490 :
476 :2006/10/15(日) 23:17:08
>>488 それだと、ファイルが読み込めなかったときの処理が
読み込むまでループ
に固定されてしまいます。
読み込めなかったときの処理もある程度制御したいので・・・
とりあえず例外を発生させる形で組んで見ます
>>485 > 他にいい設計の仕方があれば助言をお願いします。
> 自分としては、Bitmapを扱う際には当然、ファイルから読み込む機能がないと不便だと思ったのですが・・・
そりゃ当然ファイルから読み込める機能がなきゃ不便に感じる。
でもそれをそのまま実現する必要は無いだろ?
今のBitmapクラスを説明すると次の様になる。
・Bitmap.readBmp(str)=ビットマップがファイル:strから読み込む
・Bitmap.writeBmp(str)=ビットマップがファイル:strに書き込む
本来ビットマップは「Bitmapped data」だけを専門にすればいいだけで、
こういった雑事はBitmapのCreatorさんが担うべき仕事だと俺は思うわけ
つまり
・Bitmap ('utility' , 'createBitmap' , str ) : 'utility'がファイル:strからBitmapを作る
・('utility' , 'writeBitmap' , Bitmap , str) : 'utility'がBitmapをファイル:strに書き込む
みたいな
まぁ、それほど酷使しないつもりならこのままでも悪くは無いかもね、という小さなこと。
>>491 わざわざ複雑度を上げることも無い。 YAGNI ってやつだ。
>>492 ぉぅぃぇ
まあ小さなことだし、ぶつかって機能分割するのもよしかと思ってる
めんどいときこそテンプレートで表現してしまうけどな。 template<IT > Bitmap::readBmp(IT first,IT last) {} file_bitmap.readBmp(file::iterator i,file::iterator end); stream_bitmap.readBmp(&str[0],&str[0] + sizeof(str));
495 :
476 :2006/10/16(月) 00:51:19
>>491-494 ありがとうございます。
まだC++使いこなしているわけではないので、とりあえずBitmap::readBmp()で実装してみて、
使いにくいようなら
>>491 さんの助言を参考にしてみます
char *x = new char[100]; // hogehoge for (int i = 0; i < 100; ++i) delete &x[i]; こんな感じに配列として確保したメモリを要素ごとに開放した場合、 正規の動作が保障されるのでしょうか? サンプルコードを書いて試してみたところ、vc2005では特に問題なく 動いた(ように見える)のですが、やはりdouble deleteされているのでしょうか?
未定義 newはdelete new T[]はdelete[] これ以外は鼻から悪魔
掛かってる梯子の途中を無くしたらどうなるんだろうな?
サードパーティーのヘッダーファイルと、 社内のヘッダー内でのtypedefを使った型定義が衝突して困ってます。 1.解決方法として社内ヘッダー側で、 サードパーティー側のヘッダーファイル内にdefineされているマクロシンボルを チェックして定義を回避する。 しかし、相互チェックではないので、ヘッダーのインクルード順に気を使う必要がある。 2.社内用のヘッダーをnamespaceで囲い、 内部を参照する時はスコープ解決演算子を伴って使用する。 しかし、C用のソースで使用できない。 これぐらいしか対処法が思い浮かばないのですが、他に良い解決方法はないでしょうか?
自社製の方を他の型にtypedefして元の型をundefする。
501 :
499 :2006/10/16(月) 13:56:58
>>500 C++にtypdefに対するundefや型が存在するかどうかチェックする機能ってありましたっけ?
>>501 衝突したtypedefを消去すればいいじゃん。
このスレ的にはCを捨てて名前空間使うのが一番では? C使っていたところもみんなベターCに。 そんなことできるわけないだろうけどさ。
質問です。 無名名前空間内で定義するクラスを前方宣言したいんですが、 どうすればいいのでしょうか? 無名名前空間外のクラスから friend 指定したいのですが、よくわかりません。 よろしくお願いします。
>>504 無名名前空間内で前方宣言すればいいと思うよ。
506 :
504 :2006/10/16(月) 19:06:16
>>505 あー、実際にやっていただければ、一目瞭然なのですが
namespace {
class Foo;
}
class Bar {
int i;
friend class Foo;
};
namespace {
class Foo // NG. 上記のFoo とは別物
{
// ここで Bar::i は使えない。
};
}
というわけで、アクセス違反が発生してしまいます。
507 :
504 :2006/10/16(月) 19:09:51
>>506 あれ、とおってしまった? なんで?
いや、私の勘違いだったようです。しつれいしました。
クラス内のクラスのコンストラクタなんですが class C1 { private: class CSub { public: ~CSub(); } }; のC1::CSubのデストラクタCSub()をcppファイルに定義したいのですが 無理なんでしょうか C1::CSub::C1::~CSub(){}としてもコンパイル不可のようで
デストラクタ~CSub()の間違いでした
C1::CSub::C1::~CSub C1が2回でてるぞ。
>>508 C1::CSub::~CSub(){}
エラーメッセージ嫁。
514 :
512 :2006/10/17(火) 07:53:27
凡ミスしてましたゴメンナサイ....w
あるクラスXと、そのサブクラスが複数(A,B,C)あるとき、 サブクラスの中のどれか一つを生成するメソッドが欲しいんですが、 なにか美しい方法はないでしょうか?
>>515 なんだか不思議な実装だけど、
サブクラスの位置にあるクラスをFactoryに見立ててみるといいかも
>>515 美しくないと思っている方法を示してもらわないと、話にならん。
まぁまて、どうもC++色しかないようにみえるんだが・・・
wikipedia: どうせなら > virtualにするとメモリリークにならない っつーのも説明加えちゃえば? これってC++の項目なんしょ?
C++なら普通はスマートポインタでリソース管理するからほとんど問題ないな。 GCでは管理できないハンドルの類まで適切に処理できるし。
>>518 > Bの領域分しか解放されない
ワロス
C++の場合は、deleteし忘れの問題はメモリリークよりもむしろリソースリークの方だと思うんだ。 >520 Category:C++やCategory:C言語に入っていないあたり、 C/C++以外も対象になると意図されているのではないかと思う。
それでもまだ C 言語と同等に扱われてるままだしw
>>518 すげぇ、最新版と変更前の版がひとっつも成長してねぇww
>>518 なお似たようなものにスマートポインタ(smart pointer)というものがあるが、これはライブラリとして提供されるガベージコレクションの一種である。
ところでいっそム板にWikipediaスレを立てたらどうか? 結構あちこちの板でWikipediaスレを見かけるんだが。
Javaのfinalのように、派生クラスを禁止させることはできませんか?
言語仕様には無いが、そういう事をするテクニックはググれば見つかる。
すごい初歩的な質問で申し訳ないのだけど・・・ int x[600][400]; と宣言して取り敢えずプリント文だけ書いたら普通に通ったんだけど、 int x[600][400], y[600][400]; と、二つ二次配列を宣言したら落ちるようになってしまった。。何故・・・? 普段はmallocとかやってるから、これを改めてやったら出来ない&分からなくて・・・。orz
お前は俺にエスパーになれと言うのか
でかすぎるスタックはダメとかじゃなかったかしら?
535 :
532 :2006/10/18(水) 20:45:14
スマソ。一応全部載せると、 -----------start----------------- void main(int argc, const char **argv) { int x[600][400],y[600][400]; printf("test"); } ------------end----------------- です。 確かに試しに32とかにしてみたら、バグ吐きませんでした。。 以前もっとでかい値で出来たのは勘違いだったのかな。 かなりC++触ってなかったので、スタック不足とは初歩的なミスを。恐縮です。。
>>535 以前はオプションでスタックサイズ弄ってたんだろ
デフォのスタックサイズなんてOSやコンパイラ(リンカ)次第。
>531 > C++ではデストラクタが非仮想なら、それは派生するなということを意図する それ古い。 多態を意図しない基本クラスはprotected非仮想デストラクタにするのが 最近の主流。C++ Coding StandardsかExceptional C++ Style読め。
>>531 こう、多態とかがやりたいんじゃなく、
ちょっとメンバ関数を1つ増やしたい、とか言う簡単な派生もやっちゃいけないの?
そうなると、継承は多態のために存在することになっちゃうけど、どうも違う気がする。
>539 そのクラスのインスタンスが作れなくなりますが
>539 何で? 派生クラスは普通にインスタンス作れるよ。 基本クラスはインスタンス作らないほうがいいから、別にインスタンス 作れなくてもOK。
>>542 > 基本クラスはインスタンス作らないほうがいい
この前提はどこから出てきたの?
派生禁止から派生強制に話がずれとりますがな
>544 ごめん。 >539でずらしてた。 派生禁止ならクラス内クラスが簡単で良いと思う。
派生禁止云々は抜きにしても、クラス内クラスは便利だよなあ。 ストール万のデコにキスしてやりたい。
ストール万? すまん、ストラップのファッキンハゲと間違えた。
>>540 「publicな実装継承は悪か?」といわれれば、yesだ。
Liskovの置換原則を満たさないクラスはバグの温床になる。
基底クラスが通常の具体クラスの場合は特に。
面倒でも、private継承して必要なメンバ関数をusingでpublicに昇格させるか、
実装クラスのオブジェクトをデータメンバにして転送関数を書くかするべき。
public継承はおよそ多態のためのものだが、他の継承はそうではない。
多態でないpublic継承の例としては、ポリシークラスが有名。
元来想定されていた使い方ではないが非常に優れたhackではある。
ほかには、STLの反復子タグとかかな。
これらを踏まえて、自分の手の届く範囲内で逸脱すればいいんでは。
もっとも、適当な期間メンテするコードなら、
筋のよいコードを書いた方が結局楽だとは思う。
間違ったコードを書いてもコンパイラにスルーされるなんて面倒だ。
C++みたいな汚れ言語にそんな完全性求めるだけ無駄無駄。 ぶっちゃけ実務上の生産性に寄与しない概念なんかシカトでぷーですよ。 そんなネタは言語屋だけでもっと清廉潔白な言語でもってやっとくれ。
551 :
(^-^) ◆MONSOON/qo :2006/10/19(木) 04:44:18
おまいら〜 C++の機能を勉強しない方がいいとおもうよ なぜならたくさんあって複雑だからだ コンパイラも大変で間違えるかもしれないからだ 簡単な、よく知られている文で書けるならそっちの方が効率がいいとおもうよ
C++ - アカデミズム + 金 = Java
>>551 そうやって自分の無知を棚に上げて他人のコードを難解だとほざく馬鹿がいると面倒なんだよね。
>>553 同感。
上で話してるような最低限のレベルまで知らないアホが多すぎ
今どきはC#とかjavaが始めての言語って奴がいっぱい入ってきて大変
>>549 >
>>540 >「publicな実装継承は悪か?」といわれれば、yesだ。
>Liskovの置換原則を満たさないクラスはバグの温床になる。
540のは明らかにLiskovの置換原則をを満たしていると思うが。
nonderivable、boostのヘッダ検索してもなかった(1.35) sand-bosにもないんだな
>>556 規格上、これができないらしい
template < typename T>
class Foo
{
friend T ;
} ;
自分には、できない理由が分からないわけだけど。
事実、多くのコンパイラで、この規格を無視しているし。
C++0xでは、規格でも、できるようになるとか聞いた気がする。
クラスにすればそのメモリーにアクセスできなくなると聞いたんだが、 チートツールはアクセスしてるんじゃね?
ok。みんなスルーで行こう
>>557 つうかできたらカプセル化も糞もなくならね?
>549 普通private継承じゃなくて包含(合成)じゃ…… さったーもお勧めしてるよ
>>562 private 継承と包含は意味も効果も違うんだから、都合に応じて使い分けるだけだ。
「普通」とかいういい加減な基準は要らない。
>>561 Foo が T のメンバにアクセスできるようになるのならそう思うが、
このコードの意図は逆なのでそうは思わない。
オーバーロードする時の引数の順番ってどうしてる? class A,B; void f(A,B); //void f(B,A); //これでも同じことはできる 引数がもっと増えると組み合わせ数が爆発するが 良い指針ってあるだろうか とりあえずデフォルト引数ありの引数は後ろに設定すべきだと思う
ん、漏れはオーバーロードしないときと一緒にしてるけど。
一時コピーが発生するケースってどんな場合ですか? どんな書き方だと発生しないの?ルールありますか?
>>567 発生するケースはいろいろ。
発生するケースに応じて発生しない書き方は変わる。
ルールは規格として決められている。
ただしコンパイラの実装によって省略しても良いとされている箇所もある。
>>568 難しいですねー
まじでどんな書き方するとコピコンと一時オブジェクトできないか見極めるの難しいよ
vector<string>::iteratorとかもコピコン走るの?
>>569 いや、別に。普段気にしなくていいし。
vector<string>::iterator がクラスで実装されていれば、
もちろん iterator のコピーコンストラクタが使用される。
何を気にしてるのか、さっぱり伝わってこない。
コピコンとか嫌なんですよ 全部ポイントでやり取りしたいのに 勝手にコピーとかされると困るC言語だとそんなことないのに C++って変ですげー困ってる
?? 素直にポインタ使えば? リソース管理が面倒かもしれんけど。
Cでも struct A { // なんちゃらかんちゃら } a, b; a=b; コピーされるぞ?
>>571 C と同じコーディングをしてればコピーが増えることはない。
C++ 流にコーディングするならコピーコンストラクタの動作は
意識しなければならない。しっかりした知識が身に付けば、
コピーコンストラクタの動作するタイミングにはちゃんと
根拠があることがわかる。そんなに不条理なタイミングで動作はしない。
なんだか自分の知らないことを信用できないだけに見えなくもない。
「すげー困ってる」具体例を説明できる?
>>571 コピーコンストラクタのオーバーヘッドを気にしてるのか?
コピーコンストラクタを正しく実装できないから呼ばれると都合悪いのか?
とりあえず、コピコンとかいう俺様用語を使うのをやめてくれ。
コピーされて困るなら、そこはポインタを使うしかないじゃん。 そこんとこは C と C++ では何も変わらない。 >勝手にコピーとかされると困るC言語だとそんなことないのに >C++って変ですげー困ってる 同じコードで C だとコピーされないのに C++ だとコピーされる なんてあり得ない。
>コピコンとか嫌 OK、喪前はC++に向いてない。 縁が無かったと思って次の道に進め。
そもそもコピーコンストラクタが自動で生成されるのは 構造体の代入が可能なCとの互換性のため ポインタでも参照でもお好きなほうをどうぞ
>>574 >「すげー困ってる」具体例を説明できる?
よく考えもせずに勢いで書き込んだら激しく突っ込まれてすげー困ってる>571
ちっ、 -- >「すげー困ってる」具体例を説明できる? 激しく突っ込まれてすげー困ってる。 -- って書こうと思ったのに……
最初にそれが来てたらもっと寒かったから 出遅れて正解。
まぁ氏ねってこった
「良く分からない(実は理解できない)が、それは無駄なんじゃないか? 最悪だな」病
「ポイント」の時点で釣りだと思った 次に行こうぜ
585 :
デフォルトの名無しさん :2006/10/20(金) 16:22:02
質問があります。 Javaの静的初期化子(static { ... })に相当するC++の書きかたってありますか?
質問です。 C++で A *objectA = new A(); ..... delete objectA; として、Visual C++2005でデバッグしていたのですが、 delete objectAした後でもクイックウォッチでみてみるとobjectAが解放されていないっぽいのです。 それどころかdeleteした後もobjectA内の関数が呼べてしまいます。ふつうは呼ぼうとした時点でエラーが起こる物ではないでしょうか。 呼べてしまったobjectA内の関数の中の途中の処理で結局は落ちてしまうのですが、ふつう呼ぶ段階で落ちるはずのような気が。 delete objectA; したあとは objectA = NULL;
すみません。書いている途中で書き込んでしまいました。 delete objectA; したあとは objectA = NULL; した方がいいのでしょうか。 また、 delete objectA; した後でまたdelete objectA;してしまうとどうなるのでしょうか。 また、 objectA = NULL; の後で delete objectA; するとどうなるのでしょうか。すみません、基本がわかってませんね・・・
やってみなはれ
589 :
デフォルトの名無しさん :2006/10/20(金) 18:55:12
>>586 マネージコードか? それともアンマネージコードか?
>>586 開放されていないんじゃなくて、開放した後にわざわざ
メンバの値を吹っ飛ばす必要がないだけ。
delete後も非仮想メンバ関数が呼べるのは、多くの処理系で
非仮想メンバ関数の呼び出しが第一引数の前に
オブジェクトのポインタを渡すように実装しているから。
deleteしたオブジェクトを操作することや2重deleteは鼻から悪魔。 念の為言っとこう。
delete NULL;は合法、って誰も言わないの?
>>586 >ふつう呼ぶ段階で落ちるはずのような気が。
C / C++ では、解放済みのメモリを利用するのはエラーではなく、
何が書かれているか、誰が使っている場所を上書きするか、
その結果プログラムがどういう動作をするか完全に未保障なだけ。
>>595 .Net でも Java でも C++ と同じくらい危険なことはできるでそ。
アプレットとか ClickOnce とかと混同してるんじゃない?
>>595 書いたヤシは精密なデバッグをやるC++ユーザーを知らんのだろう。
もう一つはスケジュールの管理が重視される企業の製品の実態を知らんのだろう。
時間を湯水のごとく使ってリークを潰していくアマチュアの手法を企業では取れない。
むしろ、
>>595 のリンク先の奴が作った Javaアプリの方が危険っぽい。
というかVC++とC++をうまくすり替えながら話を進めるなと。C++ の UI 面なんて存在しない。 しかも企業ブランド云々とオープンソース云々が脈絡もなく続けて出てくる。わけわからん。
>>599 たぶん、WEB見てる時の「Java アプレットは安全である」
「誰が作ったかわからんActiveXコントロールは怖くて実行できん」
という事実を使って、強引に Java >>> C++ と主張したかったんじゃ
ないだろうか。
「街中で包丁振り回してる人がいたら怖いでそ?」
「だから食事は缶詰が一番」
という理屈。
ネタなんだけど。 スルーじゃないのか?
スルーカが足りないんだよ。スルー力が。
> C++ だけでオープンソースコミュニティが今のように大きく育つ可能性は、なかったわけです。 これもどうだろう? LinuxやGCCはJavaで作られているわけではないし(C++でもなくCだけどさ)。 あと、コメントを受け付けていないあたりがチキンだな。
今はC++もCも基本OSも全部JAVAのVMの上で動作しています。 それぐらいJAVAはすばらしい技術です
そんなに素晴しい技術なら、なぜ未だにC++を使う人がいるのでしょう。 なぜC#のように新しい言語が出るのでしょう。 Javaの良さを理解できないからでしょうか?違います。 C++にはC++の、C#にはC#の良さがあるからです。 (C#を出したのは例えで深い意味は無い)
そう、C++もまた素晴らしい存在なのです。 ってじっちゃが言ってた!!
事の発端は誰しもが普通の人であることだ。 普通の人はjavaなりc#に流れる。 でも、時に変人はc++のテンプレートに魅了されてしまって抜け出せない。 何とか抜け出そうとdを始めるが中途半端なできばえに腹が立つ。そして、c++から抜け出せないまま。
C#って、C++を含んでいるんだと思っていたが違うん?
なんか、急にレベル低い板になっちまったな・・。
ならば旅立つが良い。 つーかゲームだとまだC++以外にほとんど選択の余地無いんすけど。 業務でC#とか使いたいッす。
Java並に安全かつC++並に柔軟な言語が出ればいいんだけどな。 現状のJavaは初心者向けのデチューン済み言語としか思えない
>初心者向けのデチューン済み言語 それが大事だよ。 C++はその気になれば人を殺せる言語だからなー。
Javaは教育用言語だと思ってたけど、違うの?? 因みに、C#はJavaに毛の生えた教育用言語だと思ってるが。。。
それで教育されて実務で何使うんだ。 C++か? えー?
そこでPythonですよ
アナフォリックマクロってすげーエロいの?
アフォナクリマックロならあるいは
まあ何というか、音楽界に譬えるなら C=J.S.Bach/C++=Beethoven/Java=小○哲哉/C#=つ○く といったところか。
>>614 C# は違うだろ。生のポインタも自由に使えるし。
>>614 Javaが教育用言語だと?あの豊富なライブラリをわざわざ学習用に用意
すると思うのか馬鹿。
あ、ちごた ×Javaが教育言語だと? ○C#が教育言語だと?
C++はウィザードリィみたく、深く潜れば深く潜るほどいろんなもの(知識・技術)を求めたくなる まあ趣味での話だけどな
ポインタ演算以外に、C++のどこが危険なんだ?
>>624 Cでも一緒だがメモリの管理だな、これがちゃんとできる奴以外にコード書いて欲しくない。
>>625 その伝で行くと、世のプログラマを名乗っている香具師らの大抵は失職の憂き目に遭うな。
C++特有の危険性はないのかな?
CからC++まで連続しているので、プログラマが何を習得しているかが一概に言えない点。 とか。
スケジュールキツキツでやってる企業のプログラムではC++は非常に危険だ。 リークが起きてても納期が来たら収めないといけないから。
char *
すみません。char *しか引数として受け付けない関数に wchar_t *の文字列を渡すとどうなるんでしょうか。 うまくいかない場合は、どうやって変換すればよいのでしょうか。
>>632 コンパイルエラー起きるだけだろ
.c_str()してchar*で渡せよ}{age
>>633 ここまで大阿呆な回答も珍しいな。
wcstombs()あるいは類似するものを使ってワイド文字列からマルチバイト文字列に変換して食わせるのが常道。
単にバイトストリームとして食わせてるだけかもしれないぞ
C++でUTF8の文字列ってどうやって扱うの? libxmlがさへんなxmlCharとかいうので扱ってるんだけど これってC++のクラス作って変換したいんだけどどうやって やるの? サンプルあった教えてください
C++のロケールとIO関係って なんであんなに命名規則が絶望的にわかり辛くて使いにくいの?
>>634 ありがとうございます。うまくいきました。
しかし調べてみたらwchar_tって国際化対応には心許ないみたいですね。
それ以外に関しても、C++標準ライブラリのみで十分な国際化を目指すのは無理があるんでしょうか。
>>637 設計されたのが10年近く前だからだと思う。
そもそもC++の標準ライブラリのlocaleで何が出来るのか把握してる奴も珍しい気がするが。
国際化という言葉だけでは指している範囲が広すぎるので 具体的に国際化のどの側面が必要なのか書かないと あまり有用な回答ができそうにない プログラム内部で扱う文字コードが UTF-8 なのか UTF-16 なのかによっても 国際化の各々の側面についてできるできないの答えが異なるし
規格書が高すぎてlocaleの内容が把握できません><
646 :
デフォルトの名無しさん :2006/10/21(土) 22:59:00
下記のプログラムでエラーが出ます。本の通りに打ってみたんですけど、エラー表示されます。 エラー内容ですが、二項演算子 '==' : 型 'class D<class A>' の右オペランドを扱う演算子は定義されていません どこがダメなのか、教えていただけないでしょうか? お願いします。 #include <iostream> using namespace std; class A{public: virtual void f(){cout << "B::f()" << endl;}}; template<class T> class D{ T* pt; public: D(T *t = 0) : pt(t){} T* operator->() const{return pt;} T& operator*() const {return *pt;} template<class Y>bool operator==(const Y *py) const{cout << "---非friend関数---" << endl;return py == pt;} template<class Y>inline friend bool operator==(const Y *py, const D &pd){cout << "---friend関数---" << endl;return py == pd.pt;} }; void main(){ A *pa = new A(); D<A> sp1 = pa; sp1->f();(*sp1).f();*sp1 = *pa; if(sp1 == pa)cout << "sp1 == pa" << endl; ココif(pa == sp1)cout << "pa == sp1" << endl; }
>>646 gcc3.4.2(MinGW)では通ったが?
>>646 VC++2005EE でも問題なくコンパイル、実行できた。
649 :
デフォルトの名無しさん :2006/10/21(土) 23:14:36
>>647 すみません。初心者なもんで、わかりません。
ソフトはMicrosoft Visual C++ 6.0を使ってます。
>>646 VC6 はメンバ関数テンプレートが使えないんじゃなかったかね?
651 :
デフォルトの名無しさん :2006/10/21(土) 23:21:20
>>650 そうなんですか?
確かに、VC6を使うとは本には書いてませんでしたw
無理なんでしょうか?
なんで未だにVC6使う初心者がいるんかね?
無料のExpressEditionあるしな
ところで
>>650 はマジ?
煽りとかじゃなくて使ったことないから信じらんない
テンプレート周りが弱いのは確か。 つーかそもそも標準に準拠してないし。
655 :
デフォルトの名無しさん :2006/10/22(日) 00:05:17
>>652 え? VC6ってダメなんですか?
今なら何を使ったらいいんでしょうか?
656 :
デフォルトの名無しさん :2006/10/22(日) 00:11:47
スイマセンおしえてもらっていいですか? プログラミングしたくてBorland C++ Compiler 5.5をダウンロードして 解凍したんですが、そこからどうすれば使えるのか分かりません。 OSはwindowsXPです。
VC6も駄目だが、BCCはもっと駄目だ。
>>656 bcc32.cfg と ilink32.cfg でググれカス。
>>655 商用利用もおkなんだから ExpressEdition を使え。
>>656 高校数学の本を買ったのですが
足し算ができないので理解できません
どうしたらいいのでしょうか
って言ってるようなもんだ
プログラムはそんなに簡単なもんじゃないよ
古いVCはコンパイラはともかくIDEは全然まともだから 現状に満足してれば無理して乗り換えなくてもいいと思うんだが。 古いBCBは
>>661 そういえば VC6 にはあったIDE内蔵のプロファイラがその後のバージョンではなくなってるって
聞いたことがあるんだけど、いまだにプロファイラはなくなったままなん?
>コンパイラはともかく それは致命的だと思うけど。 コンパイラを入れ替えるつう手もあるけど、それよりも VC++2005 EE使う方が簡単だよね。
でも重いからなぁ
じゃあDMCでもつっこむ?
デロリアンつっこんでどうするんだ?
Intel C/C++ Compilerを(ry
ICはコンパイルなげえええええええええええ
gcc で最適化オプション満載 = Intel C/C++ Compiler という話をどこかで聞いたことが在るが、ガセだろうな
そりゃガセさ。 正直現状のGCCの性能ではVCやICCには到底勝てない。 GCCが極端に劣ってるわけじゃないし、テンプレート周辺ではむしろ勝ってたりもするのだけど、 トータルではやはり金出して買う環境には…
うーむ7時間ぐらいいろいろ調べてみたが、 やっぱりUTF扱うにはiconvしかないのかな? 自作したいけどなんかいい資料ないですか?
自作するのがいいと思うよ。 UNICODEコンソーシアムからコード表引っ張ってきて、片っ端からstd::mapに突っ込んでしまえ。
>>670 >>669 の=は代入演算子と考えるんだ。
つまりgccは最適化オプション満載だと判定されると
HDを走査してiccを探し出し、リダイレクトすr(ry
>>603 > (C++でもなくCだけどさ)
だからだろ。
iccのデフォルトはicc -O2だからね。しかもiccの-O2はgccの-O3相当だし。
VC++.NetでVC6のようにネイティブコード吐けるの?
リアルにネイティブコードを吐くコンパイラ
>>678 .NET Frameworkを使わずに作れば良い。
分からなければアンマネージドコード使え。
アンマネージドなプロジェクトで作れってことだろ。
アンマネージドはCLI(.Net)じゃなかったか?
CLIはマネージドだろ
686 :
デフォルトの名無しさん :2006/10/22(日) 15:36:40
class A{ void func1(); void func2(); } というようなクラスがあったとしてこのfunc1とfunc2という関数をインライン・アウトラインをうまく分ける方法ありませんでしょうか? ヘッダに上の記述があって.cppに関数本体があるとしたらそれを.inlとかの拡張子にファイルに丸々コピーして先頭にinlineつけて マクロでUSE_INLINEとかで.inlファイルをヘッダで読み込むか判断して関数全部入れ替えるのは簡単ですが部分的にうまいこと分ける方法 ありませんか?
>>686 その状態で cpp と inl の間で関数を移動させればいいはずなんだが、
「うまいこと」ってのはどういうことだ?何が気に入らない?
>686 これもExceptional C++ Styleにあったな。 必ずinline にする / inlineにしない方法はないって。
VC8には__forceinlineとかいうお馬鹿なキーワードがあるな。
inline展開っていまどき流行らないの?
>>691 プログラマが無い知恵を絞るよりコンパイラに任せたほうがいいってことじゃない?
>>692 そうなのか、オレは10行程度で他の関数呼ばないものはinlineに置いて
たけどやめるか
VC7から入った「リンク時コード生成」を使うのなら 最適化を目的としたinline宣言はほぼ無意味
>>694 いや、それはべつの翻訳単位でもinlineできるようにするためのものだから。
もろにinlineとかかわってくるわけだが。
まあ、そもそもVCは普通のinlineを無視するがな
無視するんなら関わるも糞もないんじゃねーの?
どうせiccも事実上無視するし、漏れは寧ろinline指定をソースを読む人間のために書いているよ。
おれはむしろ__forceoutlineが欲しい。 implなclassとか、実装も全部その場に書いてしまいたい。
クラスん中にぶちまけちまったら、ほっといても全部inlineだしなー。
なんでC++の例外はstd::stringしか受け付けないの? std::wstringがあるのに...
>>700 受け付けるのと、あと what() の型が char 固定ってのが問題だな。
なんでかっていうと、標準委員会の日本人メンバーがサボってたからじゃね?
未だにオフィシャルな議題にも挙がってないっぽい。
真剣に国際化を想定するならば
例外クラスに持たせる std::string はエラーの識別子としてのみ用いて
その識別子から実際の human readable なエラーメッセージへの message catalog を
持て,ということなんじゃないですかね?
ただし標準の範疇で message catalog の機能を担当するのが
恐らく std::messages で,これがイマイチしっくりこないと気が個人的にはしますが.
あと,エラーの文脈に関する情報などもう少しリッチな情報を
例外クラスに持たせたければ実装の側で適当にフォーマット決めて,
という姿勢なんでしょう.
http://tinyurl.com/y5k8ux にある Peter Dimov 氏の投稿の Summary が明快かと.
bad_allocなんかはstd::wstringで渡されても困ると思う、標準C++的には。
>>704 std::stringだと困らないの?
ワイド文字だと出力するときにマルチバイト文字列へ変換しなければならないのが、 メモリにとっても優しくなさそうだと思った。
逆だろ
find とか使うためにワイド文字使ってるから、 ファイル入出力関係はマルチバイト文字⇔ワイド文字で格闘してる
18.6.1 what() の説明のとこに "Remarks: The message may be a null-terminated multibyte string (17.3.2.1.3.2), suitable for conversion and display as a wstring (21.2, 22.2.1.4)." って書いてあるのを見つけた。 wstring に変換して表示できるマルチバイト文字列でもいいと 書かれている。 string を受け取る stdexcept の例外群のコンストラクタには "Postcondition: strcmp(what(), what_arg .c_str()) == 0." と書いてあるので、 what() と同じくこちらも wstring に変換して表示できるマルチバイト文字列でもいい ということになる。 とりあえず、まったく失念していたわけではないようだ。 でもワイドキャラクタからマルチバイトへの変換って、標準で決まってるの? ロケールによって決まるんだったら、 what() の戻り値にどのロケールを 適用すればいいのかわかんないよね?
wcstombsの立場っていったい・・・
あれ?じゃぁ入れるときは wcstombs() 使って、出すときは mbstowcs() 使えばすべて解決?
>>706 ワイド文字をネイティブで扱う処理系があったっていいじゃない。
UTF-16がネイティブなWindowsとかWindowsとかWindowsとか。
STLの代表的なやつをjavadoc形式で表したいんですけど 参考になるサイトとかないですか?
>712 そうは言っても、stdio/iostreamはマルチバイトに変換することを前提にしているようだし……。
>>710 codecvt
ってのもあったね。
使った事ないけど・・・
>>714 たしかにそりゃそうだけど。
VC8だと、wcoutは事実上使えないし。
まあ、コンソールに出力するようなことはないから、どうでもいいんだけど。
>712 待って、まだ9xを捨てないで。
>>718 それはBoostを使っての説明本だし、当然。
Modern C++ DesingがLokiを使って説明しているように。
テンプレートに関する知識を身につけたいなら、
「C++ Templates」を読むことをお勧めする。
>>716 VCってwcout使えなかったけ?(imbueすれば)
GCCだとだめんなんだが...
722 :
デフォルトの名無しさん :2006/10/24(火) 01:31:58
>>721 SP1で直ってるといいな...
wcstombsで
::setlocaleじゃなくてC++のロケール使ってるけど
CのロケールとC++のロケールの関係ってどうなってんだろ...
templateを使ってコンパイル時に右シフトするか左シフトするかを使い分けたいのですが、 何か方法があったら教えてください。よろしくお願いします。
エスパーっぽく template< bool Left = true > shift_op { template< typename T, typename X > T operator()( T t, X x ) { return T << x; } }; template<> shift_op< false > { template< typename T, typename X > T operator()( T t, X x ) { return T >> x; } }; shift_op<> shift; // 左シフト int a = shift( 8, 2 );
>>723 std::locale::globalを呼ぶと、内部で対応するようにstd::setlocaleを呼ぶと定められている。
>>725 レスありがとうございます。
でもコンパイルが通らない…
こういうtemplateの使い方は初めてみたのですが、いろいろ弄ってみようかと思います。
>725 関数の中のTはtの間違いだろ。
729 :
724 :2006/10/24(火) 23:30:51
>>725 を
>>728 のように修正して、さらにshift_op を struct shift_opにするとコンパイルできました。
ありがとうございました。
class Cというのがあってハンドルっぽく初期化したい場合を 参照に書き換えたいんだけどどうやってやればいいのですか? func A(){ C *c; funcB(&c) } funcB(C **c){ *c = new C(); }
funcB(c); void funcB(C*& c) { c = new C(); }
732 :
723 :2006/10/25(水) 00:37:23
>>726 規格書見てみたけど(少し要約)
static locale global(const locale& loc);
の実引数が名前を持っていれば、次を実行する。
std::setlocale(LC_ALL,loc.name().c_str());
そうでない場合は、C現地特性に対する影響は、処理系定義とする。
補足:実引数(locale)に名前がないというのは
loc.name()が"*"のとき。
例えばrootkitのように あるプログラムを使用しているのを隠蔽するには 何をすればいいのでしょうか
環境毎に違うし、標準の範囲では無理。
返答ありがとうございます。 無理ですかorz
736 :
723 :2006/10/25(水) 01:41:01
>>721 デバッグしてわかったけど
Cのロケールをデフォルトのものから変更したときに
wcoutのストリームのサイズが0になってるみたい。
だから
std::global(std::locale(""));
std::wcout.rdbuf()->pubsetbuf(0,10000);
見たいな感じでストリームのサイズを変えてやればVC8でも動いたよ。
なんかさー ノードの深いオブジェクト探査してデータ集めるモジュール作ってるんだけど エラー処理どうしたらいいものか悩んでる。下ようにC()の中でエラーが起きた場合 Aまでもし伝える必要があってこうゆうときって返り値をエラー番号とかにして 引数で参照渡しをするべき? A(){ B() } B(){ C() } C(){ D() }
そこまで深いなら、素直に例外投げたら。
やっぱ例外投げるしかないよねー Cのデータ構造なめてるから下手にオブジェクトにしても あんまり効率よくないし
VC++でWin32だったりすると例外のコストは実はそう大きくないとか聞くな。
例外のコストなんて、今となってはほとんど迷信じゃね?
コストそのものより、例外安全性の方が… いや、コストも馬鹿にならんよ? なんせ片っ端から巻き戻すわけだし。
巻き戻すんですか… JavaとかC#使ったことありますか? それを使ってみてから巻き戻るかどうか考えてみてはいかがですか。
だーかーらー ガベコレつーか遅延破棄のある言語と一緒にすんなと。
いや、違いはスタック上にオブジェクトがあるかどうかだと思うよ。 744が思いっきり外してるのは確かだけど。
あ、ごめん。 違い、ってより、コストがかかる原因だな。
例外を処理するのにコストがかかるってのは昔から聞いたけど そもそも例外なんてそんな頻繁に起きるところに使わないでしょ? そのコストを気にするものなの?
例えthrowが行われなくてもtry〜catchブロックがあるだけで性能にペナルティが出る場合もある。
そのへんはMSのDeep C++とか読むと結構参考になる記述があったり 理解できなくてどうでもよくなったり('A`) 適当な本買うのが一番なんだろうけどな
元ネタがそんなにコストを気にしているようなものじゃな無いから、別にいいんでね?
>>743 正常系のパスでコストがかからなければ、巻き戻すときに
コストがかかるのは別にいいだろ。
例外安全性は、べつに言語の例外機能を使わなくても、
まっとうなプログラムなら戻り値なりなんなり使って
確保しないといけないしね。
だから、正常系でも多少コストがかかるから嫌われるんだよ。 どのローカルオブジェクトが構築済みか等を全部記録しなきゃ 正常に巻き戻せないのはわかるよね。
そんなダダっ子は死んでしまえ
巻き戻すって言う古い奴だから、そんな時代遅れほっとけよ。
>>754 その「多少のコスト」がどれくらいなのか説明しろよ
お前の使ってる処理系でいいから。
インライン関数についてです。 .asmファイルを見たときに、 call func のような記述がある場合、(実際はもっと複雑です) funcはインライン化されていないのでしょうか?
インライン化でぐぐれ。
760 :
デフォルトの名無しさん :2006/10/25(水) 19:31:17
各種のRDBMSに対応するために、DB製品ごとの違いを ラップしてくれるライブラリというのはありますか?
761 :
758 :2006/10/25(水) 19:34:33
>>759 ぐぐったりはしてみたのですが、情報が見つけられないです。
何かインライン化されたかどうかを確認する手段はないのでしょうか?
762 :
デフォルトの名無しさん :2006/10/25(水) 19:52:08
call funcってinline化されてるんですか?(*><) call funcってinline化されてるんですか?(*><) call funcってinline化されてるんですか?(*><)
>>760 Windowsで動く奴ならADO・OLE DB・ODBCから好きなもの選べば?
765 :
758 :2006/10/25(水) 22:30:16
そんなくだらない話よりも例外の話の続きが気になるんだが。
で、それを気にしてどうする?
768 :
デフォルトの名無しさん :2006/10/25(水) 22:49:14
[]演算子は継承しても、派生クラスから呼び出せるんですが、 =演算子は継承すると、派生クラスから呼び出されていなようです。 仕様ですか?
コンパイラが生成するデフォルトのoperator=が、基本クラスのoperator=を隠蔽する と思った。
仕様。 規則上の理由は、暗黙的に定義されるoperator =()が基底クラスのそれを上書きするため。 根本的な理由は、スライシング防止のため。基底クラスのoperator =()が派生クラスの分まで面倒を見れるはずが無いから。
つ コピーコンストラクタ
>>754 > どのローカルオブジェクトが構築済みか等を全部記録しなきゃ
> 正常に巻き戻せないのはわかるよね。
デストラクタにまかせちゃいけないの?
774 :
769 :2006/10/25(水) 23:18:42
(・-;)
>>754 時代遅れ。
今は(けっこう前から)正常系ではコスト(命令サイクル)がまったく不要な
テーブルアプローチによる実装が主流。ただし Windows 以外。
このアプローチでは、テーブルのぶんコードサイズが少し多めになる。
キャッシュへの影響が気になるところだが、きっちり正常系のコードと
わけて配置されていれば、そこも問題ないと思う。
>>775 テーブルアプローチとかその辺の設計手法載ってる本ってあります?
あとテーブルアプローチって俗称で正式な名前じゃないですよね?
本当はなんて名前なのですか?
Windowsは構造化例外がfsセグメントとか使ってるからね。
>>778 "Table" ApproachはIEEEの論文にいろいろ乗ってねオレが無知だったよすまね
でもさ、オレ最近昇進して下のやつらのコード見るんだけどforのネストからtryで抜けたり
してるやついるんだけど、こういうやつらにどんなふうに言うのが正しいんだろうか
gotoの正しい使い方を教えろ
何も言わない もはや達観と諦めの境地
>>779 こいつそろそろウザイな。誰かキャッチしてやれよ。
構造化プログラムちゃんと仕込んどけ
>>779 >昇進して下のやつらのコード見るんだけど
ダウト。会社から見れば単に押し付ける仕事が増えただけで掃き溜め要員であることには変わりがない。
キャッチしちゃってね。
>>784 誰も何も言ってない切り口を持ち出して
ダウトもなにも無いと思うが
「ダウト」 って、「間違い」 じゃなくて 「疑惑」 って意味だよね?
そう。あとに続く断定口調から考えて、
>>784 は間違って覚えてる可能性大。
ついでにいえばこのダウトっての、ずいぶん前にちょっと流行ったやつだよね。
世間の世知辛さを、勝ち組の傲慢さではなく、負け組の湿気をたっぷり含んだ言い方で
妙に偉そうに語るオーラと合わせて考えるに、ちょっと可哀相な感じのオッサンが想像できる。
普通にトランプゲームから来てるんじゃないの>ダウト
つまり、「掃き溜め要員であることには変わりがない」のだから、「昇進して」というのは「疑惑」だってことか。
お前ら随分暇そうだな
だから、キャッチするなよ。 例外なんだからさ、スルー、スルー
>775
>このアプローチでは、テーブルのぶんコードサイズが少し多めになる。
>キャッシュへの影響が気になるところだが、きっちり正常系のコードと
>わけて配置されていれば、そこも問題ないと思う。
少なくとも Itanium に関しては, table 自体と table のルックアップに関する
コードについてこの仕様が明文化されてますね.
http://www.codesourcery.com/cxx-abi/abi.html#unwind ICC, g++ がすでにこれを実装済みだったと記憶しています.
あと, catch ブロックのコードですら正常系のプログラムテキストとは別の
"coldな" 場所に配置して,正常系のコードサイズを圧迫しないようにする
実装のコンパイラもあったはずです
(ICC が実装していたはずですが今手元に spec. が無いので確認できない).
二次元配列のクラスを動的に確保するために3重ポインタを使って for(int x = 0;x < X;x++) p[x] = new Class*[Y]; for(int x = 0;x < X;x++) for(int y = 0;y < Y;y++) p[x][y] = new SubClass(); としました これを解放するために for(int n = 0;n < X;n++) for(int m = 0;m < Y;m++) delete p[n][m]; for(int n = 0;n < X;n++) delete [] p[n]; delete [] p; としたらエラーが出ました 何が問題なのでしょうか?教えてください コンパイラはVC++.NET 2002を使ってます
エラーの詳細書いてないのはスルー
>>796 ソース全部貼れ
コンパイルエラーなのか実行時エラーなのかくらい書け
多次元配列なんぞ使うな。以上。
じゃあ何を使えばいいんだよ!
p[x + y * x_size]
っ boost::multi_array
C++効率的最速学習徹底入門 この本て詐欺っぽい?
>>805 効率的最速学習とかよく
英会話○日で習得できるとか類の怪しい本ですか?
スレ違い
タイトルが中国の本っぽい
publicであり、 クラス外部からのアクセスにはconstとして振る舞い、 クラス内部からのアクセスには非constとして振る舞う、 といったメンバ変数を作りたいのですが、どのような方法があるでしょうか。
やっぱprivateにしてget()を、、、とかじゃダメだから聞いてるのか(´・ω・`)
>>810 真面目に答える気はない。
こういうことができるというだけで……。
class Foo
{
public :
Foo(int x) : value_(x), value(value_) {}
private :
int value_ ;
public :
int const & value ;
} ;
Foo::valueは、クラス外部からはconstとして振る舞う。
クラス内部からは、Foo::value_でアクセスすること。
メンバ変数を全部mutableにすればいいとかそんな話?
>810 何言ってるのかわからん…… メンバ変数を外部からアクセスするって、一体何のこと?
815 :
デフォルトの名無しさん :2006/10/28(土) 02:36:15
あるオブジェクト A &aがあったとき参照オブジェクトの渡し方として 以下の方法があった場合コピーコンストラクタが行われるのは両方それともどちから片方だけですか? なぜか自分の環境ではクラスのコンストラクタに渡すと中のオブジェクトが空になってしまいます。 クラスメソッドtestに渡す void test(A +a) 別クラスhogeのコンストラクタに渡す hoge(A &a):hogeA(a){}
&ついてなけりゃ値渡しだから、テンポラリにオブジェクトが生成される。 その際にコピーコンストラクタは呼ばれるだろう。 中のオブジェクトが空になるのは、単にコードがバグってるだけ。 コピーコンストラクタ云々は関係ない。
>>812 ありがとうございます。
参考になりましたが、その方法はメモリ使用量が増加してしまいました。
>>813 クラス実体がconstという訳ではないのでどうにも……
いろいろ考えましたが、
とりあえずconst_castで強引にやってみます。
何故メンバ変数をpublicにするの?
外からのアクセスはメンバ関数を通せばいいだろ。
820 :
デフォルトの名無しさん :2006/10/28(土) 09:57:47
C++の良書教えて
822 :
デフォルトの名無しさん :2006/10/28(土) 11:22:10
const *char const unsigned *charに変換したいけどどうやってするの?
まず文法の載っている本を読む。
char*からunsigned char*の変換は非常に難しい やめたほうがいい。
すいません、質問させてください。 共用体型の意味って何でしょうか? 同時に値を格納できないのならば、意味が無いような気がするのですが・・・ 共用体型を宣言する時にint a; int b;とした場合、結局格納できる値が一つなら、単にint a;で書いてしまえばいいだけではないのですか?
>>825 その発想で行くと全部void*でおkになるね
unionはあまり使わないほうが…… カリカリにチューンしているのなら別だけど。 boost::anyの方が便利だよ。
>>828 違う型を共用するところに意義がある共用体の存在意義を否定するなら、
違う型へのポインタなんぞを使わずに全てvoid*で済ませばいいだろ、という話。
>>824 char がsigned char なのか unsigned charなのかは
環境依存だからとかそういう話?
一応、unionは確保したメモリを共用できるというvoid*にはない 特長もあるけど、型安全が犠牲になるんだよね。 C++には合わないよ。
union { float f; unsigned int n; }; // sizeof (float) == sizeof (unsigned int)だと仮定して f = 123.456e7; するとnからはfのメモリ上のビットパターンが読み取れてウマーなこともあった。 まあunionがなくてもreinterpret_cast使えばいいだろと言う程度のことではあるが。
有名っちゃ有名なのは、sockaddr_in構造体とか、windowsのビットマップを表すような構造体とか(バージョンごとに後半のメンバが違う)いうのがある はず
sockaddr_in は sock_addrinだたね
SDLのイベントもunionだね
もしもし?
きりんさんがすきです。
838 :
825 :2006/10/28(土) 17:21:42
みなさんレスありがとうございます。 何となく意味がわかりました。 とりあえず今はunionを使うのは控えておきます まだあやふやな所もありますし。
で?
841 :
デフォルトの名無しさん :2006/10/28(土) 17:33:33
char *からunsigned char *に変換できませんn。 どうやってやるの?
union使ったことない。 int型とdouble型共有したら2.54とか小数点だったらdouble型、2とかだったらint型で事実上格納されるの? 教えて
843 :
デフォルトの名無しさん :2006/10/28(土) 17:48:28
>>841 static_cast<unsigned char *>(static_cast<void*>(x))
reinterpret_cast1回でいいだろ。
>>842 そういう理解の仕方の人にはお勧めできません。
つーか、>832の意味が理解できていない?
そう言えばXLibのイベント構造体もunion使ってたなぁ。
あちらはイベントの種類ごとに違う構造なのを吸収するのが目的だが。
>>844 reinterpret_cast は実装依存。 void* 経由の static_cast は動作について規定されている。
そんなことはないですか?
union ARGB { unsigned long argb; unsigned char alpha, red, green, blue; }; ARGB color; color.alpha = 0xFF; color.red = 0; color.green = 0xEE; color.blue = 0xAA; cout << "ARGB = " << color.argb; // "ARGB = 0xFF00EEAA"
>>846 そんなことはないだろう。
俺の記憶では、何かポインタ型のオブジェクトをvoid*へ変換したものを、
元のポインタ型(か互換な型)以外へ変換すると、未定義だか処理系依存だかで、
結局reinterpret_castと変わらないだろということになるはず。
人生相談室はこちらで宜しいでしょうか??
VC++のstd::basic_stringの実装が短文字列最適化のためにunion使ってる
>>846 5.2.10 Reinterpret cast の 7 によると、 char* から unsigned char* に
reinterpret_cast で変換した値は unspecified (なんて訳すんだっけ?)となる。
4.10 Pointer conversion の 2 によると、 char* から void* への変換結果は
char 型オブジェクトの記憶域の開始位置を指すと決められている。そして
5.2.9 Static cast の 6 にこれとは「逆」の変換が可能だとされている。
記憶域を指す void* からオブジェクトを指すポインタへの変換は malloc() の
戻り値に対して必要になる変換なので問題ないと思うけど、規格中に明示的な
記述を見つけることはできなかった。記憶域の開始位置からオブジェクトへの
ポインタを作るということで、 5.2.9 の 6 にある「逆」の変換にあたるのだろうか?
どっちかというと後者のほうが移植性が高いと言えなくもない、というぐらいの違いかな。
>>851 任意の型Tについて T* p があったとき、static_cast は
static_cast<T*>(static_cast<void*>(p)) == p を保証するんじゃなかったっけか。
正当な変換が定義されていない別の型に変換するのは、
規格上はどうやっても未定義だと思うが。
>>852 元に戻すことができるのは 5.2.9 の最後に書いてある。
「定義されていない」のが「未定義」なのはあたりまえ。
今は正当な変換が定義されているかどうかを論じているんだろ?
854 :
初心者 :2006/10/28(土) 23:39:43
どちら様教えて、VC++プログラミングするときにひとつのボタン押して 他の.exeファイル実行できるようにどうすればいいですか??
856 :
初心者 :2006/10/28(土) 23:45:48
どりゃ〜〜〜
文字数を知る方法を教えてほしいのですが 例えば char a[20]; cin << "abcd"; とするとき 文字数が4であることを知るにはどうすれば よいのでしょうか?
シュールだ
>>860 strchr(a,'\0')-a
memchr(a,'\0',UINT_MAX)-a
strrchr(a,'\0')-a
strlen(a)
ちょww
866 :
860 :2006/10/29(日) 00:22:19
すいません。訂正 char a[20]; cin << a; aにabcdと文字が入っているとすると文字数が4であること 知る方法について教えていただけないでしょうか?
もうどこからつっこんでいいやら・・・
869 :
866 :2006/10/29(日) 00:25:01
cin >> a; でした すいません
えへ、えへへへ
>>869 一文字ずつ終端文字がくるまで数えればいいんじゃない?
悪いことは言わんからとりあえず std::string を使うことを覚えろ。
#include <iostream> #include <string> int main() { std::string s; std::cin >> s; std::cout << s.size() << ' ' << s << std::endl; }
874 :
側近中の側近 ◆0351148456 :2006/10/29(日) 00:51:51
>>866 (っ´▽`)っ
もし、charでいきたいなら
strlen(a)でOK。
ただ、C++なんだからstringクラスがお勧め。
>>873 の通り。
charは危険がいっぱいだからね☆
>>866 で、20字以上入力されたらアウトだよ。
アウトってなんですか?
876 :
デフォルトの名無しさん :2006/10/29(日) 01:08:14
877 :
側近中の側近 ◆0351148456 :2006/10/29(日) 01:09:22
>>875 (っ´▽`)っ
どんな動きをするかわからないってことだよ。
プログラムが異常終了する、結果が不正になる。とかね。
20文字目以降が、メモリ上の予想していないところに書き込まれるから。
char a[20];と宣言しているように、aには20字(\0含む)しか入れちゃダメ。
878 :
860 :2006/10/29(日) 01:15:57
int e = 0; int mozisu = 0; a[20]; cin >> a; while (a[e] != '\0'){ e++; mozisu++; } 一応 文字数はわかることができました。
>>878 わざわざライブラリ使わんのもあれだがeとmozisuを分ける意味がわからん。
どっちも同じ値じゃん。
>>878 strlenを使うようにすると、こうなる。
#include <iostream>
#include <cstring>
int main()
{
a[20];
std::cin >> a;
int mozisu = std::strlen(a);
std::cout << mozisu << ' ' << a << std::endl;
}
>>880 察するにプログラミング自体が、初めてなんじゃね? 細かいことは大目に見てやろうぜ。
俺的には「初心者です」とかって言わないところがとっても好印象だ。
俺的には、とっととAccelerated C++読めと言いたいけどな。 std::stringクラス使わん理由がわからん。 マズい設計とは言え、char[]使うより100万倍マシだからな。
884 :
878 :2006/10/29(日) 02:08:01
すいませんでした。 知識がないのでstd::stringクラス というものを知りませんでした。 もっと勉強します。
つーか寧ろ、初心者スレに行ってくれ。
ツリー構造をC++的に作りたいのですが 参考になるページ教えていただけないでしょうか? やはりCのようにポインタを繋いで AddとかDelとそんな関数をたくさん作るイメージでOKなのでしょうか?
compositeパターンでググればいいんでない?
std::list でも応用しれ。
890 :
デフォルトの名無しさん :2006/10/29(日) 04:39:42
>>890 こんな感じで実行してみて、例外消えませんか?
(スマートポインタがCoUninitialize呼ぶ前に開放されるようにする)
CoInitialize();
{
処理をブロックで囲む
}
CoUninitialize();
892 :
デフォルトの名無しさん :2006/10/29(日) 04:51:18
C言語で、あらかじめデータを定義する場合、 char data1[]="aiueokakikukekosasisuseso"; とかって出来るけど、これが、64kバイトとかでかいデータの場合、 どのように書いたらいいですか? ファイルから読むのではなく。リソースファイルを使うのでもなく。
>>892 まずは自分が思ったとおりに書いてみろ。何か問題があるか?
それがどんな処理をされるのかによる
895 :
デフォルトの名無しさん :2006/10/29(日) 04:55:41
>>893 自分が思ったとおりだと、データはバイナリなので、
char data1[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,\
0x09,0x10・・・
などと、64kの場合は、0x00 が、65536個続きます。
>>891 ご指摘のようにしたところ無事に終了することができました。
ありがとうございました。
897 :
デフォルトの名無しさん :2006/10/29(日) 05:00:47
900 :
デフォルトの名無しさん :2006/10/29(日) 05:21:07
>>899 1.ヘッダファイルサイズが異常にでかくなる。(データファイルと比較して約5倍)
2.コンパイル時間がすげー長くなる
3.仮想メモリを異常に食う
>>900 そんだけデメリットが分かってるならファイルから読めばいいのに。
>>900 別に1行で宣言しなきゃならん理由はないんだから行末の ¥ はいらんぞ。
それとったらコンパイル時間に関しては多分改善されるぞ。
いくらなんでもコンパイラ屋もそんな糞長い(論理)行を処理することは前提としてないだろうからな。
904 :
デフォルトの名無しさん :2006/10/29(日) 07:06:50
>>903 どゆこと?
まさか、64k個の、0x00を、全部続けて書けといってる?
それやると、テキストエディタでえらいことになるだろ
普通に改行こみでコンパイルできるだろ。 char data [ ] = { 0x00 , 0x00 , 0x00 } ;
単に、 char data1[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0x10・・・ でいいだろ、ってこった。 だがしかし、>895を読む限り全て0と言っている気がするのだが。 それなら更に簡単に、 char data1[65536] = {0,}; でAll0になる。
0x00 を 65536 書いたぐらいでえらいことになるテキストエディタって、あるの?
909 :
デフォルトの名無しさん :2006/10/29(日) 09:31:12
自作クラスに<utility>のoperatorを使おうと思い、 #include <utility> using namespace std::rel_ops; を追加しましたが、他の場所で使っているiteratorの演算子と衝突してしまい、 C2593エラー (operator '!='があいましです) というエラーが出てしまいます。 そのため、自作クラス中だけにutilityのoperatorを使えるようにしたいのですが、 class A { public : operator == () {} operator < () {} using namespace std::rel_ops; } とすると、今度は C2059 構文エラー となってしまいます。 このような場合、どういう風に記述すればよいでしょうか? ちなみに環境はVC8です
>910 >The rel_ops operators are not useful. They were a mistake. If you >insist on using them, you will have trouble. Nobody will care, because >you asked for it. わかりやすく噛み砕いて訳すと「使うな」ということでFA?
valarray, vector<bool> みたいなもんか。他にもなんかあったっけ?
>>909 boost::operators使え。
>>914 おぉ!boostにもoperatorが!
さっそく調べてみます。
ありがとうございます
1 template <class I, class O> 2 O Foo<I, O>::bar(I i1, I i2, O o, bool b) { 3 return o; 4 } 上記コードで c:\Foo.cpp(2): error C2143: 構文エラー : ';' が '<' の前にありません。 とエラーが出ます。 お詳しい方、教えていただけないでしょうか。
コンパイラとバージョンを言え
すみません。 VC++ 2003 ProとVC++ 2005 Expで試しましたが、どちらも同じ結果でした。
struct Foo{ template <class I, class O> O bar(I,I,O,bool); }; template <class I, class O> O Foo::bar(I i1, I i2, O o, bool b) { return o; } ってことか?それとも、 template <class I, class O> struct Foo { O bar(I,I,O,bool); }; template <class I, class O> O Foo<I,O>::bar(I i1, I i2, O o, bool b) { return o; } ってことか?
スレッド間でint形の変数をフラグとして共有したのですが、 volatileをつけとけばOKでしょうか? 排他機構をつけたintラッパとか書かないとだめでしょうか?
template <class InputIterator, class OutputIterator>
class MimeCoder {
public:
virtual OutputIterator filter(InputIterator first, InputIterator last, OutputIterator result, bool fin = false) = 0;
virtual OutputIterator finish(OutputIterator& result) = 0;
};
template <class InputIterator, class OutputIterator>
class Base64Encoder : public MimeCoder<InputIterator, OutputIterator> {
public:
Base64Encoder() : len(0), linepos(0) {}
virtual OutputIterator filter(InputIterator first, InputIterator last, OutputIterator result, bool fin = false);
virtual OutputIterator finish(OutputIterator& result);
private:
int linepos;
unsigned char curr[3];
int len;
void encodeCurr(OutputIterator& result);
};
template <class InputIterator, class OutputIterator>
OutputIterator Base64Encoder<InputIterator, OutputIterator>::filter(InputIterator first, InputIterator last, OutputIterator result, bool fin) {
return result;
}
ということです。
以下サイトのソースを理解してテンプレートの勉強をしようと思ってコンパイルしてみようと考えましたが、
できない理由がわからなくて質問させてもらいました。
ttp://www.s34.co.jp/cpptechdoc/misc/b2a/index.html
>>923 それ全体をコンパイルするとエラーにならないぞ。
>>923 コピペしたソースは gcc/VC8 で何事もなく通ったぜ?
解決しました。 クラスの定義を.hに、実装を.cppに行なっていたのですが、エラーの原因はヘッダをインクルードしていないからでした。 お騒がせしました。
馬鹿か
>>921 sizeof(int)以下ならvolatileでオッケー。
排他するのは無駄。
そうか?mutex使わないとまずいんでないかい?
WindowsのInterlocked関数のようにアトミックに実行できることが保証されていれば、 それに関してmutexは要らない。
任意のクラスのデフォルトコンストラクタを使えなくしたいんですが、 どうすれば良いんでしょうか。
>>932 自前でコンストラクタを定義したらいいと思う。
(それも使われたくなければprivateでいいから。)
任煮のクラスというのが既存の改変できないクラスというなら知らぬ。
デフォルトコンストラクタをprivateにすればよろし。 singleton, multitonの実装で使われるテクニックなので、 詳しくはそのあたりを調査してちょうだい。
20だろ。
20だな。
939 :
933 :2006/10/29(日) 18:18:33
どうでもいいが、任煮ってなんだw ぱっと見は似ているけど。 誤字にはそれなりに気を使ってたつもりだから、ちょっとへこんだorz
任意:にんい 任煮:にんに?
941 :
デフォルトの名無しさん :2006/10/29(日) 21:23:22
CのプログラムをC++に書き換えてもらえませんか??
943 :
デフォルトの名無しさん :2006/10/29(日) 21:27:52
だがOK
>>941 どう書き換えるかによっていろんな答えがあるわけなんだが。
・Cは文字定数は自動的に整数とみなされるが、C++はそうではない。 ・Cはグローバル変数を何度宣言してもOKだが、C++はそうではない。 ・C++はmain関数を直接的にも間接的にも再帰できない。 ・C++はCで6ヶ月かかる計画に比べ、1〜2年かかる。
・C++ではNULLは0である。 ・C++が使える奴は大抵ウザくてキモい。
構造化プログラミングされたものをオブジェクト指向のクラス構成にすると妄想。 表向き書き換えるだけと言いながら事実上の再設計だったりと、 人をだまくらかすにもやりようはあるもんだ。
949 :
デフォルトの名無しさん :2006/10/29(日) 21:41:40
そのCコードを機械語にしてasmすればOK
>>949 とりあえずunko.cをunko.cppにすれば?
>・C++が使える奴は大抵ウザくてキモい。 あるあるwwww
まあ、C++は完全なる変態言語だからなwww
普通の思考回路の人には理解できそうに無い気はするな。
Template用いて、コンパイル時にスレッドのデッドロックを検出する方法 ってありますか?
なぜTemplateを使えばデッドロックが検出できると思ったのか82回くらい聞きたい。
>>956 あなたの思考が読めません。
なぜそんなことが出来ると考えるに至ったのか…
Lokiを考えた天才もいるんだから、もしかしたらtemplateで デッドロックを検出できるかも・・・・?と考えたのかもしれんね。
デッドロックってぇのは資源獲得の順番に一貫性がないってぇことだから、 それを template でチェックしてコンパイル時に洗い出すってぇことも、 あながち不可能ではないかもしれん。やり方は皆目見当がつかないけどね。
C++が変態言語だと?
しょうがないだろ、作ったやつがSM目的(お前らがM)だったんだから。
>>949 まずは、何がしたいのかを相手に分かるように質問する。
C++に書き換えるとはどういう意味か。
Cでコンパイルできるソースは多くの場合そのままC++のコンパイラでも
コンパイルできて、正しく動く。
一部の互換性が無い部分については(大抵)ちょっとした修正をすれば対応できる。
もし上記のようなことをしようとしていて駄目だったなら、とりあえずどんなソースを使って、
どう不具合があったか(コンパイル時のエラーとか、実行時の振る舞いがおかしいとか)を
具体的に書けば、答えが貰えるかもしれない。
そうではなく、C++らしいオブジェクト指向的なソースに書き直してほしいという話なら、
自分で基礎から勉強するか、金払って人でも雇え。
964 :
デフォルトの名無しさん :2006/10/30(月) 00:42:49
実は何年も前に書かれたものをC++として再度作り直すことになったんですが・・・ (中略) 最初にこれ作った人はもう死んじゃってて・・・。
あっそ。 帰れ
>>964 実はCで書かれたものをC++として再度作り直すときの考え方として3つの
(中略)
帰れ・・・。
>>962 S は Stroustrup の S かぁぁぁぁぁぁアッー!!
SutterのSかもよ StepanovのSかもよ
>>964 例えば、(学校で習うような)古語を現代語に書き換える方法を教えてください!
って漠然とした問いに答えられる人が世の中にいると思うか?
typedef typename vector<int>::iterator vint_itor; typedef typename list<int>::iterator lint_itor; この2箇所でエラーが発生します。エラー文は、error C2899: 型名はテンプレート宣言の外側で使用できません。 使用ソフトはVC++EEです どうしたら良いか、教えていただけないでしょうか?
>>971 typenameの目的を理解している?
>>971 答えが無いので、一応「どうしたら良いか、教えて」おく。
typenameを書かないこと。以上。
そのエラーメッセージは、
typename cannot be used outside a template declaration
というもので、
typename はテンプレート宣言の外側で使用できません。
とでも訳すべきだと思う。
template < typename T >
void f()
{
typedef typename std::vector<T>::iterator TIter ; //OK
//型か値かは、すでに分かる。
typedef typename std::vector<int>::iterator IntIter ; //ERROR
}
>>818 申し遅れましたが、structを部分的にカプセル化したかったということです。
メンバに直接アクセスできる気軽さと軽さを求めていましたので……
structの延長線上にあるのでメモリ使用量が変わるのもちょっと気分のいいものではなかったんで。
templateでデッドロック検知は流石に無理じゃね?
オブジェクトの同期を取ってくれるようなTCPライブラリってないでしょうか。
なんか来たな
こういう場合は「標準には無い」と答えてあげよう。
981 :
デフォルトの名無しさん :2006/10/30(月) 19:48:58
C++がHaskellを取り込むのはいつですか?
VC2003でプロジェクトをビルドする際に --enable-utf8 を追加したいのですが、IDEのどこに設定すれば良いのでしょう?
設定すべき場所に設定すればいいんじゃないでしょうか
つーかそれautoconfのオプションだったりしないのか?
次はまだ?
989 :
デフォルトの名無しさん :2006/10/30(月) 21:03:35
>>972 >>973 >>974 返事が遅れるすみませんでした。
本の通りに打ってみたのですが、本が間違ってるんですね。
typenameを消すと通りました。
ありがとうございました☆
990 :
デフォルトの名無しさん :2006/10/30(月) 21:05:07
992 :
991 :2006/10/30(月) 21:42:38
低レベルですみません。 configure コマンドやautoconf はVC には無いという事でOKでしょうか?
低レベルですみません。 次スレってまだでしょうか?
なぜ自分で立てない?
立ててくる.しばし待たれよ.
梅
文句があるならD言語やれよ
任せろ!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。