1 名前:デフォルトの名無しさん mailto:sage [2012/05/08(火) 04:55:24.99 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part94 toro.2ch.net/test/read.cgi/tech/1329512856/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.78【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1331894668/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
157 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:49:56.32 ] PODという用語を理解してるなら 仮想関数使うとサイズが増えるのくらい知ってそうな気もするけど そうでない事もあるから困る
158 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:53:23.93 ] >>155 typedef やら static なメンバ関数やら、仮想関数以外にも継承したくなるものはあるだろ。
159 名前:155 mailto:sage [2012/05/13(日) 22:04:04.04 ] いやすまん、揉める前>155の「2クラス多重継承で12バイト増える」を訂正 >137のサンプルにおいて、 struct D : public A, public B { char a; virtual void f() { } }; としたとき、DとAは仮想関数テーブルへのポインタが共通 (単一継承と同様の関係で、DからAへのアップキャストは暗黙に行うこともできる) だから、仮想関数テーブルへのポインタによる増分は12でなくて8バイト。 残り4バイトは、charより大きいデータ(ポインタ)を含むから、整列の都合上3バイト埋められ、 それでトータル12バイトになる。
160 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 22:26:12.53 ] でっていう
161 名前:133 mailto:sage [2012/05/13(日) 23:16:40.69 ] >>155 133で出したクラスは、 9個のクラスを多重継承しており、 うち1つは、2つのクラスを多重継承しています。 完全にノーコストだと思ってたんでやられました。 継承はやめて全部コピペすりゃいいんでしょうけど・・
162 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:33:09.77 ] 組み込みでもやってんじゃないなら気にすんなよ んなもん今日大したコストじゃねぇぞ そんな事気にしてたらいつまで経ってもモノができん
163 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:51:21.35 ] どんだけ多重継承してんだ 継承なんて実際大して使わないと思うんだが 全クラスの2割くらいじゃね
164 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 23:54:03.40 ] 継承多用も頭悪いヤツが嵌るワナの一種だから仕方が無いのだよ
165 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 00:04:51.01 ] 継承なんてインターフェースの実装用としてしか使わんな 多重継承は使いまくる 実装継承使うときは、デフォルト実装が欲しいときぐらいだな 完全抽象化クラスを継承することがほとんど つか>>133 は何をどういう風に再利用する気なんだろう 再利用するとなると、<algorithm>がいろんなクラスに適用出きるように 普通クラス側でなくクラスを使う側なんだが
166 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 01:14:59.86 ] >>165 ベクトルです。float32 x 4で16byteな訳です。 多重継承している9種は、 ベクトルとの2項演算子 ベクトルとの単項演算子 ベクトルとの代入演算子 スカラとの2項演算子 スカラとの単項演算子 スカラとの代入演算子 などなど演算子が主です。 再利用化は、他に行列クラスにも使うためです。 合わせて6種類のクラスで使っています。 設計は満足のいくものだったんですが、 16Byteであるべきものが28Byteもあるようでは はっきり言って使い物になりません。
167 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 04:27:49.77 ] >>166 こんなのはどう? #include <iostream> template<typename Vec, typename Any> struct A : public Any { void a(){}; }; template<typename Vec, typename Any> struct B : public Any { void b(){}; }; template<typename Vec, typename Any> struct C : public Any { void c(){}; }; template<typename> struct Empty {}; struct MyVec : A<MyVec, B<MyVec, C<MyVec, Empty<MyVec> > > > { float x,y,z,w; }; int main() { std::cout << sizeof(MyVec) << std::endl; }
168 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 07:37:20.88 ] 継承じゃなくてマクロかincludeで対応するとか
169 名前:デフォルトの名無しさん mailto:sage [2012/05/16(水) 20:03:33.91 ] public int FindIndex(Predicate<T> match) { } List<T>と同じ挙動のFindIndexを作りたいんですが、 どう実装されてるのかわかりません Predicate<T>からメソッドを取り出して、 フィールド変数T[] dataと一致を比較するにはどうしたらいいんでしょうか
170 名前:デフォルトの名無しさん mailto:sage [2012/05/16(水) 20:10:22.47 ] 誤爆してた、すみません C#スレで聞いてきます
171 名前:デフォルトの名無しさん mailto:sage [2012/05/17(木) 04:06:37.89 ] c丼もスコープ付きusingやtypedef使えれば 便利なんだがなぁ
172 名前:デフォルトの名無しさん [2012/05/17(木) 19:49:25.05 ] 相談室ってこんなに過疎ってたっけ? ・・・というのはさておき、 struct A { const std::string get(const std::string& value) const { return value; } const bool get(bool value) const { return value; } }; これで error: conversion from 'bool' to non-scalar type 'std::string {aka std::basic_string<char>}' requested って怒られるのなんで? string関係はいつもストレスやわ・・・
173 名前:デフォルトの名無しさん mailto:sage [2012/05/17(木) 20:51:19.48 ] >>172 ideone.com/hoiKy 再現するコードかかないとわからんよ 引数の型間違ってるだけじゃないの?
174 名前:デフォルトの名無しさん mailto:sage [2012/05/17(木) 21:11:17.03 ] どうせa.get("abc")にしてんだろ んでconst char*からの変換ではconst std::string&よりboolのほうが優先されて 返り値がboolなのにstd::stringで受けようとしてるからエラー
175 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 01:35:02.13 ] うわっ、申し訳ない。その通り。 a.get("abc")てしたせいです。 この問題って、もしかして std::ofstream::ofstream(std::string) が存在しなくて、char*にしてある理由と同じ? なんでいちいちc_strにしないといけないのかいつも不思議だったんだけど。 ・・・しかもC++0xで修正されているというのも更に分からん。
176 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 19:33:19.95 ] それとは関係ないだろ
177 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 11:32:06.88 ] >>166 ベクトル・行列演算クラスを自前で作っても、設計や速度の点で不満が出るかもしれない。 テンプレート使った高速化の設計ならBoostを見てみるといいかもしれない。 参考→ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.html もしくは、浮動小数点やスカラーではなくベクトルや行列の演算は CPUではなくGPUで処理したほうが圧倒的に早いいいので、 Windows環境限定でそこそこのグラフィックカード使えるなら DirectX.MathやCUDAを使ったら早くなると思う。(LinuxでGPU使う方法は調べたこと無い) こいつらより早い行列計算ルーチンを書くのは至難だよ。 CPUの性質やコンパイラの最適化とか熟知してる連中が作ったライブラリだから。
178 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 19:36:09.33 ] >>155 関係ないけど、未だに32bit環境がデフォと思っているやつは何なんだろうか?
179 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 19:43:35.13 ] >>177 CUDAが必要なレベルだとかなり大規模になる必要があるし、CUDAの持って行くのには別の苦労もあるから、MKLとかの方がいいぞ。 Sandy-Eがでてからは余程いいVGAはないと大きな差が出ないか、逆に遅くなるからな。
180 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 20:19:12.21 ] >>177 BoostはFortranのuBlasを再現したものだから Blits++の方がいい。速度もこっちの方が速いしね。
181 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 20:51:21.10 ] Blitz++か あの変態演算子オーバーロードか カンマ演算子をオーバーロードしたライブラリは初めて見たよ
182 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:13:24.42 ] よく知らないけどEigenがいいと聞いた
183 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:31:33.61 ] >>181 >カンマ演算子をオーバーロード そんなこともできるのか点点点
184 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:40:31.23 ] >>183 行列の要素を読み込むのに使ってる ドキュメント読んでみ
185 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 21:49:13.44 ] A = 0.5, 0.3, 0.8, 0.2, 0.1, 0.3, 0.2, 0.9, 0.0, 1.0, 0.7, 0.4, 0.2, 0.3, 0.8, 0.4; こんな書き方をするにはカンマ演算子のオーバーロードしかないだろ
186 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 22:41:45.37 ] 自動的に4×4?
187 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 22:56:32.85 ] いや Array<FixedPoint, 2> A(4,4); って宣言してる
188 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 23:00:15.42 ] 書き方はすっきりするけど 速度的にどうなんだろうか
189 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 23:07:43.73 ] 初期化のつもりだろうからそんなに速度必要ないんじゃね 問題は肝心のテンソルの演算速度
190 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 17:53:27.61 ] C++ 2010で画面上部のプルダウンメニューからDebugをReleaseへ変更しようとしているのですが、プルダウンメニューが反転していて選択できません。 どうすればよろしいでしょうか?
191 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 18:00:27.85 ] >>189 Blitz++だと式テンプレート使いまくっててFORTRANと同程度の速度がでるらしい。 ただ、速度求めるなら最初からGPGPU使った方がいい気がするが。
192 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 18:51:40.18 ] CUDAみたいな類のは4桁×4桁をガンガン回すぐらいじゃないと牛刀 16×16ぐらいなら転送のコストで帳消しになるだろう
193 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 19:05:49.99 ] OpenCVとか必要ないレベルなら速度にこだわる必要もなくね?
194 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 19:49:45.50 ] >>191 FORTRANて別に速いわけじゃないのに、なんで使われているんだろ? やっぱ過去の資産かな? 配列の並びが逆なのが気持ち悪い。
195 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:03:52.87 ] >>94 つ[ポインタのエイリアス問題] C/C++はこれがあるために配列で最適化が十分に出来ない VCなら__restrictとかC99でrestrictという予約語を使うとFORTRANと同等に出来る
196 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:04:11.77 ] ありゃ ×>>94 ○>>194
197 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:15:57.73 ] しかしこの過去スレひどいな logsoku.com/thread/pc11.2ch.net/tech/1177215582/ ちゃんとここに書いてあるのに seclan.dll.jp/c99d/c99d07.htm 7.6 restrict ポインタ
198 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:37:06.35 ] >>194 実際速いから。あとC++じゃベクトル命令(SSEの類ではない) まともに自動で使えないから。
199 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:45:37.65 ] pascal の配列演算がなぜFORTRAN と並ぶに達せなかったのかに疑問が沸く
200 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 20:57:54.26 ] >>195 C++には無いよ。C++11なら無視されるらしい。
201 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 21:34:30.81 ] 金が足りなかったんだろう
202 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 21:48:23.26 ] >>198 vector<double> x,y,z; z=x*y; 的なこと?たしかにRとかで使うけどなれると便利だよな。 Pascalにもあるの?
203 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:14:52.36 ] >>201 コンパイラでそういうの早くしようとしたら、どういう頑張りが必要なの? まったく想像がつかないんだけど命令手書きとか?
204 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:19:12.45 ] >>202 www.ss.isc.tohoku.ac.jp/refer/pdf_data/v36-1p17-54.pdf www.ss.isc.tohoku.ac.jp/refer/pdf_data/v35-3p21-39.pdf この辺の話にでてくるベクトル命令
205 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:25:08.49 ] >>202 B(1:99) = A(2:100) こんなんとか。 Fortranならある範囲から、ある範囲に対して 演算を行える専用構文が存在するがCやC++には 存在しない。独自の拡張か、環境依存の関数を 使う必要が有る。
206 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:30:31.09 ] ベクトル回路に乗せやすいように配列データを並べて 固定回数の繰返し構文を見つけて専用命令を充てる。
207 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:55:46.78 ] C++もstd::valarrayを擬似クラス化して最適化できる ようにすりゃいいんだけどな。演算子のオーバーロードとか 通常時は、演算毎にループして、最適化がかかった場合は Expression Templateみたいに一つのループで一つの要素に対する 演算をすべて実行したりとかさ。
208 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 22:58:09.26 ] >>203 基礎研究レベルからの積み重ね以外にないだろう 商用のCやFortranのコンパイラがやってる融合変換や自動ベクトル化とか命令の合成とかは全部その上に成り立つもの 別に言語の仕様が高速化に向いてるからだとかいうものじゃない
209 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:06:09.20 ] >>208 配列演算ができるのと出来無いのじゃ差が大きいよ GpGPU分野でもFortranがそのまま移植され始めたし
210 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:24:38.00 ] >>198 ここで言うベクトル命令ってSSEの類じゃないってどういうこと? インテル系以外のプロセッサということなのか?
211 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:26:50.52 ] このスレに貼られたリンク先をよく見てみましょう
212 名前:デフォルトの名無しさん mailto:sage [2012/05/20(日) 23:35:25.20 ] >>210 ここではベクトルプロセッサーのベクトル命令の事。 ベクトルプロセッサーの命令は、ループで回しながら xmm0みたいな固定長のレジスタを使って演算する わけじゃなく、演算命令に範囲と要素のサイズを 指定するだけ。構造がだいぶ違う。
213 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 00:35:17.00 ] >>212 なるほどよくわかった。ベクトル機向けだからか。 今だとCUDAに近い感じかな。
214 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 00:59:09.35 ] >>200 VCにはrestrictはないが__restrictという予約語でこっそりMS独自拡張されてる ヘルプ見てみ >>209 D&Eでも禿が「C++は演算分野でFORTRANと張りあうつもりはない」ってはっきり言ってるもんな でも実際使われてる事も確かだし速度が少し遅くても答えさえでりゃいいって奴がおおいんじゃ どうしてもいやならFORTRANをリンクして行と列を入れ替えれば済む話だし ベクトルって並列演算の事だと思うけどスーパーコンピュータはほとんどベクトル機だから(Power PCを 並列につないで使ったりしてるもんな)C/C++で同じ事をやろうとすればOpenMPか>>213 のように GPUを使ったCUDAしかない しかしGPGPUは単精度という致命的な欠点があって倍精度専用のGPUも発売されているが これは気軽に買えるようなものではない
215 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:13:25.79 ] MS独自に拡張されてようとC++11には無い
216 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:16:42.78 ] ここC++11のスレじゃないんだけど ちなみにC++03にもないです 俺が言ってるのはPCでrestrict使いたければVCかIntel C++(C99対応)を 買うしかないという事 スパコンも案外独自拡張されてそうだけどな あれだけ演算速度を重視されるんだから
217 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:22:04.90 ] あ、やっぱり ベクトル型スーパーコンピュータのC/C++はrestrictを独自拡張してる物が多いようですね これがないとベクトルCPUやSIMDが使えないもんなあ それか素直にC99を使うか
218 名前:デフォルトの名無しさん [2012/05/21(月) 01:28:46.99 ] std::stringを継承させた exstringというクラスを作ったのだけど std::stringのいろんなコンストラクタをそのまま継承クラスでも使う方法ってないの?
219 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:31:36.96 ] stringクラスに仮想デストラクタはあるのか?まずそれが一番大事 無いとdeleteの時にメモリリークするぞ 次にコンストラクタは継承されないから自分で書き直すしかない コピペしてそのまま呼び出せばいいのは初期化リストに入れれば良い
220 名前:デフォルトの名無しさん [2012/05/21(月) 01:33:12.86 ] ポータブルなisnanの実装って可能? doubleのビットを全部見たらnanについて何が分かる?
221 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:34:33.68 ] >>219 std::stringにアップキャストしたポインタをdeleteしなきゃリークしねーだろ
222 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:35:11.83 ] ちなみにexstringをポインタ経由でなくてインスタンスとしてしか使わないのなら問題ないけどな それからexstring自身のポインタ経由で使うか std::stringは「失敗した標準ライブラリ」だと良く言われる 理由は多量のコンストラクタに、整理されてない多量のメンバ関数 STLの前に作られたから仕方ないんだが string用に最適化されている事を期待して諦めているが
223 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:50:02.37 ] >>219 おまいバカだろ
224 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 01:56:35.44 ] >>223 馬鹿というなら具体的な対応策をお前が>>218 に呈示してやれよ
225 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 02:52:59.24 ] 全然話は違うけどSTLPortのstd::ropeはどうなったん? boostもC++11も見捨ててるみたいだけど、自然消滅?
226 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 04:21:31.83 ] >>220 IEE754でいいなら、ビットパターンでNaNを表現している。
227 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 04:27:55.75 ] std::stringじゃなくて <boost/container/string.hpp> 使うのは?
228 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 04:43:06.94 ] >>227 本当だな それだとslistも入ってるし不要なstringのメンバ関数がバッサリ切り捨てられてる 全部STLでやれって事だよな
229 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 06:11:32.83 ] >>216 正式に規格になったから、一応C++11もこのスレに含まれるっぽいぞ。 数カ月前向こうでそういう議論があった。 今C++11スレは、次世代規格やC++11の対応状況とかそんなスレになってる。 つか過疎ってる。
230 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 08:41:00.31 ] >>217 自分で書けばいいじゃん。 俺はクリティカルになるところは自分でかく。 それ以外は、コンパイラ任せ。
231 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 09:11:46.86 ] ropeは現在では遅延評価がある言語でエディタ実装する用途以外に使い道無い
232 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 12:36:03.13 ] ベクトル演算なんて自前でループなんかしないでippあたりのライブラリ使うから どうでも良い
233 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 19:17:30.82 ] メモリの断片化を防ぐために、OSが不定期にデータを移動させることがあるそうですが、 現在、これによる影響を考慮するようなプログラムはないと考えてよいでしょうか? 昔(WindowsNTより前?):物理メモリアドレス=プログラムが参照するアドレス →移動可能メモリを読み書きするにはロックが必要 今:物理メモリアドレスはOS管理の論理アドレステーブルで対応付けされ、プログラムからは常に固定のアドレス
234 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 19:31:11.61 ] どういうときに考慮する必要があるの? 断片化解消を阻止するプログラムでも作るつもりか?
235 名前:233 mailto:sage [2012/05/21(月) 19:36:58.90 ] >>234 DirectXにロックするAPIがあるんです。 現在はロックって必要ないはずですよね??
236 名前:デフォルトの名無しさん mailto:sage [2012/05/21(月) 20:20:42.21 ] >>235 DMAとかでCPU以外からのアクセスがあるため、OSが勝手に移動すると困る
237 名前:233 mailto:sage [2012/05/21(月) 20:42:28.92 ] >>236 なるほど。 GPUから見た場合は論理テーブルみたいな仕組みがないので、 明示的に物理アドレスを固定しないといけないということなんですね。 ありがとうございました!!
238 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 15:19:56.67 ] uプリフェックスってコンパイラで指定したソースコードの文字コードを UTF-16に変換してconst char16_t*型の変数に代入するって意味ですよね? 例えばソースコードがエスジスならばエスジスをUTF-16にへんかんするってことですよね?
239 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 20:57:41.81 ] だいたいあってるけど正確には違う
240 名前:デフォルトの名無しさん [2012/05/22(火) 22:39:22.14 ] struct X { char x; X( const X& o ) : x(1) {} X() : x(0) {} }; int _tmain(int argc, _TCHAR* argv[]) { X x; x = X(); return 0; } これ、コピーコンストラクタが呼ばれずにx.x != 1になってしまうんですが なぜだかわかりますか? Visual C++ 2010です。
241 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 22:52:07.80 ] operator=が呼ばれてるからじゃないんけ
242 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 22:54:31.43 ] 初期化と代入の区別はちゃんとつけよう!
243 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 23:14:03.53 ] コピーじゃなくて代入だから呼ばれないよね(´・ω・`)
244 名前:デフォルトの名無しさん mailto:sage [2012/05/22(火) 23:25:39.40 ] >>240 operator=を書いてみ
245 名前: ◆QZaw55cn4c mailto:sage [2012/05/23(水) 03:17:06.92 ] >>240 codepad.org/YYHOycgY
246 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 07:22:31.20 ] 同じ事を何度も言わなくてよろしい
247 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 23:34:18.12 ] template部分特殊化で int float doubleは同じ処理で string charは違う その他のいろんなクラスは汎用処理 ということをしたいとする int float doubleの同じ処理を3回書かないでプリプロセッサあたりで一回で書いてしまう方法ないでしょうか
248 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 23:41:58.93 ] template<class Signature> struct my_class{ ... }; // etc type template<class T> struct base_int_float_double{ ... }; // int or float or double template<> struct my_class<int> : public base_int_float_double<int>{}; template<> struct my_class<float> : public base_int_float_double<float>{}; template<> struct my_class<double> : public base_int_float_double<double>{}; これじゃいかんのか?
249 名前:デフォルトの名無しさん mailto:sage [2012/05/23(水) 23:47:57.51 ] >>248 ありがとう それでいけます
250 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 03:41:09.75 ] 中身はintだけど型がintと違うものを作りたくて struct exint ; public int {}; してみたらintはclassじゃないと怒られた。こんなものは作れないってことでいいの?
251 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 04:04:31.20 ] >>250 D言語でおk
252 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 04:49:36.72 ] オブジェクト指向もどきだから 何でもかんでもオブジェクトじゃないよ
253 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 13:53:23.19 ] newしたクラスのコンストラクタで、自分のメンバ変数にさらにnewしてクラスのオブジェクトを持たしている時 一番上位のオブジェクトをdeleteしたらメンバ変数のnewしたオブジェクトも消えるでしょうか? つまり↓ newオブジェクト@->newオブジェクトA->xxxx ; と続いている時、newオブジェクト@をdeleteする この場合はnewオブジェクトAを削除したければ、そいつのデストラクタを呼ばないと駄目?
254 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 13:58:59.65 ] >>253 newしたオブジェクトはスコープアウトしても消えることがないので、ライターの責任でdeleteする必要がある。 だから消えない。
255 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 14:00:56.11 ] >>253 それはデストラクタに書くべき事でしょ newオブジェクトにもデストラクタを書いておけば全部呼んでくれる 継承してないし簡単
256 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 14:12:45.06 ] 例えばこれはメモリリークしない class Base { public: Base* bp; Base() : bp(new Base) { bp->bp = 0; } Base* pointer() { return bp; } ~Base() { delete bp; } }; int main() { Base b; Base* bp = b.pointer(); bp->bp = new Base; bp->bp->bp = new Base; bp->bp->bp->bp = new Base; }
257 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 14:20:05.69 ] bpがpublicというのは格好悪いのでprivateにした やはりメモリリークはない class Base { Base* bp; public: Base() : bp(new Base) { bp->bp = 0; } Base* pointer() { return bp->bp; } ~Base() { delete bp; } }; int main() { Base b; Base* bp = b.pointer(); bp = new Base; bp = bp->pointer(); bp = new Base; bp = bp->pointer(); bp = new Base; }