C++相談室 part85
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/10/09(土) 20:22:35ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0002デフォルトの名無しさん
2010/10/09(土) 20:25:26[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2010/10/09(土) 20:26:16[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004デフォルトの名無しさん
2010/10/09(土) 20:27:41amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005デフォルトの名無しさん
2010/10/09(土) 20:29:03Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
■長いソースを貼るときはここへ。■
http://codepad.org/
0006デフォルトの名無しさん
2010/10/09(土) 20:42:28http://codepad.org/
最近 codepad.org は調子がいまいちなので
Ideone.com | Online IDE & Debugging Tool
http://ideone.com/
こっちもつかってね!
0007デフォルトの名無しさん
2010/10/09(土) 20:52:14環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0008デフォルトの名無しさん
2010/10/09(土) 21:03:55あんまり関係ないかもしれないけど、
http://d.hatena.ne.jp/yaneurao/20100929#c1286573427
> http://codepad.org/PYXHLYnN
> ヒープから確保したサイズと、それを保持するオブジェクトのサイズの合計を
> 比べて、 std::vector のほうが 24 バイト多く必要。
> http://ideone.com/BCBAg
> 同じコードですがこちらの環境では差は 4 バイトにまで縮まっています。
↑で operator new のログを取るコードが挙がってるんだけど、
codepad のほうの結果に main() より前に operator new/delete が
使われてて、さらに delete が出てない奴まである。
うちのマシンでやると ideone のほうと同じように、普通に想定される
operator new/delete のぶんしか出ない。
codepad のほうのメモリ確保、何だかわかる?
0009デフォルトの名無しさん
2010/10/09(土) 21:12:14関連書籍検索が何で洋書なんだ???
和書の貼れよ
ttp://www.amazon.co.jp/b/?node=754384
0010デフォルトの名無しさん
2010/10/09(土) 22:12:09C++とC言語は別の言語なので、
CのみのコードならC言語スレに行った方が良いと思います。
理由:
1. C言語用のスレがせっかくあるのだから。
2. C言語はほぼC++に取り込まれているが、だからといってC++スレで
聞いたからにはC++にしか通用しない文法や標準ライブラリやクラスで
で返されても仕方ないことだから。
0011デフォルトの名無しさん
2010/10/10(日) 15:45:12\ \ \ \ └┐ │ └────── │
\ \ \ \ │ │ / /
\ \ \ \ │ │ / /
\ \ \ \ │ │ / /
/ / / / │ │ / /
/ / / / │ │ _ / /
/ / / / │ │ ( /____/\
/ / / / │ │ \ )
 ̄ ̄  ̄ ̄ └─┘  ̄ ̄ ̄ ̄ ̄ ̄ ̄
0012デフォルトの名無しさん
2010/10/10(日) 21:02:390013デフォルトの名無しさん
2010/10/10(日) 21:22:530014デフォルトの名無しさん
2010/10/10(日) 21:34:460015デフォルトの名無しさん
2010/10/10(日) 21:52:450016デフォルトの名無しさん
2010/10/10(日) 22:05:43配列なら、配列引数の関数テンプレートに渡せるだろjk
なんでキャスト演算子とか出てくるのかわけわからん。
0017デフォルトの名無しさん
2010/10/10(日) 22:20:12もしそうなら
int[10]とint*であれば*(int (*)[10])&pみたいになるな
0018デフォルトの名無しさん
2010/10/10(日) 22:24:190019デフォルトの名無しさん
2010/10/10(日) 22:25:050020デフォルトの名無しさん
2010/10/10(日) 22:26:19C++は工場
0021デフォルトの名無しさん
2010/10/10(日) 22:27:00それはつまり目的のテンプレート関数の機能をもうクラスに入れちゃうってことですか
ただ想定としてはいろんなテンプレート文字配列関数にそのまま渡せるような
キャストがあれば知りたいなと思いまして、上ような関数なんかも目からウロコでしたし
>>16
すんません、配列をメンバに持つクラスをキャストして上のような関数に渡せないかということです
>>17
いえ、申し訳ないですが静的な配列です
0022デフォルトの名無しさん
2010/10/10(日) 22:44:170023デフォルトの名無しさん
2010/10/10(日) 23:49:15>22 の言う方法でお題は達成できるんだろうけど、キャストを持ち出すべき
ところかなあ?そのキャストが入ったコード読んでも意味わからない状態に
ならない?
ちゃんと名前をつけて配列の参照を返す関数を作ったほうがいいんじゃないか?
0024デフォルトの名無しさん
2010/10/10(日) 23:59:16それがキャストである必要は無いですね
0025デフォルトの名無しさん
2010/10/11(月) 01:22:22なんでそうなのか分かるから歯がゆいいいい
0026デフォルトの名無しさん
2010/10/11(月) 01:55:270027デフォルトの名無しさん
2010/10/11(月) 02:05:21地震に注意しろよオマイラage
0028デフォルトの名無しさん
2010/10/11(月) 02:16:40おお!すごい!
>typedef char (&S)[N]
これで配列参照の戻り値にできたんですね(なんだか関数ポインタに似てる)
実は今までキャスト以外でも配列の参照を返せませんでした…
0029デフォルトの名無しさん
2010/10/11(月) 03:27:44template<class T>
std::valarray<T> doSomething(const std::valarray<T> &v){
...
}
std::valarray<float> A, x;
....
doSomething(A - x);
これでちゃんとdoSomethingが呼ばれるかと思いましたが,
doSomething(std::_Expr<std::_BinClos<std::__minus, std::_ValArray,
std::_ValArray, float, float>, float>)
が無いと言われてコンパイルエラーになりました.
std::valarrayとして渡せないはずは無いと思うのですが・・・
0030デフォルトの名無しさん
2010/10/11(月) 03:53:320031デフォルトの名無しさん
2010/10/11(月) 03:58:43doSomething(std::valarray<float>(A - x));
とか
doSomething(A -= x);
でどうだ?
MSVCの実装は単に要素ごとに引いてるだけだから、コンパイル通ったけどね
0032デフォルトの名無しさん
2010/10/11(月) 11:34:430033デフォルトの名無しさん
2010/10/11(月) 11:38:320035デフォルトの名無しさん
2010/10/11(月) 11:55:050036デフォルトの名無しさん
2010/10/11(月) 14:01:390037デフォルトの名無しさん
2010/10/11(月) 14:10:520038デフォルトの名無しさん
2010/10/11(月) 14:20:220039デフォルトの名無しさん
2010/10/11(月) 14:29:37時間を計ることは出来ますか?
普通はどうやって測るのが一般的ですか?
0040デフォルトの名無しさん
2010/10/11(月) 14:31:240041デフォルトの名無しさん
2010/10/11(月) 14:49:340042デフォルトの名無しさん
2010/10/11(月) 14:52:01自前でコードに精密タイマ埋め込んで計る。
あるいはインテルなど各社から出ている測定ツール使う。
0043デフォルトの名無しさん
2010/10/11(月) 15:29:20なぜか外部参照エラーが出ます。
エラーは基底クラスのデストラクタを参照してエラーが出ているようです。
原因として何が考えられるでしょうか?
0044デフォルトの名無しさん
2010/10/11(月) 15:32:55派生クラスのデストラクタは必ず自動的に基本クラスのデストラクタを呼ぶ
0045デフォルトの名無しさん
2010/10/11(月) 15:33:22派生クラスのインスタンスが消滅した場合、抽象クラスのデストラクタも
実行されるのでしょうか?
0046デフォルトの名無しさん
2010/10/11(月) 15:35:190047デフォルトの名無しさん
2010/10/11(月) 15:35:29でもその基本クラスのデストラクタが定義されてないのでエラーがでるということですか?
もしそうなら、純粋仮想デストラクタというものは定義できないのでしょうか?
0048デフォルトの名無しさん
2010/10/11(月) 15:37:240049デフォルトの名無しさん
2010/10/11(月) 15:42:480050デフォルトの名無しさん
2010/10/11(月) 15:44:21純粋仮想関数化すれば、基本クラスのデストラクタが実行されないと思ったので、無駄な処理が
省けると思ったのですが。
でも純粋仮想関数化(後ろに=0つける)したのに、外部参照エラーが出るんです。
具体的にどうしたらよいでしょう?
0051デフォルトの名無しさん
2010/10/11(月) 15:47:41純粋じゃなくて中身か空のデストラクタにすればいいんじゃね。
0052デフォルトの名無しさん
2010/10/11(月) 15:51:14純粋仮想デストラクタの(中身空の)定義も書いてやればいい。
class a {
virtual ~a() = 0;
};
a::~a() {}
0053デフォルトの名無しさん
2010/10/11(月) 15:52:27ランダムだろうと気分だろうと勝手に定めた順序だ
0054デフォルトの名無しさん
2010/10/11(月) 15:53:14誤爆です。すみません
0055デフォルトの名無しさん
2010/10/11(月) 15:56:55std::unique_ptr<std::wstring> GetName();
のような関数があって、普通は戻り値のunique_ptrをそのまま
使えばいいのですが、vectorに入れたいケースがあり、shared_ptrに
変換したく、次のようなコードを書きました。
std::vector<std::shared_ptr<std::wstring>>> vec;
std::shared_ptr<std::wstring> str = GetName();
vec.push_back(str);
こういう書き方って安全なんですか?
unique_ptrの一時オブジェクトが作られ、それからshared_ptrへのムーブが
暗黙のうちに行われているので安全ではないか、と考えているのですが。
0056デフォルトの名無しさん
2010/10/11(月) 15:57:47できました!ありがとうございます!
この場合これを継承した派生クラスが消滅した場合、
この抽象クラスのデストラクタは実行されないんですかね?
0057デフォルトの名無しさん
2010/10/11(月) 16:10:13VC10でソース見たけど、shared_ptrにunique_ptrの右辺値参照する代入演算子が定義されてるね。
OKのようだね。
これは便利だ。ありがたく使わせてもらうよ。
0058デフォルトの名無しさん
2010/10/11(月) 16:59:090059デフォルトの名無しさん
2010/10/11(月) 17:59:450060デフォルトの名無しさん
2010/10/11(月) 19:33:47unique_ptrならauto_ptrと違ってvectorそのものの動作に問題はないんでしょうけど、
要素を取り出すとき、つまらないミスをしそうですね。
暗黙のムーブを発生させちゃって、vectorには無効なunique_ptrが残ることに。
0061デフォルトの名無しさん
2010/10/11(月) 19:46:27vector から要素を取り出すときは常に左辺値になるから、そんな心配はいらないのか。
0062デフォルトの名無しさん
2010/10/11(月) 19:52:150063デフォルトの名無しさん
2010/10/11(月) 19:57:38とかやって「先輩!コンパイルできません!」と泣きついてくる奴はいそうな気がする。
auto &x = vec.front();
「こうすれば大丈夫だよ」と理由や副作用も含めて教えてあげればいいんだが、
auto x = std::move(vec.front());
こういうやり方を教えて「こうすればコンパイルできるみたいだよ」なんて言う奴は
ウチの会社にはいないはず……うん、いないはず……
0064デフォルトの名無しさん
2010/10/11(月) 20:23:16それを説明するには、lvalueとrvalueの区別をきっちり説明しなくちゃいけないな。
俺自信ない。
0065デフォルトの名無しさん
2010/10/11(月) 20:53:100xになってさらに混乱しそうな仕様がいくつも追加されても困るよな
まあ業務では0xコンパイラ使わなきゃいいだけって話だけど
0066デフォルトの名無しさん
2010/10/11(月) 20:57:13Javaでもやらせとけ
0067デフォルトの名無しさん
2010/10/11(月) 21:10:25もっと仕様を軽量化単純化したC++Liteを作るべき
0068デフォルトの名無しさん
2010/10/11(月) 21:13:560069デフォルトの名無しさん
2010/10/11(月) 21:18:42いちいちアレが使えてこれが使えなくてとか確認することになるぜ
余計ややこしくするだけだっての
他の言語かC使えばいいんだよ
>>68
組み込みもやってるけど一度も使った事ないわそれw
0070デフォルトの名無しさん
2010/10/11(月) 21:34:17今現在そのような状況なのを何とかしてほしいってことだろ
関数テンプレートの部分初期化とかリンカがコンパイラを呼び出したりとか
0071デフォルトの名無しさん
2010/10/11(月) 21:52:50わらたw
0072デフォルトの名無しさん
2010/10/11(月) 21:58:14自分のグループやプロジェクトではそれなりにルール決めると良いだろうが
たまに Java 使うと窮屈に感じてしょうがない
0073デフォルトの名無しさん
2010/10/11(月) 22:16:07template <class T, int N>
int length(const T (&x)[N]) {
return N;
}
const BYTE* ptr = &values[0];
inr length = length(ptr);
とすると
error C2784: 'int length(const T (&)[N])' :テンプレート 引数を 'const T (&)[N]' に対して 'const BYTE *' から減少できませんでした
とエラーが出てしまいます。
どうすればいいのでしょうか?
0074デフォルトの名無しさん
2010/10/11(月) 22:20:31const BYTE* ptr これ配列じゃないよ
0075デフォルトの名無しさん
2010/10/11(月) 22:24:40ぷっ
0076デフォルトの名無しさん
2010/10/11(月) 22:29:27void hogehoge(const BYTE *values)
{
なんです。
void hogehoge(const BYTE values[])
{
にしても、C2784エラーがでてしまいます。
0077デフォルトの名無しさん
2010/10/11(月) 22:31:14そのhogehogeもテンプレートにしちゃいないよ。
0078デフォルトの名無しさん
2010/10/11(月) 22:31:170079デフォルトの名無しさん
2010/10/11(月) 22:33:22だめだこりゃ!
0080デフォルトの名無しさん
2010/10/11(月) 22:46:43{
こうですか?
0081デフォルトの名無しさん
2010/10/11(月) 22:47:49もう大分前から STL は C++ 標準
0082デフォルトの名無しさん
2010/10/11(月) 23:04:56void print1();
void print2();
void print3();
の方が
void print3();
void print1();
void print2();
より見やすい気がする
お前らはどんなルールで関数を宣言していますか?
0083デフォルトの名無しさん
2010/10/11(月) 23:07:59書けるとこに書けばいい。
スレ違いだから。
0084デフォルトの名無しさん
2010/10/11(月) 23:08:06両方とも醜いです
0085デフォルトの名無しさん
2010/10/11(月) 23:45:08printを使うのは良いとして 1,2,3 なんてイミフなラベル付けないなぁ
0086デフォルトの名無しさん
2010/10/11(月) 23:45:56init → begin → end → free か
init → free → begin → end
0088デフォルトの名無しさん
2010/10/11(月) 23:48:070089デフォルトの名無しさん
2010/10/11(月) 23:48:130090デフォルトの名無しさん
2010/10/12(火) 00:53:21結局はこれが一番一覧性高い
0091デフォルトの名無しさん
2010/10/12(火) 00:59:38それぞれどんな機能差があるか分からないけど、番号だけで分けるなんて安易で酷いと思うよ
0092デフォルトの名無しさん
2010/10/12(火) 01:02:47説明のためだけなら、実用における
void print1();
void print2();
void print3();
と
void print3();
void print1();
void print2();
の違いがさっぱり分からないわけだが。
0093デフォルトの名無しさん
2010/10/12(火) 01:05:00宣言とか定義場所の並び順なら、グループ別に分けてコメントで見出しと説明文とgrep用の印付ける。
その上で呼び出し順序のある物ならその順番で書いて、そうじゃない単位での並び順はそんなわらわら増えた事も無いし適当。
0094デフォルトの名無しさん
2010/10/12(火) 01:14:12辞書順の例を出しただけ。
他にどんなルールで並べてるのかを聞いてるんだよ
0095デフォルトの名無しさん
2010/10/12(火) 01:16:170096デフォルトの名無しさん
2010/10/12(火) 01:53:40というか辞書順という言葉が分からなかったんだろ?
009729
2010/10/12(火) 06:16:30>valarrayの - 演算子って定義されてるの?
演算子いっぱい定義されてます.
http://www.cplusplus.com/reference/std/valarray/valarray/operators/
>>31
遅延評価をやってるってことですよね?
doSomething(std::valarray<float>(A - x));
でも
doSomething(A -= x);
でもコンパイル通りました.ありがとうございます!
(言い忘れましたが私はgcc 4.5を使っています)
ただ,なぜ自動的に型変換されないのでしょう.
std::valarrayのコンストラクタにA-xは渡せるのだから引数に渡るとき暗黙に型変換されるものだと思っていましたが・・
0098デフォルトの名無しさん
2010/10/12(火) 06:55:390099デフォルトの名無しさん
2010/10/12(火) 08:24:34テンプレート配列
#include <iostream>
template<class T,int N>
inline int length(T (&a)[N])
{
return N;
}
int _tmain(int argc, _TCHAR* argv[])
{
int s[70];
std::cout<<length<>(s);
return 0;
}
0100デフォルトの名無しさん
2010/10/12(火) 08:42:14お願いします。
0101デフォルトの名無しさん
2010/10/12(火) 09:14:180102デフォルトの名無しさん
2010/10/12(火) 09:34:560103デフォルトの名無しさん
2010/10/12(火) 09:53:500104デフォルトの名無しさん
2010/10/12(火) 18:29:31これは私ではありません
0105デフォルトの名無しさん
2010/10/12(火) 19:41:08私も気になって調べてみましたがよくわかりませんでした。
valarrayの_Exprを受け取るコンストラクタがメンバテンプレートなのが関係あるかも?
0106デフォルトの名無しさん
2010/10/12(火) 19:47:56class Test {
public:
Test() { c = 'T'; i = 10; };
char getChar() { return c; };
int getInt() { return i; };
private:
int i;
char c;
};
int main()
{
Test t;
printf("t.i = %d, t.c = %c\n", t.getInt(), t.getChar());
printf("t = %d\n", t);
return 0;
}
としたとき、1つ目のprintf()関数で値を取得出来るのは分かるのですが、
2つ目のprintf()関数でも、最初に定義されたメンバ変数の値(つまりt.getInt()と同じ値)が
取得出来るようです。
値を書き換えることは出来ないとは言え、実質privateメンバ変数の値に
publicメンバ関数を通さずにアクセスできていることになりますが、
これは言語仕様でしょうか?
0107デフォルトの名無しさん
2010/10/12(火) 19:56:57printfの正しくない使い方をして先頭のメンバーがたまたま見えてるだけ。
仕様としては未定義な動作。
0108デフォルトの名無しさん
2010/10/12(火) 19:58:59具体的な仕様は知らんのだけど、それってprintfの中で (int)t されてるんじゃないかな。
0109デフォルトの名無しさん
2010/10/12(火) 20:00:18言語仕様うんぬんではなく、printf()の正しくない使い方だったのですね。
迅速なご回答ありがとうございました。
0110デフォルトの名無しさん
2010/10/12(火) 20:07:42ありがとうございます。
インスタンスtの先頭にメンバ変数iが割り当てられて、
printf()内で(int)tされた結果、tのアドレスをint型として扱い
iの値が出力されたということでしょうか?
0111デフォルトの名無しさん
2010/10/12(火) 20:13:36そんな所だと思う。
int a = *(int*)&t;
printf("%d\n", a);
でも同じ処理系なら同じ結果が得られるよ。
tの中の状態に依存してるから、他で必ず同じ結果になるとは限らないと思うけど。
0112デフォルトの名無しさん
2010/10/12(火) 20:15:220113デフォルトの名無しさん
2010/10/12(火) 20:22:19ありがとうございます。
ご提示のコードでも確かに同様の結果が得られました。
>>112
ありがとうございます。
ということは、違う環境で例えばメンバ変数のスタックへの積まれ方が異なる場合には
違う値になってしまいますね。
仕事で携わってるものにこのようなコードがあり、
初めて見る書き方でしたので最初は意味が分からず
>>106のような検証コードを書いて、ようやく理解出来ました・・・。
正しくない使い方のようですのでgetInt()のようなゲッターを作って
取得するようにしようと思います。
ありがとうございました。
0114デフォルトの名無しさん
2010/10/12(火) 20:25:410115デフォルトの名無しさん
2010/10/12(火) 20:26:010116デフォルトの名無しさん
2010/10/12(火) 20:29:08private:
int i;
char c;
から
private:
char c;
int i;
と入れ替えて、
printf("t = %c\n", t);
とすると、「T」が表示されましたので、
クラスTestのインスタンスとして確保されたメモリ領域に
メンバ変数の定義順に配置されたって感じなんでしょうかねぇ。。。
0117デフォルトの名無しさん
2010/10/12(火) 21:05:13クラスも構造体も基本は一緒だから
でも>>106は未定義
0118デフォルトの名無しさん
2010/10/13(水) 00:56:49参照型変数の寿命に関連してお伺いします。
紙面の都合上かなり省いていますが、下記コードでのretの使い方は正しいでしょうか?
(分かりづらいようでしたら、どこかに張ります)
まず、foo()は変更できない関数です。
処理としては、クラスXXXのメンバ変数のconst参照を返しています。
この参照をそのまま取得したいのですが、cがNULLの時はfoo()を呼べないので、
ifブロック外のポインタretに代入するようにしました。
動くことは動くのですが、ifブロックを抜ける時にRetが消えるような
気がしてなりません。よろしくお願いします。
XXX *c = yyy.GetPointer();
const vector<int> *ret = NULL;
if (c != NULL) {
const vector<int>& Ret = c->foo();
ret = &Ret;
}
:
if (c != NULL) {
std::for_each(ret->begin(), ret->end(), print);
}
0119デフォルトの名無しさん
2010/10/13(水) 01:06:22この(元のコードの)目的は、
(fooが取得できれば、)fooの返り値に対して最後のfor_eachを行うことです。
制限ばかりで申し訳ないですが、他の関係の無い処理が入る都合上、
for_eachの部分を上のfooの部分と同じブロックに入れることができません。
0120デフォルトの名無しさん
2010/10/13(水) 01:10:09>ifブロックを抜ける時にRetが消えるような
>気がしてなりません。よろしくお願いします。
消えるよ
当たり前だろ
ブロック内しか寿命がない
>動くことは動くのですが、
たまたま動いているだけ
Retはブロックの外で定義しないと
その場合参照型にはできないね
0121デフォルトの名無しさん
2010/10/13(水) 01:11:59× 他の関係の無い処理が入る都合上、
○ 既存のコードの制御フローを変更できない都合上、
0122デフォルトの名無しさん
2010/10/13(水) 01:15:39バグってはっきりわかったんだから修正するのが当たり前だろ
0123デフォルトの名無しさん
2010/10/13(水) 01:22:58Retを介す必要なくね?
ret = c->foo();
0124デフォルトの名無しさん
2010/10/13(水) 01:40:25なるほど。>>118を再掲しますと
> 処理としては、クラスXXXのメンバ変数のconst参照を返しています。
なので
ret = &(c->foo())
となるかと思いますがretの指すアドレスは、
「ifブロック内の一時的な変数」ではなくて「cのメンバ変数」のアドレスである。
という理解でよいのでしょうか?
加えて、retの有効範囲はcが有効である間という認識でよいのでしょうか?
0125デフォルトの名無しさん
2010/10/13(水) 01:42:53class C {
int i;
public:
C(int j) : i(j) {}
void foo() const {
std::cout << i << ' ';
}
};
int main()
{
const std::vector<C> *ret = 0;
std::vector<C> vi;
for (int i = 0; i < 10; i++)
vi.push_back(C(i));
ret = &vi;
std::for_each(ret->begin(), ret->end(), std::mem_fun_ref(&C::foo));
}
0126デフォルトの名無しさん
2010/10/13(水) 02:11:29それで動くはず。
foo() が const 参照を返すのなら、参照先は c のメンバ変数そのものだから、
&演算子でメンバ変数そのもののアドレスがとれる。
もっとも、その程度の処理なら、これで十分だけどね。
std::for_each(c->foo()->begin(), c->foo()->end(), print);
0127デフォルトの名無しさん
2010/10/13(水) 02:41:58class C : public std::unary_function<int, void> {
int i;
public:
void operator()(int i) const {
std::cout << i << ' ';
}
};
int main()
{
const std::vector<int> *ret;
std::vector<int> vi;
for (int i = 0; i < 10; i++)
vi.push_back(i);
ret = &vi;
std::for_each(ret->begin(), ret->end(), C());
}
0128デフォルトの名無しさん
2010/10/13(水) 13:46:420129デフォルトの名無しさん
2010/10/13(水) 14:01:12コンパイラのマニュアルを見ろ。
いちおう、同じコンパイラ+同じ設定でコンパイルしてるなら問題ない可能性が高いとは言える。
0130デフォルトの名無しさん
2010/10/13(水) 14:03:320131デフォルトの名無しさん
2010/10/13(水) 14:14:300132デフォルトの名無しさん
2010/10/13(水) 18:49:54お返事が遅れました。
確かに、c->foo()->begin()で十分ですね。コレがよさそうです。
あと知らなかったのでmem_fun_ref調べてみましたが、
オブジェクトを作らなくても関数を呼べるのは面白いですね。
ありがとうございました。
0133デフォルトの名無しさん
2010/10/13(水) 23:08:360134デフォルトの名無しさん
2010/10/13(水) 23:24:430135デフォルトの名無しさん
2010/10/14(木) 00:44:43namespace std{ void bar(); }
void baz() { std::bar(); }
}
まあこんなことするやつはいないと思いたい
0136デフォルトの名無しさん
2010/10/14(木) 00:46:330137デフォルトの名無しさん
2010/10/14(木) 01:37:540138デフォルトの名無しさん
2010/10/14(木) 01:41:55それは黒歴史。後方互換性とも言う。
0139デフォルトの名無しさん
2010/10/14(木) 01:50:340140デフォルトの名無しさん
2010/10/14(木) 02:10:290141デフォルトの名無しさん
2010/10/14(木) 07:42:09http://togetter.com/li/59043
綾瀬はるかのおっぱいはどの型で宣言すればいいですか?
0142デフォルトの名無しさん
2010/10/14(木) 08:16:24int
0143デフォルトの名無しさん
2010/10/14(木) 13:00:470144デフォルトの名無しさん
2010/10/14(木) 13:38:430145デフォルトの名無しさん
2010/10/14(木) 13:47:40関数Bでは関数Cを呼び、関数Cは関数Dを呼び・・・と何層にもなっているとします。
ここで、関数Cや関数Dから、goto文のように直接関数Aにreturnすることはできるでしょうか?
0146デフォルトの名無しさん
2010/10/14(木) 13:49:050147デフォルトの名無しさん
2010/10/14(木) 13:57:36エラー処理なら throw 〜 catch で。
それ以外ならもう少し詳しく状況を。できればコードで。
0148デフォルトの名無しさん
2010/10/14(木) 13:58:550149デフォルトの名無しさん
2010/10/14(木) 14:10:160150デフォルトの名無しさん
2010/10/14(木) 14:16:30try〜catchは少し調べてみましたが、例外がおきたときに特定の処理をするようなので、処理を関数Aに戻すのは難しいのでは・・・と思います。
setjmp/longjmpはぴったりあってるような気がします。
ただ、goto文と同じくあまり推奨されてないのが不安ですが・・・
0151デフォルトの名無しさん
2010/10/14(木) 14:40:55使用してはいけない。throwが正解。
0152デフォルトの名無しさん
2010/10/14(木) 15:22:17それはまさしく例外だ。
try 〜 catchを関数Aに記述すれば、関数Dで例外がthrowされたときに関数Aまで戻るよ。
このとき、途中の関数の自動変数(ローカル変数)のデストラクタがちゃんと呼ばれる。
0153デフォルトの名無しさん
2010/10/14(木) 15:27:22○ デストラクタ
0154デフォルトの名無しさん
2010/10/14(木) 15:56:05簡単な例を作って試してみたところ、関数Aに処理が戻ったことが確認できました。
これで綺麗にコーディングできそうです。
助かりましたm(_ _)m
0155デフォルトの名無しさん
2010/10/14(木) 20:42:52void main(){
vector<int> p;
vector<int> q;
for(int i=0; i<10; i++){
p[i]=i;
q[i]=i*2;
}
up(p,q);
cou << p[0] <<endl;
cou << q[0] <<endl;
}
void up(vector<int> p, vector<int> q){
for(int i=0; i<10; i++){
p[i]+=1;
q[i]+=1;
}
}
かなり適当になってしまったのですが上のようにvectorを複数個メソッドに渡して中身を処理変化させても
呼び出し元では変化しません。配列を渡した場合ポインタを利用して中身を替えることができますがvectorでも可能なのでしょうか?
vectorでのポインタの扱いがいまいちわかっておりません。どうか教えてください。
0156デフォルトの名無しさん
2010/10/14(木) 20:51:05void up(vector<int> &p, vector<int> &q)
0157デフォルトの名無しさん
2010/10/14(木) 20:59:020158デフォルトの名無しさん
2010/10/14(木) 21:01:380159デフォルトの名無しさん
2010/10/14(木) 21:46:15あくまでもvector「クラス」
だから普通のクラスと同様にポインタや参照で渡せばいい
コピーはまずいな 時間計測してみればわかるが
0160デフォルトの名無しさん
2010/10/14(木) 22:05:010161デフォルトの名無しさん
2010/10/14(木) 22:32:16それだったら言語によって普通とかないと思うよ。
見易さのために組織で決めることはあるかもしれないけどね。
ちなみにgoogleは4文字。アクセス指定子は2文字とどこかで見た。
0162デフォルトの名無しさん
2010/10/14(木) 22:32:42その話題はこっちで
http://hibari.2ch.net/test/read.cgi/tech/1193554741/
0163デフォルトの名無しさん
2010/10/14(木) 23:18:27Boost.Serialization
0164デフォルトの名無しさん
2010/10/15(金) 07:49:55最近はそうでもないです
0165デフォルトの名無しさん
2010/10/15(金) 12:45:44assertみたいに正式版では簡単に消せるような
文字を表示するにはどうやりますか?
0166デフォルトの名無しさん
2010/10/15(金) 13:09:00printf ( "message" ) ;
#endif
0167デフォルトの名無しさん
2010/10/15(金) 13:34:49もしそうならマクロ名を
assertを解除するマクロと同じ名前にした方が良いような気がするのですが?
あるいはその3行のコードをマクロにしたようなものはよういされてませんか?
0168デフォルトの名無しさん
2010/10/15(金) 13:38:34#define PRINT( ... ) printf( __VA_ARGS__ )
#else
#define PRINT( ... ) ((void)0)
#endif
0169デフォルトの名無しさん
2010/10/15(金) 13:40:00_RPTFとかな
「正式版」なんてものは規格の外の話だ
0170デフォルトの名無しさん
2010/10/15(金) 14:21:02日本語でおk
0171デフォルトの名無しさん
2010/10/15(金) 14:27:11Releaseバージョンでリンクすれば自動でスキップされる
0172デフォルトの名無しさん
2010/10/15(金) 14:37:470173デフォルトの名無しさん
2010/10/15(金) 14:41:170174デフォルトの名無しさん
2010/10/15(金) 14:51:190175デフォルトの名無しさん
2010/10/15(金) 16:39:140176デフォルトの名無しさん
2010/10/15(金) 17:03:380177デフォルトの名無しさん
2010/10/15(金) 17:13:360178デフォルトの名無しさん
2010/10/15(金) 17:23:400179デフォルトの名無しさん
2010/10/15(金) 17:25:300180デフォルトの名無しさん
2010/10/15(金) 17:50:000181デフォルトの名無しさん
2010/10/15(金) 20:40:46assert( false && "message" );
で"message"も表示してくれるよね
0182デフォルトの名無しさん
2010/10/15(金) 20:53:320183デフォルトの名無しさん
2010/10/15(金) 20:55:420184デフォルトの名無しさん
2010/10/15(金) 20:56:51C++の仕様の話をしているんじゃねぇの?
0185デフォルトの名無しさん
2010/10/15(金) 21:05:530186デフォルトの名無しさん
2010/10/15(金) 22:04:030187デフォルトの名無しさん
2010/10/16(土) 01:18:090188デフォルトの名無しさん
2010/10/16(土) 04:45:18標準はNDEBUGだけかと思ってたが
0189デフォルトの名無しさん
2010/10/16(土) 20:03:460190デフォルトの名無しさん
2010/10/16(土) 20:11:180191デフォルトの名無しさん
2010/10/16(土) 23:20:560192デフォルトの名無しさん
2010/10/16(土) 23:43:310193デフォルトの名無しさん
2010/10/17(日) 00:38:290194デフォルトの名無しさん
2010/10/17(日) 00:56:10マクロも全部展開することで
コンパイルがわずかに早くなるよ。
人間には検出不可能だけど。
0195デフォルトの名無しさん
2010/10/17(日) 01:00:470197デフォルトの名無しさん
2010/10/17(日) 01:08:390198デフォルトの名無しさん
2010/10/17(日) 01:11:08class hoge
{ // hoge class
public:
hoge(){}
};
こんな風に中括弧とスコープ内部が同じ深さになってて更にネストが加わるとどんどんわかりにくく
0199デフォルトの名無しさん
2010/10/17(日) 01:19:250200デフォルトの名無しさん
2010/10/17(日) 01:20:41エディタのタブ幅設定が違うだけかと
0201デフォルトの名無しさん
2010/10/17(日) 01:22:300202デフォルトの名無しさん
2010/10/17(日) 01:32:190203デフォルトの名無しさん
2010/10/17(日) 01:32:46さすがの俺もスペースとタブを見間違えませんよw
>>199,201
え、STLって書き換えていいもんなんですか?
それ以前になんかファイルに読み取り専用設定がされています
あと別に書き換え云々じゃなくてMS(が作ったんですか?)が
こういう風にしてるからには一つの有名な流儀なのかなと思いまして
0204デフォルトの名無しさん
2010/10/17(日) 01:33:310205デフォルトの名無しさん
2010/10/17(日) 01:39:260206デフォルトの名無しさん
2010/10/17(日) 01:43:34スタイルに興味あったらこれとか眺めてみるといいかも
ttp://astyle.sourceforge.net/astyle.html#_Predefined_Style_Options
0207デフォルトの名無しさん
2010/10/17(日) 01:50:31どうもありがとう、なんだか凄く歴史がありそうな書き方なんですね
>>206
どうもです、自分でもスタイルに関して少し思うところがあったので読んでみます
0208デフォルトの名無しさん
2010/10/17(日) 16:03:12普通の職場じゃ一般的じゃないフォーマットだよな
0209デフォルトの名無しさん
2010/10/17(日) 16:13:44#ifndef __FILE_H_INCLUDED__
#define __FILE_H_INCLUDED__
#include<stdio.h>
class CFile{
0210デフォルトの名無しさん
2010/10/17(日) 16:16:14class CFile{
//メンバ変数
private:
FILE *m_pfile; //ファイル
・・・・・・
このclass CFile と書いてある所で宣言の構文エラーがあるようなんですが、よくわかりません。
エラー E2141 File.h 6: 宣言の構文エラー
http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html
0211デフォルトの名無しさん
2010/10/17(日) 16:18:080212デフォルトの名無しさん
2010/10/17(日) 16:20:37#define __FILE_H__ENCLUDED__
#include<stdio.h>
class CFile{
//メンバ変数
private:
FILE *m_pfile; //ファイル
bool m_bCopy; //コピーコンストラクタで作られたかどうか
//コンストラクタ・デストラクタ
public:
CFile(); //コンストラクタ
CFile(const CFile& rohter); //コピーコンストラクタ
~CFile(); //デストラクタ
//ファイルの開閉
public:
bool Open(const char *pszFile,const char *pszFlags);
//ファイルを開く
void Close(); //ファイルを閉じる
0213デフォルトの名無しさん
2010/10/17(日) 16:21:18private:
bool ModifyFlags(const char *pszSource,char *pszDest,int nSize);
//フラグの調整
//ファイルの操作
public:
size_t Read(void *pData, seze_t nSize); //ファイルから読みだす
size_t Write(const void *pData,size_t nSize) //ファイルに書き込む
//評価
public:
bool IsValid() const; //m_pfileの値が有効かどうか
bool Eof(); //ファイルの終端に達したかどうか
};
//m_pfileの値が有効かどうか
inline bool CFile::IsValid() const{
return (m_pfile != NULL);
}
#endif
0214デフォルトの名無しさん
2010/10/17(日) 16:22:59size_t Write(const void *pData,size_t nSize); //ファイルに書き込む
0215デフォルトの名無しさん
2010/10/17(日) 16:24:42■C:\c++> bcc32 File.h
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
File.h:
エラー E2141 File.h 6: 宣言の構文エラー
エラー E2141 File.h 40: 宣言の構文エラー
*** 2 errors in Compile ***
0216デフォルトの名無しさん
2010/10/17(日) 16:29:06#define __FILE_H__ENCLUDED__
ここも何か変だな
0217デフォルトの名無しさん
2010/10/17(日) 16:30:440218デフォルトの名無しさん
2010/10/17(日) 16:38:400219デフォルトの名無しさん
2010/10/17(日) 16:41:50class A{};
だけ書いたファイルのコンパイルは通る?
0220デフォルトの名無しさん
2010/10/17(日) 16:43:500221デフォルトの名無しさん
2010/10/17(日) 16:45:07通ってない?
0222デフォルトの名無しさん
2010/10/17(日) 16:45:47■C:\c++> bcc32 classtest.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
classtest.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
0223デフォルトの名無しさん
2010/10/17(日) 16:47:14int main(){
return 0;
}
こう書けば通りますが
0224デフォルトの名無しさん
2010/10/17(日) 17:29:23.cppだったらC++としてコンパイルされてあたりまえ
.hはどうなんだと訊いてるんだ
0225デフォルトの名無しさん
2010/10/17(日) 17:37:27>>223を.cppだとコンパイル出来ましたが、
.hはエラーが発生しました
0226デフォルトの名無しさん
2010/10/17(日) 17:39:160227デフォルトの名無しさん
2010/10/17(日) 17:39:29のかわりに
#include <cstdio>
ではどうですか?
0228デフォルトの名無しさん
2010/10/17(日) 17:41:28マニュアル読めよ
http://docwiki.embarcadero.com/RADStudio/ja/C%2B%2B_%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3_%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%EF%BC%9A_BCC32
>拡張子が .CPP のファイルは C++ ファイルとしてコンパイルされます。拡張子が .C のファイル、拡張子のないファイル、および .CPP、.OBJ、.LIB、.ASM 以外の拡張子を持つファイルは、C ファイルとしてコンパイルされます。
0229デフォルトの名無しさん
2010/10/17(日) 23:23:340230デフォルトの名無しさん
2010/10/17(日) 23:39:320231デフォルトの名無しさん
2010/10/17(日) 23:40:370232デフォルトの名無しさん
2010/10/18(月) 10:24:58struct eq_t { bool eq(const T &lhs, const T &rhs) { return (lhs == rhs); } };
というような、比較関数をラップした構造体があり、いくつかの型に対して特殊化したバージョンもあります。
その中に、vector一般に対して部分特殊化した次のようなものがあるのですが、
template <typename T>
struct eq_t<std::vector<T>>
{
bool eq(const std::vector<T> &lhs, const std::vector<T> &rhs)
{
return (lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin()));
}
};
これをコンテナ一般(というかbegin(), end()を持つクラス)を対象とするにはどうすればいいのでしょうか?
vector::mplあたりに何かありそうか気はするのですが。
0233デフォルトの名無しさん
2010/10/18(月) 12:21:04引数が左辺値か右辺値かによってコピーとムーブを自動的に区別して行う関数と
理解していいんでしょうか。
0234デフォルトの名無しさん
2010/10/18(月) 12:27:47エラー出力はバッファを持たないの意味が分からないのですが。
バッファを持つと持たないとは何が違うのでしょうか?
バッファとは何をするものですか?
0235デフォルトの名無しさん
2010/10/18(月) 12:33:49ディクスファイルや端末、ネットワークへの入出力は低速なので、一定量データを
溜めておいて、一度に行う事で高速化する。これがバッファリング
バッファリングされたデータは適切なタイミングで出力される必要があるが、
エラーが発生してプログラムが異常終了すると出力されない場合がある。
異常終了の場合にこそエラー出力は重要なので、エラー出力はバッファリングしない。
0236デフォルトの名無しさん
2010/10/18(月) 12:42:30forward() をはさまないとぜんぶ左辺値の参照(従来の参照)になっちゃう。
0237デフォルトの名無しさん
2010/10/18(月) 15:05:04例えばAクラスを継承するBクラスというものがあって、
BクラスからはAクラスのconst関数しか呼べないようにするにはどうすればよいでしょうか
(もちろん素のAクラスはいかなるAメンバ関数も使えます)
0238デフォルトの名無しさん
2010/10/18(月) 15:07:500239デフォルトの名無しさん
2010/10/18(月) 15:41:52Aはそのまま使うこともあり、その時にはconst関係なくメンバ関数を使いたいんです
要はAはメンバ変数書き換え関数を持っており、それは(もちろん非const時の)Aとしては普通に使えますが、
継承先Bからはそれを使えないようにしたいんです
Bが継承ではなくメンバ変数としてconst Aを持てば上記のことは出来るんですが
これを継承でする方法はないものかと
0240デフォルトの名無しさん
2010/10/18(月) 15:47:45書き換え関数を持つAを作れば解決じゃね?
0241デフォルトの名無しさん
2010/10/18(月) 15:50:570242デフォルトの名無しさん
2010/10/18(月) 16:22:28どうもありがとうございます
なるほど、クラスを分離して役割を明確にさせるんですね
結構シンプルでいいかもしれない
>>241
それって少なくとも非const関数を全てオーバーロードするんですよね?
ちょっと引数とかの同期が大変そうなので上の方法で検討してみたいと思います
どうもすみません
0243デフォルトの名無しさん
2010/10/18(月) 16:33:110244デフォルトの名無しさん
2010/10/18(月) 17:36:16(´B`)
0245デフォルトの名無しさん
2010/10/18(月) 17:37:29boolをintに詰め込んでintの配列にするのが最も効率的ですか?
0246デフォルトの名無しさん
2010/10/18(月) 17:43:300247デフォルトの名無しさん
2010/10/18(月) 17:56:36メモリ効率的にはそうだけど、実行効率は必ずしもビットがいいとは限らない。
0248デフォルトの名無しさん
2010/10/18(月) 17:59:26じゃあ何が良いの?
0249デフォルトの名無しさん
2010/10/18(月) 18:01:520250デフォルトの名無しさん
2010/10/18(月) 18:03:070251デフォルトの名無しさん
2010/10/18(月) 18:05:180252デフォルトの名無しさん
2010/10/18(月) 18:08:10今時のCPUのキャッシュを考えたら殆ど意味がない。
寧ろ、ビット演算のコストの方が問題。
0253デフォルトの名無しさん
2010/10/18(月) 18:16:210254デフォルトの名無しさん
2010/10/18(月) 18:33:15具体的にどういうコードを書けば効率良くなるんだろう
なるべく変数を減らして使いまわすぐらいしか思い浮かばん
0255デフォルトの名無しさん
2010/10/18(月) 18:41:16キミが思い浮かぶくらいの事はコンパイラが全部知っている。
変数使いまわしは難読性を向上させるだけ。
0256デフォルトの名無しさん
2010/10/18(月) 18:41:17実直なコードを書いて、最適化はコンパイラに任せるのがよい。
0257デフォルトの名無しさん
2010/10/18(月) 18:43:39これってよくできた諺だよな
0258デフォルトの名無しさん
2010/10/18(月) 19:44:52とboostの中の人も言っている。
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
0259デフォルトの名無しさん
2010/10/18(月) 20:01:170260デフォルトの名無しさん
2010/10/18(月) 20:04:35フラグを1カ所で管理してるのがおかしい。
0261デフォルトの名無しさん
2010/10/18(月) 20:17:13上から目線であやふやな思い込みを語るのはどうかと思う。
0262デフォルトの名無しさん
2010/10/18(月) 20:33:57なんとなく速くなった遅くなったじゃなくて、ちゃんとプロファイリングするなり
アセンブリ出力を読むなりしないと。
0263デフォルトの名無しさん
2010/10/18(月) 20:34:28ありがとうございました
0264デフォルトの名無しさん
2010/10/18(月) 20:42:27えいごよめねえ
解説を
0265デフォルトの名無しさん
2010/10/18(月) 20:46:23ガテン系に転職した方がいい。
0266デフォルトの名無しさん
2010/10/18(月) 20:52:130267デフォルトの名無しさん
2010/10/18(月) 21:27:11http://codepad.org/PIjvF4Yq
0268デフォルトの名無しさん
2010/10/18(月) 21:28:42プログラマーってガテン系じゃなかったのか?
0269デフォルトの名無しさん
2010/10/18(月) 21:35:15ガテン系プログラマは英語を読む必要は無い。
0270デフォルトの名無しさん
2010/10/18(月) 21:37:300271デフォルトの名無しさん
2010/10/18(月) 21:38:460272デフォルトの名無しさん
2010/10/18(月) 21:57:160273232
2010/10/18(月) 22:00:23まさに私が求めていたものです。Exaclty what I was looking for です。
じっくり読んで隅々まで理解するようにします。ありがとうございました。
0274デフォルトの名無しさん
2010/10/18(月) 22:44:490275デフォルトの名無しさん
2010/10/18(月) 22:47:220276デフォルトの名無しさん
2010/10/18(月) 22:51:05外人 『miss spell』
外人『Fuck you』
0277デフォルトの名無しさん
2010/10/18(月) 22:54:38Euck yon! You'll kill me!
0278デフォルトの名無しさん
2010/10/18(月) 22:55:040279デフォルトの名無しさん
2010/10/18(月) 22:56:430280デフォルトの名無しさん
2010/10/18(月) 22:57:560281デフォルトの名無しさん
2010/10/18(月) 23:14:490282デフォルトの名無しさん
2010/10/18(月) 23:41:19"is"? You too! hahahaha!!
0283デフォルトの名無しさん
2010/10/18(月) 23:47:22be動詞の変化くらいおぼえとけよ。
0284デフォルトの名無しさん
2010/10/18(月) 23:49:590285デフォルトの名無しさん
2010/10/18(月) 23:56:500286デフォルトの名無しさん
2010/10/19(火) 00:14:590287デフォルトの名無しさん
2010/10/19(火) 00:16:42できれば規格書のどこに記述があるかも教えていただけるとうれしいです。
int foo()
{
Hoge a;
Hoge b;
// 何か処理
}
という関数を抜けるとき、a→bの順で解放されるのか、b→aの順で解放されるのか、
それとも決まってないのか? 構築したのと逆順で呼ばれるのが合理的と思いますが……
0288デフォルトの名無しさん
2010/10/19(火) 00:18:350289デフォルトの名無しさん
2010/10/19(火) 00:24:16These objects
are destroyed in the reverse order of the completion of their constructor or of the completion of their
dynamic initialization.
12.4 Destructors
6.
All destructors are called as if they were referenced with a qualified name, that is, ignoring any
possible virtual overriding destructors in more derived classes. Bases and members are destroyed in the
reverse order of the completion of their constructor (see 12.6.2).
15.2 Constructors and destructors
As control passes from a throw-expression to a handler, destructors are invoked for all automatic objects
constructed since the try block was entered. The automatic objects are destroyed in the reverse order of the
completion of their construction.
0290デフォルトの名無しさん
2010/10/19(火) 00:26:58なるほど。それじゃあこういう↓スコープガードで依存関係のあるリソースを扱うときは
気をつけないとハマりますね。
http://d.hatena.ne.jp/DigitalGhost/20100921/1285095799
0291デフォルトの名無しさん
2010/10/19(火) 00:31:490292デフォルトの名無しさん
2010/10/19(火) 00:33:18自分でも規格書を確認しました。やっぱり逆順なんですね。
>>290のリンク先のようなスコープガードも、自然な順序で書いていけば問題なしと。
0293デフォルトの名無しさん
2010/10/19(火) 01:24:440294デフォルトの名無しさん
2010/10/19(火) 01:27:340295デフォルトの名無しさん
2010/10/19(火) 01:50:380296デフォルトの名無しさん
2010/10/19(火) 09:23:3432bit境界に配置されていない変数は、
メモリアクセス時にペナルティーがかかったりするから、
intの方が効率がよい。メモリ効率を問題にするならintでbit演算、実行効率だけの問題ならint型の配列だろ。
0297デフォルトの名無しさん
2010/10/19(火) 09:31:15doubleよりfloatですむならこっち。
演算速度より、メモリアクセスのほうが時間掛かるから。
32bitと8bitでは容量が1/4になるし。
スワップアウトを起こせば当然遅くなるけど、しなかったとしても容量の少ない方がアクセス速い。
0298デフォルトの名無しさん
2010/10/19(火) 09:31:56なるべく素直に書いとけばそれでいいよ
0299デフォルトの名無しさん
2010/10/19(火) 09:32:390300デフォルトの名無しさん
2010/10/19(火) 09:38:21プログラマは可読性や生産性のみを重視する方がよろしい
0301デフォルトの名無しさん
2010/10/19(火) 10:09:570302デフォルトの名無しさん
2010/10/19(火) 10:20:350303デフォルトの名無しさん
2010/10/19(火) 10:31:02仕様をちゃんと把握して、そこで使うのに問題がないと解ってるなら使っても良い
0304デフォルトの名無しさん
2010/10/19(火) 10:36:32固定長と可変長の違い。
必要な分だけ確保できるから。
0305デフォルトの名無しさん
2010/10/19(火) 10:38:00設計ミスによる削除の可能性を聞いたことがあるけど、どうせ今さら削除できないでしょ。
標準に代替が用意されていない現状ではなおのこと。
0306デフォルトの名無しさん
2010/10/19(火) 10:38:54上から目線であやふやな思い込みを語るのはどうかと思う。
0307デフォルトの名無しさん
2010/10/19(火) 10:39:42違いは明らかだが、それが「いい」とは限らないだろ。
0308デフォルトの名無しさん
2010/10/19(火) 13:29:40変数名とかつけるのにルールとかあるんですか?
あれば、簡単に教えてください。
0309デフォルトの名無しさん
2010/10/19(火) 13:33:30クラス名・変数名に迷ったら書き込むスレ。Part18
http://hibari.2ch.net/test/read.cgi/tech/1277016982/
0310デフォルトの名無しさん
2010/10/19(火) 16:36:32変数名なんてchinko unko mankoでいいだろ
0311デフォルトの名無しさん
2010/10/19(火) 16:42:34言い出しっぺの自分が業務でそういう変数名使ってくれ
俺は使わんが
0312デフォルトの名無しさん
2010/10/19(火) 16:45:36命名規則について聞いてるのかどっちなんだ?
0313デフォルトの名無しさん
2010/10/19(火) 20:33:400314デフォルトの名無しさん
2010/10/19(火) 20:48:010315デフォルトの名無しさん
2010/10/19(火) 20:49:330316デフォルトの名無しさん
2010/10/19(火) 20:54:350317デフォルトの名無しさん
2010/10/20(水) 00:34:08fwrite(&bit,sizeof(bit),1,fp);
でファイルに書き込んだものを
fread(&bit,sizeof(bit),1,fp);
で読み取っても大丈夫ですか?
0318デフォルトの名無しさん
2010/10/20(水) 00:52:43そんな保証はありません。
0319デフォルトの名無しさん
2010/10/20(水) 00:56:23「結合」の意味を明確にしないと答えにくいな。
単純に map::insert() や std::merge() を使ったとして、重複したキーは片方消えていいの?とか。
0320デフォルトの名無しさん
2010/10/20(水) 03:55:390321デフォルトの名無しさん
2010/10/20(水) 04:05:480322デフォルトの名無しさん
2010/10/20(水) 04:49:32const なオブジェクトを外部リンケージで定義したいときと、 extern "C" のため。
0323デフォルトの名無しさん
2010/10/20(水) 08:06:01extern使ってたけどダメなの?
0324デフォルトの名無しさん
2010/10/20(水) 08:08:190325デフォルトの名無しさん
2010/10/20(水) 09:43:39下記のソースがありました。
class SingletonClass {
private:
SingletonClass(void) {}
static SingletonClass* singleton;
public:
static SingletonClass* getInstance(void) {
return singleton;
}
void start(void);
bool doSomething(int something);
bool end(void);
};
SingletonClass* SingletonClass::singleton = new SingletonClass();
この場合、このインスタンスを解放するのは、別のクラスでしなければならないのですか?
このクラス自身のデストラクタでは自分を解放することなんてできないですよね?
自分で自分を解放することになっちゃいますから。
あと、このやり方はJava風のやり方っていってました、どの辺がJava風なんですか?
よろしくお願いします。
0326デフォルトの名無しさん
2010/10/20(水) 09:57:22SingletonClass のstaticメンバ関数で delete singleton することはできる。
が、それは普通のやり方ではないと思う。
C++風な書き方としては、単なるポインタではなくスマートポインタ(std::autoptrなど)を使う。
これで、deleteのことを気にしなくてよくなる。
あるいは、ポインタとnewを使うのではなく、単に値型を使う(static SingletonClass singleton; のように)。
これに対して、基本的にいつでもnewしたものをオブジェクト参照に突っ込む、
という感じなのがJava風かな。
0327デフォルトの名無しさん
2010/10/20(水) 10:00:120328デフォルトの名無しさん
2010/10/20(水) 10:18:37いや、 delete SingletonClass::getInstance(); で誰でも解放できるよ。
そして次に SingletonClass::getInstance() を呼べば別インスタンスを返す。
だからこの方法をSingletonパターンと呼ぶのにはちょっと無理がある。
0329デフォルトの名無しさん
2010/10/20(水) 10:21:360330デフォルトの名無しさん
2010/10/20(水) 10:27:42C++風の方法として下記のものもありました。
class SingletonClass {
private:
SingletonClass(void) {}
public:
static SingletonClass& getInstance(void) {
static SingletonClass singleton;
return singleton;
}
void doSomething(void);
};
これなら、別にnewでインスタンス作ってるわけじゃないので、
プログラム終了時に自動的に解放されるという認識でよいでしょうか?
0331デフォルトの名無しさん
2010/10/20(水) 10:30:49そういや誰でもgetInstance()で取ってきたポインタでdeleteできちゃうんだな。
気づいてなかったアホやった。
0332デフォルトの名無しさん
2010/10/20(水) 10:34:450333デフォルトの名無しさん
2010/10/20(水) 11:30:340334デフォルトの名無しさん
2010/10/20(水) 11:50:35これが C++ 風。
Class singleton;
あるいは。
Class& singleton();
どうにかしてクラスと new で解決しないといけないのが Java 風。
0335デフォルトの名無しさん
2010/10/20(水) 11:52:13extern Class singleton;
0336デフォルトの名無しさん
2010/10/20(水) 12:16:18ありがとうございました。
0337デフォルトの名無しさん
2010/10/20(水) 14:09:0323のデザインパターンは知っているのでもう結構です。
0338デフォルトの名無しさん
2010/10/20(水) 18:05:17http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
0339デフォルトの名無しさん
2010/10/20(水) 20:08:480340デフォルトの名無しさん
2010/10/20(水) 20:40:540341デフォルトの名無しさん
2010/10/20(水) 20:57:020342デフォルトの名無しさん
2010/10/20(水) 21:00:520343デフォルトの名無しさん
2010/10/20(水) 21:00:590344デフォルトの名無しさん
2010/10/20(水) 21:03:20こいつ最高にアホ
0345デフォルトの名無しさん
2010/10/20(水) 21:20:58趣味でもプログラムやるような奴ぐらいしかこんなの知らんし
仕事で使ったら周りの効率ガタ落ちするレベル
0346デフォルトの名無しさん
2010/10/20(水) 21:33:55CRTPを要求するクラスを継承してImplクラスを作りたい場合、Implクラスをprivate宣言すると、
テンプレート引数として使用できないため、エラーとなります。
class A {
private:
class Impl;
Impl *pimpl;
};
class A::Impl : public B<A::Impl> ← ここでImplにアクセスできないのでエラー
とりあえず、Implをpublic宣言しておいて、Implのコンストラクタをprivateにし、
Aをfriend宣言して対応したのですが、もっとすっきりしたやり方がないものでしょうか。
0347デフォルトの名無しさん
2010/10/20(水) 22:05:56template <typename T> class ImplBase {};
class A1 {
private:
class Impl;
Impl *pimpl;
public:
A1();
~A1();
};
class A1::Impl : ImplBase<A1::Impl> {
public:
Impl() {}
~Impl() {}
};
A1::A1() : pimpl(new Impl()) {}
A1::~A1() { delete pimpl; }
0348デフォルトの名無しさん
2010/10/20(水) 22:31:54VS2010でも通るけど・・・?どっか違うところ間違ってんじゃね?
0349デフォルトの名無しさん
2010/10/20(水) 22:36:45VC10でも通ったぞ
通らないならエラーメッセージくらい書けっての
More C++ Idiomsのいくつかは標準やtr1、0xのライブラリの実装でも
使われてる技法だから、知ってても悪くないと思うけどね
Boostでは当然に使われているものもあるね
0350デフォルトの名無しさん
2010/10/20(水) 22:40:22逆にいうと利点を感じないのは素人の証
0351デフォルトの名無しさん
2010/10/20(水) 22:46:22誰が使うんだよこれっていうイディオムは割とたくさんあると思うぞ
0352デフォルトの名無しさん
2010/10/20(水) 22:47:46インテリセンスはエラー出すけど、コンパイルは通るな。
0353デフォルトの名無しさん
2010/10/20(水) 23:01:26Include Guard Macro とか Non-copyable Mixin とかも?
0354デフォルトの名無しさん
2010/10/20(水) 23:15:220355デフォルトの名無しさん
2010/10/20(水) 23:27:09効率上げるためのイディオムだろう
0356デフォルトの名無しさん
2010/10/20(水) 23:34:320357デフォルトの名無しさん
2010/10/20(水) 23:53:14ライブラリのユーザーだまくらかしてまで制限加えて、果たして効率上がってるのかなぞ
0358デフォルトの名無しさん
2010/10/20(水) 23:59:580359デフォルトの名無しさん
2010/10/21(木) 00:33:53有名な所ではstd::shared_ptrやstd::functionのブーリアンコンテキスト
Boostでは他にもいろんな所で使われてる
0360デフォルトの名無しさん
2010/10/21(木) 01:06:51順に決めていきたいです。
一番大きな四角形を作れる4点→その4点を除いた一番大きな(ry→点が3点以下になるまで繰り返し
みたいな感じ。図で表すとこの画像のような感じで4点の組み合わせを決めたい
何か出来るだけ効率よく4点の組み合わせを選んでいく方法教えてください
ttp://skm.vip2ch.com/-/hirame/hirame123032.png
0361デフォルトの名無しさん
2010/10/21(木) 01:35:13そんな複雑か?
0362デフォルトの名無しさん
2010/10/21(木) 10:13:39どの程度「効率」良くする/なるかは問題の規模に依ると思うが、まず数が少ない
ならその単純なアルゴリズムでも良いんじゃないか?
次に一つ考えられるのは、今のしらみつぶしに脱出条件として、全体の領域を
見て外の点(選ぶ順序は工夫いるかも)からトライしていって、
他の点が全て領域の中に入ったら次へ、と再帰的に
(ただ重なる領域で比較もありうるからしらみつぶしがデフォルトで脱出条件)
真面目に考えてないからもっと賢い方法もあるだろう
もっと色々「改良」考えられるだろうけど、凝った事しだすと
アルゴリズム的にもコーディング的にもミスしやすくなるから問題の規模
と必要性に応じてどこまでするか考えたら?
0363デフォルトの名無しさん
2010/10/21(木) 13:21:500364デフォルトの名無しさん
2010/10/21(木) 13:58:38上記のホームページにあるソースコードのstruct BaseConstructor { BaseConstructor(int=0) {} };
は何の役に立ってるんですか?
0365デフォルトの名無しさん
2010/10/21(木) 14:13:00Number::Number() と区別するのに使われてるみたい。
にしても、キモいコードだな。参照カウンタいっこ無駄になってるし。
こんなごく普通の継承関係( is-a 関係)を「代数的階層」とか
仰々しい名前で呼ぶ意味もわからん。
0366デフォルトの名無しさん
2010/10/21(木) 14:29:390367デフォルトの名無しさん
2010/10/21(木) 14:57:42�@適当なアルゴリズムで最大ではないけど比較的大きい四角形を見つける
�Aその内部の点をすべてひとまず除外する
�B(�@〜�A)を適当な回数繰り返す
�C残った僅かな点で総当りして最大を決める
�D最大の四角形を確定して点を集合から削除する
�E点がなくなるまで繰り返す
0368デフォルトの名無しさん
2010/10/21(木) 14:59:39が全然分からないのですが
なんでoperator=がswapなんですか?
0369デフォルトの名無しさん
2010/10/21(木) 15:08:34全部の頂点が円周上に並んでたら、どの4点を選んでも除外される頂点は存在しない
オーダー的にはただの総当たりと変わらないぞ
0370デフォルトの名無しさん
2010/10/21(木) 15:26:41最悪のケースを例示するだけじゃ議論の意味は無い
確率や平均ケースとの比較も交えて初めて問題点を議論する価値が生まれる
0371デフォルトの名無しさん
2010/10/21(木) 15:46:43解説が不親切過ぎるw
サンプルコードに別のイディオム使って複雑化させ過ぎだし。
こっち見るとかなり単純な話なんだが。
http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#AlgebraicHierarchy
0372デフォルトの名無しさん
2010/10/21(木) 15:55:37xとyの順位の和が一番少ないものと一番大きいもの
xとyの順位の差が大きいもののなかでx,yの順位が小さいもの
計4点を頂点として4角形としリストから除外
残りの点で上記を繰り返す
0373デフォルトの名無しさん
2010/10/21(木) 16:43:04計算量について議論するならば最悪のケースは避けては通れない
だからそれを例示するのは十分に意義のある事
0374デフォルトの名無しさん
2010/10/21(木) 16:58:46単にそれっぽい頂点を見つけるだけなら凸包を求めればいい
凸包なら�Dの完了後定数時間で�Cを開始できるので最終的には適当にやるより速いはず
0375デフォルトの名無しさん
2010/10/21(木) 17:30:06思っていたのですがうまくいきませんでした。
代わりの方法でもう対処しましたが、テンプレートメタでクラスメンバ固定配列の数
を取得するにはどうすればいいでしょうか?(興味本位ですが)
0376デフォルトの名無しさん
2010/10/21(木) 17:48:56「クラスメンバ固定配列の数」とはなんですか?
0377デフォルトの名無しさん
2010/10/21(木) 19:04:53定数時間では無理じゃね?
0378デフォルトの名無しさん
2010/10/21(木) 19:06:54その円周上に配置されるケースがどれぐらいの頻度で出るかが問題だろう?
ランダム配置でそうなることなんて無視できるぐらい少ないし
意図的に偏らせてあるならそれは問題だから修正しなくてはならない
「そういうケースがある」ってだけじゃほとんど無意味な情報なのよ
あくまで分布とセットじゃないと議論にならんの
いっぺん統計物理とか統計に関わることを勉強してみなさい
分布無しで語れることなんてほとんど何も無いから
0379デフォルトの名無しさん
2010/10/21(木) 19:26:45改行か「。」のどちらかが出てきたら読み込みを終えるようにするにはどうすればいいのでしょうか?
istream& std::getline( istream& is, string& s, Char delimiter )で
delimiterを指定しないとちゃんと改行で止まるのですが、「。」を指定すると改行は無視されてしまいます
0380デフォルトの名無しさん
2010/10/21(木) 20:06:53起きる確率が低い事象を無視するかどうかはアルゴリズムの開発者が決めることじゃない
利用者である>>360が判断すること
だから最悪の評価を提示するのは意味のある事だよ
クイックソートなんかいい例でしょ?
ついでに言うと、このアルゴリズムだと頂点数が十分に多くてかつ頂点が密集している場合、
凸包に含まれる頂点数が慢性的に"僅かな数"とはなりにくいので、平均でも速くない可能性があるよ
総当たり以外の対案を思い付かないから具体的な評価はできないけど・・・
0381デフォルトの名無しさん
2010/10/21(木) 22:19:02しかし、gccに怒られます
構造体をprivateにする方法はありますか?(技術的に興味があるだけ)
0382デフォルトの名無しさん
2010/10/21(木) 22:20:310383デフォルトの名無しさん
2010/10/21(木) 22:21:150384デフォルトの名無しさん
2010/10/21(木) 22:24:06{
struct Gorilla
{
};
};
0385デフォルトの名無しさん
2010/10/21(木) 22:24:09型名と変数名の区別がつくようになれよ
0386381
2010/10/21(木) 22:34:01std::string s1;
static std::string s2;
} test
0387デフォルトの名無しさん
2010/10/21(木) 22:36:420388デフォルトの名無しさん
2010/10/21(木) 22:44:17総当りより少しましな方法。計算量は総当りがO(n^4)、本手法はO(n^3)
指針は、「全ての2点の組について、それら2点を対角とする最大の四角形を求める」
・2点を対角とする最大の四角形の求め方
1. 2点A,Bを結ぶ直線ABを考える
2. ABのそれぞれの側で、ABからの距離が最大となる点C,Dを求める
3. 四角形ACBDがABを対角とする四角形で最大
0389デフォルトの名無しさん
2010/10/22(金) 01:11:26ありがとう。想定しているのは点1000個ぐらいで点の更新とこの処理を高速で繰り返し
行ないたい。って状況です
とりあえずレスくれたの参考に簡単なのから作ってみる
プログラミングやりだしてからもっと数学真面目に勉強しておくべきだったと感じるね
0390デフォルトの名無しさん
2010/10/22(金) 01:11:37例外安全を保証するための定番の書きかたなんだけど、
このコードでは冗長なだけだね。
0391デフォルトの名無しさん
2010/10/22(金) 14:27:59だたし最も少ない使用数とする。
この問題とけるひといませんか?
0392デフォルトの名無しさん
2010/10/22(金) 14:29:160393デフォルトの名無しさん
2010/10/22(金) 14:30:11ある数値の入った変数 x, 演算子 + - ~ & | だけを使用して1を作れ。
だたし最も少ない使用数とする。
この問題とけるひといませんか?
0394デフォルトの名無しさん
2010/10/22(金) 14:31:32使っていいものをはっきりと頼む。
まぁ、xを二回使っていいなら>392のようにx-xでいいな。
0395デフォルトの名無しさん
2010/10/22(金) 14:32:32演算子も何回でも良いです。
0396デフォルトの名無しさん
2010/10/22(金) 14:39:300397デフォルトの名無しさん
2010/10/22(金) 14:40:120398デフォルトの名無しさん
2010/10/22(金) 14:40:250399デフォルトの名無しさん
2010/10/22(金) 14:40:390400デフォルトの名無しさん
2010/10/22(金) 14:41:400401デフォルトの名無しさん
2010/10/22(金) 14:42:060402デフォルトの名無しさん
2010/10/22(金) 14:42:56又は
-(x|~x)
0403デフォルトの名無しさん
2010/10/22(金) 14:45:250404デフォルトの名無しさん
2010/10/22(金) 17:31:510405デフォルトの名無しさん
2010/10/22(金) 17:37:570406デフォルトの名無しさん
2010/10/22(金) 22:53:59クラスメンバ固定配列って int a[100] とかがクラス内で定義されてるってことか?
その要素数が知りたいってこと?
クラスから返却値として返して通常の配列と同じように扱えばいい気がするけど
それじゃだめなのかな
0407デフォルトの名無しさん
2010/10/23(土) 00:10:16TMPで…ってことなので
int a[100] があったときに countof<a>::value で配列の要素数が得られる
とかじゃね?
0408デフォルトの名無しさん
2010/10/23(土) 01:12:10inlineキーワードが付いたコンストラクタ
0409デフォルトの名無しさん
2010/10/23(土) 01:27:13オレもそのように解釈してるよ
返却値ってのはメタ関数に渡すためにクラスから配列の型をtypedefで渡せってこと
その例でいくとaを渡しても多分無理な気がするから
直接型を渡すしかないんじゃないかな
http://codepad.org/bfeSK7W7
こんなことするよりか要素数を定数で持ったほうが早いとは思うけど
0410デフォルトの名無しさん
2010/10/23(土) 11:28:46http://www.ustream.tv/channel/boostkansai
0411デフォルトの名無しさん
2010/10/23(土) 11:30:26今時の処理系ではinlineキーワード自体が無意味。
0412デフォルトの名無しさん
2010/10/23(土) 11:44:25http://codepad.org/3VGxIJXI
0413デフォルトの名無しさん
2010/10/23(土) 12:28:46それって一応テンプレート関数なんですか?
関数で中カッコがないのは初めて見ました
0414デフォルトの名無しさん
2010/10/23(土) 12:48:030415デフォルトの名無しさん
2010/10/23(土) 13:13:59面積を最大にする四角形の各頂点は
与えられた点の中でx座標かy座標が
最大か最小になるんじゃないかな。
感覚的には正しそうだけど、ちゃんと証明
しないといけない。
これが証明できれば候補が極端に絞られるね。
0416デフォルトの名無しさん
2010/10/23(土) 13:16:36ちがう
0417デフォルトの名無しさん
2010/10/23(土) 13:19:190418デフォルトの名無しさん
2010/10/23(土) 14:47:59配列の要素数ではなく
class xxx{
int a[10]:
char b[20];
long b[30]:
}
この場合の固定配列の数は3です。
まさしく固定配列の数なんです。
0419デフォルトの名無しさん
2010/10/23(土) 14:52:090420デフォルトの名無しさん
2010/10/23(土) 15:23:090421デフォルトの名無しさん
2010/10/23(土) 16:44:20配列の宣言数に依存した動きをするのか
なかなか予想できない挙動だなw
0422デフォルトの名無しさん
2010/10/23(土) 19:27:07記事を読んだのですが、依存関係とは何を指し示しているのですか?
0423デフォルトの名無しさん
2010/10/23(土) 19:40:100425デフォルトの名無しさん
2010/10/23(土) 20:30:31たとえば、クラスAを定義している a.h と、Aを使用する b.h があるとする。
b.h で A を使うためには a.h をインクルードすればいいんだが、そうすると a.h を
変更したとき、a.h と b.h をインクルードしているファイル全てに影響が及ぶ。
それらのファイル全てが再コンパイルされるので、コンパイル時間が長くなる。
なので、b.h で a.h をインクルードする代わりに、class A の前方宣言を行う。
#include "a.h" を消して、 class A; という記述を加えるわけだ。
そうすると、a.h を変更しても、b.h やそれをインクルードしているファイルには
影響が及ばなくなり、再コンパイルの時間も短くなる。
0426デフォルトの名無しさん
2010/10/23(土) 20:32:510427デフォルトの名無しさん
2010/10/23(土) 20:35:25class B {
friend ?? ←ココ
};
AがBのprivateメンバにアクセスできるようにしたいのですが、前方宣言したテンプレートクラスを
friend宣言するには、どのように記述すればよいのでしょうか?
0428デフォルトの名無しさん
2010/10/23(土) 20:47:54http://codepad.org/CMaqow6S
0429デフォルトの名無しさん
2010/10/23(土) 20:56:160430デフォルトの名無しさん
2010/10/23(土) 20:57:240431デフォルトの名無しさん
2010/10/23(土) 20:57:42インクルードする手間を減らす為のもの?
0432デフォルトの名無しさん
2010/10/23(土) 20:58:490433デフォルトの名無しさん
2010/10/23(土) 21:02:19そこに登録されたヘッダーが1つ変わっただけで
全然関係ないところもリビルドされちゃうんじゃないかな
0435デフォルトの名無しさん
2010/10/23(土) 22:51:46基本はそれでいいんだよ。A.hを使いたいならA.hをインクルードするだけでA.hが使うB.hとかC.hとか自動的にインクルードされるから。使うのが楽
ライブラリなら変更頻度も低いはず。で問題が起きたら別ければいいの
名前がぶつかる→名前空間を使ってください。
ビルド時間が延びる→pimplを使ってヘッダの依存を減らしてください。
0436デフォルトの名無しさん
2010/10/24(日) 00:25:43ほぼ完成されたライブラリで、ユーザーの利便性のために提供するなら悪くないと思う。
でもそれをライブラリ内でも使うのはやめといたほうがいいよ。
修正→コンパイル→テストのサイクルに悪影響を与える可能性が高いから。
0437デフォルトの名無しさん
2010/10/24(日) 00:26:490438デフォルトの名無しさん
2010/10/24(日) 01:40:14ありがとうございます。
0439デフォルトの名無しさん
2010/10/24(日) 08:43:07こういうクソったれなテクニックが山ほどあるところがC++のクソなところ。
0440デフォルトの名無しさん
2010/10/24(日) 09:24:050441デフォルトの名無しさん
2010/10/24(日) 12:38:14それがあるから「クソ」ということも無いだろ
0442デフォルトの名無しさん
2010/10/24(日) 12:48:40template <class T, unsigned N>
inline size_t Elems(T const (&)[N])
{
return N;
}
0443デフォルトの名無しさん
2010/10/24(日) 12:49:56それではコンパイル時にサイズ取れぬぅ!
0444デフォルトの名無しさん
2010/10/24(日) 12:58:12constexpr早く来い
0445デフォルトの名無しさん
2010/10/24(日) 13:03:310447デフォルトの名無しさん
2010/10/24(日) 15:53:56つまり、スタック領域に確保されてしまうと、スタックオーバーフローを起こす可能性があるので、
心配しているんです。
0448デフォルトの名無しさん
2010/10/24(日) 15:55:190449デフォルトの名無しさん
2010/10/24(日) 15:56:380450デフォルトの名無しさん
2010/10/24(日) 16:08:410451デフォルトの名無しさん
2010/10/24(日) 16:08:46template <class T> void func(T obj);
これに参照を渡せるようにしたいから有るって聞いたんだけど
template <class T> T & ref(T & r) { return r; }
func(ref(obj));
こうしてもfunc<T &>が呼ばれるからいちいちreference_wrapperにしなくてもいいと思うんだけど…
0452デフォルトの名無しさん
2010/10/24(日) 16:10:550453デフォルトの名無しさん
2010/10/24(日) 17:12:57http://codepad.org/MikKgG1W
0454デフォルトの名無しさん
2010/10/24(日) 17:16:460455デフォルトの名無しさん
2010/10/24(日) 17:21:28あ、普通に参照渡してもコピーされるのね…なんか勘違いしてた
どうもですた
0456デフォルトの名無しさん
2010/10/24(日) 17:21:46配置new
0457デフォルトの名無しさん
2010/10/24(日) 19:06:38Java もやってる?Java だと挙動違うから混乱しやすい
0458デフォルトの名無しさん
2010/10/24(日) 19:29:590459デフォルトの名無しさん
2010/10/24(日) 19:31:310460デフォルトの名無しさん
2010/10/24(日) 19:33:45そのメンバのクラスのコンストラクタって実行されますか?
実行されるとしたら、どのタイミングで実行されますか?
0461デフォルトの名無しさん
2010/10/24(日) 19:35:15クラス内の→クラス内に
が正しいです。
0462デフォルトの名無しさん
2010/10/24(日) 19:37:420463デフォルトの名無しさん
2010/10/24(日) 19:38:570464デフォルトの名無しさん
2010/10/24(日) 19:43:430465デフォルトの名無しさん
2010/10/24(日) 19:44:330466デフォルトの名無しさん
2010/10/24(日) 19:46:25:now(0),width(0),height(0){}
こんな感じ
0467デフォルトの名無しさん
2010/10/24(日) 19:47:430468デフォルトの名無しさん
2010/10/24(日) 19:48:570469デフォルトの名無しさん
2010/10/24(日) 19:52:510470デフォルトの名無しさん
2010/10/24(日) 19:53:15問題のメンバはどれなんだ
質問してる内容についてのことが何もわからないぞ
0471デフォルトの名無しさん
2010/10/24(日) 20:01:09http://codepad.org/UxA3ZeAX
printf挟むなりデバッガ使うなりしようぜ
0472デフォルトの名無しさん
2010/10/24(日) 20:05:24!?
0473デフォルトの名無しさん
2010/10/24(日) 20:08:06やっぱり実行されますよね。
どっかで値が変わってしまってるようなので、徹底的に調べます。
0474デフォルトの名無しさん
2010/10/24(日) 21:37:090475デフォルトの名無しさん
2010/10/24(日) 21:40:020477デフォルトの名無しさん
2010/10/24(日) 21:58:31どのメソッドにconst付けるべきか判断できないなら、
それは設計に失敗しているかもしれない
0478デフォルトの名無しさん
2010/10/24(日) 22:04:20データ構造を考えるようになると、いろいろと。
0479デフォルトの名無しさん
2010/10/26(火) 21:53:18フレームワーク使うと、裏でいろいろやってくれているから発生しな気がするんだけど
0480デフォルトの名無しさん
2010/10/26(火) 22:13:030481デフォルトの名無しさん
2010/10/26(火) 22:51:59そうとは限らないぞ
巨大な配列や巨大なクラスをローカル変数に取るとスタックがパンクする事がある
0482デフォルトの名無しさん
2010/10/26(火) 22:52:290483デフォルトの名無しさん
2010/10/26(火) 22:56:07俺も再帰覚えたての頃やらかしたわ
0484デフォルトの名無しさん
2010/10/26(火) 22:58:14それ以前に二次元配列あたりでぶちあたるはずだが
0485デフォルトの名無しさん
2010/10/26(火) 22:58:53その後は使わないんですよね?
0486デフォルトの名無しさん
2010/10/26(火) 22:59:26再帰書いても滅多なことではオーバーフロー起こさないよね
0487デフォルトの名無しさん
2010/10/26(火) 23:15:05ライブラリを作成してみようとしたところで詰まってしまいました
調べてみても納得いく説明があるサイトが見つからず、他に聞ける人もいなくて困っています
もしかしたらライブラリの解釈も間違っているかもしれないので、1からご教授頂けると助かります
私の中では静的ライブラリ(libファイル)の中には複数のh、cppファイルを内包できて、
ライブラリを利用する関数などの宣言が書かれているhファイルと出来上がったlibファイルをプロジェクトに追加すれば呼び出せる
と考えているのですがどうでしょうか
また、ライブラリの中にクラスを入れたい場合や、ライブラリ内にあるクラス同士での#includeなどの操作、
ひとつのlibファイルに複数のクラスを入れてもいいものなのかどうなのかなど、
全然わからず手探り状態なので、どなたかよろしくお願いします
0488デフォルトの名無しさん
2010/10/26(火) 23:23:13libもリンクしないと使えないし、コンパイルする環境が違うと困る
0489デフォルトの名無しさん
2010/10/26(火) 23:51:070490デフォルトの名無しさん
2010/10/26(火) 23:57:43たとえばライブラリ内に以下の4ファイルを含めてあった場合
foo.h //外部用関数宣言&#include "bar.h"
bar.h //クラス宣言
bar.cpp //クラス実装 #include "bar.h"
この場合は使用するプロジェクトへ追加するファイルはfoo.libとfoo.hの二つで、
プロジェクト側でのリンクが必要、ということでいいのでしょうか?
0491デフォルトの名無しさん
2010/10/26(火) 23:57:46API の考え方ならその API のスレ
0492デフォルトの名無しさん
2010/10/26(火) 23:58:370493デフォルトの名無しさん
2010/10/26(火) 23:59:23ミスた、3ファイルの間違いです修正
0494デフォルトの名無しさん
2010/10/27(水) 00:02:37叩かれて戻ってきたらすいません。
0495デフォルトの名無しさん
2010/10/27(水) 00:44:46全部にゲッタメンバをつけるのはなんか変なので
0496デフォルトの名無しさん
2010/10/27(水) 00:49:320497デフォルトの名無しさん
2010/10/27(水) 01:09:34内部状態なんで外部から変更されたくないけど、観測する必要があるので
0498デフォルトの名無しさん
2010/10/27(水) 01:12:430499デフォルトの名無しさん
2010/10/27(水) 01:13:40何故、自分で試さないの?
バカなの?死ぬの?
0500デフォルトの名無しさん
2010/10/27(水) 01:21:430501デフォルトの名無しさん
2010/10/27(水) 08:13:300502デフォルトの名無しさん
2010/10/27(水) 09:09:06何を返すの?
0503デフォルトの名無しさん
2010/10/27(水) 10:15:17やってみればいいじゃん
0504デフォルトの名無しさん
2010/10/27(水) 10:22:21スコープを制限したいんですが、関数内に関数を書くことは出来ませんよね?
なんか近い方法ないでしょうか?
0505デフォルトの名無しさん
2010/10/27(水) 10:23:16期待しているぞ>>582
お前ならできる>>582
0506デフォルトの名無しさん
2010/10/27(水) 10:23:58○>>502
実際やってみた
int main()
{
std::vector<int> vi;
std::vector<int>::const_iterator vic = vi.begin(), vic2 = vi.end();
if (vic == vic2)
std::cout << "vic == vic2" << std::endl;
}
この結果が vic == vic2 なので、viの中身は空である事を考慮すれば、vicの指す
要素は無効であるが、vic2は正しく空のコンテナの次を指しており、vicは実質的に
それと等しく初期化されている事がわかる
本当の所はどうなのかは規格票によらなければならないが、まあだいたい予想通り
と言う事が出来る
0507デフォルトの名無しさん
2010/10/27(水) 10:28:42構造体とかクラスを関数内で定義すれば書ける。
0508デフォルトの名無しさん
2010/10/27(水) 10:30:31関数オブジェクトという奴でしょうか?
ただそれだとメソッド内クラスから元のクラスのメンバが参照できないため
invaild use of nonstatic data memberエラーになってしまうんです
0509デフォルトの名無しさん
2010/10/27(水) 10:36:20プロジェクトを作成する手間が省けたわ
0510デフォルトの名無しさん
2010/10/27(水) 10:48:17C++0xのラムダ式をmutableにして無理矢理使う
0511デフォルトの名無しさん
2010/10/27(水) 11:07:10いいですね、これ
コンパイラも対応しているみたいですし
ありがとうございます
0512デフォルトの名無しさん
2010/10/27(水) 11:23:20もう遅いけどそういう場合はthisポインタ渡しとけばいいんじゃない?
0513デフォルトの名無しさん
2010/10/27(水) 11:28:510514デフォルトの名無しさん
2010/10/27(水) 11:29:31http://codepad.org/mM6aROvP
foo::func()内でbar::func()を宣言して、bar::func()内でfoo::Valueにアクセスしている。
0515デフォルトの名無しさん
2010/10/27(水) 15:09:53頭おかしいやつが登場したww
private指定したいわけじゃなくて??
0516デフォルトの名無しさん
2010/10/27(水) 15:19:49観測したい変数を全部構造体でまとめて、
それをconst参照するゲッタを作ればいい
ようはいちいちゲッタ作るの面倒って話でしょ?
0517デフォルトの名無しさん
2010/10/27(水) 15:19:50・雪駄は勿論、下駄は必要なだけで充分。
・基本的に、下駄を公開するのは設計に問題がある場合が多い。本来なら適切な名前のメソッドで置き換えられるだろう。
・当然、雪駄については下駄以上に生で晒すのはおかしい。
という認識がないことじゃないか。
結論:
下駄や雪駄も生足同様、安易に公開するもんじゃない。
0518デフォルトの名無しさん
2010/10/27(水) 15:21:41なにかおかしくね?
0519デフォルトの名無しさん
2010/10/27(水) 15:25:060520デフォルトの名無しさん
2010/10/27(水) 15:29:23「装備の一覧を見せてくれ。」
「一番いいのはどれだ。」
「そいつを頼む。」
下駄を使わない場合。
「一番いいのを頼む。」
0521デフォルトの名無しさん
2010/10/27(水) 15:39:500522デフォルトの名無しさん
2010/10/27(水) 16:41:43内部状態を外部から観測してなにするの?
0523デフォルトの名無しさん
2010/10/27(水) 16:41:460524デフォルトの名無しさん
2010/10/27(水) 16:46:410525デフォルトの名無しさん
2010/10/27(水) 16:46:550526デフォルトの名無しさん
2010/10/27(水) 17:45:13コンパイル防壁も兼ねてProxyでも使っとけばええんちゃうの?
class Logic
{
int x;
public:
class ProxyForView
{
Logic const * mpL;
public:
ProxyForView(Logic const * pL) : mpL(pL) {}
int x(void) const { return mpL->x; }
};
ProxyForView proxy(void) const { return ProxyForView(this); }
};
int main(void)
{
Logic l;
Logic::ProxyForView p(l.proxy());
std::cout << p.x() << std::endl;
return 0;
}
0527デフォルトの名無しさん
2010/10/27(水) 17:53:02読み込みに失敗したら強制終了させたいんです。
でもコンストラクタって、戻り値返せないじゃないですか。
そのときって、exit(0)でkillするしかないんですか?
exitした時の動作って、ウィンドウとかちゃんと終了してくれるんですか?
0528デフォルトの名無しさん
2010/10/27(水) 17:54:28・initメンバ
0529デフォルトの名無しさん
2010/10/27(水) 17:54:560530デフォルトの名無しさん
2010/10/27(水) 17:55:140531デフォルトの名無しさん
2010/10/27(水) 18:05:10考えるしかなさそうだな。わかったよ。
0532デフォルトの名無しさん
2010/10/27(水) 18:52:21コンパイルエラーが出るんですけど
エラー E2247 readonly1.cpp 19: 'Logic::x' はアクセスできない (関数 Logic::ProxyForView::x() const )
0533デフォルトの名無しさん
2010/10/27(水) 19:04:44別にまずくないよ。
std::vectorだってコンストラクタで失敗すれば例外投げるだけでしょ。
0534デフォルトの名無しさん
2010/10/27(水) 19:19:31struct a
{
private: int b;
public: const int& c;
a() : c(b) { }
};
const_cast されたらアウトだけどね
0535デフォルトの名無しさん
2010/10/27(水) 19:21:50ちゃんとpublicにしてるか?
0536デフォルトの名無しさん
2010/10/27(水) 19:24:40>>526をコピペしたんですけど
今からEclipse+CDTでもやってみます
0537デフォルトの名無しさん
2010/10/27(水) 19:25:07環境は?
0538デフォルトの名無しさん
2010/10/27(水) 19:27:36MinGW4.5.1ではコンパイル出来ました
ECC6.3.0のバグらしいです
0539デフォルトの名無しさん
2010/10/27(水) 20:05:45コンストラクタで例外は投げてもいいよ。
でも例外のへんな使い方はしないでね。
0540デフォルトの名無しさん
2010/10/27(水) 20:48:38今のところ普通に動いてるが、もっとでかくなる予定だから問題あるなら早めに修正しときたい。
0541デフォルトの名無しさん
2010/10/27(水) 20:51:110542デフォルトの名無しさん
2010/10/27(水) 20:51:210543デフォルトの名無しさん
2010/10/27(水) 20:52:480544デフォルトの名無しさん
2010/10/27(水) 20:57:04newしたかをosが監視して、プロセスの終了とともにOSがヒープ領域を解放すればいいだけじゃないですか
0545デフォルトの名無しさん
2010/10/27(水) 20:58:22へぼだから
0546デフォルトの名無しさん
2010/10/27(水) 21:00:130547デフォルトの名無しさん
2010/10/27(水) 21:03:48OS って前提があるようだが
どんな範囲の話がしたいんだ?
0548デフォルトの名無しさん
2010/10/27(水) 21:04:07> 何故メモリーリークが発生するのですか?
解放してないからです。
> newしたかをosが監視して、プロセスの終了とともにOSがヒープ領域を解放すればいいだけじゃないですか
普通は解放してます。
0549デフォルトの名無しさん
2010/10/27(水) 21:05:550550デフォルトの名無しさん
2010/10/27(水) 21:07:53Amiga以外にプロセスの終了時に開放しないOSが有んのかよ
0551デフォルトの名無しさん
2010/10/27(水) 21:09:490552デフォルトの名無しさん
2010/10/27(水) 21:17:41言語仕様的に必要性がない
0554デフォルトの名無しさん
2010/10/27(水) 21:25:22普通は入れ子のクラスは親のクラスのプライベート領域にもアクセス出来るんだけど
古いコンパイラだと対応してないらしい
そういう時はProxyをfriendにして誤魔化してくれ
0555デフォルトの名無しさん
2010/10/27(水) 22:23:26方法を教えてください
0556デフォルトの名無しさん
2010/10/27(水) 22:24:010557555
2010/10/27(水) 22:31:280558デフォルトの名無しさん
2010/10/27(水) 22:40:530559デフォルトの名無しさん
2010/10/27(水) 22:42:340560デフォルトの名無しさん
2010/10/27(水) 22:47:11じゃあ最初からなければいいのに、なんであるの?
0561デフォルトの名無しさん
2010/10/27(水) 22:49:25typeid と dynamic_cast さえ使わなければ RTTI は使ってないとか思ってるだろ
0562デフォルトの名無しさん
2010/10/27(水) 22:51:040563デフォルトの名無しさん
2010/10/27(水) 22:53:480564デフォルトの名無しさん
2010/10/27(水) 22:54:210565デフォルトの名無しさん
2010/10/27(水) 22:59:420566デフォルトの名無しさん
2010/10/27(水) 23:00:560567555
2010/10/27(水) 23:02:30ありがとうよ
ただ単に少しテストしてみたい事があっただけ
大きいプログラムを作るつもりはない
0568デフォルトの名無しさん
2010/10/27(水) 23:07:560569デフォルトの名無しさん
2010/10/27(水) 23:13:330570デフォルトの名無しさん
2010/10/27(水) 23:16:200571デフォルトの名無しさん
2010/10/27(水) 23:26:040572デフォルトの名無しさん
2010/10/28(木) 00:07:44こういうこと言う人、まだ居るんだ。根深い迷信だな。
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html
0573デフォルトの名無しさん
2010/10/28(木) 00:09:18virtual 使ったら RTTI 使ってることになるの?なんで?
0574デフォルトの名無しさん
2010/10/28(木) 00:13:59RTTI って本質的に何だと思う?
ちなみに禿は virtual の新設に始めは懐疑的だったらしいよ
0575デフォルトの名無しさん
2010/10/28(木) 00:14:530576デフォルトの名無しさん
2010/10/28(木) 00:16:150577デフォルトの名無しさん
2010/10/28(木) 00:18:12設計ミスかどうかを論じている
0578デフォルトの名無しさん
2010/10/28(木) 00:22:240579デフォルトの名無しさん
2010/10/28(木) 00:25:55どーでもいいことを干渉しにくる頭を製造ミスされた奴がいるな
0580デフォルトの名無しさん
2010/10/28(木) 00:26:540581デフォルトの名無しさん
2010/10/28(木) 00:29:19じゃ>>560-561あたりの反論は、ふかく考えずに勢いで言っただけでぜんぜん成り立たないってことですね。
0582デフォルトの名無しさん
2010/10/28(木) 00:31:17もういいよ
0583デフォルトの名無しさん
2010/10/28(木) 00:31:220584デフォルトの名無しさん
2010/10/28(木) 00:33:410585デフォルトの名無しさん
2010/10/28(木) 00:34:37ほとんどだろうけど、RTTIはそれとは逆の向きに使われることが多そう。
ぜんぜん違う機能だと思う。
実行時に動作が決まるってところで同じだって言ってるのだろうか。
それは見当違いだよな。
0586デフォルトの名無しさん
2010/10/28(木) 00:35:04どんだけ失言こいても自分個人の品位と関係ないし
0587デフォルトの名無しさん
2010/10/28(木) 00:35:58これはかっこ悪い。
0588デフォルトの名無しさん
2010/10/28(木) 00:38:53これは RTTI だと思う?
struct a
{
union { void* b; char* c; double* d; };
enum { e, f, g } h; //here!!
};
0589デフォルトの名無しさん
2010/10/28(木) 00:39:10自分自身には関係あるだろ。他人にうかがい知れないだけで。
0590デフォルトの名無しさん
2010/10/28(木) 00:41:47なるほどね、それで必死になるのがねらーの習性なわけね
ぱぴこしてきたのが誰だったかによって効果が色々って言ってあげれば
少しは話に入ってこれるかな
0591デフォルトの名無しさん
2010/10/28(木) 00:41:59RTTIって「自分はこう思う」って勝手に定義していいものなの?
0593デフォルトの名無しさん
2010/10/28(木) 00:45:00じゃ「これはRTTIか?」とか聞くなよ。
0594デフォルトの名無しさん
2010/10/28(木) 00:46:54では「設計ミスか?」にしようか
ただし元々の RTTI の定義と全く無関係でもないんだよな
0595デフォルトの名無しさん
2010/10/28(木) 00:48:24>>589 の言っていることは、
> それで必死になるのが
とは、むしろ逆だと思うんだが。
冷静さを失って書けば書くほど品位は貶められるんだから。
0596デフォルトの名無しさん
2010/10/28(木) 00:49:14「はぁ? じゃこれはどうよ」ってunion持ち出すって、支離滅裂だろ。
0597デフォルトの名無しさん
2010/10/28(木) 00:49:21誰の?
0598デフォルトの名無しさん
2010/10/28(木) 00:50:18おまえが読めていないだけ
とぼけているのではなくガチなら残念ながら相手にならない
0599デフォルトの名無しさん
2010/10/28(木) 00:52:04失言した者、だろうな
0600デフォルトの名無しさん
2010/10/28(木) 00:53:22おまえ説明できないから、意味深げに言ってるだけだろ。
モゴモゴ言ってないで、単刀直入に説明してみろよ。
どうせできないんだろうけど。
0601デフォルトの名無しさん
2010/10/28(木) 00:56:32そりゃちゃうやろ
失言した者という抽象概念が指すオブジェクト個々により
冷静さの有無により品位が下がったり下がらなかったりするわけで
0602デフォルトの名無しさん
2010/10/28(木) 00:57:21単刀直入に言ったよ
具体的なコードまで晒してね
で、読めてない人がいるわけで
0603デフォルトの名無しさん
2010/10/28(木) 01:03:29いやぜんぜん言ってないね。
「RTTIが必要ってことは設計ミスだね」
↓
「unionはRTTIだと思う?」
質問に質問で返してるだけで、説明らしきものはまったくない。
0604デフォルトの名無しさん
2010/10/28(木) 01:04:46C++は静的型付けによりその堅牢性と最適化を期待できるから
だからそれを害しない程度にRTTIを使用する分には問題ない
過度な実行時型解決は静的型付けの堅牢性とパフォーマンスを阻害してしまう
それではC++を使用する意味がない
一昔前のハードが貧弱だった頃は、RTTIのコストがバカにならないという時代もあった
当時はRTTIがデフォルトでは使用できないという環境もあったくらい
そのさらに一昔前は仮想関数のコストがバカにならないという時代もあった
MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残
0605デフォルトの名無しさん
2010/10/28(木) 01:05:04おまえさんの言い方に合わせて言うなら
enum は RTTI か、だったはずなんだが
//すら読めてないのな
0606デフォルトの名無しさん
2010/10/28(木) 01:06:36これは virtual が悪いんじゃなくメッセージが 32bit もあることに原因があるわけで
0607デフォルトの名無しさん
2010/10/28(木) 01:09:15> MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残
これは単にメッセージに全部仮想関数を割り当てるとvtblが大きくなりすぎるから。
べつに仮想関数のパフォーマンスどうこうって話じゃない。
0608デフォルトの名無しさん
2010/10/28(木) 01:13:05またそれはちがう、これは違うみたいな話かよ。
もうこうやって人を煙にまく(本人はまいたつもり)みたいなのが習い性に
なってるんだろうな。
0609デフォルトの名無しさん
2010/10/28(木) 01:13:24コストって意味にはその意味も含んでいるんだけどね
0610デフォルトの名無しさん
2010/10/28(木) 01:15:320611デフォルトの名無しさん
2010/10/28(木) 01:16:14そういう面も含んでるならいまだってメッセージごとに仮想関数に割り当てるとか、そんな設計しないだろ。
0612デフォルトの名無しさん
2010/10/28(木) 01:17:09おまえ enum って書かれた瞬間に switch か else if と来ない?
つまり実行時判定を連想するかってのが読めてる読めてないってことだぜ
0613デフォルトの名無しさん
2010/10/28(木) 01:20:32結局なんも説明しないわけでしょ?
実行時に、型が決まるものは全部いっしょくた程度の考えしかないのは
分かったから別に説明しなくてもいいけど。
0614デフォルトの名無しさん
2010/10/28(木) 01:22:28それで?
unionにラベルがふってあったら、そういう使い方しか
思いつかないでしょ。ふつーに。
0615デフォルトの名無しさん
2010/10/28(木) 01:23:00本人でない私に言われても困るんだけど
0616デフォルトの名無しさん
2010/10/28(木) 01:24:22union に過剰反応されるとは思わなかった
じゃあいい、あの union は一切忘れてくれ
その隣にあった enum だけで論じよう
実行時に判定する設計は全てミスか?
0617デフォルトの名無しさん
2010/10/28(木) 01:26:42いちいち断らないが勝手に落ちるぞ
0618デフォルトの名無しさん
2010/10/28(木) 01:27:30また支離滅裂路かよ。
enumだけにしたら、ますます関係なくなるじゃん。
むしろ実行時に型がどうこうだったらunionが本質じゃん。
0619デフォルトの名無しさん
2010/10/28(木) 01:29:45そうだよ、だからそのために union を書いた
だがあくまで核心は enum で // にそう書いた
0620デフォルトの名無しさん
2010/10/28(木) 01:34:210621デフォルトの名無しさん
2010/10/28(木) 01:35:280622デフォルトの名無しさん
2010/10/28(木) 01:36:32実行時に型をどうこうみたいな話で、unionとそれの型を選択するenumと
どっちが本質かとか勝手にこだわって、相手がunionって言ったら、
「おまえわかってねー」って勝手に上げ足とったつもりになって、
ばからしいとおもわねえ?
実行時に型が決まるよな動作は全部いっしょくたって以上の認識でてこないじゃん。
結局。
0623デフォルトの名無しさん
2010/10/28(木) 01:37:17もちろんvirtualあるケースで。
newなどで確保したメモリの中にあるの?
Yesなら後ろ?それとも前?
0624デフォルトの名無しさん
2010/10/28(木) 01:38:39断ってるじゃん。
逃げたとか思われるのがいやなんだろ?
>>586みたいなこと、かっこつけて言うなよ。
0625デフォルトの名無しさん
2010/10/28(木) 01:41:19揚げ足? そう誤解されそうなことさえ言ったつもりはないが
もう >>616 の時点で核心そのものを言ってるので
あとは俺ぬきでもいいくらいだ
0626デフォルトの名無しさん
2010/10/28(木) 01:41:55やめろー、引き留めるな鬼畜
0627デフォルトの名無しさん
2010/10/28(木) 01:42:18仮想関数用の vtbl に vtbl[-1] として typeid が入ってる実装を見たことがある。
これならコンパイルオプションで RTTI 無効にしたバイナリとも互換性を保つことが
できそうだなー、と勝手に解釈して感心した。
0628デフォルトの名無しさん
2010/10/28(木) 01:44:20まあ、精神防衛で、自分の言ってることを信じ込んでる人とかよく見るしね > 誤解
0629デフォルトの名無しさん
2010/10/28(木) 01:45:090630デフォルトの名無しさん
2010/10/28(木) 01:47:10ありがとう。
そういう実装だった場合virtualでないやつはどうやってtypeid引っ張ってくるんだろう?
そういう使い方をしたことがないから知らないってだけだけど。
0631デフォルトの名無しさん
2010/10/28(木) 01:49:07最近のはオプションじゃなくてデフォでついてるの?
0632デフォルトの名無しさん
2010/10/28(木) 01:52:37virtual な関数を持つクラス型以外については、そもそも RTTI に基づく挙動は
必要とされず、すべて静的な型情報で処理される。なので、何の工夫も要らない。
5.2.8 p3 より
> When typeid is applied to an expression other than an lvalue of a polymorphic
> class type, the result refers to a type_info object representing the static type of
> the expression.
0633デフォルトの名無しさん
2010/10/28(木) 01:54:14C++98 の時点から標準でついてる。各コンパイラの実装は知らないけど、たぶん
標準を反映してデフォルトで有効になってるはず。
0634デフォルトの名無しさん
2010/10/28(木) 01:59:21なるほど、別に正確な生成時の型が帰ってくるわけじゃないのか。ありがとう。
0635デフォルトの名無しさん
2010/10/28(木) 02:08:21今はどうかしらないけど。
0636デフォルトの名無しさん
2010/10/28(木) 02:21:31VC6〜VC2003はデフォルトではオフ(GRスイッチ)だったと思う
スイッチ入れて使った記憶がある
2008はデフォルトではオン
2010は特に指定されてないけどdynamic_castが正常に動いてるからオンだと思う
明示的にGRスイッチをオフにしたら警告出てstd::__non_rtti_object投げて異常終了した
0637デフォルトの名無しさん
2010/10/28(木) 03:07:350638デフォルトの名無しさん
2010/10/28(木) 22:05:410639デフォルトの名無しさん
2010/10/28(木) 22:09:010640デフォルトの名無しさん
2010/10/28(木) 22:53:59<Hoge*>ではなく<Hoge>で大丈夫なのですか?
0641デフォルトの名無しさん
2010/10/28(木) 22:55:520642デフォルトの名無しさん
2010/10/28(木) 22:58:22uint32_tをハンドルにしてスマポに管理させたい時とか不便
0643デフォルトの名無しさん
2010/10/28(木) 23:05:140644デフォルトの名無しさん
2010/10/28(木) 23:07:02http://msdn.microsoft.com/ja-jp/library/h4bcz65t(VS.80).aspx
0645デフォルトの名無しさん
2010/10/28(木) 23:07:390647デフォルトの名無しさん
2010/10/28(木) 23:12:44std::auto_ptrとかは正式名称
0648デフォルトの名無しさん
2010/10/28(木) 23:31:05この処理結果って見づらいね
0649デフォルトの名無しさん
2010/10/28(木) 23:35:44cppunitとかでgccとVCで結果が違ってムッとした記憶がある。
0650デフォルトの名無しさん
2010/10/28(木) 23:45:05それは見るもんじゃないよ
あくまでも operator== で比較するだけのためのものだと思った方がいい
0651デフォルトの名無しさん
2010/10/28(木) 23:54:34Yes
0652デフォルトの名無しさん
2010/10/29(金) 01:45:05Foo(int x) {}
private:
Foo &operator=(Foo&);
};
上記のクラスの宣言と初期化を同時に行うとき、
Foo x = 5;
のように書けますが、これは operator= の呼び出しではなく、
Foo x(5);
と書くのと同じ意味になるのだと思います。なぜなら、初期化後に改めて
x = 10;
と書いた場合はマッチする operator= がないのでコンパイルできないからです。
この「宣言と初期化を同時に行うときの=は特別」と言うことを規格で確認したいのですが、
どの項を見ればいいのでしょうか。
0653デフォルトの名無しさん
2010/10/29(金) 02:03:200654デフォルトの名無しさん
2010/10/29(金) 02:23:490655デフォルトの名無しさん
2010/10/29(金) 03:38:45クラスは定義できますか?
0656デフォルトの名無しさん
2010/10/29(金) 03:49:040657デフォルトの名無しさん
2010/10/29(金) 04:10:230658デフォルトの名無しさん
2010/10/29(金) 08:36:16パターンありますか?
0659デフォルトの名無しさん
2010/10/29(金) 11:40:370660デフォルトの名無しさん
2010/10/29(金) 15:53:21しかしヘッダ行[1]とデータの出力行[2]が離れているので、
出力したい項目の追加削除など変更があった場合に
[1]と[2]の2箇所の変更が必要になり、出力項目が多い時はメンテナンスが大変です。
そこで以下のようなクラスを作って楽に管理しようと思いました。【ソース2参照】
使うときはこうします。【ソース3参照】
でも、print_dataというメソッドを実装することって非常に非常に難しいです。
ラムダ式の変数のキャプチャ(?)とかリフレクション(?)とか
マクロをうまく使うとかなんとかして
実現することはできませんか?
同等のことが可能な、スーパープログラマによって書かれたライブラリは存在しませんか?
VC10とgcc4.4で使えるならC++0xの機能や独自拡張を使っていてもかまいません。
疑似コード→ http://codepad.org/Z0j4VE1u
0661デフォルトの名無しさん
2010/10/29(金) 16:13:430662デフォルトの名無しさん
2010/10/29(金) 16:50:25かなりレアだな
0663デフォルトの名無しさん
2010/10/29(金) 16:52:300664デフォルトの名無しさん
2010/10/29(金) 17:19:22取り敢えず、こんなのどう?
http://codepad.org/ZMJP9HtC
ヘッダの数だけきっかりprint_data()を呼ぶって言う制約がつくけど。
0665デフォルトの名無しさん
2010/10/29(金) 21:54:31vector<pair<string,function<string()> vec;
int a;
double b;
vec.push_back(make_pair("a",[&](){return boost::lexical_cast<string>(a);}));
vec.push_back(make_pair("b",[&](){return boost::lexical_cast<string>(b);}));
coust<<vec[0].first<<vec[0].second()<<endl;
coust<<vec[1].first<<vec[1].second()<<endl;
0666デフォルトの名無しさん
2010/10/29(金) 22:10:13struct Foo
{
template<typename T>
Foo& operator<<(const T& rhs)
{
std::cout << rhs;
return *this;
}
} foo;
int main()
{
foo << 1 << "test";
foo << std::endl; // error: no match for ‘operator<<’ in ‘foo << std::endl’
return 0;
}
これ、何でですか?
0667デフォルトの名無しさん
2010/10/29(金) 22:23:03endl のテンプレート実引数が不明
0668デフォルトの名無しさん
2010/10/29(金) 22:31:18だからTが曖昧になっちゃう
0669デフォルトの名無しさん
2010/10/29(金) 22:41:34http://codepad.org/KH5rpOc8
0670デフォルトの名無しさん
2010/10/29(金) 22:52:39ありがとうございます。
試しにdecltype(std::endl)とかやってみるとやっぱりerror: ‘std::endl’ refers to a set of overloaded functionsと怒られますね。
>>669
> std::ostream& (*ENDL)(std::ostream& os)
std::ostream& (&ENDL)(std::ostream& os)
でもよいですよね?(実際に試してみてコンパイルエラーは出てないのですが)
インライン化されるか気になって関数のポインタ取るのに抵抗ありまして。
(実際はその程度は関係ないですか?)
0671デフォルトの名無しさん
2010/10/29(金) 23:30:25凝ったテキスト処理とかやらんからセオリーは知らないけど
ヘッダとやらの項目ごとにデータを溜めてから
一気に書き出した方がいいんじゃないのか?
0672デフォルトの名無しさん
2010/10/30(土) 00:00:04入門書などのクラスの説明で、よく FILE* のラッパークラス CFile があると思います。
class CFile
{
0673デフォルトの名無しさん
2010/10/30(土) 00:01:430674デフォルトの名無しさん
2010/10/30(土) 00:04:14話が高度すぎてついて行けなかった
手元の「C++再考」を読みながら勉強します
0675デフォルトの名無しさん
2010/10/30(土) 00:11:33ちょっと質問です。
入門書などのクラスの説明で、よく FILE* のラッパークラス CFile があると思います。
class CFile
{
public:
bool open();
bool close();
private:
FILE* m_fp;
};
コンストラクタで m_fp を初期化し、
デストラクタで m_fp が有効なら fclose でファイルを閉じています。
よくある例ですが、これ、std::vector に入れれないですよね…。
resize でサイズを増やすだけで、一時オブジェクトのデストラクタが走って
予期せずファイルが close されてしまいます。
解決するには参照カウンタを用意し、
コピーコンストラクタなどを適切に書く必要があると思いますが、
特に Windows なら HWND、HFONT、HBITMAP、など
ハンドルのラッパークラス全てに同じ問題がおきます。
どのように解決するのが普通なのでしょうか?
全てに参照カウンタを準備して管理しなければいけないのでしょうか。
すればいいと言われればその通りなのですが、上記クラスに対して「std::vector には入れれない」という解説が見つからなかったので、
誰もが通りそうな問題なのにおかしいなと思って質問です。よろしくお願いします。
0676デフォルトの名無しさん
2010/10/30(土) 00:25:460677デフォルトの名無しさん
2010/10/30(土) 00:26:59配列のコピーを避けることこそ誰もが通る問題で
C をやらないネイティブ C++ 世代の感覚が異様に見える
0678デフォルトの名無しさん
2010/10/30(土) 00:28:380679デフォルトの名無しさん
2010/10/30(土) 00:31:01通常のコンストラクタの他に
CFile():m_fp(NULL){}
みたいなデフォルトコンストラクタを作っといて
デストラクタで
if(m_fp)fclose(m_fp);
ってやれば当面の問題は解決されるんじゃないの?
0680デフォルトの名無しさん
2010/10/30(土) 00:37:16解決されるわけないだろバカ
0681デフォルトの名無しさん
2010/10/30(土) 00:39:41どうしてvectorに入れたいんだろう?
vector<shared_ptr<CFile>>だと明示的にクローズしないとクローズされなくなるような…
それとも使う度にvectorからは抜くとか、vectorごと捨ててまとめてクローズしたいとかそういうことなの?
0682デフォルトの名無しさん
2010/10/30(土) 00:46:270683デフォルトの名無しさん
2010/10/30(土) 00:49:33読解力の低さと思考停止の早さがひどすぎて回答が難しいよ
もう少し頑張れよ
0684675
2010/10/30(土) 00:51:42C のころはデストラクタもないし、malloc / realloc で何も問題なかったんですよね…。
vector<shared_ptr<CFile> > で解決できそうです。
RAII の解説のところで、コピーコンストラクタなどを private にして
コピーを防いでいる例も見つけましたので、合わせて使おうと思います。
ありがとうございました!
0685デフォルトの名無しさん
2010/10/30(土) 00:55:08いやどういうときに使うものなのか見当がつかないだけだよ
0687デフォルトの名無しさん
2010/10/30(土) 00:56:29FILE*だもんな・・・
0688デフォルトの名無しさん
2010/10/30(土) 00:59:21ゴメン
やっぱboost::ptr_vector駄目だわ
これresizeするとポインタを通してデストラクタを呼ぶためのコンテナなんだよね
だからこの場合は駄目だと思う
0689デフォルトの名無しさん
2010/10/30(土) 01:33:47要するにこういう感じで勝手にデストラクタが呼ばれるといけないわけだよね?
#include <iostream>
#include <boost/ptr_container/ptr_vector.hpp>
class Test {
int i;
public:
Test(int j) : i(j) {}
~Test() { std::cout << "~Test(" << i << ") is called" << std::endl; }
};
int main()
{
boost::ptr_vector<Test> ptt;
for (int i = 0; i < 10; i++)
ptt.push_back(new Test(i));
boost::ptr_vector<Test>().swap(ptt);
std::cout << "Excecution done" << std::endl;
}
~Test(0) is called
~Test(1) is called
~Test(2) is called
~Test(3) is called
~Test(4) is called
~Test(5) is called
~Test(6) is called
~Test(7) is called
~Test(8) is called
~Test(9) is called
Excecution done
0690デフォルトの名無しさん
2010/10/30(土) 01:35:14vector を参照かポインタで扱っても、もともとの問題である vector に CFile を入れる段階の
問題が何も解決しない。
配列のコピーが行われたところで十分な空間・計算リソースがあれば問題にならないんで、
誰もが通る問題とも思えない。
0691デフォルトの名無しさん
2010/10/30(土) 01:36:14何も問題ないように見えるが、何がダメだって言うの?
0692685
2010/10/30(土) 01:43:44ちょくちょく出し入れしないとsharedする意味がないし、vectorにそれが向いてるとは思えない。
コンテナに入れる用途だとselectポーリングするとか、サーバー側のソケット/パイプ管理や
クライアント側のコネクションプールのようなものとかだけど、ポーリング以外では切断する役割
よりも使用未使用管理になると思うし、ポーリングを使うような状況でvectorは俺なら使わない。
そもそも面倒なのでポーリングしないで一個ずつスレッド使っちゃうし。
誰かvector<shared_ptr<CFile>>の利用用途を教えてくれー。
0693デフォルトの名無しさん
2010/10/30(土) 01:50:02いやいやだからpush_backしていくうちにメモリの再配置が起きてその時に
勝手にデストラクタが呼ばれてファイルストリームがクローズしちゃうじゃん
それを嫌がってるんでしょ?
自分でデストラクタを呼び出すならstd::vector<CFile*>でも何の問題もないような気がするんだけど
0694デフォルトの名無しさん
2010/10/30(土) 01:51:56shared_ptr が使われてるのは、単に C++2003 にはムーブや unique_ptr が無いからでしょ。
出し入れがしたいわけじゃないと思うよ。
「〜ような状況でvectorは俺なら使わない」と言うけど、それこそ理由が不明。
単に CFile の配列が欲しくて、実行時にしか要素数が決まらないってだけで十分でしょ。
0695デフォルトの名無しさん
2010/10/30(土) 01:56:02素人考えだとならlistではダメなの?って思うのですよ
利用用途が思いつかないからいいのかどうか見当もつかないんですけど
0696デフォルトの名無しさん
2010/10/30(土) 01:56:40単にoperator[]を使いたいんだと思うよ
0697675
2010/10/30(土) 01:59:35>いやいやだからpush_backしていくうちにメモリの再配置が起きてその時に
>勝手にデストラクタが呼ばれてファイルストリームがクローズしちゃうじゃん
まさにこれです。
vector<CFile> files;
files.resize(1);
files.resize(2); // ←ここでメモリの再配置がおきて、files[0] のデストラクタでファイルが閉じられるので困る
CFile の配列を使うことはあまりないかもしれませんが、
可変個のウィンドウを扱う(HWND)、ビットマップを扱う(HBITMAP)、などはよくあると思います。
>>692 で1個ずつスレッドにしても、スレッドを管理する HANDLE を持つクラスの可変長配列が必要です。
0698デフォルトの名無しさん
2010/10/30(土) 02:00:40何のための ptr_vector だよ。
ptr_vector なら再確保が発生してもポインタのコピーだけすればよくて、
オブジェクト本体のコピーが要らない。したがってデストラクタが呼ばれたりもしない。
自分でデストラクタを呼び出すなんて、論外だね。
0699デフォルトの名無しさん
2010/10/30(土) 02:06:140700デフォルトの名無しさん
2010/10/30(土) 02:07:290701デフォルトの名無しさん
2010/10/30(土) 02:10:21それはわかってる
でも今回のように勝手にデストラクタが呼ばれては困るファイルストリームインスタンスへの
ポインタを保持する場合は駄目でしょって
0702デフォルトの名無しさん
2010/10/30(土) 02:12:460703デフォルトの名無しさん
2010/10/30(土) 02:16:31なるほどまづは前提として受け入れろと
>>697
なるほど。リソースハンドル全般の話で使いまわしとは関係がない話なのですね。
オブジェクトとリソースの生成/消滅は原則連動してて、未参照状態で自動的に
消滅さ&コンテナはとにかくvectorがいいと。
0xはまだまだ知らないことだらけだけど、なんか面白そうですね。
0704デフォルトの名無しさん
2010/10/30(土) 02:21:19>>689にこれじゃ駄目でしょうって例をわざわざ貼り付けたんだけど理解できないかな?
0705デフォルトの名無しさん
2010/10/30(土) 02:31:12テンポラリに swap() で内容を移してるんだから、そのテンポラリの消滅で
デストラクタが走って当然。これを「勝手に」とか言ってるのがどういうことなのか
理解できない。
0706デフォルトの名無しさん
2010/10/30(土) 02:37:08いやだから・・・std::vectorでpush_backして行くとそのうち連続したエリアが足りなく
なってメモリの再配置が起きるでしょうって
boost::ptr_vectorも事情は同じですよって言う意味で書いたんだけど分かってもらえないかな?
0707デフォルトの名無しさん
2010/10/30(土) 02:46:410708デフォルトの名無しさん
2010/10/30(土) 02:48:16外行って頭に水ぶっかけて来い
0709デフォルトの名無しさん
2010/10/30(土) 02:50:18http://ideone.com/C0UYF
capacity() == size()はcapacity()が満たされた場合であり、再配置が起こる
明示的にresize()も呼び出してみた
再配置が起こってもデストラクタは起動しない
スコープアウトしてはじめてデストラクタが起動する
0710デフォルトの名無しさん
2010/10/30(土) 02:52:21おっと。似たようなことしてる人が・・・
0711デフォルトの名無しさん
2010/10/30(土) 02:53:380712デフォルトの名無しさん
2010/10/30(土) 03:00:010713デフォルトの名無しさん
2010/10/30(土) 03:04:270714デフォルトの名無しさん
2010/10/30(土) 03:05:560715デフォルトの名無しさん
2010/10/30(土) 03:18:200716デフォルトの名無しさん
2010/10/30(土) 03:19:55・但しイテレータは無効になる
か
0717デフォルトの名無しさん
2010/10/30(土) 03:28:21あくまでポインタを保持している場合の話な
>>709のコード貼っといて言うのもアレだが
オレはコンテナにファイル管理クラスを突っ込んだりしないけどな
入れるとしたらファイル名とかリソースバッファか
ファイル処理なんてエラーが出やすいし、アクセスは単純化してわかりやすい方がいい
こんな論争現場でしたくないだろw
0718デフォルトの名無しさん
2010/10/30(土) 03:31:420719デフォルトの名無しさん
2010/10/30(土) 09:58:53CFileってコピー可なのか?普通はコピー不可にするべきだろう。MFCって一体?
コピー不可でも、C++0xならムーブ可にしておけばvectorに入るだろうし、突然閉じたりしないしな
0720デフォルトの名無しさん
2010/10/30(土) 10:39:12それにMFCのCFileはコピー不可だよ
0721デフォルトの名無しさん
2010/10/30(土) 13:15:33list じゃだめなん?
HWND なんか典型的にリストの出番だと思うし
それ以前に EnumWindows だろ
vector に push_back を多用する時点で何かおかしいと思わないのか?
resize で不具合が出るのをわかっていて resize にこだわる時点で何かおかしいと思わないのか?
ちなみに MFC は RTTI や文字列を自前で作っているが、それがどういう意味かわかる?
0722デフォルトの名無しさん
2010/10/30(土) 13:51:21// ・・・・
set<int>::iterator it = s.begin(), end = s.end();
while(it != end)
{
DoSometing(s, *it);
++it;
}
DoSometingでコンテナの要素が増減する可能性がある場合ってイテレーターは無効になりますか?
0723デフォルトの名無しさん
2010/10/30(土) 13:57:450724デフォルトの名無しさん
2010/10/30(土) 14:56:48itがさしている要素が削除されるとitが無効になるよ。
0725デフォルトの名無しさん
2010/10/30(土) 15:08:37/ \ /\ キリッ
. / (ー) (ー)\
/ ⌒(__人__)⌒ \ <HWND なんか典型的にリストの出番だと思うし
| |r┬-| | それ以前に EnumWindows だろ
\ `ー'´ /
____
/ \ /\ キリッ
. +/ (●) (●)\
/ ⌒(__人__)⌒ \+
| | クスクス>
\ /
____
<クスクス / \ /\ キリッ
. / (●) (●)\
/ ⌒(__人__)⌒ \ +
| |
+ \ /
0726デフォルトの名無しさん
2010/10/30(土) 15:15:110727デフォルトの名無しさん
2010/10/30(土) 15:18:310728デフォルトの名無しさん
2010/10/30(土) 15:21:590729デフォルトの名無しさん
2010/10/30(土) 15:24:33ダメプログラマーになりたいのなら別だがな
0730デフォルトの名無しさん
2010/10/30(土) 15:24:450731デフォルトの名無しさん
2010/10/30(土) 15:25:290732デフォルトの名無しさん
2010/10/30(土) 15:27:06ダメプログラマーになりたいのなら別だがな
0733デフォルトの名無しさん
2010/10/30(土) 15:28:450734デフォルトの名無しさん
2010/10/30(土) 15:33:390735デフォルトの名無しさん
2010/10/30(土) 15:35:380736デフォルトの名無しさん
2010/10/30(土) 15:37:310737デフォルトの名無しさん
2010/10/30(土) 15:42:00そういえばこれのコールバックをコルーチンでiterateする面白い実装をどっかで見たな
0738デフォルトの名無しさん
2010/10/30(土) 15:44:21空笑がみられる病人がいるようだが
許したければ許せばいいだろ自分で
0739デフォルトの名無しさん
2010/10/30(土) 15:54:400740デフォルトの名無しさん
2010/10/30(土) 15:56:22自分に言ってるのか
0741デフォルトの名無しさん
2010/10/30(土) 16:02:26いや、素直な感想を言ってるだけ
0742デフォルトの名無しさん
2010/10/30(土) 16:04:310743デフォルトの名無しさん
2010/10/30(土) 16:15:390744デフォルトの名無しさん
2010/10/30(土) 16:18:57意味のない一言煽り多いよな。それしかできなそうって感じもするけど。
0745デフォルトの名無しさん
2010/10/30(土) 16:43:140746デフォルトの名無しさん
2010/10/30(土) 17:08:210747デフォルトの名無しさん
2010/10/30(土) 17:12:29vectorでは禁じ手
というかメンバ関数がなかったんじゃないか?
0748デフォルトの名無しさん
2010/10/30(土) 17:17:100749デフォルトの名無しさん
2010/10/30(土) 17:18:12というかメンバ関数がなかったんじゃないか?(キリッ
0750デフォルトの名無しさん
2010/10/30(土) 17:22:15許してやれよw
0751デフォルトの名無しさん
2010/10/30(土) 17:26:10vectorの速度的な話で大規模な配列を取り扱う場合
遅い順に
reserveされてない領域へのpush_back
reserveされてる領域へのpush_back
resize等で既に確保されてる領域への代入
vectorを使わない静的配列への代入
って感じであってる?
push_backが遅いのは仕様だよね?
0752デフォルトの名無しさん
2010/10/30(土) 17:31:31vectorを使わない静的配列への代入
これは同じじゃないかな
0753デフォルトの名無しさん
2010/10/30(土) 17:42:17そうなのかな?
適当に10個ほどの変数をもつ構造体で
静的の方は各変数ごとに代入
vectorの方は各変数ごとに代入とoperator=による代入両方で計測してみたんだけど
どうも静的のほうが微妙に速いんだ
誤差の範囲といえばそうなんだが計測に仕方が悪いのかな
0754デフォルトの名無しさん
2010/10/30(土) 17:52:21例えされたとしても複雑なアドレス計算が絡みそうなので単純な配列に比べたら
可哀想だ
でもEfficient C++を読むと分かると思うけど、vectorは本当に速いよ
0755デフォルトの名無しさん
2010/10/30(土) 18:10:250756デフォルトの名無しさん
2010/10/30(土) 18:15:25vector<Hoge, Ator> va;
v = va;
swap(v, va);
//etc.
これサポートされてないんだけどなんかイカす回避手段はありますか?
0757デフォルトの名無しさん
2010/10/30(土) 18:23:160758デフォルトの名無しさん
2010/10/30(土) 19:21:20> reserveされてる領域へのpush_back
> resize等で既に確保されてる領域への代入
これは前者がコピーコンストラクタ、後者が代入演算子を使うことになるから、
既存の要素の取り扱いを考慮する分で、一般的には後者のほうが遅いだろう。
コピーをユーザー定義したクラスの実装によっては逆転することもあるだろうけど。
0759デフォルトの名無しさん
2010/10/30(土) 19:54:160760デフォルトの名無しさん
2010/10/30(土) 23:07:030761デフォルトの名無しさん
2010/10/30(土) 23:17:31shared_ptrが指しているインスタンスが一つも指されなくなったら
つまりこれはお互いに指し合うと永久にdeleteされなくなるので
一個だけweak_ptrを挟む
0762デフォルトの名無しさん
2010/10/30(土) 23:19:27ここが良くまとまっている
0763デフォルトの名無しさん
2010/10/30(土) 23:33:05関東人乙
俺関西人やけど、pop_front使うときはdequeでそれ以外はvectorって決めてるわw
0765デフォルトの名無しさん
2010/10/30(土) 23:40:330767デフォルトの名無しさん
2010/10/31(日) 00:50:46> >>761-762
> thx
> どうやって参照カウントが0になったことをshared_ptrは知るんですか?
0768767
2010/10/31(日) 00:51:51ごめんよ
0769デフォルトの名無しさん
2010/10/31(日) 01:06:04libxml2とapache xercesって使いやすいですか?
0770デフォルトの名無しさん
2010/10/31(日) 11:52:29http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#PromoteAndAdd
上記のウェブサイトのソースコードでconst参照仮引数に代入しているように
みえるのですが良くわかりません。
ちなみにisA関数の意味もcomplexExemplarの意味もわかりません。
教えてください。
0771デフォルトの名無しさん
2010/10/31(日) 15:15:29XML自体が使いにくい。どっちでも特に使いにくいとか使いやすいとか思わなかった。
>>770
細かいことは気にするな。コードはかなり適当っぽい。
0772デフォルトの名無しさん
2010/10/31(日) 15:25:29例えば、関数形式のマクロに別のマクロを引数として与えたとき、引数の方が先に処理される
ようなことはないみたいですけど、単に記述順に処理されるんでしょうか。
0773デフォルトの名無しさん
2010/10/31(日) 15:42:540775デフォルトの名無しさん
2010/10/31(日) 16:05:500776デフォルトの名無しさん
2010/10/31(日) 16:45:510777デフォルトの名無しさん
2010/10/31(日) 17:32:080778デフォルトの名無しさん
2010/10/31(日) 17:37:39こんな宣言をすることができるらしいのですが、
コンパイラが禁止しているからエラーがでるのですか?
また、この時の型は何になるんですか
0779デフォルトの名無しさん
2010/10/31(日) 17:40:57auto_ptr はテンポラリからのコピーができないので、その初期化形式(コピー初期化)では
コンパイルエラーになる。
... c(new Class) とすれば(形式を直接初期化にすれば)コンパイルできる。
型は書いたとおりの std::auto_ptr<Class> 。
0780デフォルトの名無しさん
2010/10/31(日) 17:56:10explicit を学べ
0781デフォルトの名無しさん
2010/10/31(日) 17:58:030783デフォルトの名無しさん
2010/10/31(日) 18:14:42基本的に記述順に処理される
詳しくは
http://www.spinellis.gr/blog/20060626/
このあたりで
>>781
explicitがなければT *からの変換コンストラクタが定義できてしまうのでは?
0784779
2010/10/31(日) 18:19:39ごめん。間違ってた。
auto_ptr も auto_ptr_ref 経由でテンポラリから初期化ができる。
>>778 のコードでテンポラリを使った初期化にならないのは
auto_ptr<T>::auto_ptr(T*) に explicit が付いているから。
直接初期化の形にすれば当然 expliciti の制限は受けず、
auto_ptr<T>::auto_ptr(T*) が使用される。
0785デフォルトの名無しさん
2010/10/31(日) 18:22:300786デフォルトの名無しさん
2010/10/31(日) 18:25:240787デフォルトの名無しさん
2010/10/31(日) 21:42:37社会人1年目なのでC++を勉強するどころじゃなかった
お前らはC++の文法どのくらいで覚えましたか?
0788デフォルトの名無しさん
2010/10/31(日) 21:47:06他の言語の参考になるだけあって文法に時間かかるような言語じゃないですよね
0789デフォルトの名無しさん
2010/10/31(日) 21:48:34STLの山ほどのコンテナ、イテレータ、アルゴリズム、ファンクタ
RAIIやPimplのイディオム
デザパタ
etc...
0790デフォルトの名無しさん
2010/10/31(日) 21:58:52おれは規格読めないから、一生ムリ。
0791デフォルトの名無しさん
2010/10/31(日) 22:02:41簡単C言語おいしいれす
0792デフォルトの名無しさん
2010/10/31(日) 22:03:16あとは知識を増やしてくだけ
0793デフォルトの名無しさん
2010/10/31(日) 22:04:15文法だけならな。
文法だけ知っててもまともなコードは書けないからな。
0794787
2010/10/31(日) 22:07:17C++は単体だと何もできない所が痛いんだよな
0795デフォルトの名無しさん
2010/10/31(日) 22:10:200796デフォルトの名無しさん
2010/10/31(日) 22:35:040797デフォルトの名無しさん
2010/11/01(月) 07:04:24Turing Machineですな。
0798デフォルトの名無しさん
2010/11/01(月) 08:10:480799デフォルトの名無しさん
2010/11/01(月) 08:38:410800デフォルトの名無しさん
2010/11/01(月) 15:26:070801デフォルトの名無しさん
2010/11/01(月) 15:57:21以前他の人のソースを参考にして高速化したソースを別の言語に移植しようと見てみたら
全く何が書いてあるのか解らず、また他の人のソースを参考に一から書いてる。
まじ読めない。驚いた。
0802デフォルトの名無しさん
2010/11/01(月) 16:44:52int main
() {
printf
( "Hello,"); printf(
"World!\n");
return 0
;
}
0803デフォルトの名無しさん
2010/11/01(月) 17:09:150804デフォルトの名無しさん
2010/11/01(月) 17:13:360805デフォルトの名無しさん
2010/11/01(月) 17:25:16まず動くプログラムにしろ
話はそれからだ
0806デフォルトの名無しさん
2010/11/01(月) 17:38:59そんなもんじゃ全然足りない。一度IOCCCの入賞作を見てブッ飛ぶべし。
0807デフォルトの名無しさん
2010/11/01(月) 17:41:390808デフォルトの名無しさん
2010/11/01(月) 17:43:510809デフォルトの名無しさん
2010/11/01(月) 17:58:12あとメンバポインタと union あたりでも凶悪コンボできそう
0810デフォルトの名無しさん
2010/11/01(月) 18:00:00世の中にはやっぱりバカが居るんだなwまさかコンテストがあるとか
でも嫌いじゃないぜ
0811デフォルトの名無しさん
2010/11/01(月) 18:00:52「operator=ってboolを返せるんだ」って逆に感心した覚えが。
0812デフォルトの名無しさん
2010/11/01(月) 18:08:00それこそIOCCCなんか比較にならないほど邪悪なコードが出て来そうだ
0813デフォルトの名無しさん
2010/11/01(月) 18:33:54そういうの。
0814デフォルトの名無しさん
2010/11/01(月) 18:37:56演算子オーバーロードすると可読性が加速度でマッハだな
0815デフォルトの名無しさん
2010/11/01(月) 18:38:22それはCから元々そうでは
if( x = 1 ){
何かする
}
が文法的に正しくて、まず間違いなく意図とは違う動作をするのもそのせいでしょ
>>812
確かC++だとあまりにも何でもありになるのでつまらんからやらん、と
どこかで読んだ覚えがある
0816デフォルトの名無しさん
2010/11/01(月) 19:33:15{
int hage;
int main() { }
};
…残念
0817デフォルトの名無しさん
2010/11/01(月) 20:23:06それはコピーもしないで比較だけするのか?
だとすればとんでもない罠だな。
0818デフォルトの名無しさん
2010/11/01(月) 20:26:37TMP(テンプレートメタプログラミング)があるからそれはもうすごい事になるだろうな。
0819デフォルトの名無しさん
2010/11/01(月) 20:27:44そういうの。
0820デフォルトの名無しさん
2010/11/01(月) 22:53:270821デフォルトの名無しさん
2010/11/01(月) 23:07:290822デフォルトの名無しさん
2010/11/01(月) 23:09:280823デフォルトの名無しさん
2010/11/02(火) 01:15:58__attribute__((section(".text"))) int main=2425393296;
void _() { std::cout<<"Hello, world!"<<std::endl; }
0824デフォルトの名無しさん
2010/11/02(火) 08:15:58http://codepad.org/N5JWb2GC
std::unary_function を引数をテンプレートにして継承しようとしていますが、
result_type が typedef されていないようです。
どう書けばいいのでしょうか?
あと、<functional> の実体はどこをみればわかるのでしょうか。
よろしくお願いいたします。
0825デフォルトの名無しさん
2010/11/02(火) 08:59:23継承している unary_function が確定していない(テンプレート実引数に依存している)ために、
そのメンバは依存名として参照する必要がある。
メンバ関数や変数なら this-> を付ければ済むところだけど、ここでは型名とする必要が
あるので、 typename isEven::result_type のように、わりと不毛な修飾する必要がある。
Arg や bool を使って書いてしまうのがおすすめ。
0826デフォルトの名無しさん
2010/11/02(火) 12:40:06まずは例1をご覧下さい。
注意:スペース節約の為に省略表記をしてあります^ ^;;
例1:
< A > class T {
//アダプタークラス(操作クラス)
};
< B > class U{
//実装クラス
};
<C> class V{
//使用クラス1
T<C> t;
....
t.method();
....
};
<D> class W{
//使用クラス2
D d;
...
d.method();
....
}
オブジェクトに対しVは明示的な操作をしていますが、Wは暗黙的な操作をしています。
しかしC自体が暗黙的な操作なのでTを使う意味がわかりませんTT
教えてください。
0827デフォルトの名無しさん
2010/11/02(火) 13:04:05> 注意:スペース節約の為に省略表記をしてあります^ ^;;
さっぱりわからん。
質問の意図を探る応答で余計に文面は増える。
省略しないのが一番の近道だと考えてくだしあ
0828デフォルトの名無しさん
2010/11/02(火) 13:09:21これこの業界の常識ね
0829デフォルトの名無しさん
2010/11/02(火) 13:10:09正誤表を配布いたしまーす^^ v
誤:
< B > class U{
//実装クラス
};
正;
class U{
//実装クラス
};
>>827
すみませんでしたm( ^ ^ )m
0830デフォルトの名無しさん
2010/11/02(火) 13:13:21どこでUを使うんだよ
省略し過ぎてて質問の意味がわからん
Vに不満があるの?それともWに不満があるの?
0831デフォルトの名無しさん
2010/11/02(火) 13:15:09U=D=Cだよ〜〜〜〜〜んwwwww
0832デフォルトの名無しさん
2010/11/02(火) 13:15:140833デフォルトの名無しさん
2010/11/02(火) 13:18:380834デフォルトの名無しさん
2010/11/02(火) 13:19:300835デフォルトの名無しさん
2010/11/02(火) 13:20:40ってのはそういう意味か
じゃあTの実装くらい省略せず書こうぜ
0836デフォルトの名無しさん
2010/11/02(火) 13:22:400837デフォルトの名無しさん
2010/11/02(火) 13:23:330838デフォルトの名無しさん
2010/11/02(火) 13:27:560839デフォルトの名無しさん
2010/11/02(火) 13:30:390840デフォルトの名無しさん
2010/11/02(火) 13:35:320841デフォルトの名無しさん
2010/11/02(火) 13:37:340842デフォルトの名無しさん
2010/11/02(火) 13:40:51話題共有して馴れ合いたいだけって事なんだろうけど
このていどの話ならゴロゴロしてるから
0843デフォルトの名無しさん
2010/11/02(火) 13:40:52>>836
TとUがまったく同一のインターフェースなら
V使わずにWでおk
0844デフォルトの名無しさん
2010/11/02(火) 13:42:34ありがとうございました(笑)
0845デフォルトの名無しさん
2010/11/02(火) 13:47:51以下がその理由である。
1) 犯罪者の98%はパンを食べている
2) パンを日常的に食べて育った子供の約半数は、テストが平均点以下である。
3) 暴力的犯罪の90%は、パンを食べてから24時間以内に起きている。
4) パンは中毒症状を引き起こす。被験者に最初はパンと水を与え、後に水だけを与える実験をすると、
2日もしないうちにパンを異常にほしがる。
5) 新生児にパンを与えると、のどをつまらせて苦しがる。
6) 18世紀、どの家も各自でパンを焼いていた頃、平均寿命は50歳だった。
7) パンを食べるアメリカ人のほとんどは、重大な科学的事実と無意味な統計の区別がつかない。
0846デフォルトの名無しさん
2010/11/02(火) 13:56:09アダプタは、ある要件を満たさないものを満たすように合わせるのが役目
例えば stack はコンテナが push/pop という要件を満たすようにする
いつぞや CFile を vector に使いたいという人がいたが
vector が要素に課す要件を満たすようにアダプタを作れば
間接的にではあるが CFile の配列を vector で扱うこともやればできる
0847デフォルトの名無しさん
2010/11/02(火) 14:40:10テンプレートによる>>826みたいなやり方だとファイル依存性を作るから
ブリッジパターンとかでもないしアダプターでもないし何の意味も無いようなきがしますね。
0848デフォルトの名無しさん
2010/11/02(火) 15:44:15もしかして「STL標準講座」を参考にしてない?
あれのargument_typeとかresult_typeは絶対に間違いだと思う
だってコンパイル通らないもん
http://codepad.org/ZndqGMsT
普通はこう書く
0849デフォルトの名無しさん
2010/11/02(火) 16:01:500850デフォルトの名無しさん
2010/11/02(火) 16:39:36もちろん非標準の動作。間違いというか環境依存の書き方だな。
0851デフォルトの名無しさん
2010/11/02(火) 17:22:00不要なキャストはやめようよ
0852デフォルトの名無しさん
2010/11/02(火) 18:14:05>>848,850
回答いただき、ありがとうございます。無事コンパイルができました。
>>848
そのとおりです。ときどきサンプルコードがコンパイルができないことがあり、いつもこちらにお世話になっています。
0853デフォルトの名無しさん
2010/11/02(火) 18:34:130854デフォルトの名無しさん
2010/11/02(火) 19:26:18というかなんでそこだけCスタイルなの。
0855デフォルトの名無しさん
2010/11/02(火) 20:06:53いや(bool)消すだけでいいだろ
あとstatic_castもunsignedつければいらない
0856デフォルトの名無しさん
2010/11/02(火) 20:09:55試しにstatic_castを取ってcodepadにうpしてみな
ワーニングが出て実行結果が表示されないぞ
0857デフォルトの名無しさん
2010/11/02(火) 20:31:340858デフォルトの名無しさん
2010/11/02(火) 20:38:37そりゃどうかね
多くの入門書がintを使ってる
警告が出るにも関わらずだ
0859デフォルトの名無しさん
2010/11/02(火) 20:40:02boost::optional<int> a = true; // 0で初期化
boost::optional<int> b = false; // 未初期化状態になる
組み込み型でないときは、false では構築できても true では構築できない。
boost::optional<std::wstring> c = true; // コンパイルできない
boost::optional<std::wstring> d = false; // 未初期化状態になる
これすごく便利なんだけど(例えば、boost::optional<std::wstring> を返す関数で
return false すれば未初期化状態のオブジェクトを返せるし、うっかり return true しても安全)
どうやって実装しているのか誰か説明してくれ。
0860デフォルトの名無しさん
2010/11/02(火) 20:45:28でも入門書はキャストしてないだろ?
0861デフォルトの名無しさん
2010/11/02(火) 21:00:12だから警告が出るとcodepadでは結果が表示されないと>>856に書いただろ
わざわざsize_tを使うかどうかはその人次第だ
0862デフォルトの名無しさん
2010/11/02(火) 21:02:34こんな時こそ忘れられぎみのostream_iteratorさんでも使ってやれよ
0863デフォルトの名無しさん
2010/11/02(火) 21:11:19こんなこと出来るって初めて知ったが多分こんな感じかな
http://codepad.org/fNt77FgZ
実際はどうやってるかしらんが他に思いつかん
0864デフォルトの名無しさん
2010/11/02(火) 21:21:39不要って言ったのは悪かった
警告を消すためのキャストはやめようよ
0865デフォルトの名無しさん
2010/11/02(火) 21:23:24単一のシステムでしか動かさないのを前提ならかまわんが
0866デフォルトの名無しさん
2010/11/02(火) 21:44:331.
optional<int*> p = true; // error。スカラー型だが構築出来ない
2.
optional<int> i = true;
assert(*i == 0); // 失敗。0 でなく 1 で初期化される
3.
optional<bool> b = false;
assert(!b); // 失敗。b は初期化済み
T が bool から暗黙に構築出来ないのに optional<T> が 暗黙に
false から構築出来るのはbugっぽい気もする。
0867デフォルトの名無しさん
2010/11/02(火) 21:48:01a と b は違う
a は int型の 1 に b は int型の 0 に変換される
つまり無効にはならない
無効にしたい場合はfalseではなくboost::noneを突っ込む
http://codepad.org/OU9pmxUg
ちなみに d がコンパイルが通るのは無効値であるboost::noneの型が
int detail::none_helper::*none_tという実体のないメンバ関数へのポインタで
noneは none_t const none = ((none_t)0) だから
0868デフォルトの名無しさん
2010/11/02(火) 21:49:09優先度が intを使う>キャストを使わない ってことか
平行線なんでこの話題終了ってことでお願いします。
0869デフォルトの名無しさん
2010/11/02(火) 21:49:280870デフォルトの名無しさん
2010/11/02(火) 21:50:120871デフォルトの名無しさん
2010/11/02(火) 22:02:050872デフォルトの名無しさん
2010/11/02(火) 22:02:510873デフォルトの名無しさん
2010/11/02(火) 22:04:060874デフォルトの名無しさん
2010/11/02(火) 22:04:42って宣言されてる関数を
std::Foo();
っていうように呼び出す方法ありますか?
0875デフォルトの名無しさん
2010/11/02(火) 22:07:13ほかの名前空間なら
extern void Foo();
namespace hoge
{
inline void Foo() { ::Foo(); }
}
でいい
0876デフォルトの名無しさん
2010/11/02(火) 22:08:280877デフォルトの名無しさん
2010/11/03(水) 01:16:03namespace hoge { using ::Foo; } でよくね?
0878デフォルトの名無しさん
2010/11/03(水) 01:46:28使わないと後悔するが使っても後悔するだろうな。
C++という言語が後悔のかたまり。
でも逃げられないのがC++
0879824
2010/11/03(水) 08:17:31コンパイラは cygwin 上の gcc-4 です。
http://codepad.org/GWHKrVcz
そういうものでしょうか。それとも std 以外の別の空間にあるのでしょうか?
0880デフォルトの名無しさん
2010/11/03(水) 08:48:240881デフォルトの名無しさん
2010/11/03(水) 09:43:52VC10はエラーでないね。
cygwinつかってるならVC10expressがすぐ使えるから試してごらん
>>880
リソース管理してくれる
0882デフォルトの名無しさん
2010/11/03(水) 11:33:01標準にmem_fun1はない
そこはmem_funで通るはず
0883デフォルトの名無しさん
2010/11/03(水) 11:33:41gcc-4.3.3 だけど mem_fun1 だけが問題
mem_fun1 の標準内の位置づけがわからん
0884デフォルトの名無しさん
2010/11/03(水) 13:02:360885デフォルトの名無しさん
2010/11/03(水) 15:21:30普通インスタンスへのポインタをvectorに入れても、それが削除されてもインスタンスの
デストラクタを呼んでくれないっしょ?
boost::ptr_vectorはまるでvector内にインスタンスが入っているかのようにデストラクタを
呼んでくれる
だからvectorはサイズの違うインスタンスは入れられないが、boost::ptr_vectorはポインタ
のみ入れればちゃんと動くので、ポリモーフィズムが出来るわけだ
0886デフォルトの名無しさん
2010/11/03(水) 15:29:05vectorにunique_ptrを格納するのをもっと効率よくやってくれるような感じか。
0887デフォルトの名無しさん
2010/11/03(水) 15:31:120888デフォルトの名無しさん
2010/11/03(水) 15:40:36そうだな
unique_ptrをぶち込んでも同じような結果になるな
今だったらunique_ptrを持ってるコンパイラならこちらの方がいいかも
0889デフォルトの名無しさん
2010/11/03(水) 15:41:39unique_ptr だったら空間効率は変わらないだろうし、ほかの点でも変わらないかも。
0890デフォルトの名無しさん
2010/11/03(水) 15:53:46上のように、同じ引数となるテンプレート関数の特殊化と通常のオーバーロード関数があった場合、
オーバーロード関数の方が優先的に呼ばれるようですがこれはそういう決まりなんですか?
そしてどちらかというとこっちが本題なんですが、
引数で型解決できるような関数だとデフォルト引数以外にテンプレート特殊化とオーバーロード関数の違いはなんになるんでしょうか?
0891879
2010/11/03(水) 15:53:55他皆さん
コメントありがとうございました。結論からいうと mem_fun でOKでした。
今の実力ではどうしてこれでOKなのかわかりませんが、いずれのときにか理解できるようになれば、と考えております。
ありがとうございました。
0892デフォルトの名無しさん
2010/11/03(水) 15:57:50unique_ptrをvectorに入れようとするとコピー禁止なのでコンパイルエラーになる
要するにこれはstd::moveと組み合わせて使う事が前提なのか
0893デフォルトの名無しさん
2010/11/03(水) 16:00:42要するにunique_ptrはC++0xの機能なので、vectorがmoveに対応している
コンパイラなら通る
対応してないコンパイラならエラーになる
0894デフォルトの名無しさん
2010/11/03(水) 16:22:08しばらくはboost::scoped_ptrを使っていた方がいいかも
でもそれだとコンテナに入れられないか
0895デフォルトの名無しさん
2010/11/03(水) 16:26:080896デフォルトの名無しさん
2010/11/03(水) 16:30:55scoped_ptrはコピーも移動もresetもできない
swapは可能
0897デフォルトの名無しさん
2010/11/03(水) 16:32:47http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/scoped_ptr.htm#reset
0898デフォルトの名無しさん
2010/11/03(水) 16:32:50ああそっかじゃあやっぱりだめだな
こういうのを動かしたいわけ
#include <iostream>
#include <memory>
#include <vector>
class A {
public:
~A() { std::cout << "~A called" << std::endl; }
};
int main()
{
std::vector<std::unique_ptr<A> > vui;
for (int i = 0; i < 10; i++)
vui.push_back(std::move(std::unique_ptr<A>(new A))); // gccなら-std=gnu++0x を付ける
}
0899デフォルトの名無しさん
2010/11/03(水) 16:33:59class A {
public:
~A() { std::cout << "~A called" << std::endl; }
};
int main()
{
std::vector<std::unique_ptr<A> > vui;
for (int i = 0; i < 10; i++)
vui.push_back(std::unique_ptr<A>(new A)); // gccなら-std=gnu++0x を付ける
}
0900デフォルトの名無しさん
2010/11/03(水) 16:35:31C++0x ならそれでいいし、そうじゃなければ boost::ptr_vector でいい。
まだなんか問題ある?
0901デフォルトの名無しさん
2010/11/03(水) 16:36:58それでいいな
これ以上のunique_ptrの話はC++0xスレに移動しよう
0902デフォルトの名無しさん
2010/11/03(水) 16:45:00そういう決まり
関数テンプレートを全部特殊化で記述して使った場合の違いは、
関数テンプレートの場合は引数が暗黙に変換されないことくらいだと思う
0903デフォルトの名無しさん
2010/11/03(水) 17:28:53どうもありがとうございます
実はいままで関数テンプレートの特殊化する方法を知らず全て普通のオーバーロード関数にしていたのですが、
特に問題がなければ見なおさなくてもいいですか?
0904デフォルトの名無しさん
2010/11/03(水) 18:08:10あれ?デフォコンもresetも無いから便利と記憶してたのにな
0905デフォルトの名無しさん
2010/11/03(水) 18:28:39場合にもよるけど、
関数テンプレートをすべて特殊化しなければ処理を記述できない(= 関数名は同じだけど実は中身は違う処理)のであれば
普通のオーバーロードのままのほうがいいと思う
もし、関数が受け取る引数の型に共通の性質を切り出すことができて、
切り出した性質(と、切り出すまでもなく備わってる共通の性質)のみに依存するコードを記述できるのであれば、
traitsなどを使ってテンプレート化してしまったほうがいいかもしれない
0906デフォルトの名無しさん
2010/11/03(水) 19:13:05どうも丁寧にありがとうございます
結構煩雑な部分が多いので共通項の切り出しとテンプレートについて良く見なおしてみます
0907デフォルトの名無しさん
2010/11/03(水) 21:10:16int main() {
Test t;
Hoge h = create(t);
return 0;
}
このようなコードを書いた場合、mainでHoge hを使うのは安全ですか?
0908デフォルトの名無しさん
2010/11/03(水) 21:21:23どこら辺がジェネリックよりも強力なのですか?
0909デフォルトの名無しさん
2010/11/03(水) 21:22:450910デフォルトの名無しさん
2010/11/03(水) 21:29:34Hogeのオブジェクトがコピーされても安全な設計ならば問題ない
0912デフォルトの名無しさん
2010/11/03(水) 22:23:33強力というか別物。
C#のジェネリックは制約を使うので、型パラメータに使える型が制限させれる。
たとえば、C#で以下の例のように、aはIDisposableの派生でなくちゃならないし、IDisposableで定義されたメソッドしか呼べない。
void hoge<T>(T a):where IDisposable
{
a.Dispose();
}
C++は制約がないので、型にメンバー関数があれば呼べる。
さらにC#ではtypedefがないんで事実上TMPLが無理
0913デフォルトの名無しさん
2010/11/03(水) 22:30:290914デフォルトの名無しさん
2010/11/03(水) 22:31:390916デフォルトの名無しさん
2010/11/04(木) 09:36:12レスが遅れたけど、ありがとうございます。
説明が明快でよくわかりました。
0917デフォルトの名無しさん
2010/11/04(木) 14:16:250918デフォルトの名無しさん
2010/11/04(木) 14:22:45正式なenum hackの代わりになるものって無くてこれからもできないんですか?
0919デフォルトの名無しさん
2010/11/04(木) 14:23:39ありますよ
>>918
できないんです
0920デフォルトの名無しさん
2010/11/04(木) 14:28:13static const int foo = 3;
でダメなの?
0921デフォルトの名無しさん
2010/11/04(木) 14:29:530922デフォルトの名無しさん
2010/11/04(木) 15:24:57TMPでも>>920でいけるでしょ
0923デフォルトの名無しさん
2010/11/04(木) 15:34:020924デフォルトの名無しさん
2010/11/04(木) 19:08:09それが通る環境ならOK
0925デフォルトの名無しさん
2010/11/04(木) 20:24:43何が何でも定数でメモリを使いたくないとき。
今時、普通のコンパイラは定数をわざわざメモリに配置したりしないんだけど、
その定数のアドレスを参照しているところが一ヶ所でもあれば、メモリに配置せざるをえない。
enumならアドレス参照ができないから、メモリに配置されることもない。
ま、WindowsやLinuxを使っている限りはどうでもいいようなことだな。
0926デフォルトの名無しさん
2010/11/04(木) 21:24:09static Hoge* Hoge::create() { return new Hoge(); }
こーいうのってファクトリ関数というのですか?何のために在るんですか?
0927デフォルトの名無しさん
2010/11/04(木) 21:37:38複数のクラスを組み合わせたオブジェクトを生産したり
まとにかく色々できるよ
0928デフォルトの名無しさん
2010/11/04(木) 21:39:400929デフォルトの名無しさん
2010/11/04(木) 21:42:420930デフォルトの名無しさん
2010/11/04(木) 21:43:43Hoge::Hoge();
は宣言できるけれども呼び出す手段がないとか
0931デフォルトの名無しさん
2010/11/04(木) 21:53:53>>端的な例として、継承を利用して同じcreateでも別のものできるのを利用したりとか
これはどういうことでしょう
0932デフォルトの名無しさん
2010/11/04(木) 22:04:46static Hoge* Hoge::create() {
if (isWindows) return new WindowsHoge();
if (isLinux) return new LinuxHoge();
if (isMac) return new MacHoge();
return new DefaultHoge();
}
0933デフォルトの名無しさん
2010/11/04(木) 22:38:15デザパタの一種
生成パターンでぐぐってみな
0934デフォルトの名無しさん
2010/11/04(木) 22:55:42Factoryパターンとかのことをいってるんじゃなかろうか
0935デフォルトの名無しさん
2010/11/04(木) 23:05:04Factoryで生成しろってことですかね?
class BaseHoge{
public:
BaseHoge() {};
} ;
class Hoge1: public BaseHoge{
public:
static BaseHoge* create(){ return new Hoge1() ; }
} ;
class Hoge2: public BaseHoge{
public:
static BaseHoge* create(){ return new Hoge2() ; }
} ;
class Hoge3: public BaseHoge{
public:
static BaseHoge* create(){ return new Hoge3() ; }
} ;
BaseHoge* (*create_Hoge[])() = {
Hoge1::create,
Hoge2::create,
Hoge3::create,
} ;
0936デフォルトの名無しさん
2010/11/04(木) 23:11:060937デフォルトの名無しさん
2010/11/04(木) 23:20:40最低限デザインパターンをググって一通り学んできてから質問しなよ
じゃないとここでも氏ねと言われるだけ
0938デフォルトの名無しさん
2010/11/04(木) 23:24:54GOF本買おうよ
滅多にデザパタ使わない俺でも持ってるぞ
0939デフォルトの名無しさん
2010/11/04(木) 23:27:32初めてサンプルプログラム書いてみて、目から鱗が落ちる思いだった
0940デフォルトの名無しさん
2010/11/04(木) 23:30:360941デフォルトの名無しさん
2010/11/04(木) 23:32:57フルボッコされるぞ
あのスレ変な信者が多すぎ
0942デフォルトの名無しさん
2010/11/04(木) 23:42:24自虐ギャクだろ?
こんなんにかさにかかって煽るやつって。
0943デフォルトの名無しさん
2010/11/04(木) 23:52:17べつに何も悪く無いと思うけど
あれが悪いと言ってる人たちも具体的な指摘をしていないし
明確な欠点はないんじゃない
0944デフォルトの名無しさん
2010/11/04(木) 23:55:24Factory Method や Abstruct Factory は後からコードやクラスの変更が
生じた時も最小限の修正で済む
0945デフォルトの名無しさん
2010/11/05(金) 00:10:47関数のポインタや boost::function があるC++には不要なんじゃない?
0946デフォルトの名無しさん
2010/11/05(金) 00:13:57仮想関数を使えば綺麗になるけど
0947デフォルトの名無しさん
2010/11/05(金) 00:19:280948デフォルトの名無しさん
2010/11/05(金) 00:22:13一応javaデザインパターン入門は10回ぐらい呼んだ・・・
0949デフォルトの名無しさん
2010/11/05(金) 00:25:070950デフォルトの名無しさん
2010/11/05(金) 00:29:17functionだとoperator()以外も持ったファクトリの代用にならないし
関数ポインタは状態が持てないからディスパッチャ以上のものが期待できない
0951デフォルトの名無しさん
2010/11/05(金) 00:54:50create_Hoge が const になってない。しね
0952デフォルトの名無しさん
2010/11/05(金) 00:55:47operator()を持ってないならbindすればいいじゃない
>>946のようにif文がめんどいならfunctionをコンテナに突っ込んで
識別子を定義するなりして生成関数を登録すればいい
たしかLokiのFactoryはそれに近いことをやっていたはず
とはいえ、functionに期待するのは遅延実行だから
commandパターンやboost::signalのようにobserverパターンだと思うけど
>>941
デザパタの実装なんていくらでもあってキリがないから
GOFスレでやったほうがいいと思うんだけどね
まあ、あのスレはオレは見てないけどw
0953デフォルトの名無しさん
2010/11/05(金) 00:57:560954デフォルトの名無しさん
2010/11/05(金) 01:04:460955デフォルトの名無しさん
2010/11/05(金) 01:07:45いや、そうじゃなくて
factory.clear_pool();
みたいなメンバ持たせたいこともあるでしょや
functionだとそういう時困る
0956デフォルトの名無しさん
2010/11/05(金) 01:56:58それはFactory Method パターンにふくまれるか?
0957デフォルトの名無しさん
2010/11/05(金) 03:27:560958デフォルトの名無しさん
2010/11/05(金) 10:08:59名前衝突を回避するために名前空間をディレクトリ構成に一致するようつけてたら
階層が深くなりすぎて名前空間が激長になってしまった
なんか良いプロジェクト構成管理方法は無いものか
0959デフォルトの名無しさん
2010/11/05(金) 10:24:530960デフォルトの名無しさん
2010/11/05(金) 13:07:07あちゃー やっちゃったね
Java上がりの人がプロジェクト規約を作ったりすると
犯しやすい致命的な間違いだよそれ。
C++の名前空間はJavaのパッケージみたくは使えないから。
ご冥福をお祈りします。
0961デフォルトの名無しさん
2010/11/05(金) 13:20:57深くすれば長くなるのは当たり前なんだからもう少しフラットに区分すりゃいいだけ。
長くても使う時にusingなりtypedefすりゃいいだけ。
0962デフォルトの名無しさん
2010/11/05(金) 13:23:030963デフォルトの名無しさん
2010/11/05(金) 14:43:59<T a>で分けるのとどっちが良いんですか?
0964デフォルトの名無しさん
2010/11/05(金) 14:45:02<typename T>で分けるのとどっちが良いんですか?
Tとaはクラスで使わないとします。
0965デフォルトの名無しさん
2010/11/05(金) 14:53:390966デフォルトの名無しさん
2010/11/05(金) 15:02:28一般的には、 typename T のほうが衝突の回避や意図の明示が
しやすくていいと思うよ。
引数の意味によっては int が適切なことがあるかもしれないけど、
どちらかというと稀だと思う。
0967デフォルトの名無しさん
2010/11/05(金) 15:53:020968デフォルトの名無しさん
2010/11/05(金) 15:59:350969デフォルトの名無しさん
2010/11/05(金) 16:01:030970デフォルトの名無しさん
2010/11/05(金) 16:07:150971デフォルトの名無しさん
2010/11/05(金) 16:11:13サブモジュールが使いたければプロジェクトルートからのパスでインクルードする
名前は::プロジェクト名::モジュール名::〜〜
これで完璧だろ
0972デフォルトの名無しさん
2010/11/05(金) 16:27:53実装に対して構造がいくつも存在することが出来れば
ソートしたりバラバラにしてまた組み立てたり色々なことができるよ。
0973デフォルトの名無しさん
2010/11/05(金) 17:45:01応用アプリだとなかなか難しいよ
0974デフォルトの名無しさん
2010/11/06(土) 00:01:09配列の宣言と同時に初期化できないので、
最初に一度だけ書き換えたいのです
どうすれば良いでしょう?
0975デフォルトの名無しさん
2010/11/06(土) 00:04:52死ぬ
0976デフォルトの名無しさん
2010/11/06(土) 00:04:55システムetc etcのapiを使うために、インターフェイスを実装するってだけの話でしょ
0977デフォルトの名無しさん
2010/11/06(土) 00:17:49ttp://ascii.asciimw.jp/pb/bookmart/pdf/47561/4756130666.pdf
これ読めばいいかと
糞長いけど
0978デフォルトの名無しさん
2010/11/06(土) 00:37:16このようにstringを宣言した場合、
char *c = "strings";
std::string s(c);
と解釈されるのですか
それとも、"string"と書いただけでstringに解釈されるのですか
0979デフォルトの名無しさん
2010/11/06(土) 00:38:140980デフォルトの名無しさん
2010/11/06(土) 00:40:410981978
2010/11/06(土) 00:41:27char *c = "strings";
std::string s(c);
こんな感じで解釈されるならば
Hoge h[] = {"s1", "s2", "s3"};が
Hoge h[3];
h[0] = Hoge("s1");
h[1] = Hoge("s2");
h[2] = Hoge("s3");
みたいに書けるじゃないかな〜と思ったの
0982デフォルトの名無しさん
2010/11/06(土) 00:50:210983デフォルトの名無しさん
2010/11/06(土) 01:25:41元々は言語を問わず相互利用可能なインターフェイスを提供するレイヤーだろ。
その先にはCORBAのような分散オブジェクト技術としてCOM+までの流れがあるわけだけれども大して使われず.NETと被ってグダグダに。
0984デフォルトの名無しさん
2010/11/06(土) 01:29:48ttp://codepad.org/fTfweFbp
なんかひでえ結果が。
0985デフォルトの名無しさん
2010/11/06(土) 01:51:19const な配列へのポインタを置いといて、値が決まったところで配列を生成して
ポインタをセットすればいい。
0986デフォルトの名無しさん
2010/11/06(土) 01:53:54後者のように書けて何がうれしいのかわからない。それと >>978 の質問の関連もわからない。
0987デフォルトの名無しさん
2010/11/06(土) 01:55:47スレ違いだけどそういう時こそC++0xの右辺値参照が生きてくるんだよな
一次オブジェクトなんかどうせ捨ててしまうんだからいっそのことmoveさせて
しまおうという
0988デフォルトの名無しさん
2010/11/06(土) 01:57:22○一時
0989v(^・^)v
2010/11/06(土) 01:58:060990v(^・^)v
2010/11/06(土) 02:26:38C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/
0991デフォルトの名無しさん
2010/11/06(土) 06:59:480992デフォルトの名無しさん
2010/11/06(土) 08:10:09C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/
0993デフォルトの名無しさん
2010/11/06(土) 11:43:33次スレ
C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/
0994デフォルトの名無しさん
2010/11/06(土) 17:32:040995デフォルトの名無しさん
2010/11/06(土) 17:32:450996デフォルトの名無しさん
2010/11/06(土) 20:29:290997デフォルトの名無しさん
2010/11/06(土) 20:32:220998デフォルトの名無しさん
2010/11/06(土) 20:39:100999デフォルトの名無しさん
2010/11/06(土) 20:48:26C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/
1000デフォルトの名無しさん
2010/11/06(土) 20:49:0710011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。