1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
331 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 01:48:50 ] >>329 無理。外側の ClassA の定義が必要。 ClassA の中で class InnerClassA; としてあれば InnerClassA の定義は必要ない。
332 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 08:20:45 ] >>315 >D* を B* としてアクセスするのは、規格の 3.10 p15 にあるエイリアスの制約に >違反するので、未定義動作。 普通のアップキャストだからOKじゃないの?
333 名前:332 mailto:sage [2008/06/20(金) 08:34:45 ] 332は>>315 じゃなくて>>330 だった。 なおModern C++ Designでは、 仮想継承でなければstatic_castによる アップキャストは問題ないとなってた。 規格でどうなってるかは知らない。
334 名前:332 mailto:sage [2008/06/20(金) 09:16:06 ] >>330 もしかして static_cast<B**> がダメってことですか?
335 名前:330 mailto:sage [2008/06/20(金) 09:30:49 ] >>332 ごめん。まぎらわしいね。 「D* に B*& でアクセスするのは、〜」ってことで、少しは伝わりやすいかな、と。
336 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 13:36:27 ] C++ の仕様では sizeof(B*) != sizeof(D*) の処理系もありえるのかな。
337 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:16:43 ] クラスが違うとポインタサイズも違うのか・・・?なんという
338 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:08:14 ] class XをSTL準拠にするため自作イテレータを作ろうと operator++( X* x )みたくしたら 「クラス型パラメータがひとつもありません」と怒られました。 ハーバートシルト先生のSTL標準講座を読んでも解決法が書いてありません。 っていうか自作STLの書き方なんて載ってないし。 もうだめです。さようなら。
339 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:56:07 ] はい、さようなら。
340 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:37:07 ] using namespace std;という呪文が書いてある他人の作ったヘッダ(hoge.hh)をインクルードするのが気持ち悪かったので、 >hogehoge.hh namespace hogehoge{ #include "hoge.hh" }; >hogehoge.cc #include "hogehoge.hh" …… ってやったらhoge.hhの中でhogehoge::stdをさがしにいきやがったのが納得いかないんですが、 using namespace std;っていうのはstdをグローバルスコープにする命令じゃないんですか?
341 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:52:33 ] 違うよ。 現在の名前空間から見てstd::以下にあるシンボルを現在のスコープにロードする命令だよ。 ちなみに、名前空間のなかから普通の"std"を読み込みたいなら using namespace ::std; とする必要がある。
342 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:11:09 ] >>338 ポインタで横着しようとしないで、イテレータ用のクラスを作る。
343 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:16:56 ] >>340 hogehoge::stdを探しにいったってことは、 hoge.hh内に namespace std {...} があるのか・・・。 using namespace std;で飽き足らず、 std空間にユーザー定義を追加するとは、不届きなヘッダだなw とりあえず、 >hogehoge.hh namespace hogehoge { namespace std { using namespace ::std; } // これを追加 #include "hoge.hh" }; しておけばおk。
344 名前:343 mailto:sage [2008/06/20(金) 18:54:47 ] あ、hoge.hhにstd系のincludeがあったら駄目か・・・。
345 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 19:01:52 ] >>341 うむむ、namespaceは奥深いですね。 >>343 namespace stdは見つかりませんでした。。。 あと、その行を追加してもhogehoge::stdを探しに行ってるように見えます。。。 一番簡単なのはヘッダのusing namespace std;の行を削除することなんだろうけど、 ファイルの上の方のコメントみたらcopyrightとか書いてあるし…… 諦めて裸のままインクルードして使うことにします。 ありがとうございました。
346 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 13:11:25 ] >>344-345 hoge.hhの中にincludeがあるなら、 それを先にincludeしとけば良いんじゃね? インクルードガードで無視されるから。 例えば #include <vector> があるなら↓のように。 #include <vector> namespace hogehoge { namespace std { using namespace ::std; } #include "hoge.hh" };
347 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 23:55:19 ] 定数を指定するとき、C言語では#defineを使いましたが、 C++ではconstな変数を使え、とモノの本に書いてありました ところで、定数がint型で何個も欲しいのですが、 列挙型の列挙子で代用するのはアリでしょうか?
348 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:09:47 ] >>347 どれくらいの個数かにもよるかもしれないけど、 列挙子で代用(?)している入門書は結構ある。
349 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:28:08 ] #define 使うなってのは、型だとか副作用だとかエラーメッセージだとかだから enum なら問題ないと思うよ
350 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:30:07 ] 配列の添え字に使いたかったんです 単なる数字より、文字のほうが読みやすいですし ありがとうございました
351 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:34:33 ] >>347 なんで数が増えたら enum で代用するなんてことになるの? 意味が違うだろ。
352 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:37:28 ] 連番なら enum だね。
353 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:46:05 ] >>351 いや、0から始まる連番なもんで
354 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 00:50:15 ] >>353 それなら代用じゃなくて enum が正解。逆に int const で用意するほうがありえない。
355 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 03:11:09 ] すみません. ここでする質問ではないかも知れませんが. C++でMPEG2を取り扱うプログラムを作らなくてはならなくなりました. MPEG2を扱うにはどのようなlibraryを使わなければならないでしょうか? またそのマニュアルが詳しく掲載しているサイトを教えてくれません? Directshowは抜きでお願いします.
356 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 03:25:18 ] ffmpegでヤフれ ただしMPEG2特許の利用ライセンスは自分でとってね!
357 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 16:44:37 ] VC++環境です。STLのlistについて質問です。 あるlist(Aとする)の情報をまるまる別のlist(Bとする)にassign()で写したのち、 Aのある位置を指しているイテレータをそのままBで使いたい (Aで指していた位置にある情報を指させたい) のですが、方法を探しても見つかりません。 アルゴリズムのfind()以外で何か方法はありますか?
358 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:13:09 ] >>357 std::distance(), std::advance() ただ、listだとランダムアクセス出来ないから 一応それぞれO(n)で、セットでO(2n)になる。 まぁとんでもない要素数でない限り一瞬だろうけど。
359 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:18:01 ] listはアクセスするだけでもメモリの中を不規則な順序で飛び飛びするので、平均の次の要素へのアクセス速度は 要素が連続しているvectorよりも遅い。
360 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:24:45 ] >>357->>359 頭からの距離で考える発想は思いつきませんでした。 要素も少なく、実際に動かしてみても一瞬で処理できました。 ありがとうございました。
361 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 22:12:24 ] 解決したようだが、 begin()〜itとit〜end()の2回に分けてコピーするのもいいな。
362 名前:355 mailto:sage [2008/06/24(火) 02:37:33 ] ffmpegをヤフりました. MS-DOSで動くオープンソースの動画変換アプリなんですね. ソースを見て参照方法を探れということですね? これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか? それと商用配布は考えていないのでライセンス申請の必要はありません.
363 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 03:12:10 ] いいえ、商用に限らず許可なく使うことは許されません。
364 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 07:35:29 ] 特許権は、それを使ったものを製造、保管、流通することを制限することができるよ。 商用かどうかは関係ないよ。 詳しくは法務に聞こうね。
365 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 10:47:36 ] >>362 > MS-DOSで動くオープンソースの動画変換アプリなんですね. 違います。 > ソースを見て参照方法を探れということですね? 違います。 > これも方法の一つとしますが時間がかかるので,なにか他の方法はないでしょうか? 規格書読むより時間掛かりませんよ。
366 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:10:28 ] classのstaticメンバで、shortの配列があります。 例えば、 class hoge { private: static array[100]; }; となっていて、arrayの中身を for(int i=0; i<100; i++){ array[i] = i*i; } のように初期化したいとします。 このよな作業はどの箇所で行えばいいでしょうか。
367 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:16:38 ] >>366 クラスの外で一回やっておけばよい。 main()が呼ばれる前に初期化される保証がある。
368 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:19:15 ] Singletonの問題のようにも思えるが
369 名前:366 mailto:sage [2008/06/24(火) 16:27:24 ] >>367 GCCですが、.cxxの先頭でやると怒られます。 src/hoge.cxx:24: error: expected unqualified-id before ‘for’ src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘<’ token src/hoge.cxx:24: error: expected constructor, destructor, or type conversion before ‘++’ token 24: for(int i = 0; i < 100; i++){
370 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 16:28:58 ] #include <iostream> class hoge { private: static int array[100]; static int flag; public: hoge() { if (flag) { for (int i = 0; i < 100; i++) array[i] = i * i; flag = 0; } } void printa() const { for (int i = 0; i < 100; i++) std::cout << array[i] << ' '; } }; int hoge::flag = 1; int hoge::array[100]; int main() { hoge h; h.printa(); }
371 名前:366 mailto:sage [2008/06/24(火) 16:31:18 ] short* hoge::array = 0; としておいて、constructorで if(!array){ array = new short[100]; for(int i=0; i<100; i++){ array[i] = i*i; } } でしょうか。それだと、いつdeleteするのでしょうか。 それとも、初期化フラグをメンバ変数に持っておいて、 それのtrue/falseでconstructorからfor文を呼び出す?
372 名前:366 mailto:sage [2008/06/24(火) 16:32:03 ] >>370 ということのようですね。 ありがとうございました。
373 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:22:54 ] どんな初期化をするかにも夜 コンストラクタとデストラクタは忘れないであげてくだちぃ
374 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 17:54:53 ] >>373 staticだからこの場合は無理なのよ
375 名前:355 mailto:sage [2008/06/24(火) 18:33:23 ] ffmpegのAPIを使ってMPEG2を読み込めということでしょうか? 現在mpeg2dec-0.4.1 とでどちらを使うか考えています. 両方の向き不向きについて何か教えてくれませんか?
376 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 18:49:21 ] C++相談室
377 名前:355 mailto:sage [2008/06/24(火) 19:53:12 ] すみません. そうでした.完全にスレ違いになってしまいました. 去ります
378 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:49:33 ] C++って先頭からコンパイルしますよね だから↓はコンパイルエラーになりますよね。 void main(){ int a=func(3); } int func(int x){ return x+5; } なのに、なぜ↓はコンパイルエラーにならないんでしょうか? class cA{ public: cA(){a=10;} private: int a; };
379 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:50:14 ] C++って、単純な速さは他の言語と比較してどうなの?
380 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:56:45 ] >>378 そういう仕様に決まったから。 >>379 書き方や問題領域で当然変わってくるけど、大体Cと同じ。
381 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 00:58:44 ] ていうことは、C++のコンパイラは場合によっては、 読む場所を行ったり来たりしうるんですね ありがとうございました
382 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:00:09 ] >>378 正確に述べると、クラス定義の中に関数定義を書くと、 そいつはクラス定義の終わった後に、inline付で定義されたものとして扱われるということになる。
383 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 02:15:49 ] クラス宣言じゃないのか。
384 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:37:29 ] 定義。
385 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 07:51:00 ] クラス宣言って外部でメンバ関数の定義をしたりあと前方宣言 の時に使われる物?
386 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 08:26:28 ] クラスそのものを後方定義というやり方にも使う。
387 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 09:26:57 ] template<typename T> struct base{ typename T::X test(){ return typename T::X(); } }; struct A : base<A>{ struct X{} }; 継承するクラスのテンプレートに継承するクラス自身を渡して、 継承するクラス内の型を基底型で使いたいのですが不可能でしょうか?
388 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 10:55:21 ] >>387 全く問題ない。
389 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 11:27:40 ] >>387 弾かれました template<typename T> struct base{ typename T::X test(){ return typename T::X(); } <-error C2039: 'X' : 'A' のメンバではありません。 }; struct A : base<A>{ struct X{} };
390 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 13:48:24 ] struct X {}; struct A { void add( X* x ); }; X* x = new X; A a; a.add( x ); A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。 この場合 A::add() が失敗して例外を投げるとき A::add() は x を delete するべきでしょうか? 普通、関数が例外を投げるときその関数が何もしなかったことにするのが理想だと思いますが delete したほうが便利な場合も多いと思うのですが。
391 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 14:02:32 ] すべきでないと思う auto_ptrを使えばどうか struct A{ void add(std::auto_ptr<X> x); }; std::auto_ptr<X> x(new X); A a; a.add(x);
392 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:30:13 ] >>390 391に同意。 a.add(x)に渡すxはnewしないといけないという変な制約が発生してしまうから。
393 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 20:45:33 ] boost の shared_ptr のコンストラクタや ptr_container の追加関数は 確か失敗したら delete される設計になってた。
394 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 02:56:30 ] >>390 そのインターフェースなら a.add(new X) したくなりそうだから、 delete したほうがいいと思う。
395 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:01:08 ] >>393 スマートポインタと一緒にしちゃだめでしょ。 >>394 X x; a.add(&x)で落ちてもいいんだね。
396 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:08:30 ] >>395 boost::ptr_vector
397 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:27:03 ] C++で動く、フリーなライセンスの行列演算ライブラリはありませんか?
398 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:13:04 ] boost
399 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 21:34:13 ] boost::uBLASな
400 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:34:47 ] boost::uBLASってパフォーマンスより安全性とかを優先してて遅いとか、 書かれてるけど、実際どうなん?
401 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 00:48:54 ] boost::numeric::ublasは遅くないぞ パフォーマンス表も書いてある boost.cppll.jp/HEAD/libs/numeric/ublas/doc/overview.htm
402 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:02:54 ] liboctaveより遅いけどな
403 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:07:56 ] そうかもしれんがBlitz++のように途中で更新停止したり するのが怖い boostならまずそういう事はないだろうし
404 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:25:54 ] 確かに。メンテされ続ける安心ってのは大事だな。
405 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 01:56:56 ] Program Optionsとか放置されてて酷いけどな。 一度使おうとして、あまりにも酷い出来で、ワイド文字対応がなってなかったんで、あきらめた。 内部的には全部マルチバイト文字にしてやがる。 そのため、ワイド文字でデフォルト値とか設定しようとするとコンパイルエラー。 少しいじって、utf16からutf8に変換するようにしてやれば動くが、 わざわざそんなことするぐらいなら、自前で書いたほうがいい。 ありゃ絶対に、一文字は絶対に一バイトで、しかも7bitに収まるって前提の南蛮人の書いたコードだ。
406 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 02:19:23 ] progressbarは?
407 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 03:59:44 ] >>401 ありがとうございました。 ありがとうございました。 ありがとうございました。
408 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 07:53:35 ] >>395 > A のオブジェクトは A::add() で追加した X のオブジェクトを delete する義務があります。 これが前提じゃないのか? new してないものは最初から渡せないだろ。
409 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 08:08:55 ] 「渡せない」と「渡さない」の違い
410 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 09:33:28 ] すみません。boost::numeric::ublasを教えていただいた者ですが、 vc8でdebugモードとreleaseモードで結果が異なり、debugモードでのみ正常に動作します。 使用しているboostは1.34ですが、これにはバグがあるんでしょうか? 面倒なのでアップデートしたくないのですが・・・。 boostコード中で警告4267と4244が出てくるのでboostが原因かもしれませんが把捉しかねる状態です。 ご教示願います。
411 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 10:59:43 ] engineering.meta-comm.com/boost-regression/1_34_1/user/numeric-ublas_release.html 1.34.1で悪いけど。 結構厳しいね。
412 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 12:45:56 ] >>397 俺はliboctave使ってたよ もう遅いかもしれないけど…
413 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:07:42 ] C++ 始めたばっかなんですが、 this はなんでポインタなんでしょうか せっかく参照というものがあるのに... そんで、今日は C++ のオブジェクトが自身への参照を self という名前で持てるようにいろいろがんばってました。 具体的には、そのクラスを継承したらクラス定義の中で self が使えるようなクラスを作ろー...と思ってたんですが、うまくいかず。 結局 #define self (*this) しか思いつきませんでした orz こういうんじゃなくって、ちゃんと自分自身への参照をメンバ変数にもつオブジェクトは作れないのでしょうか。
414 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:18:51 ] >>413 別の表記方法がないなら*thisでいいじゃん。表現に揺らぎがなくて結構なことじゃないか。同じものをいろんな名前で表現させるほうが混乱するんでないかい? size length len count distance 同じ意味だったり違った忌みだったり混乱するね。
415 名前:デフォルトの名無しさん [2008/06/28(土) 21:25:04 ] >>413 昔、this = malloc(1); てな構文があったんだよ
416 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:29:05 ] >this はなんでポインタなんでしょうか thisが C with Classes に導入されたときには参照はまだなかった
417 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:31:11 ] JavaからC++への移行は推奨しません。
418 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:47:59 ] selfってことはJavaじゃないと思う
419 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:50:43 ] Object Pascalだね。
420 名前:デフォルトの名無しさん [2008/06/28(土) 21:51:42 ] C++ではboostはデフォなのか?
421 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:51:52 ] 現代版#define BEGIN {ですね、わかります。
422 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:58:28 ] >>420 一部はデフォになりつつある。 まあ、知って損はない。俺も最近使い始めた。今まで知らなくてずいぶん損したと思う。
423 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 21:59:31 ] >>420 中にはそういう人間もいる(俺もその1人だがな)。 当然、すべての人間にとってそうとは限らない、いつだって使えるとは限らないから、 Boostデフォを妄信するのは危険。使えないときは反動でだるくなる。
424 名前:440 mailto:sage [2008/06/28(土) 22:49:03 ] >442 勉強しておくよ。 GCとか便利そうだし >443 仕事の場合だと、使えない場合が多そうだな。
425 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:50:24 ] 今テレビでターミネーター2やってるよね。 未来から来たって話。
426 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 22:59:36 ] >>424 440基準でも未来レスかよw
427 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:01:52 ] Testってクラス書くとして Test.cppとTest.h用意? Test.cxx作ってそこに全部記述?
428 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:02:56 ] Testを他で使うなら.hも作っとけ
429 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:05:05 ] Test.hppにテンプレートクラスでイナフ
430 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:11:42 ] hppだとどういうコーディングルールがベスト? サンプルないかな?
431 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:14:01 ] boost