5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part85

1 :デフォルトの名無しさん:2010/10/09(土) 20:22:35
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/


2 :デフォルトの名無しさん: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)に対応。

3 :デフォルトの名無しさん:2010/10/09(土) 20:26:16
■Libraries■
[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

4 :デフォルトの名無しさん:2010/10/09(土) 20:27:41
■Books■
amazon.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/

5 :デフォルトの名無しさん:2010/10/09(土) 20:29:03
■Books(Templateまわり)■
Effective 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/


6 :デフォルトの名無しさん:2010/10/09(土) 20:42:28
■長いソースを貼るときはここへ。■
 http://codepad.org/

最近 codepad.org は調子がいまいちなので

 Ideone.com | Online IDE & Debugging Tool
 http://ideone.com/

こっちもつかってね!



7 :デフォルトの名無しさん:2010/10/09(土) 20:52:14
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

8 :デフォルトの名無しさん:2010/10/09(土) 21:03:55
> 最近 codepad.org は調子がいまいちなので

あんまり関係ないかもしれないけど、
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 のほうのメモリ確保、何だかわかる?

9 :デフォルトの名無しさん:2010/10/09(土) 21:12:14
>>4
関連書籍検索が何で洋書なんだ???
和書の貼れよ
ttp://www.amazon.co.jp/b/?node=754384

10 :デフォルトの名無しさん:2010/10/09(土) 22:12:09
■C言語のみの質問はC言語スレで聞いた方がいいです。■
C++とC言語は別の言語なので、
CのみのコードならC言語スレに行った方が良いと思います。

理由:
 1. C言語用のスレがせっかくあるのだから。
 2. C言語はほぼC++に取り込まれているが、だからといってC++スレで
  聞いたからにはC++にしか通用しない文法や標準ライブラリやクラスで
  で返されても仕方ないことだから。



11 :デフォルトの名無しさん:2010/10/10(日) 15:45:12
__   __       ┌──┐  ┌───────┐
\  \ \  \     └┐  │  └──────  │
  \  \ \  \     │  │           / /
   \  \ \  \    │  │         / /
     \  \ \  \  │  │        / /
     /  / /  /  │  │      / /
   /  / /  /    │  │    _ / /
  /  / /  /     │  │   (  /____/\
/  / /  /       │  │   \            )
 ̄ ̄    ̄ ̄         └─┘      ̄ ̄ ̄ ̄ ̄ ̄ ̄

12 :デフォルトの名無しさん:2010/10/10(日) 21:02:39
12に見えるぞ

13 :デフォルトの名無しさん:2010/10/10(日) 21:22:53
クラス内の配列をキャスト演算子で配列引数のテンプレート関数に渡せるような書き方ってないですか?

14 :デフォルトの名無しさん:2010/10/10(日) 21:34:46
ないあるよ

15 :デフォルトの名無しさん:2010/10/10(日) 21:52:45
>>13 クラスにそれを吐くメソッド入れるってのは無しなんだよね?

16 :デフォルトの名無しさん:2010/10/10(日) 22:05:43
>>13
配列なら、配列引数の関数テンプレートに渡せるだろjk
なんでキャスト演算子とか出てくるのかわけわからん。

17 :デフォルトの名無しさん:2010/10/10(日) 22:20:12
new使った動的配列だとか?
もしそうなら
int[10]とint*であれば*(int (*)[10])&pみたいになるな

18 :デフォルトの名無しさん:2010/10/10(日) 22:24:19
CとC++の違いって何ですか?

19 :デフォルトの名無しさん:2010/10/10(日) 22:25:05
C++の方がなんか強そう

20 :デフォルトの名無しさん:2010/10/10(日) 22:26:19
Cは職人
C++は工場

21 :デフォルトの名無しさん:2010/10/10(日) 22:27:00
>>15
それはつまり目的のテンプレート関数の機能をもうクラスに入れちゃうってことですか
ただ想定としてはいろんなテンプレート文字配列関数にそのまま渡せるような
キャストがあれば知りたいなと思いまして、上ような関数なんかも目からウロコでしたし

>>16
すんません、配列をメンバに持つクラスをキャストして上のような関数に渡せないかということです

>>17
いえ、申し訳ないですが静的な配列です

22 :デフォルトの名無しさん:2010/10/10(日) 22:44:17
配列の参照を返すoperator()を定義でいいんじゃない

23 :デフォルトの名無しさん:2010/10/10(日) 23:49:15
>>21
>22 の言う方法でお題は達成できるんだろうけど、キャストを持ち出すべき
ところかなあ?そのキャストが入ったコード読んでも意味わからない状態に
ならない?

ちゃんと名前をつけて配列の参照を返す関数を作ったほうがいいんじゃないか?

24 :デフォルトの名無しさん:2010/10/10(日) 23:59:16
一応目的は配列引数のテンプレート関数にクラスを渡す方法なんで
それがキャストである必要は無いですね

25 :デフォルトの名無しさん:2010/10/11(月) 01:22:22
http://codepad.org/PiClDyzn
なんでそうなのか分かるから歯がゆいいいい

26 :デフォルトの名無しさん:2010/10/11(月) 01:55:27
もしかしたら、テンプレート関数のほうを改造するほうが良い可能性も考えられる。

27 :デフォルトの名無しさん:2010/10/11(月) 02:05:21
最近姿を見せなかったGが今6匹いっせいに飛び出してきた
地震に注意しろよオマイラage

28 :デフォルトの名無しさん:2010/10/11(月) 02:16:40
>>25
おお!すごい!
>typedef char (&S)[N]
これで配列参照の戻り値にできたんですね(なんだか関数ポインタに似てる)
実は今までキャスト以外でも配列の参照を返せませんでした…

29 :デフォルトの名無しさん:2010/10/11(月) 03:27:44
std::valarray<>について質問です

template<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として渡せないはずは無いと思うのですが・・・

30 :デフォルトの名無しさん:2010/10/11(月) 03:53:32
valarrayの - 演算子って定義されてるの?

31 :デフォルトの名無しさん:2010/10/11(月) 03:58:43
エラーメッセージ見ると、どうやらその実装はExpressoin Template的なものを使ってそうだな
doSomething(std::valarray<float>(A - x));
とか
doSomething(A -= x);
でどうだ?

MSVCの実装は単に要素ごとに引いてるだけだから、コンパイル通ったけどね

32 :デフォルトの名無しさん:2010/10/11(月) 11:34:43
templateを使ったコードは実行速度が遅くなりますか?

33 :デフォルトの名無しさん:2010/10/11(月) 11:38:32
いいえ

34 :32:2010/10/11(月) 11:48:03
>>33
thx

35 :デフォルトの名無しさん:2010/10/11(月) 11:55:05
コンパイラの実行速度が遅くなります

36 :デフォルトの名無しさん:2010/10/11(月) 14:01:39
抽象クラスに静的メンバ変数もたせても、その変数は使えますか?

37 :デフォルトの名無しさん:2010/10/11(月) 14:10:52
使える。

38 :デフォルトの名無しさん:2010/10/11(月) 14:20:22
ありがとう。一生忘れない。

39 :デフォルトの名無しさん:2010/10/11(月) 14:29:37
C++でコードの一部の実行時間を計るのにそのコードだけにかかる
時間を計ることは出来ますか?
普通はどうやって測るのが一般的ですか?

40 :デフォルトの名無しさん:2010/10/11(月) 14:31:24
時間の差

41 :デフォルトの名無しさん:2010/10/11(月) 14:49:34
関数の前と後にtimeGettime

42 :デフォルトの名無しさん:2010/10/11(月) 14:52:01
>>39
自前でコードに精密タイマ埋め込んで計る。
あるいはインテルなど各社から出ている測定ツール使う。

43 :デフォルトの名無しさん:2010/10/11(月) 15:29:20
純粋仮想デストラクタを定義して、その派生クラスでデストラクタを定義したんですが、
なぜか外部参照エラーが出ます。
エラーは基底クラスのデストラクタを参照してエラーが出ているようです。

原因として何が考えられるでしょうか?

44 :デフォルトの名無しさん:2010/10/11(月) 15:32:55
基本クラスのデストラクタがないから
派生クラスのデストラクタは必ず自動的に基本クラスのデストラクタを呼ぶ

45 :デフォルトの名無しさん:2010/10/11(月) 15:33:22
抽象クラスを作って、その派生クラスを作ります。
派生クラスのインスタンスが消滅した場合、抽象クラスのデストラクタも
実行されるのでしょうか?

46 :デフォルトの名無しさん:2010/10/11(月) 15:35:19
はい

47 :デフォルトの名無しさん:2010/10/11(月) 15:35:29
>>44
でもその基本クラスのデストラクタが定義されてないのでエラーがでるということですか?
もしそうなら、純粋仮想デストラクタというものは定義できないのでしょうか?

48 :デフォルトの名無しさん:2010/10/11(月) 15:37:24
純粋仮想関数も中身を定義できるんだぞ

49 :デフォルトの名無しさん:2010/10/11(月) 15:42:48
とeffective C++にかいてあるんだぞ

50 :デフォルトの名無しさん:2010/10/11(月) 15:44:21
う〜ん。
純粋仮想関数化すれば、基本クラスのデストラクタが実行されないと思ったので、無駄な処理が
省けると思ったのですが。

でも純粋仮想関数化(後ろに=0つける)したのに、外部参照エラーが出るんです。
具体的にどうしたらよいでしょう?

51 :デフォルトの名無しさん:2010/10/11(月) 15:47:41
>>50
純粋じゃなくて中身か空のデストラクタにすればいいんじゃね。

52 :デフォルトの名無しさん:2010/10/11(月) 15:51:14
辻褄合わせに必死の言語なんだから、深い事は考えてはいけない。
純粋仮想デストラクタの(中身空の)定義も書いてやればいい。

class a {
virtual ~a() = 0;
};
a::~a() {}

53 :デフォルトの名無しさん:2010/10/11(月) 15:52:27
IEnumerableオブジェクトが勝手に定める順序で列挙されるでいいんじゃなイカ?
ランダムだろうと気分だろうと勝手に定めた順序だ

54 :デフォルトの名無しさん:2010/10/11(月) 15:53:14
>>53
誤爆です。すみません

55 :デフォルトの名無しさん:2010/10/11(月) 15:56:55
unique_ptrからshared_ptrへの変換は安全なのでしょうか。

std::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へのムーブが
暗黙のうちに行われているので安全ではないか、と考えているのですが。

56 :デフォルトの名無しさん:2010/10/11(月) 15:57:47
>>51,52
できました!ありがとうございます!
この場合これを継承した派生クラスが消滅した場合、
この抽象クラスのデストラクタは実行されないんですかね?

57 :デフォルトの名無しさん:2010/10/11(月) 16:10:13
>>55
VC10でソース見たけど、shared_ptrにunique_ptrの右辺値参照する代入演算子が定義されてるね。
OKのようだね。
これは便利だ。ありがたく使わせてもらうよ。

58 :デフォルトの名無しさん:2010/10/11(月) 16:59:09
というかその程度の機能すら持ってなかったら標準ライブラリとして使い物にならないよ

59 :デフォルトの名無しさん:2010/10/11(月) 17:59:45
もっとも、unique_ptrをvectorの要素にすることだって可能だよ。

60 :デフォルトの名無しさん:2010/10/11(月) 19:33:47
>>59
unique_ptrならauto_ptrと違ってvectorそのものの動作に問題はないんでしょうけど、
要素を取り出すとき、つまらないミスをしそうですね。
暗黙のムーブを発生させちゃって、vectorには無効なunique_ptrが残ることに。

61 :デフォルトの名無しさん:2010/10/11(月) 19:46:27
……と思ったけど、>>55 が可能なのは GetName() の戻り値が右辺値たり得るからですね。
vector から要素を取り出すときは常に左辺値になるから、そんな心配はいらないのか。

62 :デフォルトの名無しさん:2010/10/11(月) 19:52:15
明示的にムーブしない限りは大丈夫じゃない?

63 :デフォルトの名無しさん:2010/10/11(月) 19:57:38
auto x = vec.front();
とかやって「先輩!コンパイルできません!」と泣きついてくる奴はいそうな気がする。

auto &x = vec.front();
「こうすれば大丈夫だよ」と理由や副作用も含めて教えてあげればいいんだが、

auto x = std::move(vec.front());
こういうやり方を教えて「こうすればコンパイルできるみたいだよ」なんて言う奴は
ウチの会社にはいないはず……うん、いないはず……

64 :デフォルトの名無しさん:2010/10/11(月) 20:23:16
>>55-63
それを説明するには、lvalueとrvalueの区別をきっちり説明しなくちゃいけないな。
俺自信ない。

65 :デフォルトの名無しさん:2010/10/11(月) 20:53:10
03ですら使わせてほんとに大丈夫かっていう連中がそこかしこにいるのに
0xになってさらに混乱しそうな仕様がいくつも追加されても困るよな
まあ業務では0xコンパイラ使わなきゃいいだけって話だけど

66 :デフォルトの名無しさん:2010/10/11(月) 20:57:13
98ならおkってわけでもないんだろ?
Javaでもやらせとけ

67 :デフォルトの名無しさん:2010/10/11(月) 21:10:25
ようするにC++は玄人の玩具的な扱いが加速しすぎているんだよ
もっと仕様を軽量化単純化したC++Liteを作るべき

68 :デフォルトの名無しさん:2010/10/11(月) 21:13:56
Embeded C++ ゴゴゴゴゴゴゴゴ・・・

69 :デフォルトの名無しさん:2010/10/11(月) 21:18:42
>>67
いちいちアレが使えてこれが使えなくてとか確認することになるぜ
余計ややこしくするだけだっての
他の言語かC使えばいいんだよ

>>68
組み込みもやってるけど一度も使った事ないわそれw

70 :デフォルトの名無しさん:2010/10/11(月) 21:34:17
> いちいちアレが使えてこれが使えなくてとか確認することになるぜ

今現在そのような状況なのを何とかしてほしいってことだろ
関数テンプレートの部分初期化とかリンカがコンパイラを呼び出したりとか

71 :デフォルトの名無しさん:2010/10/11(月) 21:52:50
>>68
わらたw

72 :デフォルトの名無しさん:2010/10/11(月) 21:58:14
けどC++は何でもありってのは良いところでもあると思うんだけどな
自分のグループやプロジェクトではそれなりにルール決めると良いだろうが
たまに Java 使うと窮屈に感じてしょうがない

73 :デフォルトの名無しさん:2010/10/11(月) 22:16:07
C++ で配列の要素数を求めるテンプレート作りたいのですが、

template <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 *' から減少できませんでした

とエラーが出てしまいます。
どうすればいいのでしょうか?

74 :デフォルトの名無しさん:2010/10/11(月) 22:20:31
>>73
const BYTE* ptr これ配列じゃないよ

75 :デフォルトの名無しさん:2010/10/11(月) 22:24:40
length(values)
ぷっ

76 :デフォルトの名無しさん:2010/10/11(月) 22:29:27
>>74 すみません。

void hogehoge(const BYTE *values)
{

なんです。

void hogehoge(const BYTE values[])
{
にしても、C2784エラーがでてしまいます。

77 :デフォルトの名無しさん:2010/10/11(月) 22:31:14
>>76
そのhogehogeもテンプレートにしちゃいないよ。

78 :デフォルトの名無しさん:2010/10/11(月) 22:31:17
それも配列ではないよ

79 :デフォルトの名無しさん:2010/10/11(月) 22:33:22
>>76
だめだこりゃ!

80 :デフォルトの名無しさん:2010/10/11(月) 22:46:43
void hogehoge(const BYTE& values)
{

こうですか?

81 :デフォルトの名無しさん:2010/10/11(月) 22:47:49
素直に vector 使え
もう大分前から STL は C++ 標準

82 :デフォルトの名無しさん:2010/10/11(月) 23:04:56
関数を沢山作ると、関数の並び方によって見やすさが変わると思います
void print1();
void print2();
void print3();
の方が
void print3();
void print1();
void print2();
より見やすい気がする

お前らはどんなルールで関数を宣言していますか?

83 :デフォルトの名無しさん:2010/10/11(月) 23:07:59
世界最高峰のプログラマーだが、そんなこと気にしたことないね。
書けるとこに書けばいい。
スレ違いだから。

84 :デフォルトの名無しさん:2010/10/11(月) 23:08:06
>>82
両方とも醜いです

85 :デフォルトの名無しさん:2010/10/11(月) 23:45:08
>>92
printを使うのは良いとして 1,2,3 なんてイミフなラベル付けないなぁ

86 :デフォルトの名無しさん:2010/10/11(月) 23:45:56
処理される順に書くか対になるものを並べるかは迷うことが多い

init → begin → end → free か
init → free → begin → end


87 :85:2010/10/11(月) 23:46:01
あんかー間違えた。すまん >>92>>82


88 :デフォルトの名無しさん:2010/10/11(月) 23:48:07
説明しやすいように連番使っただけでそこをgdgd言うのは単なる揚げ足取りだろう・・・

89 :デフォルトの名無しさん:2010/10/11(月) 23:48:13
単なる関数名の例にケチつけるとはさすが

90 :デフォルトの名無しさん:2010/10/12(火) 00:53:21
辞書順だろ
結局はこれが一番一覧性高い

91 :デフォルトの名無しさん:2010/10/12(火) 00:59:38
>>82
それぞれどんな機能差があるか分からないけど、番号だけで分けるなんて安易で酷いと思うよ

92 :デフォルトの名無しさん:2010/10/12(火) 01:02:47
>>88-89
説明のためだけなら、実用における
void print1();
void print2();
void print3();

void print3();
void print1();
void print2();
の違いがさっぱり分からないわけだが。

93 :デフォルトの名無しさん:2010/10/12(火) 01:05:00
>>82
宣言とか定義場所の並び順なら、グループ別に分けてコメントで見出しと説明文とgrep用の印付ける。
その上で呼び出し順序のある物ならその順番で書いて、そうじゃない単位での並び順はそんなわらわら増えた事も無いし適当。

94 :デフォルトの名無しさん:2010/10/12(火) 01:14:12
>>92
辞書順の例を出しただけ。
他にどんなルールで並べてるのかを聞いてるんだよ

95 :デフォルトの名無しさん:2010/10/12(火) 01:16:17
想像力の欠乏した奴が多いなw

96 :デフォルトの名無しさん:2010/10/12(火) 01:53:40
>>94
というか辞書順という言葉が分からなかったんだろ?

97 :29:2010/10/12(火) 06:16:30
>>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は渡せるのだから引数に渡るとき暗黙に型変換されるものだと思っていましたが・・

98 :デフォルトの名無しさん:2010/10/12(火) 06:55:39
1,2,3だけで辞書順であることを想像しろと言われてもなぁ。せめてA,B,Cにしろよ。

99 :デフォルトの名無しさん:2010/10/12(火) 08:24:34
>>80
テンプレート配列
#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;
}

100 :デフォルトの名無しさん:2010/10/12(火) 08:42:14
誰かSleepをしない、fps計測コードを貼ってくれませんか?
お願いします。

101 :デフォルトの名無しさん:2010/10/12(火) 09:14:18
もういいです

102 :デフォルトの名無しさん:2010/10/12(火) 09:34:56
答えようかと思いましたがもういいならいいです

103 :デフォルトの名無しさん:2010/10/12(火) 09:53:50
fps=フレーム数/経過時間

104 :デフォルトの名無しさん:2010/10/12(火) 18:29:31
>>101
これは私ではありません

105 :デフォルトの名無しさん:2010/10/12(火) 19:41:08
>>97
私も気になって調べてみましたがよくわかりませんでした。
valarrayの_Exprを受け取るコンストラクタがメンバテンプレートなのが関係あるかも?

106 :デフォルトの名無しさん:2010/10/12(火) 19:47:56
ご質問させてください。

class 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メンバ関数を通さずにアクセスできていることになりますが、
これは言語仕様でしょうか?

107 :デフォルトの名無しさん:2010/10/12(火) 19:56:57
>>106
printfの正しくない使い方をして先頭のメンバーがたまたま見えてるだけ。
仕様としては未定義な動作。

108 :デフォルトの名無しさん:2010/10/12(火) 19:58:59
>>106
具体的な仕様は知らんのだけど、それってprintfの中で (int)t されてるんじゃないかな。

109 :デフォルトの名無しさん:2010/10/12(火) 20:00:18
>>107
言語仕様うんぬんではなく、printf()の正しくない使い方だったのですね。
迅速なご回答ありがとうございました。

110 :デフォルトの名無しさん:2010/10/12(火) 20:07:42
>>108
ありがとうございます。

インスタンスtの先頭にメンバ変数iが割り当てられて、
printf()内で(int)tされた結果、tのアドレスをint型として扱い
iの値が出力されたということでしょうか?

111 :デフォルトの名無しさん:2010/10/12(火) 20:13:36
>>110
そんな所だと思う。
int a = *(int*)&t;
printf("%d\n", a);
でも同じ処理系なら同じ結果が得られるよ。
tの中の状態に依存してるから、他で必ず同じ結果になるとは限らないと思うけど。

112 :デフォルトの名無しさん:2010/10/12(火) 20:15:22
アドレスじゃなくiの値そのものがスタックに積まれた

113 :デフォルトの名無しさん:2010/10/12(火) 20:22:19
>>111
ありがとうございます。
ご提示のコードでも確かに同様の結果が得られました。

>>112
ありがとうございます。
ということは、違う環境で例えばメンバ変数のスタックへの積まれ方が異なる場合には
違う値になってしまいますね。


仕事で携わってるものにこのようなコードがあり、
初めて見る書き方でしたので最初は意味が分からず
>>106のような検証コードを書いて、ようやく理解出来ました・・・。

正しくない使い方のようですのでgetInt()のようなゲッターを作って
取得するようにしようと思います。

ありがとうございました。

114 :デフォルトの名無しさん:2010/10/12(火) 20:25:41
そりゃiの値も積まれてるだろうけどそれじゃiだけ積んでるみたいじゃないか

115 :デフォルトの名無しさん:2010/10/12(火) 20:26:01
次は仮想関数を追加するんだ

116 :デフォルトの名無しさん:2010/10/12(火) 20:29:08
メンバ変数の定義を
private:
  int i;
  char c;
から
private:
  char c;
  int i;
と入れ替えて、

printf("t = %c\n", t);
とすると、「T」が表示されましたので、
クラスTestのインスタンスとして確保されたメモリ領域に
メンバ変数の定義順に配置されたって感じなんでしょうかねぇ。。。

117 :デフォルトの名無しさん:2010/10/12(火) 21:05:13
構造体について勉強すればわかるようになるよ
クラスも構造体も基本は一緒だから

でも>>106は未定義

118 :デフォルトの名無しさん: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);
}


119 :デフォルトの名無しさん:2010/10/13(水) 01:06:22
追記です。
この(元のコードの)目的は、
(fooが取得できれば、)fooの返り値に対して最後のfor_eachを行うことです。

制限ばかりで申し訳ないですが、他の関係の無い処理が入る都合上、
for_eachの部分を上のfooの部分と同じブロックに入れることができません。

120 :デフォルトの名無しさん:2010/10/13(水) 01:10:09
>>118
>ifブロックを抜ける時にRetが消えるような
>気がしてなりません。よろしくお願いします。

消えるよ
当たり前だろ
ブロック内しか寿命がない

>動くことは動くのですが、

たまたま動いているだけ
Retはブロックの外で定義しないと
その場合参照型にはできないね

121 :デフォルトの名無しさん:2010/10/13(水) 01:11:59
何度もすみません。誤解の生じる表現があったので訂正します。
× 他の関係の無い処理が入る都合上、
○ 既存のコードの制御フローを変更できない都合上、

122 :デフォルトの名無しさん:2010/10/13(水) 01:15:39
知らねーよ
バグってはっきりわかったんだから修正するのが当たり前だろ

123 :デフォルトの名無しさん:2010/10/13(水) 01:22:58
>>118
Retを介す必要なくね?

ret = c->foo();

124 :デフォルトの名無しさん:2010/10/13(水) 01:40:25
>>123
なるほど。>>118を再掲しますと
> 処理としては、クラスXXXのメンバ変数のconst参照を返しています。
なので
ret = &(c->foo())
となるかと思いますがretの指すアドレスは、
「ifブロック内の一時的な変数」ではなくて「cのメンバ変数」のアドレスである。
という理解でよいのでしょうか?

加えて、retの有効範囲はcが有効である間という認識でよいのでしょうか?

125 :デフォルトの名無しさん:2010/10/13(水) 01:42:53
こんな感じじゃだめなん?

class 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));
}

126 :デフォルトの名無しさん:2010/10/13(水) 02:11:29
>>124
それで動くはず。
foo() が const 参照を返すのなら、参照先は c のメンバ変数そのものだから、
&演算子でメンバ変数そのもののアドレスがとれる。

もっとも、その程度の処理なら、これで十分だけどね。
std::for_each(c->foo()->begin(), c->foo()->end(), print);

127 :デフォルトの名無しさん:2010/10/13(水) 02:41:58
これが一番簡単だったりする

class 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());
}

128 :デフォルトの名無しさん:2010/10/13(水) 13:46:42
DLLが投げた例外をEXEでキャッチするなんてことしていいんですか?

129 :デフォルトの名無しさん:2010/10/13(水) 14:01:12
>>128
コンパイラのマニュアルを見ろ。
いちおう、同じコンパイラ+同じ設定でコンパイルしてるなら問題ない可能性が高いとは言える。

130 :デフォルトの名無しさん:2010/10/13(水) 14:03:32
DLLはCで書いてC++でラップするのが安全でよい

131 :デフォルトの名無しさん:2010/10/13(水) 14:14:30
ラップするときは catch (...) を忘れずにな。

132 :デフォルトの名無しさん:2010/10/13(水) 18:49:54
>>125-127
お返事が遅れました。
確かに、c->foo()->begin()で十分ですね。コレがよさそうです。

あと知らなかったのでmem_fun_ref調べてみましたが、
オブジェクトを作らなくても関数を呼べるのは面白いですね。

ありがとうございました。

133 :デフォルトの名無しさん:2010/10/13(水) 23:08:36
std::から始まる関数は、stlのなんですか?

134 :デフォルトの名無しさん:2010/10/13(水) 23:24:43
C++の標準ライブラリはstd名前空間にあるんだよ

135 :デフォルトの名無しさん:2010/10/14(木) 00:44:43
namespace foo{
namespace std{ void bar(); }
void baz() { std::bar(); }
}

まあこんなことするやつはいないと思いたい

136 :デフォルトの名無しさん:2010/10/14(木) 00:46:33
printf も本当は std::printf なんだぜ

137 :デフォルトの名無しさん:2010/10/14(木) 01:37:54
でも std:: 付けなくても使えるよね

138 :デフォルトの名無しさん:2010/10/14(木) 01:41:55
>>137
それは黒歴史。後方互換性とも言う。

139 :デフォルトの名無しさん:2010/10/14(木) 01:50:34
でもstdにあるものと同名のもの作る方がおかしいと思う

140 :デフォルトの名無しさん:2010/10/14(木) 02:10:29
>>139 find とか予約されたら死ねる。

141 :デフォルトの名無しさん:2010/10/14(木) 07:42:09
おっぱいを型にはめようとする人たち
http://togetter.com/li/59043

綾瀬はるかのおっぱいはどの型で宣言すればいいですか?


142 :デフォルトの名無しさん:2010/10/14(木) 08:16:24
>>141
int

143 :デフォルトの名無しさん:2010/10/14(木) 13:00:47
std::pairかな。

144 :デフォルトの名無しさん:2010/10/14(木) 13:38:43
std::pair<float,float>

145 :デフォルトの名無しさん:2010/10/14(木) 13:47:40
ある関数Aから関数Bを呼び出したとします。
関数Bでは関数Cを呼び、関数Cは関数Dを呼び・・・と何層にもなっているとします。
ここで、関数Cや関数Dから、goto文のように直接関数Aにreturnすることはできるでしょうか?

146 :デフォルトの名無しさん:2010/10/14(木) 13:49:05
throw

147 :デフォルトの名無しさん:2010/10/14(木) 13:57:36
>>145
エラー処理なら throw 〜 catch で。
それ以外ならもう少し詳しく状況を。できればコードで。

148 :デフォルトの名無しさん:2010/10/14(木) 13:58:55
もしかして setjmp/longjmp の出番なのか?

149 :デフォルトの名無しさん:2010/10/14(木) 14:10:16
pair<jmp_buf,jmp_buf>

150 :デフォルトの名無しさん:2010/10/14(木) 14:16:30
コンパイラを作っていて、入力コードにある一定数のエラーが出たり、致命的なエラーが出たときに処理を戻すようにしたいのです。
try〜catchは少し調べてみましたが、例外がおきたときに特定の処理をするようなので、処理を関数Aに戻すのは難しいのでは・・・と思います。
setjmp/longjmpはぴったりあってるような気がします。
ただ、goto文と同じくあまり推奨されてないのが不安ですが・・・

151 :デフォルトの名無しさん:2010/10/14(木) 14:40:55
setjmpは、C++ではスタック上のオブジェクトのデコンストラクタが呼ばれないので、
使用してはいけない。throwが正解。

152 :デフォルトの名無しさん:2010/10/14(木) 15:22:17
「一定数のエラー」「致命的なエラー」が原因で、通常とは異なる制御フローに移行したいというなら、
それはまさしく例外だ。

try 〜 catchを関数Aに記述すれば、関数Dで例外がthrowされたときに関数Aまで戻るよ。
このとき、途中の関数の自動変数(ローカル変数)のデストラクタがちゃんと呼ばれる。

153 :デフォルトの名無しさん:2010/10/14(木) 15:27:22
× デコンストラクタ
○ デストラクタ

154 :デフォルトの名無しさん:2010/10/14(木) 15:56:05
ありがとうございます!
簡単な例を作って試してみたところ、関数Aに処理が戻ったことが確認できました。
これで綺麗にコーディングできそうです。
助かりましたm(_ _)m

155 :デフォルトの名無しさん:2010/10/14(木) 20:42:52
複数個の返り値を受け取る場合ポインタを利用することで可能だと分かりましたが
void 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でのポインタの扱いがいまいちわかっておりません。どうか教えてください。

156 :デフォルトの名無しさん:2010/10/14(木) 20:51:05
>>155

void up(vector<int> &p, vector<int> &q)

157 :デフォルトの名無しさん:2010/10/14(木) 20:59:02
シリアライザって作るの難しいですか

158 :デフォルトの名無しさん:2010/10/14(木) 21:01:38
そうでもないです

159 :デフォルトの名無しさん:2010/10/14(木) 21:46:15
>>155
あくまでもvector「クラス」
だから普通のクラスと同様にポインタや参照で渡せばいい
コピーはまずいな 時間計測してみればわかるが

160 :デフォルトの名無しさん:2010/10/14(木) 22:05:01
tabの設定はC++の場合、何文字が普通ですか?

161 :デフォルトの名無しさん:2010/10/14(木) 22:32:16
タブ?インデントのこと?
それだったら言語によって普通とかないと思うよ。
見易さのために組織で決めることはあるかもしれないけどね。

ちなみにgoogleは4文字。アクセス指定子は2文字とどこかで見た。

162 :デフォルトの名無しさん:2010/10/14(木) 22:32:42
>>160
その話題はこっちで
http://hibari.2ch.net/test/read.cgi/tech/1193554741/

163 :デフォルトの名無しさん:2010/10/14(木) 23:18:27
>>157
Boost.Serialization

164 :デフォルトの名無しさん:2010/10/15(金) 07:49:55
>>159
最近はそうでもないです

165 :デフォルトの名無しさん:2010/10/15(金) 12:45:44
厨な質問なんですが、
assertみたいに正式版では簡単に消せるような
文字を表示するにはどうやりますか?

166 :デフォルトの名無しさん:2010/10/15(金) 13:09:00
#ifdef _DEBUG
printf ( "message" ) ;
#endif

167 :デフォルトの名無しさん:2010/10/15(金) 13:34:49
みんなそうやってるんですか?
もしそうならマクロ名を
assertを解除するマクロと同じ名前にした方が良いような気がするのですが?
あるいはその3行のコードをマクロにしたようなものはよういされてませんか?

168 :デフォルトの名無しさん:2010/10/15(金) 13:38:34
#ifdef _DEBUG
#define PRINT( ... ) printf( __VA_ARGS__ )
#else
#define PRINT( ... ) ((void)0)
#endif

169 :デフォルトの名無しさん:2010/10/15(金) 13:40:00
処理系で用意してるだろ
_RPTFとかな
「正式版」なんてものは規格の外の話だ

170 :デフォルトの名無しさん:2010/10/15(金) 14:21:02
>>169
日本語でおk

171 :デフォルトの名無しさん:2010/10/15(金) 14:27:11
_DEBUGは自分で宣言するものじゃなくてリンカオプションで指定するもの
Releaseバージョンでリンクすれば自動でスキップされる

172 :デフォルトの名無しさん:2010/10/15(金) 14:37:47
つプリプロセッサ

173 :デフォルトの名無しさん:2010/10/15(金) 14:41:17
リンカとかあほですか

174 :デフォルトの名無しさん:2010/10/15(金) 14:51:19
リンクはコンパイルの間違いだとしてVCだと勝手に定義されてるね

175 :デフォルトの名無しさん:2010/10/15(金) 16:39:14
リンカに渡せばコンパイルもしてくれるからね

176 :デフォルトの名無しさん:2010/10/15(金) 17:03:38
んなこたーない。

177 :デフォルトの名無しさん:2010/10/15(金) 17:13:36
LTCGとかある意味コンパイルだな

178 :デフォルトの名無しさん:2010/10/15(金) 17:23:40
糞$はリリース時にNDEBUGを定義する仕様じゃないあたりに悪意を感じる

179 :デフォルトの名無しさん:2010/10/15(金) 17:25:30
日本語でおk

180 :デフォルトの名無しさん:2010/10/15(金) 17:50:00
意訳すると糞$しね

181 :デフォルトの名無しさん:2010/10/15(金) 20:40:46
VCだと

assert( false && "message" );

で"message"も表示してくれるよね

182 :デフォルトの名無しさん:2010/10/15(金) 20:53:32
なんで VC に限るんだよ

183 :デフォルトの名無しさん:2010/10/15(金) 20:55:42
質問者が環境を明確にしないから

184 :デフォルトの名無しさん:2010/10/15(金) 20:56:51
>>183
C++の仕様の話をしているんじゃねぇの?

185 :デフォルトの名無しさん:2010/10/15(金) 21:05:53
標準内だけでの話なら無いで終わりじゃん

186 :デフォルトの名無しさん:2010/10/15(金) 22:04:03
正式版だのReleaseバージョンだの_DEBUGだの

187 :デフォルトの名無しさん:2010/10/16(土) 01:18:09
>>181 VC 以外でも表示されるよ。標準に従うなら必須だから。

188 :デフォルトの名無しさん:2010/10/16(土) 04:45:18
_DEBUGて標準なの?
標準はNDEBUGだけかと思ってたが

189 :デフォルトの名無しさん:2010/10/16(土) 20:03:46
eclipseのswtってc++で操作できますか?

190 :デフォルトの名無しさん:2010/10/16(土) 20:11:18
>>188 _DEBUG は標準じゃない。 NDEBUG は標準。

191 :デフォルトの名無しさん:2010/10/16(土) 23:20:56
assert(!"message");

192 :デフォルトの名無しさん:2010/10/16(土) 23:43:31
STLのヘッダを見ていてインデントがかなり分かりにくいと思ったんですが、よくある方式なんですか?

193 :デフォルトの名無しさん:2010/10/17(日) 00:38:29
STLといっても実装はいろいろあるんだが・・・

194 :デフォルトの名無しさん:2010/10/17(日) 00:56:10
インデントとコメントは可能な限り排除して、
マクロも全部展開することで
コンパイルがわずかに早くなるよ。

人間には検出不可能だけど。


195 :デフォルトの名無しさん:2010/10/17(日) 01:00:47
プリコンパイルドヘッダ使おうよ。

196 :194:2010/10/17(日) 01:03:14
>>195
そこに気がつくとは、おぬし天才だな。



・・・って>>194は冗談に決まっているじゃないですか!


197 :デフォルトの名無しさん:2010/10/17(日) 01:08:39
厨房くせぇ

198 :デフォルトの名無しさん:2010/10/17(日) 01:11:08
VC++2010のSTLなんです。一応インデントとかコメントはあってこんな感じ
class hoge
  { // hoge class
public:
  hoge(){}
  };
こんな風に中括弧とスコープ内部が同じ深さになってて更にネストが加わるとどんどんわかりにくく

199 :デフォルトの名無しさん:2010/10/17(日) 01:19:25
書き換えりゃいいじゃん

200 :デフォルトの名無しさん:2010/10/17(日) 01:20:41
そのソースを書いた人と>>198
エディタのタブ幅設定が違うだけかと

201 :デフォルトの名無しさん:2010/10/17(日) 01:22:30
Ctrl+A Ctrl+K Ctrl+Fでフォーマットしなおせ

202 :デフォルトの名無しさん:2010/10/17(日) 01:32:19
VisualStudioならAlt+F8で整形できる

203 :デフォルトの名無しさん:2010/10/17(日) 01:32:46
>>200
さすがの俺もスペースとタブを見間違えませんよw

>>199,201
え、STLって書き換えていいもんなんですか?
それ以前になんかファイルに読み取り専用設定がされています

あと別に書き換え云々じゃなくてMS(が作ったんですか?)が
こういう風にしてるからには一つの有名な流儀なのかなと思いまして

204 :デフォルトの名無しさん:2010/10/17(日) 01:33:31
Whitesmiths style

205 :デフォルトの名無しさん:2010/10/17(日) 01:39:26
vs整形なんてできたのか

206 :デフォルトの名無しさん:2010/10/17(日) 01:43:34
すでにWhitesmithって名前でてるけど
スタイルに興味あったらこれとか眺めてみるといいかも
ttp://astyle.sourceforge.net/astyle.html#_Predefined_Style_Options

207 :デフォルトの名無しさん:2010/10/17(日) 01:50:31
>>204
どうもありがとう、なんだか凄く歴史がありそうな書き方なんですね

>>206
どうもです、自分でもスタイルに関して少し思うところがあったので読んでみます

208 :デフォルトの名無しさん:2010/10/17(日) 16:03:12
自宅だとwhitesmithで書いてるけど、
普通の職場じゃ一般的じゃないフォーマットだよな

209 :デフォルトの名無しさん:2010/10/17(日) 16:13:44
c++の勉強中なのですが、よくわからないところでエラーが発生します。

#ifndef __FILE_H_INCLUDED__
#define __FILE_H_INCLUDED__

#include<stdio.h>

class CFile{


210 :デフォルトの名無しさん:2010/10/17(日) 16:16:14
途中送信してしまった

class CFile{
  //メンバ変数
private:
  FILE *m_pfile; //ファイル
・・・・・・

このclass CFile と書いてある所で宣言の構文エラーがあるようなんですが、よくわかりません。
エラー E2141 File.h 6: 宣言の構文エラー

http://www7b.biglobe.ne.jp/~robe/cpphtml/index.html

211 :デフォルトの名無しさん:2010/10/17(日) 16:18:08
全部貼れ

212 :デフォルトの名無しさん:2010/10/17(日) 16:20:37
#ifndef __FILE_H__INCLUDED__
#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(); //ファイルを閉じる


213 :デフォルトの名無しさん:2010/10/17(日) 16:21:18

private:
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

214 :デフォルトの名無しさん:2010/10/17(日) 16:22:59
size_t Read(void *pData, size_t nSize); //ファイルから読みだす
size_t Write(const void *pData,size_t nSize); //ファイルに書き込む


215 :デフォルトの名無しさん: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 ***


216 :デフォルトの名無しさん:2010/10/17(日) 16:29:06
#ifndef __FILE_H__INCLUDED__
#define __FILE_H__ENCLUDED__
ここも何か変だな

217 :デフォルトの名無しさん:2010/10/17(日) 16:30:44
.hを直接コンパイルしてるけど、それはC++としてコンパイルされてるのか? Cとしてコンパイルされてはいないよな?

218 :デフォルトの名無しさん:2010/10/17(日) 16:38:40
多分C++としてコンパイルされてると思います

219 :デフォルトの名無しさん:2010/10/17(日) 16:41:50
>>218
class A{};
だけ書いたファイルのコンパイルは通る?

220 :デフォルトの名無しさん:2010/10/17(日) 16:43:50
だいぶ古いコンパイラを使ってるな

221 :デフォルトの名無しさん:2010/10/17(日) 16:45:07
>>219
通ってない?



222 :デフォルトの名無しさん:2010/10/17(日) 16:45:47
>>219
■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 が参照)


223 :デフォルトの名無しさん:2010/10/17(日) 16:47:14
class A{};
int main(){
return 0;
}
こう書けば通りますが

224 :デフォルトの名無しさん:2010/10/17(日) 17:29:23
知ってるか?bccはファイルの拡張子みてコンパイルする言語を決めるんだぜ
.cppだったらC++としてコンパイルされてあたりまえ
.hはどうなんだと訊いてるんだ

225 :デフォルトの名無しさん:2010/10/17(日) 17:37:27
もしかしてcppでコンパイルされていませんか?
>>223を.cppだとコンパイル出来ましたが、
.hはエラーが発生しました

226 :デフォルトの名無しさん:2010/10/17(日) 17:39:16
じゃあそういうことで

227 :デフォルトの名無しさん:2010/10/17(日) 17:39:29
#include <stdio.h>
のかわりに
#include <cstdio>
ではどうですか?

228 :デフォルトの名無しさん: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 ファイルとしてコンパイルされます。

229 :デフォルトの名無しさん:2010/10/17(日) 23:23:34
mainなどのエントリポイントってどこで定義してもいいんですよね


230 :デフォルトの名無しさん:2010/10/17(日) 23:39:32
クラスの中とかnamespaceの中とかはだめなんじゃないかな... たぶん。

231 :デフォルトの名無しさん:2010/10/17(日) 23:40:37
int main = 195;

232 :デフォルトの名無しさん:2010/10/18(月) 10:24:58
template <typename T>
struct 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あたりに何かありそうか気はするのですが。



233 :デフォルトの名無しさん:2010/10/18(月) 12:21:04
std::forward の意味がいまいちわからないのですが、
引数が左辺値か右辺値かによってコピーとムーブを自動的に区別して行う関数と
理解していいんでしょうか。

234 :デフォルトの名無しさん:2010/10/18(月) 12:27:47

エラー出力はバッファを持たないの意味が分からないのですが。
バッファを持つと持たないとは何が違うのでしょうか?
バッファとは何をするものですか?

235 :デフォルトの名無しさん:2010/10/18(月) 12:33:49
>>234
ディクスファイルや端末、ネットワークへの入出力は低速なので、一定量データを
溜めておいて、一度に行う事で高速化する。これがバッファリング

バッファリングされたデータは適切なタイミングで出力される必要があるが、
エラーが発生してプログラムが異常終了すると出力されない場合がある。
異常終了の場合にこそエラー出力は重要なので、エラー出力はバッファリングしない。

236 :デフォルトの名無しさん:2010/10/18(月) 12:42:30
>>233
forward() をはさまないとぜんぶ左辺値の参照(従来の参照)になっちゃう。

237 :デフォルトの名無しさん:2010/10/18(月) 15:05:04
質問させてください
例えばAクラスを継承するBクラスというものがあって、
BクラスからはAクラスのconst関数しか呼べないようにするにはどうすればよいでしょうか
(もちろん素のAクラスはいかなるAメンバ関数も使えます)

238 :デフォルトの名無しさん:2010/10/18(月) 15:07:50
非const関数を全部privateにするんじゃだめなの?

239 :デフォルトの名無しさん:2010/10/18(月) 15:41:52
ちょっと書き方がまずかったですね
Aはそのまま使うこともあり、その時にはconst関係なくメンバ関数を使いたいんです
要はAはメンバ変数書き換え関数を持っており、それは(もちろん非const時の)Aとしては普通に使えますが、
継承先Bからはそれを使えないようにしたいんです
Bが継承ではなくメンバ変数としてconst Aを持てば上記のことは出来るんですが
これを継承でする方法はないものかと

240 :デフォルトの名無しさん:2010/10/18(月) 15:47:45
書き換え関数を持たないBを親クラスにして
書き換え関数を持つAを作れば解決じゃね?

241 :デフォルトの名無しさん:2010/10/18(月) 15:50:57
Aを継承する非const関数を全部privateにしたAAを用意し、それを継承する。

242 :デフォルトの名無しさん:2010/10/18(月) 16:22:28
>>240
どうもありがとうございます
なるほど、クラスを分離して役割を明確にさせるんですね
結構シンプルでいいかもしれない

>>241
それって少なくとも非const関数を全てオーバーロードするんですよね?
ちょっと引数とかの同期が大変そうなので上の方法で検討してみたいと思います
どうもすみません

243 :デフォルトの名無しさん:2010/10/18(月) 16:33:11
Aで出来ることはBでも出来ないとデザインとしてまちがってますよ。

244 :デフォルトの名無しさん:2010/10/18(月) 17:36:16
(´A`)
(´B`)

245 :デフォルトの名無しさん:2010/10/18(月) 17:37:29
boolの配列は一つがcharの大きさの配列になるから
boolをintに詰め込んでintの配列にするのが最も効率的ですか?

246 :デフォルトの名無しさん:2010/10/18(月) 17:43:30
int型(4Bytet)なら32個のビットをそれぞれフラグとして使えるという意味ならそうじゃない?

247 :デフォルトの名無しさん:2010/10/18(月) 17:56:36
>>245
メモリ効率的にはそうだけど、実行効率は必ずしもビットがいいとは限らない。

248 :デフォルトの名無しさん:2010/10/18(月) 17:59:26
>>247
じゃあ何が良いの?

249 :デフォルトの名無しさん:2010/10/18(月) 18:01:52
unsigned charでビットフラグが良い

250 :デフォルトの名無しさん:2010/10/18(月) 18:03:07
メモリ効率がいいならキャッシュの乗る可能性も上がるんだから実行効率も上になるんじゃね?

251 :デフォルトの名無しさん:2010/10/18(月) 18:05:18
レジスターはintで処理するからintの方が効率よくね?

252 :デフォルトの名無しさん:2010/10/18(月) 18:08:10
バイト単位かビット単位かの違いでキャッシュヒットを心配しているけど、
今時のCPUのキャッシュを考えたら殆ど意味がない。
寧ろ、ビット演算のコストの方が問題。

253 :デフォルトの名無しさん:2010/10/18(月) 18:16:21
ビット演算のほうが普通にコストが低い件について

254 :デフォルトの名無しさん:2010/10/18(月) 18:33:15
みんなキャッシュ効率とかページ効率とか考えてコード組んでんのかすごいな
具体的にどういうコードを書けば効率良くなるんだろう
なるべく変数を減らして使いまわすぐらいしか思い浮かばん

255 :デフォルトの名無しさん:2010/10/18(月) 18:41:16
>>254
キミが思い浮かぶくらいの事はコンパイラが全部知っている。
変数使いまわしは難読性を向上させるだけ。

256 :デフォルトの名無しさん:2010/10/18(月) 18:41:17
下手な考え休むに似たり。
実直なコードを書いて、最適化はコンパイラに任せるのがよい。

257 :デフォルトの名無しさん:2010/10/18(月) 18:43:39
>下手な考え休むに似たり。

これってよくできた諺だよな

258 :デフォルトの名無しさん:2010/10/18(月) 19:44:52
大きなコンテナなんかを返す関数なんかも、単純に値を戻すのが実は一番効率がいいんだ、
とboostの中の人も言っている。
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

259 :デフォルトの名無しさん:2010/10/18(月) 20:01:17
今の話と全然関係ねぇえええええ

260 :デフォルトの名無しさん:2010/10/18(月) 20:04:35
ビット単位かバイト単位かとかいう以前に、intに詰め込みたくなるほどの
フラグを1カ所で管理してるのがおかしい。

261 :デフォルトの名無しさん:2010/10/18(月) 20:17:13
しかしいろいろ考えないと身につかない。
上から目線であやふやな思い込みを語るのはどうかと思う。

262 :デフォルトの名無しさん:2010/10/18(月) 20:33:57
あれこれ考えて試すのはいいけど、最低限結果を確認する手段は持ってないと意味がない。
なんとなく速くなった遅くなったじゃなくて、ちゃんとプロファイリングするなり
アセンブリ出力を読むなりしないと。

263 :デフォルトの名無しさん:2010/10/18(月) 20:34:28
はい、charで1ビットずつバラバラのクラスにします
ありがとうございました

264 :デフォルトの名無しさん:2010/10/18(月) 20:42:27
>>258
えいごよめねえ
解説を

265 :デフォルトの名無しさん:2010/10/18(月) 20:46:23
>>264
ガテン系に転職した方がいい。

266 :デフォルトの名無しさん:2010/10/18(月) 20:52:13
ガッテンガッテン!

267 :デフォルトの名無しさん:2010/10/18(月) 21:27:11
>>232が意図してるのとは少し違うかもしれないが
http://codepad.org/PIjvF4Yq

268 :デフォルトの名無しさん:2010/10/18(月) 21:28:42
>>265
プログラマーってガテン系じゃなかったのか?

269 :デフォルトの名無しさん:2010/10/18(月) 21:35:15
>>268
ガテン系プログラマは英語を読む必要は無い。

270 :デフォルトの名無しさん:2010/10/18(月) 21:37:30
この世界には英語しか話せない人が沢山いるんですよね

271 :デフォルトの名無しさん:2010/10/18(月) 21:38:46
日常会話レベルから英語やっとくとメリットありまくりだよ

272 :デフォルトの名無しさん:2010/10/18(月) 21:57:16
読み込みはなんとなくできるけど生成できない

273 :232:2010/10/18(月) 22:00:23
>>267
まさに私が求めていたものです。Exaclty what I was looking for です。
じっくり読んで隅々まで理解するようにします。ありがとうございました。

274 :デフォルトの名無しさん:2010/10/18(月) 22:44:49
以下英語でレス

275 :デフォルトの名無しさん:2010/10/18(月) 22:47:22
Fack you.

276 :デフォルトの名無しさん:2010/10/18(月) 22:51:05
外人 『oh』
外人 『miss spell』
外人『Fuck you』

277 :デフォルトの名無しさん:2010/10/18(月) 22:54:38
>>275
Euck yon! You'll kill me!

278 :デフォルトの名無しさん:2010/10/18(月) 22:55:04
I cannot understund "外人".

279 :デフォルトの名無しさん:2010/10/18(月) 22:56:43
oh! miss spell "understand" XD

280 :デフォルトの名無しさん:2010/10/18(月) 22:57:56
You is a big fool man! hahahaha!!

281 :デフォルトの名無しさん:2010/10/18(月) 23:14:49
英語読めないからって馬鹿にする奴

282 :デフォルトの名無しさん:2010/10/18(月) 23:41:19
>>280
"is"? You too! hahahaha!!

283 :デフォルトの名無しさん:2010/10/18(月) 23:47:22
>>280
be動詞の変化くらいおぼえとけよ。

284 :デフォルトの名無しさん:2010/10/18(月) 23:49:59
マヂレスか釣りかどっちだ

285 :デフォルトの名無しさん:2010/10/18(月) 23:56:50
馬鹿だからわかんないかもね.

286 :デフォルトの名無しさん:2010/10/19(火) 00:14:59
But, "You" is just a name! hahaha!!

287 :デフォルトの名無しさん:2010/10/19(火) 00:16:42
ローカル変数がスコープを抜けるとき、デストラクタが呼ばれる順序は決まっているのでしょうか?
できれば規格書のどこに記述があるかも教えていただけるとうれしいです。

int foo()
{
Hoge a;
Hoge b;
// 何か処理
}
という関数を抜けるとき、a→bの順で解放されるのか、b→aの順で解放されるのか、
それとも決まってないのか? 構築したのと逆順で呼ばれるのが合理的と思いますが……

288 :デフォルトの名無しさん:2010/10/19(火) 00:18:35
a→bの順ですよ

289 :デフォルトの名無しさん:2010/10/19(火) 00:24:16
3.6.3 Termination
These 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.

290 :デフォルトの名無しさん:2010/10/19(火) 00:26:58
>>288
なるほど。それじゃあこういう↓スコープガードで依存関係のあるリソースを扱うときは
気をつけないとハマりますね。
http://d.hatena.ne.jp/DigitalGhost/20100921/1285095799

291 :デフォルトの名無しさん:2010/10/19(火) 00:31:49
b→a

292 :デフォルトの名無しさん:2010/10/19(火) 00:33:18
>>289
自分でも規格書を確認しました。やっぱり逆順なんですね。
>>290のリンク先のようなスコープガードも、自然な順序で書いていけば問題なしと。

293 :デフォルトの名無しさん:2010/10/19(火) 01:24:44
でないと依存関係のあるリソース管理クラスなんて恐ろしくて使えない。

294 :デフォルトの名無しさん:2010/10/19(火) 01:27:34
自分で明示的にnew,deleteすればいいじゃない

295 :デフォルトの名無しさん:2010/10/19(火) 01:50:38
>>294 そんなことしなくてもいいようにできてる、って話だろ。

296 :デフォルトの名無しさん:2010/10/19(火) 09:23:34
アライメントの問題を忘れているだろう。
32bit境界に配置されていない変数は、
メモリアクセス時にペナルティーがかかったりするから、
intの方が効率がよい。メモリ効率を問題にするならintでbit演算、実行効率だけの問題ならint型の配列だろ。

297 :デフォルトの名無しさん:2010/10/19(火) 09:31:15
1バイトですむならそっちの方が良いよ。
doubleよりfloatですむならこっち。
演算速度より、メモリアクセスのほうが時間掛かるから。
32bitと8bitでは容量が1/4になるし。
スワップアウトを起こせば当然遅くなるけど、しなかったとしても容量の少ない方がアクセス速い。

298 :デフォルトの名無しさん:2010/10/19(火) 09:31:56
あとでどっちにもいじれるように
なるべく素直に書いとけばそれでいいよ

299 :デフォルトの名無しさん:2010/10/19(火) 09:32:39
メモリ増大は、他所にも影響及ぼすしなるべく省メモリを常に心がけるのが良い。

300 :デフォルトの名無しさん:2010/10/19(火) 09:38:21
アルゴリズムで解決できるレベルより下位の高速化はコンパイラやハード性能の進歩に任せ
プログラマは可読性や生産性のみを重視する方がよろしい

301 :デフォルトの名無しさん:2010/10/19(火) 10:09:57
std::bitset か std::vector<bool> 使え、っていう話とは違うの?

302 :デフォルトの名無しさん:2010/10/19(火) 10:20:35
さらに違う話になっちゃうけどvector<bool>はむしろ使っちゃいけないものだろ

303 :デフォルトの名無しさん:2010/10/19(火) 10:31:02
別にそんなことはない
仕様をちゃんと把握して、そこで使うのに問題がないと解ってるなら使っても良い

304 :デフォルトの名無しさん:2010/10/19(火) 10:36:32
std::bitsetよりかはvector<bool>がいい。
固定長と可変長の違い。
必要な分だけ確保できるから。

305 :デフォルトの名無しさん:2010/10/19(火) 10:38:00
>>303
設計ミスによる削除の可能性を聞いたことがあるけど、どうせ今さら削除できないでしょ。
標準に代替が用意されていない現状ではなおのこと。

306 :デフォルトの名無しさん:2010/10/19(火) 10:38:54
>>296,304
上から目線であやふやな思い込みを語るのはどうかと思う。

307 :デフォルトの名無しさん:2010/10/19(火) 10:39:42
>>304
違いは明らかだが、それが「いい」とは限らないだろ。

308 :デフォルトの名無しさん:2010/10/19(火) 13:29:40
プログラマーやゲームプログラマーに聞きたいんですが、
変数名とかつけるのにルールとかあるんですか?

あれば、簡単に教えてください。

309 :デフォルトの名無しさん:2010/10/19(火) 13:33:30
>>308
クラス名・変数名に迷ったら書き込むスレ。Part18
http://hibari.2ch.net/test/read.cgi/tech/1277016982/

310 :デフォルトの名無しさん:2010/10/19(火) 16:36:32
悩むな
変数名なんてchinko unko mankoでいいだろ

311 :デフォルトの名無しさん:2010/10/19(火) 16:42:34
>>310
言い出しっぺの自分が業務でそういう変数名使ってくれ
俺は使わんが

312 :デフォルトの名無しさん:2010/10/19(火) 16:45:36
てか、単純に変数名の決め方について聞いてるのか
命名規則について聞いてるのかどっちなんだ?

313 :デフォルトの名無しさん:2010/10/19(火) 20:33:40
C++のSTLでmap同士を結合するにはどうしたらいいんだろう?

314 :デフォルトの名無しさん:2010/10/19(火) 20:48:01
map<key,map<key,val>>

315 :デフォルトの名無しさん:2010/10/19(火) 20:49:33
set_union

316 :デフォルトの名無しさん:2010/10/19(火) 20:54:35
earth_union

317 :デフォルトの名無しさん:2010/10/20(水) 00:34:08
std::bitsetって
fwrite(&bit,sizeof(bit),1,fp);
でファイルに書き込んだものを
fread(&bit,sizeof(bit),1,fp);
で読み取っても大丈夫ですか?


318 :デフォルトの名無しさん:2010/10/20(水) 00:52:43
>>317
そんな保証はありません。

319 :デフォルトの名無しさん:2010/10/20(水) 00:56:23
>>313
「結合」の意味を明確にしないと答えにくいな。
単純に map::insert() や std::merge() を使ったとして、重複したキーは片方消えていいの?とか。

320 :デフォルトの名無しさん:2010/10/20(水) 03:55:39
externってどんなときに使いますか?

321 :デフォルトの名無しさん:2010/10/20(水) 04:05:48
止むに止まれぬ事情がある時

322 :デフォルトの名無しさん:2010/10/20(水) 04:49:32
>>320
const なオブジェクトを外部リンケージで定義したいときと、 extern "C" のため。

323 :デフォルトの名無しさん:2010/10/20(水) 08:06:01
俺はオブジェクトは全部グローバル変数で宣言して
extern使ってたけどダメなの?

324 :デフォルトの名無しさん:2010/10/20(水) 08:08:19
いいですよ

325 :デフォルトの名無しさん: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風なんですか?

よろしくお願いします。

326 :デフォルトの名無しさん:2010/10/20(水) 09:57:22
別のクラスからは解放できない。(singleton がprivateメンバだからね)
SingletonClass のstaticメンバ関数で delete singleton することはできる。
が、それは普通のやり方ではないと思う。

C++風な書き方としては、単なるポインタではなくスマートポインタ(std::autoptrなど)を使う。
これで、deleteのことを気にしなくてよくなる。
あるいは、ポインタとnewを使うのではなく、単に値型を使う(static SingletonClass singleton; のように)。
これに対して、基本的にいつでもnewしたものをオブジェクト参照に突っ込む、
という感じなのがJava風かな。

327 :デフォルトの名無しさん:2010/10/20(水) 10:00:12
シングルトンは寿命管理用の内部クラスとか関数を作らないとだめだよ

328 :デフォルトの名無しさん:2010/10/20(水) 10:18:37
>>326
いや、 delete SingletonClass::getInstance(); で誰でも解放できるよ。
そして次に SingletonClass::getInstance() を呼べば別インスタンスを返す。
だからこの方法をSingletonパターンと呼ぶのにはちょっと無理がある。

329 :デフォルトの名無しさん:2010/10/20(水) 10:21:36
別インスタンスは返さないか・・・ごめんなさい寝ぼけてた。

330 :デフォルトの名無しさん:2010/10/20(水) 10:27:42
皆さんありがとうございます。
C++風の方法として下記のものもありました。
class SingletonClass {
private:
SingletonClass(void) {}
public:
static SingletonClass& getInstance(void) {
static SingletonClass singleton;
return singleton;
}
void doSomething(void);
};


これなら、別にnewでインスタンス作ってるわけじゃないので、
プログラム終了時に自動的に解放されるという認識でよいでしょうか?

331 :デフォルトの名無しさん:2010/10/20(水) 10:30:49
>>328
そういや誰でもgetInstance()で取ってきたポインタでdeleteできちゃうんだな。
気づいてなかったアホやった。

332 :デフォルトの名無しさん:2010/10/20(水) 10:34:45
newとdeleteは使用禁止にしろ

333 :デフォルトの名無しさん:2010/10/20(水) 11:30:34
どなたか>>330の認識であってるかご回答よろしくお願いします

334 :デフォルトの名無しさん:2010/10/20(水) 11:50:35
>>330
これが C++ 風。
Class singleton;
あるいは。
Class& singleton();

どうにかしてクラスと new で解決しないといけないのが Java 風。

335 :デフォルトの名無しさん:2010/10/20(水) 11:52:13
おっと、ここは extern が要るな。 >>334 のいっこめは↓これで。
extern Class singleton;

336 :デフォルトの名無しさん:2010/10/20(水) 12:16:18
>>334-335
ありがとうございました。

337 :デフォルトの名無しさん:2010/10/20(水) 14:09:03
CRTPのようなテクニック名を全種類教えてください
23のデザインパターンは知っているのでもう結構です。

338 :デフォルトの名無しさん:2010/10/20(水) 18:05:17
More C++ Idioms
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms

339 :デフォルトの名無しさん:2010/10/20(水) 20:08:48
なにこのダサい本

340 :デフォルトの名無しさん:2010/10/20(水) 20:40:54
ほとんど起こりえない危険のためにわざわざ難読化するイディオム集

341 :デフォルトの名無しさん:2010/10/20(水) 20:57:02
世界中の人が寄ってたかって開発するなら、これくらいガードを固めておかないとだめなんだろう。

342 :デフォルトの名無しさん:2010/10/20(水) 21:00:52
本当に必要なケースってどれぐらいあるもんなんだろうなー

343 :デフォルトの名無しさん:2010/10/20(水) 21:00:59
一般常識 + 頭の体操レベルだからそんなに拒否反応示すなよ

344 :デフォルトの名無しさん:2010/10/20(水) 21:03:20
>>340
こいつ最高にアホ

345 :デフォルトの名無しさん:2010/10/20(水) 21:20:58
別に一般常識では無いだろう。
趣味でもプログラムやるような奴ぐらいしかこんなの知らんし
仕事で使ったら周りの効率ガタ落ちするレベル


346 :デフォルトの名無しさん:2010/10/20(水) 21:33:55
pimplイディオムとCRTPを組み合わせる場合、どのようにするべきでしょうか。

CRTPを要求するクラスを継承してImplクラスを作りたい場合、Implクラスをprivate宣言すると、
テンプレート引数として使用できないため、エラーとなります。

class A {
private:
 class Impl;
 Impl *pimpl;
};
class A::Impl : public B<A::Impl> ← ここでImplにアクセスできないのでエラー

とりあえず、Implをpublic宣言しておいて、Implのコンストラクタをprivateにし、
Aをfriend宣言して対応したのですが、もっとすっきりしたやり方がないものでしょうか。

347 :デフォルトの名無しさん:2010/10/20(水) 22:05:56
ちょっと長いけど、これg++4.1.2だと通るのにVC++10だと通らないw なんじゃそりゃ。

template <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; }


348 :デフォルトの名無しさん:2010/10/20(水) 22:31:54
http://codepad.org/HKyF48Gd
VS2010でも通るけど・・・?どっか違うところ間違ってんじゃね?

349 :デフォルトの名無しさん:2010/10/20(水) 22:36:45
>>347
VC10でも通ったぞ
通らないならエラーメッセージくらい書けっての

More C++ Idiomsのいくつかは標準やtr1、0xのライブラリの実装でも
使われてる技法だから、知ってても悪くないと思うけどね
Boostでは当然に使われているものもあるね

350 :デフォルトの名無しさん:2010/10/20(水) 22:40:22
イディオムは上級者ほど恩恵に預かる
逆にいうと利点を感じないのは素人の証

351 :デフォルトの名無しさん:2010/10/20(水) 22:46:22
イディオムって言うと範囲広すぎてアレだが
誰が使うんだよこれっていうイディオムは割とたくさんあると思うぞ

352 :デフォルトの名無しさん:2010/10/20(水) 22:47:46
>>347
インテリセンスはエラー出すけど、コンパイルは通るな。

353 :デフォルトの名無しさん:2010/10/20(水) 23:01:26
>>345
Include Guard Macro とか Non-copyable Mixin とかも?

354 :デフォルトの名無しさん:2010/10/20(水) 23:15:22
safe boolとかつかってんのみたことない

355 :デフォルトの名無しさん:2010/10/20(水) 23:27:09
仕事で効率落ちるとか笑えるね
効率上げるためのイディオムだろう

356 :デフォルトの名無しさん:2010/10/20(水) 23:34:32
早く仕事就けよ

357 :デフォルトの名無しさん:2010/10/20(水) 23:53:14
得られる利益に対して、やることが複雑すぎるイディオム多くね
ライブラリのユーザーだまくらかしてまで制限加えて、果たして効率上がってるのかなぞ


358 :デフォルトの名無しさん:2010/10/20(水) 23:59:58
pimplとか書いてて虚しくなってくるな

359 :デフォルトの名無しさん:2010/10/21(木) 00:33:53
>>354
有名な所ではstd::shared_ptrやstd::functionのブーリアンコンテキスト
Boostでは他にもいろんな所で使われてる

360 :デフォルトの名無しさん:2010/10/21(木) 01:06:51
x,y座標上に点がいくつもあって、大きな面積の四角形を作れるような4点の組み合わせを
順に決めていきたいです。
一番大きな四角形を作れる4点→その4点を除いた一番大きな(ry→点が3点以下になるまで繰り返し
みたいな感じ。図で表すとこの画像のような感じで4点の組み合わせを決めたい
何か出来るだけ効率よく4点の組み合わせを選んでいく方法教えてください

ttp://skm.vip2ch.com/-/hirame/hirame123032.png

361 :デフォルトの名無しさん:2010/10/21(木) 01:35:13
>>357
そんな複雑か?

362 :デフォルトの名無しさん:2010/10/21(木) 10:13:39
>>360
どの程度「効率」良くする/なるかは問題の規模に依ると思うが、まず数が少ない
ならその単純なアルゴリズムでも良いんじゃないか?

次に一つ考えられるのは、今のしらみつぶしに脱出条件として、全体の領域を
見て外の点(選ぶ順序は工夫いるかも)からトライしていって、
他の点が全て領域の中に入ったら次へ、と再帰的に
(ただ重なる領域で比較もありうるからしらみつぶしがデフォルトで脱出条件)
真面目に考えてないからもっと賢い方法もあるだろう

もっと色々「改良」考えられるだろうけど、凝った事しだすと
アルゴリズム的にもコーディング的にもミスしやすくなるから問題の規模
と必要性に応じてどこまでするか考えたら?

363 :デフォルトの名無しさん:2010/10/21(木) 13:21:50
すみませんwiki bookってなんで本がただで見れるんですか?

364 :デフォルトの名無しさん:2010/10/21(木) 13:58:38
http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E4%BB%A3%E6%95%B0%E7%9A%84%E9%9A%8E%E5%B1%A4(Algebraic_Hierarchy)
上記のホームページにあるソースコードのstruct BaseConstructor { BaseConstructor(int=0) {} };
は何の役に立ってるんですか?

365 :デフォルトの名無しさん:2010/10/21(木) 14:13:00
>>364
Number::Number() と区別するのに使われてるみたい。

にしても、キモいコードだな。参照カウンタいっこ無駄になってるし。
こんなごく普通の継承関係( is-a 関係)を「代数的階層」とか
仰々しい名前で呼ぶ意味もわからん。

366 :デフォルトの名無しさん:2010/10/21(木) 14:29:39
const Number &とNumber const &でゆれてるのは何か意味があるのか?

367 :デフォルトの名無しさん:2010/10/21(木) 14:57:42
>>360
@適当なアルゴリズムで最大ではないけど比較的大きい四角形を見つける
Aその内部の点をすべてひとまず除外する
B(@〜A)を適当な回数繰り返す
C残った僅かな点で総当りして最大を決める
D最大の四角形を確定して点を集合から削除する
E点がなくなるまで繰り返す

368 :デフォルトの名無しさん:2010/10/21(木) 14:59:39
>>364
が全然分からないのですが
なんでoperator=がswapなんですか?

369 :デフォルトの名無しさん:2010/10/21(木) 15:08:34
>>367
全部の頂点が円周上に並んでたら、どの4点を選んでも除外される頂点は存在しない
オーダー的にはただの総当たりと変わらないぞ

370 :デフォルトの名無しさん:2010/10/21(木) 15:26:41
>>369
最悪のケースを例示するだけじゃ議論の意味は無い
確率や平均ケースとの比較も交えて初めて問題点を議論する価値が生まれる

371 :デフォルトの名無しさん:2010/10/21(木) 15:46:43
>>364
解説が不親切過ぎるw
サンプルコードに別のイディオム使って複雑化させ過ぎだし。

こっち見るとかなり単純な話なんだが。
http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#AlgebraicHierarchy

372 :デフォルトの名無しさん:2010/10/21(木) 15:55:37
x軸方向、y軸方向の二通りにソートしてそれぞれ順位をつける
xとyの順位の和が一番少ないものと一番大きいもの
xとyの順位の差が大きいもののなかでx,yの順位が小さいもの
計4点を頂点として4角形としリストから除外
残りの点で上記を繰り返す

373 :デフォルトの名無しさん:2010/10/21(木) 16:43:04
>>370
計算量について議論するならば最悪のケースは避けては通れない
だからそれを例示するのは十分に意義のある事

374 :デフォルトの名無しさん:2010/10/21(木) 16:58:46
>>367
単にそれっぽい頂点を見つけるだけなら凸包を求めればいい
凸包ならDの完了後定数時間でCを開始できるので最終的には適当にやるより速いはず

375 :デフォルトの名無しさん:2010/10/21(木) 17:30:06
クラスメンバ固定配列の数を取得する時、簡単にテンプレートメタで取得出来ると
思っていたのですがうまくいきませんでした。
代わりの方法でもう対処しましたが、テンプレートメタでクラスメンバ固定配列の数
を取得するにはどうすればいいでしょうか?(興味本位ですが)


376 :デフォルトの名無しさん:2010/10/21(木) 17:48:56
>>375
「クラスメンバ固定配列の数」とはなんですか?

377 :デフォルトの名無しさん:2010/10/21(木) 19:04:53
>>374
定数時間では無理じゃね?

378 :デフォルトの名無しさん:2010/10/21(木) 19:06:54
>>373
その円周上に配置されるケースがどれぐらいの頻度で出るかが問題だろう?
ランダム配置でそうなることなんて無視できるぐらい少ないし
意図的に偏らせてあるならそれは問題だから修正しなくてはならない
「そういうケースがある」ってだけじゃほとんど無意味な情報なのよ
あくまで分布とセットじゃないと議論にならんの
いっぺん統計物理とか統計に関わることを勉強してみなさい
分布無しで語れることなんてほとんど何も無いから

379 :デフォルトの名無しさん:2010/10/21(木) 19:26:45
C++のgetlineについてなのですが
改行か「。」のどちらかが出てきたら読み込みを終えるようにするにはどうすればいいのでしょうか?

istream& std::getline( istream& is, string& s, Char delimiter )で
delimiterを指定しないとちゃんと改行で止まるのですが、「。」を指定すると改行は無視されてしまいます

380 :デフォルトの名無しさん:2010/10/21(木) 20:06:53
>>378
起きる確率が低い事象を無視するかどうかはアルゴリズムの開発者が決めることじゃない
利用者である>>360が判断すること
だから最悪の評価を提示するのは意味のある事だよ
クイックソートなんかいい例でしょ?

ついでに言うと、このアルゴリズムだと頂点数が十分に多くてかつ頂点が密集している場合、
凸包に含まれる頂点数が慢性的に"僅かな数"とはなりにくいので、平均でも速くない可能性があるよ
総当たり以外の対案を思い付かないから具体的な評価はできないけど・・・

381 :デフォルトの名無しさん:2010/10/21(木) 22:19:02
構造体にstaticを付けてprivateの代わりにしようと思いました
しかし、gccに怒られます

構造体をprivateにする方法はありますか?(技術的に興味があるだけ)

382 :デフォルトの名無しさん:2010/10/21(木) 22:20:31
(;´Д`)?

383 :デフォルトの名無しさん:2010/10/21(木) 22:21:15
static private struct{};

384 :デフォルトの名無しさん:2010/10/21(木) 22:24:06
class Hoge
{
struct Gorilla
{
};
};

385 :デフォルトの名無しさん:2010/10/21(木) 22:24:09
>>381
型名と変数名の区別がつくようになれよ

386 :381:2010/10/21(木) 22:34:01
typedef struct {
std::string s1;
static std::string s2;
} test


387 :デフォルトの名無しさん:2010/10/21(木) 22:36:42
(;´Д`)?

388 :デフォルトの名無しさん:2010/10/21(木) 22:44:17
>>360
総当りより少しましな方法。計算量は総当りがO(n^4)、本手法はO(n^3)
指針は、「全ての2点の組について、それら2点を対角とする最大の四角形を求める」

・2点を対角とする最大の四角形の求め方

  1. 2点A,Bを結ぶ直線ABを考える
  2. ABのそれぞれの側で、ABからの距離が最大となる点C,Dを求める
  3. 四角形ACBDがABを対角とする四角形で最大

389 :デフォルトの名無しさん:2010/10/22(金) 01:11:26
>>362>>367>>372>>374>>388
ありがとう。想定しているのは点1000個ぐらいで点の更新とこの処理を高速で繰り返し
行ないたい。って状況です
とりあえずレスくれたの参考に簡単なのから作ってみる
プログラミングやりだしてからもっと数学真面目に勉強しておくべきだったと感じるね

390 :デフォルトの名無しさん:2010/10/22(金) 01:11:37
>>368
例外安全を保証するための定番の書きかたなんだけど、
このコードでは冗長なだけだね。

391 :デフォルトの名無しさん:2010/10/22(金) 14:27:59
ある数値の入った変数 x, 演算子 + - ~ & | だけを使用して0を作れ。
だたし最も少ない使用数とする。

この問題とけるひといませんか?

392 :デフォルトの名無しさん:2010/10/22(金) 14:29:16
x-x=0

393 :デフォルトの名無しさん:2010/10/22(金) 14:30:11
問題間違えました!!!

ある数値の入った変数 x, 演算子 + - ~ & | だけを使用して1を作れ。
だたし最も少ない使用数とする。

この問題とけるひといませんか?


394 :デフォルトの名無しさん:2010/10/22(金) 14:31:32
>>391
使っていいものをはっきりと頼む。
まぁ、xを二回使っていいなら>392のようにx-xでいいな。

395 :デフォルトの名無しさん:2010/10/22(金) 14:32:32
xの使用数は何回でも良いですよ。
演算子も何回でも良いです。

396 :デフォルトの名無しさん:2010/10/22(金) 14:39:30
()は使っちゃダメなの?

397 :デフォルトの名無しさん:2010/10/22(金) 14:40:12
0はx-xが0になるから使えるから使えるよ

398 :デフォルトの名無しさん:2010/10/22(金) 14:40:25
宿題スレでやれ

399 :デフォルトの名無しさん:2010/10/22(金) 14:40:39
いや( )

400 :デフォルトの名無しさん:2010/10/22(金) 14:41:40
もちろん、いいとも

401 :デフォルトの名無しさん:2010/10/22(金) 14:42:06
x=1

402 :デフォルトの名無しさん:2010/10/22(金) 14:42:56
-(x+~x)
又は
-(x|~x)

403 :デフォルトの名無しさん:2010/10/22(金) 14:45:25
ありがとうございましたwwwwwwwwwww

404 :デフォルトの名無しさん:2010/10/22(金) 17:31:51
インラインコンストラクタって使います?

405 :デフォルトの名無しさん:2010/10/22(金) 17:37:57
妙な造語作らないでください

406 :デフォルトの名無しさん:2010/10/22(金) 22:53:59
>>375
クラスメンバ固定配列って int a[100] とかがクラス内で定義されてるってことか?
その要素数が知りたいってこと?
クラスから返却値として返して通常の配列と同じように扱えばいい気がするけど
それじゃだめなのかな

407 :デフォルトの名無しさん:2010/10/23(土) 00:10:16
>>406
TMPで…ってことなので
int a[100] があったときに countof<a>::value で配列の要素数が得られる
とかじゃね?

408 :デフォルトの名無しさん:2010/10/23(土) 01:12:10
>>405
inlineキーワードが付いたコンストラクタ

409 :デフォルトの名無しさん:2010/10/23(土) 01:27:13
>>407
オレもそのように解釈してるよ
返却値ってのはメタ関数に渡すためにクラスから配列の型をtypedefで渡せってこと
その例でいくとaを渡しても多分無理な気がするから
直接型を渡すしかないんじゃないかな

http://codepad.org/bfeSK7W7
こんなことするよりか要素数を定数で持ったほうが早いとは思うけど

410 :デフォルトの名無しさん:2010/10/23(土) 11:28:46
放送中
http://www.ustream.tv/channel/boostkansai

411 :デフォルトの名無しさん:2010/10/23(土) 11:30:26
>>408
今時の処理系ではinlineキーワード自体が無意味。

412 :デフォルトの名無しさん:2010/10/23(土) 11:44:25
かなり無意味だが要素数はこれでコンパイル時に出るよ
http://codepad.org/3VGxIJXI

413 :デフォルトの名無しさん:2010/10/23(土) 12:28:46
>>412
それって一応テンプレート関数なんですか?
関数で中カッコがないのは初めて見ました

414 :デフォルトの名無しさん:2010/10/23(土) 12:48:03
sizeofは返り値の型のみに興味があるから関数を呼ばない、だから実装が存在しなくてもいい

415 :デフォルトの名無しさん:2010/10/23(土) 13:13:59
>>389
面積を最大にする四角形の各頂点は
与えられた点の中でx座標かy座標が
最大か最小になるんじゃないかな。

感覚的には正しそうだけど、ちゃんと証明
しないといけない。
これが証明できれば候補が極端に絞られるね。

416 :デフォルトの名無しさん:2010/10/23(土) 13:16:36
>>415
ちがう

417 :デフォルトの名無しさん:2010/10/23(土) 13:19:19
>>415

418 :デフォルトの名無しさん:2010/10/23(土) 14:47:59
>>376
配列の要素数ではなく
class xxx{
int a[10]:
char b[20];
long b[30]:
}
この場合の固定配列の数は3です。
まさしく固定配列の数なんです。

419 :デフォルトの名無しさん:2010/10/23(土) 14:52:09
名前を調べるメタ関数がないから無理

420 :デフォルトの名無しさん:2010/10/23(土) 15:23:09
そんなの知ってどうするのか気になる

421 :デフォルトの名無しさん:2010/10/23(土) 16:44:20
>>418の作ったモジュールとリンクすると
配列の宣言数に依存した動きをするのか
なかなか予想できない挙動だなw

422 :デフォルトの名無しさん:2010/10/23(土) 19:27:07
前方宣言をすると依存関係を減らせるという
記事を読んだのですが、依存関係とは何を指し示しているのですか?

423 :デフォルトの名無しさん:2010/10/23(土) 19:40:10
どこの記事?

424 :422:2010/10/23(土) 19:45:24
>>423
google先生で適当に検索したサイトなので、覚えていません
スマソ

425 :デフォルトの名無しさん:2010/10/23(土) 20:30:31
>>422
たとえば、クラス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 やそれをインクルードしているファイルには
影響が及ばなくなり、再コンパイルの時間も短くなる。

426 :デフォルトの名無しさん:2010/10/23(土) 20:32:51
インクルードするファイルを少しでも減らすといい結果になる場合が多い

427 :デフォルトの名無しさん:2010/10/23(土) 20:35:25
template <typename T> class A;

class B {
friend ?? ←ココ
};

AがBのprivateメンバにアクセスできるようにしたいのですが、前方宣言したテンプレートクラスを
friend宣言するには、どのように記述すればよいのでしょうか?

428 :デフォルトの名無しさん:2010/10/23(土) 20:47:54
>>427
http://codepad.org/CMaqow6S

429 :デフォルトの名無しさん:2010/10/23(土) 20:56:16
ヘッダーファイルをincludeするためだけのヘッダーファイルって良くない?

430 :デフォルトの名無しさん:2010/10/23(土) 20:57:24
何が?

431 :デフォルトの名無しさん:2010/10/23(土) 20:57:42
>>429
インクルードする手間を減らす為のもの?

432 :デフォルトの名無しさん:2010/10/23(土) 20:58:49
そうです。私はライブラリなんかでそういうファイルを作りがちなので

433 :デフォルトの名無しさん:2010/10/23(土) 21:02:19
そういうことすると
そこに登録されたヘッダーが1つ変わっただけで
全然関係ないところもリビルドされちゃうんじゃないかな

434 :422:2010/10/23(土) 21:03:22
>>425-426
thx

435 :デフォルトの名無しさん:2010/10/23(土) 22:51:46
>>432
基本はそれでいいんだよ。A.hを使いたいならA.hをインクルードするだけでA.hが使うB.hとかC.hとか自動的にインクルードされるから。使うのが楽
ライブラリなら変更頻度も低いはず。で問題が起きたら別ければいいの
名前がぶつかる→名前空間を使ってください。
ビルド時間が延びる→pimplを使ってヘッダの依存を減らしてください。


436 :デフォルトの名無しさん:2010/10/24(日) 00:25:43
>>432
ほぼ完成されたライブラリで、ユーザーの利便性のために提供するなら悪くないと思う。
でもそれをライブラリ内でも使うのはやめといたほうがいいよ。
修正→コンパイル→テストのサイクルに悪影響を与える可能性が高いから。

437 :デフォルトの名無しさん:2010/10/24(日) 00:26:49
常に最小限のインクルードを心がけてる

438 :デフォルトの名無しさん:2010/10/24(日) 01:40:14
>>433,435,436
ありがとうございます。

439 :デフォルトの名無しさん:2010/10/24(日) 08:43:07
>>412
こういうクソったれなテクニックが山ほどあるところがC++のクソなところ。

440 :デフォルトの名無しさん:2010/10/24(日) 09:24:05
Chaos++

441 :デフォルトの名無しさん:2010/10/24(日) 12:38:14
裏技的なものがあっても使わなければいけないわけじゃないから
それがあるから「クソ」ということも無いだろ

442 :デフォルトの名無しさん:2010/10/24(日) 12:48:40
これでよくね?これならよく使うね。
template <class T, unsigned N>
inline size_t Elems(T const (&)[N])
{
return N;
}


443 :デフォルトの名無しさん:2010/10/24(日) 12:49:56
>>442
それではコンパイル時にサイズ取れぬぅ!

444 :デフォルトの名無しさん:2010/10/24(日) 12:58:12
char配列の参照を返すテンプレートをsizeofするんだよな


constexpr早く来い

445 :デフォルトの名無しさん:2010/10/24(日) 13:03:31
参照ってポインタサイズじゃないのか

446 :444:2010/10/24(日) 13:05:12
って>>412じゃねーか
よく読まずにレスした結果がこれだよ!

447 :デフォルトの名無しさん:2010/10/24(日) 15:53:56
クラス内に定義したstatic変数って、静的領域にメモリが確保されるってことでいいでしょうか?
つまり、スタック領域に確保されてしまうと、スタックオーバーフローを起こす可能性があるので、
心配しているんです。

448 :デフォルトの名無しさん:2010/10/24(日) 15:55:19
なんか勘違いしてるような?

449 :デフォルトの名無しさん:2010/10/24(日) 15:56:38
とりあえず、クラス内に定義したstatic変数は、どの領域に確保されるかを教えていただければいいんですが。。。

450 :デフォルトの名無しさん:2010/10/24(日) 16:08:41
static変数をもつclassって動的に使えるのけ?

451 :デフォルトの名無しさん:2010/10/24(日) 16:08:46
boost::reference_wrapperってなんのためにあるの?

template <class T> void func(T obj);

これに参照を渡せるようにしたいから有るって聞いたんだけど

template <class T> T & ref(T & r) { return r; }
func(ref(obj));

こうしてもfunc<T &>が呼ばれるからいちいちreference_wrapperにしなくてもいいと思うんだけど…

452 :デフォルトの名無しさん:2010/10/24(日) 16:10:55
クズどもしかいないようだからいいわ

453 :デフォルトの名無しさん:2010/10/24(日) 17:12:57
>>451
http://codepad.org/MikKgG1W

454 :デフォルトの名無しさん:2010/10/24(日) 17:16:46
デストラクタは自分で直接呼び出せるけど、それが必要な場面ってありますか?

455 :デフォルトの名無しさん:2010/10/24(日) 17:21:28
>>453
あ、普通に参照渡してもコピーされるのね…なんか勘違いしてた
どうもですた

456 :デフォルトの名無しさん:2010/10/24(日) 17:21:46
>>454
配置new

457 :デフォルトの名無しさん:2010/10/24(日) 19:06:38
>>455
Java もやってる?Java だと挙動違うから混乱しやすい

458 :デフォルトの名無しさん:2010/10/24(日) 19:29:59
関数の戻り値以外でポインタを使う場合ってありますか?

459 :デフォルトの名無しさん:2010/10/24(日) 19:31:31
printfの引数の型を調べてみろ

460 :デフォルトの名無しさん:2010/10/24(日) 19:33:45
クラス内の別のクラスをメンバとして持たせた場合、
そのメンバのクラスのコンストラクタって実行されますか?
実行されるとしたら、どのタイミングで実行されますか?

461 :デフォルトの名無しさん:2010/10/24(日) 19:35:15
>>460
クラス内の→クラス内に
が正しいです。

462 :デフォルトの名無しさん:2010/10/24(日) 19:37:42
やってみたほうがはやくね

463 :デフォルトの名無しさん:2010/10/24(日) 19:38:57
やったんですが、どうも実行されてない感じなので、確かめたいんです。

464 :デフォルトの名無しさん:2010/10/24(日) 19:43:43
どんなソース書いたのか晒してみ?

465 :デフォルトの名無しさん:2010/10/24(日) 19:44:33
実はメンバがポインタだったりしてな

466 :デフォルトの名無しさん:2010/10/24(日) 19:46:25
DRAW::DRAW()
:now(0),width(0),height(0){}

こんな感じ

467 :デフォルトの名無しさん:2010/10/24(日) 19:47:43
 こ れ は ひ ど い

468 :デフォルトの名無しさん:2010/10/24(日) 19:48:57
え?どっかおかしいですか?

469 :デフォルトの名無しさん:2010/10/24(日) 19:52:51
now,width,heightはクラスなの?


470 :デフォルトの名無しさん:2010/10/24(日) 19:53:15
別のクラスってのはどれのことなんだ
問題のメンバはどれなんだ
質問してる内容についてのことが何もわからないぞ

471 :デフォルトの名無しさん:2010/10/24(日) 20:01:09
引っ張る話題でもないので
http://codepad.org/UxA3ZeAX

printf挟むなりデバッガ使うなりしようぜ

472 :デフォルトの名無しさん:2010/10/24(日) 20:05:24
http://codepad.org/zleOhppG

!?

473 :デフォルトの名無しさん:2010/10/24(日) 20:08:06
みなさんありがとうございます。
やっぱり実行されますよね。

どっかで値が変わってしまってるようなので、徹底的に調べます。

474 :デフォルトの名無しさん:2010/10/24(日) 21:37:09
get/setのgetにはひとまず、constを付けておくべきですか?

475 :デフォルトの名無しさん:2010/10/24(日) 21:40:02
そりゃconst付けられるなら付けたほうがいい

476 :474:2010/10/24(日) 21:40:54
>>475
了解しました
ありがとうございます

477 :デフォルトの名無しさん:2010/10/24(日) 21:58:31
const付けられるものは全部つけたほうがいい
どのメソッドにconst付けるべきか判断できないなら、
それは設計に失敗しているかもしれない

478 :デフォルトの名無しさん:2010/10/24(日) 22:04:20
>>458
データ構造を考えるようになると、いろいろと。

479 :デフォルトの名無しさん:2010/10/26(火) 21:53:18
普通にソフトを作っているだけで、スタックオーバーフローって発生する?
フレームワーク使うと、裏でいろいろやってくれているから発生しな気がするんだけど

480 :デフォルトの名無しさん:2010/10/26(火) 22:13:03
普通にソフトを作っているだけでは、スタックオーバーフローって発生しません

481 :デフォルトの名無しさん:2010/10/26(火) 22:51:59
>>480
そうとは限らないぞ
巨大な配列や巨大なクラスをローカル変数に取るとスタックがパンクする事がある

482 :デフォルトの名無しさん:2010/10/26(火) 22:52:29
スタックオーバーフローなんて経験したのは、再帰の練習問題で変なコード書いちゃった時くらいだな。

483 :デフォルトの名無しさん:2010/10/26(火) 22:56:07
>>482
俺も再帰覚えたての頃やらかしたわ

484 :デフォルトの名無しさん:2010/10/26(火) 22:58:14
再帰でやらかす奴そんなにいるか?
それ以前に二次元配列あたりでぶちあたるはずだが

485 :デフォルトの名無しさん:2010/10/26(火) 22:58:53
そうなんですよね。再帰は難しいから一度は勉強するけど
その後は使わないんですよね?

486 :デフォルトの名無しさん:2010/10/26(火) 22:59:26
再帰って大抵O(log n)のアルゴリズムの時じゃないとループにしちゃうから
再帰書いても滅多なことではオーバーフロー起こさないよね

487 :デフォルトの名無しさん:2010/10/26(火) 23:15:05
今まで独学でC++を勉強してきたのですが、
ライブラリを作成してみようとしたところで詰まってしまいました
調べてみても納得いく説明があるサイトが見つからず、他に聞ける人もいなくて困っています
もしかしたらライブラリの解釈も間違っているかもしれないので、1からご教授頂けると助かります

私の中では静的ライブラリ(libファイル)の中には複数のh、cppファイルを内包できて、
ライブラリを利用する関数などの宣言が書かれているhファイルと出来上がったlibファイルをプロジェクトに追加すれば呼び出せる

と考えているのですがどうでしょうか
また、ライブラリの中にクラスを入れたい場合や、ライブラリ内にあるクラス同士での#includeなどの操作、
ひとつのlibファイルに複数のクラスを入れてもいいものなのかどうなのかなど、
全然わからず手探り状態なので、どなたかよろしくお願いします

488 :デフォルトの名無しさん:2010/10/26(火) 23:23:13
ヘッダは同じものを使わないとだめ
libもリンクしないと使えないし、コンパイルする環境が違うと困る

489 :デフォルトの名無しさん:2010/10/26(火) 23:51:07
ゲーム製作に関するC++の質問ってどこのスレで質問するのが望ましいのでしょうか?

490 :デフォルトの名無しさん:2010/10/26(火) 23:57:43
なるほどです

たとえばライブラリ内に以下の4ファイルを含めてあった場合
foo.h //外部用関数宣言&#include "bar.h"
bar.h //クラス宣言
bar.cpp //クラス実装 #include "bar.h"

この場合は使用するプロジェクトへ追加するファイルはfoo.libとfoo.hの二つで、
プロジェクト側でのリンクが必要、ということでいいのでしょうか?

491 :デフォルトの名無しさん:2010/10/26(火) 23:57:46
C++ の言語自体の質問ならここでよかろう
API の考え方ならその API のスレ

492 :デフォルトの名無しさん:2010/10/26(火) 23:58:37
ゲームプログラムなら俺に聞けスレ

493 :デフォルトの名無しさん:2010/10/26(火) 23:59:23
>>490
ミスた、3ファイルの間違いです修正

494 :デフォルトの名無しさん:2010/10/27(水) 00:02:37
色々廻ってきます。
叩かれて戻ってきたらすいません。

495 :デフォルトの名無しさん:2010/10/27(水) 00:44:46
リードオンリーなメンバ変数を作ることは可能ですか?
全部にゲッタメンバをつけるのはなんか変なので

496 :デフォルトの名無しさん:2010/10/27(水) 00:49:32
メンバ変数にconst付ければ

497 :デフォルトの名無しさん:2010/10/27(水) 01:09:34
クラスのメソッドからは値を変えられるんですよ
内部状態なんで外部から変更されたくないけど、観測する必要があるので

498 :デフォルトの名無しさん:2010/10/27(水) 01:12:43
じゃあゲッタでいいでしょ

499 :デフォルトの名無しさん:2010/10/27(水) 01:13:40
>>497
何故、自分で試さないの?
バカなの?死ぬの?

500 :デフォルトの名無しさん:2010/10/27(水) 01:21:43
無理なら無理って言えばいいのに・・・

501 :デフォルトの名無しさん:2010/10/27(水) 08:13:30
publicでconstな参照にすれば?

502 :デフォルトの名無しさん:2010/10/27(水) 09:09:06
vectorで何もまだ値を格納してない状態で、beginとendをよびだしたら
何を返すの?

503 :デフォルトの名無しさん:2010/10/27(水) 10:15:17
>>582
やってみればいいじゃん

504 :デフォルトの名無しさん:2010/10/27(水) 10:22:21
特定のメソッドからしか呼び出さないサブルーチン用のメソッドが多いんです
スコープを制限したいんですが、関数内に関数を書くことは出来ませんよね?
なんか近い方法ないでしょうか?

505 :デフォルトの名無しさん:2010/10/27(水) 10:23:16
そうだぞ。まずはやってみるんだ>>582
期待しているぞ>>582
お前ならできる>>582

506 :デフォルトの名無しさん:2010/10/27(水) 10:23:58
×>>582
>>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は実質的に
それと等しく初期化されている事がわかる

本当の所はどうなのかは規格票によらなければならないが、まあだいたい予想通り
と言う事が出来る

507 :デフォルトの名無しさん:2010/10/27(水) 10:28:42
>>504
構造体とかクラスを関数内で定義すれば書ける。

508 :デフォルトの名無しさん:2010/10/27(水) 10:30:31
>>507
関数オブジェクトという奴でしょうか?
ただそれだとメソッド内クラスから元のクラスのメンバが参照できないため
invaild use of nonstatic data memberエラーになってしまうんです

509 :デフォルトの名無しさん:2010/10/27(水) 10:36:20
vectorの件ありがとう
プロジェクトを作成する手間が省けたわ

510 :デフォルトの名無しさん:2010/10/27(水) 10:48:17
>>504
C++0xのラムダ式をmutableにして無理矢理使う

511 :デフォルトの名無しさん:2010/10/27(水) 11:07:10
>>510
いいですね、これ
コンパイラも対応しているみたいですし
ありがとうございます

512 :デフォルトの名無しさん:2010/10/27(水) 11:23:20
>>508
もう遅いけどそういう場合はthisポインタ渡しとけばいいんじゃない?

513 :デフォルトの名無しさん:2010/10/27(水) 11:28:51
それってprivateメンバアクセスできんの?

514 :デフォルトの名無しさん:2010/10/27(水) 11:29:31
>>508
http://codepad.org/mM6aROvP
foo::func()内でbar::func()を宣言して、bar::func()内でfoo::Valueにアクセスしている。

515 :デフォルトの名無しさん:2010/10/27(水) 15:09:53
>>495
頭おかしいやつが登場したww

private指定したいわけじゃなくて??


516 :デフォルトの名無しさん:2010/10/27(水) 15:19:49
>>495
観測したい変数を全部構造体でまとめて、
それをconst参照するゲッタを作ればいい

ようはいちいちゲッタ作るの面倒って話でしょ?

517 :デフォルトの名無しさん:2010/10/27(水) 15:19:50
問題は、
・雪駄は勿論、下駄は必要なだけで充分。
・基本的に、下駄を公開するのは設計に問題がある場合が多い。本来なら適切な名前のメソッドで置き換えられるだろう。
・当然、雪駄については下駄以上に生で晒すのはおかしい。
という認識がないことじゃないか。

結論:
下駄や雪駄も生足同様、安易に公開するもんじゃない。

518 :デフォルトの名無しさん:2010/10/27(水) 15:21:41
>本来なら適切な名前のメソッドで置き換えられるだろう
なにかおかしくね?

519 :デフォルトの名無しさん:2010/10/27(水) 15:25:06
で、でたー!極論で設計に問題あり!

520 :デフォルトの名無しさん:2010/10/27(水) 15:29:23
下駄を使った場合。
「装備の一覧を見せてくれ。」
「一番いいのはどれだ。」
「そいつを頼む。」

下駄を使わない場合。
「一番いいのを頼む。」

521 :デフォルトの名無しさん:2010/10/27(水) 15:39:50
すでに持ってる装備を買っちゃうわけですね

522 :デフォルトの名無しさん:2010/10/27(水) 16:41:43
>>497
内部状態を外部から観測してなにするの?

523 :デフォルトの名無しさん:2010/10/27(水) 16:41:46
その設計で大丈夫か?

524 :デフォルトの名無しさん:2010/10/27(水) 16:46:41
大丈夫だ、問題ない。

525 :デフォルトの名無しさん:2010/10/27(水) 16:46:55
大丈夫だ、問題ない。

526 :デフォルトの名無しさん:2010/10/27(水) 17:45:13
エスパーで答えるけど、要するにViewの為にReadメソッドだけ公開したいんでしょ
コンパイル防壁も兼ねて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;
}

527 :デフォルトの名無しさん:2010/10/27(水) 17:53:02
コノストンラクタの中で、テクスチャを読み込んだらエラーを返す関数を実行してるんですが、
読み込みに失敗したら強制終了させたいんです。
でもコンストラクタって、戻り値返せないじゃないですか。
そのときって、exit(0)でkillするしかないんですか?
exitした時の動作って、ウィンドウとかちゃんと終了してくれるんですか?

528 :デフォルトの名無しさん:2010/10/27(水) 17:54:28
・例外
・initメンバ

529 :デフォルトの名無しさん:2010/10/27(水) 17:54:56
コンストラクタの中で失敗するような処理をしちゃいかん

530 :デフォルトの名無しさん:2010/10/27(水) 17:55:14
ウインドウを終了って

531 :デフォルトの名無しさん:2010/10/27(水) 18:05:10
コンストラクタで失敗するような処理をするのはまずいんですか。
考えるしかなさそうだな。わかったよ。

532 :デフォルトの名無しさん:2010/10/27(水) 18:52:21
>>526
コンパイルエラーが出るんですけど

エラー E2247 readonly1.cpp 19: 'Logic::x' はアクセスできない (関数 Logic::ProxyForView::x() const )

533 :デフォルトの名無しさん:2010/10/27(水) 19:04:44
>>531
別にまずくないよ。
std::vectorだってコンストラクタで失敗すれば例外投げるだけでしょ。

534 :デフォルトの名無しさん:2010/10/27(水) 19:19:31
>>495
struct a
{
private: int b;
public: const int& c;
a() : c(b) { }
};

const_cast されたらアウトだけどね

535 :デフォルトの名無しさん:2010/10/27(水) 19:21:50
>>532
ちゃんとpublicにしてるか?

536 :デフォルトの名無しさん:2010/10/27(水) 19:24:40
>>535
>>526をコピペしたんですけど

今からEclipse+CDTでもやってみます

537 :デフォルトの名無しさん:2010/10/27(水) 19:25:07
>>527
環境は?

538 :デフォルトの名無しさん:2010/10/27(水) 19:27:36
>>535
MinGW4.5.1ではコンパイル出来ました
ECC6.3.0のバグらしいです

539 :デフォルトの名無しさん:2010/10/27(水) 20:05:45
>>531
コンストラクタで例外は投げてもいいよ。
でも例外のへんな使い方はしないでね。

540 :デフォルトの名無しさん:2010/10/27(水) 20:48:38
今書いてるプログラムクラス、とか全部ヘッダに書いてるんだけど問題ってある?
今のところ普通に動いてるが、もっとでかくなる予定だから問題あるなら早めに修正しときたい。

541 :デフォルトの名無しさん:2010/10/27(水) 20:51:11
自分が問題を感じていないなら俺には全く問題ない

542 :デフォルトの名無しさん:2010/10/27(水) 20:51:21
定義に中身かいちゃうと環境によっては全部インライン展開されちゃう

543 :デフォルトの名無しさん:2010/10/27(水) 20:52:48
C++にはjavaのstatic イニシャライザみたいなの無いんですか?

544 :デフォルトの名無しさん:2010/10/27(水) 20:57:04
何故メモリーリークが発生するのですか?
newしたかをosが監視して、プロセスの終了とともにOSがヒープ領域を解放すればいいだけじゃないですか

545 :デフォルトの名無しさん:2010/10/27(水) 20:58:22
>>544
へぼだから

546 :デフォルトの名無しさん:2010/10/27(水) 21:00:13
リークの定義による

547 :デフォルトの名無しさん:2010/10/27(水) 21:03:48
>>544
OS って前提があるようだが
どんな範囲の話がしたいんだ?

548 :デフォルトの名無しさん:2010/10/27(水) 21:04:07
>>544
> 何故メモリーリークが発生するのですか?
解放してないからです。
> newしたかをosが監視して、プロセスの終了とともにOSがヒープ領域を解放すればいいだけじゃないですか
普通は解放してます。

549 :デフォルトの名無しさん:2010/10/27(水) 21:05:55
言語仕様上javaのstaticイニシャライザ相当の機能はない

550 :デフォルトの名無しさん:2010/10/27(水) 21:07:53
>>544
Amiga以外にプロセスの終了時に開放しないOSが有んのかよ

551 :デフォルトの名無しさん:2010/10/27(水) 21:09:49
リークが「誰も参照していないものが確保されたまま残っている状態」として、誰をどこまで入れるかだよな

552 :デフォルトの名無しさん:2010/10/27(水) 21:17:41
>>543
言語仕様的に必要性がない

553 :543:2010/10/27(水) 21:17:47
>>549
thx

554 :デフォルトの名無しさん:2010/10/27(水) 21:25:22
>>538
普通は入れ子のクラスは親のクラスのプライベート領域にもアクセス出来るんだけど
古いコンパイラだと対応してないらしい
そういう時はProxyをfriendにして誤魔化してくれ

555 :デフォルトの名無しさん:2010/10/27(水) 22:23:26
どのクラスからインスタンス化したのか知りたいのですが、
方法を教えてください

556 :デフォルトの名無しさん:2010/10/27(水) 22:24:01
クラス名を返す関数を設ける

557 :555:2010/10/27(水) 22:31:28
javaのinstanceofみたいな事をしたいのですが

558 :デフォルトの名無しさん:2010/10/27(水) 22:40:53
したいのですが……何?

559 :デフォルトの名無しさん:2010/10/27(水) 22:42:34
RTTIが必要になるのは設計ミス

560 :デフォルトの名無しさん:2010/10/27(水) 22:47:11
typeid、dynamic_cast、const_cast とかは使うなとかいうけど、
じゃあ最初からなければいいのに、なんであるの?

561 :デフォルトの名無しさん:2010/10/27(水) 22:49:25
ふーん、じゃ virtual を使うプログラムは全て設計ミスだな
typeid と dynamic_cast さえ使わなければ RTTI は使ってないとか思ってるだろ

562 :デフォルトの名無しさん:2010/10/27(水) 22:51:04
ミスだろ馬鹿じゃねーの

563 :デフォルトの名無しさん:2010/10/27(水) 22:53:48
C++を使うこと自体がミスだよね

564 :デフォルトの名無しさん:2010/10/27(水) 22:54:21
これはこれは面白そうな新説ですな、山田さん

565 :デフォルトの名無しさん:2010/10/27(水) 22:59:42
C++自体がミスじゃね

566 :デフォルトの名無しさん:2010/10/27(水) 23:00:56
やはり++Cにすべきだったか

567 :555:2010/10/27(水) 23:02:30
お前らのレスで、目的の情報を見つけた
ありがとうよ

ただ単に少しテストしてみたい事があっただけ
大きいプログラムを作るつもりはない

568 :デフォルトの名無しさん:2010/10/27(水) 23:07:56
RTTIすら知らなかったの?

569 :デフォルトの名無しさん:2010/10/27(水) 23:13:33
しらん

570 :デフォルトの名無しさん:2010/10/27(水) 23:16:20
スマートポインタをメンバに持つクラスをスマートポインタで管理しても意味ないですよね

571 :デフォルトの名無しさん:2010/10/27(水) 23:26:04
意味はある

572 :デフォルトの名無しさん:2010/10/28(木) 00:07:44
>>529
こういうこと言う人、まだ居るんだ。根深い迷信だな。
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html

573 :デフォルトの名無しさん:2010/10/28(木) 00:09:18
>>561
virtual 使ったら RTTI 使ってることになるの?なんで?

574 :デフォルトの名無しさん:2010/10/28(木) 00:13:59
>>573
RTTI って本質的に何だと思う?
ちなみに禿は virtual の新設に始めは懐疑的だったらしいよ

575 :デフォルトの名無しさん:2010/10/28(木) 00:14:53
vtbl[0] = ?

576 :デフォルトの名無しさん:2010/10/28(木) 00:16:15
virtualもRTTIに含まれるとか、またオレオレ定義かよ。

577 :デフォルトの名無しさん:2010/10/28(木) 00:18:12
言葉の定義を問うているのではない
設計ミスかどうかを論じている

578 :デフォルトの名無しさん:2010/10/28(木) 00:22:24
ageてんのは一人のアホ

579 :デフォルトの名無しさん:2010/10/28(木) 00:25:55
本質的って言葉をわざわざ使ってるのに
どーでもいいことを干渉しにくる頭を製造ミスされた奴がいるな

580 :デフォルトの名無しさん:2010/10/28(木) 00:26:54
>>561

581 :デフォルトの名無しさん:2010/10/28(木) 00:29:19
>>577
じゃ>>560-561あたりの反論は、ふかく考えずに勢いで言っただけでぜんぜん成り立たないってことですね。


582 :デフォルトの名無しさん:2010/10/28(木) 00:31:17
引っ込みのつかなくなった人を弄って遊ぶのは
もういいよ

583 :デフォルトの名無しさん:2010/10/28(木) 00:31:22
>>561 では皮肉を言っただけだよ、額面どおり取るなって

584 :デフォルトの名無しさん:2010/10/28(木) 00:33:41
恥の上塗り

585 :デフォルトの名無しさん:2010/10/28(木) 00:34:37
virtualあたりは、型を抽象的に扱うことを意図して使われることが
ほとんどだろうけど、RTTIはそれとは逆の向きに使われることが多そう。
ぜんぜん違う機能だと思う。

実行時に動作が決まるってところで同じだって言ってるのだろうか。
それは見当違いだよな。

586 :デフォルトの名無しさん:2010/10/28(木) 00:35:04
2chでどうやって「引っ込みがつかなく」なれるんだよ
どんだけ失言こいても自分個人の品位と関係ないし

587 :デフォルトの名無しさん:2010/10/28(木) 00:35:58
>>583
これはかっこ悪い。

588 :デフォルトの名無しさん:2010/10/28(木) 00:38:53
>>585
これは RTTI だと思う?
struct a
{
union { void* b; char* c; double* d; };
enum { e, f, g } h; //here!!
};

589 :デフォルトの名無しさん:2010/10/28(木) 00:39:10
> どんだけ失言こいても自分個人の品位と関係ない
自分自身には関係あるだろ。他人にうかがい知れないだけで。

590 :デフォルトの名無しさん:2010/10/28(木) 00:41:47
> 自分自身には関係あるだろ

なるほどね、それで必死になるのがねらーの習性なわけね
ぱぴこしてきたのが誰だったかによって効果が色々って言ってあげれば
少しは話に入ってこれるかな

591 :デフォルトの名無しさん:2010/10/28(木) 00:41:59
>>588
RTTIって「自分はこう思う」って勝手に定義していいものなの?

592 :デフォルトの名無しさん:2010/10/28(木) 00:43:07
>>591
>>577

593 :デフォルトの名無しさん:2010/10/28(木) 00:45:00
>>592
じゃ「これはRTTIか?」とか聞くなよ。

594 :デフォルトの名無しさん:2010/10/28(木) 00:46:54
>>593
では「設計ミスか?」にしようか
ただし元々の RTTI の定義と全く無関係でもないんだよな

595 :デフォルトの名無しさん:2010/10/28(木) 00:48:24
>>590

>>589 の言っていることは、

> それで必死になるのが

とは、むしろ逆だと思うんだが。
冷静さを失って書けば書くほど品位は貶められるんだから。

596 :デフォルトの名無しさん:2010/10/28(木) 00:49:14
「RTTI使うとか設計ミスだろ」ってツッコまれて、
「はぁ? じゃこれはどうよ」ってunion持ち出すって、支離滅裂だろ。

597 :デフォルトの名無しさん:2010/10/28(木) 00:49:21
>>595
誰の?

598 :デフォルトの名無しさん:2010/10/28(木) 00:50:18
>>596
おまえが読めていないだけ
とぼけているのではなくガチなら残念ながら相手にならない

599 :デフォルトの名無しさん:2010/10/28(木) 00:52:04
>>597
失言した者、だろうな

600 :デフォルトの名無しさん:2010/10/28(木) 00:53:22
>>598
おまえ説明できないから、意味深げに言ってるだけだろ。
モゴモゴ言ってないで、単刀直入に説明してみろよ。
どうせできないんだろうけど。


601 :デフォルトの名無しさん:2010/10/28(木) 00:56:32
>>599
そりゃちゃうやろ
失言した者という抽象概念が指すオブジェクト個々により
冷静さの有無により品位が下がったり下がらなかったりするわけで

602 :デフォルトの名無しさん:2010/10/28(木) 00:57:21
>>600
単刀直入に言ったよ
具体的なコードまで晒してね

で、読めてない人がいるわけで

603 :デフォルトの名無しさん:2010/10/28(木) 01:03:29
>>602
いやぜんぜん言ってないね。

「RTTIが必要ってことは設計ミスだね」

「unionはRTTIだと思う?」

質問に質問で返してるだけで、説明らしきものはまったくない。

604 :デフォルトの名無しさん:2010/10/28(木) 01:04:46
>>560
C++は静的型付けによりその堅牢性と最適化を期待できるから
だからそれを害しない程度にRTTIを使用する分には問題ない
過度な実行時型解決は静的型付けの堅牢性とパフォーマンスを阻害してしまう
それではC++を使用する意味がない

一昔前のハードが貧弱だった頃は、RTTIのコストがバカにならないという時代もあった
当時はRTTIがデフォルトでは使用できないという環境もあったくらい
そのさらに一昔前は仮想関数のコストがバカにならないという時代もあった
MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残

605 :デフォルトの名無しさん:2010/10/28(木) 01:05:04
>>603
おまえさんの言い方に合わせて言うなら
enum は RTTI か、だったはずなんだが
//すら読めてないのな

606 :デフォルトの名無しさん:2010/10/28(木) 01:06:36
> MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残

これは virtual が悪いんじゃなくメッセージが 32bit もあることに原因があるわけで

607 :デフォルトの名無しさん:2010/10/28(木) 01:09:15
>>604
> MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残

これは単にメッセージに全部仮想関数を割り当てるとvtblが大きくなりすぎるから。
べつに仮想関数のパフォーマンスどうこうって話じゃない。


608 :デフォルトの名無しさん:2010/10/28(木) 01:13:05
>>605
またそれはちがう、これは違うみたいな話かよ。
もうこうやって人を煙にまく(本人はまいたつもり)みたいなのが習い性に
なってるんだろうな。

609 :デフォルトの名無しさん:2010/10/28(木) 01:13:24
>>607
コストって意味にはその意味も含んでいるんだけどね

610 :デフォルトの名無しさん:2010/10/28(木) 01:15:32
相手にするのが馬鹿馬鹿しくなって放置されるから煙に巻いた気分にはなれるぞ

611 :デフォルトの名無しさん:2010/10/28(木) 01:16:14
>>609
そういう面も含んでるならいまだってメッセージごとに仮想関数に割り当てるとか、そんな設計しないだろ。



612 :デフォルトの名無しさん:2010/10/28(木) 01:17:09
>>608
おまえ enum って書かれた瞬間に switch か else if と来ない?
つまり実行時判定を連想するかってのが読めてる読めてないってことだぜ

613 :デフォルトの名無しさん:2010/10/28(木) 01:20:32
>>610
結局なんも説明しないわけでしょ?

実行時に、型が決まるものは全部いっしょくた程度の考えしかないのは
分かったから別に説明しなくてもいいけど。

614 :デフォルトの名無しさん:2010/10/28(木) 01:22:28
>>612
それで?
unionにラベルがふってあったら、そういう使い方しか
思いつかないでしょ。ふつーに。

615 :デフォルトの名無しさん:2010/10/28(木) 01:23:00
>>613
本人でない私に言われても困るんだけど

616 :デフォルトの名無しさん:2010/10/28(木) 01:24:22
>>614
union に過剰反応されるとは思わなかった
じゃあいい、あの union は一切忘れてくれ
その隣にあった enum だけで論じよう

実行時に判定する設計は全てミスか?

617 :デフォルトの名無しさん:2010/10/28(木) 01:26:42
ところで眠いし明日も仕事なんだ
いちいち断らないが勝手に落ちるぞ

618 :デフォルトの名無しさん:2010/10/28(木) 01:27:30
>>616
また支離滅裂路かよ。
enumだけにしたら、ますます関係なくなるじゃん。

むしろ実行時に型がどうこうだったらunionが本質じゃん。

619 :デフォルトの名無しさん:2010/10/28(木) 01:29:45
>>618
そうだよ、だからそのために union を書いた
だがあくまで核心は enum で // にそう書いた

620 :デフォルトの名無しさん:2010/10/28(木) 01:34:21
久しぶりに見たな、こんなネット初心者みたいな奴

621 :デフォルトの名無しさん:2010/10/28(木) 01:35:28
俺は MNP4 から始めたクチだが

622 :デフォルトの名無しさん:2010/10/28(木) 01:36:32
>>619
実行時に型をどうこうみたいな話で、unionとそれの型を選択するenumと
どっちが本質かとか勝手にこだわって、相手がunionって言ったら、
「おまえわかってねー」って勝手に上げ足とったつもりになって、
ばからしいとおもわねえ?

実行時に型が決まるよな動作は全部いっしょくたって以上の認識でてこないじゃん。
結局。

623 :デフォルトの名無しさん:2010/10/28(木) 01:37:17
どうでもいいけどRTTIって実際どうやってんだろうね?
もちろんvirtualあるケースで。
newなどで確保したメモリの中にあるの?
Yesなら後ろ?それとも前?

624 :デフォルトの名無しさん:2010/10/28(木) 01:38:39
>>617
断ってるじゃん。
逃げたとか思われるのがいやなんだろ?
>>586みたいなこと、かっこつけて言うなよ。

625 :デフォルトの名無しさん:2010/10/28(木) 01:41:19
>>622
揚げ足? そう誤解されそうなことさえ言ったつもりはないが

もう >>616 の時点で核心そのものを言ってるので
あとは俺ぬきでもいいくらいだ

626 :デフォルトの名無しさん:2010/10/28(木) 01:41:55
>>624
やめろー、引き留めるな鬼畜

627 :デフォルトの名無しさん:2010/10/28(木) 01:42:18
>>623
仮想関数用の vtbl に vtbl[-1] として typeid が入ってる実装を見たことがある。
これならコンパイルオプションで RTTI 無効にしたバイナリとも互換性を保つことが
できそうだなー、と勝手に解釈して感心した。

628 :デフォルトの名無しさん:2010/10/28(木) 01:44:20
>>625
まあ、精神防衛で、自分の言ってることを信じ込んでる人とかよく見るしね > 誤解


629 :デフォルトの名無しさん:2010/10/28(木) 01:45:09
触るなバカ

630 :デフォルトの名無しさん:2010/10/28(木) 01:47:10
>>627
ありがとう。
そういう実装だった場合virtualでないやつはどうやってtypeid引っ張ってくるんだろう?
そういう使い方をしたことがないから知らないってだけだけど。

631 :デフォルトの名無しさん:2010/10/28(木) 01:49:07
上のほうで「昔はRTTIはオプションだった」みたいなことが書いてあるけど
最近のはオプションじゃなくてデフォでついてるの?

632 :デフォルトの名無しさん:2010/10/28(木) 01:52:37
>>630
virtual な関数を持つクラス型以外については、そもそも 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.

633 :デフォルトの名無しさん:2010/10/28(木) 01:54:14
>>631
C++98 の時点から標準でついてる。各コンパイラの実装は知らないけど、たぶん
標準を反映してデフォルトで有効になってるはず。

634 :デフォルトの名無しさん:2010/10/28(木) 01:59:21
>>632
なるほど、別に正確な生成時の型が帰ってくるわけじゃないのか。ありがとう。

635 :デフォルトの名無しさん:2010/10/28(木) 02:08:21
昔は組み込み用途とかメモリが逼迫してる環境だとRTTIは使うな外せって言われたよね。
今はどうかしらないけど。

636 :デフォルトの名無しさん:2010/10/28(木) 02:21:31
>>631
VC6〜VC2003はデフォルトではオフ(GRスイッチ)だったと思う
スイッチ入れて使った記憶がある
2008はデフォルトではオン
2010は特に指定されてないけどdynamic_castが正常に動いてるからオンだと思う
明示的にGRスイッチをオフにしたら警告出てstd::__non_rtti_object投げて異常終了した

637 :デフォルトの名無しさん:2010/10/28(木) 03:07:35
ディスクをフォーマットする位の挙動を示してもいいのにな

638 :デフォルトの名無しさん:2010/10/28(木) 22:05:41
vtableって何よ?

639 :デフォルトの名無しさん:2010/10/28(木) 22:09:01
ググれ

640 :デフォルトの名無しさん:2010/10/28(木) 22:53:59
std::auto_ptr<Hoge> h(new Hoge);
<Hoge*>ではなく<Hoge>で大丈夫なのですか?

641 :デフォルトの名無しさん:2010/10/28(木) 22:55:52
はい

642 :デフォルトの名無しさん:2010/10/28(木) 22:58:22
スマポの生ポ型って<Hoge*>みたいに指定したほうが良い設計だよね常識的に考えて
uint32_tをハンドルにしてスマポに管理させたい時とか不便

643 :デフォルトの名無しさん:2010/10/28(木) 23:05:14
略す人って気持ち悪い

644 :デフォルトの名無しさん:2010/10/28(木) 23:07:02
>>631
http://msdn.microsoft.com/ja-jp/library/h4bcz65t(VS.80).aspx

645 :デフォルトの名無しさん:2010/10/28(木) 23:07:39
そうかなぁー

646 :640:2010/10/28(木) 23:10:11
>>643
std::auto_ptr<Hoge> h(new Hoge);
これは略してるの?

647 :デフォルトの名無しさん:2010/10/28(木) 23:12:44
>>646
std::auto_ptrとかは正式名称

648 :デフォルトの名無しさん:2010/10/28(木) 23:31:05
std::cout << type_id(p).name() << std::endl;
この処理結果って見づらいね

649 :デフォルトの名無しさん:2010/10/28(木) 23:35:44
name()出力って処理系ごとに違わなかったっけ?
cppunitとかでgccとVCで結果が違ってムッとした記憶がある。

650 :デフォルトの名無しさん:2010/10/28(木) 23:45:05
>>648
それは見るもんじゃないよ

あくまでも operator== で比較するだけのためのものだと思った方がいい

651 :デフォルトの名無しさん:2010/10/28(木) 23:54:34
>>649
Yes

652 :デフォルトの名無しさん:2010/10/29(金) 01:45:05
struct Foo {
Foo(int x) {}
private:
Foo &operator=(Foo&);
};

上記のクラスの宣言と初期化を同時に行うとき、
Foo x = 5;
のように書けますが、これは operator= の呼び出しではなく、
Foo x(5);
と書くのと同じ意味になるのだと思います。なぜなら、初期化後に改めて
x = 10;
と書いた場合はマッチする operator= がないのでコンパイルできないからです。
この「宣言と初期化を同時に行うときの=は特別」と言うことを規格で確認したいのですが、
どの項を見ればいいのでしょうか。

653 :デフォルトの名無しさん:2010/10/29(金) 02:03:20
調べるべきは代入でなくて複製構築の方では?

654 :デフォルトの名無しさん:2010/10/29(金) 02:23:49
>>652 8.5 Initializers

655 :デフォルトの名無しさん:2010/10/29(金) 03:38:45
ローカル変数としての構築が可能で、かつデストラクタの明示的呼び出しのできない
クラスは定義できますか?

656 :デフォルトの名無しさん:2010/10/29(金) 03:49:04
デストラクタをprivateに入れる

657 :デフォルトの名無しさん:2010/10/29(金) 04:10:23
>>655 class { ... } c;

658 :デフォルトの名無しさん:2010/10/29(金) 08:36:16
アブストラクトファクトリーのテンプレート版みたいな
パターンありますか?

659 :デフォルトの名無しさん:2010/10/29(金) 11:40:37
それ、パターンじゃなくて実装でしょ。できると思うよ。

660 :デフォルトの名無しさん:2010/10/29(金) 15:53:21
タブ区切りのデータを出力するプログラムを書きました。【ソース1参照】
しかしヘッダ行[1]とデータの出力行[2]が離れているので、
出力したい項目の追加削除など変更があった場合に
[1]と[2]の2箇所の変更が必要になり、出力項目が多い時はメンテナンスが大変です。

そこで以下のようなクラスを作って楽に管理しようと思いました。【ソース2参照】

使うときはこうします。【ソース3参照】
でも、print_dataというメソッドを実装することって非常に非常に難しいです。
ラムダ式の変数のキャプチャ(?)とかリフレクション(?)とか
マクロをうまく使うとかなんとかして
実現することはできませんか?
同等のことが可能な、スーパープログラマによって書かれたライブラリは存在しませんか?
VC10とgcc4.4で使えるならC++0xの機能や独自拡張を使っていてもかまいません。

疑似コード→ http://codepad.org/Z0j4VE1u


661 :デフォルトの名無しさん:2010/10/29(金) 16:13:43
かなりアレだな


662 :デフォルトの名無しさん:2010/10/29(金) 16:50:25
スーパープログラマーってIPA認定のやつか
かなりレアだな

663 :デフォルトの名無しさん:2010/10/29(金) 16:52:30
目立ったことすればスーパーなんだね

664 :デフォルトの名無しさん:2010/10/29(金) 17:19:22
>>660
取り敢えず、こんなのどう?
http://codepad.org/ZMJP9HtC
ヘッダの数だけきっかりprint_data()を呼ぶって言う制約がつくけど。

665 :デフォルトの名無しさん:2010/10/29(金) 21:54:31
テストしてないけど、C++0xの機能とboostでこんなのでどう?

vector<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;



666 :デフォルトの名無しさん:2010/10/29(金) 22:10:13
#include <iostream>

struct 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;
}

これ、何でですか?

667 :デフォルトの名無しさん:2010/10/29(金) 22:23:03
>>666
endl のテンプレート実引数が不明

668 :デフォルトの名無しさん:2010/10/29(金) 22:31:18
endlは実は関数で色々オーバーロードされてる
だからTが曖昧になっちゃう

669 :デフォルトの名無しさん:2010/10/29(金) 22:41:34
こんな感じで明示的に書くと良い
http://codepad.org/KH5rpOc8

670 :デフォルトの名無しさん:2010/10/29(金) 22:52:39
>>667-669
ありがとうございます。
試しに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)
でもよいですよね?(実際に試してみてコンパイルエラーは出てないのですが)
インライン化されるか気になって関数のポインタ取るのに抵抗ありまして。
(実際はその程度は関係ないですか?)

671 :デフォルトの名無しさん:2010/10/29(金) 23:30:25
>>660
凝ったテキスト処理とかやらんからセオリーは知らないけど
ヘッダとやらの項目ごとにデータを溜めてから
一気に書き出した方がいいんじゃないのか?

672 :デフォルトの名無しさん:2010/10/30(土) 00:00:04
ちょっと質問です。
入門書などのクラスの説明で、よく FILE* のラッパークラス CFile があると思います。

class CFile
{

673 :デフォルトの名無しさん:2010/10/30(土) 00:01:43
} unko;

674 :デフォルトの名無しさん:2010/10/30(土) 00:04:14
>>666-670
話が高度すぎてついて行けなかった
手元の「C++再考」を読みながら勉強します

675 :デフォルトの名無しさん: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 には入れれない」という解説が見つからなかったので、
誰もが通りそうな問題なのにおかしいなと思って質問です。よろしくお願いします。

676 :デフォルトの名無しさん:2010/10/30(土) 00:25:46
vector<shared_ptr<CFile> > が普通かな

677 :デフォルトの名無しさん:2010/10/30(土) 00:26:59
vector オブジェクトを参照かポインタで扱うことにし、コピーしない

配列のコピーを避けることこそ誰もが通る問題で
C をやらないネイティブ C++ 世代の感覚が異様に見える

678 :デフォルトの名無しさん:2010/10/30(土) 00:28:38
見識を広げてからまたおいで

679 :デフォルトの名無しさん:2010/10/30(土) 00:31:01
ぶっちゃけ
通常のコンストラクタの他に
CFile():m_fp(NULL){}
みたいなデフォルトコンストラクタを作っといて
デストラクタで
if(m_fp)fclose(m_fp);
ってやれば当面の問題は解決されるんじゃないの?

680 :デフォルトの名無しさん:2010/10/30(土) 00:37:16
>>679
解決されるわけないだろバカ

681 :デフォルトの名無しさん:2010/10/30(土) 00:39:41
俺みたいなバカにはよくわかんないな。
どうしてvectorに入れたいんだろう?
vector<shared_ptr<CFile>>だと明示的にクローズしないとクローズされなくなるような…
それとも使う度にvectorからは抜くとか、vectorごと捨ててまとめてクローズしたいとかそういうことなの?


682 :デフォルトの名無しさん:2010/10/30(土) 00:46:27
boost::ptr_vector<CFile*>でもいいな

683 :デフォルトの名無しさん:2010/10/30(土) 00:49:33
>>681
読解力の低さと思考停止の早さがひどすぎて回答が難しいよ
もう少し頑張れよ

684 :675:2010/10/30(土) 00:51:42
>>676-677
C のころはデストラクタもないし、malloc / realloc で何も問題なかったんですよね…。
vector<shared_ptr<CFile> > で解決できそうです。
RAII の解説のところで、コピーコンストラクタなどを private にして
コピーを防いでいる例も見つけましたので、合わせて使おうと思います。
ありがとうございました!

685 :デフォルトの名無しさん:2010/10/30(土) 00:55:08
>>683
いやどういうときに使うものなのか見当がつかないだけだよ

686 :675:2010/10/30(土) 00:55:56
>>682
ptr_vector!
これを忘れていました。是非使ってみようと思います。こちらもありがとうございました。

687 :デフォルトの名無しさん:2010/10/30(土) 00:56:29
>>684
FILE*だもんな・・・

688 :デフォルトの名無しさん:2010/10/30(土) 00:59:21
>>686
ゴメン
やっぱboost::ptr_vector駄目だわ
これresizeするとポインタを通してデストラクタを呼ぶためのコンテナなんだよね
だからこの場合は駄目だと思う

689 :デフォルトの名無しさん: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

690 :デフォルトの名無しさん:2010/10/30(土) 01:35:14
>>677
vector を参照かポインタで扱っても、もともとの問題である vector に CFile を入れる段階の
問題が何も解決しない。

配列のコピーが行われたところで十分な空間・計算リソースがあれば問題にならないんで、
誰もが通る問題とも思えない。

691 :デフォルトの名無しさん:2010/10/30(土) 01:36:14
>>688
何も問題ないように見えるが、何がダメだって言うの?

692 :685:2010/10/30(土) 01:43:44
うーん考えたけどまるで思いつかないよ。

ちょくちょく出し入れしないとsharedする意味がないし、vectorにそれが向いてるとは思えない。
コンテナに入れる用途だとselectポーリングするとか、サーバー側のソケット/パイプ管理や
クライアント側のコネクションプールのようなものとかだけど、ポーリング以外では切断する役割
よりも使用未使用管理になると思うし、ポーリングを使うような状況でvectorは俺なら使わない。
そもそも面倒なのでポーリングしないで一個ずつスレッド使っちゃうし。

誰かvector<shared_ptr<CFile>>の利用用途を教えてくれー。

693 :デフォルトの名無しさん:2010/10/30(土) 01:50:02
>>691
いやいやだからpush_backしていくうちにメモリの再配置が起きてその時に
勝手にデストラクタが呼ばれてファイルストリームがクローズしちゃうじゃん

それを嫌がってるんでしょ?

自分でデストラクタを呼び出すならstd::vector<CFile*>でも何の問題もないような気がするんだけど

694 :デフォルトの名無しさん:2010/10/30(土) 01:51:56
>>692
shared_ptr が使われてるのは、単に C++2003 にはムーブや unique_ptr が無いからでしょ。
出し入れがしたいわけじゃないと思うよ。

「〜ような状況でvectorは俺なら使わない」と言うけど、それこそ理由が不明。

単に CFile の配列が欲しくて、実行時にしか要素数が決まらないってだけで十分でしょ。

695 :デフォルトの名無しさん:2010/10/30(土) 01:56:02
>>694
素人考えだとならlistではダメなの?って思うのですよ
利用用途が思いつかないからいいのかどうか見当もつかないんですけど

696 :デフォルトの名無しさん:2010/10/30(土) 01:56:40
>>695
単にoperator[]を使いたいんだと思うよ

697 :675: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 を持つクラスの可変長配列が必要です。

698 :デフォルトの名無しさん:2010/10/30(土) 02:00:40
>>693
何のための ptr_vector だよ。

ptr_vector なら再確保が発生してもポインタのコピーだけすればよくて、
オブジェクト本体のコピーが要らない。したがってデストラクタが呼ばれたりもしない。

自分でデストラクタを呼び出すなんて、論外だね。

699 :デフォルトの名無しさん:2010/10/30(土) 02:06:14
0x の移動に対応したコンパイラなら vector<fstream> で良さそうだが

700 :デフォルトの名無しさん:2010/10/30(土) 02:07:29
あーそうですね

701 :デフォルトの名無しさん:2010/10/30(土) 02:10:21
>>698
それはわかってる
でも今回のように勝手にデストラクタが呼ばれては困るファイルストリームインスタンスへの
ポインタを保持する場合は駄目でしょって

702 :デフォルトの名無しさん:2010/10/30(土) 02:12:46
>>701 >>691

703 :デフォルトの名無しさん:2010/10/30(土) 02:16:31
>>696
なるほどまづは前提として受け入れろと
>>697
なるほど。リソースハンドル全般の話で使いまわしとは関係がない話なのですね。
オブジェクトとリソースの生成/消滅は原則連動してて、未参照状態で自動的に
消滅さ&コンテナはとにかくvectorがいいと。

0xはまだまだ知らないことだらけだけど、なんか面白そうですね。

704 :デフォルトの名無しさん:2010/10/30(土) 02:21:19
>>702
>>689にこれじゃ駄目でしょうって例をわざわざ貼り付けたんだけど理解できないかな?

705 :デフォルトの名無しさん:2010/10/30(土) 02:31:12
>>704
テンポラリに swap() で内容を移してるんだから、そのテンポラリの消滅で
デストラクタが走って当然。これを「勝手に」とか言ってるのがどういうことなのか
理解できない。

706 :デフォルトの名無しさん:2010/10/30(土) 02:37:08
>>705
いやだから・・・std::vectorでpush_backして行くとそのうち連続したエリアが足りなく
なってメモリの再配置が起きるでしょうって

boost::ptr_vectorも事情は同じですよって言う意味で書いたんだけど分かってもらえないかな?

707 :デフォルトの名無しさん:2010/10/30(土) 02:46:41
>>706 >>698

708 :デフォルトの名無しさん:2010/10/30(土) 02:48:16
>>707
外行って頭に水ぶっかけて来い

709 :デフォルトの名無しさん:2010/10/30(土) 02:50:18
再配置結果
http://ideone.com/C0UYF

capacity() == size()はcapacity()が満たされた場合であり、再配置が起こる
明示的にresize()も呼び出してみた
再配置が起こってもデストラクタは起動しない
スコープアウトしてはじめてデストラクタが起動する

710 :デフォルトの名無しさん:2010/10/30(土) 02:52:21
http://codepad.org/3PHDRO8v
おっと。似たようなことしてる人が・・・

711 :デフォルトの名無しさん:2010/10/30(土) 02:53:38
アホをいち早く切り捨てた >>683 カコイイ

712 :デフォルトの名無しさん:2010/10/30(土) 03:00:01
今頃頭に水かぶりにいったのかな?

713 :デフォルトの名無しさん:2010/10/30(土) 03:04:27
うわぁ・・・

714 :デフォルトの名無しさん:2010/10/30(土) 03:05:56
夜中に元気だなお前ら

715 :デフォルトの名無しさん:2010/10/30(土) 03:18:20
金曜日の夜だけは元気なんだよ

716 :デフォルトの名無しさん:2010/10/30(土) 03:19:55
・メモリの再配置が起きてもデストラクタは起動しない
・但しイテレータは無効になる



717 :デフォルトの名無しさん:2010/10/30(土) 03:28:21
>>716
あくまでポインタを保持している場合の話な

>>709のコード貼っといて言うのもアレだが
オレはコンテナにファイル管理クラスを突っ込んだりしないけどな
入れるとしたらファイル名とかリソースバッファか
ファイル処理なんてエラーが出やすいし、アクセスは単純化してわかりやすい方がいい
こんな論争現場でしたくないだろw

718 :デフォルトの名無しさん:2010/10/30(土) 03:31:42
つまり今回のようなケースではboost::ptr_vectorで問題はないわけだ

719 :デフォルトの名無しさん:2010/10/30(土) 09:58:53
>>697
CFileってコピー可なのか?普通はコピー不可にするべきだろう。MFCって一体?

コピー不可でも、C++0xならムーブ可にしておけばvectorに入るだろうし、突然閉じたりしないしな


720 :デフォルトの名無しさん:2010/10/30(土) 10:39:12
MFCの話してるわけじゃないだろ
それにMFCのCFileはコピー不可だよ

721 :デフォルトの名無しさん:2010/10/30(土) 13:15:33
>>697
list じゃだめなん?
HWND なんか典型的にリストの出番だと思うし
それ以前に EnumWindows だろ

vector に push_back を多用する時点で何かおかしいと思わないのか?
resize で不具合が出るのをわかっていて resize にこだわる時点で何かおかしいと思わないのか?

ちなみに MFC は RTTI や文字列を自前で作っているが、それがどういう意味かわかる?

722 :デフォルトの名無しさん:2010/10/30(土) 13:51:21
set<int> s; // あるいはlistやvector

// ・・・・

set<int>::iterator it = s.begin(), end = s.end();

while(it != end)
{
DoSometing(s, *it);
++it;
}

DoSometingでコンテナの要素が増減する可能性がある場合ってイテレーターは無効になりますか?

723 :デフォルトの名無しさん:2010/10/30(土) 13:57:45
うん

724 :デフォルトの名無しさん:2010/10/30(土) 14:56:48
>>722
itがさしている要素が削除されるとitが無効になるよ。


725 :デフォルトの名無しさん:2010/10/30(土) 15:08:37
        ____
       / \  /\ キリッ
.     / (ー)  (ー)\
    /   ⌒(__人__)⌒ \   <HWND なんか典型的にリストの出番だと思うし
    |      |r┬-|    |        それ以前に EnumWindows だろ
     \     `ー'´   /

        ____
       / \  /\ キリッ
.    +/ (●)  (●)\
    /   ⌒(__人__)⌒ \+   
    |              |  クスクス>
     \            /

        ____
<クスクス   / \  /\ キリッ
.     / (●)  (●)\
    /   ⌒(__人__)⌒ \ +  
    |              |        
   + \            /

726 :デフォルトの名無しさん:2010/10/30(土) 15:15:11
許してやれよ

727 :デフォルトの名無しさん:2010/10/30(土) 15:18:31
vector に push_back を多用するのは何がおかしいの?

728 :デフォルトの名無しさん:2010/10/30(土) 15:21:59
効率がおかしい

729 :デフォルトの名無しさん:2010/10/30(土) 15:24:33
そういう効率だけを考えていてもダメ
ダメプログラマーになりたいのなら別だがな

730 :デフォルトの名無しさん:2010/10/30(土) 15:24:45
reserve()しとけば問題ないんじゃないの

731 :デフォルトの名無しさん:2010/10/30(土) 15:25:29
規格どおりならおかしくもなんともない。

732 :デフォルトの名無しさん:2010/10/30(土) 15:27:06
そういう規格だけを考えていてもダメ
ダメプログラマーになりたいのなら別だがな

733 :デフォルトの名無しさん:2010/10/30(土) 15:28:45
vectorでreserveしてpush_backするぐらいならdeque使っておけて事?

734 :デフォルトの名無しさん:2010/10/30(土) 15:33:39
dequeじゃ同じことなんじゃ…

735 :デフォルトの名無しさん:2010/10/30(土) 15:35:38
EnumWindowsはどっから出てきたんだ

736 :デフォルトの名無しさん:2010/10/30(土) 15:37:31
許してやれよ

737 :デフォルトの名無しさん:2010/10/30(土) 15:42:00
確かにEnumWindowsは出てくるべきではないと思うね
そういえばこれのコールバックをコルーチンでiterateする面白い実装をどっかで見たな

738 :デフォルトの名無しさん:2010/10/30(土) 15:44:21
許すって何を?
空笑がみられる病人がいるようだが
許したければ許せばいいだろ自分で

739 :デフォルトの名無しさん:2010/10/30(土) 15:54:40
意味のない一言煽り多いよな。それしかできなそうって感じもするけど。

740 :デフォルトの名無しさん:2010/10/30(土) 15:56:22
>>739
自分に言ってるのか

741 :デフォルトの名無しさん:2010/10/30(土) 16:02:26
>>740
いや、素直な感想を言ってるだけ

742 :デフォルトの名無しさん:2010/10/30(土) 16:04:31
言ってる自分が気づいてないんだな。

743 :デフォルトの名無しさん:2010/10/30(土) 16:15:39
図星だったのか

744 :デフォルトの名無しさん:2010/10/30(土) 16:18:57
>>743
意味のない一言煽り多いよな。それしかできなそうって感じもするけど。

745 :デフォルトの名無しさん:2010/10/30(土) 16:43:14
君たち、 C++ の話をしろ

746 :デフォルトの名無しさん:2010/10/30(土) 17:08:21
push_back を多用するな。 push_front を使うんだ(キリッ

747 :デフォルトの名無しさん:2010/10/30(土) 17:12:29
>>746
vectorでは禁じ手
というかメンバ関数がなかったんじゃないか?

748 :デフォルトの名無しさん:2010/10/30(土) 17:17:10
つまりInsertを使えってことだな

749 :デフォルトの名無しさん:2010/10/30(土) 17:18:12
vectorでは禁じ手(キリッ
というかメンバ関数がなかったんじゃないか?(キリッ

750 :デフォルトの名無しさん:2010/10/30(土) 17:22:15
>>747
許してやれよw

751 :デフォルトの名無しさん:2010/10/30(土) 17:26:10
ついでに初歩的な質問していい?
vectorの速度的な話で大規模な配列を取り扱う場合

遅い順に

reserveされてない領域へのpush_back
reserveされてる領域へのpush_back
resize等で既に確保されてる領域への代入
vectorを使わない静的配列への代入

って感じであってる?
push_backが遅いのは仕様だよね?

752 :デフォルトの名無しさん:2010/10/30(土) 17:31:31
resize等で既に確保されてる領域への代入
vectorを使わない静的配列への代入

これは同じじゃないかな

753 :デフォルトの名無しさん:2010/10/30(土) 17:42:17
>>752
そうなのかな?

適当に10個ほどの変数をもつ構造体で
静的の方は各変数ごとに代入
vectorの方は各変数ごとに代入とoperator=による代入両方で計測してみたんだけど
どうも静的のほうが微妙に速いんだ
誤差の範囲といえばそうなんだが計測に仕方が悪いのかな

754 :デフォルトの名無しさん:2010/10/30(土) 17:52:21
そりゃvectorのoperator[]がインライン関数に展開される保証はどこにもないからな
例えされたとしても複雑なアドレス計算が絡みそうなので単純な配列に比べたら
可哀想だ

でもEfficient C++を読むと分かると思うけど、vectorは本当に速いよ

755 :デフォルトの名無しさん:2010/10/30(土) 18:10:25
本当にvector自体の実装に足を引っ張られている人なんてまずいない。

756 :デフォルトの名無しさん:2010/10/30(土) 18:15:25
vector<Hoge> v;

vector<Hoge, Ator> va;

v = va;
swap(v, va);
//etc.

これサポートされてないんだけどなんかイカす回避手段はありますか?

757 :デフォルトの名無しさん:2010/10/30(土) 18:23:16
アロケータが違うなら一つ一つ要素を交換するしかないだろJK

758 :デフォルトの名無しさん:2010/10/30(土) 19:21:20
>>751
> reserveされてる領域へのpush_back
> resize等で既に確保されてる領域への代入

これは前者がコピーコンストラクタ、後者が代入演算子を使うことになるから、
既存の要素の取り扱いを考慮する分で、一般的には後者のほうが遅いだろう。

コピーをユーザー定義したクラスの実装によっては逆転することもあるだろうけど。

759 :デフォルトの名無しさん:2010/10/30(土) 19:54:16
ワテは関西人だけど、pop_frontを使うときはdequeでそれ以外はvectorって決め打ちしてますさかい「

760 :デフォルトの名無しさん:2010/10/30(土) 23:07:03
shared_ptrでdeleteされるタイミングを教えてください

761 :デフォルトの名無しさん:2010/10/30(土) 23:17:31
>>760
shared_ptrが指しているインスタンスが一つも指されなくなったら
つまりこれはお互いに指し合うと永久にdeleteされなくなるので
一個だけweak_ptrを挟む

762 :デフォルトの名無しさん:2010/10/30(土) 23:19:27
http://www.ogis-ri.co.jp/otc/hiroba/technical/boost/part1/index.html

ここが良くまとまっている

763 :デフォルトの名無しさん:2010/10/30(土) 23:33:05
>>759
関東人乙

俺関西人やけど、pop_front使うときはdequeでそれ以外はvectorって決めてるわw

764 :760:2010/10/30(土) 23:35:20
>>761-762
thx

どうやって参照カウントが0になったことをshared_ptrは知るんですか?

765 :デフォルトの名無しさん:2010/10/30(土) 23:40:33
カウンターを内蔵してるんだよ

766 :760:2010/10/30(土) 23:54:59
>>765
そこら辺少し調べてみるよ
ありがとうよ

767 :デフォルトの名無しさん:2010/10/31(日) 00:50:46
>>764
> >>761-762
> thx
> どうやって参照カウントが0になったことをshared_ptrは知るんですか?


768 :767:2010/10/31(日) 00:51:51
ただの誤爆
ごめんよ

769 :デフォルトの名無しさん:2010/10/31(日) 01:06:04
xmlをパースしたいのですが
libxml2とapache xercesって使いやすいですか?

770 :デフォルトの名無しさん:2010/10/31(日) 11:52:29
初歩的な質問なんですが
http://users.rcn.com/jcoplien/Patterns/C++Idioms/EuroPLoP98.html#PromoteAndAdd
上記のウェブサイトのソースコードでconst参照仮引数に代入しているように
みえるのですが良くわかりません。
ちなみにisA関数の意味もcomplexExemplarの意味もわかりません。
教えてください。

771 :デフォルトの名無しさん:2010/10/31(日) 15:15:29
>>769
XML自体が使いにくい。どっちでも特に使いにくいとか使いやすいとか思わなかった。
>>770
細かいことは気にするな。コードはかなり適当っぽい。


772 :デフォルトの名無しさん:2010/10/31(日) 15:25:29
プリプロセッサがマクロを処理する順番はどのように決まっているのでしょうか。
例えば、関数形式のマクロに別のマクロを引数として与えたとき、引数の方が先に処理される
ようなことはないみたいですけど、単に記述順に処理されるんでしょうか。

773 :デフォルトの名無しさん:2010/10/31(日) 15:42:54
XMLならBoost.PropertyTreeもある。

774 :769:2010/10/31(日) 15:55:46
>>771
やっぱり、どの言語でも使いにくい点は同じなのね

>>773
boostにもxmlパーサーがあるんだ

775 :デフォルトの名無しさん:2010/10/31(日) 16:05:50
パーサーというやつに限ってコンピュータとかポインタとかいうんだよなwwww

776 :デフォルトの名無しさん:2010/10/31(日) 16:45:51
心底どうでもいい

777 :デフォルトの名無しさん:2010/10/31(日) 17:32:08
そういうやつに限って消費税が1パーセントでも上がるとめちゃくちゃ騒ぐんだよなwww

778 :デフォルトの名無しさん:2010/10/31(日) 17:37:39
std::auto_ptr<Class> c = new Class;
こんな宣言をすることができるらしいのですが、
コンパイラが禁止しているからエラーがでるのですか?

また、この時の型は何になるんですか

779 :デフォルトの名無しさん:2010/10/31(日) 17:40:57
>>778
auto_ptr はテンポラリからのコピーができないので、その初期化形式(コピー初期化)では
コンパイルエラーになる。

... c(new Class) とすれば(形式を直接初期化にすれば)コンパイルできる。
型は書いたとおりの std::auto_ptr<Class> 。

780 :デフォルトの名無しさん:2010/10/31(日) 17:56:10
>>778
explicit を学べ

781 :デフォルトの名無しさん:2010/10/31(日) 17:58:03
>>780 いや、 explicit は関係ないでしょ。

782 :778:2010/10/31(日) 18:08:58
>>780
explicitくらい知っている

>>779
thx

783 :デフォルトの名無しさん:2010/10/31(日) 18:14:42
>>772
基本的に記述順に処理される
詳しくは
http://www.spinellis.gr/blog/20060626/
このあたりで

>>781
explicitがなければT *からの変換コンストラクタが定義できてしまうのでは?

784 :779:2010/10/31(日) 18:19:39
>>780-782
ごめん。間違ってた。

auto_ptr も auto_ptr_ref 経由でテンポラリから初期化ができる。
>>778 のコードでテンポラリを使った初期化にならないのは
auto_ptr<T>::auto_ptr(T*) に explicit が付いているから。

直接初期化の形にすれば当然 expliciti の制限は受けず、
auto_ptr<T>::auto_ptr(T*) が使用される。

785 :デフォルトの名無しさん:2010/10/31(日) 18:22:30
プップギャーッ!!m9゚。(^Д^゚≡。゚^Д^)m9゚。プップギャ-ッ!!

786 :デフォルトの名無しさん:2010/10/31(日) 18:25:24
キモ

787 :デフォルトの名無しさん:2010/10/31(日) 21:42:37
去年の12月から勉強して、最近ようやくC++の文法を覚えてきた
社会人1年目なのでC++を勉強するどころじゃなかった

お前らはC++の文法どのくらいで覚えましたか?

788 :デフォルトの名無しさん:2010/10/31(日) 21:47:06
30分くらいです。
他の言語の参考になるだけあって文法に時間かかるような言語じゃないですよね

789 :デフォルトの名無しさん:2010/10/31(日) 21:48:34
文法を覚えてからが大変なんだよな

STLの山ほどのコンテナ、イテレータ、アルゴリズム、ファンクタ
RAIIやPimplのイディオム
デザパタ
etc...

790 :デフォルトの名無しさん:2010/10/31(日) 21:58:52
文法だけでも相当たいへんだろ。
おれは規格読めないから、一生ムリ。

791 :デフォルトの名無しさん:2010/10/31(日) 22:02:41
正直C++にしかない文法はあんまり触りたくない
簡単C言語おいしいれす

792 :デフォルトの名無しさん:2010/10/31(日) 22:03:16
C++なんてとりあえずifとfor覚えれば何でも書けるじゃん
あとは知識を増やしてくだけ

793 :デフォルトの名無しさん:2010/10/31(日) 22:04:15
>>788
文法だけならな。

文法だけ知っててもまともなコードは書けないからな。

794 :787:2010/10/31(日) 22:07:17
フレームワークとC++を使っていると、何がなんだかわからなくなる時もあった
C++は単体だと何もできない所が痛いんだよな

795 :デフォルトの名無しさん:2010/10/31(日) 22:10:20
逆にその痛いところが、既存のフレームワークが気に入らなければ自分で作れてしまうメリットだな。

796 :デフォルトの名無しさん:2010/10/31(日) 22:35:04
設計まで踏み込むともっと奥は深いぞ

797 :デフォルトの名無しさん:2010/11/01(月) 07:04:24
> C++なんてとりあえずifとfor覚えれば何でも書けるじゃん
Turing Machineですな。


798 :デフォルトの名無しさん:2010/11/01(月) 08:10:48
そこはwhileのほうがシンプルでいいのでは。

799 :デフォルトの名無しさん:2010/11/01(月) 08:38:41
いや、gotoだろ

800 :デフォルトの名無しさん:2010/11/01(月) 15:26:07
そりゃそうだ。

801 :デフォルトの名無しさん:2010/11/01(月) 15:57:21
俺の書いたプログラムの可読性の無さは異常。

以前他の人のソースを参考にして高速化したソースを別の言語に移植しようと見てみたら
全く何が書いてあるのか解らず、また他の人のソースを参考に一から書いてる。

まじ読めない。驚いた。

802 :デフォルトの名無しさん:2010/11/01(月) 16:44:52
#include <stdiio.h>
int main
() {
printf


( "Hello,"); printf(
"World!\n");
return 0
;
}

803 :デフォルトの名無しさん:2010/11/01(月) 17:09:15
とにかく可読性を低くするのはトークンごとに改行、goto多用すればおk?

804 :デフォルトの名無しさん:2010/11/01(月) 17:13:36
ソースコードの可読性を低くするプログラムを作る。

805 :デフォルトの名無しさん:2010/11/01(月) 17:25:16
>>802
まず動くプログラムにしろ
話はそれからだ

806 :デフォルトの名無しさん:2010/11/01(月) 17:38:59
>>803
そんなもんじゃ全然足りない。一度IOCCCの入賞作を見てブッ飛ぶべし。

807 :デフォルトの名無しさん:2010/11/01(月) 17:41:39
一周回って逆にうつくしいと思える

808 :デフォルトの名無しさん:2010/11/01(月) 17:43:51
プリプロセッサあたりを活用するだけでも結構邪悪なコードが書けそうだけど

809 :デフォルトの名無しさん:2010/11/01(月) 17:58:12
C++ でやるなら template と operator くらい使わねばもったいない
あとメンバポインタと union あたりでも凶悪コンボできそう

810 :デフォルトの名無しさん:2010/11/01(月) 18:00:00
>>806
世の中にはやっぱりバカが居るんだなwまさかコンテストがあるとか
でも嫌いじゃないぜ

811 :デフォルトの名無しさん:2010/11/01(月) 18:00:52
そう言えば、どこか海外の掲示板でoperator=を比較に使ってるのを見たな。
「operator=ってboolを返せるんだ」って逆に感心した覚えが。

812 :デフォルトの名無しさん:2010/11/01(月) 18:08:00
IOCCC++ってのを新しく作ってほしいな
それこそIOCCCなんか比較にならないほど邪悪なコードが出て来そうだ

813 :デフォルトの名無しさん:2010/11/01(月) 18:33:54
main の中身は int x = 1; だけなのに円周率を100万桁計算しちゃうとか、
そういうの。

814 :デフォルトの名無しさん:2010/11/01(月) 18:37:56
>>813
演算子オーバーロードすると可読性が加速度でマッハだな

815 :デフォルトの名無しさん:2010/11/01(月) 18:38:22
>>811
それはCから元々そうでは

if( x = 1 ){
何かする
}

が文法的に正しくて、まず間違いなく意図とは違う動作をするのもそのせいでしょ

>>812
確かC++だとあまりにも何でもありになるのでつまらんからやらん、と
どこかで読んだ覚えがある

816 :デフォルトの名無しさん:2010/11/01(月) 19:33:15
static union
{
int hage;
int main() { }
};

…残念

817 :デフォルトの名無しさん:2010/11/01(月) 20:23:06
>>811
それはコピーもしないで比較だけするのか?
だとすればとんでもない罠だな。

818 :デフォルトの名無しさん:2010/11/01(月) 20:26:37
>>812
TMP(テンプレートメタプログラミング)があるからそれはもうすごい事になるだろうな。


819 :デフォルトの名無しさん:2010/11/01(月) 20:27:44
コンパイルに一晩かかったあげく出力は"Hello, World!"とか、
そういうの。

820 :デフォルトの名無しさん:2010/11/01(月) 22:53:27
コンパイルに一晩……だと?

821 :デフォルトの名無しさん:2010/11/01(月) 23:07:29
K6-2マシンでBoostをビルドしたら24時間以上かかったことがあってな。

822 :デフォルトの名無しさん:2010/11/01(月) 23:09:28
google先生もコンパイルに一晩かけるって言ってた

823 :デフォルトの名無しさん:2010/11/02(火) 01:15:58
#include <iostream>
__attribute__((section(".text"))) int main=2425393296;
void _() { std::cout<<"Hello, world!"<<std::endl; }


824 :デフォルトの名無しさん:2010/11/02(火) 08:15:58
STL でつまづいています。
http://codepad.org/N5JWb2GC

std::unary_function を引数をテンプレートにして継承しようとしていますが、
result_type が typedef されていないようです。
どう書けばいいのでしょうか?

あと、<functional> の実体はどこをみればわかるのでしょうか。
よろしくお願いいたします。

825 :デフォルトの名無しさん:2010/11/02(火) 08:59:23
>>824
継承している unary_function が確定していない(テンプレート実引数に依存している)ために、
そのメンバは依存名として参照する必要がある。

メンバ関数や変数なら this-> を付ければ済むところだけど、ここでは型名とする必要が
あるので、 typename isEven::result_type のように、わりと不毛な修飾する必要がある。

Arg や bool を使って書いてしまうのがおすすめ。

826 :デフォルトの名無しさん: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
教えてください。

827 :デフォルトの名無しさん:2010/11/02(火) 13:04:05
>>826
> 注意:スペース節約の為に省略表記をしてあります^ ^;;

さっぱりわからん。
質問の意図を探る応答で余計に文面は増える。
省略しないのが一番の近道だと考えてくだしあ

828 :デフォルトの名無しさん:2010/11/02(火) 13:09:21
スペースが無いならcodepad
これこの業界の常識ね

829 :デフォルトの名無しさん:2010/11/02(火) 13:10:09
すみません、誤植がありました。
正誤表を配布いたしまーす^^ v
誤:
< B > class U{
//実装クラス
};
正;
class U{
//実装クラス
};

>>827
すみませんでしたm( ^ ^ )m

830 :デフォルトの名無しさん:2010/11/02(火) 13:13:21
直すところはそこじゃないだろ
どこでUを使うんだよ
省略し過ぎてて質問の意味がわからん
Vに不満があるの?それともWに不満があるの?

831 :デフォルトの名無しさん:2010/11/02(火) 13:15:09
>>どこでUを使うんだよ
U=D=Cだよ〜〜〜〜〜んwwwww

832 :デフォルトの名無しさん:2010/11/02(火) 13:15:14
アダプタが何の役に立つのかが聞きたいのではないか?

833 :デフォルトの名無しさん:2010/11/02(火) 13:18:38
YES

834 :デフォルトの名無しさん:2010/11/02(火) 13:19:30
とりあえず顔文字口調がウザすぎて回答する気が明らかに削がれるな

835 :デフォルトの名無しさん:2010/11/02(火) 13:20:40
>わかりませんTT
ってのはそういう意味か
じゃあTの実装くらい省略せず書こうぜ

836 :デフォルトの名無しさん:2010/11/02(火) 13:22:40
Tの実装は移譲による単純なラッパーですよ(汗)

837 :デフォルトの名無しさん:2010/11/02(火) 13:23:33
いいから早く codepad にソースうpしろよ。

838 :デフォルトの名無しさん:2010/11/02(火) 13:27:56
それは出来ません(核爆)

839 :デフォルトの名無しさん:2010/11/02(火) 13:30:39
なんでやねん! (・_;☆\(-_-)

840 :デフォルトの名無しさん:2010/11/02(火) 13:35:32
素で気持ち悪いな・・・

841 :デフォルトの名無しさん:2010/11/02(火) 13:37:34
この雰囲気、和むなぁ〜

842 :デフォルトの名無しさん:2010/11/02(火) 13:40:51
何かラインが低いな
話題共有して馴れ合いたいだけって事なんだろうけど
このていどの話ならゴロゴロしてるから

843 :デフォルトの名無しさん:2010/11/02(火) 13:40:52
この雰囲気で和むとか変態さんだな

>>836
TとUがまったく同一のインターフェースなら
V使わずにWでおk

844 :デフォルトの名無しさん:2010/11/02(火) 13:42:34
>>843
ありがとうございました(笑)

845 :デフォルトの名無しさん:2010/11/02(火) 13:47:51
アメリカの調査結果により、パンはとても危険な食べ物だということがわかった。
以下がその理由である。

1) 犯罪者の98%はパンを食べている
2) パンを日常的に食べて育った子供の約半数は、テストが平均点以下である。
3) 暴力的犯罪の90%は、パンを食べてから24時間以内に起きている。
4) パンは中毒症状を引き起こす。被験者に最初はパンと水を与え、後に水だけを与える実験をすると、
  2日もしないうちにパンを異常にほしがる。
5) 新生児にパンを与えると、のどをつまらせて苦しがる。
6) 18世紀、どの家も各自でパンを焼いていた頃、平均寿命は50歳だった。
7) パンを食べるアメリカ人のほとんどは、重大な科学的事実と無意味な統計の区別がつかない。


846 :デフォルトの名無しさん:2010/11/02(火) 13:56:09
>>833
アダプタは、ある要件を満たさないものを満たすように合わせるのが役目
例えば stack はコンテナが push/pop という要件を満たすようにする

いつぞや CFile を vector に使いたいという人がいたが
vector が要素に課す要件を満たすようにアダプタを作れば
間接的にではあるが CFile の配列を vector で扱うこともやればできる

847 :デフォルトの名無しさん:2010/11/02(火) 14:40:10
ブリッジパターンとか、pImplイディオムとかはファイル依存性を防ぐ目的だけど
テンプレートによる>>826みたいなやり方だとファイル依存性を作るから
ブリッジパターンとかでもないしアダプターでもないし何の意味も無いようなきがしますね。

848 :デフォルトの名無しさん:2010/11/02(火) 15:44:15
>>824
もしかして「STL標準講座」を参考にしてない?
あれのargument_typeとかresult_typeは絶対に間違いだと思う
だってコンパイル通らないもん

http://codepad.org/ZndqGMsT

普通はこう書く

849 :デフォルトの名無しさん:2010/11/02(火) 16:01:50
仮想的なコードを本物と勘違いしたパターンだな

850 :デフォルトの名無しさん:2010/11/02(火) 16:39:36
VC++なら派生クラスのスコープから基底クラスのtypedefをルックアップできるから>>824 のコードが通るはず。
もちろん非標準の動作。間違いというか環境依存の書き方だな。

851 :デフォルトの名無しさん:2010/11/02(火) 17:22:00
>>848
不要なキャストはやめようよ

852 :デフォルトの名無しさん:2010/11/02(火) 18:14:05
>>825
>>848,850
回答いただき、ありがとうございます。無事コンパイルができました。

>>848
そのとおりです。ときどきサンプルコードがコンパイルができないことがあり、いつもこちらにお世話になっています。

853 :デフォルトの名無しさん:2010/11/02(火) 18:34:13
不要なキャストなんてこの世にないさ

854 :デフォルトの名無しさん:2010/11/02(火) 19:26:18
return (i % 2 == 0); とでも書けばboolにキャストしなくてもいいじゃないか。
というかなんでそこだけCスタイルなの。

855 :デフォルトの名無しさん:2010/11/02(火) 20:06:53
>>854
いや(bool)消すだけでいいだろ
あとstatic_castもunsignedつければいらない

856 :デフォルトの名無しさん:2010/11/02(火) 20:09:55
>>851
試しにstatic_castを取ってcodepadにうpしてみな
ワーニングが出て実行結果が表示されないぞ

857 :デフォルトの名無しさん:2010/11/02(火) 20:31:34
2つめのループカウンタは size_t にすべきだろ。

858 :デフォルトの名無しさん:2010/11/02(火) 20:38:37
>>857
そりゃどうかね
多くの入門書がintを使ってる
警告が出るにも関わらずだ

859 :デフォルトの名無しさん:2010/11/02(火) 20:40:02
boost::optional<T> で、Tが組み込み型の時は真偽値から暗黙に構築できるのに、

boost::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 しても安全)
どうやって実装しているのか誰か説明してくれ。

860 :デフォルトの名無しさん:2010/11/02(火) 20:45:28
>>858
でも入門書はキャストしてないだろ?

861 :デフォルトの名無しさん:2010/11/02(火) 21:00:12
>>860
だから警告が出るとcodepadでは結果が表示されないと>>856に書いただろ
わざわざsize_tを使うかどうかはその人次第だ

862 :デフォルトの名無しさん:2010/11/02(火) 21:02:34
ケンカするなよお前ら
こんな時こそ忘れられぎみのostream_iteratorさんでも使ってやれよ

863 :デフォルトの名無しさん:2010/11/02(火) 21:11:19
>>859
こんなこと出来るって初めて知ったが多分こんな感じかな
http://codepad.org/fNt77FgZ
実際はどうやってるかしらんが他に思いつかん

864 :デフォルトの名無しさん:2010/11/02(火) 21:21:39
>>861
不要って言ったのは悪かった
警告を消すためのキャストはやめようよ

865 :デフォルトの名無しさん:2010/11/02(火) 21:23:24
なんで警告がでるか考えようよ
単一のシステムでしか動かさないのを前提ならかまわんが

866 :デフォルトの名無しさん:2010/11/02(火) 21:44:33
1.36だからかもしれんが>>859の言うような動作にはなってないように見える。

1.
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っぽい気もする。

867 :デフォルトの名無しさん:2010/11/02(火) 21:48:01
>>859
a と 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) だから

868 :デフォルトの名無しさん:2010/11/02(火) 21:49:09
>>865
優先度が intを使う>キャストを使わない ってことか
平行線なんでこの話題終了ってことでお願いします。

869 :デフォルトの名無しさん:2010/11/02(火) 21:49:28
boost使うと捗る?

870 :デフォルトの名無しさん:2010/11/02(火) 21:50:12
うん

871 :デフォルトの名無しさん:2010/11/02(火) 22:02:05
boost使うと後悔する?

872 :デフォルトの名無しさん:2010/11/02(火) 22:02:51
もちろんさー

873 :デフォルトの名無しさん:2010/11/02(火) 22:04:06
いいえ

874 :デフォルトの名無しさん:2010/11/02(火) 22:04:42
extern void Foo();

って宣言されてる関数を
std::Foo();
っていうように呼び出す方法ありますか?

875 :デフォルトの名無しさん:2010/11/02(火) 22:07:13
stdに追加するのはやめろ
ほかの名前空間なら

extern void Foo();
namespace hoge
{
inline void Foo() { ::Foo(); }
}

でいい

876 :デフォルトの名無しさん:2010/11/02(火) 22:08:28
サンクス

877 :デフォルトの名無しさん:2010/11/03(水) 01:16:03
>>875
namespace hoge { using ::Foo; } でよくね?

878 :デフォルトの名無しさん:2010/11/03(水) 01:46:28
>>871
使わないと後悔するが使っても後悔するだろうな。

C++という言語が後悔のかたまり。
でも逃げられないのがC++


879 :824:2010/11/03(水) 08:17:31
またまた、STL の教科書のサンプルがコンパイルできないでいます。
コンパイラは cygwin 上の gcc-4 です。
http://codepad.org/GWHKrVcz
そういうものでしょうか。それとも std 以外の別の空間にあるのでしょうか?



880 :デフォルトの名無しさん:2010/11/03(水) 08:48:24
boostのptr_vectorのメリットって何?

881 :デフォルトの名無しさん:2010/11/03(水) 09:43:52
>>879
VC10はエラーでないね。
cygwinつかってるならVC10expressがすぐ使えるから試してごらん
>>880
リソース管理してくれる

882 :デフォルトの名無しさん:2010/11/03(水) 11:33:01
>>879
標準にmem_fun1はない
そこはmem_funで通るはず

883 :デフォルトの名無しさん:2010/11/03(水) 11:33:41
>>879
gcc-4.3.3 だけど mem_fun1 だけが問題
mem_fun1 の標準内の位置づけがわからん


884 :デフォルトの名無しさん:2010/11/03(水) 13:02:36
>>880 http://www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html#motivation

885 :デフォルトの名無しさん:2010/11/03(水) 15:21:30
>>880
普通インスタンスへのポインタをvectorに入れても、それが削除されてもインスタンスの
デストラクタを呼んでくれないっしょ?

boost::ptr_vectorはまるでvector内にインスタンスが入っているかのようにデストラクタを
呼んでくれる

だからvectorはサイズの違うインスタンスは入れられないが、boost::ptr_vectorはポインタ
のみ入れればちゃんと動くので、ポリモーフィズムが出来るわけだ

886 :デフォルトの名無しさん:2010/11/03(水) 15:29:05
>>885
vectorにunique_ptrを格納するのをもっと効率よくやってくれるような感じか。

887 :デフォルトの名無しさん:2010/11/03(水) 15:31:12
boost::ptr_list使いたいけどコンパイル通らない環境でやってるからつらい

888 :デフォルトの名無しさん:2010/11/03(水) 15:40:36
>>886
そうだな
unique_ptrをぶち込んでも同じような結果になるな
今だったらunique_ptrを持ってるコンパイラならこちらの方がいいかも

889 :デフォルトの名無しさん:2010/11/03(水) 15:41:39
>>886
unique_ptr だったら空間効率は変わらないだろうし、ほかの点でも変わらないかも。

890 :デフォルトの名無しさん:2010/11/03(水) 15:53:46
http://codepad.org/sHHke4V9
上のように、同じ引数となるテンプレート関数の特殊化と通常のオーバーロード関数があった場合、
オーバーロード関数の方が優先的に呼ばれるようですがこれはそういう決まりなんですか?
そしてどちらかというとこっちが本題なんですが、
引数で型解決できるような関数だとデフォルト引数以外にテンプレート特殊化とオーバーロード関数の違いはなんになるんでしょうか?

891 :879:2010/11/03(水) 15:53:55
>>882
他皆さん
コメントありがとうございました。結論からいうと mem_fun でOKでした。
今の実力ではどうしてこれでOKなのかわかりませんが、いずれのときにか理解できるようになれば、と考えております。
ありがとうございました。



892 :デフォルトの名無しさん:2010/11/03(水) 15:57:50
ああだめだ
unique_ptrをvectorに入れようとするとコピー禁止なのでコンパイルエラーになる
要するにこれはstd::moveと組み合わせて使う事が前提なのか

893 :デフォルトの名無しさん:2010/11/03(水) 16:00:42
いろいろ調べて見たがコンパイラによって挙動が違うな

要するにunique_ptrはC++0xの機能なので、vectorがmoveに対応している
コンパイラなら通る
対応してないコンパイラならエラーになる

894 :デフォルトの名無しさん:2010/11/03(水) 16:22:08
gcc4.5.1でも -std=gnu++0x を付けないと通らない
しばらくはboost::scoped_ptrを使っていた方がいいかも
でもそれだとコンテナに入れられないか

895 :デフォルトの名無しさん:2010/11/03(水) 16:26:08
>>894 boost 使うなら ptr_vector でいいだろ

896 :デフォルトの名無しさん:2010/11/03(水) 16:30:55
>>894
scoped_ptrはコピーも移動もresetもできない
swapは可能

897 :デフォルトの名無しさん:2010/11/03(水) 16:32:47
>>896 reset() あるよ。
http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/scoped_ptr.htm#reset

898 :デフォルトの名無しさん:2010/11/03(水) 16:32:50
>>896
ああそっかじゃあやっぱりだめだな
こういうのを動かしたいわけ

#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 を付ける
}

899 :デフォルトの名無しさん:2010/11/03(水) 16:33:59
ごめんstd::moveは不要だった

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::unique_ptr<A>(new A)); // gccなら-std=gnu++0x を付ける
}

900 :デフォルトの名無しさん:2010/11/03(水) 16:35:31
>>899
C++0x ならそれでいいし、そうじゃなければ boost::ptr_vector でいい。
まだなんか問題ある?

901 :デフォルトの名無しさん:2010/11/03(水) 16:36:58
>>900
それでいいな
これ以上のunique_ptrの話はC++0xスレに移動しよう

902 :デフォルトの名無しさん:2010/11/03(水) 16:45:00
>>890
そういう決まり

関数テンプレートを全部特殊化で記述して使った場合の違いは、
関数テンプレートの場合は引数が暗黙に変換されないことくらいだと思う

903 :デフォルトの名無しさん:2010/11/03(水) 17:28:53
>>902
どうもありがとうございます
実はいままで関数テンプレートの特殊化する方法を知らず全て普通のオーバーロード関数にしていたのですが、
特に問題がなければ見なおさなくてもいいですか?

904 :デフォルトの名無しさん:2010/11/03(水) 18:08:10
>>897
あれ?デフォコンもresetも無いから便利と記憶してたのにな

905 :デフォルトの名無しさん:2010/11/03(水) 18:28:39
>>903
場合にもよるけど、
関数テンプレートをすべて特殊化しなければ処理を記述できない(= 関数名は同じだけど実は中身は違う処理)のであれば
普通のオーバーロードのままのほうがいいと思う

もし、関数が受け取る引数の型に共通の性質を切り出すことができて、
切り出した性質(と、切り出すまでもなく備わってる共通の性質)のみに依存するコードを記述できるのであれば、
traitsなどを使ってテンプレート化してしまったほうがいいかもしれない

906 :デフォルトの名無しさん:2010/11/03(水) 19:13:05
>>905
どうも丁寧にありがとうございます
結構煩雑な部分が多いので共通項の切り出しとテンプレートについて良く見なおしてみます

907 :デフォルトの名無しさん:2010/11/03(水) 21:10:16
static Hoge create(Test &t){ Hoge h = t.createHoge(); return h; }
int main() {
Test t;
Hoge h = create(t);
return 0;
}

このようなコードを書いた場合、mainでHoge hを使うのは安全ですか?

908 :デフォルトの名無しさん:2010/11/03(水) 21:21:23
templateはジェネリックよりも強力という記事がたまにありますが
どこら辺がジェネリックよりも強力なのですか?

909 :デフォルトの名無しさん:2010/11/03(水) 21:22:45
ジェネリックは型しかパラメータにできないんじゃない?

910 :デフォルトの名無しさん:2010/11/03(水) 21:29:34
>>907
Hogeのオブジェクトがコピーされても安全な設計ならば問題ない

911 :907:2010/11/03(水) 21:40:08
>>910
thx

912 :デフォルトの名無しさん:2010/11/03(水) 22:23:33
>>908
強力というか別物。
C#のジェネリックは制約を使うので、型パラメータに使える型が制限させれる。
たとえば、C#で以下の例のように、aはIDisposableの派生でなくちゃならないし、IDisposableで定義されたメソッドしか呼べない。
void hoge<T>(T a):where IDisposable
{
a.Dispose();
}
C++は制約がないので、型にメンバー関数があれば呼べる。

さらにC#ではtypedefがないんで事実上TMPLが無理


913 :デフォルトの名無しさん:2010/11/03(水) 22:30:29
where T:IDisposableだったなすまん

914 :デフォルトの名無しさん:2010/11/03(水) 22:31:39
メタと非メタの違いですよ

915 :908:2010/11/03(水) 22:41:02
>>912-914
なるほど、それもそうですね
ありがとうございます

916 :デフォルトの名無しさん:2010/11/04(木) 09:36:12
>>885

レスが遅れたけど、ありがとうございます。
説明が明快でよくわかりました。




917 :デフォルトの名無しさん:2010/11/04(木) 14:16:25
structをclassの代わりに使う意味はありますか?

918 :デフォルトの名無しさん:2010/11/04(木) 14:22:45
enum hackって普通に使われてるけど間違った使い方っぽいけど
正式なenum hackの代わりになるものって無くてこれからもできないんですか?

919 :デフォルトの名無しさん:2010/11/04(木) 14:23:39
>>917
ありますよ

>>918
できないんです

920 :デフォルトの名無しさん:2010/11/04(木) 14:28:13
どういうシチュエーションでenum hackが必要?
static const int foo = 3;
でダメなの?

921 :デフォルトの名無しさん:2010/11/04(木) 14:29:53
enum hackはテンプレートメタプログラミングで出てくるやつです。


922 :デフォルトの名無しさん:2010/11/04(木) 15:24:57
>>921
TMPでも>>920でいけるでしょ

923 :デフォルトの名無しさん:2010/11/04(木) 15:34:02
enum hackって古いC++で必要なんじゃなかったっけ?

924 :デフォルトの名無しさん:2010/11/04(木) 19:08:09
>>920
それが通る環境ならOK

925 :デフォルトの名無しさん:2010/11/04(木) 20:24:43
>>920
何が何でも定数でメモリを使いたくないとき。

今時、普通のコンパイラは定数をわざわざメモリに配置したりしないんだけど、
その定数のアドレスを参照しているところが一ヶ所でもあれば、メモリに配置せざるをえない。
enumならアドレス参照ができないから、メモリに配置されることもない。

ま、WindowsやLinuxを使っている限りはどうでもいいようなことだな。

926 :デフォルトの名無しさん:2010/11/04(木) 21:24:09
しょーもない質問なのですが
static Hoge* Hoge::create() { return new Hoge(); }
こーいうのってファクトリ関数というのですか?何のために在るんですか?

927 :デフォルトの名無しさん:2010/11/04(木) 21:37:38
コンストラクタの引数を隠蔽したり
複数のクラスを組み合わせたオブジェクトを生産したり
まとにかく色々できるよ

928 :デフォルトの名無しさん:2010/11/04(木) 21:39:40
端的な例として、継承を利用して同じcreateでも別のものできるのを利用したりとか

929 :デフォルトの名無しさん:2010/11/04(木) 21:42:42
Hogeが抽象クラスになってて、実装を隠蔽してるとかな。

930 :デフォルトの名無しさん:2010/11/04(木) 21:43:43
template<int HOGE>
Hoge::Hoge();
は宣言できるけれども呼び出す手段がないとか

931 :デフォルトの名無しさん:2010/11/04(木) 21:53:53
ありがとうございます

>>端的な例として、継承を利用して同じcreateでも別のものできるのを利用したりとか
これはどういうことでしょう

932 :デフォルトの名無しさん:2010/11/04(木) 22:04:46
例えばこういうの
static Hoge* Hoge::create() {
if (isWindows) return new WindowsHoge();
if (isLinux) return new LinuxHoge();
if (isMac) return new MacHoge();
return new DefaultHoge();
}

933 :デフォルトの名無しさん:2010/11/04(木) 22:38:15
>>926
デザパタの一種
生成パターンでぐぐってみな

934 :デフォルトの名無しさん:2010/11/04(木) 22:55:42
>>931
Factoryパターンとかのことをいってるんじゃなかろうか

935 :デフォルトの名無しさん:2010/11/04(木) 23:05:04
こういう実装にしたら氏ねという言葉を頂戴しました
Factoryで生成しろってことですかね?

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,
} ;

936 :デフォルトの名無しさん:2010/11/04(木) 23:11:06
もう明日から来なくていいよってことですね

937 :デフォルトの名無しさん:2010/11/04(木) 23:20:40
>>935
最低限デザインパターンをググって一通り学んできてから質問しなよ
じゃないとここでも氏ねと言われるだけ

938 :デフォルトの名無しさん:2010/11/04(木) 23:24:54
>>935
GOF本買おうよ
滅多にデザパタ使わない俺でも持ってるぞ

939 :デフォルトの名無しさん:2010/11/04(木) 23:27:32
俺がデザパタで一番感動したのはステート・パターン
初めてサンプルプログラム書いてみて、目から鱗が落ちる思いだった

940 :デフォルトの名無しさん:2010/11/04(木) 23:30:36
そんな話はGOFスレでやってくださいよ

941 :デフォルトの名無しさん:2010/11/04(木) 23:32:57
だって>>935みたいなコードを書く奴に「GOFスレ逝け」と言ったら可哀想じゃん
フルボッコされるぞ
あのスレ変な信者が多すぎ

942 :デフォルトの名無しさん:2010/11/04(木) 23:42:24
>>935
自虐ギャクだろ?
こんなんにかさにかかって煽るやつって。

943 :デフォルトの名無しさん:2010/11/04(木) 23:52:17
>>935
べつに何も悪く無いと思うけど

あれが悪いと言ってる人たちも具体的な指摘をしていないし
明確な欠点はないんじゃない

944 :デフォルトの名無しさん:2010/11/04(木) 23:55:24
柔軟性が無いって事じゃない?
Factory Method や Abstruct Factory は後からコードやクラスの変更が
生じた時も最小限の修正で済む

945 :デフォルトの名無しさん:2010/11/05(金) 00:10:47
Factory Method パターンなんて
関数のポインタや boost::function があるC++には不要なんじゃない?

946 :デフォルトの名無しさん:2010/11/05(金) 00:13:57
まあ確かにFactory Method は if文の羅列になりやすくてあまり綺麗じゃない
仮想関数を使えば綺麗になるけど

947 :デフォルトの名無しさん:2010/11/05(金) 00:19:28
微妙に燃料が投下されている気がw

948 :デフォルトの名無しさん:2010/11/05(金) 00:22:13
深く考えないほうがいいですか
一応javaデザインパターン入門は10回ぐらい呼んだ・・・

949 :デフォルトの名無しさん:2010/11/05(金) 00:25:07
デザインパターンに当てはまらない設計するとキレる人がいる

950 :デフォルトの名無しさん:2010/11/05(金) 00:29:17
>>945
functionだとoperator()以外も持ったファクトリの代用にならないし
関数ポインタは状態が持てないからディスパッチャ以上のものが期待できない

951 :デフォルトの名無しさん:2010/11/05(金) 00:54:50
>>935
create_Hoge が const になってない。しね

952 :デフォルトの名無しさん:2010/11/05(金) 00:55:47
>>950
operator()を持ってないならbindすればいいじゃない
>>946のようにif文がめんどいならfunctionをコンテナに突っ込んで
識別子を定義するなりして生成関数を登録すればいい
たしかLokiのFactoryはそれに近いことをやっていたはず
とはいえ、functionに期待するのは遅延実行だから
commandパターンやboost::signalのようにobserverパターンだと思うけど

>>941
デザパタの実装なんていくらでもあってキリがないから
GOFスレでやったほうがいいと思うんだけどね
まあ、あのスレはオレは見てないけどw

953 :デフォルトの名無しさん:2010/11/05(金) 00:57:56
昨晩はCスレが炎上してたけど今宵はC++スレか┐(´ー`)┌ヤレヤレ

954 :デフォルトの名無しさん:2010/11/05(金) 01:04:46
俺がくらだない質問してしまったからだ、、、ごめんなさい

955 :デフォルトの名無しさん:2010/11/05(金) 01:07:45
>>952
いや、そうじゃなくて
factory.clear_pool();
みたいなメンバ持たせたいこともあるでしょや
functionだとそういう時困る

956 :デフォルトの名無しさん:2010/11/05(金) 01:56:58
>>955
それはFactory Method パターンにふくまれるか?

957 :デフォルトの名無しさん:2010/11/05(金) 03:27:56
>>956 無意味な質問だな

958 :デフォルトの名無しさん:2010/11/05(金) 10:08:59
クラスを作るときに使うサブシステムのソースをサブフォルダに纏めて
名前衝突を回避するために名前空間をディレクトリ構成に一致するようつけてたら
階層が深くなりすぎて名前空間が激長になってしまった
なんか良いプロジェクト構成管理方法は無いものか

959 :デフォルトの名無しさん:2010/11/05(金) 10:24:53
あるよ

960 :デフォルトの名無しさん:2010/11/05(金) 13:07:07
>>958
あちゃー やっちゃったね
Java上がりの人がプロジェクト規約を作ったりすると
犯しやすい致命的な間違いだよそれ。
C++の名前空間はJavaのパッケージみたくは使えないから。
ご冥福をお祈りします。

961 :デフォルトの名無しさん:2010/11/05(金) 13:20:57
別に普通にやるだろ。
深くすれば長くなるのは当たり前なんだからもう少しフラットに区分すりゃいいだけ。
長くても使う時にusingなりtypedefすりゃいいだけ。

962 :デフォルトの名無しさん:2010/11/05(金) 13:23:03
usingが必要になるってことは設計が間違っているとか言い出す輩↓

963 :デフォルトの名無しさん:2010/11/05(金) 14:43:59
特殊化でクラスを分ける場合、<int a>でわけるのと
<T a>で分けるのとどっちが良いんですか?

964 :デフォルトの名無しさん:2010/11/05(金) 14:45:02
特殊化でクラスを分ける場合、<int a>でわけるのと
<typename T>で分けるのとどっちが良いんですか?
Tとaはクラスで使わないとします。

965 :デフォルトの名無しさん:2010/11/05(金) 14:53:39
いずれにしても糞設計の悪寒。

966 :デフォルトの名無しさん:2010/11/05(金) 15:02:28
>>964
一般的には、 typename T のほうが衝突の回避や意図の明示が
しやすくていいと思うよ。

引数の意味によっては int が適切なことがあるかもしれないけど、
どちらかというと稀だと思う。

967 :デフォルトの名無しさん:2010/11/05(金) 15:53:02
あざーす

968 :デフォルトの名無しさん:2010/11/05(金) 15:59:35
あざーすって馬鹿っぽいからやめろよ

969 :デフォルトの名無しさん:2010/11/05(金) 16:01:03
あざーした

970 :デフォルトの名無しさん:2010/11/05(金) 16:07:15
あざっすでありんす

971 :デフォルトの名無しさん:2010/11/05(金) 16:11:13
モジュールごとにフォルダ作って階層は一段階だけ
サブモジュールが使いたければプロジェクトルートからのパスでインクルードする
名前は::プロジェクト名::モジュール名::〜〜
これで完璧だろ

972 :デフォルトの名無しさん:2010/11/05(金) 16:27:53
理想的には構造と実装の分離が望ましいだろ。
実装に対して構造がいくつも存在することが出来れば
ソートしたりバラバラにしてまた組み立てたり色々なことができるよ。

973 :デフォルトの名無しさん:2010/11/05(金) 17:45:01
ライブラリならともかく
応用アプリだとなかなか難しいよ

974 :デフォルトの名無しさん:2010/11/06(土) 00:01:09
constな配列を作りたいのですが、
配列の宣言と同時に初期化できないので、
最初に一度だけ書き換えたいのです
どうすれば良いでしょう?


975 :デフォルトの名無しさん:2010/11/06(土) 00:04:52
const_castして


死ぬ

976 :デフォルトの名無しさん:2010/11/06(土) 00:04:55
comとc++は仲がいいみたい?だけどさ、結局comってなんなのよ
システムetc etcのapiを使うために、インターフェイスを実装するってだけの話でしょ

977 :デフォルトの名無しさん:2010/11/06(土) 00:17:49
>>976
ttp://ascii.asciimw.jp/pb/bookmart/pdf/47561/4756130666.pdf
これ読めばいいかと
糞長いけど

978 :デフォルトの名無しさん:2010/11/06(土) 00:37:16
std::string s = "string";
このようにstringを宣言した場合、
char *c = "strings";
std::string s(c);
と解釈されるのですか

それとも、"string"と書いただけでstringに解釈されるのですか

979 :デフォルトの名無しさん:2010/11/06(土) 00:38:14
!?

980 :デフォルトの名無しさん:2010/11/06(土) 00:40:41
10回ぐらい読んだ

981 :978:2010/11/06(土) 00:41:27
いやね
char *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");
みたいに書けるじゃないかな〜と思ったの

982 :デフォルトの名無しさん:2010/11/06(土) 00:50:21
その二つは別物だろ

983 :デフォルトの名無しさん:2010/11/06(土) 01:25:41
>>976
元々は言語を問わず相互利用可能なインターフェイスを提供するレイヤーだろ。
その先にはCORBAのような分散オブジェクト技術としてCOM+までの流れがあるわけだけれども大して使われず.NETと被ってグダグダに。

984 :デフォルトの名無しさん:2010/11/06(土) 01:29:48
>>978
ttp://codepad.org/fTfweFbp
なんかひでえ結果が。

985 :デフォルトの名無しさん:2010/11/06(土) 01:51:19
>>974
const な配列へのポインタを置いといて、値が決まったところで配列を生成して
ポインタをセットすればいい。

986 :デフォルトの名無しさん:2010/11/06(土) 01:53:54
>>981
後者のように書けて何がうれしいのかわからない。それと >>978 の質問の関連もわからない。

987 :デフォルトの名無しさん:2010/11/06(土) 01:55:47
>>984
スレ違いだけどそういう時こそC++0xの右辺値参照が生きてくるんだよな
一次オブジェクトなんかどうせ捨ててしまうんだからいっそのことmoveさせて
しまおうという

988 :デフォルトの名無しさん:2010/11/06(土) 01:57:22
×一次
○一時

989 :v(^・^)v:2010/11/06(土) 01:58:06
次スレ建てるんでしばらくレス自重されたし

990 :v(^・^)v:2010/11/06(土) 02:26:38
次スレ

C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/

991 :デフォルトの名無しさん:2010/11/06(土) 06:59:48


992 :デフォルトの名無しさん:2010/11/06(土) 08:10:09
次スレ

C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/


993 :デフォルトの名無しさん:2010/11/06(土) 11:43:33
92 名前:デフォルトの名無しさん[sage] 投稿日:2010/11/06(土) 08:10:09
次スレ

C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/

994 :デフォルトの名無しさん:2010/11/06(土) 17:32:04
uma

995 :デフォルトの名無しさん:2010/11/06(土) 17:32:45
梅毒


996 :デフォルトの名無しさん:2010/11/06(土) 20:29:29
梅名イカ

997 :デフォルトの名無しさん:2010/11/06(土) 20:32:22
うんこ

998 :デフォルトの名無しさん:2010/11/06(土) 20:39:10
ぬるぽ

999 :デフォルトの名無しさん:2010/11/06(土) 20:48:26
次スレ

C++相談室 part86
http://hibari.2ch.net/test/read.cgi/tech/1288976595/

1000 :デフォルトの名無しさん:2010/11/06(土) 20:49:07
1000

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

214 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)