1 名前:デフォルトの名無しさん [2009/01/11(日) 11:21:38 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part65 pc11.2ch.net/test/read.cgi/tech/1230341243/
610 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:29:35 ] std::vectorならresize()メソッドが使えるから後から大きさを変更する事もできる アクセスは c[1][2] のように書ける
611 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 18:51:41 ] Boostを使ってもいいなら、boost::multi_arrayを検討してみるのもいい。
612 名前:デフォルトの名無しさん [2009/04/13(月) 22:26:09 ] file 1 template<class T> class Parent { void Umu() { Child* p = new Child; p->Method() } }; file 2 template< class T > class Child { void Umaseru() { m_pParent->Umu(); } } テンプレの場合、実装部分をcppに退避する事ができないので、 上記のような相互参照するクラスのテンプレートって実装できないのでしょうか?
613 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:29:15 ] 先行宣言すればいいよ
614 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 22:46:20 ] 先行宣言しても、そのクラスのメンバ呼出ししてたらコンパイルできない気がする。
615 名前:デフォルトの名無しさん mailto:sage [2009/04/13(月) 23:03:59 ] 基底クラス内にあるクラスは派生クラスで特殊化可能ですか?
616 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 07:26:03 ] a Gr bner basis
617 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 09:59:34 ] template<class T> class Parent { void Umu(); }; template< class T > class Child { void Umaseru() { m_pParent->Umu(); } } template<class T> void Parent::Umu() { Child<T>* p = new Child<T>; p->Method() }
618 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 06:30:03 ] 質問です。お時間あればよろしくお願いします。 -------------------------------- class Base { // 省略 virtual size_t getSize() const { return sizeof(*this); } }; class Derived : public Base { // 省略 }; int main() { Derived d; d.getSize(); -------------------------------- d.getSize()の値がBaseなのですが、自分が期待していたのはDerivedのサイズの取得です。 DerivedではgetSize()を定義せず、 Derivedのサイズを返すメンバ関数をBaseで定義することはできるでしょうか? 何か良い方法があれば教えていただきたいです。
619 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 06:57:06 ] >>618 もし、Derivedにprivateなメンバ関数を追加することが許されるのであれば、 BaseとDerivedに、それぞれsizeof(Base)とsizeof(Derived)を返すprivateでvirtualなメンバ関数を追加する。 で、Base::getSize() からはそれを呼び出すようにする。 原則としてsizeofの値はコンパイル時に決まるのであり、実行時の型で決まるものではないことに注意。 (C99の可変長配列は例外となる。)
620 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 08:53:01 ] >>619 早速の返答ありがとうございます。 なるほどサイズは動的に決まるわけではないんですね。 そもそもこんな事をしたくなる設計がよくないんでしょうかね…
621 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 10:19:50 ] ifstreamでバイナリファイルを読み込んでいます。 現在の読み込み位置のアドレスを知る方法はないのでしょうか? operator>>で読み込むたびにカウントするしかないのでしょうか?
622 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 11:18:42 ] >>621 tellg()
623 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 12:05:18 ] ファイルサイズはseek+tellで得るのが定石だった頃が俺にもありました
624 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 13:02:25 ] >>620 もしよければ、なんでサイズを取得する必要があるのかを教えてくれないか。 今までそういう場面に遭遇したことがない。 インスタンスの正体を調べたいなら、getClassのインプリメントなりdynamic_caseで済むと思うが・・・
625 名前:592 mailto:sage [2009/04/16(木) 13:48:03 ] >>593 >>595 ありがとうございます。 どうやら私のstatic関数への理解がおかしいみたいなので、 勉強してきます。 なんか同じstaticという予約語を使っていながら、 使い方しだいでだいぶ意味が違う気がするんですが・・・。
626 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 17:28:05 ] >>625 > なんか同じstaticという予約語を使っていながら、 > 使い方しだいでだいぶ意味が違う気がするんですが・・・。 いかにもそのとおり。 それが嫌なので、C++ではグローバルでstaticなものを宣言する代わりに、無名名前空間が推奨されている。
627 名前:621 mailto:sage [2009/04/16(木) 19:05:12 ] >>622 ありがとうございます おかげさまで tellg, tellp, seekp, seekg 等を知ることができ 無事プログラムを動かすことができました
628 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 21:08:54 ] C++のifstreamではtellp==tellg、seekp==seekgなんだよな stringstreramではtellp!=tellg、seekp!=seekgなのに この事に気づくのに手間取ってしまった
629 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:30:06 ] ifstreamにtellp、seekpは無いっしょ
630 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:40:31 ] >>629 ある 普通に使える が、tellpはtellgと同じ意味になるし、seekpはseekgと同じ意味になる やってみそ
631 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:44:14 ] たしかfstreamでもpとgのシーク位置は連動するはず。
632 名前:629 mailto:sage [2009/04/16(木) 22:53:10 ] >>630 fstreamにはpとg両方あるけど、ifstreamにはgしかなくね?
633 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 22:58:26 ] >>632 悪い fstreamでなくてifstreamだったか 酔ってるスマソ
634 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 00:17:13 ] Windows XPのコマンドプロンプト画面から g++ hoge.cpp piyo.cpp みたいな感じで使えて、 標準準拠性も良くて、無料な コンパイラ(リンカ付き)ってありませんか? g++を使っていて、エラーメッセージがイミフな時に別のコンパイラで試すのに使いたいんです。 VC++だとコマンドから使えないですよね?
635 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 00:18:42 ] つかえますよ。
636 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 00:22:43 ] >>635 まぢすか。 VC++が使えれば文句ありません。 もう一度調べ直してきます。
637 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 05:27:19 ] windowsで無料で使えて新しめってg++とcl位?
638 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 06:39:15 ] ちょっとスレ違いになってしまうかもしれないんですが、 巷で言われているメモリプール化というのをしようとしてるんですけど 概念として教えてもらいたいものがあります。 ヒープ領域とは全体の確保されたメモリ チャンク領域とはこれから使う為にヒープ領域から必要なだけ小出しに取ってきたメモリ って感じでいいんでしょうか? プールとは?チャンクと同じような概念でよろしいでしょうか?
639 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 07:06:21 ] ヒープ領域 newでシステムから借りてきたメモリ領域。 プール=確保したもの、プール金とかのプールと意味は同じ。予めシステムから借りておく。 お金が必要なたびにいちいちATMに逝くのではなく、必要になる前に家に現金を置いておくイメージ。 チャンク=こまぎれ。 数バイト毎とかでチマチマ確保すると効率が悪いので、大きな単位で確保する。 必要な額だけをATMからおろすのではなく、必要な額を10万円単位で切り上げておろす、みたいなイメージ。 1万円必要になったら10万円おろし、 11万必要になったら20万円おろす。
640 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 08:00:39 ] その手の比喩は、7-8割理解できている人間に「トドメの刺す」のには有効だけど、 初期に読まされると余計混乱すると思うよ。
641 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 08:03:11 ] ×トドメの ○トドメを >>638 「Effective C++」に確か、実例つきで説明があったはずだから、 それを読んでみるといいんじゃないかな。
642 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 10:10:02 ] 〜_tはtypedefの証というけど、 これは規約上予約されている? 例えば自分で numeric_t とかしちゃだめ?
643 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 10:33:18 ] 全然。いくら使っても大丈夫。_tamuraとか__tamuraとかも衝突しない限り使って大丈夫。
644 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 10:52:01 ] >>643 ありがとう。 MY__M__A__C__R__O とか予約されてるじゃん。これと同じ感じで予約されてたらやだなと思ったのだ。
645 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:03:25 ] > MY__M__A__C__R__O なんだ俺の知らない世界の話か Cのプリプロに名前を教え込むのは極力避けたい
646 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:50:47 ] >>643 _tamura はグローバルでは予約されてるから使えない。 __tamura はどこでも予約されてるから使えない。
647 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:53:10 ] // main.cxx namespace { typedef int _INT; } int main() {} std::でもグローバルでもないならおk?
648 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 12:58:46 ] >>647 _INT みたいにアンダースコア〜英大文字で始まる名前は ダブルアンダースコアを含む名前と同じくどこでも予約。ダメ。
649 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:04:41 ] >>645 _が二連続した名前は予約済みなんだよ。
650 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:04:42 ] s/_INT/_iNT/ # おk?
651 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:07:51 ] ttp://msdn.microsoft.com/ja-jp/library/cc440188(VS.71).aspx ここの 予約名の形式 ってところに書いてあるね。
652 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:12:26 ] どこの独自コンパイラだよ^^ _hoge も __fuga もうちのコンパイラは全然大丈夫だよ。
653 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:14:29 ] >>647 ,650 アンダースコア〜英小文字で始まる名前はグローバルで予約されてる。 処理系がグローバルに _iNT って名前を置いてたら曖昧になっちゃうから、 すぐに未定義動作とは言えなくてもやっぱりダメだろう。 早い話、そもそもアンダースコア始まりの名前なんか使わなきゃいい。
654 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:17:02 ] >>652 予約されてるかどうかが問題なんだよ。 今大丈夫でも、コンパイラを変えたりコンパイラのバージョンやコンパイルオプションを 変えたりしただけでエラーになるコードじゃ困るだろう。
655 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:20:52 ] >>653 すべての識別子において、 ファイルスコープを持つ ならば グローバルスコープを持つ ということ??
656 名前:655 mailto:sage [2009/04/17(金) 13:24:20 ] 自己解決しました
657 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 13:36:11 ] >>639 なるほど! >>641 あー、よく聞く本です。ちょっと探してこようかな…
658 名前:デフォルトの名無しさん [2009/04/17(金) 22:21:47 ] 演算子について教えてください。 (見やすさとか保守性とかは考えないとしてC++の規格上) a と b が int 型の時、 以下の表現は問題無いでしょうか? 『 b ? a=b : a++; 』 ? : よりも = の方が優先順位は低いのですが、 ? と : は2個セットの演算子なので、 (b ? a) = (b : a++); このように別々になることができず b ? (a=b) : a++; の解釈しか出来ないはずで、 VCでも正常にコンパイル出来、ちゃんと動作します。
659 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 22:30:15 ] >>658 うん、大丈夫。 文法上、「論理和式 ? 式 : 代入式」となっているので問題ない。 そう、ついでに言えば、?と:の間に?:を入れ子にもできてしまうということも導かれる。
660 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 23:25:55 ] >>659 ありがとうございます
661 名前:デフォルトの名無しさん [2009/04/17(金) 23:54:12 ] 暗黙の型変換について教えてください。 以下のようなものはdoubleからintへの暗黙の型変換は行われないのでしょうか? 私の環境ではコンパイルエラーになってしまいます。 int a[1.0]; int b = 1%1.0; int c = 1&1.0; enum{d=1.0}; 暗黙の型変換が行われない例は他にありますでしょうか?
662 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:25:24 ] doubleの値はintでは表現できないので暗黙に変換できない。 基本的に情報落ちが発生する方へは暗黙で変換できない。
663 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:28:31 ] 処理系によるぞ VC9だと、 int i = 1 * 0.8; は warning 扱いになる。(int)で黙る。
664 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:30:25 ] 型変換にはいろいろあるんだぞー 算術式での格上げとか暗黙の型変換とか
665 名前:おもち [2009/04/18(土) 00:39:16 ] プログラム初心者なのですが、いい参考書などないでしょうか?
666 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:41:43 ] >>665 死ね
667 名前:デフォルトの名無しさん [2009/04/18(土) 00:44:18 ] >>666 久しぶりに激しくワラタwwwwwwwwwwww ・・・俺も寂しいな >>665 感覚を養うために難しい本じゃなくまず センスオブプログラミングみたいな素養本を読め 言語本は辞典代わりで十分
668 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:47:52 ] 初心者がC++・・・うーむ。 大概の入門書はCを知っていることを前提に書かれているからなぁ。 ところで、大昔javaが出たての頃に読んだ入門書は C++を知っていること前提みたいな内容だった。 どこでもかしこでもC++との比較が載っていて、 そんなのが全体の1/4くらいを占めていた。 何も知らないで使えるのはBASICとかRubyとかそのへんかな。
669 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 00:56:59 ] コンピュータのことを知らなくてもできるのはhaskellかな… 別の知識がいるけど、基本は因数分解と展開(四則演算より単純な算術)なんで 人によっては普通の言語よりわかりやすいのかもしれない ついでにC++は普通の言語と関数型言語の難しいところだけを集めたような言語だと思ってる
670 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 01:11:16 ] ぶっとんでるな
671 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 02:00:40 ] >>662 >>663 >>664 関数の引数やコンストラクタはdoubleからintに暗黙的型変換が行われますよね? int f(int a){ return 0 }; f(1.0); int a = 1.0; とかは大丈夫なはず。 これが大丈夫で、>>661 がダメだというのは、 規格書のどの辺に書かれているのですか? もしわかれば教えていただけないでしょうか。
672 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 02:06:18 ] 自分で探せやカス
673 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 02:15:35 ] >>661 > int b = 1%1.0; がdoubleに余剰演算かけようとしてエラーになってるんじゃないの? 式の中での暗黙の型変換なんだから1の方がdoubleに変換されて > int b = 1.0%1.0; になると思うんだが。 >>671 それは代入時の暗黙の型変換なんだから左辺側に変換される。
674 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 08:12:20 ] >>673 たとえば関数なら、 int a(int x,int y); int a(double x,double y); int b(int x,int y); が定義されてたら、 a(1,1.0) は汎整数昇格の方が優先される為、 a(1.0,1.0) となりますが、 b(1,1.0) は b(1.0,1.0) の定義がないので b(1,1) と変換されると思います。 %演算子の場合も同じように、1.0%1.0の定義が無いため 同じように1%1と型変換されたりしないのでしょうか? あと、 int a[1.0]; enum{d=1.0}; これはNGですか?
675 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 10:33:21 ] >674 > 5.6/2 >The operands of * and / shall have arithmetic or enumeration type; >the operands of % shall have integral or enumeration type. The usual >arithmetic conversions are performed on the operands and determine >the type of the result. usual arithmetic conversion は 5/9 で規定されていて幅が広がる方向の 変換しか規定されていない。 >664 や >673 の言っている通り、どういう時にどういう変換がかかるかは一つじゃない。
676 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 10:46:32 ] > あと、 > int a[1.0]; > enum{d=1.0}; > これはNGですか? integral constant expression ではないので NG。 論拠は7.2/1、8.3.4/1、5.19/1。
677 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 10:50:16 ] 7.2/1、8.3.4/1、5.19/1って何を見ればいいの? ネット上で閲覧できるもの?
678 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:02:45 ] ANSI規格。
679 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:05:07 ] で、それはネット上で閲覧できるもの? URLは?
680 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:21:06 ] ドラフトならタダで見れるだろ
681 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:29:25 ] で、URLは?
682 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 11:41:50 ] 自分でググれよ
683 名前:デフォルトの名無しさん [2009/04/18(土) 11:45:03 ] 出た、「ググれよ」ww
684 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 12:11:49 ] そりゃ出るだろう。出る箇所だもの。
685 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 12:24:34 ] www.open-std.org/JTC1/sc22/WG21/docs/projects この程度もぐぐれないのならネットやるなよ
686 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 12:33:52 ] >>675 >>676 ありがとうございました。 書かれている場所まで記述していただいて 非常に参考になりました。
687 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:04:10 ] C++のANSI規格が見られるURLを教えてください。
688 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:14:09 ] >>687 ありません 購入しましょう
689 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:20:08 ] 一次ソースはISOな。 日本語訳がJISのサイトで閲覧できる。
690 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:21:07 ] で、URLは?
691 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:24:06 ] 自分でググれよ
692 名前:デフォルトの名無しさん [2009/04/18(土) 13:26:45 ] 出た、「ググれよ」ww
693 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:31:23 ] そりゃ出るだろう。出る箇所だもの。
694 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:33:58 ] www.open-std.org/JTC1/sc22/WG21/docs/projects この程度もぐぐれないのならネットやるなよ
695 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:34:11 ] www.open-std.org/JTC1/sc22/WG21/docs/projects この程度もぐぐれないのならネットやるなよ
696 名前:デフォルトの名無しさん [2009/04/18(土) 13:35:31 ] 精神レベルの低い、幼稚なお子ちゃまがよぉ、軽々しく死ねとか言うなよ? お前を育てた奴は人間社会では、かなりレベルの低いバカだったんだな。 育てられたお前がかわいそうとか思わない。大人になって苦労するのはてめぇ。 いつか死ぬから、バカな存在として一生を無駄に過ごしなさい。
697 名前:デフォルトの名無しさん [2009/04/18(土) 13:37:02 ] 誤爆
698 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:39:06 ] 軽々しくググれとか言うなよ
699 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:40:32 ] こんなものは最初からテンプレに入れとけって話だよ。 お前らの怠慢を質問者になすりつけるな。
700 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:40:38 ] どうかググってくださいお願いします。
701 名前:デフォルトの名無しさん [2009/04/18(土) 13:44:37 ] 人にググれという前に、自分でググって見つけたURLを貼りなさい。
702 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:51:04 ] で、何のURLを貼って欲しいの?
703 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 13:58:13 ] C++のANSI規格が見られるURL
704 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:01:12 ] とあるライブラリを使おうと思ったら、コールバック関数がCの関数ポインタでした。 データも渡したいんですが、関数オブジェクトが使えないので困っています。 データをグローバル変数にするしか方法はないのでしょうか?
705 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:03:14 ] とりあえず、使いたいライブラリの機能と、コールバック関数と、渡したいデータを教えてください。
706 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:14:28 ] >>703 www.jisc.go.jp/app/JPS/JPSO0020.html へ行ってX3014で検索してこい。章番号は変わらないはずだから。 ISOもANSIもJISも売り物なので、ちゃんとした物は金を払わなければ見られない。 ダウンロード販売のURLも貼ろうか?
707 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:14:42 ] そういうコールバックは、データを保持できるvoid *をペアで登録することができて そいつが引数としてコールバックに渡される仕様になってるはずだが そうでないならあきらめな
708 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:18:02 ] >>706 ちゃんとした物とちゃんとしてない物は何が違うの?
709 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:23:52 ] >>708 ちゃんとしていない物=非合法なコピー品。 提供した者の手が後ろに回る可能性がある。 あと、JISの規格書なんかは閲覧は出来てもダウンロードしてオフラインで見ることは出来ない。
710 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 14:26:02 ] >>709 ちゃんとしていない物=非合法なコピー品が何故公式ページからリンクされてるの?