1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part70 pc12.2ch.net/test/read.cgi/tech/1244942050/l50
57 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 02:30:41 ] いやいや、SetPropとかSetWindowLongPtr使えってテンプレ回答では?
58 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 13:30:12 ] >>57 そういうことか メッセージループでswitch文書きたくないのかと思った
59 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 14:30:01 ] ある関数void foo(unsigned int num)内の出来事。 引数numに格納された値を使って、 char* array = new char[num]; として確保して使いたい。 ところが使用後(fooスコープを脱出後)には自動的に破棄されるようにしたい。 これを実現するのに一番簡単な方法は何でしょうか? デストラクタを利用して出来そうな気がするのですが。 よろしくお願いいたします。
60 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 14:35:52 ] std::vector<char> v(num); char *array = &v[0];
61 名前:59 mailto:sage [2009/07/24(金) 15:01:42 ] >>60 なるほど、vectorの内部の配列は連続していることが保証されているというのを使うわけですね。 ありがとうございました。
62 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 15:04:43 ] #include <boost/scoped_array.hpp> boost::scoped_array<char> s( new char[num] ); char *array = &s[0]; これだとダメかな? 知ってる人いません?
63 名前:62 mailto:sage [2009/07/24(金) 15:13:36 ] char *array = s.get(); でしたね。 失礼。
64 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 15:56:38 ] 後でサイズ変更しないならいいんじゃねぇの
65 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 16:12:04 ] int型のベクターの初期化で楽な方法ってありますか? int配列はint a[]={1,2,3}みたいにかけるので 今は一時的にint配列をつかってこんな風にやってるんですが vector<int> v; int d[]={1,3,2,5,6,17,8,0,2}; copy(d,d+sizeof(d)/sizeof(d[0]),back_inserter(v));
66 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 16:17:38 ] vector<int> v(&d[0], &d[sizeof(d)/sizeof(d[0])]);
67 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 17:03:00 ] ありがとうございました
68 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 20:17:36 ] boostにそれ用のコーポネントがある。 boost::assignでぐぐれ
69 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 20:55:51 ] C++ code - 39 lines - codepad ttp://codepad.org/6eGTAvJT ここにある関数 call_display_1(&d); call_display_2(d); call_display_3(d); のうち、call_display_1とcall_display_3はdisplay()が仮想関数として 定義されているので挙動は理解出来ます。 call_display_2(d); は、引数をconst参照で受け取っていますが、これでも仮想関数は必ず有効で 標準出力に"Derived Class."が出力されると保証されていますか? 「参照はポインタを使って実装されている」 と聞いたことがありますが、こういった実装上の理由ではなく、 標準C++の仕様上確かに保証されていますか?
70 名前:デフォルトの名無しさん mailto:sage [2009/07/24(金) 22:16:23 ] はい
71 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 13:46:26 ] 色々やってみたけど結局templateでjavaジェネリクスのextends条件はできませんでした。
72 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:41:50 ] こんなのどうよ class A {}; class B : public A {}; class C {}; template <typename T> class X { public: X(){ T *t = 0; A *a = t; // Aの派生クラスでなければここでERROR }}; int main() { X<A> a; // OK X<B> b; // OK X<C> c; // ERROR }
73 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:51:32 ] >>71 じゃあJavaに変えると良いよ。 スレ違い。
74 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:56:28 ] Boost.ConceptCheckのConceptAssertとTypeTraitsのisBaseOfでできるな
75 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 14:56:40 ] // boostだとこうなる。参考書丸パクリだが #include <iostream> #include <typeinfo> #include <boost/type_traits.hpp> #include <boost/utility/enable_if.hpp> template< typename sub_class, typename super_class, class = void > class X{ public: X() { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型ではありません。") << std::endl;} }; template< typename sub_class, typename super_class > class X< sub_class, super_class, typename boost::enable_if< boost::is_base_of< super_class, sub_class > >::type >{ public: X() { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型です。") << std::endl;} }; struct A{}; struct B : A{}; struct C{}; int _tmain(int argc, _TCHAR* argv[]) { X< B, A > x0; // strect Bは、strect Aの派生型です。 X< C, A > x1; // strect Cは、strect Aの派生型ではありません。 return 0; }
76 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:17:15 ] >>71 C++のtemplateは黒魔術だから、大抵何でもできる。 というか、お前釣りだろ?w alfalfa.livedoor.biz/archives/51489493.html 最近、知ったか房みてるとどうしても↑に思える
77 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 15:43:04 ] >>76 まさに真理だなw 黒魔術というか、テンプレートメタプログラミングはチューリング完全だから 効率を気にしなければ他のプログラミング言語で実現出来ることは何でも出来る。
78 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:04:03 ] >>77 むしろ実行効率は良いという、恐ろしいことが証明されているんだよね。 ただし開発効率は発狂物だろうがww
79 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:11:28 ] という事は超頑張ればコンパイル時にMP3を鳴らす事も!・・・
80 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:12:55 ] >>79 本当にやってるヤツが世界にはいるのではないだろうかw
81 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 16:15:58 ] C++ code - 169 lines - codepad ttp://codepad.org/0JbIj2qe ここにあるコードを Windows XP HomeEd SP2 g++ (GCC) 3.4.5 (mingw special) でコンパイルして実行したところ、 「実行時エラー」 になりました。 本来は上記のサイトにあるようにコンパイル時エラーになって欲しい物ですが、 どうして実行時エラーになってしまうのでしょうか? ちなみに意図的にコメントアウトしてある // friend bool operator == (const MyInt& lhs, const MyInt& rhs){return lhs.num==rhs.num;} の部分をコメント解除すると問題無く動作するようになります。
82 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:07:19 ] 初心の者ですが、派生クラスのコンストラクタで悩んでいます。 派生クラスのコンストラクタをクラスを定義するスコープの外で定義することは可能でしょうか。 class Base { private: int x; public: Base(int x); }; Base::Base(int x) { this->x = x; } class Derived : public Base { private: int y; public: Derived(int x, int y) : Base(x); }; Derived::Derived(int x, int y) : Base(x) { this->y = y; } ではコンパイラから叱られてしまいます。どのように書けばいいのでしょうか。
83 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:20:49 ] public: Derived(int x, int y);
84 名前:69 mailto:sage [2009/07/25(土) 20:14:00 ] >>70 ありがとうございます。
85 名前:81 mailto:sage [2009/07/25(土) 20:16:29 ] 自決しました。 どうやらコンパイラ(g++ (GCC) 3.4.5 (mingw special))の仕様のようです。 バグって言い切っていいのかは分かりませんが。 自決方法 Windows XP HomeEd SP2 g++ (TDM-1 mingw32) 4.4.0 この環境でなら問題無く動作するようになります。
86 名前:71 mailto:sage [2009/07/25(土) 20:30:16 ] >>73 すみません >>74-76 ありがとうございます。そしてごめんなさい。 使用コンパイラがbcc5.5なのですが、is_base_ofの中核部分だけを取り出して コンパイルした結果、bccではうまく判別できず、VC2008ではうまく判別できました。 どうやらbccでは定数の初期化式に関数の呼出し等があると、コンパイルは通っても 値は0?とかになってしまうようです。だめですね…
87 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 20:39:40 ] >>85 死ぬな死ぬなw
88 名前:82 mailto:sage [2009/07/25(土) 21:42:32 ] >>83 ありがとうございました。
89 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 22:58:33 ] std::maxのような関数テンプレートは どの標準ヘッダに定義されていますか??
90 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:09:41 ] algorithm
91 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:11:15 ] >>85 いろいろ問題がありそうなコードだけど コンパイルエラーになることが、 "問題無く動作する"ってことなの?
92 名前:85 mailto:sage [2009/07/25(土) 23:36:04 ] >>91 > コンパイルエラーになることが、 > "問題無く動作する"ってことなの? はい、g++としてはコンパイル時エラーで教えてくれる方が 正しい挙動だと思いまして。 > いろいろ問題がありそうなコードだけど 例えばどこが問題でしょうか?
93 名前:89 mailto:sage [2009/07/25(土) 23:37:04 ] >>90 ありがとうございます!!
94 名前:85 mailto:sage [2009/07/25(土) 23:41:38 ] >>91 > いろいろ問題がありそうなコードだけど #define OPERATOR_MY〜〜 などのマクロが登場していることや public : int_t num; の様にメンバが丸裸のpublicアクセス指定されている事 以上2点はサンプルコードだからです。 さすがにこんなクソコードは実務では書きません。 なんか後出しじゃんけんみたいになってしまって恐縮です。 申し訳ありません。
95 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:18:43 ] 自決でビール吹いたw
96 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:52:39 ] >>87 を見るまで気づかなかったw
97 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 03:51:31 ] 自決やべー後からくるわ。
98 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 10:11:31 ] 自決しました より 自決方法 にじわじわくる XPとg++でどう死ぬんだと
99 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 14:57:26 ] 未定義動作とか使うんだろうかw
100 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:15:11 ] 鼻から出てきた百足に目を食い破られて死ぬんじゃないかなぁ
101 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:27:56 ] それ自決じゃない 自決といえばdelete thisだろ
102 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:27:12 ] >>101 うちの会社でよく見るコードだわ なんとか動いてるけど恐ろしい・・・
103 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:28:30 ] delete thisは使い方さえ間違わなければ合法だよ
104 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:47:24 ] >>103 そうなんだけど、よくわからんやつが適当にいじると そのあとメンバ触ってあぼんぬとかよくあるからさ おまけにそのデバッグやらされるの俺だし
105 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 19:22:22 ] 今ならコンストラクタをprivateにして、shared_ptr返すファクトリ関数作る delete thisは過去の遺物だな
106 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 21:55:34 ] delete thisって何だ? 初めて知ったんだが。 ファクトリメソッドやshared_ptrなどは知っています。 delete thisは俺が新参者だから知らないだけか?
107 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:13:43 ] delete p; とかと一緒 thisを削除
108 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:20:01 ] delete thisは、COMみたいに自分で寿命を管理するときに使う。 まぁ、前時代的な実装だね。
109 名前:106 mailto:sage [2009/07/27(月) 22:53:58 ] ふーん。 そうなんだ。 思い返してみたけどやっぱ見たこと無ねぇな。 まあ理解しなくても良いよね。 どーも。
110 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:00:07 ] boost::intrusive_ptrの使用例を検索してみると、 delete thisを見られるよ。
111 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:39:11 ] Stateパターンで遷移後状態を返す直前に自状態を始末する際に delete thisすることが多かったかな。最近はsmart pointerを 使うことが多くなったが。
112 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:53:21 ] delete this じゃないが デストラクタを明示的に呼ぶコードってのはたまーに使うな。 まあ大半の人が、STLコンテナの内部で使われているのを利用しているが。
113 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:56:11 ] >>112 そうそう、デストラクタって明示的に呼べるんだよね。 いつ使うのか全然しらない。
114 名前:112 mailto:sage [2009/07/28(火) 12:00:42 ] つながりの無い事柄みたいになっちゃったが、 要は void T::reconstruct() { this->~T(); new (this) T(); } から連想したんだ。許してくれ。
115 名前:デフォルトの名無しさん [2009/07/28(火) 13:30:04 ] C2227のエラーが出て解決できないのですが、どういうことが理由なのでしょうか
116 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 13:43:42 ] >>115 たぶんVCなのだと思うが、だとすれば、間接参照不可能なポインタ変数を 間接参照しようとしているから。 これ以上はソースを見ないと言い様が無い。
117 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:28:43 ] 間接参照不可能なポインタ変数を間接参照することは問題ないだろ。 問題なのは、間接参照不可能なポインタ変数を使って間接参照することだ。
118 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:33:09 ] 日本語でおk
119 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 15:04:59 ] >>118 じゅうぶんわかる。 間接参照不可能なポインタ変数を間接参照することは問題ないね。
120 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:32:18 ] いやまて 間接ポインタ変数を間接参照不可能な参照で間接参照にすることは問題なんじゃないか?
121 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:52:12 ] 間接参照不可能なポインタ変数ってvoidポインタのことでしょ? ->演算子でアクセスできないことも間接参照不可能っていうの?
122 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:25:55 ] >>121 じゃあやっぱり>>117 でいいよね
123 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:39:08 ] MyClassクラスのテンポラリオブジェクトを返す関数の戻り値は const MyClass& temp で受け取って束縛しても大丈夫ですよね? そのスコープから外れるまでは有効ですよね?
124 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:44:51 ] テンポラリオブジェクトを返す関数のスコープを抜けるまで有効です。
125 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:55:30 ] 関数の戻り値をconst指定しておけば、参照変数が生きてる間束縛される
126 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:57:08 ] >>125 > 関数の戻り値をconst指定しておけば おかなくてもだろ?
127 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:16:15 ] え、まじで?無知ごめん
128 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:17:44 ] っていうか、そうだよね。constは関係ないね。 ちょっと考えれば分かる話でしたorz
129 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:21:30 ] >>113 placement new したオブジェクトを消すとき
130 名前:123 mailto:sage [2009/07/28(火) 19:53:50 ] みなさんありがとうございます。
131 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:57:50 ] >>129 placement deleteじゃだめなの?
132 名前:デフォルトの名無しさん [2009/07/28(火) 20:02:53 ] λ式ってブースト使わないと利用不可?
133 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:03:33 ] placement deleteはデストラクタを呼ばないから、自分でデストラクトする必要がある。
134 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:12:21 ] >>132 Visual C++ 2010 msdn.microsoft.com/ja-jp/library/dd293608 (VS.100).aspx
135 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:14:55 ] >>132 Intel C++ 11 www.xlsoft.com/jp/products/intel/compilers/
136 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:31:30 ] ラムダ式なんてオタのオナニー道具です 使っちゃいけません
137 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:45:26 ] >>134-136 俺の明日はどっちだ…
138 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:57:23 ] >>132 ラムダはちょっとしたところで使うなら便利。 あまり多用すると自分が困るかもしれないがね。 結局は使いようなんだが。
139 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:58:46 ] >>133 そうなのか。 ありがとう。
140 名前:132 mailto:sage [2009/07/28(火) 21:02:17 ] あり^^
141 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:33:50 ] データを出力するときにn行おきに空行を入れたいのですがどうすればいいですか?
142 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:39:22 ] 繰り返しつかえばあ
143 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:58:48 ] >>141 帰れ。 バカ過ぎる。
144 名前:デフォルトの名無しさん [2009/07/28(火) 22:23:37 ] for(int i = 0; i < num; i++) { cout << line[i] << endl; if(i % n == n-1) cout << endl; }
145 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:34:37 ] >>144 やってみます
146 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:41:16 ] なんかもっと初心者向けのスレに行けば? たぶん宿題だろうし
147 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:58:31 ] あっそ
148 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:22:02 ] そういう態度は失礼だってママに言われなかった?
149 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:32:48 ] ママは彼が物心つく前に鬼籍に入りまして。。。
150 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:43:08 ] 今日からパパがママよ!
151 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:50:33 ] >>150 ぎゃ^
152 名前:デフォルトの名無しさん [2009/07/29(水) 08:51:51 ] struct Point { int x; int y; Point(int x, int y) : x(x), y(y) {} }; struct Size { int width; int height; }; Size Hoge() { Point point; ... return *reinterpret_cast<Size *>(&point); …(1) return *reinterpret_cast<Size *>(Point(0, 0)); …(2) } 例が良くないかも知れないのですが、 この書き方ってC++におけるインスタンスの 生存期間的に問題はあるでしょうか?
153 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:10:29 ] >>152 (1)はダメ Hoge()を抜けた途端にpointのインスタンスが消滅してしまう
154 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:12:08 ] あほくさ
155 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:29:33 ] >>152 (1) はコピー返しなので問題ない (2) は生存期間以前にポインタでないものをポインタにキャストしてるから滅茶苦茶なことが起きるだろう
156 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:00:03 ] >>126 いやいや、一時オブジェクトを束縛して寿命を延ばす効果があるのはconst参照だけだろ。
157 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:44:20 ] 戻り値がconstである必要は無いというお話