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

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

C++相談室 part76

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

前スレ
C++相談室 part75
http://pc12.2ch.net/test/read.cgi/tech/1259393258/

2 :デフォルトの名無しさん:2009/12/16(水) 23:10:18
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映していない)
[禿 Stroustrup]
 http://public.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?#jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3 :デフォルトの名無しさん:2009/12/16(水) 23:10:31
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||ii''''""" "''''"" """"'ii||||||||||||||||||||||||||||||
||||||||||||||||||iiii'''''""           .,,,,,,,,,, , """'''ii||||||||||||||||
|||||||||||||||||i'" .,,iillll|||||lllli,,.      '''"~~"''''・;;,,..  il|||||||||||||||
|||||||||||||||〃 i''"              ,,,,,,,,, .   ||||||||||||||||
|||||||||||||||  ,,ii'".iillliiミi,.ミi,     .,ッ'~.,illllllliェ. 'i,,  i|||||||||||||||||
|||||||||||||||| l|" il|||||||||li `|li   ,,iii'" ,i|||||||||||i i,  l||||||||||||||||
|||||||||||||||| 'il|l,,.ミl||||||リ.,,ii|l"  "l||ミェ, ミi|||||||lリ.,li,  i|||||||||||||||||
||||||||||||||||  "'''iilllllllリ''""     "'ミiilllllliiリ''""  i||||||||||||||||
|||||||||||||||          .,;             il||||||||||||||
||||||||||||||||        .;:,,.    .,,.          il||||||||||||||
il||||||||||||||i,             '".;:          il||||||||||||
illl||||||||||||||i,     .,,,,,メiiiiiメiiillllilllliiiョュ,,,,..       il||||||||||||
 iill|||||||||||||i,    "iii,..  ,. ,. .,. .,.,,i||||li;.      ,il||||||||||||
   'i||||||||||ii,    ''ill||""'iil"iiゞゞヾllll|||l'"    .il||||||||||||”
    "i|||||||||ii,,.    "'iii'""""'iiiii'"".    ..,,iil|||||||||||”"
     "i|||||||||||iii,,             .,,iiillll||||||||”
      """"""""            '''""""

4 :デフォルトの名無しさん:2009/12/16(水) 23:10:36
■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 :デフォルトの名無しさん:2009/12/16(水) 23:10:48
■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/

6 :デフォルトの名無しさん:2009/12/16(水) 23:11:00
■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

7 :デフォルトの名無しさん:2009/12/16(水) 23:11:14
 codepad
 ttp://codepad.org/

長いソースを貼るときはここへ!

8 :デフォルトの名無しさん:2009/12/16(水) 23:11:54
前スレの991は最低だなw
久しぶりにキレたゎw

9 :デフォルトの名無しさん:2009/12/16(水) 23:12:33
誰もスレ立てしないみたいだし取り急ぎ立てた。
テンプレは前スレから単純にコピペしたので修正が必要だったら指摘よろ。

10 :デフォルトの名無しさん:2009/12/16(水) 23:22:09
>>9
ありがとう。
>>8
くだらねー話を蒸し返すな

11 :デフォルトの名無しさん:2009/12/16(水) 23:23:59
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

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


12 :デフォルトの名無しさん:2009/12/17(木) 03:07:56
>>11
地鎮乙

13 :デフォルトの名無しさん:2009/12/17(木) 13:44:49
>>8
話の流れが分からんからなんで切れてるのか不明なんだが
後者は無名変数だから一時変数が省略されるとか起きそうな気がする


14 :デフォルトの名無しさん:2009/12/17(木) 17:03:45
宣伝あげ

15 :デフォルトの名無しさん:2009/12/17(木) 20:48:53
             ∧      ∧
    n:       |;;;;|     |;;;;|
    ||      ヽ ヽ   / /
    ||       , '   ̄ ̄  '、  ピカーwwwwww(お前らさあ、それこのスレと何か関係あるの?)
    ||      / (゚ ) ( ゚) ヽ ピカーwwwwwwww(どう考えても関係ないよね?)
   f「| |^ト      |(;;;) _,・、_ (;;;) | ピカチュウピカチュウピカチュウwwwwwwww(じゃあなぜそんなこと書き込んだのかな?)
   |: ::  ! }    ヽ  |-┬-|  / ピッピカチュウwwwwwwww(きっとバカなんじゃないかな?)
   ヽ  ,イ     ヽ  uー'´ /  ピイカァピカァwwwwwwwwwwwwwwwwwwww(精神科に行って診てもらいなよ^^)

16 :デフォルトの名無しさん:2009/12/17(木) 21:12:21
自分の作ったプログラムをソース隠蔽してライブラリレベルで公開したい。
(C言語の場合はプロトタイプ書いたヘッダーとlibファイル)
C++でクラスを公開しないでこれをするにはどうすればいいですか?

17 :デフォルトの名無しさん:2009/12/17(木) 21:26:01
インターフェースとファクトリだけ公開します

18 :デフォルトの名無しさん:2009/12/17(木) 22:13:39
VC++2005なんですが、「__FILE__」マクロを使うと
ファイルパスが全て小文字に変換された形で取得できます。
大文字のまま取得する方法はないですか?

19 :デフォルトの名無しさん:2009/12/17(木) 22:20:22
             ∧      ∧
    n:       |;;;;|     |;;;;|
    ||      ヽ ヽ   / /ピカァwwwwピカピカwwwww(VC++2005wwww古www)
    ||       , '   ̄ ̄  '、  ピカーwwwwww(お前さあ、それこのスレと何か関係あるの?)
    ||      / (゚ ) ( ゚) ヽ ピカーwwwwwwww(どう考えても関係ないよね?)
   f「| |^ト      |(;;;) _,・、_ (;;;) | ピカチュウピカチュウピカチュウwwwwwwww(じゃあなぜそんなこと書き込んだのかな?)
   |: ::  ! }    ヽ  |-┬-|  / ピッピカチュウwwwwwwww(きっとバカなんじゃないかな?)
   ヽ  ,イ     ヽ  uー'´ /  ピイカァピカァwwwwwwwwwwwwwwwwwwww(精神科に行って診てもらいなよ^^)

20 :デフォルトの名無しさん:2009/12/17(木) 23:30:23
まさかヘッダと実装分けてるよね?

21 :デフォルトの名無しさん:2009/12/17(木) 23:34:50
>>18
しょうがないと思われ

22 :デフォルトの名無しさん:2009/12/18(金) 01:13:37
>20
インライン展開を狙って分けていないのもあります。
が、それは分ければいい話で、public関数以外は変数も見せないような
COM的なことをしたいのです。

>>17
キーワードをぐぐったら、それっぽい「インターフェースクラス」など
未知の領域があったのでもちょっと調べてみまっす。


23 :デフォルトの名無しさん:2009/12/18(金) 15:47:15
>>22
どのくらいC++に詳しい?
とりあえずboostとか少しでも知っている?

24 :23:2009/12/18(金) 15:50:37
>>22
もしboost C++を知っているならshared_ptrとか言われても分かるだろうから

pimplイディオム - みこな
ttp://blog.goo.ne.jp/mikona-blog/e/e701abfe4ddc278974ff877ebae207db
pimplイディオムを語る ? ありえるえりあ
ttp://dev.ariel-networks.com/Members/matsuyama/pimpl30a430a330aa30e030928a9e308b
More C++ Idioms/ハンドル・ボディ(Handle Body) - Wikibooks
ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%83%BB%E3%83%9C%E3%83%87%E3%82%A3(Handle_Body)

この辺でどうだい?

25 :デフォルトの名無しさん:2009/12/18(金) 17:54:18
動的削除子の実装の仕方を分かりやすく教えてください。

26 :デフォルトの名無しさん:2009/12/18(金) 17:57:15
デストラクタをテンプレート関数でラップして一意なインターフェイスとしてその関数ポインタを動的に保持、メモリから開放するときにそれを実行?

27 :デフォルトの名無しさん:2009/12/18(金) 18:00:51
動的削除子ってあれか。
shared_ptrとかで実装されているすごいヤツ
という認識しかない。


28 :デフォルトの名無しさん:2009/12/18(金) 18:24:36
もっと分かりやすく説明できる奴はこのスレには居ないのかー!

29 :デフォルトの名無しさん:2009/12/18(金) 18:26:26
ぐぐればいくらでも出てくるだろうがそれでも分からなければお前が無能なだけ

30 :デフォルトの名無しさん:2009/12/18(金) 18:31:02
上級者スレに貼ってきてやったぞ
感謝しやがれ

31 :デフォルトの名無しさん:2009/12/18(金) 18:33:52
なんでそんな過疎スレに貼ってんだ

32 :デフォルトの名無しさん:2009/12/18(金) 19:31:07
int i0 = 1;
cout << i0 << ", " << ++i0 << endl;

int i1 = 1;
cout << i1 << ", " << i1++ << endl;

が、

gcc version 4.3.3 では
2, 2
2, 1

VC++ 2008 Express では
2, 2
1, 1

となります。
私の知識では
1, 2
1, 1
となると思っていたので大変予想外な結果です。
なぜでしょうか?

33 :デフォルトの名無しさん:2009/12/18(金) 19:34:06
>>32
未定義の動作。

未定義の動作って説明いらないよね?知ってる?


34 :デフォルトの名無しさん:2009/12/18(金) 19:44:39
どの部分が未定義なのでしょうか?

cout << i0 << ", " << ++i0 << endl;
であれば、

cout << i0 で、i0の値(参照ではなく)がofstreamの中に入って(言い方が正しいか分かりませんが)しまうので、
(かつての)i0の値とi0本体とはもう別物である、と思ってしまいました。


35 :デフォルトの名無しさん:2009/12/18(金) 19:52:08
(1) coutが評価される
(1') i0が評価される
(1'') ","が評価される
(1''') ++i0が評価される(これは評価に副作用がある)
(1'''') endlが評価される
(2) operator <<((1), (1'))
(3) operator <<((2), (1''))
(4) operator <<((3), (1'''))
(5) operator <<((4), (1'''')) = expression

(1)から(1'''')の評価順序は未定。

36 :33:2009/12/18(金) 19:54:40
>>34
残念ながら
初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
> Q 【評価順序】
>  評価の順序が不定である、というのはどういうことか。
> A
> a = foo() + bar(); のようなコードに対して、 foo と bar のどちらが先に
> 呼ばれるか決まっていない、ということです。
> --------------------------------------------------------------------------------
>
> Q 【優先順序】
>  評価と優先順序とは何が違うのか。
> A
>  優先順序というのは、異なる演算子が式の中で組み合わせられた場合に、
> どの結合を優先的に行うかを決めた規則です。算数で、掛け算は足し算よりも先に計算する
> 、という規則があるのと同じです。
>  しかし、優先順序に関らず、それぞれの項の評価順序は不定のままです。
> 例えば、次の式は、どのような順序で関数が 呼ばれるか分かりません。
> これで言えるのは、 f2() を呼び出して得られた値と f3() を呼び出して得られた値を
> まず掛け算し、その結果と f1() を呼び出して得られた値を加算する、
> ということだけです。最後に足し算が行われるにもかかわらず、
> f1() が真っ先に呼び出されて、掛け算が終わるまで
> その値が保存されているかもしれません。
>
> i = f1() + f2() * f3();



37 :33:2009/12/18(金) 20:03:33
>>34
> (かつての)i0の値とi0本体とはもう別物である、と思ってしまいました。
それを実現したい場合は
cout << i0 << ", ";
cout << ++i0 << endl;
こうするしかないね。
簡単に言うと
一つの式の中でiの値が変化する->変化する場所はたった1ヵ所のみでなければならず、さらにその変化後のiの値を取得する目的以外でiを参照してはならない。
例 cout << ++i0; はOK
  i++*i++; はダメ。
  ++i*i;  もダメ。
一つの式の中でiの値が変化しない->何回参照してもok
例 cout << i0 << i0 << i0;はOK


38 :32:2009/12/18(金) 20:38:47
>>33
>>35
>>36
>>37
ありがとうございます。


<<演算子のオーバーロードを、
std::ostream& operator<< ( std::ostream& os, const T& val )
{
return ( os << val );
}
の様に定義するので、左から順にoperator<<関数を呼んでいって

(1) cout << i0;
(2) cout( i0評価済み ) << ", ";
(3) cout( i0 と ", " 評価済み ) << ++i0;
(4) cout( i0 と ", " と ++i0 評価済み) << endl;

を想像していました。
左から順に評価をしないと 第1引数の std::ostream に coutが来ないので
上手く処理できないんではないかと。

>>35
のように、引数全部をまず評価するのですね。
勉強になりました。

39 :デフォルトの名無しさん:2009/12/18(金) 20:39:29
質問です。


環境はWinXP、VC++2008 Express Editionです。
Windowsフォームアプリケーションを作成しています。



フォームのテキストボックスに入力された文字列(英数字のみ)を取得し、1文字ずつ16進数に変換し、その総和を計算したいのですが良い方法はありますか?

【例】
テキストボックスに"12"と入力されたとき、0x31 + 0x32を計算して0x63とする。


また、3桁の16進数となった時は下2桁のみ取得します。
取得した2桁の16進数は各桁に該当する英数字を文字もしくは文字列で取得(総和が0x63ならば"6"と"3"をそれぞれ取得)します。



文字列をGetBytesで変換後バイト型配列に格納し、
BitConvertで弄るなど考えましたが上手くいきません。

宜しくお願い致します。

40 :33:2009/12/18(金) 21:50:49
>>38
> 左から順に評価をしないと 第1引数の std::ostream に coutが来ないので
> 上手く処理できないんではないかと。
評価順

優先順序
の違いってやつだな。

> のように、引数全部をまず評価するのですね。
いや、それも別に決まってはいないんだってば。
君の想定した通りにしてもいいし、しなくてもいい。


41 :デフォルトの名無しさん:2009/12/18(金) 22:09:24
>>39
よくわからない。


42 :デフォルトの名無しさん:2009/12/18(金) 22:52:54
>>39
ヒント: 文字型(char, wchar_t)はC/C++ではただの桁数の少ないint

43 :41:2009/12/18(金) 23:14:00
やっと>>39の言ってる意味がわかった

44 :41:2009/12/18(金) 23:29:42
CLIでなくC/C++ではcharは文字以外に何に使った??

(Windowsの例)
char = 8ビット 0 〜 255 の整数型

45 :デフォルトの名無しさん:2009/12/19(土) 06:05:42
地震怖いお(^ω^;)

46 :デフォルトの名無しさん:2009/12/19(土) 15:36:18
>>42,44
レスありがとうございます。

入力された文字列を1文字ずつ取り出してchar型の変数に格納し、
それらの総和を計算し、最後に16進数に変換するということになるのでしょうか?


47 :デフォルトの名無しさん:2009/12/19(土) 15:51:55
wchar_tだろ??

sizeof(wchar_t) = ??
sizeof(short) = ??

48 :デフォルトの名無しさん:2009/12/19(土) 16:09:40
wchar_t wc1 = L'a';
wchar_t wc2 = L'あ';
unsigned char *data = NULL;

// a : 0x61 0x00
data = reinterpret_cast<unsigned char*>(&wc1);
printf("a : 0x%02hx 0x%02hx \n", data[0], data[1]);

// あ : 0x42 0x30
data = reinterpret_cast<unsigned char*>(&wc2);
printf("あ : 0x%02hx 0x%02hx \n", data[0], data[1]);

49 :デフォルトの名無しさん:2009/12/19(土) 16:12:30
%02hhx
じゃないの?

50 :デフォルトの名無しさん:2009/12/19(土) 16:20:05
http://codepad.org/BvvHrtTy

51 :デフォルトの名無しさん:2009/12/19(土) 16:21:34
オーバーフローするので総和はintにしましょう

52 :デフォルトの名無しさん:2009/12/19(土) 16:33:48
> wchar_tのサイズってもしかして環境依存??

なんだ!
この低レベルな議論はw
char以外、サイズは決まってないだろ?
だいたい>>47の言う通りsizeofを何故使わない?

53 :デフォルトの名無しさん:2009/12/19(土) 17:32:46
typedef wchar_t mini_int;

54 :デフォルトの名無しさん:2009/12/19(土) 17:41:11
おつですな

55 :デフォルトの名無しさん:2009/12/19(土) 17:47:39
もしかしてもクソもねぇw
環境依存に決まってんだろ
それぐらい知らないようではC/C++やる資格はねぇ。


56 :デフォルトの名無しさん:2009/12/19(土) 19:22:01
typedef long long long too_long;

57 :デフォルトの名無しさん:2009/12/19(土) 19:37:12
http://codepad.org/OjzLC1dH

58 :デフォルトの名無しさん:2009/12/19(土) 19:39:39
unsignedばっかだな

59 :デフォルトの名無しさん:2009/12/19(土) 20:07:45
>>56
g++でコンパイルしてみたら

error: 'long long long' is too long for GCC

だってさ。ユーモアあるな。

60 :デフォルトの名無しさん:2009/12/19(土) 20:40:38
>>59
4つ並べてもメッセージ同じだった。
どうして3つだけなのよォオオオ〜ッ!!


61 :デフォルトの名無しさん:2009/12/19(土) 20:41:06
>>56 >>59
わらた

62 :デフォルトの名無しさん:2009/12/19(土) 20:45:04
typedef short short short too_short;
これやってみ。

63 :デフォルトの名無しさん:2009/12/19(土) 20:54:39
#include <stdio.h>
#include <limits.h>

#define < =
#define あふれとるやんけ ULLONG_MAX + 1
typedef unsigned long long (;一_一);


int main()
{
(;一_一) つ < あふれとるやんけ;
return 0;
}

64 :デフォルトの名無しさん:2009/12/19(土) 22:26:52
>>59
ごち!
面白かった

65 :デフォルトの名無しさん:2009/12/20(日) 03:11:18
こいつの仕業か
ttp://gcc.gnu.org/ml/gcc-patches/2006-07/msg00647.html

66 :デフォルトの名無しさん:2009/12/20(日) 12:44:40
class MyClass{};
このクラスの定義はするが
オブジェクトは作られたくない
という場合、どう実現すればよいでしょうか?

67 :デフォルトの名無しさん:2009/12/20(日) 12:45:39
>>66
純粋仮想関数を最低一つ入れる

68 :デフォルトの名無しさん:2009/12/20(日) 12:48:52
コンストラクタをprivateにする

69 :66:2009/12/20(日) 13:37:49
>>67-68
> 純粋仮想関数を最低一つ入れる
> コンストラクタをprivateにする
両方必要そうなので、両方やります。
ありがとうございました。

70 :デフォルトの名無しさん:2009/12/20(日) 14:00:19
片方でいいよ
継承する気がないなら68だけにしろ
仮想関数入れるとサイズ無駄にでかくなるから
あとデストラクタもprivateにすることをお勧めする

71 :デフォルトの名無しさん:2009/12/20(日) 15:41:20
質問です
if ( 条件式 ){} というのがありますが、これって条件式は実際には実行されるのでしょうか?
たとえば、関数func()があるとします。
if ( func() != 0 ){}などにした場合、関数自体は実行されちゃうのでしょうか?

72 :デフォルトの名無しさん:2009/12/20(日) 15:43:18
そりゃされる

73 :デフォルトの名無しさん:2009/12/20(日) 15:50:05
>>72
ありがとうございます。

74 :デフォルトの名無しさん:2009/12/20(日) 15:57:28
疑問に思ったことは実際に試してみたほうがいいよ
見聞きしただけで覚えたつもりになるのは良くない

75 :デフォルトの名無しさん:2009/12/20(日) 15:58:55
あ、でも if (0 && func()) なんて条件式を使うと短絡評価が
働いてfunc()は実行されないからね

分かってると思うけど

76 :69:2009/12/21(月) 20:39:19
>>70
ありがとうございます。
継承するつもりはないのですが、
誰かが勝手に継承する可能性を考えてそれを封じる
必要がありました。
また、コンストラクタをprivateにするだけではnew演算子で生成される可能性もありました。
そのため、
> 純粋仮想関数を最低一つ入れる
> コンストラクタをprivateにする
> デストラクタもprivateに
この3つを全て適用しようかな、と思っておりました。
・・・現実的にはやり過ぎですかね。


77 :デフォルトの名無しさん:2009/12/21(月) 21:01:33
>>76
>誰かが勝手に継承する可能性を考えてそれを封じる
privateコンストラクタで封じれる

>コンストラクタをprivateにするだけではnew演算子で生成される可能性もありました
ありません

まあ、それでも無理矢理作る方法はあるが、それはどうやったって防げないから無駄
純粋仮想関数は何の意味もない
やめとけ

78 :77:2009/12/21(月) 21:39:20
>>77
>ありません
おっしゃるとおりです。
すみません。。
privateコンストラクタでまず十分の様です。
ありがとうございました。

79 :デフォルトの名無しさん:2009/12/21(月) 22:06:16
>>77
> それでも無理矢理作る方法はあるが
俺思いつかないんだけど、それってどうやるの?
(そのクラスのソースを直接改変するわけじゃないよね?)

80 :デフォルトの名無しさん:2009/12/21(月) 22:37:05
#define private public
#include"MyClass.h"

(MyClass*)malloc(sizeof(MyClass));

reinterpret_cast<MyClass*>(new char[sizeof(MyClass)]);

void MyClass::foo<Dummy>(){ x = new MyClass; }

f=dlsym(RTDL_DEFAULT, "_Z7MyClassXX...(MyClass::MyClassのマングル名)");
class MyClass2{
char a[sizeof(MyClass)];
MyClass2(){f(this);}
}

適当に思いついただけ
もちろんほとんどは規格違反か使える状況が限られてる

81 :デフォルトの名無しさん:2009/12/21(月) 23:08:00
>>80
おう!すげーな。
特に1つ目なんかもう。

サンクス。


82 :デフォルトの名無しさん:2009/12/21(月) 23:54:18
>>80
1つめと似たようなものがよくマ板の会社辞めようと思ったソーススレに貼ってあるようなw

83 :デフォルトの名無しさん:2009/12/22(火) 08:45:30
>>80
全然意味がわからん。解説してくれ

84 :デフォルトの名無しさん:2009/12/22(火) 10:12:24
一つ目って(MyClass*)malloc(sizeof(MyClass));の事だと思って「あー確かにnewあるのにC時代のアロケート関数は嫌だね」って思ってたら
#define private publicでふいたw

85 :デフォルトの名無しさん:2009/12/22(火) 10:46:15
未定義動作の解説なんて要らんよ。

86 :デフォルトの名無しさん:2009/12/22(火) 10:50:42
特定の処理系でならちゃんと動作を説明できるのに規約違反の何をもって未定義とするか。
規約違反したらどんな事でも鼻から精液出てくるとでも思ってるのかね。

87 :デフォルトの名無しさん:2009/12/22(火) 10:52:05
その処理系のスレですればいいだろ

88 :デフォルトの名無しさん:2009/12/22(火) 11:09:08
>>86
何をもって未定義とするかって、そりゃ、規格で未定義の動作と定められているものだろうよ。

89 :デフォルトの名無しさん:2009/12/22(火) 11:20:47
> void MyClass::foo<Dummy>(){ x = new MyClass; }

これってメンバ関数テンプレートがあった場合の話だよね?

自前のクラスにメンバ関数テンプレートを装備した場合、こんな感じで
private メンバを悪用する手段になっちゃうのはしょうがないのかな?

90 :デフォルトの名無しさん:2009/12/22(火) 14:03:02
悪意を持ってやってる奴は何やっても止められないから
その辺は割り切るしかない

91 :デフォルトの名無しさん:2009/12/22(火) 17:30:15
その通り

#define private public

なんてやられるともう何をやっても止められない

92 :デフォルトの名無しさん:2009/12/22(火) 17:47:34
なんでまたそれ書いたん?

93 :デフォルトの名無しさん:2009/12/22(火) 17:49:21
#define private public
こういうのもっと教えてくれw

94 :デフォルトの名無しさん:2009/12/22(火) 17:51:51
ゲッタセッタ教信者が発狂する様な一行だね

95 :デフォルトの名無しさん:2009/12/22(火) 17:54:19
#define class struct

96 :デフォルトの名無しさん:2009/12/22(火) 21:20:22
>>95
それ、アクセス指定子をちゃんと書いてれば意味ないような。

97 :デフォルトの名無しさん:2009/12/22(火) 21:22:10
アクセス指定子を書かないとエラーになるobject_typeとかを作るべき

98 :デフォルトの名無しさん:2009/12/22(火) 22:11:28
とりあえず予約語をマクロで置換するなんて、
未定義の動作も甚だしい。

>>86
> 特定の処理系でならちゃんと動作を説明できるのに
お前、まさかとは思うが
未定義の動作
って何か知らない・・・なんてことはないよな?
お前のレスを見ている限り、激しい無知っぷり以外伝わってこないんだが。


99 :デフォルトの名無しさん:2009/12/22(火) 22:24:25
>>94
> ゲッタセッタ教信者が発狂する様な一行だね
ゲッタセッタ狂信者もantiゲッタセッタ信者も、
どっちにもたたかれる一行だなw

100 :デフォルトの名無しさん:2009/12/22(火) 22:54:51
getsetの話なんだけどこういう書き方ってあまり見ないけど嫌われてるの?
get〜set〜を排除できると書いてて結構気持ちイイと思うんだけど

class Widget
{
private:
    class Member
    {
    public:
        Member &operator = (int value)
        {
            value_ = value;
            return *this;
        }
        operator int (void) const
        {
            return value_;
        }
    private:
        int value_;
    };
public:
    Member member;
};

int main(void)
{
    Widget widget;
    std::cout << (widget.member = 100) << std::endl;
    return 0;
}

101 :デフォルトの名無しさん:2009/12/22(火) 23:59:07
>>100
get、setを排除するのは、クラスの外からクラスの中身を見えなくする隠蔽が目的なんだね。get、setを使わなければいいというものではない。
クラスを隠蔽して外から見た挙動が適切なら、クラスの中はどんなにスパゲッティでも問題ない。


102 :デフォルトの名無しさん:2009/12/23(水) 01:12:18
使う方は問題ないだろうが、メンテするときのことも考えたほうがいい

103 :デフォルトの名無しさん:2009/12/23(水) 02:34:50
ヘッダの先頭に
#undef private
をつけたらエラーの山・・・・・・

104 :デフォルトの名無しさん:2009/12/23(水) 08:19:39
>>103
なんつー職場だwww

105 :デフォルトの名無しさん:2009/12/23(水) 11:35:35
ヘッダの頭にこれ書いて自衛するしかないな…

#if defined(private) || defined(protected) || defined(class)
#error やめろ馬鹿
#endif

106 :デフォルトの名無しさん:2009/12/23(水) 11:47:38
#undef private
#undef protected
#undef class
#if defined(private) || defined(protected) || defined(class)
#error やめろ馬鹿
#endif
#define private public
#define protected public
#define class struct

107 :デフォルトの名無しさん:2009/12/23(水) 12:03:38
>>106
ワロスw

108 :デフォルトの名無しさん:2009/12/23(水) 12:51:02
#define explicit

なんてこったい

109 :デフォルトの名無しさん:2009/12/23(水) 12:55:07
#define const


110 :デフォルトの名無しさん:2009/12/23(水) 13:10:21
>>109
それだとコンパイルエラーが出ることがあるだろう。
だから
const_cast<T>()
static_cast<T>()
あたりを全部自作テンプレートになおして
T()
これでかんぺき

111 :デフォルトの名無しさん:2009/12/23(水) 14:32:43
テンプレート引数の型にclassを使うようにしたのは
#define class structを防止するためだったのか。
privateとかも他に何かの役割を持たせればよかったのに。

112 :デフォルトの名無しさん:2009/12/23(水) 14:45:29
#define private private
class Hoge
{
private:
Fuga fuga;
};
#undef private

これでおk

113 :デフォルトの名無しさん:2009/12/23(水) 14:59:24
すいません毎度の事ながら質問させていただきます
int いんと
char ちゃー ←読み方これでいいですか?それとも文字の意味でキャラですか?

114 :デフォルトの名無しさん:2009/12/23(水) 14:59:56
>>113
シャア

115 :デフォルトの名無しさん:2009/12/23(水) 15:03:52
>>113
ちゃーでもきゃらでも好きな呼び方でい
ただししーえっちえーあーるだけはナシな

116 :デフォルトの名無しさん:2009/12/23(水) 15:07:47
>>114
(^^;)

>>115
ありがとうございます。ちゃーの方がすきなのでちゃーにします

117 :デフォルトの名無しさん:2009/12/23(水) 15:20:09
ちゃーで合ってるよ

118 :デフォルトの名無しさん:2009/12/23(水) 15:20:40
チャー派
キャラ派
チャル派
シャア派

char c;
ちゃーしー
きゃらしー
ちゃるしー
しゃあしー

読みやすいものでいいぞ。

119 :デフォルトの名無しさん:2009/12/23(水) 15:23:11
文字型

120 :デフォルトの名無しさん:2009/12/23(水) 15:33:07
符号付1バイト整数型

121 :デフォルトの名無しさん:2009/12/23(水) 15:52:14
wchar_tは「わいちゃらっと」?

122 :デフォルトの名無しさん:2009/12/23(水) 15:58:17
文字型って呼べよバカどもw

123 :デフォルトの名無しさん:2009/12/23(水) 16:00:05
>>121
うきゃーっ

124 :デフォルトの名無しさん:2009/12/23(水) 16:03:59
>>121
俺は「ワロスチャート」と読んでる

125 :デフォルトの名無しさん:2009/12/23(水) 16:06:53
ワイド(文字)型

126 :デフォルトの名無しさん:2009/12/23(水) 16:11:21
>>113-125
マ板でやってくれ。
【char】変な読み方するな その3【ちゃー】
http://pc11.2ch.net/test/read.cgi/prog/1242268027/

127 :デフォルトの名無しさん:2009/12/23(水) 17:18:44
そのスレなんでマ板にあるんだろ
ム板向きの内容だろうに

128 :デフォルトの名無しさん:2009/12/23(水) 17:20:57
>>100
行く行くは可変引数テンプレートと多重継承使ってウンコテクニック披露する輩が出てきそうな志向だな

129 :デフォルトの名無しさん:2009/12/23(水) 17:24:10
結局のところ馴れ合いに終始することになるので

130 :デフォルトの名無しさん:2009/12/23(水) 17:40:26
>>100
n1615とか

131 :デフォルトの名無しさん:2009/12/23(水) 17:47:37
TCHARは両型でいいよ面倒くさいから

132 :デフォルトの名無しさん:2009/12/23(水) 23:16:10
メモリリークのチェックをしたい場合、グローバルのoperator newとoperator deleteでカウントすれば十分ですかね?

133 :デフォルトの名無しさん:2009/12/23(水) 23:22:55
つ purify

134 :デフォルトの名無しさん:2009/12/24(木) 01:36:58
>128
Boost.Property がこの方向だと思う。Boost ってついてるけど Boost 公式じゃない。

135 :デフォルトの名無しさん:2009/12/24(木) 06:20:08
禿様が個人的に推奨してるのは
CamelCase
camel_case
camelCase
のどれだっけ?


136 :デフォルトの名無しさん:2009/12/24(木) 06:34:01
その中にキャメルケーシングなものは1つしかないのではないかと

137 :デフォルトの名無しさん:2009/12/24(木) 06:35:44
下半身全裸になって用をたすとか
好きにしろよ他人に強要するなな感じのテクニック? >>128

138 :135:2009/12/24(木) 11:13:10
>136
その程度の枝葉末節は知った上でめんどくさいからCamelCaseで書いたに決まってんじゃん。

そんなに気になるなら
BjarneStroustrup
bjarne_stroustrup
bjarneStroustrup
これで。

139 :デフォルトの名無しさん:2009/12/24(木) 11:56:41
>>135,138 http://www2.research.att.com/~bs/bs_faq2.html#Hungarian

140 :デフォルトの名無しさん:2009/12/24(木) 14:06:45
VC++使ってるんですが、メインとは別に自分が思いついたことがあってるか実験的に確かめるために短いテストコードみたいなの書くときありますよね?
それをコンパイルしようとするとプロジェクトのメインで書いておいたものがコンパイルされてしまい、わざわざ別のプロジェクトだして、コンパイルするんですがめんどくさくてなりません。
同じプロジェクト内に別のcpp作ってテスト的にそれだけコンパイルする方法ってないですか?

141 :デフォルトの名無しさん:2009/12/24(木) 14:12:03
諦めろ

142 :デフォルトの名無しさん:2009/12/24(木) 14:13:26
出来る。可能だよ。方法は自分で探せ

143 :デフォルトの名無しさん:2009/12/24(木) 14:13:40
「ソリューション」 (.NET 以前なら「ワークスペース」) の中には
複数のプロジェクトを追加できるわけで。

144 :デフォルトの名無しさん:2009/12/24(木) 14:27:33
>>140
main.cppに書けばいいんじゃ?

145 :デフォルトの名無しさん:2009/12/24(木) 16:51:12
実験ロジックを書くためのメソッドを用意しておき、メインから呼ぶようにしておく
実験したくなったらメソッドにかく

146 :デフォルトの名無しさん:2009/12/24(木) 17:14:02
というかそもそもスレ違い…とまでは行かないがもっと適切なスレがあるのではないか?


147 :デフォルトの名無しさん:2009/12/24(木) 20:51:22
using namespace std;と書くと名前が衝突するので、
あまり良くないと言いますが何故ですか?
だって、標準のライブラリー群だから、そこら辺を考えて設計してるでしょ(知らないけど)

148 :デフォルトの名無しさん:2009/12/24(木) 20:52:22
名前が衝突するのを考えて作られてるんだからstd空間に入ってるんだが
嫌ならローカルスコープで名前エイリアス作れば良いよ

149 :デフォルトの名無しさん:2009/12/24(木) 20:55:16
>>139
ありがとう。
> I prefer to use underscores to separate words in an identifier (e.g, element_count)
> rather than alternatives, such as elementCount and ElementCount.
> Never use names with all capital letter (e.g., BEGIN_TRANSACTION)
> because that's conventionally reserved for macros. Even if you don't use macros,
> someone might have littered your header files with them. Use an initial capital letter
> for types (e.g., Square and Graph). The C++ language and standard library don't use
> capital letters, so it's int rather than Int and string rather than String.
> That way, you can recognize the standard types.
これだこれ。

150 :デフォルトの名無しさん:2009/12/24(木) 20:59:38
把握力の無い低能が出典見つけて騒喜してるだけ
SVNにも載せてない様な.cppにusingして文句言われる筋合いは無い

と書くとファビョり始めるかな

151 :デフォルトの名無しさん:2009/12/24(木) 21:00:30
Cとの互換などから今後も、グローバル名前空間に
標準や準標準の関数などが増えてゆくからだったと思う。
まあ、言語設計上のミスだよねこれ。

152 :デフォルトの名無しさん:2009/12/24(木) 21:00:47
>>147
> そこら辺を考えて設計してるでしょ(知らないけど)
はい?何を言っているのだ?
ライブラリーとかいう言い回しからしても余り詳しくないっぽいな。

using namespace std;
swap(MyClass());

using std::swap;
swap(MyClass());
の違いが分からないレベルなら
using namespace std;など使うな。


153 :デフォルトの名無しさん:2009/12/24(木) 21:04:34
>>152
名前空間に対するusingの話をしているのに何いきなりusing std::swap;とか引き合いに出しちゃってるの?w
文脈が分からないレベルなら日本語を勉強しましょうねw

154 :デフォルトの名無しさん:2009/12/24(木) 21:06:25
namespace std {
  using ::swap;
}

155 :デフォルトの名無しさん:2009/12/24(木) 21:09:34
>>152
普通に考えて質問者は、わからなくて質問してるんだから
ムキにならなくてもいいと思うよ

156 :デフォルトの名無しさん:2009/12/24(木) 21:11:37
>>152
詳しくないって分かるなら教えてあげれば良いのに人の揚げ足取ってばかりで現実でも人望なさそう。

157 :デフォルトの名無しさん:2009/12/24(木) 21:12:12
152の人気に嫉妬

158 :デフォルトの名無しさん:2009/12/24(木) 21:18:52
>>151
ということはグローバル空間そのものを否定するか?
初心者が書くコードにいきなりクラスメソッドが出てくるアレなら設計ミスがなかったとでも?

159 :デフォルトの名無しさん:2009/12/24(木) 21:41:42
>>152の盛大な釣り
                         / ヽ
             >>152          ,/    ヽ
             . ∧_∧   ,/       ヽ
               ( ´∀`) ,/          ヽ
             (    つ@            ヽ
 .__          | | |                ヽ
 |――|        (__)_)                ヽ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|                 ヽ
/⌒\/⌒\/⌒\/⌒\|彡~゚ ゜~ ~。゜ ~ ~ ~ ~~ ~ ~~ ~ ~~ ~~ ~~
⌒\/⌒\/⌒\/⌒\/⌒\彡 〜 〜〜 〜〜 〜〜 〜 〜
                                     │
                                     │
                                     │
                  人人人人人人人       ∧J∧
                 <           >     ( / ⌒ヽ
                 < 吊られちゃった >      | |   | >>○
                 <           >      ∪ / ノ
                  ∨∨∨∨∨∨∨        | ||
                                    ∪∪ >>153


160 :147:2009/12/24(木) 21:52:51
えぇ〜と、結局>>148,>>151あたりの話を信じておk?

161 :デフォルトの名無しさん:2009/12/24(木) 22:01:03
>>160
おk。
>>152も、
> > そこら辺を考えて設計してるでしょ(知らないけど)
> はい?何を言っているのだ?
このやりとりを
> > そこら辺を考えて設計してるでしょ(知らないけど)
> いいえ、名前が衝突することは標準のstd名前空間といえども
> 特別な対応策がなされているわけではありません。
と解釈するなら信じておk。


162 :147:2009/12/24(木) 22:09:41
>>161
お〜おぉ、助かりました
ありがとうございます

163 :デフォルトの名無しさん:2009/12/24(木) 22:56:52
>>159
このAA初めて見たわ

164 :デフォルトの名無しさん:2009/12/24(木) 23:53:14
>>156、次は頑張れw

165 :デフォルトの名無しさん:2009/12/24(木) 23:56:40
あるクラスの実装を隠蔽してインターフェースだけを提供したいです
返り値などの一時オブジェクトの場合にそれを実現する方法はありますか?
感覚的には↓のようなことがしたいです

http://codepad.org/dhFsqyT1

スマポを使えば可能なんですが、動的確保はコストが気になるので避けたいです

166 :デフォルトの名無しさん:2009/12/25(金) 00:27:58
>>165
本当に動的確保のコストが問題になるレベルなのか検討してみるのもいいかもね。




167 :デフォルトの名無しさん:2009/12/25(金) 00:44:55
戻り値で返そうとするなら、GetFinalWidgetを受け取る側がLocalWidgetの大きさを知らないといけない。
逆にそれを隠蔽しようというのだから、どうやっても動的確保するしかないと思う。

168 :デフォルトの名無しさん:2009/12/25(金) 11:49:00
C は GNU Core Utilities
JavaScript は jquery.js や prototype.js などのライブラリ

などを言語学習には読んでトレースして改造すると
自分にとってすんなり覚えられたのですが、
C++ の場合はどういうものが挙げられますでしょうか?教えやがってください。

169 :デフォルトの名無しさん:2009/12/25(金) 12:08:52
暗黙的の型変換をする場合にstatic_castがありますが、本当に使っていますか?
dynamic_castとかは便利そうなので、使っている人が多そうですけど

170 :デフォルトの名無しさん:2009/12/25(金) 12:14:59
double -> int とかの型変換用だっけ?

171 :デフォルトの名無しさん:2009/12/25(金) 12:16:39
キャストってのは弱虫のマンモーニが使うもの
使わなくても良いように設計できるならそうする
APIやライブラリのせいで使わなくてはいけない状況なら使うが
使わなければいけないように設計することは避けたい

172 :デフォルトの名無しさん:2009/12/25(金) 12:59:12
>>168
Boost

173 :デフォルトの名無しさん:2009/12/25(金) 13:13:23
ドリームキャスト

174 :デフォルトの名無しさん:2009/12/25(金) 13:25:36
>>169
インスタンスの本来の型が分かっている場合のダウンキャストとか

175 :デフォルトの名無しさん:2009/12/25(金) 13:29:06
reinterpret_cast 最強〜!

176 :デフォルトの名無しさん:2009/12/25(金) 16:07:46
bregonig.dllってperlの正規表現ができるってあったのですが、つまりはc++でperlを取り入れることができるって意味でいいのでしょうか?

177 :デフォルトの名無しさん:2009/12/25(金) 16:46:20
+とか(?=とかのパターン指定がPerlと互換だというだけのこと。

178 :デフォルトの名無しさん:2009/12/25(金) 16:56:59
そうなのですか>>177さんありがとう
Perlの埋め込みはまた別なのですね

179 :デフォルトの名無しさん:2009/12/25(金) 18:06:09
>>175
多重継承したクラスを扱うときは気を付けろよ

180 :デフォルトの名無しさん:2009/12/25(金) 18:31:40
c++でヌル文字が途中で入ってる配列の途中からファイルをコピーしたいでござる
どうすればいいでやんす?

181 :デフォルトの名無しさん:2009/12/25(金) 18:33:21
照れんなよ

182 :デフォルトの名無しさん:2009/12/25(金) 18:37:22
std::ios::binary

183 :デフォルトの名無しさん:2009/12/25(金) 18:55:16
>>182
サンキューでござる
くわしくしらべてみるでおじゃるまる

184 :デフォルトの名無しさん:2009/12/25(金) 20:53:27
>>169
dynamic_castよりstatic_castを使う。
理由はstatic_castの方がが速いから。

185 :デフォルトの名無しさん:2009/12/25(金) 20:55:02
馬鹿か。
コンパイルタイムにキャストを解決できる時にstatic_castを、動的型付けなオブジェクトに対するキャストではdynamic_castだろうが。

186 :デフォルトの名無しさん:2009/12/25(金) 21:11:13
>>169
dynamic_castなんて使ってないよ。
大して便利じゃないというか使わなきゃならない状況にならない。
static_castと比較するもなにも、そもそも用途がぜーんぜん違う。



187 :デフォルトの名無しさん:2009/12/25(金) 21:44:15
httpのメッセージボディのgzipをデコードするにはどうしたらいいですか?

188 :デフォルトの名無しさん:2009/12/25(金) 23:20:05
気合いでデコードしましょう。

189 :デフォルトの名無しさん:2009/12/26(土) 00:39:49
>>184
そういうときはboost::polymorphic_downcastがおすすめ。

>>187
zlibでも使え。

190 :デフォルトの名無しさん:2009/12/26(土) 08:35:51
template<typename To, typename From>
inline To dream_cast(const From &from) { return (To)from; }

191 :デフォルトの名無しさん:2009/12/26(土) 09:14:55
zlibってインタフェースがわかりにくくね?
わかっちゃうと効率的ですげーなと思うけど

192 :デフォルトの名無しさん:2009/12/26(土) 11:22:22
>>189
ありがとう。これでやってみます

193 :デフォルトの名無しさん:2009/12/26(土) 11:49:56
質問があります。

動的に確保した配列にdelete[]を実行すると、しっかりと配列は解放されますよね?
メモリのどこかに配列の長さが格納されていると踏んだのですが…

一体どこに格納されているのでしょうか?
それとも格納はされていないのですか?

194 :デフォルトの名無しさん:2009/12/26(土) 11:57:48
格納されていますが、それがどこにどのように格納されているかは規定されていませんのでわかりません

195 :193:2009/12/26(土) 12:00:02
VC+Win32 あたりでお願いします

196 :デフォルトの名無しさん:2009/12/26(土) 12:40:03
>>193
型によっては必要ないので、どこにも格納されてないこともある。
格納されていたとしても、ユーザーがそれを取り出す手段はない。

配列 new/delete なんか使わずに std::vector 使うのがおすすめ。
要素数もちゃんとある。

197 :デフォルトの名無しさん:2009/12/26(土) 12:47:39
>>193
まず、
クラスのカプセル化という概念を知っているか?
インターフェースだけ理解させてそのクラスの内部の実装は
ブラックボックスにして触れなくて良いようにし、
また触れることを禁じていること。

> メモリのどこかに配列の長さが格納されていると踏んだのですが…
君と同じ発想でコンパイラの作者が作っていればそうなる。
だが上述のクラスのカプセル化と似たように、
どこに長さが格納されて居るだとかそう言った実装については
触れないし触れてはならないことなのだ。



198 :デフォルトの名無しさん:2009/12/26(土) 13:06:05
vectorって初期化が大変だよな・・・

早くC++0xこないかな

199 :デフォルトの名無しさん:2009/12/26(土) 13:13:35
>>198
それでも配列 new よりはマシだろ。

200 :デフォルトの名無しさん:2009/12/26(土) 13:18:11
vectorの値コピーのコストってどれくらい?

201 :デフォルトの名無しさん:2009/12/26(土) 13:23:44
>>200 O(size)

202 :デフォルトの名無しさん:2009/12/26(土) 14:03:45
vectorは大量の要素を持った時、アクセスの実行速度が気になる

203 :デフォルトの名無しさん:2009/12/26(土) 14:52:47
>>202 アクセスは O(1) だから、それは勘違い。

204 :デフォルトの名無しさん:2009/12/26(土) 14:57:14
>>187
libcurlお勧め

205 :デフォルトの名無しさん:2009/12/26(土) 14:58:12
>>202
気になるならドキュメント読めよw

206 :デフォルトの名無しさん:2009/12/26(土) 15:04:26
普通のO(1)じゃないだろ
たまに猛烈に時間がかかるけどたまにだから平均したらO(1)っていうやつ

207 :デフォルトの名無しさん:2009/12/26(土) 15:05:23
>>206
それは末尾追加( push_back() )の計算時間な。
アクセスはランダムアクセス可能で O(1) だよ。

208 :デフォルトの名無しさん:2009/12/26(土) 15:10:03
>>206
ドキュメントを読んで!ライフが0よ。

209 :デフォルトの名無しさん:2009/12/26(土) 15:16:48
もうソース読めよw

210 :デフォルトの名無しさん:2009/12/26(土) 15:17:50
stlのmapにpush_backしていくと自動的にサイズが増えていくとのことですが、
処理速度向上のため初期サイズを予め決めておくことはできますでしょうか。

211 :デフォルトの名無しさん:2009/12/26(土) 15:18:55
boost::fast_pool_alloc

212 :デフォルトの名無しさん:2009/12/26(土) 15:19:15
あれー?
どっかに「このドキュメントでは計算量と言えば全部amortizedのことですよー」って書いてなかったっけ

213 :デフォルトの名無しさん:2009/12/26(土) 15:29:05
>>210
std::map に push_back() はありません。 insert() のことでしょうか?

メモリ確保のために必要な時間が(ほんとうに)問題だということなら、
operator new (およびその下層)の置き換えやカスタム Allocator の指定が
使えるかもしれません。

214 :デフォルトの名無しさん:2009/12/26(土) 15:30:25
>>212
そのドキュメントにそう書いてあったとしても、標準規格に書いてないなら関係ないね。

215 :デフォルトの名無しさん:2009/12/26(土) 15:30:45
>>213
すいませんinsertの間違いでした。
vectorのreserveに相当する関数はないのでしょうか。

216 :デフォルトの名無しさん:2009/12/26(土) 15:31:47
>>215
無いよ。必要無いだろうし。

217 :デフォルトの名無しさん:2009/12/26(土) 19:30:09
qt4を使いたいが為にC++の勉強を始めたわけですが、qtにはQ_OBJECTってマクロがあるそうです
マクロって奴はパラーメタ必須ってイメージがありますが、そういうわけじゃないんですかね?
そして、マクロから普通のコードを読み込めましたよね?

218 :デフォルトの名無しさん:2009/12/26(土) 19:33:42
日本語でおk

219 :デフォルトの名無しさん:2009/12/26(土) 19:45:39
>>217

> マクロって奴はパラーメタ必須ってイメージがありますが
そんなイメージねぇよww
パラーメタ・・・は まあ おいとく として、どこの言語から来た人?
C系列じゃないよね?

> そして、マクロから普通のコードを読み込めましたよね?
このスレにエスパーはいらっしゃいませんか?


220 :デフォルトの名無しさん:2009/12/26(土) 19:46:54
呼んだ?

221 :デフォルトの名無しさん:2009/12/26(土) 19:48:31
1行目だけ意味がわかる。

222 :デフォルトの名無しさん:2009/12/26(土) 19:49:09
>>220
もうこれ以上スプーン曲げないでくれ。
分かったら帰ってくれ。

223 :デフォルトの名無しさん:2009/12/26(土) 19:52:54
>>221
残念だがそれは普通の能力だ

224 :217:2009/12/26(土) 19:55:30
>>219
javaから来た人間です
C言語はあんまりわかりません

>マクロから普通のコードを読み込めましたよね?
IOCCCの作品に1文字しか書いていないプログラムがあったような〜

225 :デフォルトの名無しさん:2009/12/26(土) 20:06:09
マクロから読み込む、という表現がそもそも意味不明なんですよ。
唯一わかるのは、マクロについて根本的な何かを勘違いしているんだろうな、ということで。

226 :デフォルトの名無しさん:2009/12/26(土) 20:12:22
ひょっとして#includeのことではないか?

だとしても意味はわからない

227 :デフォルトの名無しさん:2009/12/26(土) 20:17:56
std::coutはストリームなんですよね
std::cout << "hoge";
みたいに、ストリームをフラッシュしないで終了しているコードがあるわけですが
大丈夫なんですかね?

228 :デフォルトの名無しさん:2009/12/26(土) 20:19:08
>>226
うん。
彼の言うマクロが#includeだとすると、確かに3行目は成立するが、
今度は1行目と2行目がつながらなくなる。

頼む、もうちょっと日本語でおk

229 :デフォルトの名無しさん:2009/12/26(土) 20:21:10
マクロは俺の認識だと「文字列をあるルールに従って置換する」なんだけど、あってる?
マクロアセンブラなんかだと簡単な計算もできるのが多いけど、
Cプリプロセッサはそこまでじゃないよね。

230 :デフォルトの名無しさん:2009/12/26(土) 20:31:07
>>227
大丈夫だよ。
でも気持ち悪いよね。


231 :デフォルトの名無しさん:2009/12/26(土) 20:32:49
>>229
> マクロアセンブラなんかだと簡単な計算もできるのが多いけど、
> Cプリプロセッサはそこまでじゃないよね。
何十年前の話をしているのだい?
そもそもプリプロセス処理というものは…(ryめんどくさ


232 :227:2009/12/26(土) 20:35:47
>>230
ありがとうございます

233 :デフォルトの名無しさん:2009/12/26(土) 20:37:02
>>227
プログラム終了時に閉じられるから問題ない。

234 :デフォルトの名無しさん:2009/12/26(土) 20:42:21
>>229
「文字列をあるルールに従って置換する」だけのプリプロセッサで、
簡単な計算もできるようにしてしまうクレイジーなやつが世の中いるものだ。
http://d.hatena.ne.jp/qnighy/20091107/1257587259
http://d.hatena.ne.jp/DigitalGhost/20090624/1245829833

235 :デフォルトの名無しさん:2009/12/26(土) 20:45:12
Boost.Preprocessor はもう天才的。
プリプロセッサメタプログラミングだぜ?
本当にやりやがった・・・的な衝撃が走る。

236 :デフォルトの名無しさん:2009/12/26(土) 20:46:17
楽になると人間堕落が進むのさ
学習しなくなるから使わないほうがいいよ

237 :デフォルトの名無しさん:2009/12/26(土) 20:50:23
>>236
それは違うな
使わなければ学習していくとは限らない

むしろ、使わない方法で満足する場合、それ以上の学習をしなくなる可能性もある。
つまり楽になることと学習しなくなることに強い因果関係はない

238 :デフォルトの名無しさん:2009/12/26(土) 20:53:06
そんなようなことを言ってバカにされたのが前スレに居たな。

239 :238:2009/12/26(土) 20:53:52
おっとごめん。 >238 は >>236 宛てね。

240 :デフォルトの名無しさん:2009/12/26(土) 20:57:13
>>236
君は全部アセンブラでコードを書くのですか?


241 :デフォルトの名無しさん:2009/12/27(日) 11:41:58
virtualがついたメンバ関数は、抽象メソッドではないのですか?
virtualがついたメンバも実装をしている場合があるので

242 :デフォルトの名無しさん:2009/12/27(日) 11:44:17
>>241
virtual がついていればオーバーライド可能になります。
virtual に加えて = 0 がついていれば、オーバーライドが必須(抽象メソッド?)になります。

243 :デフォルトの名無しさん:2009/12/27(日) 11:52:40
>>241
抽象メソッドという用語が存在しないので、
君が「抽象メソッド」という言葉にどういった意味を
求めているのか分からん。

> virtualがついたメンバも実装をしている場合があるので
初心者にはロベールのC++教室がオススメ。
例えば
 ロベールのC++教室 - 第14章 仮想関数 -
 ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02014.html
とか。


244 :243:2009/12/27(日) 11:53:57
>>242
> virtual がついていればオーバーライド可能になります。
(まあ初心者向けに教えるならそれでも良いかもしれないが)
別にvirtual付いて無くても、オーバーライド可能か不可能かと言えば
一応可能だよな。デザインとして良いかどうかはともかく。


245 :デフォルトの名無しさん:2009/12/27(日) 11:54:30
抽象メソッドは
abstract methodだろ?

246 :デフォルトの名無しさん:2009/12/27(日) 11:57:55
純粋仮想関数のことか

247 :241:2009/12/27(日) 12:02:19
>>243
ひとまず、読んでみます
ありがとうございました

248 :デフォルトの名無しさん:2009/12/27(日) 12:05:41
>>244
どうやってやるの?

249 :デフォルトの名無しさん:2009/12/27(日) 12:08:29
>>244はメソッドの隠蔽と勘違いしてるんじゃないだろうか。

250 :243:2009/12/27(日) 12:28:07
>>248
親クラスのメンバ関数をオーバーライドする・・・って話だよな?
どうやってもなにも、普通にできるじゃん。
(俺の > オーバーライド可能か不可能かと言えば一応可能)

ただし親クラスのポインタから呼び出したときに
子クラスのメンバ関数は呼び出されないが。
(俺の> デザインとして良いかどうかはともかく。)

>>249
していないよ。



251 :デフォルトの名無しさん:2009/12/27(日) 12:31:26
>>249
「override」って言葉の意味分からないなら語るな。

252 :デフォルトの名無しさん:2009/12/27(日) 12:32:50
>>250
>ただし親クラスのポインタから呼び出したときに
>子クラスのメンバ関数は呼び出されないが。
それってオーバーライドしてないじゃん

253 :デフォルトの名無しさん:2009/12/27(日) 12:36:10
>>250
君はオーバーライドを知っているのか?
C++ のオーバーライドをわかっているか?

10.3 Virtual functions p2 より
> If a virtual member function vf is declared in a class Base and in a
> class Derived, derived directly or indirectly from Base, a member
> function vf with the same name and same parameter list as Base::vf is
> declared, then Derived::vf is also virtual (whether or not it is so
> declared) and it overrides Base::vf.

254 :デフォルトの名無しさん:2009/12/27(日) 12:50:23
なにか話がかみ合ってないな

255 :デフォルトの名無しさん:2009/12/27(日) 12:53:11
ポリモーフィズムとオーバーライドがごっちゃになってるんじゃないかな?
だから仮想関数の話が出てくるんだと思う。

256 :デフォルトの名無しさん:2009/12/27(日) 12:57:17
基底クラスと派生クラスに同名のメンバ関数が存在することがオーバーライド
それ以上の意味はない

257 :デフォルトの名無しさん:2009/12/27(日) 12:59:30
>>256
同じシグネチャのメンバー関数
とした方がいいかな。

特にコンストラクタのオーバーロード(引数が違う)があるとややこしいので。


258 :デフォルトの名無しさん:2009/12/27(日) 12:59:33
>>253の英文は
class Foo { public: virtual void A() ...
class Bar : public Foo { public: void A() ... (1)
class Bar : class Foo { public: virtual void A() ... (2)
Fooを継承するときにAが仮想関数だったら(1)も(2)も同じoverrideとあるな。
Foo::Aのvirtualを外したらやっぱり隠蔽だろ。

259 :デフォルトの名無しさん:2009/12/27(日) 13:00:40
>class Bar : class Foo { public: virtual void A() ... (2) 
class Bar : public Foo { public: virtual void A() ... (2) 
のtypo

260 :デフォルトの名無しさん:2009/12/27(日) 13:02:04
>>258
違いますよ。
それは「override」って言葉の定義、
特に十分条件を説明をするための例じゃない。
どういう時にvirtualなのかって例。
子クラスでvirtual宣言せんでもいいよって話。


261 :デフォルトの名無しさん:2009/12/27(日) 13:03:17
>>256 >253
>>257 コンストラクタもオーバーロードも関係ないし。

262 :デフォルトの名無しさん:2009/12/27(日) 13:08:54
>>260
>子クラスでvirtual宣言せんでもいいよって話。 
おれもそう解釈してて、
>>253の引用は的外れだといいたいのだが。

議論してるのはC++でのoiverrideの意味や用い方についてだよな?

263 :デフォルトの名無しさん:2009/12/27(日) 13:10:52
>>260
何を根拠にそんなこと言ってんの?

>>253 の引用箇所の最後にある "overrides" は PDF ではイタリック体で表記されている。
これは用語の定義を示す。
1.3 Definitions p2 より
> Terms that are used only in a small portion of this International
> Standard are defined where they are used and italicized where they are
> defined.

264 :デフォルトの名無しさん:2009/12/27(日) 13:12:56
ちなみに、「子クラスでvirtual宣言せんでもいいよって話」は "overrides" に添えられた
注釈で記載してある。

265 :243:2009/12/27(日) 13:21:39
昼飯 食い終わって見てみたら
なんだかすごい沢山レスが付いててびびった。

そして全ては私の誤りでございました。

さーせん。

ISO IEC 14882:2003
によれば
> struct B {
> virtual void f(int);
> virtual void f(char);
> void g(int);
> void h(int);
> };
> struct D : B {
> using B::f;
> void f(int); // OK: D::f(int) overrides B::f(int);
> using B::g;
> void g(char); // OK
> using B::h;
> void h(int); // OK: D::h(int) hides B::h(int)
> };

まじさーせん。

266 :デフォルトの名無しさん:2009/12/27(日) 13:25:12
C++っていいよな。
こういう議論がちゃんと(仕様書にあるように)決着付くんだもん。
2chではある意味貴重とも言える。


267 :266:2009/12/27(日) 13:26:09
× 仕様書にあるように
○ 仕様書がルールブックとして機能するため

268 :デフォルトの名無しさん:2009/12/27(日) 13:33:55
× 仕様書
○ 規格

269 :デフォルトの名無しさん:2009/12/27(日) 13:50:22
× 仕様書がルールブックとして機能するため
○ 仕様書なんかクソくらえ

270 :デフォルトの名無しさん:2009/12/27(日) 13:57:02
ちなみに
「標準C++(ISO C++)の規格」
って英語で何て言うの?


271 :デフォルトの名無しさん:2009/12/27(日) 13:59:39
Standard C++

272 :デフォルトの名無しさん:2009/12/27(日) 14:00:52
>>266
C++ではCでえらく話がループしまくったmalloc/freeについては
どう定義されてるのかな

new/deleteも同じ問題だと思うけど

273 :デフォルトの名無しさん:2009/12/27(日) 14:02:18
>>270
「標準」も「規格」も "Standard" だから、日本語でも「標準C++(ISO C++)の規格」なんて言わない。

274 :デフォルトの名無しさん:2009/12/27(日) 14:03:55
>>272 >>2

275 :デフォルトの名無しさん:2009/12/27(日) 14:16:02
>>274
そういう安価は馬鹿でも付ける事ができる
ここで聞いてんだから何か言えよ

276 :デフォルトの名無しさん:2009/12/27(日) 14:19:13
その論争の概略なり、該当スレとその範囲のリンク張るなりしないと。
手を抜きすぎるからいろいろ食い違う

277 :270:2009/12/27(日) 14:24:34
C++の標準規格のことを
標準C++
と呼ぶってわけね。


278 :デフォルトの名無しさん:2009/12/27(日) 14:45:47
>>243涙目敗走と。

279 :>>243 >>265:2009/12/27(日) 14:48:26
>>278
うむ。

今回は本当に全面的に俺の誤りであった。

2010年はもっと腰を低くします。


280 :デフォルトの名無しさん:2009/12/27(日) 15:03:16
>>277
「標準規格」だと standard standard になるから、どっちかひとつでいい。

281 :270:2009/12/27(日) 15:14:47
>>280
ややこしや。
ありがとうございます。


282 :デフォルトの名無しさん:2009/12/27(日) 15:23:40
日本語での規格はconfigurationの意味合いだから標準規格でも別にいいと思うけど
英語ではわざわざ言わないってだけで

283 :デフォルトの名無しさん:2009/12/27(日) 15:31:54
specificationって言いたいのか?
規格化=standardizationだぞ。
規則の「規」に定格の「格」

stardard specificationで標準仕様。
日本語も英語も形容だけ取って、
標準、規格、stardardということがあるし、
用法が定着しているから、
この短い表現も辞書に載ってる。

284 :デフォルトの名無しさん:2009/12/27(日) 16:16:27
だから「標準」と「規格」は日本語で意味違うだろ
「標準外規格」っていう言葉もあるんだし
どっちも英語でstandardだから日本語でも同じ意味であるべきというのは横暴

285 :デフォルトの名無しさん:2009/12/27(日) 16:37:14
規格がconfigurationの意味ってのは全然違う

286 :デフォルトの名無しさん:2009/12/27(日) 17:02:52
あっそ

287 :デフォルトの名無しさん:2009/12/27(日) 17:28:22
>>284
> 「標準外規格」っていう言葉もあるんだし
ほぅ。

http://www.google.co.jp/search?q=%22%E6%A8%99%E6%BA%96%E5%A4%96%E8%A6%8F%E6%A0%BC%22&start=10&sa=N
> "標準外規格"の検索結果 19 件中 11 - 19 件目
> 最も的確な結果を表示するために、上の19件と似たページは除外されています。

「標準外・規格外」と併記されている場合の検索結果が混ざっても、この程度。
「規格外」と言えば済むところを変にかぶせてるのがほとんど。

288 :デフォルトの名無しさん:2009/12/27(日) 18:18:12
標準規格
standard of measure

289 :デフォルトの名無しさん:2009/12/27(日) 22:58:49
>>287
「標準的でない規格」と「規格に従ってないもの」は違うだろ
HD-DVDとCCCDを同じと言ってるような乱暴さを感じる

290 :デフォルトの名無しさん:2009/12/27(日) 23:04:38
class Sub : private Super
privateのメリットがわかりません。どなたか教えてください

291 :デフォルトの名無しさん:2009/12/27(日) 23:06:41
sizeof()って型がいまいちよくわかりません。奴は何者ですか?
unsigned longとかいってるHPありますが、引数にint func( unsined long num)なんてあったら引数に渡しても大丈夫なんですか?
今までint func( size_t )こんな関数の引数に渡したことくらいしかないのでわからないんですが

292 :デフォルトの名無しさん:2009/12/27(日) 23:15:57
typeid(sizeof(int)).name()してみろ

293 :デフォルトの名無しさん:2009/12/27(日) 23:23:33
size_tが何者かは処理系定義

294 :デフォルトの名無しさん:2009/12/27(日) 23:29:52
>>290

class Super {
public:
void f();
};

class Sub : private Super {
};

void g() {
Sub().f(); // fにアクセスできない
}


295 :デフォルトの名無しさん:2009/12/27(日) 23:49:25
>>289
なら違いがわかるように「標準的でない規格」って言えよ。

「標準」をそういう意味に使うとしても C++ の規格を指して「標準規格」と呼ぶのが
冗長であることに変わりはない。「標準」以外に「やさしい」とか「むずかしい」とかいう
程度があるものじゃないんだから。

296 :デフォルトの名無しさん:2009/12/28(月) 00:06:48
>>295
日本語の「標準」にはそういう意味しかないんだけど?
「規格」だって単に決め事のことで、それ自体に遍く使われているという意味はない
「標準規格」で初めて英語のStandardに近い意味合いになる

日本語と英語は一対一に対応してるわけではないんだけどなぁ
日本の英語教育と国語教育のせいかな

297 :デフォルトの名無しさん:2009/12/28(月) 00:37:28
>>296
> 日本語の「標準」にはそういう意味しかないんだけど?

ひょうじゅん【標準】の意味 国語辞典 - goo辞書
http://dictionary.goo.ne.jp/leaf/jn/165187/m0u/%E6%A8%99%E6%BA%96/
> (1)物事を行う場合のよりどころとなるもの。

なんでちょっと辞書引くだけの確認もせずに自分の脳内設定が正しいと言い切っちゃうの?

> 「規格」だって単に決め事のことで、それ自体に遍く使われているという意味はない

C++ の規格(あるいは標準)と言った場合にそれ自体に遍く使われているという意味はない。
そういう意味を込めたいなら ISO の規格だとか JIS の規格だとか言えばいい。
わざわざ似たような意味の言葉をならべて意味が不明瞭になる可能性を高める必要はない。

298 :デフォルトの名無しさん:2009/12/28(月) 00:37:52
スマートポインタを使うためには、クラスも変更しなければならないのですか?

299 :デフォルトの名無しさん:2009/12/28(月) 00:39:59
ないよ。

300 :デフォルトの名無しさん:2009/12/28(月) 00:41:29
>>298
スマートポインタの設計によります。

std::auto_ptr, boost::shared_ptr, boost::scoped_ptr などは、それを使うためにクラス側の
変更を必要としません。

boost::intrusive_ptr はクラス側で準備してやる必要があります。このような性質を、
「侵入的」 "intrusive" といいます。

301 :デフォルトの名無しさん:2009/12/28(月) 00:49:04
> 「侵入的」 "intrusive" といいます。
へぇへぇへぇ。298じゃないけど勉強になった。

302 :デフォルトの名無しさん:2009/12/28(月) 09:39:58
CやC++て、
void foo(){std::cout << std::endl;}
という関数を定義することができるよね?
このfoo()は戻り値をあたかも返していないように見えるが、
実際は返している。ただしその値を取得しようとするとコンパイルエラーとなる
・・・という理解であってますか?

303 :デフォルトの名無しさん:2009/12/28(月) 09:46:52
戻り値が無い(void)
でいいじゃん

304 :デフォルトの名無しさん:2009/12/28(月) 09:52:25
>>303
foo()の戻り値を無理矢理取得することはできませんかね?


305 :298:2009/12/28(月) 10:05:27
>>299-300
ありがとうございます

306 :デフォルトの名無しさん:2009/12/28(月) 11:05:29
>>304
未定義

307 :デフォルトの名無しさん:2009/12/28(月) 11:07:57
>>304
どんな値が欲しいのさ?

308 :デフォルトの名無しさん:2009/12/28(月) 11:13:20
>>306
未定義でもいいんでコンパイルエラーにならないで
無理矢理コンパイル通したいです。
・・・1回だけでもやってみたいです。


>>307
おそらく意味不明な値が返ってくると思っています。
std::coutにでも渡して表示させて見ようと思っています、

309 :デフォルトの名無しさん:2009/12/28(月) 11:25:53
なんでやりたいの?

310 :デフォルトの名無しさん:2009/12/28(月) 11:28:39
>>302
最初の理解からして間違ってる。 void foo() は戻り値を返してなどいない。

ゴミを表示したいんなら別のコンパイル単位で int foo(); とでも宣言して
呼び出してみるといいかもしれない。プログラムがクラッシュするかもしれないけど。

311 :デフォルトの名無しさん:2009/12/28(月) 11:30:09
void型の関数は値を返せない。

312 :デフォルトの名無しさん:2009/12/28(月) 11:32:52
関数っていう名前紛らわしいよな。
サブルーチンとかって命名すればこんな下らない事考える奴出てこなかったのに

313 :デフォルトの名無しさん:2009/12/28(月) 11:34:46
pascal まんせー

314 :デフォルトの名無しさん:2009/12/28(月) 11:36:30
>>308
std::cout << "result = " << ((int(*)())foo)() << std::endl;

315 :デフォルトの名無しさん:2009/12/28(月) 11:54:24
>>308
インライン関数を挟めばいいのさ

316 :デフォルトの名無しさん:2009/12/28(月) 12:00:22
ありがとうございました。
C++ code - 8 lines - codepad
ttp://codepad.org/tI4wMyzX
満足しました。


317 :デフォルトの名無しさん:2009/12/28(月) 12:01:34
でも
void * p
ってのは何故か意味があるんだよな。
これがまた紛らわしい。
なんでこうなっちゃったの?予約語を増やしたくなかったからとか?

318 :デフォルトの名無しさん:2009/12/28(月) 12:04:32
デニス・リッチーに訊け

319 :デフォルトの名無しさん:2009/12/28(月) 12:05:13
>>317
何と何が紛らわしいんだ?

320 :デフォルトの名無しさん:2009/12/28(月) 12:07:59
>>317
テンプレートで参照外ししようとしてはまるよな

321 :デフォルトの名無しさん:2009/12/28(月) 12:08:44
>>320
インターフェイスくらい最初に決めとけカス

322 :デフォルトの名無しさん:2009/12/28(月) 12:09:03
>>317
何が紛らわしいのかさっぱり

any * としなさいってこと?

323 :デフォルトの名無しさん:2009/12/28(月) 12:10:15
>>321
口が悪いな
直した方がいい・・・

324 :デフォルトの名無しさん:2009/12/28(月) 12:10:36
char *と違って、うっかりdereference出来ない素晴らしい機構
それがvoid *

325 :デフォルトの名無しさん:2009/12/28(月) 12:13:34
そんなところで紛らわしいなんて感じている様じゃ。。。

326 :デフォルトの名無しさん:2009/12/28(月) 12:19:51
void * は指し示す型を特定しない=総称ポインタとして考えてはまずい?

327 :317:2009/12/28(月) 12:20:03
型が定まってないポインターなら
NULL * p
っていうものの方がよかったと思う。

328 :デフォルトの名無しさん:2009/12/28(月) 12:21:26
>>327 どこに利点が? NULL はマクロだし。

329 :デフォルトの名無しさん:2009/12/28(月) 12:22:08
アホはスルーで。

330 :デフォルトの名無しさん:2009/12/28(月) 12:23:09
NULL は無効なポインタを意味するから、文脈で出てくると
型なのか無効なのか不明瞭になるのかも

331 :デフォルトの名無しさん:2009/12/28(月) 12:25:37
voidのさみしいところは、馬鹿には分かりにくい単語だって事。

332 :デフォルトの名無しさん:2009/12/28(月) 12:26:41
>>326
それはchar *
void *は出来ないことがたくさんある。

333 :デフォルトの名無しさん:2009/12/28(月) 12:27:29
>>331
ということにしたいのですね。


334 :デフォルトの名無しさん:2009/12/28(月) 12:29:43
>>325
テンプレートクラスのインスタンス化時にメンバー関数の引数や戻りにvoidが現れると、その関数を呼ばなくてもエラーになるんだわ
見逃してくれよ

335 :デフォルトの名無しさん:2009/12/28(月) 12:31:48
>>334
当然じゃないの?
エラーにならないとしたら、どんなコードでどんな動作が期待できてうれしいの?

336 :デフォルトの名無しさん:2009/12/28(月) 12:37:08
>>335
基本的にはT*を扱うテンプレートクラスで参照外し関数をおまけで作るとはまる

337 :デフォルトの名無しさん:2009/12/28(月) 12:46:10
void *特殊化はイディオムなんで填まるヤツなんていない。

338 :デフォルトの名無しさん:2009/12/28(月) 13:18:07
>>336 >>335

339 :デフォルトの名無しさん:2009/12/28(月) 13:51:45
>>333
  ヘ_ヘ
 ミ ・ ・ ミ  < はつみみです
  (  ° )〜

340 :デフォルトの名無しさん:2009/12/28(月) 14:12:31
template<class T>
struct my_numpunct : public std::numpunct<T>
{
typedef typename std::numpunct<T>::char_type char_type;
char_type do_thousands_sep() const{ return ';'; }
};

int main()
{
std::locale loc(std::locale("japanese"), &std::use_facet<my_numpunct<char> >(std::locale("japanese")));
std::locale::global(loc1);
std::cout.imbue(loc1);
int x = 123456789;
std::cout << 123456789 << "\n";
std::stringstream ss;
ss << x;
std::cout << ss.str() << "\n";
}

出力結果が
123;456;789
123;456;789
となることを期待したのですが、そうなりません。

do_thousands_sepをoverrideするだけでは駄目なんですか?


341 :340:2009/12/28(月) 14:18:47
>>340
std::locale::global(loc1);
std::cout.imbue(loc1);

std::locale::global(loc);
std::cout.imbue(loc);
の間違いです

342 :デフォルトの名無しさん:2009/12/28(月) 15:41:41
void *に出来ないことって何?

343 :デフォルトの名無しさん:2009/12/28(月) 16:34:23
もしもvoidのケツの穴のことだったら出来ないことよりも、
出来ることを数えた方が速いと思われる。

344 :デフォルトの名無しさん:2009/12/28(月) 17:14:06
>>340
どこの桁で区切るかという指定も必要。
my_numpunctにこれを加えてみて。
std::string do_grouping() const {return "\3";}

345 :デフォルトの名無しさん:2009/12/28(月) 18:02:12
int i;
cout << i;
これで未定義の動作なわけだが、
実際には訳の分からん数が出力されたりする。

これを乱数として使うのはだめなの?
現実的に。

346 :340:2009/12/28(月) 18:18:05
>>344
それも書いてみたんですが、;で区切られないです。

347 :デフォルトの名無しさん:2009/12/28(月) 18:20:16
>>345
>これを乱数として使うのはだめなの?

ダメダヨ♪

348 :デフォルトの名無しさん:2009/12/28(月) 18:23:22
>>345
無理
だいたい似たような結果がでる
場合によっては予測可能

349 :デフォルトの名無しさん:2009/12/28(月) 18:24:07
>>347
ですよね☆

ありがとうございます。

350 :デフォルトの名無しさん:2009/12/28(月) 18:24:54
>>348
そうなんですか。
まあ確かに。
おとなしくboostの乱数でも使います。

351 :デフォルトの名無しさん:2009/12/28(月) 18:26:13
>>347

> ダメダヨ♪

千和ボイスで再生した

352 :デフォルトの名無しさん:2009/12/28(月) 20:07:40
コンパイル時間を減らすための工夫とかってあるんでしょか

353 :デフォルトの名無しさん:2009/12/28(月) 20:10:10
ありますよ

354 :デフォルトの名無しさん:2009/12/28(月) 20:10:34
>>344
ああ、ごめん。ちゃんと確かめていなかった。
ここも直す必要がある。
std::locale loc(std::locale("japanese"), new my_numpunct<char>);

use_facetは引数のlocaleオブジェクトからfacetを取り出す関数なので、>>340では無い物ねだりになっている。
新しくfacetオブジェクトをセットするときには直接newする。

355 :340:2009/12/28(月) 20:45:34
>>354
ありがとう。できました。


356 :デフォルトの名無しさん:2009/12/28(月) 22:01:39
>>352
とりあえずピンプルパンプル

357 :デフォルトの名無しさん:2009/12/28(月) 23:05:11
>>352
どのくらいC++に詳しい?
とりあえずboostとか少しでも知っている?
もしboost C++を知っているならshared_ptrとか言われても分かるだろうから
pimplイディオム - みこな
ttp://blog.goo.ne.jp/mikona-blog/e/e701abfe4ddc278974ff877ebae207db
pimplイディオムを語る ? ありえるえりあ
ttp://dev.ariel-networks.com/Members/matsuyama/pimpl30a430a330aa30e030928a9e308b
More C++ Idioms/ハンドル・ボディ(Handle Body) - Wikibooks
ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB%E3%83%BB%E3%83%9C%E3%83%87%E3%82%A3(Handle_Body)

この辺でどうだい?

358 :デフォルトの名無しさん:2009/12/29(火) 00:41:39
pimplとshared_ptrって相性良いように見えるけど実際は微妙。
shared_ptrは浅いコピーだからpimplを単純に使うと
pimpl無しとクラスの挙動が変わるのが面倒。

深いコピーをするshared_ptrみたいなものがboostに採択されてほしいなぁ。

359 :デフォルトの名無しさん:2009/12/29(火) 00:48:34
っ boost::any

360 :デフォルトの名無しさん:2009/12/29(火) 00:50:39
クラス作成時点ですでに実装を隠したいとわかっているなら、
抽象インターフェースと .cpp ローカルな実装クラスを作ったほうがよくないか?
委譲コードをぺたぺた書いていく必要も無いし、あとで特殊な実装を作って
差し替えることも楽にできるようになる。

後出しで依存を減らさないといけないときは pimpl が便利だろうとは思う。

361 :デフォルトの名無しさん:2009/12/29(火) 01:04:10
自動変数で使える
ファクトリがいらない
使う側が特に作業無しで継承できる
pimplの利点はこんなもんかね?

362 :デフォルトの名無しさん:2009/12/29(火) 01:27:14
pimplの利点
swap の実装が楽
STLに突っ込みやすい

363 :デフォルトの名無しさん:2009/12/29(火) 06:47:24
親クラスの実装部を書き換えてスロットが増減しても、
引き摺られて子クラスのスロットの位置が変らないから、
ライブラリのみの差し換えができるようになる。
つまりbinary interfaceが安定する。
だから子クラスをコンパイルし直す必要もない。
これがもともとの目的だった。

>>356はそういうことを言っている。
>>360はそこを理解しているのかどうか

364 :デフォルトの名無しさん:2009/12/29(火) 08:19:45
確かに本題は
>>352
だもんな。

365 :デフォルトの名無しさん:2009/12/29(火) 08:29:15
>358
一度 Pimpl Pointer がレビューで reject されて、現在 Pimpl がレビュースケジュール上に載ってるね。
マネージャ未定だけど。紹介は↓
ttp://www.ddj.com/cpp/205918714

もはやポインタ周りは見えないようになってるけど、値セマンティクス(深いコピー)とポインタセマンティクス(浅いコピー)と
継承する段階で切り替えられるみたい。

366 :デフォルトの名無しさん:2009/12/29(火) 09:23:27
>>365
さんきゅー。そういうものが提案されてたのか。

ただ、見てみたけど微妙w
色々やりたいのは伝わってくるけど
それぞれの目的別のスマートポインタで実現したほうが楽な気がする。
現状だと特に継承周りで色々構文に無理がある。

実装までは見てないから実際実装見てみないと若干思い違いしてるかもだけど

367 :デフォルトの名無しさん:2009/12/29(火) 11:39:48
>>363
抽象インターフェースを使う方法でもその目的は達成できるでしょ。

実装継承はやりにくくなるけど、あんまり使わないな。

368 :デフォルトの名無しさん:2009/12/29(火) 11:54:56
>>366
大丈夫大丈夫。
その辺の事情はboostに載る頃には
天才達による厳しいチェックと構成を乗り越えているものになっているだろうし。

369 :デフォルトの名無しさん:2009/12/29(火) 12:09:01
>>367
アホ過ぎて話にならない。
初心者スレで勉強しなおせ。

370 :デフォルトの名無しさん:2009/12/29(火) 12:15:59
>>369
ん?何かおかしなこと言ってる?
具体的に言ってもらえると助かる。

371 :デフォルトの名無しさん:2009/12/29(火) 12:19:02
別人だが横レス。

>>370
抽象インターフェースクラスを使うと

>親クラスの実装部を書き換えて
> 子クラスをコンパイルし直す必要もない。

って言いたいんだよね?


372 :デフォルトの名無しさん:2009/12/29(火) 12:44:47
>>371
そうだよ。面倒だけどね。

class BaseInterface; // 親・抽象インターフェース
class BaseImpl : BaseInterface; // 親・実装クラス
class DerivedInterface : BaseInterface; // 子・抽象インターフェース
class DerivedImpl : DerivedInterface; // 子・実装クラス

373 :デフォルトの名無しさん:2009/12/29(火) 15:54:48
STLのlistのerase(it, it)メンバってN個削除するとしたらコストO(N)であってますか?

374 :371:2009/12/29(火) 15:59:23
>>372
ほう。俺は詳しくないので
ではそれについて
>>369さんコメントください。

375 :デフォルトの名無しさん:2009/12/29(火) 16:09:16
>>372
そのDerivedImplはどう実装すんの?
↓これ使ってちょ

class BaseInterface{ public: virtual void f() = 0; };
class BaseImpl : BaseInterface{ public: virtual void f(){}; };
class DerivedInterface : BaseInterface{};
class DerivedImpl : DerivedInterface{ ??? };

376 :デフォルトの名無しさん:2009/12/29(火) 16:31:01
【言語比較】2chではCとC++>>JAVAって人が多い。しかし本当にそうか?ちなみに2chはperlが使われてる
http://tsushima.2ch.net/test/read.cgi/news/1262071701/

ニュース速報に立った


377 :デフォルトの名無しさん:2009/12/29(火) 16:47:18
速報じゃないよな少なくとも。

378 :デフォルトの名無しさん:2009/12/29(火) 16:48:55
ニュースでもないよな

379 :デフォルトの名無しさん:2009/12/29(火) 17:05:24
ニュース速報板がどういう板か知らないのか

380 :デフォルトの名無しさん:2009/12/29(火) 17:15:10
>>4 にある
The C++ Standard Libraryの日本語版がAmazonで売ってないんだけど古いから?
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/

381 :デフォルトの名無しさん:2009/12/29(火) 22:39:23
>>375
ほい。

// Base.hpp
class BaseInterface { public: virtual void f() = 0; };
BaseInterface* new_Base();
// Base.cpp
class BaseImpl : public BaseInterface { public: virtual void f(){} };
BaseInterface* new_Base() { return new BaseImpl(); }
// Derived.hpp
class DerivedInterface : public BaseInterface { public: virtual void g() = 0; };
DerivedInterface* new_Derived();
// Derived.cpp
#include <memory>
class DerivedImpl : public DerivedInterface
{
public:
  DerivedImpl() : base(new_Base()) {}
  virtual void f() { base->f(); }
  virtual void g() {}
private:
  std::auto_ptr<BaseInterface> const base;
};
DerivedInterface* new_Derived() { return new DerivedImpl(); }

382 :381:2009/12/29(火) 22:45:14
要は void f() { base->f(); } だとか void f() { pimpl->f(); } だとかいう委譲コードが
必要になるタイミングがが違う、ってことみたい。

pimpl だと最初に作るとき。
抽象インターフェース+継承だと、実装継承をするとき。

普段から実装継承を避ける方針を採っていると、後者の方法にすることで
(実装を隠すためだけの)委譲コードというものがほぼ発生しなくなってうれしい
ような気がする。

383 :デフォルトの名無しさん:2009/12/30(水) 13:44:24
abortした場合mainの自動変数は安全にデストラクトされる?されない?

384 :デフォルトの名無しさん:2009/12/30(水) 14:03:13
>383
> 14882:2003 3.6.3p4
> Calling the function
> void abort();
> declared in <cstdlib> terminates the program without executing destructors for objects of automatic or
> static storage duration and without calling the functions passed to atexit().

385 :デフォルトの名無しさん:2009/12/30(水) 15:23:17
ちょう、アホ臭い質問をさせてください
NetBeansでC++の勉強をしているのですが、
ソースファイル/ヘッダファイル/リソースファイルの3つがあります
ソースファイル以外の使い道がわかりません

何方かおしえてください

386 :デフォルトの名無しさん:2009/12/30(水) 15:30:21
C言語 分割コンパイル
でぐぐれ

387 :デフォルトの名無しさん:2009/12/30(水) 15:35:54
ソースはプログラム本体
ヘッダは1つ以上のソースからインクルードされることを想定したソースの一種
リソースファイルはそれらとは別でプログラムからは独立したデータ集を記述したもの

388 :385:2009/12/30(水) 15:47:13
>>387
新規作成→C++クラスを選択すると、ソースファイルに「*.h,*.cpp」が作成されるんですが

389 :デフォルトの名無しさん:2009/12/30(水) 15:56:00
そりゃ作成されるだろうね

390 :デフォルトの名無しさん:2009/12/30(水) 16:29:46
>>387
ソースファイルが1本だったら大きくなりすぎるのでソースファイルを分割する。
cppが2つになったら、別のほうファイルのクラスを呼ぶ方法に困ってしまう。
で、呼び方を書いたclassの定義を.hに入れて両方のファイルで#includeしたらクラスを呼び出せて丸く収まる。


391 :デフォルトの名無しさん:2009/12/30(水) 16:30:36
>>387じゃなくて>>385だった。

392 :385:2009/12/30(水) 17:10:49
>>389-340
新規作成→C++クラスを選択すると、ソースファイルに「*.h、*.cpp」が作成されるわけ
ソースファイルに「*.cpp」、ヘッダファイルに「*.h」が作成されるわけじゃない

393 :デフォルトの名無しさん:2009/12/30(水) 17:13:01
基本的に、
ヘッダには関数やクラスなどのインターフェイスを記述する。
ソースにはこれらの実装を記述する。

394 :デフォルトの名無しさん:2009/12/30(水) 17:17:52
そんなんNetBeansのとこで聞けよ
別にどこで作られたっていいだろ、何か困ってることがあるの?

395 :デフォルトの名無しさん:2009/12/30(水) 17:58:37
std::auto_ptr<MyClass> x=(new MyClass);
std::auto_ptr<MyClass> y=(new MyClass);
std::swap(x, y);
これって安全でしょうか?


396 :395:2009/12/30(水) 17:59:28
>>395がshared_ptrなら安全だと聞いているのですが、
auto_ptrは仕様をあまり知らなくて。。。

お願いいたします。


397 :デフォルトの名無しさん:2009/12/30(水) 18:00:54
安全ですよ

398 :デフォルトの名無しさん:2009/12/30(水) 18:05:28
>>397
ありがとうございます。
auto_ptrがくそみそに言われているのを聞いて、
不安になりました。

399 :デフォルトの名無しさん:2009/12/30(水) 18:16:41
>>398
auto_ptrは代入演算子で代入するとソース側を破壊する。
間違ってもSTLで使ってはいけない。


400 :398:2009/12/30(水) 18:33:41
>>399
std::auto_ptr<MyClass> x=(new MyClass);
std::auto_ptr<MyClass> y=(new MyClass);
これで

x=y;
としたとき、
xが指していたデータは勝手にdeleteされ、
yは無効なポインタとなり、
yが指していたデータをxが指すようになる

こんな動作で合っていますか?

401 :デフォルトの名無しさん:2009/12/30(水) 18:45:42
あってるよ。だからSTLで使う場合はshared_ptrを使う。


402 :デフォルトの名無しさん:2009/12/30(水) 18:51:21
class Sub : public virtual Super
継承される事を前提としたクラスを作成する時には、上のように宣言をするのが普通なのでしょうか?

また、javaのswingでは何度も継承をしているため、まったく意味のないメソッドや害を成すメソッドが存在します
C++ではこのような問題のあるメソッドに、どの様な対処をしているのですか?

403 :デフォルトの名無しさん:2009/12/30(水) 18:56:43
計画的に継承させる

404 :デフォルトの名無しさん:2009/12/30(水) 19:02:20
>>402 仮想継承はあまり使わないほうがいいよ。
class sub :public Superで十分。

無駄なメソッドがあるのは設計が不十分だと考えて、問題のないように設計しよう。


405 :402:2009/12/30(水) 19:14:54
>>404
なるほど、ありがとうございました

406 :デフォルトの名無しさん:2009/12/30(水) 19:17:16
>>400
次のC++の規格ではauto_ptrは非推奨になってunique_ptrに置き換わる。
だから今からなら仕様を覚えるより存在を忘れ去った方が良い気がする。
unique_ptrなら一応コンテナに放りこめる(ように実装できる)し。

まぁ次の規格が出るまでは素直にboostなりtr1のshared_ptr使えばいいと思う

407 :デフォルトの名無しさん:2009/12/30(水) 19:21:59
unique_ptrってauto_ptrのコピー、代入ができないverと考えていいのか?

408 :デフォルトの名無しさん:2009/12/30(水) 19:24:22
>>401
>>406
ありがとうございます。
私もfactoryは結構好きなのでboost::shared_ptr(ないしstd::tr1::shared_ptr)は
良く使っています。

お伺いしたいのですが、
std::auto_ptrとboost::shared_ptr(ないしstd::tr1::shared_ptr)は、
前者の方が不便な分 一般的に軽いと思って良いのでしょうか。

409 :デフォルトの名無しさん:2009/12/30(水) 19:45:03
>>408うん。
auto_ptrはオーバーヘッドが無い。
shared_ptrはshared_ptrの複製にわずかにコストがかかる。だから関数の引数で渡すときはshared_ptrの参照渡しにすると速い。
shared_ptrにポインタを最初に与えるときもコストがかかるが、newよりmake_sharedのほうが少し速い。


410 :デフォルトの名無しさん:2009/12/30(水) 19:51:44
>>407
代入などの条件が微妙に厳しくなったものと思えばいい。
コピーは出来ない(代わりにムーブが出来る)
基本的にはほとんどいっしょ。

copyの代わりにmove(代入時に元のデータを破壊してもいい)を採用した物というのが正解。
auto_ptrはC++がmoveの概念を持っていないのを無理やりエミュレートしたしろもの
だから元のデータを破壊してはSTLとしては不整合が出るoperator=やコピーコンストラクタが実装されている

unique_ptrはmoveの概念(右辺値参照)がC++0xで採用されたから、
無理やり実装するのじゃなくて新しい機能を使って素直に実装したバージョン
STLとして不整合が出る操作がないのでコンテナにも放りこめる。

411 :デフォルトの名無しさん:2009/12/30(水) 20:07:59
>>409
ありがとうございます。
make_sharedについてはちゃんと勉強して参ります。
助かりました。


412 :デフォルトの名無しさん:2009/12/30(水) 20:15:23
C++での多重継承ってどのようなデメリットがあるんですか?

template<class T> struct IConverter;
template<class T> struct IClonable;

class Base;
class Converter : public Base, public IConverter<int>, public IClonable<Converter>;

template<class T> T Convert(IConverter<T>* conv);

void Hoge
{
  Converter converter;
  int val = Convert<int>(converter);
}

って感じに使いたいのですが。

413 :412:2009/12/30(水) 20:16:53
実はもう上のコードにエラーとか潜んでたりします?

414 :デフォルトの名無しさん:2009/12/30(水) 20:21:55
>>412
多重継承は自由すぎて、乱用すると複雑になってわかりにくくなる。
その例のように、インターフェースを意識するのはわかりやすい使い方として推奨されている。
ほかにデメリットというと、キャストしたときにポインタの値が変わることかな。



415 :デフォルトの名無しさん:2009/12/30(水) 20:25:23
>>413 うん
template<class T> T Convert(const IConverter<T>& conv);


416 :412:2009/12/30(水) 20:25:38
上のような使い方は問題ないんですね。
ありがとうございます。

417 :412:2009/12/30(水) 20:27:54
>>415

すいません。
template<class T> T Convert(IConverter<T> *conv);

Convert<int>(&converter);

ってしたかったんです。
参照を使ったほうがいいんですかね??

418 :デフォルトの名無しさん:2009/12/30(水) 20:29:47
テンプレート関数は型の特殊化ができない。

419 :デフォルトの名無しさん:2009/12/30(水) 20:31:35
>>417 うん。参照を使うことをお勧めします。

420 :デフォルトの名無しさん:2009/12/30(水) 20:32:19
>>418
特殊化はできる。
部分特殊化ができない。

421 :デフォルトの名無しさん:2009/12/30(水) 20:35:49
でも参照ってRAIIがあれだからイヤ!

Hoge *p = NULL;
// 〜 コード 〜
p = new Hoge(); // このタイミングを待っていた!

422 :デフォルトの名無しさん:2009/12/30(水) 20:37:19
>>421
危険なにおいがプンプン

423 :デフォルトの名無しさん:2009/12/30(水) 20:37:23
>>421
shared_ptrをお勧めします

424 :デフォルトの名無しさん:2009/12/30(水) 20:39:04
>>421 scoped_ptrもありだな。RAIIを語るならスマポを使わないと

425 :デフォルトの名無しさん:2009/12/30(水) 20:41:10
ということでRAIIにおいては(スマート)ポインタってことだな

426 :デフォルトの名無しさん:2009/12/30(水) 20:43:11
つかスマポを使うときには明示的に破棄できるクラスを作る俺は変態?

class Resource
{
  void Dispose();
};

みたいな。

427 :デフォルトの名無しさん:2009/12/30(水) 20:43:12
>>421
それなんて初心者?

428 :デフォルトの名無しさん:2009/12/30(水) 20:44:04
>>426
別に、二重deleteにならないならいいんじゃない?
任意のタイミングでdeleteしたいときと、
shared_ptrとかに任せるときの2パターンできるようにするってことでしょ?

429 :デフォルトの名無しさん:2009/12/30(水) 20:45:50
>>426
C#風味ですね。その機能はC++ではデストラクタが行う。

430 :デフォルトの名無しさん:2009/12/30(水) 20:46:50
まぁfstreamにcloseメソッドがあるようなもんだろ。
べつに問題はないとおもうよ


431 :デフォルトの名無しさん:2009/12/30(水) 20:47:31
参照使う関数にRAIIな感じなオブジェクトを渡すってなると

void Reference(RAII &obj);
// 〜〜〜
shared_ptr<RAII> obj;
// 長々とコードとか
Reference(*obj); // こんなのの繰り返し・・・?

とかダサいことになる。

432 :デフォルトの名無しさん:2009/12/30(水) 20:49:25
おもしろい議論だ。

誰かスレでも立てて〜 ><

【RAII】C++で [*]ポインタ vs 参照[&]【安全】

433 :426:2009/12/30(水) 20:51:06
>>429
そう。それです。
C#ばっかやってたらこれがやめられなくなった

434 :デフォルトの名無しさん:2009/12/30(水) 20:53:42
>>433
C++ではusingしなくても自動的にDisposeの働きをするデストラクタが呼ばれるからデストラクタでやれば問題ないです。


435 :デフォルトの名無しさん:2009/12/30(水) 20:56:18
>>431
C++はブロックの先頭に変数宣言しなくてもいいんだよ。

436 :デフォルトの名無しさん:2009/12/30(水) 20:59:12
>>431 繰り返すってどこ?
これもRAIIだけど何も問題ないよ。

void Reference(const Hoge& a);

void piyo()
{
Hoge b;
Reference(b);
 
 shared_ptr<Hoge> c=make_shared<Hoge>();
Reference(*c);

}

437 :433:2009/12/30(水) 21:04:07
違うんだ!すまん。

class RAII; // ウィンドウと考える

class Super
{
  shared_ptr<RAII> window;
public:
  Super();
  ~Super();
public:
  void ShowWindow()
  {
    window = shared_ptr<RAII>(new RAII("RAIIだよ、RAII!"));
    window->Show();
  }
  
  // 他のコード
};

438 :デフォルトの名無しさん:2009/12/30(水) 21:05:14
>>428
さらに、例外時にDisposeが呼ばれなかったときや、呼び忘れのときの動作も明確にすれば問題ないし。


439 :デフォルトの名無しさん:2009/12/30(水) 21:05:39
Resource Acquisition Is Initializationですね。わかります。

440 :デフォルトの名無しさん:2009/12/30(水) 21:07:04
これからはRAII + スマポの時代だな

441 :デフォルトの名無しさん:2009/12/30(水) 21:10:47
人が増えてきたね。
盛り上がってきました

442 :デフォルトの名無しさん:2009/12/30(水) 21:18:05
こんな感じ?
参照とスマポ おすすめ
素ポインタ  ご遠慮願います。

443 :デフォルトの名無しさん:2009/12/30(水) 21:36:52
汎用スマポは遅い

444 :デフォルトの名無しさん:2009/12/30(水) 21:38:47
俺的には参照を使うのは構造体(データを表すものとしての)に使って、
クラスはポインタを使うってしてる。

クラスに参照を使うっていうのはNULLをつかわなければ最適解だけど、

class A;
void Ref(A& obj);
void AllowNull(A* obj);

っていうのは、美しくない。

445 :デフォルトの名無しさん:2009/12/30(水) 21:42:54
素のポインタを関数の引数にするっていうのはありだな。(オレは)
でもオブジェクト生成する関数がスマポじゃなくて生ポインタで
返してくるっつうのは

逝ってヨシ

446 :デフォルトの名無しさん:2009/12/30(水) 21:45:10
>>444
意味不明な分類法だね
構造体でNULL使いたいときとかクラスで参照先を保証したい場合どうするの?

447 :デフォルトの名無しさん:2009/12/30(水) 21:47:19
>>446
クラスでオブジェクト保持ならスマポだろ
だいたい構造体でNULLとか、WindowsAPIかよ

448 :デフォルトの名無しさん:2009/12/30(水) 21:49:26
NULLを使うとNULLかどうかのテストがプログラムのいたるところに必要になってプログラムが汚くなる。
だからNULLを使わないですむように参照を率先して使うように設計している。
そして共有する場合やNULLが必要な場合など、参照が使えない場合はスマポを使う。
ポインタを使うのはAPI呼ぶときぐらい。


449 :デフォルトの名無しさん:2009/12/30(水) 21:49:29
そもそもNULLみたいな低レベルな概念が
C++でクラスを設計するさいに本当に必要なのか。

450 :デフォルトの名無しさん:2009/12/30(水) 21:57:32
>>449
検索の結果をイテレータで返す場合に見つからない場合はendを指すなどで表すからNULLは使わないね。
STLでも引数や戻りでNULLやポインタは使わないね。コンテナにshared_ptrを渡すときなんか参照とスマポがうまい具合に融合している。


451 :デフォルトの名無しさん:2009/12/30(水) 22:05:18
弱参照の意味で生ポ使いたいときは結構あるとおもうんだが?
weak_ptr使うにはshared_ptr使わないといけないし
かといって共有目的もないのにshared_ptr使うのは無駄が多すぎる

452 :デフォルトの名無しさん:2009/12/30(水) 22:21:07
shared_ptrはそんなに無駄は無いよ。shared_ptrを使い始めたとき同じことを悩んだけど、結局ほとんど無駄は無い上にわずらわしいリソース管理から開放
された上に確実に行えるメリットが大きいと判断したよ。
非共有だったとしても、コンテナに渡したりすると一時的に共有になる必要があったりするからとりあえずshared_ptrにしている。


453 :デフォルトの名無しさん:2009/12/30(水) 22:23:36
だよなあ

454 :412:2009/12/30(水) 22:28:22
なんかすごい量のレスがw

聞きたいのですけど、参照渡しで渡されたクラスを基底クラスにキャストするときって、
どういう書き方をすればいいんですか?

455 :デフォルトの名無しさん:2009/12/30(水) 22:28:43
weak_ptrって大発明じゃないか?


456 :デフォルトの名無しさん:2009/12/30(水) 22:30:25
class A{};
class B{};

void f(B&b){

}

457 :デフォルトの名無しさん:2009/12/30(水) 22:31:07
すまん途中で送信された。
class A{};
class B:public A{};
void f(B&b){
A&a = b;
}
だけの話じゃないの?

458 :デフォルトの名無しさん:2009/12/30(水) 22:32:02
>>454
アップキャストはキャストは要らないですの。
class hoge :public base;のとき
void func(const hoge& a)
{
const base& b=a;
}



459 :デフォルトの名無しさん:2009/12/30(水) 22:34:05
> 要らないですの
KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

void func(const base& a);
//...
hoge a;
func(a); //どうでもいいけどこれじゃだめなの?

460 :デフォルトの名無しさん:2009/12/30(水) 22:37:10
>>459 問題無いですの

461 :デフォルトの名無しさん:2009/12/30(水) 22:38:00
> 問題無いですの
KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

462 :デフォルトの名無しさん:2009/12/30(水) 22:39:25
トークンはひとつに付き長さ32まで!

463 :デフォルトの名無しさん:2009/12/30(水) 22:40:45
> KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
むしろこっちのほうがきもいですの

464 :デフォルトの名無しさん:2009/12/30(水) 22:41:39
>>463
無限ループを作ろうとすなww

465 :412:2009/12/30(水) 22:43:02
あ、そうですね。
ありがとうございます。

466 :デフォルトの名無しさん:2009/12/30(水) 23:12:00
良スレの予感

467 :デフォルトの名無しさん:2009/12/31(木) 01:19:57
listのallocatorってひょっとして要素の確保にだけ有効で、ノード自体は普通の確保になるの?

468 :デフォルトの名無しさん:2009/12/31(木) 01:22:18
要素に適応されたallocator型はノードにも使える様にrebindで適応される。

469 :デフォルトの名無しさん:2009/12/31(木) 01:26:38
rebindってtemplate typedefがないから
苦肉の策で実装しました感が漂ってきてC++が嫌いになるぜw

STL実装してて破綻してることに気付いただろうに何故規格に入れなかったのかと!

470 :デフォルトの名無しさん:2009/12/31(木) 01:31:29
d
rebindってそのためにあったのね

471 :デフォルトの名無しさん:2009/12/31(木) 09:57:34
>469
一応 template typedef の提案自体はあったみたいよ。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0492.asc
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0578.pdf

いい機能だけど他に優先する事がある、というのが N0578 の推奨。
実際、十数年前の状況を曲がりなりにも template の普及した現在から言うのは酷かと。
STL 自体、標準化の後期(になるはずだった時期)になってからでてきたわけだし。

472 :デフォルトの名無しさん:2009/12/31(木) 11:04:11
ぶった切ってすまんが、スレ的にはこの本はどうなのよ?
>>4にない)
tp://www.oreilly.co.jp/books/4873110637/
tp://www.amazon.co.jp/dp/4873110637/

473 :デフォルトの名無しさん:2009/12/31(木) 11:06:45
>>469
typedefさえもないが無いC#はどうよ。

474 :デフォルトの名無しさん:2009/12/31(木) 11:40:37
>>469
C++標準化委員会は責任重大なんだよ!
そう簡単にじゃあ入れるか!ってことはできないんだよ。

475 :デフォルトの名無しさん:2009/12/31(木) 11:41:27
>>473
Anders Hejlsberg が、
> typedef の問題は、一つの型が異なる名前を持つことだ。.NET では各型が単独の名前を持つようになっている。typedef を実現するには、全言語がサポートする必要があるが、もう遅い。
と言っている。
ほかの言語があまりまねをしないということは、C言語の問題点になってるんじゃねぇ?

476 :デフォルトの名無しさん:2009/12/31(木) 11:51:09
for eachって.netだけなんですか?
boost::foreach?を除く

477 :デフォルトの名無しさん:2009/12/31(木) 12:27:04
>>476
何を言いたいの?他の言語にあるかってこと?

478 :デフォルトの名無しさん:2009/12/31(木) 12:40:37
>>475
それって、「.netの問題で実装できません。許してお願い。」って言ってるように読めるね。
同じ数値に違う名前をつけるconstはあるのにね。

479 :デフォルトの名無しさん:2009/12/31(木) 12:49:10
{
const int x = 1;
const int y = 1;
if(x == y) cout << "eq" << endl;
}

{
typedef int x;
typedef int y;
if(typeid(x) == typeid(y)) cout << "eq" << endl;
}

何か違いはあるのかね

480 :デフォルトの名無しさん:2009/12/31(木) 13:33:43
デフォルト引数を使うべきか、オーバーロードを使うべきか
どっち?

481 :デフォルトの名無しさん:2009/12/31(木) 13:36:42
ケースバイケース

482 :デフォルトの名無しさん:2009/12/31(木) 13:54:53
デフォルト値に値するものがなかったり
型が全て一緒でオーバーロードできず
関数名を変えなきゃいけないときもある
つまりケースバイケース

483 :デフォルトの名無しさん:2009/12/31(木) 14:08:02
現在自分はVC++2008を使ってC++の勉強をしているんですが、
C++では、入出力のprintf,scanfや、文字列char*、ファイル操作のfopenなどC由来のものを使うよりも、
入出力cin,coutや文字列string、ファイル操作のfstreamなどを使ったほうがはるかに便利だと思うんです。(scanfのエラーの多さや文字列char*の不便さなど。vectorとかもあるし)
というわけで、C++ではこういったC関数は全く使わないのでしょうか?
Cのソースをみても理解できるようになるから学んでおいたほうがいいよ、程度なのでしょうか。

484 :デフォルトの名無しさん:2009/12/31(木) 14:08:43
構文解析器を作ろうと思ってます、正規表現のエンジンはboost1.40 を
使っているのですが、セパレータの字句に何を使えば良いのか、迷っています
素直に、XML で行った方がよいのとも思案しているのですがいかがなものでしょうか?
助言をお願いできないでしょうか。

485 :デフォルトの名無しさん:2009/12/31(木) 14:37:46
>>484
つ flex, bison

486 :デフォルトの名無しさん:2009/12/31(木) 14:43:56
人によるんじゃない
俺はiostreamをそれほど便利と思ったことはなく、C++でもscanf/printf系列を使ってる

487 :デフォルトの名無しさん:2009/12/31(木) 15:06:41
>>485
サンクスです
車輪の再発明をしなくてすみそうです、ありがとう
flex はなんか、Javaのパーサのような印象を受けましたが、C++ からでも使えるのでしょうか?

488 :デフォルトの名無しさん:2009/12/31(木) 15:09:28
>>483
詳しい仕様を知らなくても、何をするものか知っていて、それ以上を知る必要が
出てきた時にすぐ思いつきすぐ確かめられるだけの知識と情報ソースがあれば充分。
後の選別は経験がしてくれる。

489 :デフォルトの名無しさん:2009/12/31(木) 15:31:05
>>483
クラスに対する入出力は演算子のオーバーロードが出来てiostreamは便利
逆に言うと単純な入出力だけならprintfやscanfで十分

でもstringの入出力はiostream必須だから使う人によるとしか言えない

490 :デフォルトの名無しさん:2009/12/31(木) 15:36:52
printf、scanf を使わないでおくことはできても、知らずにいては、こまることも多いはずだ。

491 :デフォルトの名無しさん:2009/12/31(木) 16:07:51
職業プログラマでC++を使っている方にお伺いしたいのですが、
職場でBoost禁止なんてことはあるのですか?

現実問題としてOSのAPIとC++標準ライブラリだけで
プログラミングしろとか気が狂ってるとしか思えないんですが。


492 :デフォルトの名無しさん:2009/12/31(木) 16:13:33
組み込みなら

493 :デフォルトの名無しさん:2009/12/31(木) 16:14:04
>>491
VC6 の時代から、boost::tokenizer とか組込みで系の実装で使ってたよ。

494 :デフォルトの名無しさん:2009/12/31(木) 16:16:27
職場でBoost禁止はそれなりに聞くね。まぁ少しずつ減ってるとは思うけど。
数年前までは、STL禁止なんて話も結構聞いたなぁ。今はどうなんだろう。

ちなみに、多くの場合は社内に独自ライブラリの蓄積があるので、
Boost禁止が即「OSのAPIとC++標準ライブラリだけ」に繋がるわけではないよ。

495 :デフォルトの名無しさん:2009/12/31(木) 16:20:33
みなさんありがとうございます。
良かったです。

とりあえず珍しいコンパイラでboostが通らないとかは別とすれば、
正直 自社のライブラリがおkなら
boostだっておkにしていい気がしますけどね。


496 :デフォルトの名無しさん:2009/12/31(木) 16:22:48
素でstl 無しで、実装してくださいなんて言われた日には・・・・マンドクサイ

497 :デフォルトの名無しさん:2009/12/31(木) 16:30:13
>>495
なんでいいと思うかわからん
boostに不具合あったらお前が責任取れるの?
素性の知れないものを使うリスクとか考えろよ

498 :483:2009/12/31(木) 16:34:52
皆様方ご返答ありがとうございます

>>486,>>488 成程、人によりけりで深い知識を身につけていけばCの利便性が分かるということですね。

>>489 ヘッダファイルの問題ですか、自分はまだ速度やらメモリに気を遣うレベルに達してないのでその辺り盲点でした。

499 :デフォルトの名無しさん:2009/12/31(木) 16:42:04
>>497
でも社内のライブラリ vs Boost では
圧倒的にレビューされている量が違いますよね。
さらに言えばOS自身責任取ってくれる会社なんて1社も無いような気がするのですが、
どうでしょう?

500 :495:2009/12/31(木) 16:47:13
>>497
確かに Boostも素性が知れないと言えば
しれませんしね。
ありがとうございます。


>>499
なりすまさないでください。


501 :デフォルトの名無しさん:2009/12/31(木) 16:49:37
なんで、この板って「なりすまし」が多いんだろ?
勝手にレスされると腹立つわ

502 :デフォルトの名無しさん:2009/12/31(木) 16:58:16
たいていそういうことするのって一人なんじゃね?


503 :デフォルトの名無しさん:2009/12/31(木) 17:40:04
boostを使ったプログラム誰がメンテするんだよ、とか
C++系のスレではよくある話
>>499は新参

504 :デフォルトの名無しさん:2009/12/31(木) 17:47:30
社内ライブラリでも外部ライブラリでも結局メンテするのは担当者。

505 :デフォルトの名無しさん:2009/12/31(木) 17:49:08
そして後で困る

506 :デフォルトの名無しさん:2009/12/31(木) 17:53:29
まるで鎖国状態だな。

507 :デフォルトの名無しさん:2009/12/31(木) 17:59:52
せっかくの既存ライブラリを使わないのももったいないし。
でも汎用性の高い外部ライブラリを直接使うから個人差で大変になるんだろうな。
社内ライブラリが外部ライブラリを参照するようにすれば、プログラマの個人差が無くなってよくなるんじゃね。


508 :デフォルトの名無しさん:2009/12/31(木) 18:05:44
ぬるま湯に使ってるといざ外に放り出されたって時に死にそうだから
納期に間に合うあいだはboostは控えるべき
脳って使わないとどんどん衰えていくしね

509 :デフォルトの名無しさん:2009/12/31(木) 18:14:04
>>508
いくら納期があっても、boost 使えば書けるコードを辛気臭く最初から作り込むのもなんだかなぁー
俺ならさっさと書いてしまって、ホワイトボックステストとかに注力するけどね、時間があればの話ですが。


510 :デフォルトの名無しさん:2009/12/31(木) 18:14:48
>>499はただの横槍じゃないかと思うが、

>>499
Boost使って問題が起きたら誰がその責任を取ってくれるのか。
社内のライブラリを使って問題があれば、会社として責任負ってくれるだろ。

511 :デフォルトの名無しさん:2009/12/31(木) 18:20:37
C++ での開発に失敗したら C++WG が責任とってくれるに違いねえだよ。

512 :デフォルトの名無しさん:2009/12/31(木) 18:24:08
外部ライブラリを使う人が品質評価をすればいいだけの話。

それに人員が割けなかったり、その能力のある人が皆無だというなら
その職場がお寒い現状であるというだけ。

513 :デフォルトの名無しさん:2009/12/31(木) 19:44:37
>>510
でも社内のライブラリ vs Boost では
圧倒的にレビューされている量が違いますよね。
さらに言えばOS自身責任取ってくれる会社なんて1社も無いような気がするのですが、
どうでしょう?

514 :デフォルトの名無しさん:2009/12/31(木) 19:52:51
コピペ乙

515 :デフォルトの名無しさん:2009/12/31(木) 21:51:09
まあ確かに、例えばWindowsとかの有料OSでも
MSが動作を保証してくれていないのに、
なぜか俺らが保証するというおかしなことになっているんだよな。


516 :デフォルトの名無しさん:2009/12/31(木) 22:12:29
一時ファイルを作ってそのストリームを開いてくれる標準C++の
機能はありませんでしょうか?

C言語では
 ttp://www.cppll.jp/cppreference/stdio_details.html#tmpfile
> tempfile()は重複のない名前を持つテンポラリファイルを開き、
> そのFILEポインタを返す。エラーが発生した場合にはnullが返される。
というのがあるのですが、IO streamとして扱いたいのです。


517 :デフォルトの名無しさん:2009/12/31(木) 22:14:27
cstdioにstd::tempfileっていう関数があるよ。

518 :516:2009/12/31(木) 22:20:53
>>517
それですと IO streamとして扱えないのです。

519 :デフォルトの名無しさん:2009/12/31(木) 23:17:35
>>517
いい加減なこと教えんなよw

520 :デフォルトの名無しさん:2009/12/31(木) 23:21:06
stringstream???

521 :デフォルトの名無しさん:2009/12/31(木) 23:23:57
>>520
でもファイルが欲しいらしいぞ。


522 :デフォルトの名無しさん:2009/12/31(木) 23:35:38
激烈なでっかいテキストデータを複数管理するのに、
どうしても複数のテンポラリファイルが欲しくなったのです。
まあ適当に一時ディレクトリ作ってそのなかで管理すればよいのですが。

すみません
ありがとうございました。


523 :デフォルトの名無しさん:2009/12/31(木) 23:38:54
MyClass hoge(〜);

スマポ<MyClass> hoge_p = new MyClass(〜);
のどちらでも同じ仕事ができる場合、
大抵は前者を選ぶと思うのですが、
後者を選ぶ場合にはどんなものがあるのでしょうか?
(関数からhoge_pを返すことはしません。)

MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?


524 :デフォルトの名無しさん:2009/12/31(木) 23:52:27
コンストラクタを引数つきで呼べるとか

525 :デフォルトの名無しさん:2010/01/01(金) 00:13:48
他のクラスのメンバ変数にしたときポインタなりスマポなら
コンパイル依存性を減らせる可能性がある

Effective C++ 第3版
31項 ファイル間のコンパイル依存性をなるべく小さくしよう

526 :523:2010/01/01(金) 00:15:52
みなさんありがとうございます。

>>524
前者も呼べますよね?

>>525
コンパイル依存性を減らすというのは考えていませんでした。
確かにそうですね。


527 :デフォルトの名無しさん:2010/01/01(金) 00:49:02
あとは破棄するタイミング
hogeを複数のオブジェクトが参照してるとき

後者のスマポがshared_ptrなら参照が0になるまで破棄されないので
破棄するタイミングを気にせずに複数のオブジェクトから使用できる

前者の場合、
hogeの生存期間 >= 複数のオブジェクトがhogeを参照する期間
を保障しないといけない

528 :デフォルトの名無しさん:2010/01/01(金) 08:58:15
>>527
でも
> 関数からhoge_pを返すことはしません。
って書いてあるからそれは心配ないのでは?

529 :デフォルトの名無しさん:2010/01/01(金) 12:41:10
あー、そうなるとスマポ使ってもあんまりメリット無いね

530 :523:2010/01/01(金) 13:56:39
みなさん
ありがとうございます。

前者のMyClass hoge(〜);でスタックに確保できずに失敗する可能性と、
後者のスマポ<MyClass> hoge_p = new MyClass(〜);でヒープに確保できずに失敗する可能性と、
どっちを畏れるべきでしょうか?

531 :デフォルトの名無しさん:2010/01/01(金) 14:38:49
>530
>MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
等おそれるべき理由がない限り、確保失敗の可能性など無視してオブジェクトの生存期間から決定する。
おそれるべき理由がある場合、どちらをおそれるべきかもはっきりするはずなのでそれに従う。

532 :530:2010/01/01(金) 20:06:56
>>531
としますと、例えば
void foo(const MyClass& str)
{
MyClass hoge(〜);
hoge.bar(str);
return;
}
これと
void foo(const MyClass& str)
{
スマポ<MyClass> hoge_p = new MyClass(〜);
hoge_p->bar(str);
return;
}
これは等価なコードとなりると思うのですが、
この場合はどちらでも良い、悪く言えばその場の気分次第ということなのでしょうか?



533 :デフォルトの名無しさん:2010/01/01(金) 21:07:36
>>532
前者は、スタックを消費する。速い
後者は、ヒープを消費する。前者より少し遅い。
共有しないという前提(参照は可能)がある場合なら前者のほうがメリットがあると思う。
共有する場合は後者になるのかな。



534 :デフォルトの名無しさん:2010/01/01(金) 21:09:23
等価なわけないだろ。
スマポ噛ませてる分処理は遅くなるしnewの速度コストなんてスタック配置の何千倍だから無駄。

535 :デフォルトの名無しさん:2010/01/01(金) 21:14:59
>>530
スタックオーバーフローを恐れるような大きなオブジェクトじゃない場合はスタックに置いていいんじゃないか。
また、あまり大きいオブジェクトがあると、スタックフレームの増大で(E)BPからのオフセットが大きくなってプログラムサイズが若干大きくなる可能性があるね。たとえばスタックフレームを128バイト未満にするとかが目安かもね。


536 :532:2010/01/01(金) 21:46:44
>>533-535
ありがとうございます。
やはり巨大じゃないオブジェクトで意味的に等価なコードならスタックにおくべきという
ことなのですね。


537 :デフォルトの名無しさん:2010/01/01(金) 23:41:23
ヘッダファイルって、そもそも何の為にあるんですか?
他の人が書いたコードを利用する時にヘッダファイルを見ると、
privateなメンバがわかってしまうのでカプセル化(人間から見た時)に
なっていないような気がするのは気のせいでしょうか?

538 :デフォルトの名無しさん:2010/01/01(金) 23:57:55
>>537
#define private public をするため

539 :デフォルトの名無しさん:2010/01/02(土) 00:02:15
>>538
おいこら適当なこと教えるなよ。

540 :デフォルトの名無しさん:2010/01/02(土) 00:06:04
>>537
不用意に使うことを防ぐのが目的だから、見えてもかまわない。
JavaやC#だって、bytecodeやILを見たらわかってしまう。

541 :デフォルトの名無しさん:2010/01/02(土) 00:08:39
Cだと、privateにあたるものは、長い名前をつけるという流儀もある。

542 :デフォルトの名無しさん:2010/01/02(土) 00:18:04
>>537
privateは分からないようにするんじゃなくて、アクセスできなくして隠蔽するためのもの。
見えないわけでない。


543 :デフォルトの名無しさん:2010/01/02(土) 00:20:00
>>539
「適当」ならいいじゃん
「不適切」とは意味が違うんだから

544 :537:2010/01/02(土) 00:40:03
>>540
ヘッダファイルはjavaだと、javadocのような存在なのではないのでしょうか?
javadocではprivateは見えないように設定されていますし

>>541
知らなかった、トンクス

>>542
頑張ってprivateなフィールド(friendを除く)にアクセス出来ないのでしょうか?
参考として、覚えておきたいので

545 :デフォルトの名無しさん:2010/01/02(土) 01:06:44
>>544
javadocとはぜんぜん違うから

friendでprivateにアクセスできるクラスや関数を制限しているんだから、friend以外でprivateにアクセスできたら意味が無い。
方法としてはfriendクラスを経由するように設計すればいい。


546 :デフォルトの名無しさん:2010/01/02(土) 02:49:23
privateに強引にアクセスする黒魔術なら>>80あたりに色々あるから

547 :デフォルトの名無しさん:2010/01/02(土) 03:24:05
VC 208 Expressで
. or -> やっても関数一覧が出ないでやんす!

548 :デフォルトの名無しさん:2010/01/02(土) 03:50:14
ローマ帝国時代のVCか。

549 :デフォルトの名無しさん:2010/01/02(土) 08:05:11
>544
Javadoc は人が見るためのもの、ヘッダファイルはコンパイラが解釈するためのものだ。

Java でも import すると(多分) class ファイルが解析されて、あるクラスにどんなメソッドがあるとか
どんな例外が飛ぶとかを javac が認識する。
こういう情報がないとコンパイラはコードを生成できない。
C/C++ ではコンパイラが中間ファイルを解析するのではなく、ヘッダファイルを #include して
ソース側にどんな関数がある等といった情報を取り込む形で対応している。
っつーかヘッダファイルがなくても自前で必要な情報を全部ソース直書きしてもいいんだけど
いちいち書くのは面倒だからヘッダファイルを用意してあるといった方が正しいか。

550 :デフォルトの名無しさん:2010/01/02(土) 08:35:34
適当なこといってんなワロス

551 :デフォルトの名無しさん:2010/01/02(土) 09:19:10
>>547
STLやboostのヘッダ取り込んだら出てこなくなるから、あきらめるしかないね。

552 :デフォルトの名無しさん:2010/01/02(土) 10:41:35
>>544
javadocが欲しいなら、doxygenがあるぜよ。
http://pc12.2ch.net/test/read.cgi/tech/1212144627/l50

553 :デフォルトの名無しさん:2010/01/02(土) 10:44:46
井の中の蛙じゃいかんぜよ

554 :539:2010/01/02(土) 11:01:06
>>543
いったいこういうヤツって、なんなんだろうね?
揚げ足を取った気になってるのかな?
どう考えたって元々無いような人望を削って
さらに信頼を無くしていくだけだと思うのだが。
 ttp://dic.yahoo.co.jp/dsearch?enc=UTF-8&p=%E9%81%A9%E5%BD%93&dtype=0&dname=0na&stype=0&pagenum=1&index=14673212667700


555 :デフォルトの名無しさん:2010/01/02(土) 11:03:27
>>544
> 頑張ってprivateなフィールド(friendを除く)にアクセス出来ないのでしょうか?
> 参考として、覚えておきたいので
privateメンバのことね?
ないよ。
>>80の方法だって、未定義の動作だったり、
使える状況にかなり無理があるものだったりして
あまり現実的に好ましいものではない。


556 :537:2010/01/02(土) 11:11:33
privateへアクセスする黒魔術は勉強しておきます

557 :デフォルトの名無しさん:2010/01/02(土) 11:11:45
ttp://cpplover.blogspot.com/2009/12/c10.html
これで育つのはC++メタプログラマーじゃねーかww


558 :デフォルトの名無しさん:2010/01/02(土) 11:22:02
#define private public

559 :デフォルトの名無しさん:2010/01/02(土) 11:43:21
>>556 よせ、その黒魔術は危険だ。早く逃げてー!!
>>558 誘うんじゃない!!




560 :デフォルトの名無しさん:2010/01/02(土) 11:49:34
これの対抗手段としてPimplイディオムを使うわけだね

561 :555:2010/01/02(土) 11:49:41
>>556
やめろって言ってるだろ!
あれはタダの冗談であり、あんな未定義動作のクソコードを
実際に書く気か!?

Java出身なのかどうかしらないが、
カプセル化って知らないの?


562 :デフォルトの名無しさん:2010/01/02(土) 11:50:31
#ifdef 千里眼
#define private public
#endif

563 :デフォルトの名無しさん:2010/01/02(土) 12:05:45
>>556 同じ魔法ならこっちにしろ ぴんぷるぱんぷるぱむぽっぷん


564 :デフォルトの名無しさん:2010/01/02(土) 12:08:52
たしかに
>>80
黒魔術
というのは合ってる気がするw
邪悪で、未定義の動作という意味で。

565 :デフォルトの名無しさん:2010/01/02(土) 15:43:21
537の人気に嫉妬

566 :デフォルトの名無しさん:2010/01/02(土) 16:40:19
ワロスww

#define private public
#include <iostream>

class Test {
private:
int x;
public:
void print() const {
std::cout << x << std::endl;
}
};

int main()
{
Test x;

x.x = 1;
x.print();
}

567 :デフォルトの名無しさん:2010/01/02(土) 16:42:12
#define class struct もあった方がいいな

568 :デフォルトの名無しさん:2010/01/02(土) 17:01:59
>>567
だからそれはコンパイルエラーになることがあるからだめだろ


569 :デフォルトの名無しさん:2010/01/02(土) 17:19:09
>>568これなら問題ない

#include <iostream>
#define private public
#define class struct

class Test {
int x;
public:
void print() const {
std::cout << x << std::endl;
}
};

int main()
{
Test x;

x.x = 1;
x.print();
}

570 :デフォルトの名無しさん:2010/01/02(土) 17:52:51
>>569
いや、俺が想定しているのは
template <class T>〜
ってところなんだけど。

571 :デフォルトの名無しさん:2010/01/02(土) 18:11:25
>>570
typename使え

572 :デフォルトの名無しさん:2010/01/02(土) 19:41:31
>typename使え
うぜーなこいつw

573 :570:2010/01/02(土) 19:43:27
>>571
バカだ。。。バカがいるぞwwwwww

574 :デフォルトの名無しさん:2010/01/02(土) 22:33:04
C++で使えるパーサには
flex, bison, Boost.Spirit
等など 色々あるみたいですが、

 1. 習得しやすさ
 2. 対応コンパイラの多さ
 3. できることの広さ
 4. 将来性

等を総合的に見て、どのパーサが一番良いのでしょうか?
そのパーサを習得しようと思います。


575 :デフォルトの名無しさん:2010/01/02(土) 23:18:03
Boost.Spirit!!

576 :デフォルトの名無しさん:2010/01/02(土) 23:18:51
やめて!

577 :デフォルトの名無しさん:2010/01/02(土) 23:20:34
flexはパーサーじゃなくてレキシカルアナライザー(トークン分割)

578 :デフォルトの名無しさん:2010/01/02(土) 23:20:50
flex と bison じゃ、出来ること違うし。

579 :デフォルトの名無しさん:2010/01/02(土) 23:23:37
spiritって禿しく遅いよね

580 :デフォルトの名無しさん:2010/01/02(土) 23:26:38
メモリも超食うよね

581 :デフォルトの名無しさん:2010/01/02(土) 23:28:01
誰がデブハゲだって?

582 :デフォルトの名無しさん:2010/01/02(土) 23:32:36
>>574
とりあえず、二つに分けて LR と LL という方法がある。
yacc と ANTLR がそれぞれの方法の代表なので、それで調べてくれ。
どちらがいいかという話は、宗教論争になる。

583 :デフォルトの名無しさん:2010/01/03(日) 00:02:27
いやいや宗教論争じゃないから処理時間オーダーの性質だとか適した言語パラダイムだとかいろいろ性質の違いがあるから。

584 :デフォルトの名無しさん:2010/01/03(日) 00:48:11
>とりあえず、二つに分けて LR と LL という方法がある。
ここはいい。

>どちらがいいかという話は、宗教論争になる。
けど、ここはなんで?

585 :574 :2010/01/03(日) 09:34:02
ありがとうございます。
flex + bison
Spirit
と分けるべきでしたか。
LL法とLR法ですが、現在ではLR法の方が主流という話も伺っています。


586 :デフォルトの名無しさん:2010/01/03(日) 11:33:40
テンプレートについて質問です。

class Hoge{
 int hoge(void);
};
class Piyo{};
//↓多重継承したクラス
class Fuga:public Hoge,public Piyo{
};
このようなクラスがあった時に

void getPointer(void** v){return 何か;}

template<typename T,typename B,int (B::*Func)(void)>
int foo(){
 T* t;
 getPointer(&t);      //どこかからT型のポインタを取得。B型のポインタではまずい
 return (t->*Func)();
}
int i = foo<Fuga,Hoge,&Fuga::hoge>();//Fuga->hoge()を呼び出させる

こういうことをしたいのですが、現状では上記のようにFuga::hogeをテンプレート引数で渡そうとすると
内部的にHoge::hogeとして見られてしまい、結果的にもう一つHoge型を引数で渡さないと、そんなメンバ関数ポインタ無い!と
コンパイラに怒られてしまいます。これをどうにかして
foo<Fuga,&Fuga::hoge>()
で呼び出したいのですが、何か手はありますでしょうか?


587 :デフォルトの名無しさん:2010/01/03(日) 11:34:45
すみません。訂正です

× void getPointer(void** v){return 何か;}

○ void getPointer(void** v){(*v) = 何か;}

588 :デフォルトの名無しさん:2010/01/03(日) 12:16:42
発見した。

If the member is a nonstatic member of class C of type T,
the type of the result is ``pointer to member of class C of type T.
 
 struct A { int i; };
 struct B : A { };
  ... &B::i ... // has type int A::*


というわけで、テンプレートパラメータでは無理そう。

foo<Fuga,(int (Fuga::*)())&Fuga::hoge>() ;


589 :デフォルトの名無しさん:2010/01/03(日) 12:18:53
答えになってないかもしれないけど、設計がすごく悪いように見える…
テンプレートではなくクラスのポリモーフィズムで解決すべきじゃ?

fooの内部で呼び出す関数名(Func)が固定と言うことは
fooのテンプレート引数に渡されるクラスは全部Funcを持ってる前提なんだから
HogeやFuga等に直接その名前(Func)で実装するべき
Funcを持ってるクラスのポインタをgetPointer()が返せば
getPointer()->Func()で済むのでfooは不要

590 :デフォルトの名無しさん:2010/01/03(日) 14:11:31
現在C++をネットで勉強中です…
s = fscanf(stdin, "%3[a-z]%*[a-z]%3[A-Z]%*[A-Z]%3[0-9]", x, y, z);
  この例では,配列 x,y,z が3文字までのため,4文字目以降の該当文字列を切り捨てる
  (次の配列に読み込まれない)ように %*[ ] で余分な文字列をスキップします。
----
上記のような *[  ]%の使い方に限らず、ググっても出てこないような 「え…そんなことできるのか」って方法はみなさんどうやって知りました?
市販の本を買えば当たり前な感じで書かれているんでしょうか、それとも探索中に行き当たりばったりで覚えるものでしょうか。

591 :デフォルトの名無しさん:2010/01/03(日) 14:17:54
とりあえず10冊は読めばいいと思うよ。

592 :デフォルトの名無しさん:2010/01/03(日) 14:24:34
それはC++じゃなくてCの頃の機能だからCの本読んだ方がいいよ

593 :デフォルトの名無しさん:2010/01/03(日) 15:36:14
>>588
まさかとは思いましたが、やはりだめですか。
まぁ、キャストで行けるのはせめてもの救いですね・。ありがとうございました。
>>589
実は今やってるのはSquirrelというスクリプトにC++のクラスをバインディングするというもので
テンプレート引数には全く関係ないクラスが指定されるので、ポリモーフィズムでやるのは現実的ではないんです。

BCCじゃなければ素晴らしいバインダをそのまま使えるのに・・・orz

594 :デフォルトの名無しさん:2010/01/03(日) 15:56:02
>>593
それならどちらにせよ綺麗には実装できないんだから
自分ならいっそマクロで書いちゃうかも

テンプレート引数が汚くなるのがなんか好きじゃないんだけど
みんなはそんなことないんだろうか

595 :デフォルトの名無しさん:2010/01/03(日) 16:08:48
>>594
自分もこっからはマクロでやります。
ちょっと気になったんですが、マクロに複雑な型の記述を渡すと失敗するんですが、なんですかこれは

#define FUNC(name) name,#name

registFunction( FUNC(func<Hoge,&Hoge::hoge>) );

こんなんやるとマクロの引数の数が違うと出ちゃいます・・・

596 :デフォルトの名無しさん:2010/01/03(日) 16:37:58
>>595
テンプレート引数のカンマが、マクロ引数のデリミタとして扱われてるんだろ。
BOOST_PP_COMMA( ) 使うとか。

597 :デフォルトの名無しさん:2010/01/03(日) 17:43:13
やっぱマクロって廃止できねーよな−。
超便利だもん。


598 :デフォルトの名無しさん:2010/01/03(日) 19:03:15
>>596
ありがとうございます。なんかboost使えないんでこんなの定義しました。

#define ORE_COMMA ,

いいのかなぁ・・・

599 :デフォルトの名無しさん:2010/01/03(日) 19:13:34
>>598
ちなみにそれ、ちゃんと動くのかい?

600 :デフォルトの名無しさん:2010/01/03(日) 19:30:01
ディスプレイに酒をぶっかけてしまった

601 :デフォルトの名無しさん:2010/01/03(日) 19:43:07
動きました。マクロ展開のルールからすればとりあえずは合っていますが、問題ないのかなぁ・・・

602 :デフォルトの名無しさん:2010/01/03(日) 20:08:19
>>601
> 動きました。
ならおk。

> マクロ展開のルールからすれば
そんなもん、従ってない環境が多すぎるから
とにかく目の前のもので動けばおkとするしかないと思うよ。

603 :デフォルトの名無しさん:2010/01/03(日) 21:19:43
なるほど、その問題意識は持っておこうと思います。

604 :デフォルトの名無しさん:2010/01/04(月) 16:16:39
javaだとinstance.hoge(String.class);で、クラスのインスタンス化を遅らせる事ができるけど
C++はクラスのポインタを渡すしか、方法が無いんですか?

605 :デフォルトの名無しさん:2010/01/04(月) 16:27:09
アブストラクトファクトリパターン

606 :デフォルトの名無しさん:2010/01/04(月) 19:42:08
専ブラのコードを読んでいたら、_WIN32ってマクロが出てきました
visual studioのマクロ(?)なのですが、他のコンパイラで_WIN32をコンパイルするとどうなるのですか?
gccでちゃんとコンパイルができるのですが

607 :デフォルトの名無しさん:2010/01/04(月) 20:34:31
>>606
_WIN32定義済みマクロは、Windows環境で定義される。でこうやって使う。
#ifdef _WIN32
Windows環境でしかコンパイルされないこと色々
#endif

608 :606:2010/01/04(月) 21:12:22
>>607
なるほど、他のOSだと_WIN32の所は無視されるわけですね
ちなみに、定義されていないマクロは全て無視されるのですか?
#ifdef HOGEHOGE
無視される?
#endif

609 :デフォルトの名無しさん:2010/01/04(月) 21:25:43
>>608
> ちなみに、定義されていないマクロは全て無視されるのですか?
君の言っていることを文字通り解釈すると・・・

 無視されるのではなくプリプロセスエラーになる。

つーかそんくらい自分でためせ。




HOGEHOGEが定義されていない状態で
/********************************************************/
#ifdef HOGEHOGE
 コードA
#elif
 コードB
#endif
/********************************************************/
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
/********************************************************/



コードB

/********************************************************/
となる。

610 :デフォルトの名無しさん:2010/01/04(月) 21:30:11
コメントは残るの?

611 :デフォルトの名無しさん:2010/01/04(月) 21:34:49
>>610
残らない。
・・・まあやっぱそういう指摘はしたくなっちゃうよなw

単に説明のため残しただけなのだ。


612 :608:2010/01/04(月) 22:30:56
>>609
説明感謝します

613 :デフォルトの名無しさん:2010/01/05(火) 02:04:58
コードB
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは


になるんじゃないか!?

614 :デフォルトの名無しさん:2010/01/05(火) 06:33:17
>>613
何の話を言ってる?

615 :デフォルトの名無しさん:2010/01/05(火) 12:59:24
C++でクラスをヘッダに書くときってさ、

class ABC
{
  int* object1; // int*
  int *object2; // int *

public:
  // 以下略
};

どっちで書く?

616 :デフォルトの名無しさん:2010/01/05(火) 13:05:08
ホワイトスペースは問答無用でなし

617 :デフォルトの名無しさん:2010/01/05(火) 13:17:38
>>615 ポインタの宣言をどう書くかってこと?クラスとかヘッダとか関係なくね?

618 :デフォルトの名無しさん:2010/01/05(火) 14:10:43
ポインタも型のうちのひとつととらえた方が理解が容易なので前者が好み。けして押し付けないけどね。

int* a, *b;
みたいな書式は相容れないので使わない(えない)。
そもそもこの書式、コンマ区切りの式文?と衝突してしまうような。

619 :デフォルトの名無しさん:2010/01/05(火) 17:18:58
最近はどっちとか聞く奴が殴りたおしたくなるくらい鬱陶しいので
int*a;
と空白をいれずに書いてる。

620 :デフォルトの名無しさん:2010/01/05(火) 17:19:51
それなら
int * a;
と書いても良いのではないか?

621 :デフォルトの名無しさん:2010/01/05(火) 17:24:12
まあ標準のヘッダみて真似するとかコンパイラにプロトタイプ出させてみるとか

622 :デフォルトの名無しさん:2010/01/05(火) 17:43:10
>>620
それでもいいんだけど、
正直、行中の空白の有無で可読性なんて、個人的には殆ど変わらないので
キーボードを打つ回数少ない空白なしが好き。

623 :デフォルトの名無しさん:2010/01/05(火) 17:48:55
placement new について教えてください。
newと同じようにdeleteしないとメモリリークの要因になりえますか?

624 :デフォルトの名無しさん:2010/01/05(火) 17:57:03
>>582,584
二つじゃないよ。

625 :デフォルトの名無しさん:2010/01/05(火) 17:58:19
二つで十分ですよ
分かってくださいよ

626 :デフォルトの名無しさん:2010/01/05(火) 18:00:03
正確に言うと4つ。
RRとRLもあるよね。

627 :デフォルトの名無しさん:2010/01/05(火) 18:02:13
ノー、ツーツーフォー

628 :デフォルトの名無しさん:2010/01/05(火) 20:28:25
>>623
なるよ!。デストラクタ呼ぶのを忘れずにね

629 :>574:2010/01/05(火) 20:48:55
Boost.Spiritが一番いいんですかねぇ。
コンパイル時間が長いとかはまあ我慢できる範囲だとは思いますが、
コンパイラを選びまくりそうでどうにも気が引けてきます。
趣味で使っているコンパイラは通ると思いますが、
現在仕事で使っているあのコンパイラで通るのだろうか?・・・と考え始めると。。。

630 :デフォルトの名無しさん:2010/01/05(火) 22:17:40
Boostのライブラリは、メジャーなコンパイラはほとんど網羅してるよ。
テンプレート周りの挙動が怪しい環境でもけっこう動く。

まあSpiritに限ってはなんともいえんがw

631 :デフォルトの名無しさん:2010/01/05(火) 22:22:06
>>630
そうなんですか
テンプレートばりばりって聞いていたので、ちょっと不安でしたが。
試してみます。
ありがとうございます。

632 :デフォルトの名無しさん:2010/01/05(火) 22:30:52
やるならSpirit v2じゃなくてclassicのほうにしといたほうがいいね。
v2はもう正式採用とはいえ、まだBetaという印象。

633 :デフォルトの名無しさん:2010/01/05(火) 22:34:26
>>632
ありがとうございます。
既に最新のBoost入れてしまいましたが、もしかしてまだ残っていたり
しますか?


634 :デフォルトの名無しさん:2010/01/05(火) 23:39:18
>>633
v1.6以前(classic)使ったコードは最新版でも問題なく通る。
(This header is deprecated. とwarningが出るが)

もう持ってるかもしれないがBoost本の「Boost C++ Librariesプログラミング」なんかも
v1.6時点でサンプル書かれてるから、勉強もしやすいと思う。
警告が気になる場合は、放置しても問題ないが
・メッセージに従ってincludeするヘッダを変更
・参照する名前空間をboost::spiritからboost::spirit::classicに変更
これでおk。

あ、俺はBoost厨だからSpirit薦めるけど、yaccとか他のツールは
触ってみた程度だから比較検討は自分でお願いします。

635 :デフォルトの名無しさん:2010/01/05(火) 23:50:22
>>626
知らないな。
原理的にはLLとLRで十分だろ。
もしかして、他にTとかBもあるの?

636 :デフォルトの名無しさん:2010/01/06(水) 00:25:50
spirit classicは字句解析を通さないからバックトラックする場合は遅いよ。
それでも正規表現よりは早いけど。

637 :デフォルトの名無しさん:2010/01/06(水) 00:30:49
>>614
#elseじゃなくて#elifになってると言いたいのでは?

638 :633:2010/01/06(水) 00:34:09
>>634
ありがとうございます。
『Boost C++ Librariesプログラミング』は第2版を初めて購入し、
現在も持っております。
実は以前Boost.Spiritを使ったことがあるため
もう ろくに記憶にないとはいえ一番なじんでいるかもしれません。

>>636
ありがとうございます。
特定の組み込み系とかでどうしても必要な場合を除けば
速度より動くこと(確実さ・機能・可読性)を優先すべき
と(私の持論として)思っているので、正直速度はそこまでは気にしません。




639 :609:2010/01/06(水) 00:35:56
>>637
ああごめん、そういうことか。

まあその場合は

 >>613ではなくプリプロセスエラーになる。

が正解です。


640 :デフォルトの名無しさん:2010/01/06(水) 00:40:15
>>637
多分

/********************************************************/
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
/********************************************************/

じゃなくて

/********************************************************
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
********************************************************/

こうだろって話かと。

641 :デフォルトの名無しさん:2010/01/06(水) 00:45:47
>>623
配置deleteが何もしないなら
deleteを呼び出さなくても問題ない(行儀は悪い)
ただしデストラクタは呼び出す必要がある


642 :デフォルトの名無しさん:2010/01/06(水) 01:04:36
>>623
placement new と言うと、標準ライブラリ <new> で宣言されてるやつのことを指したり、
そいつを含んで追加の引数を持つ operator new 全体を指したりして、話がよくわからない。
どっち?

643 :デフォルトの名無しさん:2010/01/06(水) 01:50:16
void T::reconstruct() {
 this->~T();
 new (this) T();
}
で使う奴のことだろ。

644 :623:2010/01/06(水) 14:16:20
>>628
ありがとうございます。
やはりそうですよね。

>>641
なるほど。

>>642
標準ライブラリ <new> の方です。


皆様、ありがとうございました。
問題箇所と認識してコード修正します。


645 :デフォルトの名無しさん:2010/01/06(水) 18:07:00
自作スマポ(参照カウント方式)を作っています。
循環参照の解決の機構を考えているのですが、
Pythonの方式よりも高速にできる方法を探しています。
いい方法はないでしょうか?

646 :645:2010/01/06(水) 18:09:52
template<class T> struct ptr_inner
{
  T* refObject;
  int count;
};

template<class T> class smart_ptr
{
  ptr_inner* _inner;
  // 省略
};

647 :645:2010/01/06(水) 18:11:25
ptr_inner<T>でした。

648 :デフォルトの名無しさん:2010/01/06(水) 18:36:12
C++を初歩から講義して頂けるスレってありませんか?
質問が出たら回答するタイプのスレではなくて
一方的に教えていただけるようなスレがありませんか?

649 :デフォルトの名無しさん:2010/01/06(水) 18:45:41
何でも実況vipの実況vip大学スレで運がよければ講義してもらえるかもね

650 :デフォルトの名無しさん:2010/01/06(水) 19:40:02
スレ立てれば?

651 :デフォルトの名無しさん:2010/01/06(水) 19:52:37
へー、
参照カウントでも循環参照を解決できるんだ。
全然しらんかった。。。


652 :デフォルトの名無しさん:2010/01/06(水) 19:53:24
>>648
一方的でいいなら教科書でいいじゃん。

653 :デフォルトの名無しさん:2010/01/06(水) 19:56:39
>>652
俺もそれおもた

654 :デフォルトの名無しさん:2010/01/06(水) 20:03:30
>>645
わからん

655 :デフォルトの名無しさん:2010/01/06(水) 20:07:23
> Pythonの方式よりも高速にできる方法を探しています。
そんなん見つかったらとっくにPythonが採用しているのではないかね。


656 :デフォルトの名無しさん:2010/01/06(水) 20:10:33
MikePython

657 :デフォルトの名無しさん:2010/01/06(水) 20:11:09
Pythonはメンドイから現在のを保守してるだけだろ

658 :デフォルトの名無しさん:2010/01/06(水) 20:19:40
JPythonの出番ですけ

659 :デフォルトの名無しさん:2010/01/06(水) 20:30:18
>>649
これか
ttp://wiki.livedoor.jp/vip_programming/d/%B2%E1%B5%EE%A5%ED%A5%B0

660 :デフォルトの名無しさん:2010/01/06(水) 20:54:35
>>645 基本的に循環参照は設計で避けられるんだけど、それでも、Observerパターンのような場合は避けられない。
そんな場合でも、カウント式の循環参照の解決は弱い参照(weak_ptr)を使うのが簡単。
ところで、python方式ってどんなのなの?
スマポの設計は勉強になるからね。健闘を祈る。

661 :デフォルトの名無しさん:2010/01/06(水) 20:56:43
>>652-653
最近、他の事だが教えていて思うのは「やる気があるので、一方的に教えても大丈夫」ってのと
「解らないところが判らないので、先回りして全部解るように教えてなくちゃいけない」って
パターンがある事を意識する回数が増えたな、と。

"Hello, World!"の説明で原稿用紙100枚は埋められるぜってのと、説明を三行書けないって
違いかと。

まぁ、でも、言語非特定で演習問題作成スレってのがあってもいいかな、と。
既存の演習問題集は非現実的な場面ばかりでツマランってのはあるし。

662 :デフォルトの名無しさん:2010/01/06(水) 21:06:43
>>661
> "Hello, World!"の説明で原稿用紙100枚は埋められるぜ
俺はそんな変態 知らないぞ。


663 :デフォルトの名無しさん:2010/01/06(水) 21:16:15
>>661
テンプレ作っていただけたらスレ立てします

664 :デフォルトの名無しさん:2010/01/06(水) 21:16:54
>>661
ほんとに初心者をターゲットした内容のスレにしてくださいお願いします

665 :デフォルトの名無しさん:2010/01/06(水) 21:27:02
聞かれてもいないのに親切丁寧に教えてくれるスレ

666 :デフォルトの名無しさん:2010/01/06(水) 21:35:58
>>665
もうちょいセンスの良いスレタイでお願いします

667 :デフォルトの名無しさん:2010/01/06(水) 21:38:53
理系クンが書くレスが理解し難いズレ

668 :デフォルトの名無しさん:2010/01/06(水) 21:46:23
【C++】答えてくれ、頼む【++C】

669 :デフォルトの名無しさん:2010/01/06(水) 21:50:47
【初心者向け】プログラミング演習問題【C++他】


670 :デフォルトの名無しさん:2010/01/06(水) 22:07:51
【2ch】〜未踏プロジェクト〜【人柱】

671 :デフォルトの名無しさん:2010/01/06(水) 22:14:07
おCえてください

672 :デフォルトの名無しさん:2010/01/06(水) 22:18:17
>>669
これいいですね、これで立てたいです
あと>>1の内容も書いてください

673 :デフォルトの名無しさん:2010/01/06(水) 22:18:18
C*-環

674 :デフォルトの名無しさん:2010/01/06(水) 22:19:49
そもそも"Hello, World!"とはね、

675 :デフォルトの名無しさん:2010/01/06(水) 22:29:46
Hello, Worldは韓国が起源です

676 :デフォルトの名無しさん:2010/01/06(水) 22:33:30
【初心者】5分で覚えるこの一文【C++】

677 :デフォルトの名無しさん:2010/01/06(水) 22:39:47
メルマガにありそうな名前だなw

678 :デフォルトの名無しさん:2010/01/06(水) 22:41:22
>>662
真面目に説明すると奥深いぜ。
includeやその先のヘッダファイル、中に書かれているプリプロセッサの解説も出来るし、
coutで書かせてりゃ、クラスとオブジェクト(インスタンス)、静的クラスの説明まで引っ張れるし、
演算子定義も説明できる。

枚数余れば、"Hello, World!"がメモリのどの位置に置かれるかとか、他の書き方ではどう書けるか
とか、その際の式や文の意味の違いとかにも触れれるし。

あとは、コンパイルのやり方説明とかね。そこで、オプションやリンカにまで触れ始めたら、収集つかね
状態で原稿用紙100枚は埋まると思うのだが…

679 :デフォルトの名無しさん:2010/01/06(水) 22:44:50
C++の教科書そんなに薄くありません。

680 :デフォルトの名無しさん:2010/01/06(水) 22:49:48
プリプロセッサで100枚は書ける

681 :デフォルトの名無しさん:2010/01/06(水) 23:01:21
原稿用紙100枚だぜ?
400×100だぞ?

・・・あ、いけるかもw


682 :デフォルトの名無しさん:2010/01/06(水) 23:02:18
プリプロセッサとは、

683 :デフォルトの名無しさん:2010/01/06(水) 23:13:06
>>678
おっとArgument Dependent Lookupを忘れてもらっちゃ困るな

684 :デフォルトの名無しさん:2010/01/06(水) 23:33:17
スレタテまだー?

685 :デフォルトの名無しさん:2010/01/06(水) 23:35:34
今まで書いたソースコードの量をイメージすると
40000字とか
簡単にいくな。


ソースコードが千行越えるとか良くある話。
それ以上は分割するけどさ。


686 :デフォルトの名無しさん:2010/01/07(木) 00:08:03
改行やら何やらで、実質3万7千字とかそんな程度だろうからね。Shift_JISで74KB程度。
そう考えるとチョロいが・・・自然言語を書くのって疲れるからなぁ。

687 :デフォルトの名無しさん:2010/01/07(木) 01:04:50
『ふう、ここまで書いてようやくwc換算で10000文字か。先はまだまだ長いな。』
とか間に挟んじゃうな。俺だったら。

688 :デフォルトの名無しさん:2010/01/07(木) 08:30:27
>>660
Pythonのってあれだろ、マーキングするやつ

689 :デフォルトの名無しさん:2010/01/07(木) 13:41:33
include stdio.hみたいなコードってどんな時に使うのでしょうか?


690 :デフォルトの名無しさん:2010/01/07(木) 14:23:27
何を言っているのかわかりません。

691 :デフォルトの名無しさん:2010/01/07(木) 15:46:21
1ファイルに3万行のソースコードが俺のジャスティス
わざわざ分かれていたのをまとめたんだ

692 :645 ◆GWRSHcLrd6 :2010/01/07(木) 17:28:42
お久しぶりです。
スマートポインタのことでまたお世話になると思うので、とりあえずここで
経過報告させていただきます。

http://cdtest.genin.jp/projects/smart_ptr/index.htm

これからどんどん更新させていただきます。
間違い、バカなことがあったら指摘してください。
なにしろ 学生 + 独学 なので。

よろしくお願いします。

693 :デフォルトの名無しさん:2010/01/07(木) 18:31:48
>>692
スマートポインタならModern C++ Designの7章読んだか?
あとはboost::shared_ptrのリファレンスと実装を眺めるのも有用


694 :645 ◆GWRSHcLrd6 :2010/01/07(木) 18:46:10
>>693
shared_ptrの実装なら眺めたことがあります。
Modern C++ Design ですか。
よく聞くんですけど、読んだことがなかったので
読んでみようと思います。

695 :デフォルトの名無しさん:2010/01/07(木) 18:57:33
>>692
すいません、作って欲しいソフトがあるのですが依頼はダメですか?


696 :645 ◆GWRSHcLrd6 :2010/01/07(木) 19:14:21
構いませんが、そんな大したことはできませんよ(;一_一)
まあ、ものによります…

697 :デフォルトの名無しさん:2010/01/07(木) 19:21:18
ありがとうございます
もし公開するときにHPにアフィリエイトがありましたら一週間程度は踏ませていただきますので宜しくお願いします

ソフトの画面の中にランダムに点を表示して、それを制限時間内に何回クリックできるかってソフト作れませんか?

698 :645 ◆GWRSHcLrd6 :2010/01/07(木) 19:24:14
わかりました。
いつ公開できるかわかりませんが、できたときにはここで通知しますので
よろしくお願いします。

699 :デフォルトの名無しさん:2010/01/07(木) 19:26:49
こちらこそ無理を言って申し訳ありません
645先生と呼ばせていただきます
ありがとうございます

700 :645 ◆GWRSHcLrd6 :2010/01/07(木) 19:27:21
あ、OSとかは??

701 :デフォルトの名無しさん:2010/01/07(木) 19:28:08
WindowsかLinuxならどちらでもOK
マルチプラットフォームなら最高です

702 :デフォルトの名無しさん:2010/01/07(木) 19:28:27
ミス

ありがとうございます
WindowsかLinuxならどちらでもOKです
マルチプラットフォームなら最高です


703 :645 ◆GWRSHcLrd6 :2010/01/07(木) 19:31:38
じゃあすまないんですけど、windowsの方がよく触るのでWindowsで ^^;
windowsだとするとXP以上の対応でいいですか?それによってGDI+を使うか
どうかを考えますので・・・

704 :デフォルトの名無しさん:2010/01/07(木) 19:34:49
他でやってくれ

705 :645 ◆GWRSHcLrd6 :2010/01/07(木) 19:36:50
ですよね。

706 :デフォルトの名無しさん:2010/01/07(木) 19:38:51
ゲ制作板にでもいけば1時間で作ってくれるよ
作る奴が居ればだが

707 :デフォルトの名無しさん:2010/01/07(木) 20:13:21
>>691
>わざわざ分かれていたのをまとめたんだ
やめろよw

708 :デフォルトの名無しさん:2010/01/07(木) 20:33:53
>692-703
どっかいけよ

709 :デフォルトの名無しさん:2010/01/07(木) 20:39:26
645先生のやる気をそぐような言動は慎めよ!

>>703
windowsで大丈夫です。
宜しくお願い致します

710 :デフォルトの名無しさん:2010/01/07(木) 20:47:44 ?2BP(0)
うぜぇ

711 :デフォルトの名無しさん:2010/01/07(木) 20:48:57
>>709
何が先生だwww
いいからどっか消えろ失せろ
スレタイ読め

712 :デフォルトの名無しさん:2010/01/07(木) 20:50:20
な.../ :::早:::::l::::":::::::、:::: :ヽ.::::::::::::::::.:::::.こ:.: 駄.
ん/ :::::::く::::::|::::::::::::::ヽ:::::ヽ`:、:::::::::::::::::い::: 目
と.!:::、::::.:::::::::.l:.:::::::::::::::ヽ::\:::ヽ.::::::::::..つ:. ..だ
か:..: :::|,::: :: :、丶: ヽ: :: :ヽ :::'-::ヽ:::::::::..・ ..
し::::|:::::::y::::::::ヽ:::::ゝ:ヽ,::::::\.::::゙''.::ヽ::::::・: .
な:,:::.l:::::lヽ::::::::、:":::::、: 、:::::::゙'.l'-、::.:l::::・::.: .
い.!:,::::ミ、:゙!,ヽ::::: l::::.\ヽ,\::..,.\\.l::.::::: ...
と.! l::.:::、::::l从_:::::l::,,'.:/_、ニ,,__、i::|:、''"!:::::::, .
.・:::.ゝ. !./゙! :^lゝ\|::l ゞ='ハ":`.,!`)l:'":::::":::/ ..
.・::ヘ::: `''`:ゝ-:"::::::::ソ":.、:´ `-'‐' ι,.|,i::i'::::/..
.・. ::ミ `::::::::::::::::::::::::         ノ.|.l::::i./ ...
.  ヽ''l、:::::::::::::::::::         .i .,l/::::|:,i"
    .'ル:::::::::::::::::ゝ_-       U,..l,i|::l/:. .
.      ヽ::::::::             ゙'/ゞ.从、.! ...
     . ヽ::::::`ヽ..二"''‐    / ,i゙.::|"l/‐ .
      /゙:、::: `―    ./,,、/ .゙| ! ......
    /  .ヽ: \    _/ / l./  ゙
. , /    l ヽ .`'― :(,゙/゙  //


713 :デフォルトの名無しさん:2010/01/07(木) 21:30:49
http://cdtest.genin.jp/projects/2ch_proj.zip
とりあえずC#で適当に作りました。
これから時間のあるときにC++でコーディングしていくので、
ビルドできればしてみてください。

>>709
・・・ここは確かにスレチです。

714 :デフォルトの名無しさん:2010/01/07(木) 21:31:10
>>691
名前がぶつからないのが奇跡

715 :645 ◆GWRSHcLrd6 :2010/01/07(木) 21:31:41
>>713 == 645

716 :デフォルトの名無しさん:2010/01/07(木) 21:33:12
>>714
ぶつかってたら別れてても普通コンパイルできなくないか?

717 :デフォルトの名無しさん:2010/01/07(木) 21:37:06
>>713
いい子やw

718 :デフォルトの名無しさん:2010/01/07(木) 21:45:45
>>716
static foo() とかよく使いませんか?

719 :デフォルトの名無しさん:2010/01/07(木) 21:49:50
派生クラス全部について自動変数を作れなく、かつnewできるようにする方法ってありますか?

720 :デフォルトの名無しさん:2010/01/07(木) 21:50:20
俺はクラスのテストのことなら他のヘッダなりcppなりに書きまくる。


721 :デフォルトの名無しさん:2010/01/07(木) 22:42:27
>>719
よくわからない。

722 :デフォルトの名無しさん:2010/01/07(木) 22:49:21
>>719
自動変数を作れなくする方法はあるが、派生クラスを全部で禁止する方法は無さげ。
てかそんな必要があるのかを考えたほうがよくね?

723 :デフォルトの名無しさん:2010/01/07(木) 22:50:09
>>714
そうでもなくないか?
だってもともとリンクしてぶつからないわけだろう?
さらに名前空間をちゃんと分けていれば
結構どうにかなると・・・思う。

724 :デフォルトの名無しさん:2010/01/07(木) 23:10:39
>>713
バイナリ入ってない

725 :デフォルトの名無しさん:2010/01/07(木) 23:20:48
>>724
だからどうでも良いって言ってるだろ

さっさと失せろ低能

726 :デフォルトの名無しさん:2010/01/08(金) 09:18:18
>>725
ニートだまれ

727 :デフォルトの名無しさん:2010/01/08(金) 10:04:05
>>722
侵入型参照カウンタをベースにしようと考えてます
そうすると自動変数でreleaseメンバーを封印するか、自動変数を封印するかしないとダメだとおもうので必要性はあるかと

728 :デフォルトの名無しさん:2010/01/08(金) 10:30:01
>>727
やっぱり必要ないような。
「〜を封印」しないと、どんな問題が起こるのを心配してるの?

729 :デフォルトの名無しさん:2010/01/08(金) 10:46:46
自動変数にreleaseしてdeleteしてしまうかもしれないので危険じゃないかなーと

730 :デフォルトの名無しさん:2010/01/08(金) 10:53:05
>>729
それって、 int a; delete &a; してしまうかもしれないので危険だ、と言うのと同じじゃない?
気にしてもしょうがないような。

とりあえず release() は private にしといて、専用の関数を friend で指定しとくのがいいと
思う。それで十分だとも思う。

731 :デフォルトの名無しさん:2010/01/08(金) 11:00:23
vector<Node*> a;
vector<Node*> b;

aとbの配列があってその中から共通のNode*だけを取り出したいのですが
どうすればいいでしょうか

732 :デフォルトの名無しさん:2010/01/08(金) 11:17:15
わかったからもう良いです。

733 :デフォルトの名無しさん:2010/01/08(金) 11:17:23
両方sortしておいてset_intersection

734 :645 ◆GWRSHcLrd6 :2010/01/08(金) 18:40:06
テンプレートクラスの中のテンプレート関数は
宣言と実装を別にするとコンパイルは通らないものなんでしょうか。

template<class T> struct hoge
{
  template<class U> void abc(U* obj);
};

template<class T, class U> hoge<U> hoge<T>::abc()
{
  return hoge<U>();
}

エラーが出ます。

735 :645 ◆GWRSHcLrd6 :2010/01/08(金) 18:42:41
error C2244: 'hoge<T>::abc' : 関数の定義を既存の宣言と合致させることができませんでした。
  定義
    'hoge<U> hoge<T>::abc()'
  既存の宣言
    'hoge<U> hoge<T>::abc()'

736 :質問:2010/01/08(金) 18:47:54
C++用の画像ライブラリで、静的リンクしてもソースコード公開義務が発生しなくて、
いろんな画像形式に対応していて、
画像を拡大したり縮小したりフィルタをかけたりする事ができるもので
もっともメジャーなものって何でしょうか?

737 :645 ◆GWRSHcLrd6 :2010/01/08(金) 18:49:46
template<class T> struct hoge
{
  template<class U> void abc(U* obj);
};

ではなく

template<class T> struct hoge
{
  template<class U> hoge<U> abc();
};

でした。

738 :デフォルトの名無しさん:2010/01/08(金) 18:50:13
>>736
boost

739 :デフォルトの名無しさん:2010/01/08(金) 19:26:09
>>734
template<class T> template<class U> hoge<U> hoge<T>::abc()
{
  return hoge<U>();
};

740 :デフォルトの名無しさん:2010/01/08(金) 19:34:38
>>738
boostにそんなものあんの?w

741 :デフォルトの名無しさん:2010/01/08(金) 19:52:36
>>736
OpenCVとかじゃね? 確かBSDライセンス
何が一番メジャーかって言われると俺もわからん

742 :デフォルトの名無しさん:2010/01/08(金) 19:55:50
DxLib使えよカス

743 :デフォルトの名無しさん:2010/01/08(金) 19:58:41
>>742
何それ?
directxのこと?

744 :デフォルトの名無しさん:2010/01/08(金) 20:06:33
すいません、どなたかこのテキストエディタを日本語対応にしていただけませんか?
ttp://www.moongift.jp/2010/01/notepad-gnu/

もしおりましたらソフトウェア板に専用スレ立てます

745 :デフォルトの名無しさん:2010/01/08(金) 20:12:59
>>744
いや、常識で判断しろよ。
それをこのスレできくのか?

746 :645 ◆GWRSHcLrd6 :2010/01/08(金) 20:25:36
できました。ありがとうございます。

747 :デフォルトの名無しさん:2010/01/08(金) 20:43:06
>>745
すいませんでした
他のスレに言ってきます

748 :デフォルトの名無しさん:2010/01/08(金) 21:02:58
>>747
それが平和だ。

749 :デフォルトの名無しさん:2010/01/08(金) 21:05:33
よし、二度と来るなよ

750 :747:2010/01/08(金) 21:06:43
      ハ,,ハ
     ( ゚ω゚ )  お断りします
    /    \   ハ,,ハ お断りします
  ((⊂  )   ノ\つ))( ゚ω゚ )
     (_⌒ヽ((⊂ノ   ヽつ ))
      ヽ ヘ }  (_⌒ヽ
 ε≡Ξ ノノ `J   ノノ `J

751 :デフォルトの名無しさん:2010/01/08(金) 21:11:01
>>750
お前勝手に騙るなボケ

752 :デフォルトの名無しさん:2010/01/08(金) 21:11:56
>>751
>>501 の言う通り、バカがいるんだなぁ。

753 :デフォルトの名無しさん:2010/01/08(金) 21:13:23
ここまで俺の自演

754 :デフォルトの名無しさん:2010/01/08(金) 21:59:58
二次元の敗北、三次元の逆襲

755 :デフォルトの名無しさん:2010/01/08(金) 22:03:01
まあ、2つのことを同時にやろうとして
わけが分からなくなることは初心者にはありがちだな。

756 :デフォルトの名無しさん:2010/01/08(金) 22:25:42
Techniques for Scientic C++
http://www.cs.indiana.edu/pub/techreports/TR542.pdf

757 :デフォルトの名無しさん:2010/01/08(金) 22:33:49
>>756
これがどうかしたの?

758 :デフォルトの名無しさん:2010/01/09(土) 09:53:58
>740
単体では「色々な画像形式に対応していて」を満たさないと思うが GIL がある。

759 :722:2010/01/09(土) 11:22:03
>>727 スマポの研究者の方だったんですね。なら、話は限定される。
自動変数を禁止するには、デストラクタをprivateあるいはprotectedにするだけで十分です。でも、派生させるとデフォルトデストラクタがpublicになって保護できないので不完全。
自動変数禁止の目的は自動変数をスマポに代入するミスの保護だと思うけど、&オペレータをprivateにすれば自動変数をスマポに代入できなくるので保護できる。自動変数は速いので禁止するのはもったいないです。


760 :デフォルトの名無しさん:2010/01/09(土) 11:37:21
うんこ

761 :645 ◆GWRSHcLrd6 :2010/01/09(土) 16:23:00
>>759
僕じゃないです ^^;
でもとても参考になりました。

762 :645 ◆GWRSHcLrd6 :2010/01/09(土) 17:14:38
http://cdtest.genin.jp/projects/smart_ptr/index.htm

スマートポインタとしての基本的な部分を実装しました。
問題点などあったら教えていただけると幸いです。

次はDeleterか循環参照解決を実装したいと思っています。

763 :デフォルトの名無しさん:2010/01/09(土) 17:39:16
>>762
> class _null {};
> struct __ptr;
予約識別子。未定義動作。

適切なライブラリヘッダの #include なしで NULL は使えない。コンパイルエラー。

ファイル終端に改行が無い。未定義動作。

smart_ptr<T>::__ptr::Inc() で INT_MAX を超えないうちに「超えました」のエラー。
しかもそこで投げるのは bad_alloc じゃないだろう。
bad_alloc だとすれば #include するヘッダが間違ってる。 <new> が正解。

smart_ptr<T>::Reset() では強い例外保証がほしいところ。

764 :デフォルトの名無しさん:2010/01/09(土) 19:51:21
shared_ptrとはどう違うの?

765 :645 ◆GWRSHcLrd6 :2010/01/09(土) 20:26:59
>>763

>> class _null {};
>> struct __ptr;
>予約識別子。未定義動作。
そうでした・・・

>適切なライブラリヘッダの #include なしで NULL は使えない。コンパイルエラー。
すみません。<cstdio>をインクルードしました。

>ファイル終端に改行が無い。未定義動作。
開いてませんでした・・・orz

>smart_ptr<T>::__ptr::Inc() で INT_MAX を超えないうちに「超えました」のエラー。
修正しました。ありがとうございます。

>しかもそこで投げるのは bad_alloc じゃないだろう。
そうですね… とりあえずoverflow_errorに変更しました。

766 :645 ◆GWRSHcLrd6 :2010/01/09(土) 20:28:57
>>764
循環参照の解決の機構を実装しようかと思っています。


修正したソースをうpしました。
http://cdtest.genin.jp/projects/smart_ptr/index.htm

767 :デフォルトの名無しさん:2010/01/09(土) 20:34:41
>>764
重要なのは、使ってるだけでは気づかないスマポ実装のノウハウが学べられことかな。
>>762
キャストでオブジェクトが複数のinner_ptrから参照されるようになってしまうのは良くない。

こんな使い型の落とし穴があるよ。
Hoge* p=new Hoge();
smart_ptr<Hoge> a=p;
delete p;
暗黙の変換でポインタが代入できてしまうミス。スマポ外で管理されてるポインタをスマポが横取りしてしまう。
explicitにする必要あり。そうするとこういう書き方しかできなくなる。
smart_ptr<hoge> a(new Hoge());

a=a;
参照カウントが減って開放されてしまう。



768 :デフォルトの名無しさん:2010/01/09(土) 20:38:32
>>765
なんで例外保証の件だけスルーしたの?

769 :デフォルトの名無しさん:2010/01/09(土) 20:38:43
>>765
32bit環境下ではINT_MAXを超えるのは不可能だからチェックは要らなくない気がする。
64bit環境ではlong longにすれば同様になると

770 :デフォルトの名無しさん:2010/01/09(土) 20:42:08
>>765
NULL 使うためだけに cstdio とか、アホか。
0 にしとけ。どうしても NULL が使いたいならせめて cstddef で済ませとけ。

771 :デフォルトの名無しさん:2010/01/09(土) 20:46:29
どうせなら、NULLはc++0xで標準になるnullptrにしようよ。
nullptrでググると現在のコンパイラでも使える定義が出てくるよ。


772 :645 ◆GWRSHcLrd6 :2010/01/09(土) 20:46:48
>>767

>キャストでオブジェクトが複数のinner_ptrから参照されるようになってしまうのは良くない。
一応カウントは共有しているのですが…
キャストはユーザー?(開発者)に任せた方がよいのですかね。

>参照カウントが減って開放されてしまう。
本当ですか!?そこまで気付かなかった…

>暗黙の変換でポインタが代入できてしまうミス。スマポ外で管理されてるポインタをスマポが横取りしてしまう。
やっぱりそうですか。shared_ptrを使っていて不便に思っていたもので… やはりミスの要因になりかねませんよね。




773 :デフォルトの名無しさん:2010/01/09(土) 20:49:08
>>769
> 32bit環境下ではINT_MAXを超えるのは不可能

Windows 限定なら、ってこと?
そうじゃなければアドレス空間 32bit で int が 16bit とか、 int は 32bit だけど
アドレス空間はもっとあるとか、不可能とは言い切れないと思うんだけど。

カウンタを uintptr_t にしとけば確実かな?

774 :デフォルトの名無しさん:2010/01/09(土) 20:50:12
>>772
inner_ptrを共有すれば問題無い。
キャストは必要なので用意したほうがいい。

775 :645 ◆GWRSHcLrd6 :2010/01/09(土) 20:54:37
>>768
すいません、書き忘れました。
例外保証についても修正しなければなりませんね…

>>773
uintptr_tですか。置き換えておきます。

776 :645 ◆GWRSHcLrd6 :2010/01/09(土) 20:57:04
>>770
置き換えておきます。

>>774
inner_ptrを共有すると、仕組みが複雑になってしまうので…

777 :デフォルトの名無しさん:2010/01/09(土) 21:01:54
uintptr_tの最大値ってマクロ定義されてるっけ?

778 :デフォルトの名無しさん:2010/01/09(土) 21:05:24
>>777
numeric_limits を使えば問題ない。
でも、ここでは最大値のチェックを不要とするために uintptr_t を使うって話だから、
あんまり関係ないかも。

あれ? uintptr_t って C++ 2003 に入ってたっけ?

779 :645 ◆GWRSHcLrd6 :2010/01/09(土) 21:17:28
>>770
#ifndef NULL 〜 #define NULL 0 にしました。

>>778
メモリの制約、ということで、オーバーフローチェックは省きました。

780 :デフォルトの名無しさん:2010/01/09(土) 21:23:41
>>776
inner_ptrの共有のほうがメリットがあるので、気が向いたときにでも検討してね。


781 :デフォルトの名無しさん:2010/01/09(土) 21:31:12
>>779
> #ifndef NULL 〜 #define NULL 0 にしました。

なんでそういうことしちゃうかなー。 >>770 の2行目をもう一度読み直して欲しい。

782 :デフォルトの名無しさん:2010/01/09(土) 21:32:43
いや、ここはnullptrでよろしく

783 :645 ◆GWRSHcLrd6 :2010/01/09(土) 21:38:55
わかりました。可読性を上げようかと思ったのですが、
変えてみてもそんなに変わらないし、cstddefをインクルードするほどではないので
0で置き換えます。

784 :デフォルトの名無しさん:2010/01/09(土) 21:43:52
C++でNULLって使わなくね?
完全には無理だがほとんど空ポ自体使わないように設計できるし、使ったとしてもやっぱ0だよ

785 :645 ◆GWRSHcLrd6 :2010/01/09(土) 21:44:02
>>780
どのようなメリットがあるのか教えていただけると幸いです。
というより内部のデータはどう扱えばいいのでしょうか?
テンプレートクラス内部なので…
Deleterを実装すれば簡単なのですが。

786 :デフォルトの名無しさん:2010/01/09(土) 21:45:17
スマポを作るのに空ポがいらない設計があるなら教えてほしいものだ

787 :デフォルトの名無しさん:2010/01/09(土) 21:48:10
いや、実体は shared_ptr だけどヌルを許容しない shared_ref とかいうやつがあれば、
意外と有用かもしれない。

788 :デフォルトの名無しさん:2010/01/09(土) 21:50:41

1. #define NULL
  または
  #include <cstddef>する
2. 0
3. やっぱり
  #ifndef _HAS_CPP_0X
  #define nullptr 0
  #endif

789 :デフォルトの名無しさん:2010/01/09(土) 21:54:26
>>786
bool is_null;
ってメンバをチェックするようにすればいい。

790 :デフォルトの名無しさん:2010/01/09(土) 21:57:39
>>788
つ 3番

791 :デフォルトの名無しさん:2010/01/09(土) 22:00:23
>>785
internal_ptrがとcountが別々だとアロケートやコピーにコストがかかっちゃうし。
オブジェクトを掴むinternal_ptrが複数あると将来的に管理が面倒になりそう。1オブジェクト1internal_ptrの方が簡単になりそう。



792 :デフォルトの名無しさん:2010/01/09(土) 22:06:18
>>787
shared_ref<hoge> r1(param1,param2,...); //初期化が必須
shared_ref<hoge> r2=r1; //ok
shared_ptr<hoge> p;
p=r; //ok
r=p; //だめ
こんな感じか?。これなら意味があるね。


793 :645 ◆xj5aoi8gEM :2010/01/09(土) 22:08:02
>>791
なるほど、Deleterが実装できた場合は置き換えたいとおもいます。

>>788
・・・どうすれば??

794 :デフォルトの名無しさん:2010/01/09(土) 22:13:44
>>793
ああ、そうかinternal_ptrがクラステンプレート内のクラスだからキャスト時にアクセスできなくなるからか。
外に出せば簡単になるけど、隠したいなら名前空間detailの中に隠すとか


795 :645 ◆GWRSHcLrd6 :2010/01/09(土) 22:16:43
あ、ハンドルのところに文字打ってたw

796 :645 ◆GWRSHcLrd6 :2010/01/09(土) 22:18:38
ハンドルじゃなくてトリップだった・・・

797 :645 ◆GWRSHcLrd6 :2010/01/09(土) 22:25:38
http://cdtest.genin.jp/projects/smart_ptr/index.htm

いろいろ修正しました。
NULL, 例外安全, 同一オブジェクトの代入については
修正されていません。

798 :デフォルトの名無しさん:2010/01/09(土) 23:21:46
>>788
#define NULL はねーよ。
標準ライブラリ実装の定義とずれたら ODR 違反になってしまう。

799 :デフォルトの名無しさん:2010/01/09(土) 23:26:20
流石に#ifndefとかするんじゃないか?

800 :デフォルトの名無しさん:2010/01/09(土) 23:54:59
>>799 そんなんしても無駄。

801 :デフォルトの名無しさん:2010/01/09(土) 23:56:54
3は
  #ifndef _HAS_CPP_0X
  #define nullptr reinterpret_cast<void*>(0)
  #endif
じゃない?

802 :デフォルトの名無しさん:2010/01/09(土) 23:59:53
>>801
C++では0はぬるぽも表すから問題ない。

803 :798:2010/01/10(日) 00:00:29
そうだな。疲れてるようだ

804 :デフォルトの名無しさん:2010/01/10(日) 00:01:51
>>801
それはなんの冗談だ?

805 :デフォルトの名無しさん:2010/01/10(日) 00:21:34
>>793
innerの共有なんて、smart_ptrがinnerとオブジェクトへのポインタを保持して、
internal_ptr内部はカウンタのみにすればいいだけ。

あと、メモリリークする。次のコードではnewがdeleteより常に1回多く呼ばれることが分かる。
よくよく追っかけると、ptr_cast内でnewしたinternal_ptrがdeleteされていない。
なお、コメントアウトを外してpb.Free()を行うと、代わりにpbのinternal_ptrがdeleteされなくなる。
あと、ptr_cast<base>(pd)と書かせる意図だろうけど、それにはtemplate<class U, class T>のTとUが逆。
#include <iostream>
#include <new>
#include <cstdlib>
#include "smart_ptr.hpp"
void* operator new(std::size_t n) throw() {
void* p = std::malloc(n);
std::cout << "operator new: " << p << std::endl;
return p;
}
void operator delete(void* p) throw() {
std::cout << "operator delete: " << p << std::endl;
std::free(p);
}
struct foo {virtual ~foo() {std::cout << "~foo" << std::endl;}};
struct bar : foo {virtual ~bar() {std::cout << "~bar" << std::endl;}};
int main() {
smart_ptr<bar> pb(new bar);
smart_ptr<foo> pf = ptr_cast<bar, foo>(pb);
//pb.Free();
}

806 :デフォルトの名無しさん:2010/01/10(日) 01:05:11
コンパイラについての質問をしていいか分からないんですが、
Cygwinスレの勢いがなく返答が帰ってくる信用性が低いのでこちらで聞きます。
(急いでいるので)

Bisonのコマンドを使うためにcygwinのインストーラ(名前はsetup.exe)を起動して
Devetの項目のBisonだけを選択してインストールしたところ
途中でエラーが出て止まってキャンセル押したらCygwinが起動すらしなくなりました。
今PCに入っているCygwinに追加する物も既にあるものも同時に入れないとだめですか?
追加インストールでなく再インストール扱いになっていたんでしょうか?

807 :デフォルトの名無しさん:2010/01/10(日) 01:15:15
>>806
氏ね惚け

808 :デフォルトの名無しさん:2010/01/10(日) 01:22:33
Bisonってなに?

809 :デフォルトの名無しさん:2010/01/10(日) 01:23:41
四天王のひとり。ステージはラスベガス。

810 :デフォルトの名無しさん:2010/01/10(日) 02:18:10
もしくは海外版のボス

811 :デフォルトの名無しさん:2010/01/10(日) 10:24:55
信用性がどうたらと書かれてほいほい答える奴もそういない

812 :デフォルトの名無しさん:2010/01/10(日) 10:26:42
>>808
リュウの場合はしゃがんで中キックで牽制。
足を当ててもいいけど、メインは牽制で近づけないようにする。
で、飛んできたらそのまま大パンチでアッパー。
ノー駄目で倒せます。

813 :デフォルトの名無しさん:2010/01/10(日) 10:38:03
C++を覚えたらオンラインゲームのエミュレータサーバ?は作れるのでしょうか?

814 :デフォルトの名無しさん:2010/01/10(日) 10:40:04
もっと他に覚えなきゃいけないことがいっぱいあるぞ
少なくともネットワークプログラミングを覚えなければ

815 :デフォルトの名無しさん:2010/01/10(日) 19:52:10
スマポまだー? (AA略

816 :デフォルトの名無しさん:2010/01/10(日) 20:13:46
慌てない慌てない
一休み一休み


817 :デフォルトの名無しさん:2010/01/10(日) 20:44:57
>>805

>innerの共有なんて、smart_ptrがinnerとオブジェクトへのポインタを保持して、
>internal_ptr内部はカウンタのみにすればいいだけ。

スマポのサイズが大きくなるだろ。
普通のポインタサイズを超えるとか・・・

818 :デフォルトの名無しさん:2010/01/10(日) 20:49:39
使い物にならない、って言いたいんでしょ!

819 :デフォルトの名無しさん:2010/01/10(日) 22:19:42
なんでboost::shared_ptrじゃダメなの?

どうしても限界まで速度を上げたければ生ポインタを使えば良いし
そうじゃないならboost::shared_ptrじゃダメなの?


820 :デフォルトの名無しさん:2010/01/10(日) 22:21:00
誰も駄目とは言ってなくね?

821 :デフォルトの名無しさん:2010/01/10(日) 22:23:45
STLとかboostはDLLでうまく扱えないから困る

822 :デフォルトの名無しさん:2010/01/10(日) 22:34:44
具体的にどんな問題?

823 :645 ◆GWRSHcLrd6 :2010/01/10(日) 22:47:10
今、一から書き直しています。
少々お待ち下さい・・・

824 :819:2010/01/10(日) 22:49:53
>>820
確かに言ってないな。
つまり車輪の再発明をしたいってこと?
(注:俺は車輪の再発明を全面的に否定的したいわけじゃありません。)

>>821
えーっと、クロスDLL問題のことか?
いずれにせよ>>821が想定しているDLLでの問題ってのを解決できる
フリーなスマポは現在配布されているの??


825 :デフォルトの名無しさん:2010/01/10(日) 23:08:58
基礎を知らずして応用はできないからね。基礎技術を見つめなおすのはいいことだと思うよ。再発明大いに結構。



826 :デフォルトの名無しさん:2010/01/10(日) 23:24:44
発明と履修を混同する奴って痛いよね

827 :デフォルトの名無しさん:2010/01/10(日) 23:47:42
答えのある問題の方が勉強に向いてるからな
スマートポインタの実装は学べるところが多いしね

828 :645 ◆GWRSHcLrd6 :2010/01/11(月) 00:14:28
http://cdtest.genin.jp/projects/smart_ptr/index.htm
smart_ptr

すべて書きなおしました。
動的削除子を実装、detail名前空間へのinternal_ptrの移動、
nullptrの採用(なんかすいません (^^;))など、
大幅に改善しました。

zipもアップロードしました。
よろしくお願いします。

829 :デフォルトの名無しさん:2010/01/11(月) 00:19:44
動的削除子まで つけてんのか。
さすがスマポ

830 :デフォルトの名無しさん:2010/01/11(月) 00:21:47
活発に手を動かすな奴が居ると好いな

831 :デフォルトの名無しさん:2010/01/11(月) 00:23:19
boostの削除子の関数ポインタでもファンクタでもどっちでもおkなやつってどうやってるんだろう

832 :デフォルトの名無しさん:2010/01/11(月) 00:58:50
単に削除子の型がテンプレートパラメータになってるだけだ。
STLでも普通に使われているはずだが。

833 :デフォルトの名無しさん:2010/01/11(月) 09:11:56
>>828
動的削除子がついて本格的になりましたね。

動的削除子を関数オブジェクトにすると少し速くなるかも。でもヒープの処理時間に比べればわずかかも。
それよりも、deleter_baseとinternal_ptrを統合すればnewの回数が減らせて速くなりそうだね。


834 :デフォルトの名無しさん:2010/01/11(月) 09:38:23
ただの関数だったらわかるんだけど・・・
削除子を保存しないといけない場合が分からない

void hoge1(void);
struct hoge2 { void operator () (void); };

template <class T_hoge> void foo(T_hoge hoge) { hoge(); }

foo(hoge1);
foo(hoge2());

template <class T_hoge> struct bar
{
T_hoge m_hoge;
bar(T_hoge hoge) : m_hoge(hoge) {}
};

× bar b1(hoge1);
× bar b2(hoge2());
◯ bar<hoge1> b1(hoge1);
◯ bar<hoge2> b2(hoge2());

型宣言の時にテンプレートパラメータを消去する方法が思いつかない

835 :デフォルトの名無しさん:2010/01/11(月) 10:27:10
>>834 型消去という手法がある。これで任意の関数オブジェクトを保持できる。
class TypeHolderBase
{
public:
virtual void func1(void* mem)=0;
};

template<class T>
class TypeHolder :public TypeHolderBase
{
T f;
public:
TypeHolder(const T ff)
:f(ff)
{
}
virtual void func1(void* mem)
{
f(mem);
}
};
後はこれをTypeHolderBaseで管理すればいい。

836 :645 ◆GWRSHcLrd6 :2010/01/11(月) 10:32:38
間違いだらけだったので修正しました。
http://cdtest.genin.jp/projects/smart_ptr/index.htm

テンプレートで削除子ってどうやるんですかね・・・??

>>833
deleter_baseとinternal_ptrを統合・・・というと?


837 :デフォルトの名無しさん:2010/01/11(月) 13:21:16
お前らそれなんに使うんだ?

838 :デフォルトの名無しさん:2010/01/11(月) 13:49:19
>836
そういやboost::anyはチェックしてみた?あっちの方が実装が簡単で参考になるよ。
boost::anyは値で保持しているから、カウンタは自分で実装する必要があるけど。


839 :デフォルトの名無しさん:2010/01/11(月) 15:51:40
>>836
deleter_baseが派生によって任意の動的削除子を掴む設計の様ですね。
で、さらにそのdeleter_baseをinternal_ptrが掴むようになってるので、どうせなら、internal_ptrがdeleter_base
と同じ手法で直接動的削除子をつかめるようにしたらnewが一回減るかなとか。


840 :デフォルトの名無しさん:2010/01/11(月) 15:53:04
アロケータとかスレッド対応もやってよね

841 :デフォルトの名無しさん:2010/01/11(月) 16:34:16
アロケータ?

842 :デフォルトの名無しさん:2010/01/11(月) 18:38:48
>>835
勉強になったっす
TypeEraserパネェっす

843 :デフォルトの名無しさん:2010/01/11(月) 20:06:20
下記の様にifstreamではインスタンス化の際に2種類の方法がありますが、なぜnewしなくてもインスタンス化できるのでしょうか。

ifstream* in;
in = new ifstream("filename");

ifstream in("filename");

844 :デフォルトの名無しさん:2010/01/11(月) 20:12:44
intにも下記の様に2種類のインスタンス化の方法があるぞ

int *x;
x = new int(100);

int x(100);

845 :デフォルトの名無しさん:2010/01/11(月) 20:25:33
>>844
CLIのマネージドクラス??ちょっとよくわからないです。

しかし、何となく理由はわかりました。
静的割り当てと動的割り当ての違いですね。


846 :デフォルトの名無しさん:2010/01/11(月) 20:29:27
> CLIのマネージドクラス??ちょっとよくわからないです。

いや、ごく普通のC++だが・・・
そういう書き方もできるんだ
変数宣言と初期化の構文にintもifstreamも違いは無い

847 :デフォルトの名無しさん:2010/01/11(月) 20:55:46
スタックへの割り当てとヒープへの割り当ての区別が付かない人が多すぎるよね…

848 :デフォルトの名無しさん:2010/01/11(月) 21:01:33
忘れた頃にやってくるよねこの手の質問は。
スタック、ヒープとフリーストアの違いは知っておかないと大変なことになるからな。

849 :デフォルトの名無しさん:2010/01/11(月) 21:02:11
>>847
ほぅほぅそういう違いがあるんですね。
ちょっと勉強してきます。

850 :デフォルトの名無しさん:2010/01/11(月) 21:03:19
>>843
変数の動的確保でググれ。

851 :デフォルトの名無しさん:2010/01/11(月) 21:04:13
>>846
intもクラスなんですね・・
cの頃と同じ型?かと思ってた

852 :デフォルトの名無しさん:2010/01/11(月) 21:09:18
>>851
そういう問題ではない
>>843が理解できてないのはC++以前のC言語レベルの話

int x[100];



int* x = (int*)malloc(sizeof(int)*100)

の違いがわからないと言っているのと同じ

853 :デフォルトの名無しさん:2010/01/11(月) 21:22:00
>>852
その違いの話は既に解決しました。

ただ、intがクラスだった事を知らなかったので。
昨日からc++の勉強を始めたので解らない事ばかりです。

854 :デフォルトの名無しさん:2010/01/11(月) 21:22:39
>>851
だから、ココ見てろって。
http://www.kab-studio.biz/Programing/Codian/Pointer/09.html

855 :デフォルトの名無しさん:2010/01/11(月) 21:25:55
>>853
int はクラスじゃないよ。
new を使うかどうか、使えるかどうか、使わないといけないのかどうかは
クラスかどうかとはあんまり関係ないよ。

856 :デフォルトの名無しさん:2010/01/11(月) 21:28:03
>>855
int(100); 見たいな宣言の方法はコンストラクタを呼んでいるんじゃないんですか??

857 :デフォルトの名無しさん:2010/01/11(月) 21:30:55
>>856
間違えました

int x(100);のことです

858 :デフォルトの名無しさん:2010/01/11(月) 21:40:33
>>853
newはクラスにしか使えないって考え方が間違ってる
intはクラスではないがnewの構文がプリミティブ型にも使えるだけの話
極論すればmallocが構造体の確保だけに使うわけではないのと同じ

newされるのがクラスであればコンストラクタである関数が呼ばれるが
そもそもコンストラクタとは「初期化するもの」なんだから
プリミティブ型が同じ構文で単に初期化されるのは至極真っ当でしょ

859 :デフォルトの名無しさん:2010/01/11(月) 21:47:49
>>858
newの話とクラスの話は別です。既に前者の話は解決しました。

ただcではint x(100);の様な書き方をした事が無くc++のコンストラクタによる初期化と同じ書式なので
intがクラスなのかと思っただけですよ。

860 :デフォルトの名無しさん:2010/01/11(月) 21:49:53
boostのスマートポインタを使ったことなんですが、
次のようなソースで警告とか出ますか?

sptr<int> ptr1( new int(10) );
const sptr<int> ptr2( ptr1 );
sptr<int> ptr3( ptr2 );
*ptr3 = 20;


861 :デフォルトの名無しさん:2010/01/11(月) 21:52:00
試せよ

862 :デフォルトの名無しさん:2010/01/11(月) 21:54:25
もっともですね・・。
試してみます。

863 :デフォルトの名無しさん:2010/01/11(月) 22:16:55
そういえば、Boostを含むいくつかのスマポを除く、たいていのスマポはSTLと相性が悪いって聞くんだけど、本当?
そういう話聞くから、スマポ使うかどうか迷ってるんだけども・・・。

864 :デフォルトの名無しさん:2010/01/11(月) 22:28:40
>>863
std::auto_ptr は Assignable 要件を満たさないので、 Assignable を要求するライブラリ、
主に標準コンテナと組み合わせて使えない。

boost が使えるなら boost::shared_ptr にしとけば(いくらかの実行効率は除いて)問題ない。

うっかりコンテナと組み合わせたりしなけりゃ std::auto_ptr も十分使える。
とりあえず delete を自分で書いてるようなら今すぐ置き換えてまわることをおすすめする。

865 :デフォルトの名無しさん:2010/01/12(火) 00:21:05
>>863
スマポの仕様による。
スピード最優先だったりするスマポの場合はSTLに入れられなかったり。

でもスマポを作る人がSTLに入れられる様に作りたいと思っていればそうなっているだろう。

866 :デフォルトの名無しさん:2010/01/12(火) 10:12:32
公開テンプラメンバー関数ってクライアントのほうで特殊化してカプセル化が崩せるように思えるんですが、これをできなくするテクニックとか在りますか?
クライアントの良心を信じるほかないのでしょうか?

867 :デフォルトの名無しさん:2010/01/12(火) 10:24:56
そういった使い方は動作保証しません、サポートもしません、って言って(書いて)おけばいいんじゃね
自己責任でやってくれるぶんには別に困らないだろ
何か問題が起きても動作保証外ですで突き返す

868 :デフォルトの名無しさん:2010/01/12(火) 10:45:16
自分はもの覚えいいほうだと思うのですがどれくらいでC++って基本マスターできますか?
ちなみにまだ小学5年ですが、授業時間の話だけで毎回100点とか90点くらいはとります

869 :デフォルトの名無しさん:2010/01/12(火) 10:50:28
どれくらいっていうのは何でしょう?
どれくらい学習時間かければマスターできるかってことでしょうか?
どれくらい物覚えがよければマスターできるかってことでしょうか?
どれくらいのレベルの学校に行けばマスターできるかってことでしょうか?
聞きたいことをもうちょっと詳しく

870 :デフォルトの名無しさん:2010/01/12(火) 11:04:45
集中して勉強すれば数週間〜数ヶ月くらいじゃないかな
他のプログラミング言語の経験にもよる
でも学校の勉強はおそろかにしちゃいけない

871 :デフォルトの名無しさん:2010/01/12(火) 11:38:06
C++なんて別に難しくもなんともないから2時間ぐらいで覚えられるだろ。
Helloworld、分岐、繰り返し、関数、ポインタ、クラス、継承
はい終了

872 :デフォルトの名無しさん:2010/01/12(火) 12:06:13
templateもSTLもやらないつもりか
そんなだからいつまでも「わかったつもり」なんだ

873 :デフォルトの名無しさん:2010/01/12(火) 12:06:59
haskellを使いこなせてはじめてC++が分かる。
haskellをやりなさい。

874 :デフォルトの名無しさん:2010/01/12(火) 12:13:06
>>872
そんなもの全部ライブラリ扱い。
必要なライブラリはそのつど覚えるもんだよw

875 :デフォルトの名無しさん:2010/01/12(火) 12:14:21
うゆの臭いがする

876 :デフォルトの名無しさん:2010/01/12(火) 12:18:26
template metaprogrammingはやらないつもりか?

877 :デフォルトの名無しさん:2010/01/12(火) 12:20:57
templateもSTLも昔のC++にはなかったんだから、それを知らなかったらC++を知らないとはいえないだろ。
おいおい、覚えていくことになるだろうが。

878 :デフォルトの名無しさん:2010/01/12(火) 12:22:12
素直にC++98以降はやらないって言おうな

879 :デフォルトの名無しさん:2010/01/12(火) 12:34:26
templateなんて所詮はポリモルフィズムだろ
関数型言語だと割と普通だから必要に迫られなければやらなくてもいい。

880 :デフォルトの名無しさん:2010/01/12(火) 12:36:23
まぁ、最低限のことだけで十分だと思うよ。
テンプレートとかややこしくなるだけで百害あって一利なし。
テンプレート使うぐらいなら似たような関数を大量生産するね、俺なら。

881 :デフォルトの名無しさん:2010/01/12(火) 12:37:53
>>879
まったく違う。静的か動的かが。
テンプレートなんぞマクロみたいなもん。

882 :デフォルトの名無しさん:2010/01/12(火) 12:40:44
>>881
そんなこと些細な違い

883 :デフォルトの名無しさん:2010/01/12(火) 12:44:34
些細な違いを持ち出して、大きな違いだと宣伝するのはセミナー屋だけにしてくれw
マジで洗脳されるのもたいがいにしてくれw

884 :デフォルトの名無しさん:2010/01/12(火) 12:54:02
やっぱりうゆ臭がする
しかしそれを見越した釣りの可能性も

885 :デフォルトの名無しさん:2010/01/12(火) 13:01:12
テンプレートなんぞ複製が作られてるだけやん。ジェネリックプログラミングやん。
ポリモーフィズムは動的に決定されるやん。OOPやん。

886 :デフォルトの名無しさん:2010/01/12(火) 13:02:05
templateってSTLとか見れば便利だって理解できるんだけど
実際に自分が使う場合、何処で使って良いのかわからんのよね

887 :デフォルトの名無しさん:2010/01/12(火) 13:33:51
テンプレート?ああライブラリ書き用ね。

888 :デフォルトの名無しさん:2010/01/12(火) 13:57:54
学習にどれくらいの期間がかかるかなんて問題は個人差が大きすぎる

889 :デフォルトの名無しさん:2010/01/12(火) 14:51:43
STLはライブラリだけどtemplateは言語仕様だろ

890 :デフォルトの名無しさん:2010/01/12(火) 15:31:42
Zip(Deflate64) がロードできるライブラリでロード速いやつありますか

891 :デフォルトの名無しさん:2010/01/12(火) 19:21:12
>>868
当たり前

実は今は小学生のテストで90点取れないやつの方が少ないんだぜ
私立は知らんけど

892 :デフォルトの名無しさん:2010/01/12(火) 19:24:03
俺も小学生のときはテスト勉強なんて一度もしたこと無かったけど、
90〜100は当たり前だった。

893 :デフォルトの名無しさん:2010/01/12(火) 19:25:06
俺100点どころか小学校在学中に九九覚えきれなかったわ
高校物理は全国10位前後だったけど

894 :デフォルトの名無しさん:2010/01/12(火) 19:58:40
>>893
ふーんよかったねよかったねよかったね

895 :デフォルトの名無しさん:2010/01/12(火) 20:19:10
俺も高校物理は全国1位になったことあるぞ
満点だからw

896 :デフォルトの名無しさん:2010/01/12(火) 20:20:48
っていうか、高校の数学や物理の問題ごときで間違えるようならC++プログラマ向いてないんじゃね。

897 :デフォルトの名無しさん:2010/01/12(火) 20:20:56
百点がでるテストは欠陥テスト

898 :デフォルトの名無しさん:2010/01/12(火) 20:25:25
いつも99点で止めてた俺は資格を持っていない

899 :デフォルトの名無しさん:2010/01/12(火) 20:30:11
物理で満点とれる奴ってどういう脳ミソしてるんだか

900 :デフォルトの名無しさん:2010/01/12(火) 20:31:32
物理って高校物理?
ニュートン力学とか?
もうわすれちった。

901 :デフォルトの名無しさん:2010/01/12(火) 20:31:54
知っているのにわざと間違える65点の人が好き

902 :デフォルトの名無しさん:2010/01/12(火) 20:32:37
モル計算大っ嫌い

903 :デフォルトの名無しさん:2010/01/12(火) 20:33:49
モルあったw なつかしすw
モルだけはサッパリ概念がつかめなかったのを思い出すw

904 :デフォルトの名無しさん:2010/01/12(火) 20:34:05
数学より物理が得意だったなぁ。
数学は統計が苦手だった。

905 :デフォルトの名無しさん:2010/01/12(火) 20:41:08
まてよ
モルは物理じゃねーぞ

906 :デフォルトの名無しさん:2010/01/12(火) 20:42:09
モルがわからんとか、どんだけ低学歴なんだよw

907 :デフォルトの名無しさん:2010/01/12(火) 20:43:38
>>906
     ____
    /∵∴∵∴\
   /∵∴∵∴∵∴\
  /∵∴∴,(・)(・)∴|
  |∵∵/   ○ \|
  |∵ /  三 | 三 |  / ̄ ̄ ̄ ̄ ̄
  |∵ |   __|__  | < うるせー馬鹿!
   \|   \_/ /  \_____
      \____/  

908 :645 ◆GWRSHcLrd6 :2010/01/12(火) 20:48:52
virtual関数って気になるほどのオーバーヘッドなんですかね?
内部ポインタにvirtualを導入したいのですが。

909 :デフォルトの名無しさん:2010/01/12(火) 20:50:58
実測して気にならないぐらいのコストなら気にしない

910 :デフォルトの名無しさん:2010/01/12(火) 21:01:06
>>906
使わないと忘れちゃうよ。科目の好き嫌いも影響するしね。

911 :デフォルトの名無しさん:2010/01/12(火) 21:39:57
日本って得意分野を持たず平均して優秀な人間を優遇する社会構造になってるじゃん。
好きなことはすごく良くできるけど、嫌いなことはからっきしダメっていう人間は日本では負け組みになってしまうんだよ。

912 :デフォルトの名無しさん:2010/01/12(火) 22:03:59
学問として成り立ってる分野では(ITもとっくにそう)
そういう人間のなかでできるやつを選別して大学の研究室に残らせたり企業の研究所に送ったりするので
実際はその競争にすら負けた出来そこないが宙ぶらりんになってるだけだけどな

913 :デフォルトの名無しさん:2010/01/12(火) 22:07:19
計算機科学やソフトウェア工学(爆笑)はまだまだ学問として認められていないよ。

914 :デフォルトの名無しさん:2010/01/12(火) 22:08:12
まぁその選別作業がすごく上手く行ってて、変なのを送ったり
有能なのを送らなかったりする「紛れ」が少ないなら結構なんだが。

915 :デフォルトの名無しさん:2010/01/12(火) 22:08:40
俺なんか院の内輪の発表会で物理やら数学の人らがいる中でソフトウェア論文の発表やったら苦笑の嵐だったしwwww

916 :デフォルトの名無しさん:2010/01/12(火) 22:10:09
>>914
実際は無能な奴が大学に残って、優秀だと思われていた奴がなぜか欝入って派遣行ったりするんだけどな。
世の中わからんね。

917 :デフォルトの名無しさん:2010/01/12(火) 22:32:48
C++終了のお知らせ

【IT】人気プログラミング言語ランキング…PHPがC++を抜く 1位はJava [10/01/12]
http://anchorage.2ch.net/test/read.cgi/bizplus/1263298235/

918 :デフォルトの名無しさん:2010/01/12(火) 22:35:26
>>917
「PHPにシェアを抜かれた言語は終了」とでも思ってる馬鹿なのか、
C++のシェアが少しずつ減っていることを今さら知った情弱なのかわからん。

919 :デフォルトの名無しさん:2010/01/12(火) 22:38:46
でも全ての言語はC/C++が礎となっている

920 :デフォルトの名無しさん:2010/01/12(火) 22:40:20
まあ簡単な方に流れるのは自然の摂理だわな

921 :デフォルトの名無しさん:2010/01/12(火) 23:09:55
>>917
これって趣味グラマの統計?
求人情報の統計?

922 :デフォルトの名無しさん:2010/01/12(火) 23:31:30
>>921
>The TIOBE Programming Community index gives an indication of the popularity of programming languages.
>The index is updated once a month. The ratings are based on the number of skilled engineers world-wide,
>courses and third party vendors. The popular search engines Google, MSN, Yahoo!, Wikipedia and YouTube
>are used to calculate the ratings. Observe that the TIOBE index is not about the best programming
>language or the language in which most lines of code have been written.
だって。

山ほどあるLLからPHPが抜け出したのは、やっぱ手軽さが評価されたんだろうか。

923 :デフォルトの名無しさん:2010/01/12(火) 23:35:36
xamppの存在が大きいだろう
perlも入ってるとは言え、phpメインだろうし

924 :デフォルトの名無しさん:2010/01/12(火) 23:40:13
何で匿名で虚勢張るの?
意味ないよね

925 :デフォルトの名無しさん:2010/01/12(火) 23:41:55
ここでもphpが話題
http://pc12.2ch.net/test/read.cgi/affiliate/1263225873/

926 :デフォルトの名無しさん:2010/01/12(火) 23:47:47
>>924
誰が虚勢張っているの?>>917のこと?


927 :デフォルトの名無しさん:2010/01/12(火) 23:48:31
phpでスタンドアロンのexe吐けるの?

928 :デフォルトの名無しさん:2010/01/12(火) 23:51:06
exe吐ける

929 :デフォルトの名無しさん:2010/01/12(火) 23:51:57
bamcompile

930 :デフォルトの名無しさん:2010/01/13(水) 03:04:47
>>919
lispに謝れっ

931 :デフォルトの名無しさん:2010/01/13(水) 10:01:19
志村67

932 :デフォルトの名無しさん:2010/01/13(水) 11:31:06
>>930
lisp処理系は職人さんがマシン語でじっくり丁寧に作ったものなのか?

933 :デフォルトの名無しさん:2010/01/13(水) 13:44:58
少なくともLISPの歴史はCより長い

934 :デフォルトの名無しさん:2010/01/13(水) 14:31:21
でもCはLispの影響は受けていないが、LispはC向きに作られたOS上で動くように修正されなければならなかった。

935 :デフォルトの名無しさん:2010/01/13(水) 15:23:15
「C/C++が礎となってる」の意味によるよな
a)シンタックス等の記述方法がC/C++を手本にしている
b)コンパイラ・インタプリタ(処理系)がC/C++で書かれている
c)自己記述が可能(自己の処理系を作れる)だが実行環境たるOSがC/C++で書かれている

a)だと「全ての」というには無理がある
lisp, FORTRAN, COBOL, Pascal, BASIC, Ruby, Python等多数に怒られそう
せめてALGOLと言った方がまだ広がる
b)になると多くに該当しそうだけど「全て」というには気がひける
LLの多くはこの時点で脱落だろうね
c)になると現代的には流石にほぼ全てと言って過言ではないかも
Adaとか特殊なものを除くとOSはほぼC/C++だからなぁ

936 :デフォルトの名無しさん:2010/01/13(水) 16:00:33
>>935
だったらほぼすべての言語がC/C++の影響を受けてるってことだよ。

937 :デフォルトの名無しさん:2010/01/13(水) 16:04:00
影響を受けているとか、どの言語のほうが格上だとか、そんなことどーでもいいだろw

938 :デフォルトの名無しさん:2010/01/13(水) 16:45:45
Lisp>>>>>>>>>C++なのかやっぱり
http://yaneuraou.yaneu.com/

939 :デフォルトの名無しさん:2010/01/13(水) 17:08:57
なるほど。
これからは自分がやりたいことをやりやすい言語を自前で実装する時代なんだな。

940 :デフォルトの名無しさん:2010/01/13(水) 18:08:02
スマートポインタは一体どうなったんだろうな・・・

941 :デフォルトの名無しさん:2010/01/13(水) 20:13:45
まじか。phpってすげぇじゃん。
・・・でも何でWEBでしか使われないわけ?

942 :デフォルトの名無しさん:2010/01/13(水) 20:15:42
Lispって理解できない。
というか理解しようという動機が見つからない。

理解できたときの快感は半端無いらしいが。

943 :デフォルトの名無しさん:2010/01/13(水) 20:22:17
phpspotの悪口はそこまでだ

944 :デフォルトの名無しさん:2010/01/13(水) 20:24:07
>>942
Lispって簡単じゃん。
Helloworld、関数、分岐、再帰、マクロ
はい終了

945 :デフォルトの名無しさん:2010/01/13(水) 20:48:46
>>944
いやいや、深遠さはたぶん尋常でないよ。
でも職場で他のヤツができないからあんまり流行らないのかな?


946 :デフォルトの名無しさん:2010/01/13(水) 20:55:15
>>945
Lispの深遠さ=計算機科学の深遠さ
だから基礎を学んだ人間にしてみればLispは>>944で十分

947 :デフォルトの名無しさん:2010/01/13(水) 20:57:36
一方言であるところのCommon Lispの仕様は歴史的経緯もあってかなり大きいけど、
総称的にLispという時、それはむしろ「シンプルで深い」という方向のものだと思う。

948 :デフォルトの名無しさん:2010/01/13(水) 21:19:59
>>945
LISPやFORTHでなんかつくろうとは思わないけど、極めて合理的な処理原理には学ぶものはあるな。
一度は作ってみるべきものじゃないか?


949 :デフォルトの名無しさん:2010/01/13(水) 21:22:59
LispでできることはHaskellでやったらもっと簡潔に書けることが多いと思う。

950 :デフォルトの名無しさん:2010/01/13(水) 21:23:43
遅延評価さえあればマクロを使う必要すらないしな。

951 :デフォルトの名無しさん:2010/01/13(水) 22:04:38
>>946
まて、その理論だと
 猛者にはTuring Machineがあれば十分
って言っている様なものでは?
現実的には猛者だとしてもリアルTMだけだと・・・。

952 :デフォルトの名無しさん:2010/01/13(水) 22:48:19
>>951
ちょっと、意味がちがう

953 :デフォルトの名無しさん:2010/01/13(水) 23:12:09
Turing Machineなんて本物あっても
絶対つかえねぇなw

954 :デフォルトの名無しさん:2010/01/13(水) 23:18:19
Turing MachineでTuring MachineをラップするTuring Machineを作れば良い

955 :デフォルトの名無しさん:2010/01/14(木) 00:30:00
visitorパターンとか、たまにデザインパターンというものを
見聞きするのですが、それをC++の例で解説している
Webサイトはありませんでしょうか?

よろしくお願い申し上げます。


956 :デフォルトの名無しさん:2010/01/14(木) 00:33:58
このぐらい買えよ
http://www.amazon.co.jp/dp/4797311126

957 :デフォルトの名無しさん:2010/01/14(木) 16:30:02
最近C++を勉強し始めたばかりで、ただいまコンソールアプリケーションだけでのドラクエ風RPGの
戦闘処理部分だけを作ってるんですが、どうしてもうまくいきません……
具体的にはHP,MP,攻,防,命中,素早さ といったステータスをもつクラスPlayer4人と、敵クラスEnemyを3人用意して

1: Player[0]〜[4]のコマンドとそのターゲットをこちらが選択する( とりあえず「たたかう」だけで )
2: Enemy[0]〜[3]が自動でコマンドとターゲットを選択する( いまのところ乱数で )
3: 各キャラが素早さ順に選択されたコマンドを実行する
4: ターゲットになったキャラは、相手から攻撃と命中のステータスをうけとって、命中判定、ダメージ計算を行う
5: これを繰り返してどちらかのパーティが全滅するまで続ける

このように実現したいのですが、3,4の部分がうまくいきません……
プレイヤー1人対敵1人のときは
struct Buffer
{
int ATK; //相手の攻撃力
int DEX; //相手の命中力
}
といった構造体のやりとりでなんとかなったのですが、ターゲットを選択する処理だけがどうすればいいのか分かりません
ネットに転がってるRPGのオープンソース見ても複雑すぎて見当がつきません……どうかご教授願います。

958 :デフォルトの名無しさん:2010/01/14(木) 16:38:24
そもそも、味方4名である必要なし。
人物1-100人のバトルロワイヤルでいい。
そのほうが簡単。
flgがあって味方は選択しないようにする。
敵味方と分類すれば似た処理を二つ用意しなければならない。

959 :デフォルトの名無しさん:2010/01/14(木) 18:35:53
>>957
何が、どう、なぜうまくいかないのか分からない。

というかどうなってほしいのにどうなってしまうことをうまくいかないと
表現しているのかわからん。



960 :デフォルトの名無しさん:2010/01/14(木) 19:12:08
>>957 Level0のおいらがエスパーすると

Buffer Touma;
Buffer Index;
Buffer Komoe;
Buffer Maika;

じゃなくて
Buffer[20000] Sisters;

にすればいいんじゃないか?

961 :デフォルトの名無しさん:2010/01/14(木) 19:35:51
ゆとりは自分の脳内の望みとか快楽に、意味もなく普遍性を見出すよな。
だから「僕の望みと現実が違うんです」と書けば、それだけで現状のすべてが伝わると思ってる。

地球の片隅でひっそり生きてるお前の願望のディテールなんか、誰もわからんってのw

962 :デフォルトの名無しさん:2010/01/14(木) 19:53:17
>>959の言う通り
「どうなってほしいのにどうなってしまうことをうまくいかないと
表現しているのかわからん。」
ってのはどうしようもない。


963 :デフォルトの名無しさん:2010/01/14(木) 20:36:02
誰に対する攻撃かを保存する変数を追加すればいいんじゃねえの

964 :デフォルトの名無しさん:2010/01/14(木) 21:13:40
確かに見返してみると意味不明な文章でした……スレ汚し大変申し訳ないです

戦闘処理は専用の戦闘クラスが受け持って、そのメンバ変数にオブジェクトPlayer[ ] とEnemy[ ]を持っているんですが、
戦闘コマンドの選択はPlayerクラスのメンバ関数で、先に書いた構造体Bufferを用いて
Buffer Player::Command()
{
Buffer buffer = { this->ATK, this->DEX } //自分の攻撃力と命中力を入れる
return buffer;
}
として、さらにその後Playerのターゲットを選ぶメンバ関数 int Player::SelectTarget でターゲットを選択し、
クラスEnemyの引数にBufferをもつような「攻撃を受ける」メンバ関数に、プレイヤーのBufferを渡し、その中でダメージ計算を行う。
Enemyも同様にして、自動でATK、DEXを入れBufferを返し、ターゲットを決めてPlayerの関数に受け取らせてダメージ処理を行う、という風に考えていました
しかしターゲットを選ぶ際、戦闘クラスで決めた敵の番号(もしくはプレイヤーの番号)をどうやってターゲットを決める関数に渡すか、で詰まってしまいました
死んだ敵を選択肢から除外しようと思ってもEnemyクラス内でprivateな変数HP(体力)をPlayerクラス内で確認できないし、敵も同様です。
それに敵がクラスEnemyの関数で乱数によりターゲットを決める際、プレイヤーが4人で固定ならばいいのですが、後々味方が2人や3人で戦闘を行う際、
戦闘を行うプレイヤーの数を確認し、その幅で選択肢を決める、といった処理の仕方にも悩んでいます……

また戦闘しているPlayer, Enemyの全員がコマンドを選択した後、STLのvectorかlistにまとめてPlayerオブジェクトとEnemyオブジェクトを入れて素早さ順にソートをし、
それからList[0]( すばやさ200のPlayer[2] )の行動 → List[1]( すばやさ190のEnemy[1] )の行動 → ……
といったように各キャラの素早さ順で行動を実行しようとも考えていたのですが、
List[0], List[1]といった風に再度番号を割り振ってしまった後、どうやって各キャラの狙ったターゲットを判別しBufferを渡せば良いのか、という処理も見当がつかないのです


自分でも混乱して客観的把握ができないため、まだ不明瞭、説明不十分なところがあればもう少し日本語の勉強をしてから出直します…

965 :デフォルトの名無しさん:2010/01/14(木) 21:40:53
いっぺんに完成形を目指しすぎな気がする

966 :デフォルトの名無しさん:2010/01/14(木) 21:45:19
publicなBattleFieldクラスに参加中の戦闘員を登録して、死んだ場合は通知して除外
つーか何でもかんでもprivateにすればいいってもんでも無いベ

967 :デフォルトの名無しさん:2010/01/14(木) 21:45:31
面倒だから、ATBにしろよ。
それぞれスレッドで動かしておいて
シグナル来たらメインが動かす。

968 :デフォルトの名無しさん:2010/01/14(木) 21:47:39
いまいち概要がつかめないからまあ適当で。

>Enemyクラス内でprivateな変数HP(体力)をPlayerクラス内で確認できない
・publicにする。
・Enemyクラスに自分が死んでいるかをどうか返す関数を実装する。(Playerクラスも同様)

>プレイヤーが4人で固定ならばいいのですが、後々味方が2人や3人で戦闘を行う際
・オブジェクトPlayer[ ] とEnemy[ ]を管理するクラスを作成する

>どうやって各キャラの狙ったターゲットを判別しBufferを渡せば良いのか、という処理も見当がつかないのです
・行動順にするのにポインタを使う。
・オブジェクトPlayer[ ] とEnemy[ ]へのインデックスを配列として管理する。
・オブジェクトPlayer[ ] とEnemy[ ]に自身を特定するための変更されないユニークなIDを割り振り、攻撃者はそのIDをターゲットの識別に用いる。


969 :デフォルトの名無しさん:2010/01/14(木) 22:21:26
ソートした後にコマンド登録を促がすという単純な方法もあるねw

970 :デフォルトの名無しさん:2010/01/14(木) 23:00:26
>>969
今はいいけど、それってあとあと困るんじゃね。
魔法とか、詠唱時間が+される仕様だったりすると。

あと、行動順にコマンド入力になるから、一般的なコマンド入力後の戦闘方式(FFようなリアルタイムバトルじゃないもの)と感じが変わっちゃうかと。

971 :957 == 964:2010/01/14(木) 23:02:15
皆様ご返答ありがとうございます。
敵のHPをpublicにするというのは盲点でした。言われた通りカプセル化に拘り過ぎていたかもしれません
戦闘参加中のプレイヤーと敵のオブジェクトを管理するクラスというのは戦闘処理クラスと違って、
  「戦闘場所」だけを管理するクラスのことでしょうか。少し考えてみます
ポインタを使って、敵味方を混同した配列内のオブジェクト自身に固有な数値を持たせる、つまりポインタ配列みたいなもんですか
  確かにそのようにするとソート後にコマンド選択を促すという方法も取れそうな気がします
  自分自身がポインタ操作、参照など完全に把握し切れてないので少し勉強し直してきます…
あとATBは少し難しそうなので敬遠してました……TATBまだなんとかなりそうなんですが、
  リアルタイムな処理というものがまだ実感できないんです

ご返答、重ね重ねお礼申し上げます

972 :デフォルトの名無しさん:2010/01/14(木) 23:03:08
というかたぶん設計が根本からおかしいのでは?
UIの問題とアルゴリズムの問題は別個ですよ

973 :デフォルトの名無しさん:2010/01/14(木) 23:12:18
>「戦闘場所」だけを管理するクラスのことでしょうか。
じゃなくて、見方全体を、敵全体をそれぞれ一元に管理するもの

>ポインタを使って、敵味方を混同した配列内のオブジェクト自身に固有な数値を持たせる、つまりポインタ配列みたいなもんですか
ごっちゃにするなよ。
「ポインタ」と「オブジェクト自身に固有な数値を持たせる」は別だぞ。
まぁポインタも固有な数値ではあるが。

リアルタイムバトルは・・・まだ早すぎる

974 :デフォルトの名無しさん:2010/01/15(金) 00:00:29
>>972に同意
図を書いて整理した方がいいと思う

特に、PlayerとEnemyで違う部分は何か、共通な部分は何かといったところ

975 :デフォルトの名無しさん:2010/01/15(金) 00:05:02
>>972が言いたいのは
ターゲットを選ぶ -> UIの問題
構造体のやりとりでなんとかなったのですが…(ry -> アルゴリズムの問題
ってことか。
確かに、C++の言語の知識だけでなく、現実的には設計の知識も要求されるな。


976 :デフォルトの名無しさん:2010/01/15(金) 02:12:51
Bufferに、攻撃者と被攻撃者のポインタ(もしくはインデックス)を入れたらどうよ。
ついでに素早さも入れとけば、Bufferを素早さでソートして昇順に処理するだけで済みそうだが。

977 :デフォルトの名無しさん:2010/01/15(金) 03:01:17
class MyRand{
  public: int operator()( int mmm ){ return rand() % mmm; }
};

vector<int> retvec( int maxval ){
  vector<int> ret( maxval + 1 );
  for( int i=0; i<(maxval+1); ++i ){ ret[i] = i; }

  MyRand mr;
  random_shuffle( ret.begin(), ret.end(), mr );

  return ret;
}

----------------

は、コンパイル通るのに、

vector<int> retvec( int maxval ){
  vector<int> ret( maxval + 1 );
  for( int i=0; i<(maxval+1); ++i ){ ret[i] = i; }

  class MyRand{
    public: int operator()( int mmm ){ return rand() % mmm; }
  };

  MyRand mr;
  random_shuffle( ret.begin(), ret.end(), mr );

  return ret;
}

978 :977:2010/01/15(金) 03:02:27
>>977


のコンパイルが通りません。
何故でしょうか?

コンパイラは以下のものです。
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)

979 :デフォルトの名無しさん:2010/01/15(金) 03:20:21
>>977-978 エラーメッセージは?

980 :977:2010/01/15(金) 03:42:45
>>979

shuffle.cpp: In function ‘std::vector<int, std::allocator<int> > retvec(int)’:
shuffle.cpp:32: error: no matching function for call to
‘random_shuffle(
  __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >,
  __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >,
  retvec(int)::MyRand&)’

です。


参考にならないかも知れませんが、以下ではコンパイルが通りました。

vector<int> retvec( int maxval ){
  vector<int> ret( maxval + 1 );
  for( int i=0; i<(maxval+1); ++i ){ ret[i] = i; }

  // ()演算子のオーバーローではなく、単純な関数にした
  class MyRand{
    public: static int myrand( int mmm ){ return rand() % mmm; }
  };

  MyRand mr;
  random_shuffle( ret.begin(), ret.end(), MyRand::myrand );

  return ret;
}

981 :デフォルトの名無しさん:2010/01/15(金) 03:49:48
>>980
へぇ。要領を得ないエラーメッセージだねぇ。

たぶん、テンプレート実引数には外部リンケージを持つ型しか使えない、っていう制限に
ひっかかってるんだと思う。関数ローカルなやつはアウト。

982 :977:2010/01/15(金) 04:21:43
>>981
ありがとうございます。

「関数内クラスはテンプレートクラスには使えない」
というのを聞いたことがあるのを思いだしました。


ただ、>>980 に載せたコードのコンパイルが通る理由が分かりません。
同じ関数内定義ですが、MyRand::myrand( ) は外部リンケージ可能な関数になるのでしょうか?

983 :デフォルトの名無しさん:2010/01/15(金) 04:51:51
>>982
外部リンケージが必要なのはテンプレートの実引数であって、関数の実引数じゃない。
MyRand::myrand は外部リンケージを持たないけど、それを random_shuffle() に渡した
場合のテンプレート実引数となる型は単に int (*)(int) なので、リンケージの問題はない。

984 :977:2010/01/15(金) 05:20:24
>>983
ありがとうございます。

実引数の『型』の問題ですね。
ごっちゃにしてました。

985 :デフォルトの名無しさん:2010/01/15(金) 12:16:07
それってC++0xからおkになるんだっけか



986 :デフォルトの名無しさん:2010/01/15(金) 15:35:48
T get_t();
const T &get_crt();
f(get_t());
f(get_crt()); // 違うfを呼び出す

関数の戻り値を受け取るfの定義を引数型が参照かどうかで区別したいのだが、
上記のようなオーバーロードをする方法はない?

987 :デフォルトの名無しさん:2010/01/15(金) 15:43:45
直でオーバーロードは無理

988 :デフォルトの名無しさん:2010/01/15(金) 17:42:34
そこでテンプレートですよ

989 :デフォルトの名無しさん:2010/01/15(金) 17:56:47
気になってやってみたけど
template <class T> void func(T t)
{
typedef is_ref<T>::type tag;
void func(t, tag());
}
Obj obj;
Obj &ref= obj;
func(obj);
func(ref);
見たいな感じでやろうとしたけど、だめだった

990 :989:2010/01/15(金) 17:57:51
ポインタなら同じ方法でできるんだけど参照はこの方法だとなんでかできない。よくわからないわ

991 :986:2010/01/15(金) 18:49:52
f(get_t()); // void f(T&&);
f(get_crt()); // void f(const T&);

右辺値参照があればこんな感じで区別できるはずだけど
やっぱ今のところは無理か…

992 :デフォルトの名無しさん:2010/01/15(金) 21:04:35
次スレ

C++相談室 part77
http://pc12.2ch.net/test/read.cgi/tech/1263556932/l50

993 :デフォルトの名無しさん:2010/01/15(金) 22:09:45
1000は私がとります

994 :デフォルトの名無しさん:2010/01/15(金) 22:40:34
1000なら小沢逮捕!

995 :デフォルトの名無しさん:2010/01/15(金) 22:48:37
>>1000ならポケモントレーナーに転職する

996 :デフォルトの名無しさん:2010/01/15(金) 22:51:55
でも小沢がいないと次の選挙で自民党に勝てない。

997 :デフォルトの名無しさん:2010/01/15(金) 23:12:28
997

998 :デフォルトの名無しさん:2010/01/15(金) 23:24:21
え?

999 :デフォルトの名無しさん:2010/01/15(金) 23:25:51
-_-

1000 :デフォルトの名無しさん:2010/01/15(金) 23:27:25
1000

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

237 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)