C++相談室 part76
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/12/16(水) 23:09:53ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part75
http://pc12.2ch.net/test/read.cgi/tech/1259393258/
0002デフォルトの名無しさん
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)に対応。
0003デフォルトの名無しさん
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||||||||”
"""""""" '''""""
0004デフォルトの名無しさん
2009/12/16(水) 23:10:36amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005デフォルトの名無しさん
2009/12/16(水) 23:10:48Effective 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/
0006デフォルトの名無しさん
2009/12/16(水) 23:11:00[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
0007デフォルトの名無しさん
2009/12/16(水) 23:11:14ttp://codepad.org/
長いソースを貼るときはここへ!
0008デフォルトの名無しさん
2009/12/16(水) 23:11:54久しぶりにキレたゎw
0009デフォルトの名無しさん
2009/12/16(水) 23:12:33テンプレは前スレから単純にコピペしたので修正が必要だったら指摘よろ。
0010デフォルトの名無しさん
2009/12/16(水) 23:22:09ありがとう。
>>8
くだらねー話を蒸し返すな
0011デフォルトの名無しさん
2009/12/16(水) 23:23:59環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0012デフォルトの名無しさん
2009/12/17(木) 03:07:56地鎮乙
0013デフォルトの名無しさん
2009/12/17(木) 13:44:49話の流れが分からんからなんで切れてるのか不明なんだが
後者は無名変数だから一時変数が省略されるとか起きそうな気がする
0014デフォルトの名無しさん
2009/12/17(木) 17:03:450015デフォルトの名無しさん
2009/12/17(木) 20:48:53n: |;;;;| |;;;;|
|| ヽ ヽ / /
|| , '  ̄ ̄ '、 ピカーwwwwww(お前らさあ、それこのスレと何か関係あるの?)
|| / (゚ ) ( ゚) ヽ ピカーwwwwwwww(どう考えても関係ないよね?)
f「| |^ト |(;;;) _,・、_ (;;;) | ピカチュウピカチュウピカチュウwwwwwwww(じゃあなぜそんなこと書き込んだのかな?)
|: :: ! } ヽ |-┬-| / ピッピカチュウwwwwwwww(きっとバカなんじゃないかな?)
ヽ ,イ ヽ uー'´ / ピイカァピカァwwwwwwwwwwwwwwwwwwww(精神科に行って診てもらいなよ^^)
0016デフォルトの名無しさん
2009/12/17(木) 21:12:21(C言語の場合はプロトタイプ書いたヘッダーとlibファイル)
C++でクラスを公開しないでこれをするにはどうすればいいですか?
0017デフォルトの名無しさん
2009/12/17(木) 21:26:010018デフォルトの名無しさん
2009/12/17(木) 22:13:39ファイルパスが全て小文字に変換された形で取得できます。
大文字のまま取得する方法はないですか?
0019デフォルトの名無しさん
2009/12/17(木) 22:20:22n: |;;;;| |;;;;|
|| ヽ ヽ / /ピカァwwwwピカピカwwwww(VC++2005wwww古www)
|| , '  ̄ ̄ '、 ピカーwwwwww(お前さあ、それこのスレと何か関係あるの?)
|| / (゚ ) ( ゚) ヽ ピカーwwwwwwww(どう考えても関係ないよね?)
f「| |^ト |(;;;) _,・、_ (;;;) | ピカチュウピカチュウピカチュウwwwwwwww(じゃあなぜそんなこと書き込んだのかな?)
|: :: ! } ヽ |-┬-| / ピッピカチュウwwwwwwww(きっとバカなんじゃないかな?)
ヽ ,イ ヽ uー'´ / ピイカァピカァwwwwwwwwwwwwwwwwwwww(精神科に行って診てもらいなよ^^)
0020デフォルトの名無しさん
2009/12/17(木) 23:30:230021デフォルトの名無しさん
2009/12/17(木) 23:34:50しょうがないと思われ
0022デフォルトの名無しさん
2009/12/18(金) 01:13:37インライン展開を狙って分けていないのもあります。
が、それは分ければいい話で、public関数以外は変数も見せないような
COM的なことをしたいのです。
>>17
キーワードをぐぐったら、それっぽい「インターフェースクラス」など
未知の領域があったのでもちょっと調べてみまっす。
0023デフォルトの名無しさん
2009/12/18(金) 15:47:15どのくらいC++に詳しい?
とりあえずboostとか少しでも知っている?
002423
2009/12/18(金) 15:50:37もし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)
この辺でどうだい?
0025デフォルトの名無しさん
2009/12/18(金) 17:54:180026デフォルトの名無しさん
2009/12/18(金) 17:57:150027デフォルトの名無しさん
2009/12/18(金) 18:00:51shared_ptrとかで実装されているすごいヤツ
という認識しかない。
0028デフォルトの名無しさん
2009/12/18(金) 18:24:360029デフォルトの名無しさん
2009/12/18(金) 18:26:260030デフォルトの名無しさん
2009/12/18(金) 18:31:02感謝しやがれ
0031デフォルトの名無しさん
2009/12/18(金) 18:33:520032デフォルトの名無しさん
2009/12/18(金) 19:31:07cout << 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
となると思っていたので大変予想外な結果です。
なぜでしょうか?
0033デフォルトの名無しさん
2009/12/18(金) 19:34:06未定義の動作。
未定義の動作って説明いらないよね?知ってる?
0034デフォルトの名無しさん
2009/12/18(金) 19:44:39cout << i0 << ", " << ++i0 << endl;
であれば、
cout << i0 で、i0の値(参照ではなく)がofstreamの中に入って(言い方が正しいか分かりませんが)しまうので、
(かつての)i0の値とi0本体とはもう別物である、と思ってしまいました。
0035デフォルトの名無しさん
2009/12/18(金) 19:52:08(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'''')の評価順序は未定。
003633
2009/12/18(金) 19:54:40残念ながら
初級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();
003733
2009/12/18(金) 20:03:33> (かつての)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
003832
2009/12/18(金) 20:38:47>>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
のように、引数全部をまず評価するのですね。
勉強になりました。
0039デフォルトの名無しさん
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で弄るなど考えましたが上手くいきません。
宜しくお願い致します。
004033
2009/12/18(金) 21:50:49> 左から順に評価をしないと 第1引数の std::ostream に coutが来ないので
> 上手く処理できないんではないかと。
評価順
と
優先順序
の違いってやつだな。
> のように、引数全部をまず評価するのですね。
いや、それも別に決まってはいないんだってば。
君の想定した通りにしてもいいし、しなくてもいい。
0041デフォルトの名無しさん
2009/12/18(金) 22:09:24よくわからない。
0042デフォルトの名無しさん
2009/12/18(金) 22:52:54ヒント: 文字型(char, wchar_t)はC/C++ではただの桁数の少ないint
004441
2009/12/18(金) 23:29:42(Windowsの例)
char = 8ビット 0 〜 255 の整数型
0045デフォルトの名無しさん
2009/12/19(土) 06:05:420046デフォルトの名無しさん
2009/12/19(土) 15:36:18レスありがとうございます。
入力された文字列を1文字ずつ取り出してchar型の変数に格納し、
それらの総和を計算し、最後に16進数に変換するということになるのでしょうか?
0047デフォルトの名無しさん
2009/12/19(土) 15:51:55sizeof(wchar_t) = ??
sizeof(short) = ??
0048デフォルトの名無しさん
2009/12/19(土) 16:09:40wchar_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]);
0049デフォルトの名無しさん
2009/12/19(土) 16:12:30じゃないの?
0050デフォルトの名無しさん
2009/12/19(土) 16:20:050051デフォルトの名無しさん
2009/12/19(土) 16:21:340052デフォルトの名無しさん
2009/12/19(土) 16:33:48なんだ!
この低レベルな議論はw
char以外、サイズは決まってないだろ?
だいたい>>47の言う通りsizeofを何故使わない?
0053デフォルトの名無しさん
2009/12/19(土) 17:32:460054デフォルトの名無しさん
2009/12/19(土) 17:41:110055デフォルトの名無しさん
2009/12/19(土) 17:47:39環境依存に決まってんだろ
それぐらい知らないようではC/C++やる資格はねぇ。
0056デフォルトの名無しさん
2009/12/19(土) 19:22:010057デフォルトの名無しさん
2009/12/19(土) 19:37:120058デフォルトの名無しさん
2009/12/19(土) 19:39:390059デフォルトの名無しさん
2009/12/19(土) 20:07:45g++でコンパイルしてみたら
error: 'long long long' is too long for GCC
だってさ。ユーモアあるな。
0060デフォルトの名無しさん
2009/12/19(土) 20:40:384つ並べてもメッセージ同じだった。
どうして3つだけなのよォオオオ〜ッ!!
0062デフォルトの名無しさん
2009/12/19(土) 20:45:04これやってみ。
0063デフォルトの名無しさん
2009/12/19(土) 20:54:39#include <limits.h>
#define < =
#define あふれとるやんけ ULLONG_MAX + 1
typedef unsigned long long (;一_一);
int main()
{
(;一_一) つ < あふれとるやんけ;
return 0;
}
0064デフォルトの名無しさん
2009/12/19(土) 22:26:52ごち!
面白かった
0065デフォルトの名無しさん
2009/12/20(日) 03:11:18ttp://gcc.gnu.org/ml/gcc-patches/2006-07/msg00647.html
0066デフォルトの名無しさん
2009/12/20(日) 12:44:40このクラスの定義はするが
オブジェクトは作られたくない
という場合、どう実現すればよいでしょうか?
0067デフォルトの名無しさん
2009/12/20(日) 12:45:39純粋仮想関数を最低一つ入れる
0068デフォルトの名無しさん
2009/12/20(日) 12:48:52006966
2009/12/20(日) 13:37:49> 純粋仮想関数を最低一つ入れる
> コンストラクタをprivateにする
両方必要そうなので、両方やります。
ありがとうございました。
0070デフォルトの名無しさん
2009/12/20(日) 14:00:19継承する気がないなら68だけにしろ
仮想関数入れるとサイズ無駄にでかくなるから
あとデストラクタもprivateにすることをお勧めする
0071デフォルトの名無しさん
2009/12/20(日) 15:41:20if ( 条件式 ){} というのがありますが、これって条件式は実際には実行されるのでしょうか?
たとえば、関数func()があるとします。
if ( func() != 0 ){}などにした場合、関数自体は実行されちゃうのでしょうか?
0072デフォルトの名無しさん
2009/12/20(日) 15:43:180073デフォルトの名無しさん
2009/12/20(日) 15:50:05ありがとうございます。
0074デフォルトの名無しさん
2009/12/20(日) 15:57:28見聞きしただけで覚えたつもりになるのは良くない
0075デフォルトの名無しさん
2009/12/20(日) 15:58:55働いてfunc()は実行されないからね
分かってると思うけど
007669
2009/12/21(月) 20:39:19ありがとうございます。
継承するつもりはないのですが、
誰かが勝手に継承する可能性を考えてそれを封じる
必要がありました。
また、コンストラクタをprivateにするだけではnew演算子で生成される可能性もありました。
そのため、
> 純粋仮想関数を最低一つ入れる
> コンストラクタをprivateにする
> デストラクタもprivateに
この3つを全て適用しようかな、と思っておりました。
・・・現実的にはやり過ぎですかね。
0077デフォルトの名無しさん
2009/12/21(月) 21:01:33>誰かが勝手に継承する可能性を考えてそれを封じる
privateコンストラクタで封じれる
>コンストラクタをprivateにするだけではnew演算子で生成される可能性もありました
ありません
まあ、それでも無理矢理作る方法はあるが、それはどうやったって防げないから無駄
純粋仮想関数は何の意味もない
やめとけ
0079デフォルトの名無しさん
2009/12/21(月) 22:06:16> それでも無理矢理作る方法はあるが
俺思いつかないんだけど、それってどうやるの?
(そのクラスのソースを直接改変するわけじゃないよね?)
0080デフォルトの名無しさん
2009/12/21(月) 22:37:05#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);}
}
適当に思いついただけ
もちろんほとんどは規格違反か使える状況が限られてる
0081デフォルトの名無しさん
2009/12/21(月) 23:08:00おう!すげーな。
特に1つ目なんかもう。
サンクス。
0082デフォルトの名無しさん
2009/12/21(月) 23:54:181つめと似たようなものがよくマ板の会社辞めようと思ったソーススレに貼ってあるようなw
0083デフォルトの名無しさん
2009/12/22(火) 08:45:30全然意味がわからん。解説してくれ
0084デフォルトの名無しさん
2009/12/22(火) 10:12:24#define private publicでふいたw
0085デフォルトの名無しさん
2009/12/22(火) 10:46:150086デフォルトの名無しさん
2009/12/22(火) 10:50:42規約違反したらどんな事でも鼻から精液出てくるとでも思ってるのかね。
0087デフォルトの名無しさん
2009/12/22(火) 10:52:050088デフォルトの名無しさん
2009/12/22(火) 11:09:08何をもって未定義とするかって、そりゃ、規格で未定義の動作と定められているものだろうよ。
0089デフォルトの名無しさん
2009/12/22(火) 11:20:47これってメンバ関数テンプレートがあった場合の話だよね?
自前のクラスにメンバ関数テンプレートを装備した場合、こんな感じで
private メンバを悪用する手段になっちゃうのはしょうがないのかな?
0090デフォルトの名無しさん
2009/12/22(火) 14:03:02その辺は割り切るしかない
0091デフォルトの名無しさん
2009/12/22(火) 17:30:15#define private public
なんてやられるともう何をやっても止められない
0092デフォルトの名無しさん
2009/12/22(火) 17:47:340093デフォルトの名無しさん
2009/12/22(火) 17:49:21こういうのもっと教えてくれw
0094デフォルトの名無しさん
2009/12/22(火) 17:51:510095デフォルトの名無しさん
2009/12/22(火) 17:54:190096デフォルトの名無しさん
2009/12/22(火) 21:20:22それ、アクセス指定子をちゃんと書いてれば意味ないような。
0097デフォルトの名無しさん
2009/12/22(火) 21:22:100098デフォルトの名無しさん
2009/12/22(火) 22:11:28未定義の動作も甚だしい。
>>86
> 特定の処理系でならちゃんと動作を説明できるのに
お前、まさかとは思うが
未定義の動作
って何か知らない・・・なんてことはないよな?
お前のレスを見ている限り、激しい無知っぷり以外伝わってこないんだが。
0099デフォルトの名無しさん
2009/12/22(火) 22:24:25> ゲッタセッタ教信者が発狂する様な一行だね
ゲッタセッタ狂信者もantiゲッタセッタ信者も、
どっちにもたたかれる一行だなw
0100デフォルトの名無しさん
2009/12/22(火) 22:54:51get〜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;
}
0101デフォルトの名無しさん
2009/12/22(火) 23:59:07get、setを排除するのは、クラスの外からクラスの中身を見えなくする隠蔽が目的なんだね。get、setを使わなければいいというものではない。
クラスを隠蔽して外から見た挙動が適切なら、クラスの中はどんなにスパゲッティでも問題ない。
0102デフォルトの名無しさん
2009/12/23(水) 01:12:180103デフォルトの名無しさん
2009/12/23(水) 02:34:50#undef private
をつけたらエラーの山・・・・・・
0104デフォルトの名無しさん
2009/12/23(水) 08:19:39なんつー職場だwww
0105デフォルトの名無しさん
2009/12/23(水) 11:35:35#if defined(private) || defined(protected) || defined(class)
#error やめろ馬鹿
#endif
0106デフォルトの名無しさん
2009/12/23(水) 11:47:38#undef protected
#undef class
#if defined(private) || defined(protected) || defined(class)
#error やめろ馬鹿
#endif
#define private public
#define protected public
#define class struct
0107デフォルトの名無しさん
2009/12/23(水) 12:03:38ワロスw
0108デフォルトの名無しさん
2009/12/23(水) 12:51:02なんてこったい
0109デフォルトの名無しさん
2009/12/23(水) 12:55:070110デフォルトの名無しさん
2009/12/23(水) 13:10:21それだとコンパイルエラーが出ることがあるだろう。
だから
const_cast<T>()
static_cast<T>()
あたりを全部自作テンプレートになおして
T()
これでかんぺき
0111デフォルトの名無しさん
2009/12/23(水) 14:32:43#define class structを防止するためだったのか。
privateとかも他に何かの役割を持たせればよかったのに。
0112デフォルトの名無しさん
2009/12/23(水) 14:45:29class Hoge
{
private:
Fuga fuga;
};
#undef private
これでおk
0113デフォルトの名無しさん
2009/12/23(水) 14:59:24int いんと
char ちゃー ←読み方これでいいですか?それとも文字の意味でキャラですか?
0114デフォルトの名無しさん
2009/12/23(水) 14:59:56シャア
0115デフォルトの名無しさん
2009/12/23(水) 15:03:52ちゃーでもきゃらでも好きな呼び方でい
ただししーえっちえーあーるだけはナシな
0116デフォルトの名無しさん
2009/12/23(水) 15:07:47(^^;)
>>115
ありがとうございます。ちゃーの方がすきなのでちゃーにします
0117デフォルトの名無しさん
2009/12/23(水) 15:20:090118デフォルトの名無しさん
2009/12/23(水) 15:20:40キャラ派
チャル派
シャア派
char c;
ちゃーしー
きゃらしー
ちゃるしー
しゃあしー
読みやすいものでいいぞ。
0119デフォルトの名無しさん
2009/12/23(水) 15:23:110120デフォルトの名無しさん
2009/12/23(水) 15:33:070121デフォルトの名無しさん
2009/12/23(水) 15:52:140122デフォルトの名無しさん
2009/12/23(水) 15:58:170123デフォルトの名無しさん
2009/12/23(水) 16:00:05うきゃーっ
0124デフォルトの名無しさん
2009/12/23(水) 16:03:59俺は「ワロスチャート」と読んでる
0125デフォルトの名無しさん
2009/12/23(水) 16:06:530126デフォルトの名無しさん
2009/12/23(水) 16:11:21マ板でやってくれ。
【char】変な読み方するな その3【ちゃー】
http://pc11.2ch.net/test/read.cgi/prog/1242268027/
0127デフォルトの名無しさん
2009/12/23(水) 17:18:44ム板向きの内容だろうに
0128デフォルトの名無しさん
2009/12/23(水) 17:20:57行く行くは可変引数テンプレートと多重継承使ってウンコテクニック披露する輩が出てきそうな志向だな
0129デフォルトの名無しさん
2009/12/23(水) 17:24:100130デフォルトの名無しさん
2009/12/23(水) 17:40:26n1615とか
0131デフォルトの名無しさん
2009/12/23(水) 17:47:370132デフォルトの名無しさん
2009/12/23(水) 23:16:100133デフォルトの名無しさん
2009/12/23(水) 23:22:550134デフォルトの名無しさん
2009/12/24(木) 01:36:58Boost.Property がこの方向だと思う。Boost ってついてるけど Boost 公式じゃない。
0135デフォルトの名無しさん
2009/12/24(木) 06:20:08CamelCase
camel_case
camelCase
のどれだっけ?
0136デフォルトの名無しさん
2009/12/24(木) 06:34:010137デフォルトの名無しさん
2009/12/24(木) 06:35:44好きにしろよ他人に強要するなな感じのテクニック? >>128
0138135
2009/12/24(木) 11:13:10その程度の枝葉末節は知った上でめんどくさいからCamelCaseで書いたに決まってんじゃん。
そんなに気になるなら
BjarneStroustrup
bjarne_stroustrup
bjarneStroustrup
これで。
0139デフォルトの名無しさん
2009/12/24(木) 11:56:410140デフォルトの名無しさん
2009/12/24(木) 14:06:45それをコンパイルしようとするとプロジェクトのメインで書いておいたものがコンパイルされてしまい、わざわざ別のプロジェクトだして、コンパイルするんですがめんどくさくてなりません。
同じプロジェクト内に別のcpp作ってテスト的にそれだけコンパイルする方法ってないですか?
0141デフォルトの名無しさん
2009/12/24(木) 14:12:030142デフォルトの名無しさん
2009/12/24(木) 14:13:260143デフォルトの名無しさん
2009/12/24(木) 14:13:40複数のプロジェクトを追加できるわけで。
0144デフォルトの名無しさん
2009/12/24(木) 14:27:33main.cppに書けばいいんじゃ?
0145デフォルトの名無しさん
2009/12/24(木) 16:51:12実験したくなったらメソッドにかく
0146デフォルトの名無しさん
2009/12/24(木) 17:14:020147デフォルトの名無しさん
2009/12/24(木) 20:51:22あまり良くないと言いますが何故ですか?
だって、標準のライブラリー群だから、そこら辺を考えて設計してるでしょ(知らないけど)
0148デフォルトの名無しさん
2009/12/24(木) 20:52:22嫌ならローカルスコープで名前エイリアス作れば良いよ
0149デフォルトの名無しさん
2009/12/24(木) 20:55:16ありがとう。
> 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.
これだこれ。
0150デフォルトの名無しさん
2009/12/24(木) 20:59:38SVNにも載せてない様な.cppにusingして文句言われる筋合いは無い
と書くとファビョり始めるかな
0151デフォルトの名無しさん
2009/12/24(木) 21:00:30標準や準標準の関数などが増えてゆくからだったと思う。
まあ、言語設計上のミスだよねこれ。
0152デフォルトの名無しさん
2009/12/24(木) 21:00:47> そこら辺を考えて設計してるでしょ(知らないけど)
はい?何を言っているのだ?
ライブラリーとかいう言い回しからしても余り詳しくないっぽいな。
using namespace std;
swap(MyClass());
と
using std::swap;
swap(MyClass());
の違いが分からないレベルなら
using namespace std;など使うな。
0153デフォルトの名無しさん
2009/12/24(木) 21:04:34名前空間に対するusingの話をしているのに何いきなりusing std::swap;とか引き合いに出しちゃってるの?w
文脈が分からないレベルなら日本語を勉強しましょうねw
0154デフォルトの名無しさん
2009/12/24(木) 21:06:25using ::swap;
}
0155デフォルトの名無しさん
2009/12/24(木) 21:09:34普通に考えて質問者は、わからなくて質問してるんだから
ムキにならなくてもいいと思うよ
0156デフォルトの名無しさん
2009/12/24(木) 21:11:37詳しくないって分かるなら教えてあげれば良いのに人の揚げ足取ってばかりで現実でも人望なさそう。
0157デフォルトの名無しさん
2009/12/24(木) 21:12:120158デフォルトの名無しさん
2009/12/24(木) 21:18:52ということはグローバル空間そのものを否定するか?
初心者が書くコードにいきなりクラスメソッドが出てくるアレなら設計ミスがなかったとでも?
0159デフォルトの名無しさん
2009/12/24(木) 21:41:42/ ヽ
>>152 ,/ ヽ
. ∧_∧ ,/ ヽ
( ´∀`) ,/ ヽ
( つ@ ヽ
.__ | | | ヽ
|――| (__)_) ヽ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ヽ
/⌒\/⌒\/⌒\/⌒\|彡~゚ ゜~ ~。゜ ~ ~ ~ ~~ ~ ~~ ~ ~~ ~~ ~~
⌒\/⌒\/⌒\/⌒\/⌒\彡 〜 〜〜 〜〜 〜〜 〜 〜
│
│
│
人人人人人人人 ∧J∧
< > ( / ⌒ヽ
< 吊られちゃった > | | | >>○
< > ∪ / ノ
∨∨∨∨∨∨∨ | ||
∪∪ >>153
0161デフォルトの名無しさん
2009/12/24(木) 22:01:03おk。
>>152も、
> > そこら辺を考えて設計してるでしょ(知らないけど)
> はい?何を言っているのだ?
このやりとりを
> > そこら辺を考えて設計してるでしょ(知らないけど)
> いいえ、名前が衝突することは標準のstd名前空間といえども
> 特別な対応策がなされているわけではありません。
と解釈するなら信じておk。
0163デフォルトの名無しさん
2009/12/24(木) 22:56:52このAA初めて見たわ
0164デフォルトの名無しさん
2009/12/24(木) 23:53:140165デフォルトの名無しさん
2009/12/24(木) 23:56:40返り値などの一時オブジェクトの場合にそれを実現する方法はありますか?
感覚的には↓のようなことがしたいです
http://codepad.org/dhFsqyT1
スマポを使えば可能なんですが、動的確保はコストが気になるので避けたいです
0166デフォルトの名無しさん
2009/12/25(金) 00:27:58本当に動的確保のコストが問題になるレベルなのか検討してみるのもいいかもね。
0167デフォルトの名無しさん
2009/12/25(金) 00:44:55逆にそれを隠蔽しようというのだから、どうやっても動的確保するしかないと思う。
0168デフォルトの名無しさん
2009/12/25(金) 11:49:00JavaScript は jquery.js や prototype.js などのライブラリ
などを言語学習には読んでトレースして改造すると
自分にとってすんなり覚えられたのですが、
C++ の場合はどういうものが挙げられますでしょうか?教えやがってください。
0169デフォルトの名無しさん
2009/12/25(金) 12:08:52dynamic_castとかは便利そうなので、使っている人が多そうですけど
0170デフォルトの名無しさん
2009/12/25(金) 12:14:590171デフォルトの名無しさん
2009/12/25(金) 12:16:39使わなくても良いように設計できるならそうする
APIやライブラリのせいで使わなくてはいけない状況なら使うが
使わなければいけないように設計することは避けたい
0172デフォルトの名無しさん
2009/12/25(金) 12:59:12Boost
0173デフォルトの名無しさん
2009/12/25(金) 13:13:230174デフォルトの名無しさん
2009/12/25(金) 13:25:36インスタンスの本来の型が分かっている場合のダウンキャストとか
0175デフォルトの名無しさん
2009/12/25(金) 13:29:060176デフォルトの名無しさん
2009/12/25(金) 16:07:460177デフォルトの名無しさん
2009/12/25(金) 16:46:200178デフォルトの名無しさん
2009/12/25(金) 16:56:59Perlの埋め込みはまた別なのですね
0179デフォルトの名無しさん
2009/12/25(金) 18:06:09多重継承したクラスを扱うときは気を付けろよ
0180デフォルトの名無しさん
2009/12/25(金) 18:31:40どうすればいいでやんす?
0181デフォルトの名無しさん
2009/12/25(金) 18:33:210182デフォルトの名無しさん
2009/12/25(金) 18:37:220183デフォルトの名無しさん
2009/12/25(金) 18:55:16サンキューでござる
くわしくしらべてみるでおじゃるまる
0184デフォルトの名無しさん
2009/12/25(金) 20:53:27dynamic_castよりstatic_castを使う。
理由はstatic_castの方がが速いから。
0185デフォルトの名無しさん
2009/12/25(金) 20:55:02コンパイルタイムにキャストを解決できる時にstatic_castを、動的型付けなオブジェクトに対するキャストではdynamic_castだろうが。
0186デフォルトの名無しさん
2009/12/25(金) 21:11:13dynamic_castなんて使ってないよ。
大して便利じゃないというか使わなきゃならない状況にならない。
static_castと比較するもなにも、そもそも用途がぜーんぜん違う。
0187デフォルトの名無しさん
2009/12/25(金) 21:44:150188デフォルトの名無しさん
2009/12/25(金) 23:20:050189デフォルトの名無しさん
2009/12/26(土) 00:39:49そういうときはboost::polymorphic_downcastがおすすめ。
>>187
zlibでも使え。
0190デフォルトの名無しさん
2009/12/26(土) 08:35:51inline To dream_cast(const From &from) { return (To)from; }
0191デフォルトの名無しさん
2009/12/26(土) 09:14:55わかっちゃうと効率的ですげーなと思うけど
0192デフォルトの名無しさん
2009/12/26(土) 11:22:22ありがとう。これでやってみます
0193デフォルトの名無しさん
2009/12/26(土) 11:49:56動的に確保した配列にdelete[]を実行すると、しっかりと配列は解放されますよね?
メモリのどこかに配列の長さが格納されていると踏んだのですが…
一体どこに格納されているのでしょうか?
それとも格納はされていないのですか?
0194デフォルトの名無しさん
2009/12/26(土) 11:57:480195193
2009/12/26(土) 12:00:020196デフォルトの名無しさん
2009/12/26(土) 12:40:03型によっては必要ないので、どこにも格納されてないこともある。
格納されていたとしても、ユーザーがそれを取り出す手段はない。
配列 new/delete なんか使わずに std::vector 使うのがおすすめ。
要素数もちゃんとある。
0197デフォルトの名無しさん
2009/12/26(土) 12:47:39まず、
クラスのカプセル化という概念を知っているか?
インターフェースだけ理解させてそのクラスの内部の実装は
ブラックボックスにして触れなくて良いようにし、
また触れることを禁じていること。
> メモリのどこかに配列の長さが格納されていると踏んだのですが…
君と同じ発想でコンパイラの作者が作っていればそうなる。
だが上述のクラスのカプセル化と似たように、
どこに長さが格納されて居るだとかそう言った実装については
触れないし触れてはならないことなのだ。
0198デフォルトの名無しさん
2009/12/26(土) 13:06:05早くC++0xこないかな
0199デフォルトの名無しさん
2009/12/26(土) 13:13:35それでも配列 new よりはマシだろ。
0200デフォルトの名無しさん
2009/12/26(土) 13:18:110201デフォルトの名無しさん
2009/12/26(土) 13:23:440202デフォルトの名無しさん
2009/12/26(土) 14:03:450203デフォルトの名無しさん
2009/12/26(土) 14:52:470204デフォルトの名無しさん
2009/12/26(土) 14:57:14libcurlお勧め
0205デフォルトの名無しさん
2009/12/26(土) 14:58:12気になるならドキュメント読めよw
0206デフォルトの名無しさん
2009/12/26(土) 15:04:26たまに猛烈に時間がかかるけどたまにだから平均したらO(1)っていうやつ
0207デフォルトの名無しさん
2009/12/26(土) 15:05:23それは末尾追加( push_back() )の計算時間な。
アクセスはランダムアクセス可能で O(1) だよ。
0208デフォルトの名無しさん
2009/12/26(土) 15:10:03ドキュメントを読んで!ライフが0よ。
0209デフォルトの名無しさん
2009/12/26(土) 15:16:480210デフォルトの名無しさん
2009/12/26(土) 15:17:50処理速度向上のため初期サイズを予め決めておくことはできますでしょうか。
0211デフォルトの名無しさん
2009/12/26(土) 15:18:550212デフォルトの名無しさん
2009/12/26(土) 15:19:15どっかに「このドキュメントでは計算量と言えば全部amortizedのことですよー」って書いてなかったっけ
0213デフォルトの名無しさん
2009/12/26(土) 15:29:05std::map に push_back() はありません。 insert() のことでしょうか?
メモリ確保のために必要な時間が(ほんとうに)問題だということなら、
operator new (およびその下層)の置き換えやカスタム Allocator の指定が
使えるかもしれません。
0214デフォルトの名無しさん
2009/12/26(土) 15:30:25そのドキュメントにそう書いてあったとしても、標準規格に書いてないなら関係ないね。
0215デフォルトの名無しさん
2009/12/26(土) 15:30:45すいませんinsertの間違いでした。
vectorのreserveに相当する関数はないのでしょうか。
0216デフォルトの名無しさん
2009/12/26(土) 15:31:47無いよ。必要無いだろうし。
0217デフォルトの名無しさん
2009/12/26(土) 19:30:09マクロって奴はパラーメタ必須ってイメージがありますが、そういうわけじゃないんですかね?
そして、マクロから普通のコードを読み込めましたよね?
0218デフォルトの名無しさん
2009/12/26(土) 19:33:420219デフォルトの名無しさん
2009/12/26(土) 19:45:39> マクロって奴はパラーメタ必須ってイメージがありますが
そんなイメージねぇよww
パラーメタ・・・は まあ おいとく として、どこの言語から来た人?
C系列じゃないよね?
> そして、マクロから普通のコードを読み込めましたよね?
このスレにエスパーはいらっしゃいませんか?
0220デフォルトの名無しさん
2009/12/26(土) 19:46:540221デフォルトの名無しさん
2009/12/26(土) 19:48:310222デフォルトの名無しさん
2009/12/26(土) 19:49:09もうこれ以上スプーン曲げないでくれ。
分かったら帰ってくれ。
0223デフォルトの名無しさん
2009/12/26(土) 19:52:54残念だがそれは普通の能力だ
0224217
2009/12/26(土) 19:55:30javaから来た人間です
C言語はあんまりわかりません
>マクロから普通のコードを読み込めましたよね?
IOCCCの作品に1文字しか書いていないプログラムがあったような〜
0225デフォルトの名無しさん
2009/12/26(土) 20:06:09唯一わかるのは、マクロについて根本的な何かを勘違いしているんだろうな、ということで。
0226デフォルトの名無しさん
2009/12/26(土) 20:12:22だとしても意味はわからない
0227デフォルトの名無しさん
2009/12/26(土) 20:17:56std::cout << "hoge";
みたいに、ストリームをフラッシュしないで終了しているコードがあるわけですが
大丈夫なんですかね?
0228デフォルトの名無しさん
2009/12/26(土) 20:19:08うん。
彼の言うマクロが#includeだとすると、確かに3行目は成立するが、
今度は1行目と2行目がつながらなくなる。
頼む、もうちょっと日本語でおk
0229デフォルトの名無しさん
2009/12/26(土) 20:21:10マクロアセンブラなんかだと簡単な計算もできるのが多いけど、
Cプリプロセッサはそこまでじゃないよね。
0230デフォルトの名無しさん
2009/12/26(土) 20:31:07大丈夫だよ。
でも気持ち悪いよね。
0231デフォルトの名無しさん
2009/12/26(土) 20:32:49> マクロアセンブラなんかだと簡単な計算もできるのが多いけど、
> Cプリプロセッサはそこまでじゃないよね。
何十年前の話をしているのだい?
そもそもプリプロセス処理というものは…(ryめんどくさ
0233デフォルトの名無しさん
2009/12/26(土) 20:37:02プログラム終了時に閉じられるから問題ない。
0234デフォルトの名無しさん
2009/12/26(土) 20:42:21「文字列をあるルールに従って置換する」だけのプリプロセッサで、
簡単な計算もできるようにしてしまうクレイジーなやつが世の中いるものだ。
http://d.hatena.ne.jp/qnighy/20091107/1257587259
http://d.hatena.ne.jp/DigitalGhost/20090624/1245829833
0235デフォルトの名無しさん
2009/12/26(土) 20:45:12プリプロセッサメタプログラミングだぜ?
本当にやりやがった・・・的な衝撃が走る。
0236デフォルトの名無しさん
2009/12/26(土) 20:46:17学習しなくなるから使わないほうがいいよ
0237デフォルトの名無しさん
2009/12/26(土) 20:50:23それは違うな
使わなければ学習していくとは限らない
むしろ、使わない方法で満足する場合、それ以上の学習をしなくなる可能性もある。
つまり楽になることと学習しなくなることに強い因果関係はない
0238デフォルトの名無しさん
2009/12/26(土) 20:53:060240デフォルトの名無しさん
2009/12/26(土) 20:57:13君は全部アセンブラでコードを書くのですか?
0241デフォルトの名無しさん
2009/12/27(日) 11:41:58virtualがついたメンバも実装をしている場合があるので
0242デフォルトの名無しさん
2009/12/27(日) 11:44:17virtual がついていればオーバーライド可能になります。
virtual に加えて = 0 がついていれば、オーバーライドが必須(抽象メソッド?)になります。
0243デフォルトの名無しさん
2009/12/27(日) 11:52:40抽象メソッドという用語が存在しないので、
君が「抽象メソッド」という言葉にどういった意味を
求めているのか分からん。
> virtualがついたメンバも実装をしている場合があるので
初心者にはロベールのC++教室がオススメ。
例えば
ロベールのC++教室 - 第14章 仮想関数 -
ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02014.html
とか。
0244243
2009/12/27(日) 11:53:57> virtual がついていればオーバーライド可能になります。
(まあ初心者向けに教えるならそれでも良いかもしれないが)
別にvirtual付いて無くても、オーバーライド可能か不可能かと言えば
一応可能だよな。デザインとして良いかどうかはともかく。
0245デフォルトの名無しさん
2009/12/27(日) 11:54:30abstract methodだろ?
0246デフォルトの名無しさん
2009/12/27(日) 11:57:550248デフォルトの名無しさん
2009/12/27(日) 12:05:41どうやってやるの?
0249デフォルトの名無しさん
2009/12/27(日) 12:08:290250243
2009/12/27(日) 12:28:07親クラスのメンバ関数をオーバーライドする・・・って話だよな?
どうやってもなにも、普通にできるじゃん。
(俺の > オーバーライド可能か不可能かと言えば一応可能)
ただし親クラスのポインタから呼び出したときに
子クラスのメンバ関数は呼び出されないが。
(俺の> デザインとして良いかどうかはともかく。)
>>249
していないよ。
0251デフォルトの名無しさん
2009/12/27(日) 12:31:26「override」って言葉の意味分からないなら語るな。
0252デフォルトの名無しさん
2009/12/27(日) 12:32:50>ただし親クラスのポインタから呼び出したときに
>子クラスのメンバ関数は呼び出されないが。
それってオーバーライドしてないじゃん
0253デフォルトの名無しさん
2009/12/27(日) 12:36:10君はオーバーライドを知っているのか?
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.
0254デフォルトの名無しさん
2009/12/27(日) 12:50:230255デフォルトの名無しさん
2009/12/27(日) 12:53:11だから仮想関数の話が出てくるんだと思う。
0256デフォルトの名無しさん
2009/12/27(日) 12:57:17それ以上の意味はない
0257デフォルトの名無しさん
2009/12/27(日) 12:59:30同じシグネチャのメンバー関数
とした方がいいかな。
特にコンストラクタのオーバーロード(引数が違う)があるとややこしいので。
0258デフォルトの名無しさん
2009/12/27(日) 12:59:33class 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を外したらやっぱり隠蔽だろ。
0259デフォルトの名無しさん
2009/12/27(日) 13:00:40class Bar : public Foo { public: virtual void A() ... (2)
のtypo
0260デフォルトの名無しさん
2009/12/27(日) 13:02:04違いますよ。
それは「override」って言葉の定義、
特に十分条件を説明をするための例じゃない。
どういう時にvirtualなのかって例。
子クラスでvirtual宣言せんでもいいよって話。
0261デフォルトの名無しさん
2009/12/27(日) 13:03:17>>257 コンストラクタもオーバーロードも関係ないし。
0262デフォルトの名無しさん
2009/12/27(日) 13:08:54>子クラスでvirtual宣言せんでもいいよって話。
おれもそう解釈してて、
>>253の引用は的外れだといいたいのだが。
議論してるのはC++でのoiverrideの意味や用い方についてだよな?
0263デフォルトの名無しさん
2009/12/27(日) 13:10:52何を根拠にそんなこと言ってんの?
>>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.
0264デフォルトの名無しさん
2009/12/27(日) 13:12:56注釈で記載してある。
0265243
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)
> };
まじさーせん。
0266デフォルトの名無しさん
2009/12/27(日) 13:25:12こういう議論がちゃんと(仕様書にあるように)決着付くんだもん。
2chではある意味貴重とも言える。
0267266
2009/12/27(日) 13:26:09○ 仕様書がルールブックとして機能するため
0268デフォルトの名無しさん
2009/12/27(日) 13:33:55○ 規格
0269デフォルトの名無しさん
2009/12/27(日) 13:50:22○ 仕様書なんかクソくらえ
0270デフォルトの名無しさん
2009/12/27(日) 13:57:02「標準C++(ISO C++)の規格」
って英語で何て言うの?
0271デフォルトの名無しさん
2009/12/27(日) 13:59:390272デフォルトの名無しさん
2009/12/27(日) 14:00:52C++ではCでえらく話がループしまくったmalloc/freeについては
どう定義されてるのかな
new/deleteも同じ問題だと思うけど
0273デフォルトの名無しさん
2009/12/27(日) 14:02:18「標準」も「規格」も "Standard" だから、日本語でも「標準C++(ISO C++)の規格」なんて言わない。
0274デフォルトの名無しさん
2009/12/27(日) 14:03:550275デフォルトの名無しさん
2009/12/27(日) 14:16:02そういう安価は馬鹿でも付ける事ができる
ここで聞いてんだから何か言えよ
0276デフォルトの名無しさん
2009/12/27(日) 14:19:13手を抜きすぎるからいろいろ食い違う
0277270
2009/12/27(日) 14:24:34標準C++
と呼ぶってわけね。
0278デフォルトの名無しさん
2009/12/27(日) 14:45:470279>>243 >>265
2009/12/27(日) 14:48:26うむ。
今回は本当に全面的に俺の誤りであった。
2010年はもっと腰を低くします。
0280デフォルトの名無しさん
2009/12/27(日) 15:03:16「標準規格」だと standard standard になるから、どっちかひとつでいい。
0282デフォルトの名無しさん
2009/12/27(日) 15:23:40英語ではわざわざ言わないってだけで
0283デフォルトの名無しさん
2009/12/27(日) 15:31:54規格化=standardizationだぞ。
規則の「規」に定格の「格」
stardard specificationで標準仕様。
日本語も英語も形容だけ取って、
標準、規格、stardardということがあるし、
用法が定着しているから、
この短い表現も辞書に載ってる。
0284デフォルトの名無しさん
2009/12/27(日) 16:16:27「標準外規格」っていう言葉もあるんだし
どっちも英語でstandardだから日本語でも同じ意味であるべきというのは横暴
0285デフォルトの名無しさん
2009/12/27(日) 16:37:140286デフォルトの名無しさん
2009/12/27(日) 17:02:520287デフォルトの名無しさん
2009/12/27(日) 17:28:22> 「標準外規格」っていう言葉もあるんだし
ほぅ。
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件と似たページは除外されています。
「標準外・規格外」と併記されている場合の検索結果が混ざっても、この程度。
「規格外」と言えば済むところを変にかぶせてるのがほとんど。
0288デフォルトの名無しさん
2009/12/27(日) 18:18:12standard of measure
0289デフォルトの名無しさん
2009/12/27(日) 22:58:49「標準的でない規格」と「規格に従ってないもの」は違うだろ
HD-DVDとCCCDを同じと言ってるような乱暴さを感じる
0290デフォルトの名無しさん
2009/12/27(日) 23:04:38privateのメリットがわかりません。どなたか教えてください
0291デフォルトの名無しさん
2009/12/27(日) 23:06:41unsigned longとかいってるHPありますが、引数にint func( unsined long num)なんてあったら引数に渡しても大丈夫なんですか?
今までint func( size_t )こんな関数の引数に渡したことくらいしかないのでわからないんですが
0292デフォルトの名無しさん
2009/12/27(日) 23:15:570293デフォルトの名無しさん
2009/12/27(日) 23:23:330294デフォルトの名無しさん
2009/12/27(日) 23:29:52class Super {
public:
void f();
};
class Sub : private Super {
};
void g() {
Sub().f(); // fにアクセスできない
}
0295デフォルトの名無しさん
2009/12/27(日) 23:49:25なら違いがわかるように「標準的でない規格」って言えよ。
「標準」をそういう意味に使うとしても C++ の規格を指して「標準規格」と呼ぶのが
冗長であることに変わりはない。「標準」以外に「やさしい」とか「むずかしい」とかいう
程度があるものじゃないんだから。
0296デフォルトの名無しさん
2009/12/28(月) 00:06:48日本語の「標準」にはそういう意味しかないんだけど?
「規格」だって単に決め事のことで、それ自体に遍く使われているという意味はない
「標準規格」で初めて英語のStandardに近い意味合いになる
日本語と英語は一対一に対応してるわけではないんだけどなぁ
日本の英語教育と国語教育のせいかな
0297デフォルトの名無しさん
2009/12/28(月) 00:37:28> 日本語の「標準」にはそういう意味しかないんだけど?
ひょうじゅん【標準】の意味 国語辞典 - goo辞書
http://dictionary.goo.ne.jp/leaf/jn/165187/m0u/%E6%A8%99%E6%BA%96/
> (1)物事を行う場合のよりどころとなるもの。
なんでちょっと辞書引くだけの確認もせずに自分の脳内設定が正しいと言い切っちゃうの?
> 「規格」だって単に決め事のことで、それ自体に遍く使われているという意味はない
C++ の規格(あるいは標準)と言った場合にそれ自体に遍く使われているという意味はない。
そういう意味を込めたいなら ISO の規格だとか JIS の規格だとか言えばいい。
わざわざ似たような意味の言葉をならべて意味が不明瞭になる可能性を高める必要はない。
0298デフォルトの名無しさん
2009/12/28(月) 00:37:520299デフォルトの名無しさん
2009/12/28(月) 00:39:590300デフォルトの名無しさん
2009/12/28(月) 00:41:29スマートポインタの設計によります。
std::auto_ptr, boost::shared_ptr, boost::scoped_ptr などは、それを使うためにクラス側の
変更を必要としません。
boost::intrusive_ptr はクラス側で準備してやる必要があります。このような性質を、
「侵入的」 "intrusive" といいます。
0301デフォルトの名無しさん
2009/12/28(月) 00:49:04へぇへぇへぇ。298じゃないけど勉強になった。
0302デフォルトの名無しさん
2009/12/28(月) 09:39:58void foo(){std::cout << std::endl;}
という関数を定義することができるよね?
このfoo()は戻り値をあたかも返していないように見えるが、
実際は返している。ただしその値を取得しようとするとコンパイルエラーとなる
・・・という理解であってますか?
0303デフォルトの名無しさん
2009/12/28(月) 09:46:52でいいじゃん
0304デフォルトの名無しさん
2009/12/28(月) 09:52:25foo()の戻り値を無理矢理取得することはできませんかね?
0306デフォルトの名無しさん
2009/12/28(月) 11:05:29未定義
0307デフォルトの名無しさん
2009/12/28(月) 11:07:57どんな値が欲しいのさ?
0308デフォルトの名無しさん
2009/12/28(月) 11:13:20未定義でもいいんでコンパイルエラーにならないで
無理矢理コンパイル通したいです。
・・・1回だけでもやってみたいです。
>>307
おそらく意味不明な値が返ってくると思っています。
std::coutにでも渡して表示させて見ようと思っています、
0309デフォルトの名無しさん
2009/12/28(月) 11:25:530310デフォルトの名無しさん
2009/12/28(月) 11:28:39最初の理解からして間違ってる。 void foo() は戻り値を返してなどいない。
ゴミを表示したいんなら別のコンパイル単位で int foo(); とでも宣言して
呼び出してみるといいかもしれない。プログラムがクラッシュするかもしれないけど。
0311デフォルトの名無しさん
2009/12/28(月) 11:30:090312デフォルトの名無しさん
2009/12/28(月) 11:32:52サブルーチンとかって命名すればこんな下らない事考える奴出てこなかったのに
0313デフォルトの名無しさん
2009/12/28(月) 11:34:460314デフォルトの名無しさん
2009/12/28(月) 11:36:30std::cout << "result = " << ((int(*)())foo)() << std::endl;
0315デフォルトの名無しさん
2009/12/28(月) 11:54:24インライン関数を挟めばいいのさ
0316デフォルトの名無しさん
2009/12/28(月) 12:00:22C++ code - 8 lines - codepad
ttp://codepad.org/tI4wMyzX
満足しました。
0317デフォルトの名無しさん
2009/12/28(月) 12:01:34void * p
ってのは何故か意味があるんだよな。
これがまた紛らわしい。
なんでこうなっちゃったの?予約語を増やしたくなかったからとか?
0318デフォルトの名無しさん
2009/12/28(月) 12:04:320319デフォルトの名無しさん
2009/12/28(月) 12:05:13何と何が紛らわしいんだ?
0320デフォルトの名無しさん
2009/12/28(月) 12:07:59テンプレートで参照外ししようとしてはまるよな
0321デフォルトの名無しさん
2009/12/28(月) 12:08:44インターフェイスくらい最初に決めとけカス
0322デフォルトの名無しさん
2009/12/28(月) 12:09:03何が紛らわしいのかさっぱり
any * としなさいってこと?
0323デフォルトの名無しさん
2009/12/28(月) 12:10:15口が悪いな
直した方がいい・・・
0324デフォルトの名無しさん
2009/12/28(月) 12:10:36それがvoid *
0325デフォルトの名無しさん
2009/12/28(月) 12:13:340326デフォルトの名無しさん
2009/12/28(月) 12:19:510327317
2009/12/28(月) 12:20:03NULL * p
っていうものの方がよかったと思う。
0328デフォルトの名無しさん
2009/12/28(月) 12:21:260329デフォルトの名無しさん
2009/12/28(月) 12:22:080330デフォルトの名無しさん
2009/12/28(月) 12:23:09型なのか無効なのか不明瞭になるのかも
0331デフォルトの名無しさん
2009/12/28(月) 12:25:370332デフォルトの名無しさん
2009/12/28(月) 12:26:41それはchar *
void *は出来ないことがたくさんある。
0333デフォルトの名無しさん
2009/12/28(月) 12:27:29ということにしたいのですね。
0334デフォルトの名無しさん
2009/12/28(月) 12:29:43テンプレートクラスのインスタンス化時にメンバー関数の引数や戻りにvoidが現れると、その関数を呼ばなくてもエラーになるんだわ
見逃してくれよ
0335デフォルトの名無しさん
2009/12/28(月) 12:31:48当然じゃないの?
エラーにならないとしたら、どんなコードでどんな動作が期待できてうれしいの?
0336デフォルトの名無しさん
2009/12/28(月) 12:37:08基本的にはT*を扱うテンプレートクラスで参照外し関数をおまけで作るとはまる
0337デフォルトの名無しさん
2009/12/28(月) 12:46:100338デフォルトの名無しさん
2009/12/28(月) 13:18:070339デフォルトの名無しさん
2009/12/28(月) 13:51:45ヘ_ヘ
ミ ・ ・ ミ < はつみみです
( ° )〜
0340デフォルトの名無しさん
2009/12/28(月) 14:12:31struct 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するだけでは駄目なんですか?
0341340
2009/12/28(月) 14:18:47std::locale::global(loc1);
std::cout.imbue(loc1);
は
std::locale::global(loc);
std::cout.imbue(loc);
の間違いです
0342デフォルトの名無しさん
2009/12/28(月) 15:41:410343デフォルトの名無しさん
2009/12/28(月) 16:34:23出来ることを数えた方が速いと思われる。
0344デフォルトの名無しさん
2009/12/28(月) 17:14:06どこの桁で区切るかという指定も必要。
my_numpunctにこれを加えてみて。
std::string do_grouping() const {return "\3";}
0345デフォルトの名無しさん
2009/12/28(月) 18:02:12cout << i;
これで未定義の動作なわけだが、
実際には訳の分からん数が出力されたりする。
これを乱数として使うのはだめなの?
現実的に。
0346340
2009/12/28(月) 18:18:05それも書いてみたんですが、;で区切られないです。
0347デフォルトの名無しさん
2009/12/28(月) 18:20:16>これを乱数として使うのはだめなの?
ダメダヨ♪
0348デフォルトの名無しさん
2009/12/28(月) 18:23:22無理
だいたい似たような結果がでる
場合によっては予測可能
0349デフォルトの名無しさん
2009/12/28(月) 18:24:07ですよね☆
ありがとうございます。
0350デフォルトの名無しさん
2009/12/28(月) 18:24:54そうなんですか。
まあ確かに。
おとなしくboostの乱数でも使います。
0351デフォルトの名無しさん
2009/12/28(月) 18:26:13> ダメダヨ♪
千和ボイスで再生した
0352デフォルトの名無しさん
2009/12/28(月) 20:07:400353デフォルトの名無しさん
2009/12/28(月) 20:10:100354デフォルトの名無しさん
2009/12/28(月) 20:10:34ああ、ごめん。ちゃんと確かめていなかった。
ここも直す必要がある。
std::locale loc(std::locale("japanese"), new my_numpunct<char>);
use_facetは引数のlocaleオブジェクトからfacetを取り出す関数なので、>>340では無い物ねだりになっている。
新しくfacetオブジェクトをセットするときには直接newする。
0355340
2009/12/28(月) 20:45:34ありがとう。できました。
0356デフォルトの名無しさん
2009/12/28(月) 22:01:39とりあえずピンプルパンプル
0357デフォルトの名無しさん
2009/12/28(月) 23:05:11どのくらい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)
この辺でどうだい?
0358デフォルトの名無しさん
2009/12/29(火) 00:41:39shared_ptrは浅いコピーだからpimplを単純に使うと
pimpl無しとクラスの挙動が変わるのが面倒。
深いコピーをするshared_ptrみたいなものがboostに採択されてほしいなぁ。
0359デフォルトの名無しさん
2009/12/29(火) 00:48:340360デフォルトの名無しさん
2009/12/29(火) 00:50:39抽象インターフェースと .cpp ローカルな実装クラスを作ったほうがよくないか?
委譲コードをぺたぺた書いていく必要も無いし、あとで特殊な実装を作って
差し替えることも楽にできるようになる。
後出しで依存を減らさないといけないときは pimpl が便利だろうとは思う。
0361デフォルトの名無しさん
2009/12/29(火) 01:04:10ファクトリがいらない
使う側が特に作業無しで継承できる
pimplの利点はこんなもんかね?
0362デフォルトの名無しさん
2009/12/29(火) 01:27:14swap の実装が楽
STLに突っ込みやすい
0363デフォルトの名無しさん
2009/12/29(火) 06:47:24引き摺られて子クラスのスロットの位置が変らないから、
ライブラリのみの差し換えができるようになる。
つまりbinary interfaceが安定する。
だから子クラスをコンパイルし直す必要もない。
これがもともとの目的だった。
>>356はそういうことを言っている。
>>360はそこを理解しているのかどうか
0364デフォルトの名無しさん
2009/12/29(火) 08:19:45>>352
だもんな。
0365デフォルトの名無しさん
2009/12/29(火) 08:29:15一度 Pimpl Pointer がレビューで reject されて、現在 Pimpl がレビュースケジュール上に載ってるね。
マネージャ未定だけど。紹介は↓
ttp://www.ddj.com/cpp/205918714
もはやポインタ周りは見えないようになってるけど、値セマンティクス(深いコピー)とポインタセマンティクス(浅いコピー)と
継承する段階で切り替えられるみたい。
0366デフォルトの名無しさん
2009/12/29(火) 09:23:27さんきゅー。そういうものが提案されてたのか。
ただ、見てみたけど微妙w
色々やりたいのは伝わってくるけど
それぞれの目的別のスマートポインタで実現したほうが楽な気がする。
現状だと特に継承周りで色々構文に無理がある。
実装までは見てないから実際実装見てみないと若干思い違いしてるかもだけど
0367デフォルトの名無しさん
2009/12/29(火) 11:39:48抽象インターフェースを使う方法でもその目的は達成できるでしょ。
実装継承はやりにくくなるけど、あんまり使わないな。
0368デフォルトの名無しさん
2009/12/29(火) 11:54:56大丈夫大丈夫。
その辺の事情はboostに載る頃には
天才達による厳しいチェックと構成を乗り越えているものになっているだろうし。
0369デフォルトの名無しさん
2009/12/29(火) 12:09:01アホ過ぎて話にならない。
初心者スレで勉強しなおせ。
0370デフォルトの名無しさん
2009/12/29(火) 12:15:59ん?何かおかしなこと言ってる?
具体的に言ってもらえると助かる。
0371デフォルトの名無しさん
2009/12/29(火) 12:19:02>>370
抽象インターフェースクラスを使うと
>親クラスの実装部を書き換えて
> 子クラスをコンパイルし直す必要もない。
って言いたいんだよね?
0372デフォルトの名無しさん
2009/12/29(火) 12:44:47そうだよ。面倒だけどね。
class BaseInterface; // 親・抽象インターフェース
class BaseImpl : BaseInterface; // 親・実装クラス
class DerivedInterface : BaseInterface; // 子・抽象インターフェース
class DerivedImpl : DerivedInterface; // 子・実装クラス
0373デフォルトの名無しさん
2009/12/29(火) 15:54:480375デフォルトの名無しさん
2009/12/29(火) 16:09:16そのDerivedImplはどう実装すんの?
↓これ使ってちょ
class BaseInterface{ public: virtual void f() = 0; };
class BaseImpl : BaseInterface{ public: virtual void f(){}; };
class DerivedInterface : BaseInterface{};
class DerivedImpl : DerivedInterface{ ??? };
0376デフォルトの名無しさん
2009/12/29(火) 16:31:01http://tsushima.2ch.net/test/read.cgi/news/1262071701/
ニュース速報に立った
0377デフォルトの名無しさん
2009/12/29(火) 16:47:180378デフォルトの名無しさん
2009/12/29(火) 16:48:550379デフォルトの名無しさん
2009/12/29(火) 17:05:240380デフォルトの名無しさん
2009/12/29(火) 17:15:10The C++ Standard Libraryの日本語版がAmazonで売ってないんだけど古いから?
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/
0381デフォルトの名無しさん
2009/12/29(火) 22:39:23ほい。
// 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(); }
0382381
2009/12/29(火) 22:45:14必要になるタイミングがが違う、ってことみたい。
pimpl だと最初に作るとき。
抽象インターフェース+継承だと、実装継承をするとき。
普段から実装継承を避ける方針を採っていると、後者の方法にすることで
(実装を隠すためだけの)委譲コードというものがほぼ発生しなくなってうれしい
ような気がする。
0383デフォルトの名無しさん
2009/12/30(水) 13:44:240384デフォルトの名無しさん
2009/12/30(水) 14:03:13> 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().
0385デフォルトの名無しさん
2009/12/30(水) 15:23:17NetBeansでC++の勉強をしているのですが、
ソースファイル/ヘッダファイル/リソースファイルの3つがあります
ソースファイル以外の使い道がわかりません
何方かおしえてください
0386デフォルトの名無しさん
2009/12/30(水) 15:30:21でぐぐれ
0387デフォルトの名無しさん
2009/12/30(水) 15:35:54ヘッダは1つ以上のソースからインクルードされることを想定したソースの一種
リソースファイルはそれらとは別でプログラムからは独立したデータ集を記述したもの
0389デフォルトの名無しさん
2009/12/30(水) 15:56:000390デフォルトの名無しさん
2009/12/30(水) 16:29:46ソースファイルが1本だったら大きくなりすぎるのでソースファイルを分割する。
cppが2つになったら、別のほうファイルのクラスを呼ぶ方法に困ってしまう。
で、呼び方を書いたclassの定義を.hに入れて両方のファイルで#includeしたらクラスを呼び出せて丸く収まる。
0391デフォルトの名無しさん
2009/12/30(水) 16:30:360392385
2009/12/30(水) 17:10:49新規作成→C++クラスを選択すると、ソースファイルに「*.h、*.cpp」が作成されるわけ
ソースファイルに「*.cpp」、ヘッダファイルに「*.h」が作成されるわけじゃない
0393デフォルトの名無しさん
2009/12/30(水) 17:13:01ヘッダには関数やクラスなどのインターフェイスを記述する。
ソースにはこれらの実装を記述する。
0394デフォルトの名無しさん
2009/12/30(水) 17:17:52別にどこで作られたっていいだろ、何か困ってることがあるの?
0395デフォルトの名無しさん
2009/12/30(水) 17:58:37std::auto_ptr<MyClass> y=(new MyClass);
std::swap(x, y);
これって安全でしょうか?
0396395
2009/12/30(水) 17:59:28auto_ptrは仕様をあまり知らなくて。。。
お願いいたします。
0397デフォルトの名無しさん
2009/12/30(水) 18:00:540398デフォルトの名無しさん
2009/12/30(水) 18:05:28ありがとうございます。
auto_ptrがくそみそに言われているのを聞いて、
不安になりました。
0399デフォルトの名無しさん
2009/12/30(水) 18:16:41auto_ptrは代入演算子で代入するとソース側を破壊する。
間違ってもSTLで使ってはいけない。
0400398
2009/12/30(水) 18:33:41std::auto_ptr<MyClass> x=(new MyClass);
std::auto_ptr<MyClass> y=(new MyClass);
これで
x=y;
としたとき、
xが指していたデータは勝手にdeleteされ、
yは無効なポインタとなり、
yが指していたデータをxが指すようになる
こんな動作で合っていますか?
0401デフォルトの名無しさん
2009/12/30(水) 18:45:420402デフォルトの名無しさん
2009/12/30(水) 18:51:21継承される事を前提としたクラスを作成する時には、上のように宣言をするのが普通なのでしょうか?
また、javaのswingでは何度も継承をしているため、まったく意味のないメソッドや害を成すメソッドが存在します
C++ではこのような問題のあるメソッドに、どの様な対処をしているのですか?
0403デフォルトの名無しさん
2009/12/30(水) 18:56:430404デフォルトの名無しさん
2009/12/30(水) 19:02:20class sub :public Superで十分。
無駄なメソッドがあるのは設計が不十分だと考えて、問題のないように設計しよう。
0406デフォルトの名無しさん
2009/12/30(水) 19:17:16次のC++の規格ではauto_ptrは非推奨になってunique_ptrに置き換わる。
だから今からなら仕様を覚えるより存在を忘れ去った方が良い気がする。
unique_ptrなら一応コンテナに放りこめる(ように実装できる)し。
まぁ次の規格が出るまでは素直にboostなりtr1のshared_ptr使えばいいと思う
0407デフォルトの名無しさん
2009/12/30(水) 19:21:590408デフォルトの名無しさん
2009/12/30(水) 19:24:22>>406
ありがとうございます。
私もfactoryは結構好きなのでboost::shared_ptr(ないしstd::tr1::shared_ptr)は
良く使っています。
お伺いしたいのですが、
std::auto_ptrとboost::shared_ptr(ないしstd::tr1::shared_ptr)は、
前者の方が不便な分 一般的に軽いと思って良いのでしょうか。
0409デフォルトの名無しさん
2009/12/30(水) 19:45:03auto_ptrはオーバーヘッドが無い。
shared_ptrはshared_ptrの複製にわずかにコストがかかる。だから関数の引数で渡すときはshared_ptrの参照渡しにすると速い。
shared_ptrにポインタを最初に与えるときもコストがかかるが、newよりmake_sharedのほうが少し速い。
0410デフォルトの名無しさん
2009/12/30(水) 19:51:44代入などの条件が微妙に厳しくなったものと思えばいい。
コピーは出来ない(代わりにムーブが出来る)
基本的にはほとんどいっしょ。
copyの代わりにmove(代入時に元のデータを破壊してもいい)を採用した物というのが正解。
auto_ptrはC++がmoveの概念を持っていないのを無理やりエミュレートしたしろもの
だから元のデータを破壊してはSTLとしては不整合が出るoperator=やコピーコンストラクタが実装されている
unique_ptrはmoveの概念(右辺値参照)がC++0xで採用されたから、
無理やり実装するのじゃなくて新しい機能を使って素直に実装したバージョン
STLとして不整合が出る操作がないのでコンテナにも放りこめる。
0411デフォルトの名無しさん
2009/12/30(水) 20:07:59ありがとうございます。
make_sharedについてはちゃんと勉強して参ります。
助かりました。
0412デフォルトの名無しさん
2009/12/30(水) 20:15:23template<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);
}
って感じに使いたいのですが。
0413412
2009/12/30(水) 20:16:530414デフォルトの名無しさん
2009/12/30(水) 20:21:55多重継承は自由すぎて、乱用すると複雑になってわかりにくくなる。
その例のように、インターフェースを意識するのはわかりやすい使い方として推奨されている。
ほかにデメリットというと、キャストしたときにポインタの値が変わることかな。
0415デフォルトの名無しさん
2009/12/30(水) 20:25:23template<class T> T Convert(const IConverter<T>& conv);
0416412
2009/12/30(水) 20:25:38ありがとうございます。
0417412
2009/12/30(水) 20:27:54すいません。
template<class T> T Convert(IConverter<T> *conv);
Convert<int>(&converter);
ってしたかったんです。
参照を使ったほうがいいんですかね??
0418デフォルトの名無しさん
2009/12/30(水) 20:29:470419デフォルトの名無しさん
2009/12/30(水) 20:31:350420デフォルトの名無しさん
2009/12/30(水) 20:32:19特殊化はできる。
部分特殊化ができない。
0421デフォルトの名無しさん
2009/12/30(水) 20:35:49Hoge *p = NULL;
// 〜 コード 〜
p = new Hoge(); // このタイミングを待っていた!
0422デフォルトの名無しさん
2009/12/30(水) 20:37:19危険なにおいがプンプン
0423デフォルトの名無しさん
2009/12/30(水) 20:37:23shared_ptrをお勧めします
0424デフォルトの名無しさん
2009/12/30(水) 20:39:040425デフォルトの名無しさん
2009/12/30(水) 20:41:100426デフォルトの名無しさん
2009/12/30(水) 20:43:11class Resource
{
void Dispose();
};
みたいな。
0427デフォルトの名無しさん
2009/12/30(水) 20:43:12それなんて初心者?
0428デフォルトの名無しさん
2009/12/30(水) 20:44:04別に、二重deleteにならないならいいんじゃない?
任意のタイミングでdeleteしたいときと、
shared_ptrとかに任せるときの2パターンできるようにするってことでしょ?
0429デフォルトの名無しさん
2009/12/30(水) 20:45:50C#風味ですね。その機能はC++ではデストラクタが行う。
0430デフォルトの名無しさん
2009/12/30(水) 20:46:50べつに問題はないとおもうよ
0431デフォルトの名無しさん
2009/12/30(水) 20:47:31void Reference(RAII &obj);
// 〜〜〜
shared_ptr<RAII> obj;
// 長々とコードとか
Reference(*obj); // こんなのの繰り返し・・・?
とかダサいことになる。
0432デフォルトの名無しさん
2009/12/30(水) 20:49:25誰かスレでも立てて〜 ><
【RAII】C++で [*]ポインタ vs 参照[&]【安全】
0433426
2009/12/30(水) 20:51:06そう。それです。
C#ばっかやってたらこれがやめられなくなった
0434デフォルトの名無しさん
2009/12/30(水) 20:53:42C++ではusingしなくても自動的にDisposeの働きをするデストラクタが呼ばれるからデストラクタでやれば問題ないです。
0435デフォルトの名無しさん
2009/12/30(水) 20:56:18C++はブロックの先頭に変数宣言しなくてもいいんだよ。
0436デフォルトの名無しさん
2009/12/30(水) 20:59:12これもRAIIだけど何も問題ないよ。
void Reference(const Hoge& a);
void piyo()
{
Hoge b;
Reference(b);
shared_ptr<Hoge> c=make_shared<Hoge>();
Reference(*c);
}
0437433
2009/12/30(水) 21:04:07class RAII; // ウィンドウと考える
class Super
{
shared_ptr<RAII> window;
public:
Super();
~Super();
public:
void ShowWindow()
{
window = shared_ptr<RAII>(new RAII("RAIIだよ、RAII!"));
window->Show();
}
// 他のコード
};
0438デフォルトの名無しさん
2009/12/30(水) 21:05:14さらに、例外時にDisposeが呼ばれなかったときや、呼び忘れのときの動作も明確にすれば問題ないし。
0439デフォルトの名無しさん
2009/12/30(水) 21:05:390440デフォルトの名無しさん
2009/12/30(水) 21:07:040441デフォルトの名無しさん
2009/12/30(水) 21:10:47盛り上がってきました
0442デフォルトの名無しさん
2009/12/30(水) 21:18:05参照とスマポ おすすめ
素ポインタ ご遠慮願います。
0443デフォルトの名無しさん
2009/12/30(水) 21:36:520444デフォルトの名無しさん
2009/12/30(水) 21:38:47クラスはポインタを使うってしてる。
クラスに参照を使うっていうのはNULLをつかわなければ最適解だけど、
class A;
void Ref(A& obj);
void AllowNull(A* obj);
っていうのは、美しくない。
0445デフォルトの名無しさん
2009/12/30(水) 21:42:54でもオブジェクト生成する関数がスマポじゃなくて生ポインタで
返してくるっつうのは
逝ってヨシ
0446デフォルトの名無しさん
2009/12/30(水) 21:45:10意味不明な分類法だね
構造体でNULL使いたいときとかクラスで参照先を保証したい場合どうするの?
0447デフォルトの名無しさん
2009/12/30(水) 21:47:19クラスでオブジェクト保持ならスマポだろ
だいたい構造体でNULLとか、WindowsAPIかよ
0448デフォルトの名無しさん
2009/12/30(水) 21:49:26だからNULLを使わないですむように参照を率先して使うように設計している。
そして共有する場合やNULLが必要な場合など、参照が使えない場合はスマポを使う。
ポインタを使うのはAPI呼ぶときぐらい。
0449デフォルトの名無しさん
2009/12/30(水) 21:49:29C++でクラスを設計するさいに本当に必要なのか。
0450デフォルトの名無しさん
2009/12/30(水) 21:57:32検索の結果をイテレータで返す場合に見つからない場合はendを指すなどで表すからNULLは使わないね。
STLでも引数や戻りでNULLやポインタは使わないね。コンテナにshared_ptrを渡すときなんか参照とスマポがうまい具合に融合している。
0451デフォルトの名無しさん
2009/12/30(水) 22:05:18weak_ptr使うにはshared_ptr使わないといけないし
かといって共有目的もないのにshared_ptr使うのは無駄が多すぎる
0452デフォルトの名無しさん
2009/12/30(水) 22:21:07された上に確実に行えるメリットが大きいと判断したよ。
非共有だったとしても、コンテナに渡したりすると一時的に共有になる必要があったりするからとりあえずshared_ptrにしている。
0453デフォルトの名無しさん
2009/12/30(水) 22:23:360454412
2009/12/30(水) 22:28:22聞きたいのですけど、参照渡しで渡されたクラスを基底クラスにキャストするときって、
どういう書き方をすればいいんですか?
0455デフォルトの名無しさん
2009/12/30(水) 22:28:430456デフォルトの名無しさん
2009/12/30(水) 22:30:25class B{};
void f(B&b){
}
0457デフォルトの名無しさん
2009/12/30(水) 22:31:07class A{};
class B:public A{};
void f(B&b){
A&a = b;
}
だけの話じゃないの?
0458デフォルトの名無しさん
2009/12/30(水) 22:32:02アップキャストはキャストは要らないですの。
class hoge :public base;のとき
void func(const hoge& a)
{
const base& b=a;
}
0459デフォルトの名無しさん
2009/12/30(水) 22:34:05KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
void func(const base& a);
//...
hoge a;
func(a); //どうでもいいけどこれじゃだめなの?
0460デフォルトの名無しさん
2009/12/30(水) 22:37:100461デフォルトの名無しさん
2009/12/30(水) 22:38:00KIMEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
0462デフォルトの名無しさん
2009/12/30(水) 22:39:250463デフォルトの名無しさん
2009/12/30(水) 22:40:45むしろこっちのほうがきもいですの
0464デフォルトの名無しさん
2009/12/30(水) 22:41:39無限ループを作ろうとすなww
0465412
2009/12/30(水) 22:43:02ありがとうございます。
0466デフォルトの名無しさん
2009/12/30(水) 23:12:000467デフォルトの名無しさん
2009/12/31(木) 01:19:570468デフォルトの名無しさん
2009/12/31(木) 01:22:180469デフォルトの名無しさん
2009/12/31(木) 01:26:38苦肉の策で実装しました感が漂ってきてC++が嫌いになるぜw
STL実装してて破綻してることに気付いただろうに何故規格に入れなかったのかと!
0470デフォルトの名無しさん
2009/12/31(木) 01:31:29rebindってそのためにあったのね
0471デフォルトの名無しさん
2009/12/31(木) 09:57:34一応 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 自体、標準化の後期(になるはずだった時期)になってからでてきたわけだし。
0472デフォルトの名無しさん
2009/12/31(木) 11:04:11(>>4にない)
tp://www.oreilly.co.jp/books/4873110637/
tp://www.amazon.co.jp/dp/4873110637/
0473デフォルトの名無しさん
2009/12/31(木) 11:06:45typedefさえもないが無いC#はどうよ。
0474デフォルトの名無しさん
2009/12/31(木) 11:40:37C++標準化委員会は責任重大なんだよ!
そう簡単にじゃあ入れるか!ってことはできないんだよ。
0475デフォルトの名無しさん
2009/12/31(木) 11:41:27Anders Hejlsberg が、
> typedef の問題は、一つの型が異なる名前を持つことだ。.NET では各型が単独の名前を持つようになっている。typedef を実現するには、全言語がサポートする必要があるが、もう遅い。
と言っている。
ほかの言語があまりまねをしないということは、C言語の問題点になってるんじゃねぇ?
0476デフォルトの名無しさん
2009/12/31(木) 11:51:09boost::foreach?を除く
0477デフォルトの名無しさん
2009/12/31(木) 12:27:04何を言いたいの?他の言語にあるかってこと?
0478デフォルトの名無しさん
2009/12/31(木) 12:40:37それって、「.netの問題で実装できません。許してお願い。」って言ってるように読めるね。
同じ数値に違う名前をつけるconstはあるのにね。
0479デフォルトの名無しさん
2009/12/31(木) 12:49:10const 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;
}
何か違いはあるのかね
0480デフォルトの名無しさん
2009/12/31(木) 13:33:43どっち?
0481デフォルトの名無しさん
2009/12/31(木) 13:36:420482デフォルトの名無しさん
2009/12/31(木) 13:54:53型が全て一緒でオーバーロードできず
関数名を変えなきゃいけないときもある
つまりケースバイケース
0483デフォルトの名無しさん
2009/12/31(木) 14:08:02C++では、入出力のprintf,scanfや、文字列char*、ファイル操作のfopenなどC由来のものを使うよりも、
入出力cin,coutや文字列string、ファイル操作のfstreamなどを使ったほうがはるかに便利だと思うんです。(scanfのエラーの多さや文字列char*の不便さなど。vectorとかもあるし)
というわけで、C++ではこういったC関数は全く使わないのでしょうか?
Cのソースをみても理解できるようになるから学んでおいたほうがいいよ、程度なのでしょうか。
0484デフォルトの名無しさん
2009/12/31(木) 14:08:43使っているのですが、セパレータの字句に何を使えば良いのか、迷っています
素直に、XML で行った方がよいのとも思案しているのですがいかがなものでしょうか?
助言をお願いできないでしょうか。
0485デフォルトの名無しさん
2009/12/31(木) 14:37:46つ flex, bison
0486デフォルトの名無しさん
2009/12/31(木) 14:43:56俺はiostreamをそれほど便利と思ったことはなく、C++でもscanf/printf系列を使ってる
0487デフォルトの名無しさん
2009/12/31(木) 15:06:41サンクスです
車輪の再発明をしなくてすみそうです、ありがとう
flex はなんか、Javaのパーサのような印象を受けましたが、C++ からでも使えるのでしょうか?
0488デフォルトの名無しさん
2009/12/31(木) 15:09:28詳しい仕様を知らなくても、何をするものか知っていて、それ以上を知る必要が
出てきた時にすぐ思いつきすぐ確かめられるだけの知識と情報ソースがあれば充分。
後の選別は経験がしてくれる。
0489デフォルトの名無しさん
2009/12/31(木) 15:31:05クラスに対する入出力は演算子のオーバーロードが出来てiostreamは便利
逆に言うと単純な入出力だけならprintfやscanfで十分
でもstringの入出力はiostream必須だから使う人によるとしか言えない
0490デフォルトの名無しさん
2009/12/31(木) 15:36:520491デフォルトの名無しさん
2009/12/31(木) 16:07:51職場でBoost禁止なんてことはあるのですか?
現実問題としてOSのAPIとC++標準ライブラリだけで
プログラミングしろとか気が狂ってるとしか思えないんですが。
0492デフォルトの名無しさん
2009/12/31(木) 16:13:330493デフォルトの名無しさん
2009/12/31(木) 16:14:04VC6 の時代から、boost::tokenizer とか組込みで系の実装で使ってたよ。
0494デフォルトの名無しさん
2009/12/31(木) 16:16:27数年前までは、STL禁止なんて話も結構聞いたなぁ。今はどうなんだろう。
ちなみに、多くの場合は社内に独自ライブラリの蓄積があるので、
Boost禁止が即「OSのAPIとC++標準ライブラリだけ」に繋がるわけではないよ。
0495デフォルトの名無しさん
2009/12/31(木) 16:20:33良かったです。
とりあえず珍しいコンパイラでboostが通らないとかは別とすれば、
正直 自社のライブラリがおkなら
boostだっておkにしていい気がしますけどね。
0496デフォルトの名無しさん
2009/12/31(木) 16:22:480497デフォルトの名無しさん
2009/12/31(木) 16:30:13なんでいいと思うかわからん
boostに不具合あったらお前が責任取れるの?
素性の知れないものを使うリスクとか考えろよ
0498483
2009/12/31(木) 16:34:52>>486,>>488 成程、人によりけりで深い知識を身につけていけばCの利便性が分かるということですね。
>>489 ヘッダファイルの問題ですか、自分はまだ速度やらメモリに気を遣うレベルに達してないのでその辺り盲点でした。
0499デフォルトの名無しさん
2009/12/31(木) 16:42:04でも社内のライブラリ vs Boost では
圧倒的にレビューされている量が違いますよね。
さらに言えばOS自身責任取ってくれる会社なんて1社も無いような気がするのですが、
どうでしょう?
0501デフォルトの名無しさん
2009/12/31(木) 16:49:37勝手にレスされると腹立つわ
0502デフォルトの名無しさん
2009/12/31(木) 16:58:160503デフォルトの名無しさん
2009/12/31(木) 17:40:04C++系のスレではよくある話
>>499は新参
0504デフォルトの名無しさん
2009/12/31(木) 17:47:300505デフォルトの名無しさん
2009/12/31(木) 17:49:080506デフォルトの名無しさん
2009/12/31(木) 17:53:290507デフォルトの名無しさん
2009/12/31(木) 17:59:52でも汎用性の高い外部ライブラリを直接使うから個人差で大変になるんだろうな。
社内ライブラリが外部ライブラリを参照するようにすれば、プログラマの個人差が無くなってよくなるんじゃね。
0508デフォルトの名無しさん
2009/12/31(木) 18:05:44納期に間に合うあいだはboostは控えるべき
脳って使わないとどんどん衰えていくしね
0509デフォルトの名無しさん
2009/12/31(木) 18:14:04いくら納期があっても、boost 使えば書けるコードを辛気臭く最初から作り込むのもなんだかなぁー
俺ならさっさと書いてしまって、ホワイトボックステストとかに注力するけどね、時間があればの話ですが。
0510デフォルトの名無しさん
2009/12/31(木) 18:14:48>>499
Boost使って問題が起きたら誰がその責任を取ってくれるのか。
社内のライブラリを使って問題があれば、会社として責任負ってくれるだろ。
0511デフォルトの名無しさん
2009/12/31(木) 18:20:370512デフォルトの名無しさん
2009/12/31(木) 18:24:08それに人員が割けなかったり、その能力のある人が皆無だというなら
その職場がお寒い現状であるというだけ。
0513デフォルトの名無しさん
2009/12/31(木) 19:44:37でも社内のライブラリ vs Boost では
圧倒的にレビューされている量が違いますよね。
さらに言えばOS自身責任取ってくれる会社なんて1社も無いような気がするのですが、
どうでしょう?
0514デフォルトの名無しさん
2009/12/31(木) 19:52:510515デフォルトの名無しさん
2009/12/31(木) 21:51:09MSが動作を保証してくれていないのに、
なぜか俺らが保証するというおかしなことになっているんだよな。
0516デフォルトの名無しさん
2009/12/31(木) 22:12:29機能はありませんでしょうか?
C言語では
ttp://www.cppll.jp/cppreference/stdio_details.html#tmpfile
> tempfile()は重複のない名前を持つテンポラリファイルを開き、
> そのFILEポインタを返す。エラーが発生した場合にはnullが返される。
というのがあるのですが、IO streamとして扱いたいのです。
0517デフォルトの名無しさん
2009/12/31(木) 22:14:270519デフォルトの名無しさん
2009/12/31(木) 23:17:35いい加減なこと教えんなよw
0520デフォルトの名無しさん
2009/12/31(木) 23:21:060521デフォルトの名無しさん
2009/12/31(木) 23:23:57でもファイルが欲しいらしいぞ。
0522デフォルトの名無しさん
2009/12/31(木) 23:35:38どうしても複数のテンポラリファイルが欲しくなったのです。
まあ適当に一時ディレクトリ作ってそのなかで管理すればよいのですが。
すみません
ありがとうございました。
0523デフォルトの名無しさん
2009/12/31(木) 23:38:54と
スマポ<MyClass> hoge_p = new MyClass(〜);
のどちらでも同じ仕事ができる場合、
大抵は前者を選ぶと思うのですが、
後者を選ぶ場合にはどんなものがあるのでしょうか?
(関数からhoge_pを返すことはしません。)
MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
0524デフォルトの名無しさん
2009/12/31(木) 23:52:270525デフォルトの名無しさん
2010/01/01(金) 00:13:48コンパイル依存性を減らせる可能性がある
Effective C++ 第3版
31項 ファイル間のコンパイル依存性をなるべく小さくしよう
0526523
2010/01/01(金) 00:15:52>>524
前者も呼べますよね?
>>525
コンパイル依存性を減らすというのは考えていませんでした。
確かにそうですね。
0527デフォルトの名無しさん
2010/01/01(金) 00:49:02hogeを複数のオブジェクトが参照してるとき
後者のスマポがshared_ptrなら参照が0になるまで破棄されないので
破棄するタイミングを気にせずに複数のオブジェクトから使用できる
前者の場合、
hogeの生存期間 >= 複数のオブジェクトがhogeを参照する期間
を保障しないといけない
0528デフォルトの名無しさん
2010/01/01(金) 08:58:15でも
> 関数からhoge_pを返すことはしません。
って書いてあるからそれは心配ないのでは?
0529デフォルトの名無しさん
2010/01/01(金) 12:41:100530523
2010/01/01(金) 13:56:39ありがとうございます。
前者のMyClass hoge(〜);でスタックに確保できずに失敗する可能性と、
後者のスマポ<MyClass> hoge_p = new MyClass(〜);でヒープに確保できずに失敗する可能性と、
どっちを畏れるべきでしょうか?
0531デフォルトの名無しさん
2010/01/01(金) 14:38:49>MyClass が特に巨大なオブジェクトでヒープに入れたい場合とかでしょうか?
等おそれるべき理由がない限り、確保失敗の可能性など無視してオブジェクトの生存期間から決定する。
おそれるべき理由がある場合、どちらをおそれるべきかもはっきりするはずなのでそれに従う。
0532530
2010/01/01(金) 20:06:56としますと、例えば
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;
}
これは等価なコードとなりると思うのですが、
この場合はどちらでも良い、悪く言えばその場の気分次第ということなのでしょうか?
0533デフォルトの名無しさん
2010/01/01(金) 21:07:36前者は、スタックを消費する。速い
後者は、ヒープを消費する。前者より少し遅い。
共有しないという前提(参照は可能)がある場合なら前者のほうがメリットがあると思う。
共有する場合は後者になるのかな。
0534デフォルトの名無しさん
2010/01/01(金) 21:09:23スマポ噛ませてる分処理は遅くなるしnewの速度コストなんてスタック配置の何千倍だから無駄。
0535デフォルトの名無しさん
2010/01/01(金) 21:14:59スタックオーバーフローを恐れるような大きなオブジェクトじゃない場合はスタックに置いていいんじゃないか。
また、あまり大きいオブジェクトがあると、スタックフレームの増大で(E)BPからのオフセットが大きくなってプログラムサイズが若干大きくなる可能性があるね。たとえばスタックフレームを128バイト未満にするとかが目安かもね。
0536532
2010/01/01(金) 21:46:44ありがとうございます。
やはり巨大じゃないオブジェクトで意味的に等価なコードならスタックにおくべきという
ことなのですね。
0537デフォルトの名無しさん
2010/01/01(金) 23:41:23他の人が書いたコードを利用する時にヘッダファイルを見ると、
privateなメンバがわかってしまうのでカプセル化(人間から見た時)に
なっていないような気がするのは気のせいでしょうか?
0538デフォルトの名無しさん
2010/01/01(金) 23:57:55#define private public をするため
0539デフォルトの名無しさん
2010/01/02(土) 00:02:15おいこら適当なこと教えるなよ。
0540デフォルトの名無しさん
2010/01/02(土) 00:06:04不用意に使うことを防ぐのが目的だから、見えてもかまわない。
JavaやC#だって、bytecodeやILを見たらわかってしまう。
0541デフォルトの名無しさん
2010/01/02(土) 00:08:390542デフォルトの名無しさん
2010/01/02(土) 00:18:04privateは分からないようにするんじゃなくて、アクセスできなくして隠蔽するためのもの。
見えないわけでない。
0543デフォルトの名無しさん
2010/01/02(土) 00:20:00「適当」ならいいじゃん
「不適切」とは意味が違うんだから
0544537
2010/01/02(土) 00:40:03ヘッダファイルはjavaだと、javadocのような存在なのではないのでしょうか?
javadocではprivateは見えないように設定されていますし
>>541
知らなかった、トンクス
>>542
頑張ってprivateなフィールド(friendを除く)にアクセス出来ないのでしょうか?
参考として、覚えておきたいので
0545デフォルトの名無しさん
2010/01/02(土) 01:06:44javadocとはぜんぜん違うから
friendでprivateにアクセスできるクラスや関数を制限しているんだから、friend以外でprivateにアクセスできたら意味が無い。
方法としてはfriendクラスを経由するように設計すればいい。
0546デフォルトの名無しさん
2010/01/02(土) 02:49:230547デフォルトの名無しさん
2010/01/02(土) 03:24:05. or -> やっても関数一覧が出ないでやんす!
0548デフォルトの名無しさん
2010/01/02(土) 03:50:140549デフォルトの名無しさん
2010/01/02(土) 08:05:11Javadoc は人が見るためのもの、ヘッダファイルはコンパイラが解釈するためのものだ。
Java でも import すると(多分) class ファイルが解析されて、あるクラスにどんなメソッドがあるとか
どんな例外が飛ぶとかを javac が認識する。
こういう情報がないとコンパイラはコードを生成できない。
C/C++ ではコンパイラが中間ファイルを解析するのではなく、ヘッダファイルを #include して
ソース側にどんな関数がある等といった情報を取り込む形で対応している。
っつーかヘッダファイルがなくても自前で必要な情報を全部ソース直書きしてもいいんだけど
いちいち書くのは面倒だからヘッダファイルを用意してあるといった方が正しいか。
0550デフォルトの名無しさん
2010/01/02(土) 08:35:340551デフォルトの名無しさん
2010/01/02(土) 09:19:10STLやboostのヘッダ取り込んだら出てこなくなるから、あきらめるしかないね。
0552デフォルトの名無しさん
2010/01/02(土) 10:41:35javadocが欲しいなら、doxygenがあるぜよ。
http://pc12.2ch.net/test/read.cgi/tech/1212144627/l50
0553デフォルトの名無しさん
2010/01/02(土) 10:44:460554539
2010/01/02(土) 11:01:06いったいこういうヤツって、なんなんだろうね?
揚げ足を取った気になってるのかな?
どう考えたって元々無いような人望を削って
さらに信頼を無くしていくだけだと思うのだが。
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
0555デフォルトの名無しさん
2010/01/02(土) 11:03:27> 頑張ってprivateなフィールド(friendを除く)にアクセス出来ないのでしょうか?
> 参考として、覚えておきたいので
privateメンバのことね?
ないよ。
>>80の方法だって、未定義の動作だったり、
使える状況にかなり無理があるものだったりして
あまり現実的に好ましいものではない。
0556537
2010/01/02(土) 11:11:330557デフォルトの名無しさん
2010/01/02(土) 11:11:45これで育つのはC++メタプログラマーじゃねーかww
0558デフォルトの名無しさん
2010/01/02(土) 11:22:020559デフォルトの名無しさん
2010/01/02(土) 11:43:21>>558 誘うんじゃない!!
0560デフォルトの名無しさん
2010/01/02(土) 11:49:340561555
2010/01/02(土) 11:49:41やめろって言ってるだろ!
あれはタダの冗談であり、あんな未定義動作のクソコードを
実際に書く気か!?
Java出身なのかどうかしらないが、
カプセル化って知らないの?
0562デフォルトの名無しさん
2010/01/02(土) 11:50:31#define private public
#endif
0563デフォルトの名無しさん
2010/01/02(土) 12:05:450564デフォルトの名無しさん
2010/01/02(土) 12:08:52>>80が
黒魔術
というのは合ってる気がするw
邪悪で、未定義の動作という意味で。
0565デフォルトの名無しさん
2010/01/02(土) 15:43:210566デフォルトの名無しさん
2010/01/02(土) 16:40:19#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();
}
0567デフォルトの名無しさん
2010/01/02(土) 16:42:120568デフォルトの名無しさん
2010/01/02(土) 17:01:59だからそれはコンパイルエラーになることがあるからだめだろ
0569デフォルトの名無しさん
2010/01/02(土) 17:19:09#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();
}
0570デフォルトの名無しさん
2010/01/02(土) 17:52:51いや、俺が想定しているのは
template <class T>〜
ってところなんだけど。
0571デフォルトの名無しさん
2010/01/02(土) 18:11:25typename使え
0572デフォルトの名無しさん
2010/01/02(土) 19:41:31うぜーなこいつw
0574デフォルトの名無しさん
2010/01/02(土) 22:33:04flex, bison, Boost.Spirit
等など 色々あるみたいですが、
1. 習得しやすさ
2. 対応コンパイラの多さ
3. できることの広さ
4. 将来性
等を総合的に見て、どのパーサが一番良いのでしょうか?
そのパーサを習得しようと思います。
0575デフォルトの名無しさん
2010/01/02(土) 23:18:030576デフォルトの名無しさん
2010/01/02(土) 23:18:510577デフォルトの名無しさん
2010/01/02(土) 23:20:340578デフォルトの名無しさん
2010/01/02(土) 23:20:500579デフォルトの名無しさん
2010/01/02(土) 23:23:370580デフォルトの名無しさん
2010/01/02(土) 23:26:380581デフォルトの名無しさん
2010/01/02(土) 23:28:010582デフォルトの名無しさん
2010/01/02(土) 23:32:36とりあえず、二つに分けて LR と LL という方法がある。
yacc と ANTLR がそれぞれの方法の代表なので、それで調べてくれ。
どちらがいいかという話は、宗教論争になる。
0583デフォルトの名無しさん
2010/01/03(日) 00:02:270584デフォルトの名無しさん
2010/01/03(日) 00:48:11ここはいい。
>どちらがいいかという話は、宗教論争になる。
けど、ここはなんで?
0585574
2010/01/03(日) 09:34:02flex + bison
Spirit
と分けるべきでしたか。
LL法とLR法ですが、現在ではLR法の方が主流という話も伺っています。
0586デフォルトの名無しさん
2010/01/03(日) 11:33:40class 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>()
で呼び出したいのですが、何か手はありますでしょうか?
0587デフォルトの名無しさん
2010/01/03(日) 11:34:45× void getPointer(void** v){return 何か;}
○ void getPointer(void** v){(*v) = 何か;}
0588デフォルトの名無しさん
2010/01/03(日) 12:16:42If 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>() ;
0589デフォルトの名無しさん
2010/01/03(日) 12:18:53テンプレートではなくクラスのポリモーフィズムで解決すべきじゃ?
fooの内部で呼び出す関数名(Func)が固定と言うことは
fooのテンプレート引数に渡されるクラスは全部Funcを持ってる前提なんだから
HogeやFuga等に直接その名前(Func)で実装するべき
Funcを持ってるクラスのポインタをgetPointer()が返せば
getPointer()->Func()で済むのでfooは不要
0590デフォルトの名無しさん
2010/01/03(日) 14:11:31s = fscanf(stdin, "%3[a-z]%*[a-z]%3[A-Z]%*[A-Z]%3[0-9]", x, y, z);
この例では,配列 x,y,z が3文字までのため,4文字目以降の該当文字列を切り捨てる
(次の配列に読み込まれない)ように %*[ ] で余分な文字列をスキップします。
----
上記のような *[ ]%の使い方に限らず、ググっても出てこないような 「え…そんなことできるのか」って方法はみなさんどうやって知りました?
市販の本を買えば当たり前な感じで書かれているんでしょうか、それとも探索中に行き当たりばったりで覚えるものでしょうか。
0591デフォルトの名無しさん
2010/01/03(日) 14:17:540592デフォルトの名無しさん
2010/01/03(日) 14:24:340593デフォルトの名無しさん
2010/01/03(日) 15:36:14まさかとは思いましたが、やはりだめですか。
まぁ、キャストで行けるのはせめてもの救いですね・。ありがとうございました。
>>589
実は今やってるのはSquirrelというスクリプトにC++のクラスをバインディングするというもので
テンプレート引数には全く関係ないクラスが指定されるので、ポリモーフィズムでやるのは現実的ではないんです。
BCCじゃなければ素晴らしいバインダをそのまま使えるのに・・・orz
0594デフォルトの名無しさん
2010/01/03(日) 15:56:02それならどちらにせよ綺麗には実装できないんだから
自分ならいっそマクロで書いちゃうかも
テンプレート引数が汚くなるのがなんか好きじゃないんだけど
みんなはそんなことないんだろうか
0595デフォルトの名無しさん
2010/01/03(日) 16:08:48自分もこっからはマクロでやります。
ちょっと気になったんですが、マクロに複雑な型の記述を渡すと失敗するんですが、なんですかこれは
#define FUNC(name) name,#name
registFunction( FUNC(func<Hoge,&Hoge::hoge>) );
こんなんやるとマクロの引数の数が違うと出ちゃいます・・・
0596デフォルトの名無しさん
2010/01/03(日) 16:37:58テンプレート引数のカンマが、マクロ引数のデリミタとして扱われてるんだろ。
BOOST_PP_COMMA( ) 使うとか。
0597デフォルトの名無しさん
2010/01/03(日) 17:43:13超便利だもん。
0598デフォルトの名無しさん
2010/01/03(日) 19:03:15ありがとうございます。なんかboost使えないんでこんなの定義しました。
#define ORE_COMMA ,
いいのかなぁ・・・
0599デフォルトの名無しさん
2010/01/03(日) 19:13:34ちなみにそれ、ちゃんと動くのかい?
0600デフォルトの名無しさん
2010/01/03(日) 19:30:010601デフォルトの名無しさん
2010/01/03(日) 19:43:070602デフォルトの名無しさん
2010/01/03(日) 20:08:19> 動きました。
ならおk。
> マクロ展開のルールからすれば
そんなもん、従ってない環境が多すぎるから
とにかく目の前のもので動けばおkとするしかないと思うよ。
0603デフォルトの名無しさん
2010/01/03(日) 21:19:430604デフォルトの名無しさん
2010/01/04(月) 16:16:39C++はクラスのポインタを渡すしか、方法が無いんですか?
0605デフォルトの名無しさん
2010/01/04(月) 16:27:090606デフォルトの名無しさん
2010/01/04(月) 19:42:08visual studioのマクロ(?)なのですが、他のコンパイラで_WIN32をコンパイルするとどうなるのですか?
gccでちゃんとコンパイルができるのですが
0607デフォルトの名無しさん
2010/01/04(月) 20:34:31_WIN32定義済みマクロは、Windows環境で定義される。でこうやって使う。
#ifdef _WIN32
Windows環境でしかコンパイルされないこと色々
#endif
0608606
2010/01/04(月) 21:12:22なるほど、他のOSだと_WIN32の所は無視されるわけですね
ちなみに、定義されていないマクロは全て無視されるのですか?
#ifdef HOGEHOGE
無視される?
#endif
0609デフォルトの名無しさん
2010/01/04(月) 21:25:43> ちなみに、定義されていないマクロは全て無視されるのですか?
君の言っていることを文字通り解釈すると・・・
無視されるのではなくプリプロセスエラーになる。
つーかそんくらい自分でためせ。
HOGEHOGEが定義されていない状態で
/********************************************************/
#ifdef HOGEHOGE
コードA
#elif
コードB
#endif
/********************************************************/
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
/********************************************************/
コードB
/********************************************************/
となる。
0610デフォルトの名無しさん
2010/01/04(月) 21:30:110611デフォルトの名無しさん
2010/01/04(月) 21:34:49残らない。
・・・まあやっぱそういう指摘はしたくなっちゃうよなw
単に説明のため残しただけなのだ。
0613デフォルトの名無しさん
2010/01/05(火) 02:04:58だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
になるんじゃないか!?
0614デフォルトの名無しさん
2010/01/05(火) 06:33:17何の話を言ってる?
0615デフォルトの名無しさん
2010/01/05(火) 12:59:24class ABC
{
int* object1; // int*
int *object2; // int *
public:
// 以下略
};
どっちで書く?
0616デフォルトの名無しさん
2010/01/05(火) 13:05:080617デフォルトの名無しさん
2010/01/05(火) 13:17:380618デフォルトの名無しさん
2010/01/05(火) 14:10:43int* a, *b;
みたいな書式は相容れないので使わない(えない)。
そもそもこの書式、コンマ区切りの式文?と衝突してしまうような。
0619デフォルトの名無しさん
2010/01/05(火) 17:18:58int*a;
と空白をいれずに書いてる。
0620デフォルトの名無しさん
2010/01/05(火) 17:19:51int * a;
と書いても良いのではないか?
0621デフォルトの名無しさん
2010/01/05(火) 17:24:120622デフォルトの名無しさん
2010/01/05(火) 17:43:10それでもいいんだけど、
正直、行中の空白の有無で可読性なんて、個人的には殆ど変わらないので
キーボードを打つ回数少ない空白なしが好き。
0623デフォルトの名無しさん
2010/01/05(火) 17:48:55newと同じようにdeleteしないとメモリリークの要因になりえますか?
0624デフォルトの名無しさん
2010/01/05(火) 17:57:03二つじゃないよ。
0625デフォルトの名無しさん
2010/01/05(火) 17:58:19分かってくださいよ
0626デフォルトの名無しさん
2010/01/05(火) 18:00:03RRとRLもあるよね。
0627デフォルトの名無しさん
2010/01/05(火) 18:02:130628デフォルトの名無しさん
2010/01/05(火) 20:28:25なるよ!。デストラクタ呼ぶのを忘れずにね
0629>574
2010/01/05(火) 20:48:55コンパイル時間が長いとかはまあ我慢できる範囲だとは思いますが、
コンパイラを選びまくりそうでどうにも気が引けてきます。
趣味で使っているコンパイラは通ると思いますが、
現在仕事で使っているあのコンパイラで通るのだろうか?・・・と考え始めると。。。
0630デフォルトの名無しさん
2010/01/05(火) 22:17:40テンプレート周りの挙動が怪しい環境でもけっこう動く。
まあSpiritに限ってはなんともいえんがw
0631デフォルトの名無しさん
2010/01/05(火) 22:22:06そうなんですか
テンプレートばりばりって聞いていたので、ちょっと不安でしたが。
試してみます。
ありがとうございます。
0632デフォルトの名無しさん
2010/01/05(火) 22:30:52v2はもう正式採用とはいえ、まだBetaという印象。
0633デフォルトの名無しさん
2010/01/05(火) 22:34:26ありがとうございます。
既に最新のBoost入れてしまいましたが、もしかしてまだ残っていたり
しますか?
0634デフォルトの名無しさん
2010/01/05(火) 23:39:18v1.6以前(classic)使ったコードは最新版でも問題なく通る。
(This header is deprecated. とwarningが出るが)
もう持ってるかもしれないがBoost本の「Boost C++ Librariesプログラミング」なんかも
v1.6時点でサンプル書かれてるから、勉強もしやすいと思う。
警告が気になる場合は、放置しても問題ないが
・メッセージに従ってincludeするヘッダを変更
・参照する名前空間をboost::spiritからboost::spirit::classicに変更
これでおk。
あ、俺はBoost厨だからSpirit薦めるけど、yaccとか他のツールは
触ってみた程度だから比較検討は自分でお願いします。
0635デフォルトの名無しさん
2010/01/05(火) 23:50:22知らないな。
原理的にはLLとLRで十分だろ。
もしかして、他にTとかBもあるの?
0636デフォルトの名無しさん
2010/01/06(水) 00:25:50それでも正規表現よりは早いけど。
0637デフォルトの名無しさん
2010/01/06(水) 00:30:49#elseじゃなくて#elifになってると言いたいのでは?
0638633
2010/01/06(水) 00:34:09ありがとうございます。
『Boost C++ Librariesプログラミング』は第2版を初めて購入し、
現在も持っております。
実は以前Boost.Spiritを使ったことがあるため
もう ろくに記憶にないとはいえ一番なじんでいるかもしれません。
>>636
ありがとうございます。
特定の組み込み系とかでどうしても必要な場合を除けば
速度より動くこと(確実さ・機能・可読性)を優先すべき
と(私の持論として)思っているので、正直速度はそこまでは気にしません。
0640デフォルトの名無しさん
2010/01/06(水) 00:40:15多分
/********************************************************/
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
/********************************************************/
じゃなくて
/********************************************************
だった場合は コードA の部分は無かったものとして扱われる。
正確に言えばプリプロセッサを通してコンパイラに渡されるファイルは
********************************************************/
こうだろって話かと。
0641デフォルトの名無しさん
2010/01/06(水) 00:45:47配置deleteが何もしないなら
deleteを呼び出さなくても問題ない(行儀は悪い)
ただしデストラクタは呼び出す必要がある
0642デフォルトの名無しさん
2010/01/06(水) 01:04:36placement new と言うと、標準ライブラリ <new> で宣言されてるやつのことを指したり、
そいつを含んで追加の引数を持つ operator new 全体を指したりして、話がよくわからない。
どっち?
0643デフォルトの名無しさん
2010/01/06(水) 01:50:16this->~T();
new (this) T();
}
で使う奴のことだろ。
0644623
2010/01/06(水) 14:16:20ありがとうございます。
やはりそうですよね。
>>641
なるほど。
>>642
標準ライブラリ <new> の方です。
皆様、ありがとうございました。
問題箇所と認識してコード修正します。
0645デフォルトの名無しさん
2010/01/06(水) 18:07:00循環参照の解決の機構を考えているのですが、
Pythonの方式よりも高速にできる方法を探しています。
いい方法はないでしょうか?
0646645
2010/01/06(水) 18:09:52{
T* refObject;
int count;
};
template<class T> class smart_ptr
{
ptr_inner* _inner;
// 省略
};
0647645
2010/01/06(水) 18:11:250648デフォルトの名無しさん
2010/01/06(水) 18:36:12質問が出たら回答するタイプのスレではなくて
一方的に教えていただけるようなスレがありませんか?
0649デフォルトの名無しさん
2010/01/06(水) 18:45:410650デフォルトの名無しさん
2010/01/06(水) 19:40:020651デフォルトの名無しさん
2010/01/06(水) 19:52:37参照カウントでも循環参照を解決できるんだ。
全然しらんかった。。。
0652デフォルトの名無しさん
2010/01/06(水) 19:53:24一方的でいいなら教科書でいいじゃん。
0653デフォルトの名無しさん
2010/01/06(水) 19:56:39俺もそれおもた
0654デフォルトの名無しさん
2010/01/06(水) 20:03:30わからん
0655デフォルトの名無しさん
2010/01/06(水) 20:07:23そんなん見つかったらとっくにPythonが採用しているのではないかね。
0656デフォルトの名無しさん
2010/01/06(水) 20:10:330657デフォルトの名無しさん
2010/01/06(水) 20:11:090658デフォルトの名無しさん
2010/01/06(水) 20:19:400659デフォルトの名無しさん
2010/01/06(水) 20:30:18これか
ttp://wiki.livedoor.jp/vip_programming/d/%B2%E1%B5%EE%A5%ED%A5%B0
0660デフォルトの名無しさん
2010/01/06(水) 20:54:35そんな場合でも、カウント式の循環参照の解決は弱い参照(weak_ptr)を使うのが簡単。
ところで、python方式ってどんなのなの?
スマポの設計は勉強になるからね。健闘を祈る。
0661デフォルトの名無しさん
2010/01/06(水) 20:56:43最近、他の事だが教えていて思うのは「やる気があるので、一方的に教えても大丈夫」ってのと
「解らないところが判らないので、先回りして全部解るように教えてなくちゃいけない」って
パターンがある事を意識する回数が増えたな、と。
"Hello, World!"の説明で原稿用紙100枚は埋められるぜってのと、説明を三行書けないって
違いかと。
まぁ、でも、言語非特定で演習問題作成スレってのがあってもいいかな、と。
既存の演習問題集は非現実的な場面ばかりでツマランってのはあるし。
0662デフォルトの名無しさん
2010/01/06(水) 21:06:43> "Hello, World!"の説明で原稿用紙100枚は埋められるぜ
俺はそんな変態 知らないぞ。
0663デフォルトの名無しさん
2010/01/06(水) 21:16:15テンプレ作っていただけたらスレ立てします
0664デフォルトの名無しさん
2010/01/06(水) 21:16:54ほんとに初心者をターゲットした内容のスレにしてくださいお願いします
0665デフォルトの名無しさん
2010/01/06(水) 21:27:020666デフォルトの名無しさん
2010/01/06(水) 21:35:58もうちょいセンスの良いスレタイでお願いします
0667デフォルトの名無しさん
2010/01/06(水) 21:38:530668デフォルトの名無しさん
2010/01/06(水) 21:46:230669デフォルトの名無しさん
2010/01/06(水) 21:50:470670デフォルトの名無しさん
2010/01/06(水) 22:07:510671デフォルトの名無しさん
2010/01/06(水) 22:14:070672デフォルトの名無しさん
2010/01/06(水) 22:18:17これいいですね、これで立てたいです
あと>>1の内容も書いてください
0673デフォルトの名無しさん
2010/01/06(水) 22:18:180674デフォルトの名無しさん
2010/01/06(水) 22:19:490675デフォルトの名無しさん
2010/01/06(水) 22:29:460676デフォルトの名無しさん
2010/01/06(水) 22:33:300677デフォルトの名無しさん
2010/01/06(水) 22:39:470678デフォルトの名無しさん
2010/01/06(水) 22:41:22真面目に説明すると奥深いぜ。
includeやその先のヘッダファイル、中に書かれているプリプロセッサの解説も出来るし、
coutで書かせてりゃ、クラスとオブジェクト(インスタンス)、静的クラスの説明まで引っ張れるし、
演算子定義も説明できる。
枚数余れば、"Hello, World!"がメモリのどの位置に置かれるかとか、他の書き方ではどう書けるか
とか、その際の式や文の意味の違いとかにも触れれるし。
あとは、コンパイルのやり方説明とかね。そこで、オプションやリンカにまで触れ始めたら、収集つかね
状態で原稿用紙100枚は埋まると思うのだが…
0679デフォルトの名無しさん
2010/01/06(水) 22:44:500680デフォルトの名無しさん
2010/01/06(水) 22:49:480681デフォルトの名無しさん
2010/01/06(水) 23:01:21400×100だぞ?
・・・あ、いけるかもw
0682デフォルトの名無しさん
2010/01/06(水) 23:02:180683デフォルトの名無しさん
2010/01/06(水) 23:13:06おっとArgument Dependent Lookupを忘れてもらっちゃ困るな
0684デフォルトの名無しさん
2010/01/06(水) 23:33:170685デフォルトの名無しさん
2010/01/06(水) 23:35:3440000字とか
簡単にいくな。
ソースコードが千行越えるとか良くある話。
それ以上は分割するけどさ。
0686デフォルトの名無しさん
2010/01/07(木) 00:08:03そう考えるとチョロいが・・・自然言語を書くのって疲れるからなぁ。
0687デフォルトの名無しさん
2010/01/07(木) 01:04:50とか間に挟んじゃうな。俺だったら。
0688デフォルトの名無しさん
2010/01/07(木) 08:30:27Pythonのってあれだろ、マーキングするやつ
0689デフォルトの名無しさん
2010/01/07(木) 13:41:330690デフォルトの名無しさん
2010/01/07(木) 14:23:270691デフォルトの名無しさん
2010/01/07(木) 15:46:21わざわざ分かれていたのをまとめたんだ
0692645 ◆GWRSHcLrd6
2010/01/07(木) 17:28:42スマートポインタのことでまたお世話になると思うので、とりあえずここで
経過報告させていただきます。
http://cdtest.genin.jp/projects/smart_ptr/index.htm
これからどんどん更新させていただきます。
間違い、バカなことがあったら指摘してください。
なにしろ 学生 + 独学 なので。
よろしくお願いします。
0693デフォルトの名無しさん
2010/01/07(木) 18:31:48スマートポインタならModern C++ Designの7章読んだか?
あとはboost::shared_ptrのリファレンスと実装を眺めるのも有用
0694645 ◆GWRSHcLrd6
2010/01/07(木) 18:46:10shared_ptrの実装なら眺めたことがあります。
Modern C++ Design ですか。
よく聞くんですけど、読んだことがなかったので
読んでみようと思います。
0695デフォルトの名無しさん
2010/01/07(木) 18:57:33すいません、作って欲しいソフトがあるのですが依頼はダメですか?
0696645 ◆GWRSHcLrd6
2010/01/07(木) 19:14:21まあ、ものによります…
0697デフォルトの名無しさん
2010/01/07(木) 19:21:18もし公開するときにHPにアフィリエイトがありましたら一週間程度は踏ませていただきますので宜しくお願いします
ソフトの画面の中にランダムに点を表示して、それを制限時間内に何回クリックできるかってソフト作れませんか?
0698645 ◆GWRSHcLrd6
2010/01/07(木) 19:24:14いつ公開できるかわかりませんが、できたときにはここで通知しますので
よろしくお願いします。
0699デフォルトの名無しさん
2010/01/07(木) 19:26:49645先生と呼ばせていただきます
ありがとうございます
0700645 ◆GWRSHcLrd6
2010/01/07(木) 19:27:210701デフォルトの名無しさん
2010/01/07(木) 19:28:08マルチプラットフォームなら最高です
0702デフォルトの名無しさん
2010/01/07(木) 19:28:27ありがとうございます
WindowsかLinuxならどちらでもOKです
マルチプラットフォームなら最高です
0703645 ◆GWRSHcLrd6
2010/01/07(木) 19:31:38windowsだとするとXP以上の対応でいいですか?それによってGDI+を使うか
どうかを考えますので・・・
0704デフォルトの名無しさん
2010/01/07(木) 19:34:490705645 ◆GWRSHcLrd6
2010/01/07(木) 19:36:500706デフォルトの名無しさん
2010/01/07(木) 19:38:51作る奴が居ればだが
0707デフォルトの名無しさん
2010/01/07(木) 20:13:21>わざわざ分かれていたのをまとめたんだ
やめろよw
0708デフォルトの名無しさん
2010/01/07(木) 20:33:53どっかいけよ
0709デフォルトの名無しさん
2010/01/07(木) 20:39:26>>703
windowsで大丈夫です。
宜しくお願い致します
0711デフォルトの名無しさん
2010/01/07(木) 20:48:57何が先生だwww
いいからどっか消えろ失せろ
スレタイ読め
0712デフォルトの名無しさん
2010/01/07(木) 20:50:20ん/ :::::::く::::::|::::::::::::::ヽ:::::ヽ`:、:::::::::::::::::い::: 目
と.!:::、::::.:::::::::.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 ヽ .`'― :(,゙/゙ //
0713デフォルトの名無しさん
2010/01/07(木) 21:30:49とりあえずC#で適当に作りました。
これから時間のあるときにC++でコーディングしていくので、
ビルドできればしてみてください。
>>709
・・・ここは確かにスレチです。
0714デフォルトの名無しさん
2010/01/07(木) 21:31:10名前がぶつからないのが奇跡
0716デフォルトの名無しさん
2010/01/07(木) 21:33:12ぶつかってたら別れてても普通コンパイルできなくないか?
0717デフォルトの名無しさん
2010/01/07(木) 21:37:06いい子やw
0718デフォルトの名無しさん
2010/01/07(木) 21:45:45static foo() とかよく使いませんか?
0719デフォルトの名無しさん
2010/01/07(木) 21:49:500720デフォルトの名無しさん
2010/01/07(木) 21:50:200721デフォルトの名無しさん
2010/01/07(木) 22:42:27よくわからない。
0722デフォルトの名無しさん
2010/01/07(木) 22:49:21自動変数を作れなくする方法はあるが、派生クラスを全部で禁止する方法は無さげ。
てかそんな必要があるのかを考えたほうがよくね?
0723デフォルトの名無しさん
2010/01/07(木) 22:50:09そうでもなくないか?
だってもともとリンクしてぶつからないわけだろう?
さらに名前空間をちゃんと分けていれば
結構どうにかなると・・・思う。
0724デフォルトの名無しさん
2010/01/07(木) 23:10:39バイナリ入ってない
0725デフォルトの名無しさん
2010/01/07(木) 23:20:48だからどうでも良いって言ってるだろ
さっさと失せろ低能
0726デフォルトの名無しさん
2010/01/08(金) 09:18:18ニートだまれ
0727デフォルトの名無しさん
2010/01/08(金) 10:04:05侵入型参照カウンタをベースにしようと考えてます
そうすると自動変数でreleaseメンバーを封印するか、自動変数を封印するかしないとダメだとおもうので必要性はあるかと
0728デフォルトの名無しさん
2010/01/08(金) 10:30:01やっぱり必要ないような。
「〜を封印」しないと、どんな問題が起こるのを心配してるの?
0729デフォルトの名無しさん
2010/01/08(金) 10:46:460730デフォルトの名無しさん
2010/01/08(金) 10:53:05それって、 int a; delete &a; してしまうかもしれないので危険だ、と言うのと同じじゃない?
気にしてもしょうがないような。
とりあえず release() は private にしといて、専用の関数を friend で指定しとくのがいいと
思う。それで十分だとも思う。
0731デフォルトの名無しさん
2010/01/08(金) 11:00:23vector<Node*> b;
aとbの配列があってその中から共通のNode*だけを取り出したいのですが
どうすればいいでしょうか
0732デフォルトの名無しさん
2010/01/08(金) 11:17:150733デフォルトの名無しさん
2010/01/08(金) 11:17:230734645 ◆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>();
}
エラーが出ます。
0735645 ◆GWRSHcLrd6
2010/01/08(金) 18:42:41定義
'hoge<U> hoge<T>::abc()'
既存の宣言
'hoge<U> hoge<T>::abc()'
0736質問
2010/01/08(金) 18:47:54いろんな画像形式に対応していて、
画像を拡大したり縮小したりフィルタをかけたりする事ができるもので
もっともメジャーなものって何でしょうか?
0737645 ◆GWRSHcLrd6
2010/01/08(金) 18:49:46{
template<class U> void abc(U* obj);
};
ではなく
template<class T> struct hoge
{
template<class U> hoge<U> abc();
};
でした。
0738デフォルトの名無しさん
2010/01/08(金) 18:50:13boost
0739デフォルトの名無しさん
2010/01/08(金) 19:26:09template<class T> template<class U> hoge<U> hoge<T>::abc()
{
return hoge<U>();
};
0740デフォルトの名無しさん
2010/01/08(金) 19:34:38boostにそんなものあんの?w
0741デフォルトの名無しさん
2010/01/08(金) 19:52:36OpenCVとかじゃね? 確かBSDライセンス
何が一番メジャーかって言われると俺もわからん
0742デフォルトの名無しさん
2010/01/08(金) 19:55:500743デフォルトの名無しさん
2010/01/08(金) 19:58:41何それ?
directxのこと?
0744デフォルトの名無しさん
2010/01/08(金) 20:06:33ttp://www.moongift.jp/2010/01/notepad-gnu/
もしおりましたらソフトウェア板に専用スレ立てます
0745デフォルトの名無しさん
2010/01/08(金) 20:12:59いや、常識で判断しろよ。
それをこのスレできくのか?
0746645 ◆GWRSHcLrd6
2010/01/08(金) 20:25:360747デフォルトの名無しさん
2010/01/08(金) 20:43:06すいませんでした
他のスレに言ってきます
0748デフォルトの名無しさん
2010/01/08(金) 21:02:58それが平和だ。
0749デフォルトの名無しさん
2010/01/08(金) 21:05:330750747
2010/01/08(金) 21:06:43( ゚ω゚ ) お断りします
/ \ ハ,,ハ お断りします
((⊂ ) ノ\つ))( ゚ω゚ )
(_⌒ヽ((⊂ノ ヽつ ))
ヽ ヘ } (_⌒ヽ
ε≡Ξ ノノ `J ノノ `J
0751デフォルトの名無しさん
2010/01/08(金) 21:11:01お前勝手に騙るなボケ
0752デフォルトの名無しさん
2010/01/08(金) 21:11:56>>501 の言う通り、バカがいるんだなぁ。
0753デフォルトの名無しさん
2010/01/08(金) 21:13:230754デフォルトの名無しさん
2010/01/08(金) 21:59:580755デフォルトの名無しさん
2010/01/08(金) 22:03:01わけが分からなくなることは初心者にはありがちだな。
0756デフォルトの名無しさん
2010/01/08(金) 22:25:42http://www.cs.indiana.edu/pub/techreports/TR542.pdf
0757デフォルトの名無しさん
2010/01/08(金) 22:33:49これがどうかしたの?
0758デフォルトの名無しさん
2010/01/09(土) 09:53:58単体では「色々な画像形式に対応していて」を満たさないと思うが GIL がある。
0759722
2010/01/09(土) 11:22:03自動変数を禁止するには、デストラクタをprivateあるいはprotectedにするだけで十分です。でも、派生させるとデフォルトデストラクタがpublicになって保護できないので不完全。
自動変数禁止の目的は自動変数をスマポに代入するミスの保護だと思うけど、&オペレータをprivateにすれば自動変数をスマポに代入できなくるので保護できる。自動変数は速いので禁止するのはもったいないです。
0760デフォルトの名無しさん
2010/01/09(土) 11:37:210762645 ◆GWRSHcLrd6
2010/01/09(土) 17:14:38スマートポインタとしての基本的な部分を実装しました。
問題点などあったら教えていただけると幸いです。
次はDeleterか循環参照解決を実装したいと思っています。
0763デフォルトの名無しさん
2010/01/09(土) 17:39:16> class _null {};
> struct __ptr;
予約識別子。未定義動作。
適切なライブラリヘッダの #include なしで NULL は使えない。コンパイルエラー。
ファイル終端に改行が無い。未定義動作。
smart_ptr<T>::__ptr::Inc() で INT_MAX を超えないうちに「超えました」のエラー。
しかもそこで投げるのは bad_alloc じゃないだろう。
bad_alloc だとすれば #include するヘッダが間違ってる。 <new> が正解。
smart_ptr<T>::Reset() では強い例外保証がほしいところ。
0764デフォルトの名無しさん
2010/01/09(土) 19:51:210765645 ◆GWRSHcLrd6
2010/01/09(土) 20:26:59>> class _null {};
>> struct __ptr;
>予約識別子。未定義動作。
そうでした・・・
>適切なライブラリヘッダの #include なしで NULL は使えない。コンパイルエラー。
すみません。<cstdio>をインクルードしました。
>ファイル終端に改行が無い。未定義動作。
開いてませんでした・・・orz
>smart_ptr<T>::__ptr::Inc() で INT_MAX を超えないうちに「超えました」のエラー。
修正しました。ありがとうございます。
>しかもそこで投げるのは bad_alloc じゃないだろう。
そうですね… とりあえずoverflow_errorに変更しました。
0766645 ◆GWRSHcLrd6
2010/01/09(土) 20:28:57循環参照の解決の機構を実装しようかと思っています。
修正したソースをうpしました。
http://cdtest.genin.jp/projects/smart_ptr/index.htm
0767デフォルトの名無しさん
2010/01/09(土) 20:34:41重要なのは、使ってるだけでは気づかないスマポ実装のノウハウが学べられことかな。
>>762
キャストでオブジェクトが複数のinner_ptrから参照されるようになってしまうのは良くない。
こんな使い型の落とし穴があるよ。
Hoge* p=new Hoge();
smart_ptr<Hoge> a=p;
delete p;
暗黙の変換でポインタが代入できてしまうミス。スマポ外で管理されてるポインタをスマポが横取りしてしまう。
explicitにする必要あり。そうするとこういう書き方しかできなくなる。
smart_ptr<hoge> a(new Hoge());
a=a;
参照カウントが減って開放されてしまう。
0768デフォルトの名無しさん
2010/01/09(土) 20:38:32なんで例外保証の件だけスルーしたの?
0769デフォルトの名無しさん
2010/01/09(土) 20:38:4332bit環境下ではINT_MAXを超えるのは不可能だからチェックは要らなくない気がする。
64bit環境ではlong longにすれば同様になると
0770デフォルトの名無しさん
2010/01/09(土) 20:42:08NULL 使うためだけに cstdio とか、アホか。
0 にしとけ。どうしても NULL が使いたいならせめて cstddef で済ませとけ。
0771デフォルトの名無しさん
2010/01/09(土) 20:46:29nullptrでググると現在のコンパイラでも使える定義が出てくるよ。
0772645 ◆GWRSHcLrd6
2010/01/09(土) 20:46:48>キャストでオブジェクトが複数のinner_ptrから参照されるようになってしまうのは良くない。
一応カウントは共有しているのですが…
キャストはユーザー?(開発者)に任せた方がよいのですかね。
>参照カウントが減って開放されてしまう。
本当ですか!?そこまで気付かなかった…
>暗黙の変換でポインタが代入できてしまうミス。スマポ外で管理されてるポインタをスマポが横取りしてしまう。
やっぱりそうですか。shared_ptrを使っていて不便に思っていたもので… やはりミスの要因になりかねませんよね。
0773デフォルトの名無しさん
2010/01/09(土) 20:49:08> 32bit環境下ではINT_MAXを超えるのは不可能
Windows 限定なら、ってこと?
そうじゃなければアドレス空間 32bit で int が 16bit とか、 int は 32bit だけど
アドレス空間はもっとあるとか、不可能とは言い切れないと思うんだけど。
カウンタを uintptr_t にしとけば確実かな?
0774デフォルトの名無しさん
2010/01/09(土) 20:50:12inner_ptrを共有すれば問題無い。
キャストは必要なので用意したほうがいい。
0775645 ◆GWRSHcLrd6
2010/01/09(土) 20:54:37すいません、書き忘れました。
例外保証についても修正しなければなりませんね…
>>773
uintptr_tですか。置き換えておきます。
0777デフォルトの名無しさん
2010/01/09(土) 21:01:540778デフォルトの名無しさん
2010/01/09(土) 21:05:24numeric_limits を使えば問題ない。
でも、ここでは最大値のチェックを不要とするために uintptr_t を使うって話だから、
あんまり関係ないかも。
あれ? uintptr_t って C++ 2003 に入ってたっけ?
0779645 ◆GWRSHcLrd6
2010/01/09(土) 21:17:28#ifndef NULL 〜 #define NULL 0 にしました。
>>778
メモリの制約、ということで、オーバーフローチェックは省きました。
0780デフォルトの名無しさん
2010/01/09(土) 21:23:41inner_ptrの共有のほうがメリットがあるので、気が向いたときにでも検討してね。
0781デフォルトの名無しさん
2010/01/09(土) 21:31:12> #ifndef NULL 〜 #define NULL 0 にしました。
なんでそういうことしちゃうかなー。 >>770 の2行目をもう一度読み直して欲しい。
0782デフォルトの名無しさん
2010/01/09(土) 21:32:430783645 ◆GWRSHcLrd6
2010/01/09(土) 21:38:55変えてみてもそんなに変わらないし、cstddefをインクルードするほどではないので
0で置き換えます。
0784デフォルトの名無しさん
2010/01/09(土) 21:43:52完全には無理だがほとんど空ポ自体使わないように設計できるし、使ったとしてもやっぱ0だよ
0785645 ◆GWRSHcLrd6
2010/01/09(土) 21:44:02どのようなメリットがあるのか教えていただけると幸いです。
というより内部のデータはどう扱えばいいのでしょうか?
テンプレートクラス内部なので…
Deleterを実装すれば簡単なのですが。
0786デフォルトの名無しさん
2010/01/09(土) 21:45:170787デフォルトの名無しさん
2010/01/09(土) 21:48:10意外と有用かもしれない。
0788デフォルトの名無しさん
2010/01/09(土) 21:50:411. #define NULL
または
#include <cstddef>する
2. 0
3. やっぱり
#ifndef _HAS_CPP_0X
#define nullptr 0
#endif
0789デフォルトの名無しさん
2010/01/09(土) 21:54:26bool is_null;
ってメンバをチェックするようにすればいい。
0790デフォルトの名無しさん
2010/01/09(土) 21:57:39つ 3番
0791デフォルトの名無しさん
2010/01/09(土) 22:00:23internal_ptrがとcountが別々だとアロケートやコピーにコストがかかっちゃうし。
オブジェクトを掴むinternal_ptrが複数あると将来的に管理が面倒になりそう。1オブジェクト1internal_ptrの方が簡単になりそう。
0792デフォルトの名無しさん
2010/01/09(土) 22:06:18shared_ref<hoge> r1(param1,param2,...); //初期化が必須
shared_ref<hoge> r2=r1; //ok
shared_ptr<hoge> p;
p=r; //ok
r=p; //だめ
こんな感じか?。これなら意味があるね。
0793645 ◆xj5aoi8gEM
2010/01/09(土) 22:08:02なるほど、Deleterが実装できた場合は置き換えたいとおもいます。
>>788
・・・どうすれば??
0794デフォルトの名無しさん
2010/01/09(土) 22:13:44ああ、そうかinternal_ptrがクラステンプレート内のクラスだからキャスト時にアクセスできなくなるからか。
外に出せば簡単になるけど、隠したいなら名前空間detailの中に隠すとか
0795645 ◆GWRSHcLrd6
2010/01/09(土) 22:16:430796645 ◆GWRSHcLrd6
2010/01/09(土) 22:18:380797645 ◆GWRSHcLrd6
2010/01/09(土) 22:25:38いろいろ修正しました。
NULL, 例外安全, 同一オブジェクトの代入については
修正されていません。
0798デフォルトの名無しさん
2010/01/09(土) 23:21:46#define NULL はねーよ。
標準ライブラリ実装の定義とずれたら ODR 違反になってしまう。
0799デフォルトの名無しさん
2010/01/09(土) 23:26:200800デフォルトの名無しさん
2010/01/09(土) 23:54:590801デフォルトの名無しさん
2010/01/09(土) 23:56:54#ifndef _HAS_CPP_0X
#define nullptr reinterpret_cast<void*>(0)
#endif
じゃない?
0802デフォルトの名無しさん
2010/01/09(土) 23:59:53C++では0はぬるぽも表すから問題ない。
0803798
2010/01/10(日) 00:00:290804デフォルトの名無しさん
2010/01/10(日) 00:01:51それはなんの冗談だ?
0805デフォルトの名無しさん
2010/01/10(日) 00:21:34innerの共有なんて、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();
}
0806デフォルトの名無しさん
2010/01/10(日) 01:05:11Cygwinスレの勢いがなく返答が帰ってくる信用性が低いのでこちらで聞きます。
(急いでいるので)
Bisonのコマンドを使うためにcygwinのインストーラ(名前はsetup.exe)を起動して
Devetの項目のBisonだけを選択してインストールしたところ
途中でエラーが出て止まってキャンセル押したらCygwinが起動すらしなくなりました。
今PCに入っているCygwinに追加する物も既にあるものも同時に入れないとだめですか?
追加インストールでなく再インストール扱いになっていたんでしょうか?
0807デフォルトの名無しさん
2010/01/10(日) 01:15:15氏ね惚け
0808デフォルトの名無しさん
2010/01/10(日) 01:22:330809デフォルトの名無しさん
2010/01/10(日) 01:23:410810デフォルトの名無しさん
2010/01/10(日) 02:18:100811デフォルトの名無しさん
2010/01/10(日) 10:24:550812デフォルトの名無しさん
2010/01/10(日) 10:26:42リュウの場合はしゃがんで中キックで牽制。
足を当ててもいいけど、メインは牽制で近づけないようにする。
で、飛んできたらそのまま大パンチでアッパー。
ノー駄目で倒せます。
0813デフォルトの名無しさん
2010/01/10(日) 10:38:030814デフォルトの名無しさん
2010/01/10(日) 10:40:04少なくともネットワークプログラミングを覚えなければ
0815デフォルトの名無しさん
2010/01/10(日) 19:52:100816デフォルトの名無しさん
2010/01/10(日) 20:13:46一休み一休み
0817デフォルトの名無しさん
2010/01/10(日) 20:44:57>innerの共有なんて、smart_ptrがinnerとオブジェクトへのポインタを保持して、
>internal_ptr内部はカウンタのみにすればいいだけ。
スマポのサイズが大きくなるだろ。
普通のポインタサイズを超えるとか・・・
0818デフォルトの名無しさん
2010/01/10(日) 20:49:390819デフォルトの名無しさん
2010/01/10(日) 22:19:42どうしても限界まで速度を上げたければ生ポインタを使えば良いし
そうじゃないならboost::shared_ptrじゃダメなの?
0820デフォルトの名無しさん
2010/01/10(日) 22:21:000821デフォルトの名無しさん
2010/01/10(日) 22:23:450822デフォルトの名無しさん
2010/01/10(日) 22:34:440823645 ◆GWRSHcLrd6
2010/01/10(日) 22:47:10少々お待ち下さい・・・
0824819
2010/01/10(日) 22:49:53確かに言ってないな。
つまり車輪の再発明をしたいってこと?
(注:俺は車輪の再発明を全面的に否定的したいわけじゃありません。)
>>821
えーっと、クロスDLL問題のことか?
いずれにせよ>>821が想定しているDLLでの問題ってのを解決できる
フリーなスマポは現在配布されているの??
0825デフォルトの名無しさん
2010/01/10(日) 23:08:580826デフォルトの名無しさん
2010/01/10(日) 23:24:440827デフォルトの名無しさん
2010/01/10(日) 23:47:42スマートポインタの実装は学べるところが多いしね
0828645 ◆GWRSHcLrd6
2010/01/11(月) 00:14:28smart_ptr
すべて書きなおしました。
動的削除子を実装、detail名前空間へのinternal_ptrの移動、
nullptrの採用(なんかすいません (^^;))など、
大幅に改善しました。
zipもアップロードしました。
よろしくお願いします。
0829デフォルトの名無しさん
2010/01/11(月) 00:19:44さすがスマポ
0830デフォルトの名無しさん
2010/01/11(月) 00:21:470831デフォルトの名無しさん
2010/01/11(月) 00:23:190832デフォルトの名無しさん
2010/01/11(月) 00:58:50STLでも普通に使われているはずだが。
0833デフォルトの名無しさん
2010/01/11(月) 09:11:56動的削除子がついて本格的になりましたね。
動的削除子を関数オブジェクトにすると少し速くなるかも。でもヒープの処理時間に比べればわずかかも。
それよりも、deleter_baseとinternal_ptrを統合すればnewの回数が減らせて速くなりそうだね。
0834デフォルトの名無しさん
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());
型宣言の時にテンプレートパラメータを消去する方法が思いつかない
0835デフォルトの名無しさん
2010/01/11(月) 10:27:10class 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で管理すればいい。
0836645 ◆GWRSHcLrd6
2010/01/11(月) 10:32:38http://cdtest.genin.jp/projects/smart_ptr/index.htm
テンプレートで削除子ってどうやるんですかね・・・??
>>833
deleter_baseとinternal_ptrを統合・・・というと?
0837デフォルトの名無しさん
2010/01/11(月) 13:21:160838デフォルトの名無しさん
2010/01/11(月) 13:49:19そういやboost::anyはチェックしてみた?あっちの方が実装が簡単で参考になるよ。
boost::anyは値で保持しているから、カウンタは自分で実装する必要があるけど。
0839デフォルトの名無しさん
2010/01/11(月) 15:51:40deleter_baseが派生によって任意の動的削除子を掴む設計の様ですね。
で、さらにそのdeleter_baseをinternal_ptrが掴むようになってるので、どうせなら、internal_ptrがdeleter_base
と同じ手法で直接動的削除子をつかめるようにしたらnewが一回減るかなとか。
0840デフォルトの名無しさん
2010/01/11(月) 15:53:040841デフォルトの名無しさん
2010/01/11(月) 16:34:160842デフォルトの名無しさん
2010/01/11(月) 18:38:48勉強になったっす
TypeEraserパネェっす
0843デフォルトの名無しさん
2010/01/11(月) 20:06:20ifstream* in;
in = new ifstream("filename");
ifstream in("filename");
0844デフォルトの名無しさん
2010/01/11(月) 20:12:44int *x;
x = new int(100);
int x(100);
0845デフォルトの名無しさん
2010/01/11(月) 20:25:33CLIのマネージドクラス??ちょっとよくわからないです。
しかし、何となく理由はわかりました。
静的割り当てと動的割り当ての違いですね。
0846デフォルトの名無しさん
2010/01/11(月) 20:29:27いや、ごく普通のC++だが・・・
そういう書き方もできるんだ
変数宣言と初期化の構文にintもifstreamも違いは無い
0847デフォルトの名無しさん
2010/01/11(月) 20:55:460848デフォルトの名無しさん
2010/01/11(月) 21:01:33スタック、ヒープとフリーストアの違いは知っておかないと大変なことになるからな。
0849デフォルトの名無しさん
2010/01/11(月) 21:02:11ほぅほぅそういう違いがあるんですね。
ちょっと勉強してきます。
0850デフォルトの名無しさん
2010/01/11(月) 21:03:19変数の動的確保でググれ。
0851デフォルトの名無しさん
2010/01/11(月) 21:04:13intもクラスなんですね・・
cの頃と同じ型?かと思ってた
0852デフォルトの名無しさん
2010/01/11(月) 21:09:18そういう問題ではない
>>843が理解できてないのはC++以前のC言語レベルの話
int x[100];
と
int* x = (int*)malloc(sizeof(int)*100)
の違いがわからないと言っているのと同じ
0853デフォルトの名無しさん
2010/01/11(月) 21:22:00その違いの話は既に解決しました。
ただ、intがクラスだった事を知らなかったので。
昨日からc++の勉強を始めたので解らない事ばかりです。
0854デフォルトの名無しさん
2010/01/11(月) 21:22:39だから、ココ見てろって。
http://www.kab-studio.biz/Programing/Codian/Pointer/09.html
0855デフォルトの名無しさん
2010/01/11(月) 21:25:55int はクラスじゃないよ。
new を使うかどうか、使えるかどうか、使わないといけないのかどうかは
クラスかどうかとはあんまり関係ないよ。
0856デフォルトの名無しさん
2010/01/11(月) 21:28:03int(100); 見たいな宣言の方法はコンストラクタを呼んでいるんじゃないんですか??
0857デフォルトの名無しさん
2010/01/11(月) 21:30:55間違えました
int x(100);のことです
0858デフォルトの名無しさん
2010/01/11(月) 21:40:33newはクラスにしか使えないって考え方が間違ってる
intはクラスではないがnewの構文がプリミティブ型にも使えるだけの話
極論すればmallocが構造体の確保だけに使うわけではないのと同じ
newされるのがクラスであればコンストラクタである関数が呼ばれるが
そもそもコンストラクタとは「初期化するもの」なんだから
プリミティブ型が同じ構文で単に初期化されるのは至極真っ当でしょ
0859デフォルトの名無しさん
2010/01/11(月) 21:47:49newの話とクラスの話は別です。既に前者の話は解決しました。
ただcではint x(100);の様な書き方をした事が無くc++のコンストラクタによる初期化と同じ書式なので
intがクラスなのかと思っただけですよ。
0860デフォルトの名無しさん
2010/01/11(月) 21:49:53次のようなソースで警告とか出ますか?
sptr<int> ptr1( new int(10) );
const sptr<int> ptr2( ptr1 );
sptr<int> ptr3( ptr2 );
*ptr3 = 20;
0861デフォルトの名無しさん
2010/01/11(月) 21:52:000862デフォルトの名無しさん
2010/01/11(月) 21:54:25試してみます。
0863デフォルトの名無しさん
2010/01/11(月) 22:16:55そういう話聞くから、スマポ使うかどうか迷ってるんだけども・・・。
0864デフォルトの名無しさん
2010/01/11(月) 22:28:40std::auto_ptr は Assignable 要件を満たさないので、 Assignable を要求するライブラリ、
主に標準コンテナと組み合わせて使えない。
boost が使えるなら boost::shared_ptr にしとけば(いくらかの実行効率は除いて)問題ない。
うっかりコンテナと組み合わせたりしなけりゃ std::auto_ptr も十分使える。
とりあえず delete を自分で書いてるようなら今すぐ置き換えてまわることをおすすめする。
0865デフォルトの名無しさん
2010/01/12(火) 00:21:05スマポの仕様による。
スピード最優先だったりするスマポの場合はSTLに入れられなかったり。
でもスマポを作る人がSTLに入れられる様に作りたいと思っていればそうなっているだろう。
0866デフォルトの名無しさん
2010/01/12(火) 10:12:32クライアントの良心を信じるほかないのでしょうか?
0867デフォルトの名無しさん
2010/01/12(火) 10:24:56自己責任でやってくれるぶんには別に困らないだろ
何か問題が起きても動作保証外ですで突き返す
0868デフォルトの名無しさん
2010/01/12(火) 10:45:16ちなみにまだ小学5年ですが、授業時間の話だけで毎回100点とか90点くらいはとります
0869デフォルトの名無しさん
2010/01/12(火) 10:50:28どれくらい学習時間かければマスターできるかってことでしょうか?
どれくらい物覚えがよければマスターできるかってことでしょうか?
どれくらいのレベルの学校に行けばマスターできるかってことでしょうか?
聞きたいことをもうちょっと詳しく
0870デフォルトの名無しさん
2010/01/12(火) 11:04:45他のプログラミング言語の経験にもよる
でも学校の勉強はおそろかにしちゃいけない
0871デフォルトの名無しさん
2010/01/12(火) 11:38:06Helloworld、分岐、繰り返し、関数、ポインタ、クラス、継承
はい終了
0872デフォルトの名無しさん
2010/01/12(火) 12:06:13そんなだからいつまでも「わかったつもり」なんだ
0873デフォルトの名無しさん
2010/01/12(火) 12:06:59haskellをやりなさい。
0874デフォルトの名無しさん
2010/01/12(火) 12:13:06そんなもの全部ライブラリ扱い。
必要なライブラリはそのつど覚えるもんだよw
0875デフォルトの名無しさん
2010/01/12(火) 12:14:210876デフォルトの名無しさん
2010/01/12(火) 12:18:260877デフォルトの名無しさん
2010/01/12(火) 12:20:57おいおい、覚えていくことになるだろうが。
0878デフォルトの名無しさん
2010/01/12(火) 12:22:120879デフォルトの名無しさん
2010/01/12(火) 12:34:26関数型言語だと割と普通だから必要に迫られなければやらなくてもいい。
0880デフォルトの名無しさん
2010/01/12(火) 12:36:23テンプレートとかややこしくなるだけで百害あって一利なし。
テンプレート使うぐらいなら似たような関数を大量生産するね、俺なら。
0881デフォルトの名無しさん
2010/01/12(火) 12:37:53まったく違う。静的か動的かが。
テンプレートなんぞマクロみたいなもん。
0882デフォルトの名無しさん
2010/01/12(火) 12:40:44そんなこと些細な違い
0883デフォルトの名無しさん
2010/01/12(火) 12:44:34マジで洗脳されるのもたいがいにしてくれw
0884デフォルトの名無しさん
2010/01/12(火) 12:54:02しかしそれを見越した釣りの可能性も
0885デフォルトの名無しさん
2010/01/12(火) 13:01:12ポリモーフィズムは動的に決定されるやん。OOPやん。
0886デフォルトの名無しさん
2010/01/12(火) 13:02:05実際に自分が使う場合、何処で使って良いのかわからんのよね
0887デフォルトの名無しさん
2010/01/12(火) 13:33:510888デフォルトの名無しさん
2010/01/12(火) 13:57:540889デフォルトの名無しさん
2010/01/12(火) 14:51:430890デフォルトの名無しさん
2010/01/12(火) 15:31:420891デフォルトの名無しさん
2010/01/12(火) 19:21:12当たり前
実は今は小学生のテストで90点取れないやつの方が少ないんだぜ
私立は知らんけど
0892デフォルトの名無しさん
2010/01/12(火) 19:24:0390〜100は当たり前だった。
0893デフォルトの名無しさん
2010/01/12(火) 19:25:06高校物理は全国10位前後だったけど
0894デフォルトの名無しさん
2010/01/12(火) 19:58:40ふーんよかったねよかったねよかったね
0895デフォルトの名無しさん
2010/01/12(火) 20:19:10満点だからw
0896デフォルトの名無しさん
2010/01/12(火) 20:20:480897デフォルトの名無しさん
2010/01/12(火) 20:20:560898デフォルトの名無しさん
2010/01/12(火) 20:25:250899デフォルトの名無しさん
2010/01/12(火) 20:30:110900デフォルトの名無しさん
2010/01/12(火) 20:31:32ニュートン力学とか?
もうわすれちった。
0901デフォルトの名無しさん
2010/01/12(火) 20:31:540902デフォルトの名無しさん
2010/01/12(火) 20:32:370903デフォルトの名無しさん
2010/01/12(火) 20:33:49モルだけはサッパリ概念がつかめなかったのを思い出すw
0904デフォルトの名無しさん
2010/01/12(火) 20:34:05数学は統計が苦手だった。
0905デフォルトの名無しさん
2010/01/12(火) 20:41:08モルは物理じゃねーぞ
0906デフォルトの名無しさん
2010/01/12(火) 20:42:090907デフォルトの名無しさん
2010/01/12(火) 20:43:38____
/∵∴∵∴\
/∵∴∵∴∵∴\
/∵∴∴,(・)(・)∴|
|∵∵/ ○ \|
|∵ / 三 | 三 | / ̄ ̄ ̄ ̄ ̄
|∵ | __|__ | < うるせー馬鹿!
\| \_/ / \_____
\____/
0908645 ◆GWRSHcLrd6
2010/01/12(火) 20:48:52内部ポインタにvirtualを導入したいのですが。
0909デフォルトの名無しさん
2010/01/12(火) 20:50:580910デフォルトの名無しさん
2010/01/12(火) 21:01:06使わないと忘れちゃうよ。科目の好き嫌いも影響するしね。
0911デフォルトの名無しさん
2010/01/12(火) 21:39:57好きなことはすごく良くできるけど、嫌いなことはからっきしダメっていう人間は日本では負け組みになってしまうんだよ。
0912デフォルトの名無しさん
2010/01/12(火) 22:03:59そういう人間のなかでできるやつを選別して大学の研究室に残らせたり企業の研究所に送ったりするので
実際はその競争にすら負けた出来そこないが宙ぶらりんになってるだけだけどな
0913デフォルトの名無しさん
2010/01/12(火) 22:07:190914デフォルトの名無しさん
2010/01/12(火) 22:08:12有能なのを送らなかったりする「紛れ」が少ないなら結構なんだが。
0915デフォルトの名無しさん
2010/01/12(火) 22:08:400916デフォルトの名無しさん
2010/01/12(火) 22:10:09実際は無能な奴が大学に残って、優秀だと思われていた奴がなぜか欝入って派遣行ったりするんだけどな。
世の中わからんね。
0917デフォルトの名無しさん
2010/01/12(火) 22:32:48【IT】人気プログラミング言語ランキング…PHPがC++を抜く 1位はJava [10/01/12]
http://anchorage.2ch.net/test/read.cgi/bizplus/1263298235/
0918デフォルトの名無しさん
2010/01/12(火) 22:35:26「PHPにシェアを抜かれた言語は終了」とでも思ってる馬鹿なのか、
C++のシェアが少しずつ減っていることを今さら知った情弱なのかわからん。
0919デフォルトの名無しさん
2010/01/12(火) 22:38:460920デフォルトの名無しさん
2010/01/12(火) 22:40:200921デフォルトの名無しさん
2010/01/12(火) 23:09:55これって趣味グラマの統計?
求人情報の統計?
0922デフォルトの名無しさん
2010/01/12(火) 23:31:30>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が抜け出したのは、やっぱ手軽さが評価されたんだろうか。
0923デフォルトの名無しさん
2010/01/12(火) 23:35:36perlも入ってるとは言え、phpメインだろうし
0924デフォルトの名無しさん
2010/01/12(火) 23:40:13意味ないよね
0925デフォルトの名無しさん
2010/01/12(火) 23:41:55http://pc12.2ch.net/test/read.cgi/affiliate/1263225873/
0926デフォルトの名無しさん
2010/01/12(火) 23:47:47誰が虚勢張っているの?>>917のこと?
0927デフォルトの名無しさん
2010/01/12(火) 23:48:310928デフォルトの名無しさん
2010/01/12(火) 23:51:060929デフォルトの名無しさん
2010/01/12(火) 23:51:570930デフォルトの名無しさん
2010/01/13(水) 03:04:47lispに謝れっ
0931デフォルトの名無しさん
2010/01/13(水) 10:01:190932デフォルトの名無しさん
2010/01/13(水) 11:31:06lisp処理系は職人さんがマシン語でじっくり丁寧に作ったものなのか?
0933デフォルトの名無しさん
2010/01/13(水) 13:44:580934デフォルトの名無しさん
2010/01/13(水) 14:31:210935デフォルトの名無しさん
2010/01/13(水) 15:23:15a)シンタックス等の記述方法が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++だからなぁ
0936デフォルトの名無しさん
2010/01/13(水) 16:00:33だったらほぼすべての言語がC/C++の影響を受けてるってことだよ。
0937デフォルトの名無しさん
2010/01/13(水) 16:04:000938デフォルトの名無しさん
2010/01/13(水) 16:45:45http://yaneuraou.yaneu.com/
0939デフォルトの名無しさん
2010/01/13(水) 17:08:57これからは自分がやりたいことをやりやすい言語を自前で実装する時代なんだな。
0940デフォルトの名無しさん
2010/01/13(水) 18:08:020941デフォルトの名無しさん
2010/01/13(水) 20:13:45・・・でも何でWEBでしか使われないわけ?
0942デフォルトの名無しさん
2010/01/13(水) 20:15:42というか理解しようという動機が見つからない。
理解できたときの快感は半端無いらしいが。
0943デフォルトの名無しさん
2010/01/13(水) 20:22:170944デフォルトの名無しさん
2010/01/13(水) 20:24:07Lispって簡単じゃん。
Helloworld、関数、分岐、再帰、マクロ
はい終了
0945デフォルトの名無しさん
2010/01/13(水) 20:48:46いやいや、深遠さはたぶん尋常でないよ。
でも職場で他のヤツができないからあんまり流行らないのかな?
0946デフォルトの名無しさん
2010/01/13(水) 20:55:15Lispの深遠さ=計算機科学の深遠さ
だから基礎を学んだ人間にしてみればLispは>>944で十分
0947デフォルトの名無しさん
2010/01/13(水) 20:57:36総称的にLispという時、それはむしろ「シンプルで深い」という方向のものだと思う。
0948デフォルトの名無しさん
2010/01/13(水) 21:19:59LISPやFORTHでなんかつくろうとは思わないけど、極めて合理的な処理原理には学ぶものはあるな。
一度は作ってみるべきものじゃないか?
0949デフォルトの名無しさん
2010/01/13(水) 21:22:590950デフォルトの名無しさん
2010/01/13(水) 21:23:430951デフォルトの名無しさん
2010/01/13(水) 22:04:38まて、その理論だと
猛者にはTuring Machineがあれば十分
って言っている様なものでは?
現実的には猛者だとしてもリアルTMだけだと・・・。
0952デフォルトの名無しさん
2010/01/13(水) 22:48:19ちょっと、意味がちがう
0953デフォルトの名無しさん
2010/01/13(水) 23:12:09絶対つかえねぇなw
0954デフォルトの名無しさん
2010/01/13(水) 23:18:190955デフォルトの名無しさん
2010/01/14(木) 00:30:00見聞きするのですが、それをC++の例で解説している
Webサイトはありませんでしょうか?
よろしくお願い申し上げます。
0956デフォルトの名無しさん
2010/01/14(木) 00:33:58http://www.amazon.co.jp/dp/4797311126
0957デフォルトの名無しさん
2010/01/14(木) 16:30:02戦闘処理部分だけを作ってるんですが、どうしてもうまくいきません……
具体的には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のオープンソース見ても複雑すぎて見当がつきません……どうかご教授願います。
0958デフォルトの名無しさん
2010/01/14(木) 16:38:24人物1-100人のバトルロワイヤルでいい。
そのほうが簡単。
flgがあって味方は選択しないようにする。
敵味方と分類すれば似た処理を二つ用意しなければならない。
0959デフォルトの名無しさん
2010/01/14(木) 18:35:53何が、どう、なぜうまくいかないのか分からない。
というかどうなってほしいのにどうなってしまうことをうまくいかないと
表現しているのかわからん。
0960デフォルトの名無しさん
2010/01/14(木) 19:12:08Buffer Touma;
Buffer Index;
Buffer Komoe;
Buffer Maika;
じゃなくて
Buffer[20000] Sisters;
にすればいいんじゃないか?
0961デフォルトの名無しさん
2010/01/14(木) 19:35:51だから「僕の望みと現実が違うんです」と書けば、それだけで現状のすべてが伝わると思ってる。
地球の片隅でひっそり生きてるお前の願望のディテールなんか、誰もわからんってのw
0962デフォルトの名無しさん
2010/01/14(木) 19:53:17「どうなってほしいのにどうなってしまうことをうまくいかないと
表現しているのかわからん。」
ってのはどうしようもない。
0963デフォルトの名無しさん
2010/01/14(木) 20:36:020964デフォルトの名無しさん
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を渡せば良いのか、という処理も見当がつかないのです
自分でも混乱して客観的把握ができないため、まだ不明瞭、説明不十分なところがあればもう少し日本語の勉強をしてから出直します…
0965デフォルトの名無しさん
2010/01/14(木) 21:40:530966デフォルトの名無しさん
2010/01/14(木) 21:45:19つーか何でもかんでもprivateにすればいいってもんでも無いベ
0967デフォルトの名無しさん
2010/01/14(木) 21:45:31それぞれスレッドで動かしておいて
シグナル来たらメインが動かす。
0968デフォルトの名無しさん
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をターゲットの識別に用いる。
0969デフォルトの名無しさん
2010/01/14(木) 22:21:260970デフォルトの名無しさん
2010/01/14(木) 23:00:26今はいいけど、それってあとあと困るんじゃね。
魔法とか、詠唱時間が+される仕様だったりすると。
あと、行動順にコマンド入力になるから、一般的なコマンド入力後の戦闘方式(FFようなリアルタイムバトルじゃないもの)と感じが変わっちゃうかと。
0971957 == 964
2010/01/14(木) 23:02:15敵のHPをpublicにするというのは盲点でした。言われた通りカプセル化に拘り過ぎていたかもしれません
戦闘参加中のプレイヤーと敵のオブジェクトを管理するクラスというのは戦闘処理クラスと違って、
「戦闘場所」だけを管理するクラスのことでしょうか。少し考えてみます
ポインタを使って、敵味方を混同した配列内のオブジェクト自身に固有な数値を持たせる、つまりポインタ配列みたいなもんですか
確かにそのようにするとソート後にコマンド選択を促すという方法も取れそうな気がします
自分自身がポインタ操作、参照など完全に把握し切れてないので少し勉強し直してきます…
あとATBは少し難しそうなので敬遠してました……TATBまだなんとかなりそうなんですが、
リアルタイムな処理というものがまだ実感できないんです
ご返答、重ね重ねお礼申し上げます
0972デフォルトの名無しさん
2010/01/14(木) 23:03:08UIの問題とアルゴリズムの問題は別個ですよ
0973デフォルトの名無しさん
2010/01/14(木) 23:12:18じゃなくて、見方全体を、敵全体をそれぞれ一元に管理するもの
>ポインタを使って、敵味方を混同した配列内のオブジェクト自身に固有な数値を持たせる、つまりポインタ配列みたいなもんですか
ごっちゃにするなよ。
「ポインタ」と「オブジェクト自身に固有な数値を持たせる」は別だぞ。
まぁポインタも固有な数値ではあるが。
リアルタイムバトルは・・・まだ早すぎる
0974デフォルトの名無しさん
2010/01/15(金) 00:00:29図を書いて整理した方がいいと思う
特に、PlayerとEnemyで違う部分は何か、共通な部分は何かといったところ
0975デフォルトの名無しさん
2010/01/15(金) 00:05:02ターゲットを選ぶ -> UIの問題
構造体のやりとりでなんとかなったのですが…(ry -> アルゴリズムの問題
ってことか。
確かに、C++の言語の知識だけでなく、現実的には設計の知識も要求されるな。
0976デフォルトの名無しさん
2010/01/15(金) 02:12:51ついでに素早さも入れとけば、Bufferを素早さでソートして昇順に処理するだけで済みそうだが。
0977デフォルトの名無しさん
2010/01/15(金) 03:01:17public: 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;
}
0978977
2010/01/15(金) 03:02:27のコンパイルが通りません。
何故でしょうか?
コンパイラは以下のものです。
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu8)
0979デフォルトの名無しさん
2010/01/15(金) 03:20:210980977
2010/01/15(金) 03:42:45shuffle.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;
}
0981デフォルトの名無しさん
2010/01/15(金) 03:49:48へぇ。要領を得ないエラーメッセージだねぇ。
たぶん、テンプレート実引数には外部リンケージを持つ型しか使えない、っていう制限に
ひっかかってるんだと思う。関数ローカルなやつはアウト。
0982977
2010/01/15(金) 04:21:43ありがとうございます。
「関数内クラスはテンプレートクラスには使えない」
というのを聞いたことがあるのを思いだしました。
ただ、>>980 に載せたコードのコンパイルが通る理由が分かりません。
同じ関数内定義ですが、MyRand::myrand( ) は外部リンケージ可能な関数になるのでしょうか?
0983デフォルトの名無しさん
2010/01/15(金) 04:51:51外部リンケージが必要なのはテンプレートの実引数であって、関数の実引数じゃない。
MyRand::myrand は外部リンケージを持たないけど、それを random_shuffle() に渡した
場合のテンプレート実引数となる型は単に int (*)(int) なので、リンケージの問題はない。
0985デフォルトの名無しさん
2010/01/15(金) 12:16:070986デフォルトの名無しさん
2010/01/15(金) 15:35:48const T &get_crt();
f(get_t());
f(get_crt()); // 違うfを呼び出す
関数の戻り値を受け取るfの定義を引数型が参照かどうかで区別したいのだが、
上記のようなオーバーロードをする方法はない?
0987デフォルトの名無しさん
2010/01/15(金) 15:43:450988デフォルトの名無しさん
2010/01/15(金) 17:42:340989デフォルトの名無しさん
2010/01/15(金) 17:56:47template <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);
見たいな感じでやろうとしたけど、だめだった
0990989
2010/01/15(金) 17:57:510991986
2010/01/15(金) 18:49:52f(get_crt()); // void f(const T&);
右辺値参照があればこんな感じで区別できるはずだけど
やっぱ今のところは無理か…
0992デフォルトの名無しさん
2010/01/15(金) 21:04:35C++相談室 part77
http://pc12.2ch.net/test/read.cgi/tech/1263556932/l50
0993デフォルトの名無しさん
2010/01/15(金) 22:09:450994デフォルトの名無しさん
2010/01/15(金) 22:40:340995デフォルトの名無しさん
2010/01/15(金) 22:48:370996デフォルトの名無しさん
2010/01/15(金) 22:51:550997デフォルトの名無しさん
2010/01/15(金) 23:12:280998デフォルトの名無しさん
2010/01/15(金) 23:24:210999デフォルトの名無しさん
2010/01/15(金) 23:25:511000デフォルトの名無しさん
2010/01/15(金) 23:27:2510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。