C++相談室 part91
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2011/09/13(火) 23:01:46.23ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part90
http://hibari.2ch.net/test/read.cgi/tech/1310885439/
このスレもよろしくね。
http://hibari.2ch.net/test/read.cgi/tech/1312621728/
ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg
0002デフォルトの名無しさん
2011/09/13(火) 23:02:34.03[C++ FAQ]
http://www.parashift.com/c++-faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[Stroustrup大聖人]
http://www2.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2011/09/13(火) 23:02:51.36[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004デフォルトの名無しさん
2011/09/13(火) 23:03:04.84amazon C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
http://www.amazon.co.jp/b/?node=754384
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/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
0005デフォルトの名無しさん
2011/09/13(火) 23:03:22.58Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
0006デフォルトの名無しさん
2011/09/14(水) 00:09:22.81> [C++ International Standard]
リンク先が ISO/IEC 14882:2003 になってるけど、現行規格 ISO/IEC 14882:2011 は
こっち。
http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
しばらくは両方載せといたほうがいいかもね。
0007デフォルトの名無しさん
2011/09/14(水) 00:44:41.380008デフォルトの名無しさん
2011/09/14(水) 00:49:30.960009デフォルトの名無しさん
2011/09/14(水) 16:21:31.90std::list<shared_ptr<IItem>> items;
itemsに登録されているItemインスタンスを、自身で登録から外すための方法ってどんなのがある?
Itemクラスまたはその派生クラスのサイズはできる限り押さえたいんだけど・・・
0010デフォルトの名無しさん
2011/09/14(水) 16:23:26.97IItem っていう記述があるけど、それは Item クラスのことです
0011デフォルトの名無しさん
2011/09/14(水) 16:26:28.63・itemsを広域にする
0012デフォルトの名無しさん
2011/09/14(水) 17:05:15.64その2つのうち、どちらかを選ぶとしたら
・itemsへの参照をもたせる
かなぁ
Itemフラグを持たせておいて、あるタイミングで立っていたら外側から削除、とか
Itemクラスのインスタンス関数の戻り値で、外側に削除して欲しいことを伝える、みたいな
使い道が限られる方法でも、何かあったら教えて欲しい
0013デフォルトの名無しさん
2011/09/14(水) 19:57:12.30std::list<weak_ptr<Item>> items;
にして、定期的にitemsを掃除するとか。
いや、どんな使い方するのか知らんけどさ。
0014デフォルトの名無しさん
2011/09/14(水) 21:30:05.01みっともなくて泥臭い方法でやるしか無い
0015デフォルトの名無しさん
2011/09/14(水) 21:40:40.67組み込み環境ならいざ知らず、
8バイトや4バイトぐらいケチケチすんなや。
00169
2011/09/15(木) 05:17:40.89リスト.begin() や イテレータ::operator ++ が呼ばれるタイミングでそのフラグを確認して、
1. exists == false であり、
1.1 イテレータが ::const_iterator に該当するものであれば、
次の exists == true の要素を返す
1.2 イテレータが ::iterator に該当するものであれば、
次の exists == true の要素を返し、そこまでの全ての要素(exists == false)を削除する
2. exists == true であれば
現在の要素を返す
Item クラスにはイテレータを渡すなどして、exists にアクセスする方法を用意しておく
・・・という構造にしてみようと思う
std::list<T, ...> が使用しているイテレータやノードを独自のものにする簡単な方法なんてありますか?
0017デフォルトの名無しさん
2011/09/15(木) 12:38:35.800019デフォルトの名無しさん
2011/09/18(日) 19:55:52.24簡単すぎず長すぎない
プログラム練習問題を出して下さい
0020デフォルトの名無しさん
2011/09/18(日) 19:56:39.160021デフォルトの名無しさん
2011/09/18(日) 20:28:46.75多倍長整数演算クラスでも作ってみな
演算子オーバーロードの良い練習になるぞ
0022デフォルトの名無しさん
2011/09/18(日) 20:36:20.53ベクトルクラスとか、簡単なコンテナクラスとか
まあクラスも万能ではないし、固執しすぎない程度にやればいいと思う。
0023デフォルトの名無しさん
2011/09/18(日) 21:09:54.09双方向リストを実装せよ
0024デフォルトの名無しさん
2011/09/18(日) 23:42:48.13スマートポインタ
0025デフォルトの名無しさん
2011/09/18(日) 23:45:37.97プログラムの実行時間を計測できるようなストップウォッチ機能
0026デフォルトの名無しさん
2011/09/18(日) 23:55:47.61引数解析機
これの実装を書いてみ。
PrintOption print( "message" ); //-pがコマンドラインに入力されるとmessageが表示される
FileWriteOption file_writer( "example.txt", "message" ); //-fがコマンドラインに入力されるとexample.txtにmessageが書き込まれる
std::map<std::string, Option*> options; //Optionは自作
//ここで入力されたpやfをキーにしてArgumentLexで解析。ArgumentLexはコマンドラインに-pや-fを見つけたら
//printやfile_writeからAcceptとか名前をつけた関数を呼び出し↑のコメントで書いたアクションを実行するようにさせる。
options["p"] = &print;
options["f"] = &file_writer;
ArgumentLex( argc, argv, &options );
0027デフォルトの名無しさん
2011/09/19(月) 00:11:13.57かなり長いこと悩んでるんですが…。
0028デフォルトの名無しさん
2011/09/19(月) 00:11:47.050029デフォルトの名無しさん
2011/09/19(月) 02:01:21.58みなさんレスありがとうございます
ですが、もっと低レベルなものを期待していたので
(ネコとかみかんとかが出てきそうな)
もっと勉強してから出直してきます
すみませんでした
0030デフォルトの名無しさん
2011/09/19(月) 02:42:25.72>>24の双方向リストは俺もおすすめだな
シンプルだしアルゴリズムとデータ構造の基本も分かって一石二鳥
一気に実力が伸びると思うので手が届きそうならぜひ
0031デフォルトの名無しさん
2011/09/19(月) 02:43:09.140032デフォルトの名無しさん
2011/09/19(月) 04:05:09.360033デフォルトの名無しさん
2011/09/19(月) 13:37:02.030034デフォルトの名無しさん
2011/09/19(月) 15:50:07.24設定データを管理するクラスcを使いたい場合
そういう設計ってあり、というか一般的ですか?
アリの場合、
クラスcは最初にインスタンス化されたときだけ
メモリ実体をアロケートするような小細工するのでしょうか?
0035デフォルトの名無しさん
2011/09/19(月) 15:51:27.410036デフォルトの名無しさん
2011/09/19(月) 16:16:01.78あり
"共有メモリ"かな
シングルトンとは違うぞw
0037デフォルトの名無しさん
2011/09/19(月) 16:17:56.640038デフォルトの名無しさん
2011/09/19(月) 16:26:06.14じょうしきてきにかんがえて
0039デフォルトの名無しさん
2011/09/19(月) 16:32:45.230040デフォルトの名無しさん
2011/09/19(月) 17:38:21.02参照する関数が数十以上になることを考えて頂戴
0041デフォルトの名無しさん
2011/09/19(月) 17:42:01.740042デフォルトの名無しさん
2011/09/19(月) 20:47:43.35設定ソース.引数に設定(設定先描画オブジェクト);
とした方が設定ソースだけがほかのオブジェクトに
依存するだけだからまし。
しかも設定情報の入れ子を押さえられるし、設定ソースの切り替えで、
レジストリからXMLの切り替えも簡単。
シングルトンだとすべてのクラスがシングルトンに
依存するから修正が大変。
エラー処理とか身動きがとれなくなる。
0043デフォルトの名無しさん
2011/09/19(月) 21:00:58.020044デフォルトの名無しさん
2011/09/19(月) 21:25:16.350045デフォルトの名無しさん
2011/09/19(月) 23:03:20.070046デフォルトの名無しさん
2011/09/19(月) 23:20:00.20それ事態がおかしいでしょ。
極端な話、設定値は決めうちでいい。
それを敢えて外に出してるんだから、
設定部分が処理オブジェクトに依存してると考えるのが自然。
処理するオブジェクトだって常に設定ファイルから
値を渡されなきゃならない義理は無いし他の
処理するオブジェクトから値を受け取ったっていい。
0047デフォルトの名無しさん
2011/09/19(月) 23:24:14.840048デフォルトの名無しさん
2011/09/19(月) 23:30:32.930049デフォルトの名無しさん
2011/09/19(月) 23:34:46.93>>46の樹脂とは関係ないけど一部決めうちなんて良くある話じゃない
Direct Xの引数全部の値を外部からとりこむなんて無いじゃん。
0050デフォルトの名無しさん
2011/09/19(月) 23:36:37.440051デフォルトの名無しさん
2011/09/19(月) 23:49:44.63設定はある程度外部に出すのは良くある話
0052デフォルトの名無しさん
2011/09/19(月) 23:59:26.33C++もしくはC++と相性の良い言語で
アニメーションを含むリッチなGUIを作成する方法について
おすすめがあれば教えていただきたい。
環境はWindowsのみ。
計算ロジックはVC++で開発中。
そこそこ複雑な画面になる予定。
QtはWindows標準と動作が異なる部分が多いので遠慮したい。
wxWidgetsやWTLでアニメーションはしんどそう。
WPFは理想に近いけどできればもっと軽くてランタイムのいらないものがいい。
妥協策でも教えて頂けると嬉しい。
0053デフォルトの名無しさん
2011/09/20(火) 00:01:47.911つしか存在しないのであれば static でもシングルトン、
複数存在するのであれば、C のインスタンスを作成→ポインタなりを A と B のインスタンスに渡すか、A と B のメンバ関数の呼び出しの際に、引数として C のインスタンスを渡すだけだろ
0054デフォルトの名無しさん
2011/09/20(火) 01:26:41.64なにかいい方法はありませんか?
0055デフォルトの名無しさん
2011/09/20(火) 01:27:49.00Qtがダメってことはtcl/tkやGTK+も同じ理由でダメってことだろうし、
OpenGLやDirectXに対応してるようなGUIエンジン( http://wiki.gamedev.net/index.php/Libraries#GUI )もWindows標準とはいえない。
ということは最初からWinAPIかMFCくらいしか選択肢ないようなきがす
0056デフォルトの名無しさん
2011/09/20(火) 01:28:44.78どちらも座標を返す共通の関数を持たせればいい。仮想関数とか。
0057デフォルトの名無しさん
2011/09/20(火) 01:50:09.40できそうな気がします
ありがとうございました
0058デフォルトの名無しさん
2011/09/20(火) 07:46:58.24そうか・・・
サンクス
0059デフォルトの名無しさん
2011/09/20(火) 08:37:24.36設定データというのは例えばシステムのiniファイルだったり
具体的なリソースとしては唯一のものです。
その前提で、aとbにcのインスタンスを生成させるべきかどうか、
という所からの質問と捉えていただけると助かります。
0060デフォルトの名無しさん
2011/09/20(火) 10:10:41.00極端な話…。
0061デフォルトの名無しさん
2011/09/20(火) 10:20:40.58とかっていう言い回しは通じないんだろうよ。
0062デフォルトの名無しさん
2011/09/20(火) 11:44:30.57この人の作ってるライブラリ
http://p-stade.sourceforge.net/
が非常に便利で使いたいなと思うのですが
更新が2008年で止まってるみたいです
ひょっとして他のboostと整合性とれなくなってるんじゃないかと不安なんですが
使ってる人は割といるライブラリなのでしょうか
006362
2011/09/20(火) 11:50:55.77Oven/Egg総合スレ part1
http://hibari.2ch.net/test/read.cgi/tech/1231080841/
やぱりみんな使ってるのね
0064デフォルトの名無しさん
2011/09/20(火) 17:24:25.920065デフォルトの名無しさん
2011/09/20(火) 17:47:52.39コンパイラはMinGWです。
ファイルオープン時に、ポインタを末尾に移動させて書き込みたいのですが、出来ずにいます。
フラグが"app"だと移動して出力しますが、"ate"だと先頭から上書きされます。
seekp関数で seekp(0, std::ios::end) と書いても駄目でした。
以下がソースです。
#include <fstream>
int main(int argc,char *argv[])
{
std::ofstream Fout("test.txt", std::ios::out | std::ios::ate);
Fout << "test" << std::endl;
Fout.close();
return 0;
}
0066デフォルトの名無しさん
2011/09/20(火) 17:55:38.25ios::ateの意味は単に「ファイルを開いた時にファイルポインタをファイルの最後に
シークするだけだから、ios::appとOR取らないとだめでしょ
std::ofstream Fout("test.txt", std::ios::out | std::ios::ate | std::ios::app);
いやateは不要かもしれんな
0067デフォルトの名無しさん
2011/09/20(火) 17:57:23.79in
out
out | trunc
out | app
in | out
in | out | trunc
これ以外のフラグの組み合わせは許可されていない
0068デフォルトの名無しさん
2011/09/20(火) 18:01:15.84C++最初に考えた奴はそうとうひねくれてるんだろうな
誰だかしらねーけど多分融通きかない頭硬そうなやつだから禿げてるよ
0069デフォルトの名無しさん
2011/09/20(火) 18:04:38.78規格表にそう書いてあるもん
0070デフォルトの名無しさん
2011/09/20(火) 18:07:04.60in "r"
out "w"
out | trunc "w"
out | app "a"
in | out "r+"
in | out | trunc "w+"
ateは補助的なフラグでオープン直後にファイルの最後にシークするだけで
主な動作は上の組み合わせで決まる
0071デフォルトの名無しさん
2011/09/20(火) 18:09:37.87in | out | app かな?よくわからん
0072デフォルトの名無しさん
2011/09/20(火) 18:13:50.97正解
結局ateの動作が問題になるだけ
appでオープンすると書き込み時は常にファイルエンドにシークするが
ateでオープンすると任意の場所から書き込み可能
0073デフォルトの名無しさん
2011/09/20(火) 18:18:21.99可変テンプレートがVisualStudioで使えないから
代用品探してるんだけど
これに変わるものがみつからない
boost::anyみたいにパーフォーマンスに影響あるのかソース見ないとわからないから
そこも不安だ
0074デフォルトの名無しさん
2011/09/20(火) 18:50:18.83CとC++のオープンモードの対比がわかりやすすぎて泣けました。
0075デフォルトの名無しさん
2011/09/20(火) 20:10:33.85特殊化とデフォルトテンプレート引数駆使すれば相応のものができる。
ただし、16個までとか32個までとか上限を決める必用が有るけどね。
16も有れば普通は十分。
0076デフォルトの名無しさん
2011/09/20(火) 21:03:59.37開始後1年後ぐらいにハスケル始めるん?
0077デフォルトの名無しさん
2011/09/21(水) 06:21:40.47class typedef_smart_ptr_to { // ←これ
public:
typedef boost::shared_ptr<T> shared_ptr;
typedef boost::weak_ptr<T> weak_ptr;
typedef boost::scoped_ptr<T> scoped_ptr;
};
class Hoge : public typedef_smart_ptr_to<Hoge>
{
public:
Hoge() {}
void SetNext(const shared_ptr & pNext) { this->pNext = pNext; }
shared_ptr GetNext() const { return this->pNext; }
private:
shared_ptr pNext;
};
typedef_smart_ptr_to は自身を継承したクラスへの typedef を集めたクラスです
Q1. クラステンプレートをこんな風に使って大丈夫ですか?
Q2. これを継承したクラス(例では Hoge)にデメリットはありますか?
0078デフォルトの名無しさん
2011/09/21(水) 10:34:46.86大丈夫かというのなら心配している点を言って欲しいな。
デメリットを考えるのなら比較対照を示して欲しいな。
とりあえず、継承を使うと POD にならないとか、 Hoge も template だったり
すると途端に面倒になるとか、 scoped_ptr しか要らないところでも他のやつの
#include が必要になるとか、そんなのが思いつくけど。
0079デフォルトの名無しさん
2011/09/21(水) 10:53:27.01リスト作りたいならlistとかに任せたらいいのではと思うんだけども。
008077
2011/09/21(水) 11:28:49.08しいて言えば、この継承によって
1. Hoge インスタンスのサイズが増えないか
2. Hoge インスタンスの作成(コンストラクタの呼び出し)が遅くならないか
3. Hoge インスタンスの破棄(デストラクタ(ry
ここら辺です
自分の知識ではこれらのデメリットは発生しないと思いましたが、念のためです
>>79
話題の中心は typedef_smart_ptr_to ←これです
Hogeクラスの構造はこのクラステンプレート(で定義されている typedef)の使用例として書いただけです
0081デフォルトの名無しさん
2011/09/21(水) 12:02:15.69効率は実測が基本。
ここで問題ないという答えが返ってきたところで、あなたの使っている環境や
作っているものについて問題にならないとは限らない。
0082デフォルトの名無しさん
2011/09/21(水) 12:31:46.23思いっきり内部に取り込んでる設計は好ましくない
008377
2011/09/21(水) 16:09:09.21「一般的にどうであるか」を尋ねています。
>>82
「typedef boost::shared_ptr<T> shared_ptr;」などを Hoge クラス内で宣言するべきではないということでしょうか
クラス外で「typedef boost::shared_ptr<Hoge> HogePtr;」を宣言するのは問題ありませんか?
0084デフォルトの名無しさん
2011/09/21(水) 16:15:08.870085デフォルトの名無しさん
2011/09/21(水) 16:35:07.08A1. 大丈夫
A2. デメリットはない
けど外部に委ねられるものをインターフェースとして内包する……という設計には疑問を感じる
>>83
そうだね
それで代替できるのならそうしたほうがいい
0086デフォルトの名無しさん
2011/09/21(水) 17:04:57.49わざわざ継承している理由がいちいち子クラスで
typedefするのがめんどい程度しか感じられない。
008777
2011/09/21(水) 17:19:13.27回答ありがとうございます
しかしtypedefのためにクラステンプレートを使うのはマズのか・・・
他の方のレスと合わせて、ちょっと使用は控えようかと思います
>>86
まさに「typedefがめんどくさい」から考えた構造です
0088デフォルトの名無しさん
2011/09/21(水) 19:17:09.85QZは低脳なのでC++はやらないのでは?
0089デフォルトの名無しさん
2011/09/21(水) 21:24:59.29しかし一々typedefするのが深刻なほど問題になるような状況は考えにくいな。
子クラスがものすごく単純な構成ばかりで、typedefが総行数の半分以上とかになるようなら
使ってもいいって所。
0090デフォルトの名無しさん
2011/09/21(水) 21:34:02.690091デフォルトの名無しさん
2011/09/21(水) 21:36:36.09アホ?
81 は「一般論など意味がない」と答えているのに
それが水掛け論で答えが変わったら何か得られるとでも思ってるんだろ
ああ、効率いいよ
これでご満足か?
# ごね得を拾う生き方の人は自然科学が相手じゃない道を選んだ方がいい
0092デフォルトの名無しさん
2011/09/21(水) 22:21:48.250093デフォルトの名無しさん
2011/09/21(水) 22:33:45.23Hogeの中だけで使うスマポとしてtypedefするならいいと思うよ
でもHogeのポインタを扱うときにはこのスマポを使ってね、という意味で公開typedefを用意するのは良い設計とは思えない(たまにこういうことをする人がいるから指摘した)
009477
2011/09/21(水) 23:21:25.43>Hogeのポインタを扱うときにはこのスマポを使ってね、という意味で公開typedefを用意する
まさにこれをやろうとしていました
クラス外であれば使う都度、typedefを使わず宣言した方が良さそうですね
0095デフォルトの名無しさん
2011/09/21(水) 23:29:10.23長いプログラム書くときどういった手順で作成してる?
俺の場合main関数に大体の流れを書く→クラス、関数を作る→
不備があればmain関数を弄る→エンドレスって感じなんだが、
どうも、しっくりこない。何かいい方法ある?
0096デフォルトの名無しさん
2011/09/21(水) 23:41:22.05最初から全部は考えない。部分目標を作ってちまちま継ぎ足していく。
まずはウィンドウを表示する、とか。ランキングデータを取得して表示してみる、とか。
必要と思った関数、クラスはそのつど作成する。
その過程でリファクタリングしたりもする。
2,3回は全部投げ捨てて最初から作り直したくなる衝動にかられる。
そして完成する前に飽きてエター。
0097デフォルトの名無しさん
2011/09/21(水) 23:50:46.61どうやって設計するかは本で勉強してください
設計が終わればあとはそのとおりにコードを書くだけ
0098デフォルトの名無しさん
2011/09/21(水) 23:58:26.630099デフォルトの名無しさん
2011/09/22(木) 00:54:13.34既存の枯れたコードやアルゴリズムを使って、その長いプログラムを短くすることを考える。
0100デフォルトの名無しさん
2011/09/22(木) 01:54:15.81同時に、曖昧な手続きはmainにテストコードを書いて確認する。
あ、これでいいんじゃね?となったら書き始める。
0101デフォルトの名無しさん
2011/09/22(木) 03:48:59.77コマンドラインアプリのようなひとつの仕事をして終了するタイプや、GUIアプリのような
恒常性のあるタイプといった類型があるので、それぞれのタイプに沿った設計手法をとる。
大まかに全体像を把握したらそれを関数やクラス構造に落とし込んでいく。
0102デフォルトの名無しさん
2011/09/22(木) 07:35:44.970103デフォルトの名無しさん
2011/09/22(木) 10:28:28.350104デフォルトの名無しさん
2011/09/22(木) 11:18:14.86スレタイ検索するとか↓とか。
http://hibari.2ch.net/test/read.cgi/tech/1312926165/
0105デフォルトの名無しさん
2011/09/23(金) 03:20:58.69void* ってかっこよく型を戻すことできないの?
getType()を仮想関数にして、判別しているんだがもっといい設計がある気がする。
http://codepad.org/SOTom56e
こんなこと出来ないの?
void *p = hoge.getUserPointer();
static_cast<typename getType(p)>(p);
0106デフォルトの名無しさん
2011/09/23(金) 05:35:54.97型情報を別途持つ特殊なポインタクラスを造れば実現できるけど、それは既にvoid *じゃないね。
つーか、型情報を持たないvoid *を例えば関数の引き数として受け取ってどうやって元の型を知るのかと。
0107デフォルトの名無しさん
2011/09/23(金) 07:56:18.61ついでに言えば仮想関数で呼び出せばRTTIもいらない。
0108デフォルトの名無しさん
2011/09/23(金) 08:18:39.790109デフォルトの名無しさん
2011/09/23(金) 08:59:03.90privateで継承した場合って、派生クラスでも基底クラスのメンバにはアクセス不可能なんですよね?
ではこのprivateで継承することって何か意味あるんですか?
0110デフォルトの名無しさん
2011/09/23(金) 10:39:30.88↓に詳しく書いてあったよ。アクセスできるって
http://www.geocities.jp/ky_webid/cpp/language/032.html
0111デフォルトの名無しさん
2011/09/23(金) 10:39:35.96例えばboost::noncopyable
private継承することでコピーコンストラクタと代入演算子を無効化できる。
ただ
private部分の親クラスの動作を変えたい、
とかは親がそう設計されていなければやはり無理。
親を修正するしかない。
この点においてオブジェクト指向の限界というか、
柔軟性の無い点だとも感じるがなぁ
0112111
2011/09/23(金) 10:41:16.280113デフォルトの名無しさん
2011/09/23(金) 10:43:57.280114デフォルトの名無しさん
2011/09/23(金) 10:46:56.15派生クラスからは、privateで継承したとしても、基底クラスのprotectedやpublicのメンバにはアクセスできるんですね。
皆さんありがとうございました。
0115デフォルトの名無しさん
2011/09/23(金) 10:54:37.930116デフォルトの名無しさん
2011/09/23(金) 11:00:39.570117デフォルトの名無しさん
2011/09/23(金) 11:01:01.65まぁいいか
0118デフォルトの名無しさん
2011/09/23(金) 11:21:15.12私が何か勘違いしているのなら教えて欲しいです
0119デフォルトの名無しさん
2011/09/23(金) 11:30:55.86というか一回Baseにキャストしておkという設定だったらmewとhawlを抽象化するのが普通だろう
struct Base { virtual void make_sound(void) const = 0; /* (ry */ } ;
void Cat::make_sound(void) const { mew(); }
void Dog::make_sound(void) const { hawl(); }
void func(void * p) { static_cast<Base *>(p)->make_sound(); }
int main(void) {
Cat * p = new Cat;
func(p);
delete p;
return 0;
}
0120デフォルトの名無しさん
2011/09/23(金) 14:26:52.04>つーか、型情報を持たないvoid *を例えば関数の引き数として受け取ってどうやって元の型を知るのかと。
すいません。書き方悪かったです。templateからうまくやりたかったんですが…
こんな感じかな
templateClass<voidPtr>::type voidPtr;
自分でもよくわかりませんww というかvoid*を渡してどうする気なの自分。
virtualな typedef をしたいんだと思います。
初期案はこんな感じでしたが、書けませんでした。http://codepad.org/tMVtOiyZ
>>119
仮想関数で処理するのが一般的だと思いましたが、bulletのコールバック関数内で型別に処理したほうがいい場合があるかなと感じたんで、とりあえずあんな感じにしときました。
最終的には IActor みたいなクラス作って、仮想関数で処理すると思います。
>>109
protectedだけど
http://codepad.org/s7Vlq2BL
0121デフォルトの名無しさん
2011/09/23(金) 14:35:10.60要はvirtualじゃないデストラクタのクラスを委譲しようとしたときに便利なことがある。
ぶっちゃけ、理解する必要はない
0122デフォルトの名無しさん
2011/09/24(土) 02:45:28.62どんな型でもセットできるdataクラスをつくり、それをvectorに入れようと思ったのですがうまくいきません。
std::vector<data<T> > foo;でコンパイルエラーになります。
こういうことは出来ないのでしょうか?
template<typename T>
class data{
public:
data(const T &value){this->value = value;}
T value;
};
int main(void){
data<int> d1 = 1;
data<float> d2 = 1.2;
std::vector<data<T> > foo;
foo.push_back(d1);
foo.push_back(d2);
}
0123デフォルトの名無しさん
2011/09/24(土) 02:57:13.84data<int> と data<float> は違う型なので、それらをまとめてひとつの型とすることはできない。
どんな型でもまとめて格納できる配列が欲しいのなら、 boost::any の配列を使うといいかもしれない。
0124デフォルトの名無しさん
2011/09/24(土) 02:57:29.800125デフォルトの名無しさん
2011/09/24(土) 02:58:15.75ありがとうございます。
やっぱ、無理ですよね…
0126デフォルトの名無しさん
2011/09/24(土) 06:11:07.93で、やってみたら取り出す時に面倒だしたいして便利でもないことに気づくんだが
なぜかしばらくするとそのことを忘れる
0127デフォルトの名無しさん
2011/09/24(土) 08:18:42.860128デフォルトの名無しさん
2011/09/24(土) 09:19:31.320129デフォルトの名無しさん
2011/09/24(土) 13:38:23.67data* data_child1 = new child_data1();
data* data_child2 = new child_data2();
とかしてdata_child1とdata_child2をコンテナに突っ込んどいて
get_data()したら個々のサブクラスのデータが取り出せるとかいう話じゃなくて?
0130デフォルトの名無しさん
2011/09/24(土) 15:45:30.950131デフォルトの名無しさん
2011/09/24(土) 17:05:20.000132デフォルトの名無しさん
2011/09/24(土) 17:23:24.88嫌な思い出でもあるのか
0133デフォルトの名無しさん
2011/09/24(土) 17:37:58.540134デフォルトの名無しさん
2011/09/24(土) 19:10:13.05ゲロゲロなコードを書くやつ奴がバカなのか、
それとも覚えられない奴がバカなのか教えて下さい。
0135デフォルトの名無しさん
2011/09/24(土) 19:27:10.51それは C++ に限った問題じゃないだろ
ioccc の中の人はバカだと思うか?
あれが読めないとバカか?
// ioc++cc は今できないだろうな
0136デフォルトの名無しさん
2011/09/24(土) 19:44:22.95非同期ならパイプやOSのキュー使うし、
同期なら必要ないし、いったいどういう用途を想定してんだろ
0137デフォルトの名無しさん
2011/09/24(土) 19:49:06.65気になっているのは、cとc++の間にある大きな隔たりだよ。
STLや例外処理なんて本当に必要だったのか?
綺麗なcのコードを読んだ後に、ゲロゲロとした自分のc++のコードを見ると
もはやc++の存在自体が邪悪に見えてくるんだよ
0138デフォルトの名無しさん
2011/09/24(土) 20:05:56.94なんで自分のせいだと思わないの?
0139デフォルトの名無しさん
2011/09/24(土) 20:08:47.010140デフォルトの名無しさん
2011/09/24(土) 20:12:47.700141デフォルトの名無しさん
2011/09/24(土) 20:13:31.28なんでCで満足してるやつがC++使ったらゲロゲロなコードになるんだ?
ほとんど同じコードで同じ動作するのに。
0142デフォルトの名無しさん
2011/09/24(土) 20:38:15.05STL は中途半端がいやなだけでそれ自体が消えて欲しいわけではない
0143デフォルトの名無しさん
2011/09/24(土) 20:42:23.22Cだって標準で用意されてるからってgets使うやつはいないでしょ
例外とRTTIは規約で禁止してるとこも多いんじゃないかな?
0144デフォルトの名無しさん
2011/09/24(土) 21:05:15.21俺は使わんけど実行時型情報の何がだめなのか解らん。
構造体情報を短期的に保存するなら実行時型情報便利じゃん。
短期保存用途にも関わらずわざわざ同じ仕組みを用意するのは無駄。
0145デフォルトの名無しさん
2011/09/24(土) 22:13:39.16というか、こちらの方が便利さよりも混乱をもたらすように思うが。
0146デフォルトの名無しさん
2011/09/24(土) 22:38:44.220147デフォルトの名無しさん
2011/09/24(土) 22:52:01.32結局エラー処理のないコードが綺麗に見えてるだけ。そりゃそうだろうよ
もちろん大半がそうってだけでちゃんと書いてるやつもいるけど
0148デフォルトの名無しさん
2011/09/24(土) 23:06:17.49単にインターフェースが制限されたdequeだと思えばいいよ
0149デフォルトの名無しさん
2011/09/24(土) 23:15:20.48例外みたいに 「try でくくることでどこで例外が起きても大丈夫!」 のメリットが分からない。
1つ1つ例外で括ってたら行数食うし、else 文も書けないし…。
try func_start();
catch (ExceptionA e) error_func_A();
catch (ExceptionB e) error_func_B();
nocatch {
// 続きの処理
finaly func_end();
}
みたいに書けないかなぁ。もちろん try 文の中で宣言した変数は nocatch 内でも使いたい。
0150デフォルトの名無しさん
2011/09/24(土) 23:15:49.330151デフォルトの名無しさん
2011/09/24(土) 23:18:11.73戻り値とは別にエラーを返せるのはありがたいし。
ただ、try 文でスコープを完結させるのはマジ勘弁
0152デフォルトの名無しさん
2011/09/24(土) 23:40:47.74便利というだけで言語がサポートすべきなら GC もそうなんだが
だったら C++ 自体がいらない子
0153デフォルトの名無しさん
2011/09/24(土) 23:45:50.29場合によりけりかなぁ
例えばprintfはエラーを返すけどその中のどこでエラーが起きたか……なんて気にしないでしょ。標準ライブラリでなくてもPOSIXやWin32でも。
どこで起きたかって情報を完全に不要にするのは難しいしそれが必要になることもあるけど、その情報が頻繁に必要になるのは関数が持つエラー通知のインターフェースの作りがよくないんだと思うよ
これはエラー処理にC++の例外を使用するかは関係ない
0154デフォルトの名無しさん
2011/09/25(日) 00:02:00.17どこで起きたかの情報を保持する例外投げればいいんじゃない?あなたはあほなの?
0155デフォルトの名無しさん
2011/09/25(日) 00:12:43.34組み込みやゲームとか処理がタイトなものならともかく、
普通使うだろ
0156デフォルトの名無しさん
2011/09/25(日) 00:25:38.820157デフォルトの名無しさん
2011/09/25(日) 00:28:49.56主張は理解できるが
GCが便利かといわれるとちょっとどうかなw
RTTIはテストやデバッグ実行時のときは便利だよね
それ以外ではコンパイラでoffにしてる
エラー発生位置もそうだけどRTTIつかいまくりの設計もどうにかしたほうがいいと思うぞ
便利なのはわかるけど普通不要だから
0158デフォルトの名無しさん
2011/09/25(日) 00:30:25.67if文の羅列とかもうやめたい
0159デフォルトの名無しさん
2011/09/25(日) 00:30:29.41サイズが増える
0160デフォルトの名無しさん
2011/09/25(日) 00:51:58.21組み込みの現場ぐらいでしか問題にならんだろ
0161デフォルトの名無しさん
2011/09/25(日) 00:55:55.89dynamic_castってRTTI使ってたっけ?
仮想関数テーブルで判定してるだけじゃない?
0162デフォルトの名無しさん
2011/09/25(日) 01:00:48.71使ってる
0163デフォルトの名無しさん
2011/09/25(日) 05:28:10.30結構複雑
0164デフォルトの名無しさん
2011/09/25(日) 08:33:42.66class IDrinkable {};
class IEquipment : public IItem {};
class Weapon : public IEquipment {};
class Armor : public IEquipment {};
class Potion : public IItem, public IDrinkable {};
std::list<shared_ptr<IItem>> items;
コンテナにつっ込まれた要素の、元の型を知りたい時に、IItem クラスは何を用意することがベストだろうか
1. 何も用意しない。dynamic_cast を使用する
2. virtual ItemType GetType() = 0
enum ItemType {
ItemType_Weapon, // Weapon クラスはこれを返す。
ItemType_Armor, // Armor クラスはこれを返す。
...
}
3. virtual Weapon * CastToWeapon() { return NULL; }
Weapon クラスはオーバーライドして、this を返す。
他の派生したクラスへキャストする関数も用意する。
4. その他
0165デフォルトの名無しさん
2011/09/25(日) 09:17:58.62そういう風に基底クラスのインタフェースを定義する。
0166デフォルトの名無しさん
2011/09/25(日) 09:46:25.09じゃないと何の為に派生してるのやら分からん
ただ、AにBの派生クラスを登録して、
Aの派生クラスからBの派生クラスを使う、
というような場合にはdynamic_castもやむを得ない場合もある
0167デフォルトの名無しさん
2011/09/25(日) 13:09:59.73メモリリーク周りのバグだけ残して、期限までに納品とかできるのにな
バックログは後々で修正してさ
0168デフォルトの名無しさん
2011/09/25(日) 15:59:41.980169デフォルトの名無しさん
2011/09/25(日) 16:08:32.660170デフォルトの名無しさん
2011/09/25(日) 18:53:08.88させる奴は殺害もの
0171デフォルトの名無しさん
2011/09/25(日) 19:02:43.66なんのために抽象化したリストに突っ込むかによるだろ。
ダウンキャスト的な動作が必要なら、少々とこばっても最初から
元の型を保持したリストを別途用意しとくほうがマシ。
そもそも抽象化したリストに投入する事は、元の型を捨てるという意味だから。
std::list<shared_ptr<Weapon>> weapons;
std::list<shared_ptr<Armor>> armors;
std::list<shared_ptr<IItem>> items;
Weapon weapon;
weapons.push_back(&weapon);
items.push_back(&weapon);
0172デフォルトの名無しさん
2011/09/25(日) 21:20:11.60無視してそのままアプリ実行したらまずいのかな
0173デフォルトの名無しさん
2011/09/25(日) 21:27:11.82flush()で失敗したら、書き出し先ドライブを変えるとかユーザーにリカバリーを選択させる。
closeで失敗したら、失敗したよってユーザーに通知することぐらいしかできないだろ。
あとは、ダンプを作成してどっかに吐き出しとくことぐらいか。
0174デフォルトの名無しさん
2011/09/25(日) 21:30:15.27そうはいってもメモリ管理はミスる時にはミスります。malloc()/free() となんらかわりません。
0175デフォルトの名無しさん
2011/09/25(日) 21:31:07.40フラッシュで失敗したばあいはいくらでも復旧可能
フラッシュで成功したばあいは直後のクローズで失敗しても特に実害は無いのでご自由に
というかんじか
フラッシュの使い道初めて知ったよとんくす
0176デフォルトの名無しさん
2011/09/25(日) 21:32:57.13そもそもコンストラクターでオブジェクトの作成なんてする必要があるか疑問だが。
配列を確保するならまだしもね。
0177デフォルトの名無しさん
2011/09/25(日) 22:00:40.25何が言いたいのかさっぱりわからない。
コンストラクタでオブジェクト作成しなかったら何するの?って感じなんだけど。
0178デフォルトの名無しさん
2011/09/25(日) 22:06:43.41基本的にはメンバー変数に実体を置くか、
外部のオブジェクトを参照するだけで十分な筈。
メモリー操作が必要となるのは、配列かAPIのリソースぐらいじゃん。
0179デフォルトの名無しさん
2011/09/25(日) 22:09:55.79新たに別のファイルを開き直して、もう一回出力とか。
0180デフォルトの名無しさん
2011/09/25(日) 23:02:56.12お前がそう思うんならそうなんだろう、お前ん中ではな(AA略
0181デフォルトの名無しさん
2011/09/25(日) 23:10:29.50もしかして誤字ではなく本気で open と言っているのか?
0182デフォルトの名無しさん
2011/09/25(日) 23:12:39.10まさか、クラスのメンバーにfstreamのポインター置いて、
クラス内で new と delete を繰り返してるとか?
それともfunctionクラスみたいに型をカプセル化する
オブジェクトを内包しててnewで生成してるとか?
前者は作りを見直すべきだし、後者は滅多に
つくるようなもんじゃないよな。
0183デフォルトの名無しさん
2011/09/25(日) 23:13:42.92誤爆か?
0184デフォルトの名無しさん
2011/09/25(日) 23:19:33.790185デフォルトの名無しさん
2011/09/25(日) 23:29:25.53「RAII の徹底が不十分な場合、コンストラクタの途中で例外が出てメモリリークする
ことがある」
ということを言いたかったんだと思うんだけど、合ってるかな?
0186デフォルトの名無しさん
2011/09/25(日) 23:37:28.34例外が発生すればメモリーリークになるわけじゃないけど、
ちゃんと例外発生時の例外処理を書いてないとメモリーリークになる。
RAIIはどうでもいいけど。いくら例外処理で対処できるとはいえ、
NULL初期化とかが必要になるコンストラクターのメモリ操作自体は減らすべき。
0187デフォルトの名無しさん
2011/09/25(日) 23:38:19.030188デフォルトの名無しさん
2011/09/25(日) 23:43:33.52class Type
{
Example *a,*b,*c;
public:
Type():a(0),b(0),c(0)
try
{
a = new Example();
b = new Example();
c = new Example();
}
catch(...)
{
delete a;
delete b;
delete c;
}
};
0189デフォルトの名無しさん
2011/09/25(日) 23:57:53.460190デフォルトの名無しさん
2011/09/25(日) 23:57:56.140191デフォルトの名無しさん
2011/09/25(日) 23:58:15.750192デフォルトの名無しさん
2011/09/26(月) 00:05:40.59なんでその文脈でRAIIを選択肢から外すんだよw
0193デフォルトの名無しさん
2011/09/26(月) 00:07:47.940194デフォルトの名無しさん
2011/09/26(月) 00:08:00.12その catch の中の a,b,c へのアクセスはすべて未定義動作。ミスとか関係ない。
0195デフォルトの名無しさん
2011/09/26(月) 00:10:11.320196デフォルトの名無しさん
2011/09/26(月) 00:13:14.36なんで未定義になるんだ?
0197デフォルトの名無しさん
2011/09/26(月) 00:13:43.22実体で割り当てたんじゃ要求を満たせないときに new するに決まってんだろ。
メンバの寿命とクラスの寿命がずれてるとか、途中で具象クラスを入れ替えるとか、
考えれば出てきそうなもんだ。
0198デフォルトの名無しさん
2011/09/26(月) 00:15:34.48え?
0199デフォルトの名無しさん
2011/09/26(月) 00:16:00.87http://blogs.wankuma.com/episteme/archive/2011/02/20/197105.aspx#197169
15.3 p10 でそう決められているから、らしい。
そんなのコンパイルエラーにしろよとは思う。
0200デフォルトの名無しさん
2011/09/26(月) 00:17:19.68メンバー割り当てるヤツがいるから書いたんだよ。
pimpとかは大事だけど、単にリソース開閉のためだけにメモリ操作するなんて無駄じゃん。
0201デフォルトの名無しさん
2011/09/26(月) 00:20:37.49そこ見ても解るけど問題起きるのは規格に準拠してないコンパイラだけでしょ。
0202デフォルトの名無しさん
2011/09/26(月) 00:21:09.41ああ >>188 よく見たら function try block になってる(?)のか。
コンストラクタ本体の中で try ... catch するぶんには問題ないよね。
0203デフォルトの名無しさん
2011/09/26(月) 00:23:20.69そこから「コンストラクタでnew」まで攻撃対象を辺に拡大するから話がおかしくなってる。
ふつうにその無駄を叩けよ。
0204デフォルトの名無しさん
2011/09/26(月) 00:27:23.900205デフォルトの名無しさん
2011/09/26(月) 00:28:21.20そうだけど、188が function try block のつもりじゃないとしたら、 throw; が抜けてる。
0206デフォルトの名無しさん
2011/09/26(月) 00:29:13.71これは : がないからfunction-try-blockじゃなくて普通にコンストラクタ内部のtryブロックだろ
{}を書き忘れただけじゃねーかな
0207デフォルトの名無しさん
2011/09/26(月) 00:29:31.45どこにそんなこと書いてあるの?
0208デフォルトの名無しさん
2011/09/26(月) 07:06:32.240209デフォルトの名無しさん
2011/09/26(月) 07:28:53.09メンバー関数が初期化された状態で、
例外処理に入るとは限らない。
的な事じゃ無いんだろうか。
0210デフォルトの名無しさん
2011/09/26(月) 12:33:45.410211デフォルトの名無しさん
2011/09/26(月) 13:24:29.55コンストラクタでfunction-try-blockを使ってるなら
function-try-block中で例外が発生した時点で構築済みの基底クラスやメンバ変数は破棄されて無効なオブジェクトになるので
その後のcatch節の中ではアクセスしてはいけない、ってこと。
ttp://codepad.org/6zad5CVy
0212デフォルトの名無しさん
2011/09/26(月) 14:12:37.120213デフォルトの名無しさん
2011/09/26(月) 15:14:06.620214デフォルトの名無しさん
2011/09/26(月) 21:18:22.73引数はどうなんの?やっぱり未定義かえ?
0215デフォルトの名無しさん
2011/09/26(月) 22:15:43.84class a{
operator a(); // これ作れちゃうんだ
};
0216デフォルトの名無しさん
2011/09/26(月) 22:30:59.94プールを渡してやったらファーストフィットやらベストフィットやらを
サクッと構築できるライブラリとかないかな。
0217デフォルトの名無しさん
2011/09/27(火) 00:07:08.50引数の寿命はfunction-try-blockのハンドラを抜けるまで延長される。だから引数にはアクセスできる。
ttp://codepad.org/0wwV4V4w
0218デフォルトの名無しさん
2011/09/27(火) 01:01:19.970219デフォルトの名無しさん
2011/09/27(火) 01:02:49.390220デフォルトの名無しさん
2011/09/27(火) 07:13:06.38規格上はやっぱりセーフなんだ。良かった。
0221デフォルトの名無しさん
2011/09/27(火) 07:36:18.86aにキャストしても呼ばれないし、
aの派生クラスbを作ってaに代入やキャストしても呼ばれないし、
operator aを直接呼ばないと呼ばれないっぽ
環境依存かもしれないけど
使い道はなさげ
0222デフォルトの名無しさん
2011/09/27(火) 08:19:27.190223デフォルトの名無しさん
2011/09/27(火) 09:24:53.290224デフォルトの名無しさん
2011/09/27(火) 09:48:59.65> 使わない方がいいという意見
どこ見たの?
0225デフォルトの名無しさん
2011/09/27(火) 11:42:28.770226デフォルトの名無しさん
2011/09/27(火) 12:17:30.45便利だし
0227デフォルトの名無しさん
2011/09/27(火) 13:01:40.640228デフォルトの名無しさん
2011/09/27(火) 13:06:09.17試しにググって見たら、「C++ 例外 使わない」 で12,400件でたぞ。意外と多い。w
おれは、半々だな、使う部分と使わない部分がある。
0229デフォルトの名無しさん
2011/09/27(火) 13:20:16.77構造としてのヒープじゃなくて領域としてのヒープか?
ファーストフィットだけならsimple segregated storageってのがあるからそれを実装したライブラリで領域を外から与えられるやつ探せばいいと思うよ
一応boostにもあるけど領域を外から与えられるかどうかはわからん
データ構造のほうならstd::make_heapで
0230デフォルトの名無しさん
2011/09/27(火) 18:50:38.32それを達成するには例外を利用する標準ライブラリを
例外の出ないタイプのものに置き換える必要があるから
正直そこまでやるのもどうかと思う
0231デフォルトの名無しさん
2011/09/27(火) 19:05:00.980232デフォルトの名無しさん
2011/09/27(火) 19:34:48.292. エラーが発生したときに落ちることを許可しない
1 && 2 であれば、例外を使用する
bool TryGetHoge(Hoge * pOutput) // Nothrow
const Hoge * GetHogeOrNull() // Nothrow
const Hoge & GetHogeOrThrow() // Hoge が取得できないばあいはスロー
const Hoge & GetHogeOrDie() // Hoge が取得できない → 死
0233デフォルトの名無しさん
2011/09/27(火) 19:42:16.44無駄にコストが掛かる、ってのはどういうこと?
C++は原則的に要求された機能を実現するのに必要なだけのコストしか掛けない。
プログラマが実際には使わない機能を含めて要求していたならその分無駄にコストが掛かるといえるけど
それは具体的な状況次第。
0234デフォルトの名無しさん
2011/09/27(火) 19:58:52.24関数の本体自体を生成してるわけじゃないんだし
0235デフォルトの名無しさん
2011/09/27(火) 20:02:51.220236デフォルトの名無しさん
2011/09/27(火) 20:05:16.85大した事ないよね
0237デフォルトの名無しさん
2011/09/27(火) 20:15:39.34例外が発生したところで、根っこでキャッチする限り落ちることはなくね?
それが良いわけでもないけどさ。
逆にエラー無視してたらまずくね?
いずれセグメントエラーでも起こして無断で死ぬでしょ。
0238デフォルトの名無しさん
2011/09/27(火) 20:17:09.460239デフォルトの名無しさん
2011/09/27(火) 20:21:25.77{
try { return Main(void); } catch(...) { Message("Fackin Error !!!"); return 1 ; }
}
0240デフォルトの名無しさん
2011/09/27(火) 21:34:14.780241デフォルトの名無しさん
2011/09/27(火) 21:40:07.15simple segregated storageかいいね。ありがとう。
0242デフォルトの名無しさん
2011/09/28(水) 19:33:43.190243デフォルトの名無しさん
2011/09/28(水) 19:36:12.710244デフォルトの名無しさん
2011/09/28(水) 19:57:25.790245デフォルトの名無しさん
2011/09/28(水) 20:08:28.29チムポも蒸れる
0246デフォルトの名無しさん
2011/09/28(水) 20:18:05.220247デフォルトの名無しさん
2011/09/28(水) 20:26:59.490248デフォルトの名無しさん
2011/09/28(水) 20:27:37.840249デフォルトの名無しさん
2011/09/28(水) 20:32:50.41初期化のコンスラクタを呼びたいだけじゃないのか?
それならるぞ。
0250デフォルトの名無しさん
2011/09/28(水) 20:42:54.84Type (*constractor)(int) = &Constractor<Type(int)>;
Type object = constractor(10);
0251デフォルトの名無しさん
2011/09/28(水) 20:45:30.980252デフォルトの名無しさん
2011/09/28(水) 20:52:11.40マルチすると一部の人はヘソを曲げて答えてくれなくなっちゃうぞ
0253デフォルトの名無しさん
2011/09/28(水) 20:55:55.25すいません
向こうは違う人が連投してるので埋もれてしまうかと思ったのでこっちにも書きました
0254デフォルトの名無しさん
2011/09/28(水) 21:05:50.85VCならmtライブラリの物はスレッドセーフだろうけど他のコンパイラは知らん
一応アトミックにしとかないとまずいんじゃね?
0255デフォルトの名無しさん
2011/09/28(水) 21:09:00.94処理系依存じゃね。
0256デフォルトの名無しさん
2011/09/28(水) 21:09:34.40new - delete malloc - free はついだから、注意がとても必要。
0257デフォルトの名無しさん
2011/09/28(水) 21:11:37.900258デフォルトの名無しさん
2011/09/28(水) 21:13:41.58規格表にあったっけ
0259デフォルトの名無しさん
2011/09/28(水) 21:16:07.36これ、誤解受けそうだから、
new deleteが別のスレッドでもいいが、主にタイミングの問題な。
0260デフォルトの名無しさん
2011/09/28(水) 21:17:05.34newのコンストラクタ呼び出しとか、deleteデストラクタ呼び出しとかは、
スレッド関係ないから、その辺は排他なんて何もしてないだろうけど。
0261デフォルトの名無しさん
2011/09/28(水) 21:19:30.73malloc, free, operator new, operator delete
はそれぞれの関数内ではスレッドセーフということですかね
ありがとうございました
0262デフォルトの名無しさん
2011/09/28(水) 21:21:07.320263デフォルトの名無しさん
2011/09/28(水) 21:25:09.48向こうのスレに解決したこと書いておくように
マルチすると解決したあとも面倒だぞ
0264デフォルトの名無しさん
2011/09/28(水) 21:27:10.45上の方でヒープを自作するといってる人がいたが、そういう自作できる人が
排他を組み込んでなかったらアウト。
0265デフォルトの名無しさん
2011/09/28(水) 21:33:54.38ってのは演算子の基本ではあるわな
&&と||のショートサーキットとか
0266デフォルトの名無しさん
2011/09/29(木) 00:57:17.41C++11 から、それら自体に要求される Data race 耐性が規定されるようになったよ。
18.6.1.4 [new.delete.dataraces]
0267デフォルトの名無しさん
2011/09/29(木) 01:09:52.660268デフォルトの名無しさん
2011/09/29(木) 01:37:55.19ここ( http://www.jah.ne.jp/~naoyuki/Writings/ExtIos.html )を参考に自作ostreamクラスの出力をメンバ変数のvector<char>として取っておいて、適宜取り出せるようにするのは出来たんですが、
コンストラクタから渡したvector<char>から入力を行わせるistreamの拡張がどうにもうまく行きません(boostのistream&を引数としているクラスに渡すと例外を吐く)。
上のを見るかぎりint underflow(void)内でstd::vectorの中身を一つずつ渡せばいいんだと思ったのですが……。
どこかに上記URL先のostream拡張並に平易な例で解説している場所ないですかね?
目的としてはboost.serializationの入出力をファイルでなく、vector<char>で行わせたいんです。
0269デフォルトの名無しさん
2011/09/29(木) 01:44:19.930271デフォルトの名無しさん
2011/09/29(木) 04:40:36.400272デフォルトの名無しさん
2011/09/29(木) 05:44:21.92stringstreamではエンディアンの問題が残ってしまう
0273デフォルトの名無しさん
2011/09/29(木) 14:11:38.30みたいなデバックプリントをもっとタイプ数少なくやってくれるlibraryとか便利関数ないものでしょうか
stdの中にあるとincludeするだけで使えて一番いいのですが
0274デフォルトの名無しさん
2011/09/29(木) 17:21:43.140275デフォルトの名無しさん
2011/09/29(木) 17:31:30.910276デフォルトの名無しさん
2011/09/29(木) 17:48:49.41http://d.hatena.ne.jp/chiharunpo/20110509/1304942799
常に安全側に自動的になるような仕組みないでしょうか?
普通の関数でも
boost::functionに代入してからいろいろしてるので
setjmp/longjmp
使うの不安だ
0277デフォルトの名無しさん
2011/09/29(木) 18:00:05.11ない
0278デフォルトの名無しさん
2011/09/29(木) 18:01:39.96mallocとdeleteを組み合わせるようなもんじゃねーの
0279デフォルトの名無しさん
2011/09/29(木) 18:36:03.440280デフォルトの名無しさん
2011/09/29(木) 19:22:10.92sprintf
0281デフォルトの名無しさん
2011/09/29(木) 19:41:15.36絶対にだ
0282デフォルトの名無しさん
2011/09/29(木) 19:46:29.350283デフォルトの名無しさん
2011/09/29(木) 19:55:30.62The function signature longjmp(jmp_buf jbuf, int val) has more restricted behavior in this International Standard.
If any automatic objects would be destroyed by a thrown exception transferring control to another (destination) point in the program,
then a call to longjmp(jbuf, val) at the throw point that transfers control to the same (destination) point has undefined behavior.
C++11
The function signature longjmp(jmp_buf jbuf, int val) has more restricted behavior in this International Standard.
A setjmp/longjmp call pair has undefined behavior if replacing the setjmp and longjmp by catch and throw would invoke any non-trivial destructors for any automatic objects.
0284デフォルトの名無しさん
2011/09/29(木) 20:00:46.38なんてものがあるんだね
0285デフォルトの名無しさん
2011/09/29(木) 20:04:25.74シグネチャ longjmp(jmp_buf jbuf, int val) はこの国際規格では(Cの規格)より振る舞いが制限されている。
任意の自動変数が例外によってプログラム内の制御が別の所に移動する事により破棄されようとするような場合に、
その throw を行う地点での別の場所に制御を移動するような longjmp(jbuf, val) の呼び出した際の振る舞いは未定義である。
分かりにくい表現だけど、要するに、
throw だと制御が他に移動した時にもちゃんとデストラクタ呼んでくれることが保証されるけど、
throw の代わりに longjmp を使った場合はそれが保証されない(未定義になる)ということ。
C++11も文言は変わってるけど似たような事を言ってる。
0286デフォルトの名無しさん
2011/09/29(木) 20:05:13.41直した所で分かりやすくならないのでいいや
0287デフォルトの名無しさん
2011/09/29(木) 21:06:29.060288デフォルトの名無しさん
2011/09/29(木) 21:17:53.32だからsetjmp/longjmp使うお
0289デフォルトの名無しさん
2011/09/30(金) 05:56:37.28戻り値エラーコードで我慢しろ
0290デフォルトの名無しさん
2011/09/30(金) 06:03:01.350291デフォルトの名無しさん
2011/09/30(金) 06:05:27.950292デフォルトの名無しさん
2011/09/30(金) 06:08:59.17インターフェースは変更できないお
0293デフォルトの名無しさん
2011/09/30(金) 06:27:01.750294デフォルトの名無しさん
2011/09/30(金) 06:34:25.410295デフォルトの名無しさん
2011/09/30(金) 06:40:19.690296デフォルトの名無しさん
2011/09/30(金) 06:44:58.77どっちにしろコードレビューではねられる気がするお
0297デフォルトの名無しさん
2011/09/30(金) 06:48:37.87そのインタフェースを提示してる時点で
コードレビューにひっかかるだろw
0298デフォルトの名無しさん
2011/09/30(金) 06:54:03.140299デフォルトの名無しさん
2011/09/30(金) 07:12:42.76そこに例外使うなというのを後から突っ込んでる時点で
まともな話にならないのは当然だお
0300デフォルトの名無しさん
2011/09/30(金) 07:38:59.94bool try_lexical_cast(const U & input, T * pOutput)
{
try {
*pOutput = lexical_cast<T>(input);
return true;
} catch (bad_lexical_castだっけ? &) {
return false;
}
}
0301デフォルトの名無しさん
2011/09/30(金) 08:13:13.76signalかerrnoを使えばいい
0302デフォルトの名無しさん
2011/09/30(金) 08:29:33.440303デフォルトの名無しさん
2011/09/30(金) 09:09:15.300304デフォルトの名無しさん
2011/09/30(金) 09:20:20.49C++11のlambdaって
まさかコンパイル時じゃなくて実行時生成なの?
0305デフォルトの名無しさん
2011/09/30(金) 11:38:31.56普通の関数オブジェクトになるよ
キャプチャしてればその領域の確保を実行時に行う
してないなら普通の関数と同じ
もちろん処理系によってはそうじゃないかもしれないが
0306デフォルトの名無しさん
2011/09/30(金) 12:52:44.62エラーの種類やメッセージとか全部捨てていいならな。
0307デフォルトの名無しさん
2011/09/30(金) 16:42:13.17ifstreambuf_iterator を使って構造体をバイナリファイルから順に読み出す方法があれば教えて頂けないでしょうか
たとえば
typedef struct _abc {
int i;
float x;
} ABC;
と言う構造体が連続してバイナリーデータとして書きこまれているファイルが
/home/Hoge/hoge_bin.dat にあると仮定します。
ifstream ifs( "/home/Hoge/hoge_bin.dat", ios::binary );
istreambuf_iterator<ABC> pABCend;
istreambuf_iterator<ABC> pABC(ifs);
while( pABC != pABCend ) {
cout << "(" << pABC->i << "," << pABC->x << ")" << endl;
pABC++;
}
(このコードはコンパイルエラーとなってしまいます)
のような使い方をしたいのですが、参考書を見ても istreambuf_iterator<char>での
例題しか載っていません。
0308デフォルトの名無しさん
2011/09/30(金) 17:08:13.75っていう関数があるとする
戻り値が false であったばあい、*pHoge は
1. NULL が代入されている
2. 全く手付かず
どちらの方が連想されて、どちらの方が望ましい?
0309デフォルトの名無しさん
2011/09/30(金) 17:12:46.38bool TryGetHoge(Hoge **ppHoge)
っていう関数があるとする
戻り値が false であったばあい、*ppHoge は
1. NULL が代入されている
2. 全く手付かず
どちらの方が連想されて、どちらの方が望ましい?
0310デフォルトの名無しさん
2011/09/30(金) 17:25:00.96意味不
0311デフォルトの名無しさん
2011/09/30(金) 18:32:15.51オプショナルを真似て自作すればいいじゃん
template <class T, class U> class optional { ... } ;
optional<string, Hoge> MakeHoge(Param p) { /* do something */; if(good) { return Hoge(p); } else { return "ERROR_XXX"; } }
optional<string, Hoge> obj(MakeHoge(p));
if(obj) { obj->hello(); } else { cout << optional_cast<string>(obj) << endl ; }
こんな感じのインターフェースで十分だろ
0312デフォルトの名無しさん
2011/09/30(金) 18:35:36.33エラーが発生した場合
�@保証なし
�Aメモリリークなどが起こらない保証
�B関数を呼ぶ直前まで巻き戻る保証
基本的に数字が大きいほど親切な設計
ただし数字が大きいほど無駄なコストが掛かる場合が多い
コストが気にならない処理なら常に�Bを心がけよう
0313デフォルトの名無しさん
2011/09/30(金) 18:50:49.70残念ながらifstreambuf_iteratorはそういう風に使うものじゃない
charかwchar_tしか使えないものと思うべし
(traisを定義したらうまくいくのかもしれないけど、まずそういう使い方しないのでよく分かんない)
0314デフォルトの名無しさん
2011/09/30(金) 18:54:04.34boost::serialization 使え
0315デフォルトの名無しさん
2011/09/30(金) 18:59:25.28実際に存在するasprintfという関数だと実装で真っ二つなんだよなぁ
ただC++だとまずそのプロトタイプがどうなのよ?
0316デフォルトの名無しさん
2011/09/30(金) 19:11:06.76newして返されてもなー
0317デフォルトの名無しさん
2011/09/30(金) 19:12:02.72NULL代入ってのがよく分かんないってことか
0318309
2011/09/30(金) 19:52:12.99>>312
bool Piyo::Process(Foo * pFoo)
{
return pFoo->TryGetHoge(&this->pHoge);
}
利用者がその項目の数字が大きいほうを「予想する」ほど、設計者に大して親切な、呼び出し側の処理になる
bool Piyo::Process(Foo * pFoo)
{
Hoge * pH;
if (pFoo->TryGetHoge(&pH)) {
this->pHoge = pH;
return true;
} else {
return false;
}
}
で、利用者はパッと見、どういう処理だと予想するかなって話
俺が利用者として>>309を見たとき、
1. 戻り値が true であれば、Hoge を指すポインタが *ppHoge に渡される
2. 戻り値が false であれば、少なくとも Hogeを指すポインタが *ppHoge に渡されない
(つまるところ、未定義)
と予想する
つまり、設計者としては *ppHoge はどうなってもいい、という考えでコーディングしてもいいのだろうか
>>316
お前が何をいっているのか理解不能状態
0320デフォルトの名無しさん
2011/09/30(金) 20:12:06.41引数がHoge*に見えてた
0321デフォルトの名無しさん
2011/09/30(金) 20:16:25.59その時々でサイコロでも振るか多数決でもすればいい
0322デフォルトの名無しさん
2011/09/30(金) 20:26:35.80って意味でドキュメントには
この関数がHogeの取得に失敗した場合はfalseを返し*ppHogeの値は不定となる。
って書いておいて実装は好きにすればいい。
0323デフォルトの名無しさん
2011/09/30(金) 20:27:01.680324307
2011/09/30(金) 20:35:36.77>>313, >>314
アドバイス、ありがとう。
参考書に template <typename T> istreambuf_iterator(istream &stream);
との記載があったので、 T != char でも使えるのかと思ったのだけど、難しそうですね。
だったら、なんで template <typename T> などと書かれているのだろかと疑問が湧いてきますが。。。。
T = char or wchar_t の2種類(1種類ではない)で使うから template 宣言されてるの?
boost::serialization を調べてみます。
0325デフォルトの名無しさん
2011/09/30(金) 21:02:57.29あくまで文字型を指定することを想定して作られてる
0326デフォルトの名無しさん
2011/10/01(土) 09:03:48.34アプリ起動からどの程度でprivate bytesの上昇が落ち着くか見たいんだけど、自作のアプリじゃ処理を繰り返しても一向に横ばいにならなくて。
リークはしてないはずだけど同じ処理を100回ぐらいするとなぜか50KBくらいprivate bytesがぽこっと上がってメモリリーク疑われてます。
0327デフォルトの名無しさん
2011/10/01(土) 09:07:40.150328デフォルトの名無しさん
2011/10/01(土) 09:17:22.050329デフォルトの名無しさん
2011/10/01(土) 09:31:10.170330デフォルトの名無しさん
2011/10/01(土) 10:18:02.36テンプレートクラスをヘッダファイルと定義を書いたcppファイルに分けて記述した場合、
これを更に他のファイルからヘッダのみインクルードし具体的な型にして使おうとすると、
その具体的な型の定義が見えないらしく、ヘッダかどこかで具体化してやる必要があります・・・か?
つまり、
テンプレートクラスの宣言をヘッダファイルに、定義をcppファイルに別々に書いた場合、
使うには一々具体化してやらねばならず、例えば将来定義する新たな型に対してはその都度
具体化してやらなければなりませんか?
言い換えると
任意の型に対しこれを適応するには宣言と定義別々に書いてはだめ、ということですか?
長くてスイマセン
0331デフォルトの名無しさん
2011/10/01(土) 10:34:55.80例えばこういうやり方はできる
/*swap.hpp*/
#ifndef SWAP_HPP
#define SWAP_HPP
template <typename T>
void swap(T& lhs,T& rhs);
#include <swap.inl>
#endif
/*swap.inl*/
template <typename T>
void swap(T& lhs,T& rhs)
{
T tmp(lhs);
lhs = rhs;
rhs = tmp;
}
cppはつまり具体的な型がないとコンパイルできない
0332デフォルトの名無しさん
2011/10/01(土) 10:42:50.98ヘッダにcppインクルードしちゃうんですね
そんなやり方が有りとは
2重定義になったりしそうと思うのは杞憂ですかね?
0333デフォルトの名無しさん
2011/10/01(土) 10:56:22.12別に記述することはできるが、h-cppの組みでは無理そうですかねぇ
というのもこれまではテンプレートクラスは使わずよく使う関数・クラスをヘッダに宣言
cppに定義を、というスタイルでやっていたのでそのスタイルを保てるかなーと思ったんですが
0334デフォルトの名無しさん
2011/10/01(土) 11:17:54.36template<unsigned U>struct h{char a[U];h<U>*next;};
template<unsigned U,unsigned RB,unsigned R=RB&~1>h<U>*const f(){
h<U> r[R]; for(int i=0;i<R;++i)r[i]=new h<U>;
for(int i=0;i<R;++i){r[i].next=&r[i+2];delete r[++i];}
return &r[0]; }
0335デフォルトの名無しさん
2011/10/01(土) 11:25:01.470336デフォルトの名無しさん
2011/10/01(土) 11:46:56.730337デフォルトの名無しさん
2011/10/01(土) 12:59:29.49テンプレートクラスは定義も直接クラス内に書くのが一番だよ
外に出すと記述がやたら複雑になって読み辛いから
クラス内に書くとinline扱いになるけど、実質大して変わらない
(最適化レベルが上がれば大体の処理系でinlineの有無は関係なくなる)
0338デフォルトの名無しさん
2011/10/01(土) 13:00:03.42Googleに入社すれば好きなだけ使えるかと
0339309
2011/10/01(土) 13:14:10.96未定義の線で進めることにするよ
0340デフォルトの名無しさん
2011/10/01(土) 13:49:57.64中に書くと関数の一覧性が見えにくい
どっちつかずだよ
template <class T> class hoge {
public:
/* 宣言 */
void foo(void);
void bar(void);
void baz(void);
/* 定義 */
void foo(void) {}
void bar(void)
void baz(void);
0341デフォルトの名無しさん
2011/10/01(土) 13:50:18.390342デフォルトの名無しさん
2011/10/01(土) 14:08:22.11オブジェクトブラウザやアウトラインみたいなので見ればいいじゃんいいじゃん
0343デフォルトの名無しさん
2011/10/01(土) 19:30:37.04そんな方法より、newとmalloc、deleteとfreeをオーバーロードかマクロで置き換えて、
確保されたメモリのアドレスがちゃんと解放に渡されてるか調べたほうが確実だろ。
0344デフォルトの名無しさん
2011/10/01(土) 20:32:49.180345326
2011/10/02(日) 00:40:32.92メモリのスナップショットとって解析したけどアプリ分のリソースに問題なさそうだし。
スレッドをバカバカ作成するポンコツアプリだから断片化してる可能性があるかなと。
常に斜めにメモリが上がるんじゃなく、不特定のタイミングで100回に1回ぐらい50KBくらい上がるってなんなんだろう?
0346デフォルトの名無しさん
2011/10/02(日) 00:47:51.010347デフォルトの名無しさん
2011/10/02(日) 02:35:47.16RAIIは徹底しててその状態なの?
0348デフォルトの名無しさん
2011/10/02(日) 09:43:09.60> ツールの静的解析は既にやってるし、new、deleteも問題ないんだよね。
> メモリのスナップショットとって解析したけどアプリ分のリソースに問題なさそうだし。
本当に問題ないかは最終的に原因が判明したあとで原因ではなかったところについてしかいうことはできない。
真犯人(=リークの原因)が明らかになるまでは可能性のある人全て(=リソースを扱う全ての箇所)が容疑者。
0349デフォルトの名無しさん
2011/10/02(日) 09:59:19.46と書いてるけど、自前でnew/deleteやってんのか?
0350326
2011/10/02(日) 10:56:40.05リークしてない前提でヒープをバシバシ使いメモリを断片化させる作りの悪いアプリを使い続けたときの動作を検証したいんです。
OSがデフラグして動きが安定するか、それがどんなタイミングなのか、またOS毎に違いがあるのか。
半年ぐらいかけてメモリの増加量を1/10ぐらいにして、もう分らなないので外部のコンサル会社に調査依頼したら、
「リーク以外にメモリの断片化がありますね」って回答なんだけど、断片化については運用環境で違うから環境毎に検証して、うちのアプリと動作を比較したいんです。
0351デフォルトの名無しさん
2011/10/02(日) 11:06:12.86そういえば、windowsだとマルチスレッドの場合、ランタイムはスタティックリンクするとリークするってのがあったと思うけど、それはどうかな?
0352デフォルトの名無しさん
2011/10/02(日) 11:14:25.950353デフォルトの名無しさん
2011/10/02(日) 11:40:58.880354デフォルトの名無しさん
2011/10/02(日) 11:43:38.10そのnew、deleteの繰り返しが断片化の原因なんだが。
一度、確保したらアプリ終了までその領域を使い回せば断片化なし。
0355デフォルトの名無しさん
2011/10/02(日) 11:45:46.89お前は何を言ってるんだ?
0356デフォルトの名無しさん
2011/10/02(日) 12:55:53.97一般的にいわれる断片化による問題ってのは空き容量は充分にあるのに
空き容量以下だけどある大きさ以上の連続した領域が確保できなくなるってもので、
謎のメモリ使用量があるっていう>>326の話とは違うものだろ。
>>326がいってるのは任意の大きさでなく既定の大きさ(固定や2のべき乗)でしかメモリ確保できない環境での
要求量と確保量のずれによる無駄の話なんじゃないのか。
0357326
2011/10/02(日) 13:16:19.94以前はそれもあったのでリークしないほうの新しいAPIに置き換えてます。
>>353
自前で使う分はなんとかリファクタリングしたんですが、スレッド生成とかでもヒープを使用するとかで、スレッド部分は見直したけどまだあるみたいです。
アプリ起動時からメモリ領域の再利用が始まり安定するまである程度期間がかかるらしいんだけど、その安定ポイントがいつなのか説明できなくて。
「メモリ使用量は少し上昇してますが、これはOSのオーバーヘッドで時間がたてば落ち着きます」って説明できればベストなんだけど、今その時間を調べてるところで。
逆にそれで落ち着かなければまたリークを見直す必要もあります。
いろいろすみません。
0358デフォルトの名無しさん
2011/10/02(日) 13:17:57.04要求を2の累乗にしろってのも馬鹿な話だよなアレ
0359デフォルトの名無しさん
2011/10/02(日) 13:22:58.630360デフォルトの名無しさん
2011/10/02(日) 18:40:47.75OSのある環境だと「連続領域が確保できなくなる」→「新しい連続領域がプロセスに割り当てられる」
ってことが起こるから、違う話だとは思わんな。
0361デフォルトの名無しさん
2011/10/03(月) 06:43:31.27auto fn_obj=std::ptr_fun( test_fn);
なんでエラーになるんだ
std::ptr_funは関数オブジェクト返すはずなんじゃないの?
0362デフォルトの名無しさん
2011/10/03(月) 06:59:26.94ひとりごとのつもりじゃないなら完全なコードとエラーメッセージ貼れよ。
0363デフォルトの名無しさん
2011/10/03(月) 07:02:15.46test_fnの引数が一つもないからダメ
0364デフォルトの名無しさん
2011/10/03(月) 10:53:57.600365デフォルトの名無しさん
2011/10/03(月) 20:48:02.48候補キーが2ついじょうあってそのどれからでも効率よく検索ができるようなmapを
STLを組み合わせてパパっとつくれますか?
0366デフォルトの名無しさん
2011/10/03(月) 21:05:36.29どこかに実体は必要だけど
0367デフォルトの名無しさん
2011/10/04(火) 00:17:11.540368デフォルトの名無しさん
2011/10/04(火) 03:24:28.960369デフォルトの名無しさん
2011/10/04(火) 04:57:31.420370デフォルトの名無しさん
2011/10/04(火) 05:03:58.72http://en.wikipedia.org/wiki/Variadic_template
sizeof...(Args)
0371デフォルトの名無しさん
2011/10/04(火) 05:06:58.03ありがとう。
日本語しか読めなくて。
0372デフォルトの名無しさん
2011/10/04(火) 09:38:43.09クラスのヘッダーにchar name[MAX_PATH]と定義してクラスをnewした場合、ヒープかスタックどちらの領域を使用しますか?
0373デフォルトの名無しさん
2011/10/04(火) 09:56:20.320374デフォルトの名無しさん
2011/10/04(火) 16:41:40.70ありがとうございます。
と、いうことはクラスをdeleteする時にメンバ変数も同時にdeleteされるということですね。
0375デフォルトの名無しさん
2011/10/04(火) 16:45:02.24自分でnewした奴は勝手にdeleteされないよ
スマポを使え
それかデストラクタにdelete書いておくか
0376デフォルトの名無しさん
2011/10/04(火) 19:20:02.310377デフォルトの名無しさん
2011/10/04(火) 20:03:56.330378デフォルトの名無しさん
2011/10/04(火) 20:17:14.480379デフォルトの名無しさん
2011/10/04(火) 20:41:46.31+ shapes
- PointShape.h
- CircleShape.h
- BoxShape.h
- ShapeManager.h
1ヘッダー1クラスかつフォルダ構造と名前空間名を一致させるものとする
例えば、hoge::shapes::CircleShapeクラスは"hoge/shapes/CircleShape.h"に存在する
全ての〜ShapeクラスはIShapeクラスを継承している
ShapeManagerクラスはIShapeクラスを使用する
この状況で、"IShape.h"はどこに置くべきなんだろうか
hoge::ShapeManagerが使うインターフェイスだから"hoge/"に置くべきか、
それとも素直に"hoge/shapes/"に置くべきか
0380デフォルトの名無しさん
2011/10/04(火) 20:51:04.900381デフォルトの名無しさん
2011/10/04(火) 20:56:13.280382デフォルトの名無しさん
2011/10/04(火) 21:53:35.95それとも単にgccのバグ?
ちなみに、(1)の関数をコメントアウトして(2)の関数のコメントを外すとちゃんとコンパイルできます。
template <int n>
class foo
{
public:
constexpr foo() : array_{}, sum_{} { }
// (1)
template <typename ... Args>
constexpr foo(Args... args) : array_{args...}, sum_{make_sum(args...)} { static_assert(sizeof...(Args) == n, "invalid"); }
// (2)
/*template <typename ... Args>
constexpr foo(Args... args) : array_{args...}, sum_{} { static_assert(sizeof...(Args) == n, "invalid"); }*/
// (1)
constexpr int sum() const { return sum_; }
// (2)
/*constexpr int sum() const { return sum_impl(0); }*/
private:
constexpr int make_sum(int value) const { return value; }
template <typename ... Args>
constexpr int make_sum(int value, Args... args) const { return value + make_sum(args...); }
constexpr int sum_impl(int i) const { return i == n ? 0 : array_[i] + sum_impl(i+1); }
int array_[n];
int sum_;
};
int main() { constexpr int n = foo<4>(1, 2, 3, 4).sum(); return 0; }
0383デフォルトの名無しさん
2011/10/04(火) 22:01:44.41こりゃgccのバグだな
>コンパイラ内部エラー: Segmentation fault: 11
>完全なバグ報告を送って下さい。
>適切ならば前処理後のソースをつけてください。
><http://gcc.gnu.org/bugs.html> を見れば方法が書いてあります。
0384デフォルトの名無しさん
2011/10/04(火) 22:03:32.420385デフォルトの名無しさん
2011/10/05(水) 04:10:42.14名前空間とフォルダ構成を一致させるのはめんどいしファイル探しにくいし親が複数だとルール崩れるしでいいとこないぞ
Project-Namespace-Class.hpp
こっちがオススメ
0386デフォルトの名無しさん
2011/10/05(水) 11:27:22.08これの上の方法を文字2つじゃなくて文字列でやりたいんだけどどうにかならないかな
Func<"[]">(3, 5);
Func<"[)">(3, 5);
っていう感じにしたい
0387デフォルトの名無しさん
2011/10/05(水) 12:01:01.56namespace braket{struct close{enum{v=0};};struct open{enum{v=3};};struct lopen{enum{v=2};};struct ropen{enum{v=1};};}
template<typename T>struct Func;
template<>struct FNC<branket::close>{〜};
0388デフォルトの名無しさん
2011/10/05(水) 12:19:11.49何でテンプレート?関数オブジェクトとかじゃだめなの?
0389379
2011/10/05(水) 22:23:27.05ShapeManagerは説明のために適当に名づけたもの・・・なんだけど、
ShapeContainerみたいなコンテナ系のクラスであればshapes/に置くべきかな?
>>385
結構前からその方法を使おうか迷ってたんだが、踏み切れないな
どこか、ある程度の規模のプロジェクトで使用されていた実績でもあればやってみたいんだが
0390デフォルトの名無しさん
2011/10/06(木) 00:29:39.71フォルダわけされてないほうが探しにくいような気がするし、
「親が複数」がどんな状況を指してるのかよくわからない。
0391デフォルトの名無しさん
2011/10/06(木) 00:31:53.27分からなけりゃ検索すりゃいいじゃん
0392デフォルトの名無しさん
2011/10/06(木) 00:38:48.99手動でフォルダ分けとか前時代的すぎる
0393デフォルトの名無しさん
2011/10/06(木) 00:57:26.280394デフォルトの名無しさん
2011/10/06(木) 01:25:39.60algorithmを見ると配列同士の操作しか無いように見える。
これってvalarray使えって事?速度より利便性が欲しいんだけど。
0395デフォルトの名無しさん
2011/10/06(木) 01:30:00.53配列の各要素にみんな同じ変数の値を足すなら、 transform() じゃないかな?
なんで valarray が出てくるのかよくわからないんで読み違えてるのかもしれないけど。
0396デフォルトの名無しさん
2011/10/06(木) 01:33:20.73C++ likeな使い方ができる。
interface Arg extends arguments.Package{} //パッケージインポート
interface Package //パッケージ定義
{
//公開するクラスだけ中に書く
class TypeA{}
class TypeB{}
}
//公開しないクラスは外に書く
class TypeC{}
0397デフォルトの名無しさん
2011/10/06(木) 01:36:31.92transformじゃ配列(コンテナ)同士じゃないとできなくない?
動かないイテレータを自作するなら別だろうけど。
0398デフォルトの名無しさん
2011/10/06(木) 01:38:16.730399デフォルトの名無しさん
2011/10/06(木) 01:38:43.690400デフォルトの名無しさん
2011/10/06(木) 01:40:41.92名前忘れたけど専用の関数が標準にあるよ
0401デフォルトの名無しさん
2011/10/06(木) 11:29:32.82accumulate?
そうじゃなくてやりたいのは
std::transform(v.begin(), v.end(), v.begin(), std::bind2nd(std::plus<int>(), value))
みたいなのでしょ
0402デフォルトの名無しさん
2011/10/06(木) 22:55:46.20やろうとしてたのはそういうヤツ。
0403デフォルトの名無しさん
2011/10/06(木) 23:08:59.960404デフォルトの名無しさん
2011/10/06(木) 23:15:38.01古いbind1st bind2ndはね。代わりに強化された汎用のbindがある。
0405デフォルトの名無しさん
2011/10/06(木) 23:18:24.360406デフォルトの名無しさん
2011/10/06(木) 23:20:32.260407デフォルトの名無しさん
2011/10/06(木) 23:22:01.460408デフォルトの名無しさん
2011/10/06(木) 23:24:59.400409デフォルトの名無しさん
2011/10/06(木) 23:27:19.400410デフォルトの名無しさん
2011/10/06(木) 23:29:00.350411デフォルトの名無しさん
2011/10/06(木) 23:29:16.21使う分には使いやすいんじゃない?
0412デフォルトの名無しさん
2011/10/06(木) 23:31:14.390413デフォルトの名無しさん
2011/10/07(金) 00:27:22.46lambdaでbindの代わりをするには手間がかかるうえにわかりにくくなるだけのときもある。
std::map<int, double> func(std::vector<int> const & v, std::list<double> const & l)
{ return std::map<int, double>(); }
int main()
{
using namespace std;
using namespace std::placeholders;
// funcの引数の順序を入れ替えた関数オブジェクトを作る
auto f2 = bind(func, _2, _1);
auto f3 = [](list<double> const & l, vector<int> const & v) { return func(v, l); };
}
0414デフォルトの名無しさん
2011/10/07(金) 00:58:22.51std::functionの実行時コスト(型消去など)
名前空間をタイプする労力
これならautoとλを使ったほうがマシ
0415デフォルトの名無しさん
2011/10/08(土) 07:30:54.40int *p;
int &operator[](int t){return p[t];}
const int &operator[](int t)const{return p[t];}
};
こういうconstメンバ関数が冗長なのをなんとかできませんか?
0416デフォルトの名無しさん
2011/10/08(土) 08:26:07.31関数内がどうしようもなく複雑になるようなら
実装をまとめてconst_castするのも手だが
まあ普通はそこまでする必要はないわな
0417デフォルトの名無しさん
2011/10/08(土) 08:59:23.590418デフォルトの名無しさん
2011/10/08(土) 11:55:28.29やった事無いし、オーバーロードが面倒で反ってラビリンスな感じだけど
struct array{
int *p;template<typename T>struct eqint{T v;const eqint<T>&operator=(T a){v=a;return *this;}operator const T()const{return v;}};
eqint<int>&operator[](size_t t)const{return *reinterpret_cast<eqint<int>*>(p+t);} };
0419415
2011/10/08(土) 14:37:38.26getterのような関数ばっか書いててこう思ったのです。
>>416 関数が複雑になったときはそうしようと思いますが、
最適化に影響がでないでしょうか?
int &operator[](int t){return (int&)((const array&)*this)[t]);}
const int &operator[](int t)const{return p[t];}
こうすると、constによる最適化には影響ない?
int &operator[](int t){return p[t];}
const int &operator[](int t)const{return ((array&)*this)[t];}
こうすると、constによる最適化がなされない可能性がある?
>>418
> operator const T()const{return v;}
intを例に書きましたが、汎用性を持たせると、やはり参照を返したくなってラビリンスでした。
といはいえ、1つ作れば良いので、この方法を検討してみます。
ありがとうございました。
0420デフォルトの名無しさん
2011/10/08(土) 15:29:41.41Sequenceフォルダ内に
Parent.h
Gameフォルダ内に
Parent.h
を作成したいんだけど…
0421デフォルトの名無しさん
2011/10/08(土) 16:06:25.040422デフォルトの名無しさん
2011/10/08(土) 16:09:47.090423デフォルトの名無しさん
2011/10/08(土) 16:12:27.68じゃあ普通に作ればいいんじゃないか
0424デフォルトの名無しさん
2011/10/08(土) 16:35:55.15VC++の話だったら手作業でフォルダとファイル作って後でVC++に項目追加する
0425デフォルトの名無しさん
2011/10/08(土) 16:38:35.23Sequenceフォルダ内に
Parent.h
Sequenceフォルダ内のGameフォルダに
Parent.h
を作りたいんだ。サンプルでは作成出来てるんだけど、
俺が作ろうとすると、すでに存在すると言われ作れない。
0426デフォルトの名無しさん
2011/10/08(土) 16:42:17.66vc++のソリューションエクスプローラじゃなくて、
普通にOSのエクスプローラでファイルを追加してから、ソリューションエクスプローラにドラックアンドドロップする
0427デフォルトの名無しさん
2011/10/08(土) 16:45:46.18出来た!皆ありがとう!!
0428デフォルトの名無しさん
2011/10/08(土) 17:00:20.840429デフォルトの名無しさん
2011/10/08(土) 18:12:56.880430デフォルトの名無しさん
2011/10/08(土) 18:43:48.93ttp://codepad.org/qllGCv19
0431デフォルトの名無しさん
2011/10/08(土) 18:50:23.96ポインタを値渡ししてるだけじゃデータ受け取れないぞ
0432デフォルトの名無しさん
2011/10/08(土) 18:54:46.89readFile関数内で割り当てるつもりなら、main関数では
readFile(&p, &size);
の形で呼び出すでしょ。まぁそんな作りには普通しないと思うけど。
0433デフォルトの名無しさん
2011/10/08(土) 19:03:54.58読み出すサイズがファイルを読み込まないとわからないんです。
自分もありえないつくりだと思っています。クラスでも作ります。
>>431
参照渡しにしました。というか2重ポインタ?でやったほうがかっこいい
関数の名前下のほうがいいよね。
void readFile( int* &pOutArray, int* pOutSize )
void readFile( int* &pRefOutArray, int* pOutSize )
0434デフォルトの名無しさん
2011/10/08(土) 19:05:21.44返信ありがとうございました。
0435デフォルトの名無しさん
2011/10/08(土) 19:25:44.92とかでよくね?必要ならファイル名でも増やせば
もっとエラー処理が必要なら例外でも使うがよろし
0436デフォルトの名無しさん
2011/10/08(土) 19:34:41.81> constによる最適化
何のこと?たぶん何か勘違いしてると思うんだけど。
0437デフォルトの名無しさん
2011/10/08(土) 19:48:53.98かといってストリームのエラーを毎度チェックするのはめんどくさいからまる読みしたい
僕はどうすればいいんだ
0438デフォルトの名無しさん
2011/10/08(土) 19:57:16.620439デフォルトの名無しさん
2011/10/08(土) 23:13:02.52フォルダだと非ツリー構造(グラフ構造)を表せないから
単一継承ならツリーにはなるけど、多重継承はツリーにならんでしょ
継承に限らず依存関係はグラフ構造がメインなんでフォルダわけってのは使い辛い
0440415
2011/10/09(日) 11:37:58.84constの効果を以下のように認識しているのですが、
間違っているところがあればご指摘ください。
1 値を書換えられない。値を書換えられる型に暗黙に変換できない。
2 constがついている変数からは値を書換えないことが保証されているので
キャッシュからメモリへの書戻しをスキップするなどの 最適化を行える。(実装依存?)
3 constがついているものを外してしまうと 外したことを認識できる場所では2の最適化を
行わないようにしてくれる(inline展開された場合など?)
4 constがついているものを外して値を書換えると 外したことを認識できない場所では、2の最適化が
そのまま行われて、キャッシュ不整合になる。 (constを外すと動作保証外になる要因?)
この場合はconstを外しても値を書換えないので4が起ることはないと思うのですが
3が起ってしまう可能性を考えたのです。
0441デフォルトの名無しさん
2011/10/09(日) 11:59:52.170442デフォルトの名無しさん
2011/10/09(日) 12:32:00.770443デフォルトの名無しさん
2011/10/09(日) 13:24:08.19void Func(int const & v) { const_cast<int &>(v) = 1; }
int main(void) { Func(hoge::v); return 0 ;}
未定義?
0444デフォルトの名無しさん
2011/10/09(日) 13:31:50.920445デフォルトの名無しさん
2011/10/09(日) 13:45:03.64元がconstじゃないものをconstにしたものなら大丈夫だったはず
0446デフォルトの名無しさん
2011/10/09(日) 13:58:34.74Funcの動作も未定義ということか
0447デフォルトの名無しさん
2011/10/09(日) 14:08:22.13元々constじゃないものを渡す分には問題ないはず
0448デフォルトの名無しさん
2011/10/09(日) 14:22:38.745.2.2-5
[Note: a function can change the values of its non-const parameters,
but these changes cannot affect the values of the arguments
except where a parameter is of a reference type (8.3.2);
if the reference is to a const-qualified type, const_cast is required
to be used to cast away the constness in order to modify the argument's value.
Where a parameter is of const reference type a temporary object is introduced
if needed (7.1.5, 2.13, 2.13.4, 8.3.4, 12.2).
In addition, it is possible to modify the values of nonconstant objects
through pointer parameters. ]
関数は非const仮引数の値を変更出来るが、
パラメータが参照型 (8.3.2) である場合を除いて、
実引数の値に影響を与えない。
(const参照の場合は、実引数の値を変更する為に ←←←←←
const_castを使ってconst性を除去する必要がある。) ←←←←←
仮引数がconst参照である場合、必要であれば
一時オブジェクトを導入出来る (7.1.5, 2.13, 2.13.4, 8.3.4, 12.2)。
(訳注:const参照にリテラルを渡した時に一時オブジェクトを作成して渡すというアレの事)
さらに、ポインタの仮引数を通じても、定数でないオブジェクトの値を変更することができる。
0449デフォルトの名無しさん
2011/10/09(日) 16:19:53.41生成時点で const が付いていた値について、 1, 2 は正しい。
const_cast で書き換えるようなコードは書けるが、その場合は
未定義動作となるので動作保証する必要が無く、それにより
最適化が可能になる。
後から参照やポインタとして const が追加されたものについては
const_cast やグローバル変数経由などによる書き換えが可能なので
2 のような最適化はできない。
ただし const に頼らず、値アクセスの間にある操作をすべて
解析した上で 2 と同様の最適化を行うことは可能。
const 外しを認識したところで、対象の値に生成時点で const が
付いていたのを知らない限り、生成されるコードに影響は無い。
0450デフォルトの名無しさん
2011/10/09(日) 16:26:18.590451デフォルトの名無しさん
2011/10/09(日) 19:14:20.560452デフォルトの名無しさん
2011/10/09(日) 20:52:32.400453デフォルトの名無しさん
2011/10/10(月) 01:15:24.24ゲームのプログラマってアルゴリズムどうしてんの?
全部自分で考えてる訳じゃないよな?本やネットから引用してるよな?
0454デフォルトの名無しさん
2011/10/10(月) 01:18:28.990455デフォルトの名無しさん
2011/10/10(月) 01:33:18.29入力に合わせて自キャラが動くなんてのはほとんど定番的なやり方があるだろうけど
独自のルールやゲームシステムがあるならそれに合わせた独自のアルゴリズムを考える必要があるだろ
0456デフォルトの名無しさん
2011/10/10(月) 05:18:30.33ほとんど自分で考えてるよ。
0457デフォルトの名無しさん
2011/10/10(月) 09:23:29.88アプリケーション独自の部分は拘ってクールなアルゴリズムとか考えても費用対効果薄いからやりたいことを素直にシンプルに書く
0458デフォルトの名無しさん
2011/10/10(月) 18:12:37.97行列の指数計算(eの行列乗というか)をC++で行いたいのですが、
そのような計算ができるライブラリなどを知っている方がいたら教えてください。
0459デフォルトの名無しさん
2011/10/10(月) 18:25:46.980460デフォルトの名無しさん
2011/10/10(月) 18:28:41.350461デフォルトの名無しさん
2011/10/10(月) 19:10:46.780462デフォルトの名無しさん
2011/10/10(月) 19:16:30.54blasは行列計算とかで業界標準だとかなんとか聞いた覚えがある
0463デフォルトの名無しさん
2011/10/11(火) 08:43:58.21グローバル変数として宣言したオブジェクトのコンストラクタを呼び出すスレッドは、
main()を呼び出すスレッドと同じということは、規格は保証してくれるのでしょうか。
どうかご教示夜露死苦お願いします。
0464デフォルトの名無しさん
2011/10/11(火) 08:46:59.310465デフォルトの名無しさん
2011/10/11(火) 08:50:58.69ありがとうございました。
0466デフォルトの名無しさん
2011/10/11(火) 14:00:16.330467デフォルトの名無しさん
2011/10/11(火) 14:10:44.610468デフォルトの名無しさん
2011/10/12(水) 12:26:24.03const int a = {4,5,6,7,8,9,10,11};
から6以上10以下を取得するような感じです。
0469デフォルトの名無しさん
2011/10/12(水) 12:57:01.520470デフォルトの名無しさん
2011/10/12(水) 12:58:37.05a[0]〜a[7]で6をサーチしてi=2がわかったら
a[i]〜a[7]で10をサーチ。
すこしだけ計算量が減る。大差はないと思うが。
0471デフォルトの名無しさん
2011/10/12(水) 13:03:29.744〜11から6の位置(6-4)/(11+1-4)=25%、(11+1-4)*25%=2
a[2-1]とa[2-1+4]の値を確認
2:両方大ハズレなら (a[2-1]かa[2-1+4])と(a[0]かa[7])の組み合わせで範囲が残ってる方の値を基に1:からやり直し
2’:片方ハズレなら(a[2-1]〜a[7])か(a[0]〜a[2-1+4])の値を基に1:範囲の再算出をやり直し
0472デフォルトの名無しさん
2011/10/12(水) 13:32:55.09大きいなら二分探索二回でおk
0473デフォルトの名無しさん
2011/10/12(水) 14:14:24.35探索位置が2つの探索対象の間に入るまでは共通だから単純に2回ではない
0474デフォルトの名無しさん
2011/10/12(水) 14:39:01.970475デフォルトの名無しさん
2011/10/12(水) 14:45:31.990476デフォルトの名無しさん
2011/10/12(水) 14:46:44.840477デフォルトの名無しさん
2011/10/12(水) 15:15:12.46template <class BidirectionalIterator, class T>
std::pair<BidirectionalIterator, BidirectionalIterator> my_range(BidirectionalIterator begin, BidirectionalIterator end, T from, T to)
{
BidirectionalIterator pos1 = std::find(begin, end, from);
//std::reverse_iterator<T::iterator> riterfrom(to);
//std::reverse_iterator<T::iterator> riterto(from);
//ForwardIterator pos2 = std::find(riterfrom, riterto);
// 組み込み配列には逆反復子はないので自前で調べる
BidirectionalIterator pos2 = --end;
do {
if (*pos2 == to)
break;
if (pos2 == begin) {
pos2 = end;
break;
}
--pos2;
} while (true);
return std::make_pair(pos1, pos2);
}
int main()
{
const int a[] = {4, 5, 6, 7, 8, 9, 10, 10, 11};
std::pair<const int*, const int*> p = my_range(a, a + sizeof(a) / sizeof(a[0]), 6, 10);
if (p.first != a + sizeof(a) / sizeof(a[0]) && p.second != a + sizeof(a) / sizeof(a[0]))
std::copy(p.first, p.second, std::ostream_iterator<int>(std::cout, " "));
}
0478デフォルトの名無しさん
2011/10/12(水) 15:24:45.110479デフォルトの名無しさん
2011/10/12(水) 15:29:44.62本当はコメントアウトしてあるように
std::reverse_iterator<T::iterator> riterfrom(to);
std::reverse_iterator<T::iterator> riterto(from);
ForwardIterator pos2 = std::find(riterfrom, riterto);
で一発で後ろから調べられたはずなんだけど、intは逆反復子を持ってないと
コンパイラに叱られた
0480デフォルトの名無しさん
2011/10/12(水) 15:33:14.00lower_bound()とupper_bound()は既存の順序を崩さないように要素を挿入出来る
位置を返すだけなので、該当の要素が存在する事を確実にするにはbinary_search()
を併用しないといけないから、この問題は見てくれよりも難しいぞ
0481デフォルトの名無しさん
2011/10/12(水) 15:35:52.73決め打ちで値を入れるから使いにくい
find_if()ならラムダ式は使えるが最初に見つかった一個しか返さないし
0482デフォルトの名無しさん
2011/10/12(水) 15:53:23.28互換性無くしていいからもっと使いやすい標準ライブラリを追加してほしいわ
0483デフォルトの名無しさん
2011/10/12(水) 15:58:37.35というかもうC++11の規格固まっちまったし
右辺値参照によるスピードアップだけだな
0484デフォルトの名無しさん
2011/10/12(水) 16:05:16.03const int n = sizeof a / sizeof *a;
const int *l = std::lower_bound(a, a + n, 6);
const int *u = std::upper_bound(l, a + n, 10);
std::copy(l, u, std::ostream_iterator<int>(std::cout, ","));
これじゃだめなん?
0485デフォルトの名無しさん
2011/10/12(水) 16:11:21.41lower_bound()は該当要素が存在しなければ「存在したであろう位置」を返す
だから4,5,11とかだと11の位置をを返してしまう
upper_boundは該当要素が存在しなければ「存在したであろう最後の位置」を返す
だから1,2,3とかだと3の位置を返してしまう
0486デフォルトの名無しさん
2011/10/12(水) 16:12:23.87×3の位置を返してしまう
○past-to-the-3の位置を返してしまう
0487デフォルトの名無しさん
2011/10/12(水) 16:15:02.59const_iter result_upp = end;
while(true) {
const_iter cen = GetCenter(result_upp, result_low);
if(*cen < low) result_low = cen; continue;
if(*cen > upp) result_upp = cen; continue;
result_low = BinSearch(result_low, cen, low);
result_upp = BinSearch(cen, result_upp, upp);
}
0488デフォルトの名無しさん
2011/10/12(水) 16:16:16.450489デフォルトの名無しさん
2011/10/12(水) 16:29:26.97でも要素数が多くなるとなんとかlower_boundとかbinary_searchを使えないかと思う
0490デフォルトの名無しさん
2011/10/12(水) 17:50:10.64という問題の具体化にすぎないなら元の集合にmやnが含まれている保障も必要もない。その場合なら>>484で充分。
0491デフォルトの名無しさん
2011/10/12(水) 18:37:18.370492デフォルトの名無しさん
2011/10/12(水) 19:04:49.58それと線形探索の話をしてるのもいる中で二分探索同士の差で遅いとかいってもな
0493デフォルトの名無しさん
2011/10/12(水) 23:44:01.27確かに4,5,11,endに対してlower_bound(...,6)は11の位置を返す。
ただしupper_bound(...,10)も11の位置を返すので結果は要素数0の空の範囲となりなんの問題もない。
0494デフォルトの名無しさん
2011/10/13(木) 10:33:04.28template<typename T, int SZ> class array
{
T t[SZ];
operator T (&)[SZ]()
operator T (&())[SZ]
(operator T &())[SZ]
{return t;}
};
0495デフォルトの名無しさん
2011/10/13(木) 12:00:39.18operator A() { return t; }
0496デフォルトの名無しさん
2011/10/13(木) 13:44:54.270497デフォルトの名無しさん
2011/10/13(木) 15:19:19.450498デフォルトの名無しさん
2011/10/13(木) 20:56:42.99sting ssss;
ssss.substr(0,ssss.find('@'))
ssssの文字列に法の字が入っていると法の字が消えて代わりに・,って入ってしまう
0499デフォルトの名無しさん
2011/10/13(木) 21:01:06.78"法"はシフトJISで0x4096
@は0x40
だからじゃね
0500デフォルトの名無しさん
2011/10/13(木) 21:02:49.82エンディアンが逆になってるのか
0501デフォルトの名無しさん
2011/10/13(木) 21:02:53.05うーん@を改行代わりにするのは失敗だったか
0502デフォルトの名無しさん
2011/10/13(木) 21:05:13.53文字コードは Shift-JIS だな
'@' は 0x40、'法' は 0x96, 0x40 だから find() が 2 バイト目にヒットする
回避策は _mbschr() を使うか、地道に自分で文字コードをチェックしながら検索
するか (Shift-JIS の 2 バイト文字の範囲はググれ)、処理する文字コードを
Shift-JIS 以外のものに変えるしかない
0503デフォルトの名無しさん
2011/10/13(木) 21:09:07.950504デフォルトの名無しさん
2011/10/13(木) 21:18:55.08しかしこんなこともあるのか。覚えておくか・・・
0505デフォルトの名無しさん
2011/10/13(木) 21:27:36.970506デフォルトの名無しさん
2011/10/13(木) 21:30:50.55多分同じ問題にぶつかる
0507デフォルトの名無しさん
2011/10/13(木) 21:34:47.44{
int alpha;
int * pBravo;
const int * pCharlie;
for (size_t i = 0; i < 100; ++i) {
alpha = this->GetAlpha(i);
pBravo = this->GetBravo(i);
pCharlie = this->GetCharlie(i);
// alpha、pBravo、pCharlie それぞれを使用する。
}
}
void Piyo()
{
for (size_t i = 0; i < 100; ++i) {
const alpha = this->GetAlpha(i);
int * const pBravo = this->GetBravoPtr(i);
const int * const pCharlie = this->GetPiyoPtr(i);
// alpha、pBravo、pCharlie それぞれを使用する。
}
}
Hoge()とPiyo()、以下の視点から見て、どっちの方が良いコード?
�@ 最適化を期待した上でより高速に動作すること
�A ソースの綺麗さ(見易さ)
0508デフォルトの名無しさん
2011/10/13(木) 22:25:27.570509デフォルトの名無しさん
2011/10/13(木) 23:02:32.61なんかダメそうに見えるな・・・
>>506を調べておくことにするよ
0510デフォルトの名無しさん
2011/10/13(木) 23:14:34.41これなんかはC#だけど同じような問題だ
「全角半角混在」でぐぐるとたくさん引っかかる
0511デフォルトの名無しさん
2011/10/14(金) 10:29:50.12がstd::mapをpublic継承しています。
ソースはここhttp://www.boost.org/doc/libs/1_47_0/boost/program_options/variables_map.hpp
仮想デストラクタを持たないクラスを
public継承したら危険だと考えていたのですが、
variables_mapのケースはどうなのでしょうか。
boostはレビューがあるし、そう簡単に危険な
コードは入り込まないと思っていますが・・・。
0512デフォルトの名無しさん
2011/10/14(金) 10:42:32.90class CBase {
};
class CSub : public CBase {
};
CBase* pbase = new CSub;
delete pBase;
こういうのがダメなのであって
CSub sub;として使う分にはなんの問題もない
0513デフォルトの名無しさん
2011/10/14(金) 10:59:07.55ありがとうございます。
ということは、variables_mapは
public std::map<std::string, variable_value>* p
= new boost::program_options::variables_map();
delete p;
と使ってはいけないということですね。
使っちゃだめよとドキュメントに書いてあるか要確認ですね。
0514デフォルトの名無しさん
2011/10/14(金) 19:04:29.68謹んでお悔やみ申し上げます。我々は、偉大な逸材を失った
ttp://tech.slashdot.org/story/11/10/13/0328230/dennis-ritchie-creator-of-c-programming-language-passed-away
0516デフォルトの名無しさん
2011/10/14(金) 20:34:05.93不都合な事実が出てき瞬間オワるぞ
0517デフォルトの名無しさん
2011/10/15(土) 00:26:14.880518デフォルトの名無しさん
2011/10/15(土) 00:41:20.95shared_ptrより軽くてコンテナに入れられるスマポが欲しい
0519デフォルトの名無しさん
2011/10/15(土) 00:43:10.620520デフォルトの名無しさん
2011/10/15(土) 08:19:44.26コピーコンストラクタをムーブ的に実装すればなんとか
0521デフォルトの名無しさん
2011/10/15(土) 09:13:55.27できた、ありがとう
auto_ptrってシンタックスの問題でしかなくて、論理的にはコンテナに入れてもいいものだったのね
0522デフォルトの名無しさん
2011/10/15(土) 09:21:30.900523デフォルトの名無しさん
2011/10/15(土) 09:32:54.840524デフォルトの名無しさん
2011/10/15(土) 09:35:37.620525デフォルトの名無しさん
2011/10/15(土) 10:03:29.400526デフォルトの名無しさん
2011/10/15(土) 11:15:57.46だめだろ。
03までのコンテナ周りの実装はコンテナ内の要素の値をコンテナ外やコンテナ内の複数の場所にコピーすることがあるので
コピーでポインタの所有権が移るauto_ptrを入れるとしねるぞ。
0527デフォルトの名無しさん
2011/10/15(土) 11:29:30.790528デフォルトの名無しさん
2011/10/15(土) 11:31:28.65どこの実装よそれ
0529デフォルトの名無しさん
2011/10/15(土) 11:38:29.970530デフォルトの名無しさん
2011/10/15(土) 12:18:09.19VC6時代の糞仕様のことは忘れてください
0531デフォルトの名無しさん
2011/10/15(土) 13:38:13.370532デフォルトの名無しさん
2011/10/15(土) 14:52:35.440533デフォルトの名無しさん
2011/10/18(火) 00:02:23.57コンテナ内の他の要素を指すポインタ無効になりますか?
0534デフォルトの名無しさん
2011/10/18(火) 00:07:39.070535デフォルトの名無しさん
2011/10/18(火) 01:24:00.14unordered_mapの場合、要素への参照は無効にはならない。イテレータは無効になるときがある。
mapの場合、参照もイテレータも無効にはならない。
0536デフォルトの名無しさん
2011/10/18(火) 01:29:36.00参照は無効にならないってのは
どういう実装なんだろう?
0537デフォルトの名無しさん
2011/10/18(火) 01:55:35.72iteraotrは少なくとも次のelementへのiteraotrへのreferenceを持っているのだけれど、
containerにelementsを追加した時に順序的に対象のiteraotrの次のelementに入る場合はそのiteratorは無効になる。
しかし、referenceというのはiteratorのallocateには直接関わりを持たない構造になっている。
iteratorがelementへのpointerを持っていると言えば分かりやすいかな。
だからiteratorが無効になってもreferenceは無効にならないし、elementsを追加する度に
他のelementsもstd::vectorみたいにallocateしなおしになったら大変なコストになるでしょ?
0538デフォルトの名無しさん
2011/10/18(火) 07:23:10.97追加時にその参照を書き換えるから大丈夫なんだけど
unordered_mapだと何が問題なんだろう、と思ってね
0539デフォルトの名無しさん
2011/10/18(火) 07:38:46.840540デフォルトの名無しさん
2011/10/18(火) 08:44:09.90�@そのまま巡回(挿入する値とタイミングによっては、新しい要素が巡回されたりされなかったりする)
�A追加分は別のバッファにとるように書いて巡回の後で追加する(追加した分は巡回しない)
�B�Aと同様だがもう一本バッファを増やして、追加された分も巡回して、新たに追加される要素がなくなるまで繰り返す
0541デフォルトの名無しさん
2011/10/18(火) 08:55:28.47dequeだと参照も無効にならねーか?
0542デフォルトの名無しさん
2011/10/18(火) 10:48:06.53横からだが、ハッシュテーブル自体の参照は無効になっても要素への参照は無効にはならない。
0543デフォルトの名無しさん
2011/10/18(火) 13:30:11.82わかんねぇ・・・
0544デフォルトの名無しさん
2011/10/18(火) 13:33:07.85宿題は宿題スレへ。
60個出力しろって言われたら無理だから、出力する個数についても情報を添えてな。
C/C++の宿題片付けます 152代目
http://hibari.2ch.net/test/read.cgi/tech/1312201995/
0545デフォルトの名無しさん
2011/10/18(火) 13:52:27.020546デフォルトの名無しさん
2011/10/18(火) 14:04:01.06std::vector<int> v(55);
std::iota(v.begin(), v.end(), 1);
std::random_shuffle(v.begin(), v.end(), &std::rand);
for(int i : v) { std::cout << i << std::endl; }
}
こんなんでどうか
0547デフォルトの名無しさん
2011/10/18(火) 15:24:07.07長さ55のブール型の配列作ってn-1で中身がTrueかFalseか比較すりゃ良いだろ
0548デフォルトの名無しさん
2011/10/18(火) 15:25:51.200549デフォルトの名無しさん
2011/10/18(火) 16:05:23.39分からないのは、【�@関数の戻り値にオブジェクトを使う時】【�Aオブジェクトインスタンス化して処理を書く時】の2つです。
まだオブジェクト指向を始めたばかりで、どこを直さないといけないのかさっぱり分かりません。
ソースコードを下に書きますので、よろしければどこが悪いか教えてください。
//モンスター一覧
class MonstersList{
public:
Monster Item(char key); //�@
};
//キーに対応したモンスターを取得する
Monster MonstersList::Item(char key){
Monster objMonster; //�A
return objMonster;
}
//固有のモンスター情報を持つ
class Monster{
public:
int Index;
char Key;
char Type;
char Name;
char Text;
bool GetMonster;
};
0550デフォルトの名無しさん
2011/10/18(火) 16:19:03.50(1):
Monsterクラスが巨大じゃなければ、宣言はそれでいいよ。
場合によっては、Monster Item(char key) const;にすべきだけど。
(2):
これも別にいいんでないかい?
何が問題だと思っているのか知らんが、エラーが起きるならエラーコードを。
0551デフォルトの名無しさん
2011/10/18(火) 16:21:04.34char Name, Text;とか、どんなデータを持つ積もりだよ。
モンスターの名前や情報なら、std::string Name, Text; だろ。
0552デフォルトの名無しさん
2011/10/18(火) 16:22:11.250553デフォルトの名無しさん
2011/10/18(火) 16:27:53.28直さなくて済みそう
0554デフォルトの名無しさん
2011/10/18(火) 17:45:47.36とりあえずエラーコードを書きます。
MonstersClass.cpp
.cpp(6): error C2146: 構文エラー : ';' が、識別子 'Item' の前に必要です。
.cpp(6) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
.cpp(6) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
.cpp(6) : warning C4183: 'Item': 戻り値の型がありません。'int' を返すメンバ関数とみなします。
.cpp(17) : error C2143: 構文エラー : ';' が 'MonstersList::Item' の前にありません。
.cpp(17) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
.cpp(17) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
.cpp(18) : error C2146: 構文エラー : ';' が、識別子 'objMonster' の前に必要です。
.cpp(18) : error C2065: 'objMonster' : 定義されていない識別子です。
.cpp(19) : error C2065: 'objMonster' : 定義されていない識別子です。
>>551,553
お二方の仰る事は正しいんだと思うのですが、
自分の現段階では飲み込むスキルが無いっぽいです。
もうちょっと良く考えます。
0555デフォルトの名無しさん
2011/10/18(火) 17:46:59.950556デフォルトの名無しさん
2011/10/18(火) 17:49:36.84エラーのメッセージを読んで一つ一つ順番に対応すればいいよ
0557550
2011/10/18(火) 17:51:45.01となるのは何が引っかかってるんでしょうか?
0558デフォルトの名無しさん
2011/10/18(火) 17:53:39.66MonsterとMonsterListを書く順番変えてみな
エラーがだいぶ減るから
0559デフォルトの名無しさん
2011/10/18(火) 17:56:10.04おおおおおおおおおお
確かに直りました!
ありがとうございます。
0560デフォルトの名無しさん
2011/10/18(火) 18:35:01.170561デフォルトの名無しさん
2011/10/18(火) 18:44:46.50↓翻訳
この行に宣言されていない型識別子が使用されています。
>>549がまんまソースコードだとしたら、
> Monster Item(char key); //�@
この地点でコンパイラは"Monster"が何か分からない(型名であるかも分からない)ので、上のエラーが発生する。
0562デフォルトの名無しさん
2011/10/19(水) 08:55:23.160563デフォルトの名無しさん
2011/10/19(水) 14:58:58.26bool IsTextStream(std::fstream const & f);
的な関数を作りたいんだけど
0564デフォルトの名無しさん
2011/10/19(水) 16:20:16.210565デフォルトの名無しさん
2011/10/19(水) 16:33:49.03さんくすこ
0566デフォルトの名無しさん
2011/10/20(木) 08:53:28.13具体的には テキストファイルで改行した所までを1文字列として読み込みたい
これをループさせて全ての行の文字列を取ってくる。 みたいな事をしたい
0567デフォルトの名無しさん
2011/10/20(木) 09:12:04.220568デフォルトの名無しさん
2011/10/20(木) 09:35:45.95サンクス!
0569デフォルトの名無しさん
2011/10/20(木) 10:06:32.690570デフォルトの名無しさん
2011/10/20(木) 11:36:36.01getline関数の引数教えてくだしあ。
0571デフォルトの名無しさん
2011/10/20(木) 11:47:45.99つ [std::ifstream::getline()]
0572デフォルトの名無しさん
2011/10/20(木) 12:14:29.380573デフォルトの名無しさん
2011/10/20(木) 14:18:58.34文字列を指定する際の”a"と'a'はどのように使い分けするのが正しいんですか?
0574デフォルトの名無しさん
2011/10/20(木) 14:29:54.530575デフォルトの名無しさん
2011/10/20(木) 18:02:16.40"a" == { 'a', '\0' } == { 61, 0 }
"hoge" == { 'h', 'o', 'g', 'e', '\0' } == { 104, 114, 106, 104, 0 }
0576デフォルトの名無しさん
2011/10/20(木) 18:04:38.12は?
0577デフォルトの名無しさん
2011/10/20(木) 18:06:13.43そういう書き方は出来ない
0578デフォルトの名無しさん
2011/10/20(木) 18:14:27.320579デフォルトの名無しさん
2011/10/20(木) 18:17:57.140580デフォルトの名無しさん
2011/10/20(木) 18:21:19.22'a' -> char型の値
char test = a;
"a" -> char[]型の値
char test[] = "a";
char test[10] = "a";
'abcd' -> char型の値・・・ではない
char型(1バイト)に4文字も入らないのぉ・・・
0581デフォルトの名無しさん
2011/10/20(木) 18:34:05.02もう一文字増やすとコンパイルエラー
規格では処理系定義らしい
こういう仕様だ、と決めてあればどういう値でもいいしコンパイルエラーでもいい
0582デフォルトの名無しさん
2011/10/20(木) 19:08:15.180583デフォルトの名無しさん
2011/10/20(木) 20:35:22.67Yes
0584デフォルトの名無しさん
2011/10/20(木) 22:56:27.36古いCコンパイラとの互換性を考慮したのかね
C++になったときコンパイルエラーで統一してくれてもよかったのに
0585デフォルトの名無しさん
2011/10/20(木) 22:59:53.72まあチャンクコードのような使い方を考えてる可能性もあるけど
(ビッグエンディアンじゃないと意味ないけど)
0586デフォルトの名無しさん
2011/10/21(金) 01:07:37.070587デフォルトの名無しさん
2011/10/21(金) 07:27:24.050588デフォルトの名無しさん
2011/10/21(金) 10:13:03.21VBでいうsplit関数みたいなのは無いですか?
0589デフォルトの名無しさん
2011/10/21(金) 10:21:59.920590デフォルトの名無しさん
2011/10/21(金) 10:43:58.530591デフォルトの名無しさん
2011/10/21(金) 10:58:40.310592デフォルトの名無しさん
2011/10/21(金) 11:08:32.730593デフォルトの名無しさん
2011/10/21(金) 12:04:04.17中身書き換えるから、std::stringだとダメ。
0594デフォルトの名無しさん
2011/10/21(金) 13:03:40.17charは一文字しか入らないから失敗した記憶があるんだが
0595デフォルトの名無しさん
2011/10/21(金) 13:15:41.08前後の空白も切り取りたいって話か?
0596デフォルトの名無しさん
2011/10/21(金) 13:52:51.800597デフォルトの名無しさん
2011/10/21(金) 14:21:28.43http://codepad.org/24QWR6tq
0598デフォルトの名無しさん
2011/10/21(金) 14:33:30.43http://boost.org/libs/tokenizer/tokenizer.htm
0599デフォルトの名無しさん
2011/10/21(金) 20:57:46.61std::list<Derived> derivedList;
std::list<Base> * pBaseList;
std::list<Derived> * pDerivedList;
pBaseList = &baseList;
//pBaseList = &derivedList; // error C2440 �@
//pDerivedList = &baseList; // error C2440 �A
pDerivedList = &derivedList;
�@、�Aはどうやってキャストしたらいい?
0600デフォルトの名無しさん
2011/10/21(金) 21:08:18.170601デフォルトの名無しさん
2011/10/21(金) 21:09:21.590602デフォルトの名無しさん
2011/10/21(金) 21:21:00.48std::list<Base>とstd::list<Derived>は何の関係もない型
0603デフォルトの名無しさん
2011/10/21(金) 21:33:28.510604599
2011/10/21(金) 22:45:12.97リスト要素がポインタだとしても、キャストする方法は無いと考えていい?
typedef std::list<Base *> BaseList;
typedef std::list<Derived *> DerivedList;
BaseList baseList;
DerivedList derivedList;
BaseList * pBaseList;
DerivedList * pDerivedList;
pBaseList = &baseList;
pBaseList = &derivedList; // error C2440
pDerivedList = &baseList; // error C2440
pDerivedList = &derivedList;
// ---
class Hoge {
virtual BaseList * GetList() = 0;
};
class Piyo : public Hoge {
virtual BaseList * GetList() { return &this->list; }
DerivedList list;
}
基本クラスのオーバーライドの戻り値に関して、派生クラスでは戻り値もその派生物を返したいんだけど、どうしたらいいんだろう
0605デフォルトの名無しさん
2011/10/21(金) 23:06:49.22ぶっちゃけポインタを格納するコンテナならreinterpret_castで動くと思うけど保証されない。
0606デフォルトの名無しさん
2011/10/21(金) 23:11:04.89PiyoはBaseListを保持していて、その要素にDerived *を突っ込むのが普通だと思う
0607デフォルトの名無しさん
2011/10/22(土) 22:10:03.25protected:
std::list<Base*> list_;
public:
class iterator {
std::list<Base*>::iterator base_;
public:
iterator(std::list<Base*>::iterator i) : base_(i) {}
Base* operator*(){ return *base_; }
};
iterator begin() { return iterator(list_.begin()); }
};
class DerivedList : public BaseList {
public:
class iterator : public BaseList::iterator {
public:
iterator(std::list<Base*>::iterator i) : BaseList::iterator(i) {}
Derived* operator*(){ return static_cast<Derived*>(BaseList::iterator::operator*()); }
};
iterator begin() { return iterator(list_.begin()); }
};
うーん…
0608デフォルトの名無しさん
2011/10/23(日) 01:43:33.420609デフォルトの名無しさん
2011/10/23(日) 01:52:32.190610デフォルトの名無しさん
2011/10/23(日) 02:03:10.920611デフォルトの名無しさん
2011/10/23(日) 09:18:36.720612デフォルトの名無しさん
2011/10/23(日) 17:52:44.370613デフォルトの名無しさん
2011/10/23(日) 18:28:21.35の時
p = D3DXVECTOR3(0,1,2);
と
p.x = 0; p.y = 1; p.z = 2;
はコンパイラが気を利かせて処理速度的に等価になるのでしょうか?
それとも差が出るのでしょうか?
0614デフォルトの名無しさん
2011/10/23(日) 18:29:22.940615デフォルトの名無しさん
2011/10/23(日) 18:30:51.740616デフォルトの名無しさん
2011/10/23(日) 18:40:00.450617デフォルトの名無しさん
2011/10/23(日) 18:52:14.34その質問をする人が、そんなレベルの最適化さえも必要な程に
高度な要求をされる可能性はごくごく僅かだから、
気にしない方が良いと思う。
0618デフォルトの名無しさん
2011/10/23(日) 20:08:21.210619599
2011/10/23(日) 21:52:45.57>>607
自分でも色々やってみたんだが、どのみち遠回りな実装になってしまう
>>606の言うとおり、素直にコーディングした方が良さそうだなぁ
0620デフォルトの名無しさん
2011/10/23(日) 22:07:45.65前者の方が最適化されやすいと考えていい
D3DXVECTOR3はともかく、ベクトル化を狙ったコードの一部だとしても同様
0621デフォルトの名無しさん
2011/10/23(日) 22:09:49.34616で既出
0622デフォルトの名無しさん
2011/10/24(月) 13:29:16.69知ってた
0623デフォルトの名無しさん
2011/10/25(火) 21:13:02.5264bitでもvolatileとか使って上手いこと動かせる方法ってある?
void Function( double x, double y, double z )
{
double *trivector = &x;
trivector[0]; //x
trivector[1]; //y
trivector[2]; //z
}
0624デフォルトの名無しさん
2011/10/25(火) 21:25:41.070625デフォルトの名無しさん
2011/10/25(火) 21:25:41.51規格無視するならdoubleの引数をスタックに積む関数の呼び出し規約を指定すれば期待通りに動くこともあるだろ
0626デフォルトの名無しさん
2011/10/25(火) 21:29:01.41その分スタック空けた状態で残りを積んでcallだっけ(順番逆だが)
ただし、スタックは16バイト境界に合わせる、と
>>623はムリダナ
0627デフォルトの名無しさん
2011/10/25(火) 22:27:47.390628デフォルトの名無しさん
2011/10/25(火) 23:21:53.430629デフォルトの名無しさん
2011/10/25(火) 23:25:23.800630デフォルトの名無しさん
2011/10/25(火) 23:27:13.780631デフォルトの名無しさん
2011/10/25(火) 23:44:50.5664bitだと使えないんだよな
何でだろ
0632デフォルトの名無しさん
2011/10/25(火) 23:55:19.76コードを直すべき
0633デフォルトの名無しさん
2011/10/26(水) 00:17:20.92virtual Vector Function( double x, double y, double z )
{
return Vector( reinterpret_cast<(*)[3]>( &x ) );
}
そもそもレジスタ渡しになるんだったら、配列への代入コストに気を使う必要もなかったな。
0634デフォルトの名無しさん
2011/10/26(水) 00:32:55.97レジスタからメモリへの代入の方が速いべ
0635デフォルトの名無しさん
2011/10/26(水) 00:48:23.51その関数の場合素直に書くのが一番速いと思うよ
0636デフォルトの名無しさん
2011/10/26(水) 01:02:53.660637デフォルトの名無しさん
2011/10/26(水) 01:26:44.070638デフォルトの名無しさん
2011/10/26(水) 01:45:49.610639デフォルトの名無しさん
2011/10/26(水) 05:44:08.430640デフォルトの名無しさん
2011/10/26(水) 18:23:40.72パスワードを含めたいので、GetObjectみたいのでなくオートメーションで起動したいのですが
これ、http://support.microsoft.com/kb/306686
見たのですが、マクロの起動は不要で、択画面の表示も不要で、Access2010のファイルを起動して自身は終了するだけで良いのですが
どの部分を使ったら良いのか全く分かりません
全くの素人でスミマセン
0641デフォルトの名無しさん
2011/10/26(水) 19:37:58.94つ[ShellExecute()]
0642デフォルトの名無しさん
2011/10/26(水) 19:55:50.40スミマセン、それだとパスワードが渡せないんです
Accessオブジェクトを作って、AccessApplication.OpenCurrentDatabase(引数にパスワード渡せる) メソッドで開かないと
0643デフォルトの名無しさん
2011/10/26(水) 19:59:07.89http://msdn.microsoft.com/ja-jp/library/ff965871.aspx
0644デフォルトの名無しさん
2011/10/26(水) 20:10:42.16スミマセン、DAOやADOでAccessデータベースにデータアクセスするのではなく、アクセスアプリケーションを開きたいんです
0645デフォルトの名無しさん
2011/10/26(水) 22:37:17.93コンパイルエラーで詰まってしまいました。
どうすれば通りますか?
ttp://codepad.org/f10NR3dM
0646デフォルトの名無しさん
2011/10/26(水) 22:44:55.690647デフォルトの名無しさん
2011/10/26(水) 23:04:06.42Singleが完成しないとsingletonが完成しない。
singletonが完成しないとsingletonが完成しない。
以下無限ループ。
関係ないけど、C++なんだからSingletonなんてダサいもんじゃなく、
モノステート使ったら?
モノステート:全てのメンバー変数はstatic、メンバー変数にアクセスする関数は全て非static
0648645
2011/10/26(水) 23:11:41.02ああ、そうか落ち着いて考えたらループしてまね・・・
やはりnewしないとこの形では無理なのですね
モノステートがええですかね、助かりました、ありがとうございます。
0649デフォルトの名無しさん
2011/10/26(水) 23:20:01.120650デフォルトの名無しさん
2011/10/26(水) 23:33:03.41途中の階層で全く使われてなくて下層に渡すだけとかでも?
0651デフォルトの名無しさん
2011/10/26(水) 23:34:44.660652デフォルトの名無しさん
2011/10/26(水) 23:58:09.67通常運転時にデッドウェイトになりすぎてマズイ。
あと固定デバイス関係も引数で引きずると、
高速ループで引数渡しが発生してこっちもマズイ。
ただ、設定とかスレッド間変数をモノステートやら
シングルトンやらにするのはアホ。
0653デフォルトの名無しさん
2011/10/27(木) 00:08:17.42どうするのがいいの?
0654デフォルトの名無しさん
2011/10/27(木) 00:08:36.960655デフォルトの名無しさん
2011/10/27(木) 00:08:42.000656デフォルトの名無しさん
2011/10/27(木) 00:18:44.23よほどの理由が無い限り広域変数を使うもんじゃないのは確かだろ。
せいぜい許されるのは、PCIデバイスを開発する時とか、
割り込み制御するときぐらい。その時でさえstaticにするのに。
b = function( a );
こう呼び出したとき、functionの結果にa以外の何が
影響するかなんて到底想像できん。
下手したら無限ループや、不安定な分岐が発生する。
0657デフォルトの名無しさん
2011/10/27(木) 00:21:03.40この形自体は問題ない。
ただしこの形の場合singletonの中でSingleの(完全な)定義が必要なものを使っていたらだめ。
template<class T> class Base
{
// T t; // だめ
// enum { E = sizeof(T) }; // だめ
T * pt;
T func() { return T(); };
void func2( T t ) {};
};
class Deri: public Base<Deri> {};
int main()
{
Deri d;
return 0;
}
0658デフォルトの名無しさん
2011/10/27(木) 00:24:49.680660デフォルトの名無しさん
2011/10/27(木) 00:27:07.17できれば渡したファイル名の拡張子から自動判断で処理切り変えて抽象化されて纏まっているようなのがいいです
すれ違いだったらすいません
0661デフォルトの名無しさん
2011/10/27(木) 00:30:11.70何を?設定の事か?
設定なら、設定を読み込んだオブジェクトが、
既存の設定対象のプログラムを操作するようにする。
ProcessorA a;
ProcessorB b;
Configuration config;
config.RestoreA( &a );
config.RestoreB( &b );
あくまで設定は本来プログラム内にある値を外部に置いてるだけ。
実処理してる部分は、設定は、プログラム内で定数で渡された値と同様に扱うべき。
実処理が設定部に依存してちゃいけない。
0662デフォルトの名無しさん
2011/10/27(木) 00:32:51.13クロスプラットフォームなのに拡張子でファイルを判断するライブラリは
多分無いと思うぞ。拡張子でファイルを判別するOSはWindowsぐらいだし。
0663デフォルトの名無しさん
2011/10/27(木) 00:37:47.63そうなの?
じゃあファイルの中身見てファイル形式判断して処理切り替えてやってくれるのでいいからない?
0664デフォルトの名無しさん
2011/10/27(木) 00:41:43.620665デフォルトの名無しさん
2011/10/27(木) 00:44:13.96そのどこからでも使われるわけで引数で渡すと面倒なんだけど
0666デフォルトの名無しさん
2011/10/27(木) 00:48:29.850667デフォルトの名無しさん
2011/10/27(木) 00:49:41.540668デフォルトの名無しさん
2011/10/27(木) 00:52:55.170669デフォルトの名無しさん
2011/10/27(木) 00:53:47.640670デフォルトの名無しさん
2011/10/27(木) 00:54:30.65?
0671デフォルトの名無しさん
2011/10/27(木) 00:56:38.590672デフォルトの名無しさん
2011/10/27(木) 00:59:14.460673デフォルトの名無しさん
2011/10/27(木) 01:01:04.770674デフォルトの名無しさん
2011/10/27(木) 01:04:09.44>>665の話を例にざっくり書くとこんな感じ。
TiltlePhase title;
PlayPhase play
EndingPhase winner_ending, loser;
//Bindで次に実行する状態をヒモ付する
title.BindPlay( &play );
play.BindSuccessFinish( &winner_ending );
play.BindSuccessFinish( &loser_ending );
ConfigLoader loader;
ConfigSaver saver;
// 設定の読み込み、書き出しをヒモ付する
loader.Bind( &play );
loader.Bind( &title );
// 他略
saver.Bind( &play );
// 他略
title.BindLoad( &loader );
play.BindSave( &saver );
Driven( &title ); // 初回phaseを指定してゲームの実行を開始する
0675デフォルトの名無しさん
2011/10/27(木) 01:04:47.81main{
Sound snd;
while(1){
mainloop(snd);
}
}
mainloop(snd){
switch(state){
case TITLE:
title_func(snd);
}
}
title_func(snd){
if(...){
some_func(snd);
}
}
some_func(snd){
if(...){
snd->play_se(SE);
}
}
0676674
2011/10/27(木) 01:11:54.76一応修正。
TiltlePhase title;
PlayPhase play
EndingPhase winner_ending, loser_ending;
//Bindで次に実行する状態をヒモ付する
title.BindPlay( &play );
play.BindSuccessFinish( &winner_ending );
play.BindBadFinish( &loser_ending );
0677デフォルトの名無しさん
2011/10/27(木) 01:14:28.47外部ファイルを介してデータを入出力してるようなイメージしか持てないんだが
0678デフォルトの名無しさん
2011/10/27(木) 01:20:04.27いや。まず関数の中に設置されるし。
loader,saverに渡したオブジェクト以外の値はなんら影響はしない。
もっと言えば、広域変数のようなクラスの利用者側が意図していない振る舞いが起きることはない。
0679デフォルトの名無しさん
2011/10/27(木) 01:39:33.35一応一番簡単なDrivenの実装書いて補足しとく。(この短い例はゲームに不向き)
void Driven( Phase *phase )
{
while( phase = phase->Do() );
}
Doを実行すると、phaseがBindXXXで取り込んだオブジェクトの
ポインタを、一つ選んで返す。PhaseのオブジェクトはDoが呼ばれている間、
オブジェクト自身に課せられた課題(Play画面とか)を実行する。
BindXXXXはポインタを取り込むだけで、取り込んだポインタのメンバー関数を呼んだりはしない。
0680デフォルトの名無しさん
2011/10/27(木) 01:40:51.08Sound::play(SE);
と一行書けばいいだけなのになんでそんあ面倒なことするの
としか思えない
0681デフォルトの名無しさん
2011/10/27(木) 01:43:19.210682デフォルトの名無しさん
2011/10/27(木) 01:44:37.000683デフォルトの名無しさん
2011/10/27(木) 01:49:15.91画面と設定値の管理だと思って書いて話が食い違ってた。
余計なこと言ったわ。ごめん。
0684デフォルトの名無しさん
2011/10/27(木) 07:40:39.58起動時設定覚えておけないじゃん
0685デフォルトの名無しさん
2011/10/27(木) 07:56:55.15try {
Framework f ;
f.init(...);
AppMain(f);
}
catch(...) {
if(f)
f.term();
errstr << "fatal err" << endl;
return 1;
}
return 0;
}
void AppMain(framework & f) {
SPScene s(new RootScene);
while(s) {
s->attach(f);
s->run();
s->detach(f)
s = s->getNextScene()
}
}
これでいいじゃん
引数で渡すっていっても毎フレーム律儀に引数で渡す必要はない
0686デフォルトの名無しさん
2011/10/27(木) 08:50:48.39意味がわからんが、loaderは、読み込み指示が
あったときだけ実行される。
読み込んだ値は各種phaseが適切な形で保持する。
0687デフォルトの名無しさん
2011/10/27(木) 13:04:18.05何に向かって言ってるのか分からんけど、
そのやりかだとシングルトンと同じで拡張性がない。
1.Frameworkクラスがシーンより後に定義され、
各シーンが抽象化クラスを通して、
framework に
アクセスしている場合はダウンキャストが必要。
2.Frameworkクラスがシーンの前に定義してある場合は
メンバー追加のたびにFramework を変更するので、
シーンをライブラリ化できない。
更に言えば新しいシーンを追加したとき、
新しいシーンはFramework 以外のオブジェクトを
設定として受け取れない。
0688デフォルトの名無しさん
2011/10/27(木) 13:31:17.850689デフォルトの名無しさん
2011/10/27(木) 13:35:46.87引数ならinline化でコスト減らせるかもしれないけどgetInstanceはその性質上最適化できないよね
0690デフォルトの名無しさん
2011/10/27(木) 18:40:13.73getInstanceに置き換えてるだけだもの
通信とか、複数がありうるけど無制限は許されないときに使うもの
シングルトンて名前がよくないんだな
0691デフォルトの名無しさん
2011/10/27(木) 18:47:48.330692デフォルトの名無しさん
2011/10/27(木) 18:58:23.33良く使われる利用法では1個しか作らないだけで
0693デフォルトの名無しさん
2011/10/27(木) 19:22:15.86複数作る場合はシングルトンもどき
元々デザインパターンってよく使われるのをパターン化したやつだしそんなもん
0694デフォルトの名無しさん
2011/10/27(木) 19:25:26.320695デフォルトの名無しさん
2011/10/27(木) 19:42:41.20カウントして例外投げるほうがわかりやすくていい
数値オーバーフローで例外投げるときと同じ感覚
0696デフォルトの名無しさん
2011/10/27(木) 19:59:17.44それよりもどこからgetobjしても最初のgetobjでだけオブジェクト生成して2回目以降は状態が保存されてることの方がメリットとして大きいと思うんだが
0697デフォルトの名無しさん
2011/10/27(木) 20:13:08.80単なるstatic変数とかでいいんじゃね?
0698デフォルトの名無しさん
2011/10/27(木) 20:32:00.600699デフォルトの名無しさん
2011/10/27(木) 21:00:33.21面白い見方だな
FILE[] はシングルトン?
0700デフォルトの名無しさん
2011/10/27(木) 21:08:34.510701デフォルトの名無しさん
2011/10/27(木) 21:11:05.720702デフォルトの名無しさん
2011/10/27(木) 21:51:02.22シングルじゃねぇー
0703デフォルトの名無しさん
2011/10/27(木) 22:00:25.80_を前につけるのはどんな場合でもダメなんだっけか?
0704デフォルトの名無しさん
2011/10/27(木) 22:01:17.05でも細かい規則を覚えるの面倒だしつけるなら後ろにしてる
0705デフォルトの名無しさん
2011/10/27(木) 22:05:54.76Nullオブジェクトとか、不変オブジェクト。あと状態のないI/O系。
Example *example1 = Null::Instance();
Example *example2 = Null::Instance();
Mode *mode1 = AlphaMode::Instance();
Mode *mode2 = AlphaMode::Instance();
mode2 = BetaMode::Instance();
実体が一つなんで無駄が無くなる。
I/O系は、元々副作用があるから、シングルトンでも
引数渡しでも大して変わらん。
あと、シングルトンをグローバル変数替わりに使うのは間違い。
シングルトンのInstance();を呼び出すのは、他のクラスであれば
コンストラクタを呼ぶタイミングに限らないといけない。
0706デフォルトの名無しさん
2011/10/27(木) 22:11:50.36_+大文字も駄目
_+小文字はグローバル名前空間でだけは駄目
だっけ?
0707デフォルトの名無しさん
2011/10/27(木) 22:14:57.71実は、全大文字変数もだめ。
全大文字はマクロ用だからね。
0708デフォルトの名無しさん
2011/10/27(木) 22:18:26.11そんな規則はねえよ(規格上)
0709デフォルトの名無しさん
2011/10/27(木) 22:25:02.89規格には無いが、禿がマクロ用だから絶対大文字で変数を書くなといってる。
http://www.libjingu.jp/trans/bs_faq2-j.html#constplacement
マクロで変数上書きしても警告でなかったり、エラーにならない事があるからな。
0710デフォルトの名無しさん
2011/10/27(木) 22:26:54.23http://www.libjingu.jp/trans/bs_faq2-j.html#Hungarian
0711デフォルトの名無しさん
2011/10/27(木) 22:30:52.630712デフォルトの名無しさん
2011/10/27(木) 22:36:10.04# undef >>711
#endif
0713デフォルトの名無しさん
2011/10/27(木) 22:38:01.65規格中にもoffsetofとか非予約語小文字マクロが混ざってるのがいたい
まあ自分が書くときは大文字にするけど
0714デフォルトの名無しさん
2011/10/27(木) 23:01:25.540715デフォルトの名無しさん
2011/10/27(木) 23:10:38.510716デフォルトの名無しさん
2011/10/27(木) 23:17:35.930717デフォルトの名無しさん
2011/10/27(木) 23:30:21.260718デフォルトの名無しさん
2011/10/27(木) 23:34:31.920719デフォルトの名無しさん
2011/10/28(金) 00:24:08.61確かに全て大文字はマクロ用として使うのが普通だけど
今は規格の話だ
0720デフォルトの名無しさん
2011/10/28(金) 00:58:16.27ほーれほーれ
int c = (std::min)(a, b);
0721デフォルトの名無しさん
2011/10/28(金) 03:04:49.21#define NOMINMAX
0722デフォルトの名無しさん
2011/10/28(金) 03:28:51.16autoとかラムダ式とかはガチで便利やで?
0723デフォルトの名無しさん
2011/10/28(金) 03:49:56.93VCがC++11にほとんど対応してない以上、仕事としては覚える意味はない。
趣味で何か作ってるなら覚えてると便利。
0724デフォルトの名無しさん
2011/10/28(金) 07:20:20.55stdafx.hいじらせてもらえないんだ・・・
0725デフォルトの名無しさん
2011/10/28(金) 08:11:52.68自分のcppの範囲内だけ有効になるように書いても問題ないよ
0726デフォルトの名無しさん
2011/10/28(金) 20:54:48.58min, maxを#undefするしかない
0727デフォルトの名無しさん
2011/10/28(金) 22:01:09.140728デフォルトの名無しさん
2011/10/28(金) 22:08:44.47シンボルテーブル漁れば取れるっちゃ取れるけど遅い。
ちなみに用途はデバッグ用。
int Function()
{
ScopeTrace tracer;
}
スタック情報を元に関数の開始と終了時点で
ログを出力するクラスを作ったんだが、
呼び出し元の関数がインライン展開されると
呼び出し情報が消しとぶんで、ScopeTrace tracer( Fuction );
ってな感じでアドレスを渡してる。コンストラクターの
アドレス取得だけが手間がかかってひたすら遅い。
0729デフォルトの名無しさん
2011/10/28(金) 22:19:28.570730デフォルトの名無しさん
2011/10/28(金) 22:38:12.06ワレ、いいかげんにせいよ!この糞マイクロが!
と言いたくなる。
0731デフォルトの名無しさん
2011/10/28(金) 22:41:28.06ScopeTraceの呼び出しはインライン化で消し飛んでくれる。
デバッグじゃなく通常モードだと、関数のアドレス代入と
if文2回だけのコストしか掛からないから、それはそれでありがたい。
0732デフォルトの名無しさん
2011/10/28(金) 22:41:57.690733デフォルトの名無しさん
2011/10/28(金) 22:43:35.53コンパイラによって型が違うからだろうけど、
それにしてもやりすぎだよな。WPARAMとかDWORDでいい。
0734デフォルトの名無しさん
2011/10/28(金) 22:50:28.69そうしなくて良い方法について話してるんだが
0735デフォルトの名無しさん
2011/10/28(金) 22:56:18.05構造体や型名が大文字ってのも糞だな。
どういうつもりで命名規則作ったんだろ。あのタコども。
0736デフォルトの名無しさん
2011/10/28(金) 22:57:24.040737デフォルトの名無しさん
2011/10/28(金) 23:00:28.400738デフォルトの名無しさん
2011/10/28(金) 23:02:21.530739デフォルトの名無しさん
2011/10/28(金) 23:03:57.45それだと64bit環境で困っちゃう
>>737
一貫性してていいと思う
でもPINTなどのポインタのtypedefはいらんよね
0740デフォルトの名無しさん
2011/10/28(金) 23:05:46.560741デフォルトの名無しさん
2011/10/28(金) 23:06:50.29で、なんでtypedef int LONGにすりゃいいのにlongが64bitじゃねぇんだよ。
0742デフォルトの名無しさん
2011/10/28(金) 23:20:20.050743デフォルトの名無しさん
2011/10/29(土) 00:10:33.98デフォルトコンストラクタを用意して、後で引数を渡すのが一般的ですか?
それとも何か一発でやる方法が?
0744デフォルトの名無しさん
2011/10/29(土) 00:34:08.310745デフォルトの名無しさん
2011/10/29(土) 00:38:03.39実際配列をデフォルト値以外で初期化する意味もないしな。
やるとしたらテンプレートでラップして初期値を与えるぐらいじゃね。
0746デフォルトの名無しさん
2011/10/29(土) 00:39:37.690747デフォルトの名無しさん
2011/10/29(土) 00:45:51.46fill使えばよくね。
Type *array = (Type*)new char[n];
fill( array, arrray + n, Type( x, y ) );
と思ったが、delete[]でデストラクタがこける気がする。
0748デフォルトの名無しさん
2011/10/29(土) 00:46:49.56大文字で名前統一したいなーっていうのはまだ許せるんだけど
WinMainでいきなりint使ってるるところに怒りを抑え切れない
INT使ってやれよって
0749デフォルトの名無しさん
2011/10/29(土) 00:53:06.55#include <vector>
class hoge { int x, y ; public: hoge(int x, int y) : x(x), y(y) {} } ;
int main(void) {
std::vector<hoge> v;
v.reserve(100);
for(int i = 0; i != 100; ++i)
v.push_back(hoge(i, i));
return 0;
}
0750デフォルトの名無しさん
2011/10/29(土) 02:49:47.19C++11限定なら
ttp://ideone.com/3pGz0
ちなみに03でもこんなことはできたり
ttp://ideone.com/KTWB9
(おっと、ideoneだと不定値にならんな、ローカルで試して)
0752デフォルトの名無しさん
2011/10/29(土) 07:15:50.34指定した行を1行だけ読み込む為の関数って無いですか?
0753デフォルトの名無しさん
2011/10/29(土) 07:52:11.060754デフォルトの名無しさん
2011/10/29(土) 08:05:29.88placement newな
0755デフォルトの名無しさん
2011/10/29(土) 08:42:51.71ないから自作
0756デフォルトの名無しさん
2011/10/29(土) 09:10:05.440757デフォルトの名無しさん
2011/10/29(土) 11:58:25.010758デフォルトの名無しさん
2011/10/29(土) 12:06:06.640759デフォルトの名無しさん
2011/10/29(土) 12:11:04.610760デフォルトの名無しさん
2011/10/29(土) 12:20:42.710761デフォルトの名無しさん
2011/10/29(土) 12:29:20.54TMPで派生クラス全部のサイズとアライン調べて、全部入るストレージを用意
ストレージをラップしてインターフェースを整える
ラップしたクラス内で配置newして返す
ってやれば出来るけどぶっちゃけ高速化をアロケータ−に任せてスマポ返すほうが正解だろうな
0762デフォルトの名無しさん
2011/10/29(土) 12:48:05.02みたいに表現するにはどうしたら良いんですか
0763デフォルトの名無しさん
2011/10/29(土) 12:49:10.34やっぱアロケータ自作か。
0764デフォルトの名無しさん
2011/10/29(土) 12:51:35.05class Order;
class Index:public Order;
class Key:public Order;
Exampe operator[]( const Order& );
0765デフォルトの名無しさん
2011/10/29(土) 13:01:32.22知らない訳はないと思うが、単純にオーバーロードすりゃいいんじゃね。
0766デフォルトの名無しさん
2011/10/29(土) 13:13:40.050767デフォルトの名無しさん
2011/10/29(土) 13:19:25.53traitsでラップすればいい
っておい、利用者はどう使い分けているんだ??
0768デフォルトの名無しさん
2011/10/29(土) 13:21:26.51static_cast<const Index&>( complex_order );
とか
complex_order.To<Key>();
complex_order.To<Index>();
とか
Key &key = complex_order;
Index &index = complex_order;
とか
好きなのを選べ。
0769デフォルトの名無しさん
2011/10/29(土) 16:54:01.56(1) 静的メンバ変数であるunique_ptr<>に、静的メンバ関数instance()内でnewで確保したメモリアドレスを入れる
(2) 静的メンバ関数instance()内で、static変数としてメモリを確保する
これらの実装に何か違いはあるんでしょうか?
あと、速度面では、やはり(2)の方が速いのでしょうか?
ttp://ideone.com/oMMR8
0770デフォルトの名無しさん
2011/10/29(土) 16:57:20.550771デフォルトの名無しさん
2011/10/29(土) 17:07:59.840772デフォルトの名無しさん
2011/10/29(土) 17:09:54.360773デフォルトの名無しさん
2011/10/29(土) 18:08:15.400774デフォルトの名無しさん
2011/10/29(土) 18:32:57.540775デフォルトの名無しさん
2011/10/29(土) 19:08:42.69まず
X xinstance;
では嫌な理由から説明してもらおうか。
0776デフォルトの名無しさん
2011/10/29(土) 19:09:32.46まずSingletonを使わない事を考えろ。
次に、Monostateパターンを検討しろ。
それでもダメなら、本当に実体が一つでないと困るか
クラス図を書いて本気で考えろ。
そうすりゃ、どういう実装にすべきかおのずと決まる。
0777デフォルトの名無しさん
2011/10/29(土) 19:12:40.38newはいらないよ。↓でおk
class Homu : noncopyable {
private: int init_;
private: Homu(void) : init_(0) {}
public: static Homu & Homu::instance(void) { static Homu homu; return homu; }
private: bool Homu::init(void) { ... ; init_ = 1; }
private: bool Homu::term(void) { ... ; init_ = 0; }
public: void func(void) { assert(init_); ... }
friend int main(void) ;
};
int main(void) {
Homu & homu( Homu::instance() );
if(!homu.init()) { msg.puts("error homu::init"); return 1; }
/* main code */
if(!homu.term()) { log.puts("error homu::term"); return 1; }
return 0;
}
0778デフォルトの名無しさん
2011/10/29(土) 19:24:56.21別のシングルトンクラスがある場合に、どの順番でデストラクタが
呼ばれるのかはっきりさせたいんです
終了処理を明示的に記述して、呼び出した方がいいんでしょうか
>>776
どうしてもシングルトンが必要な場合について、教えてくだしあ
>>777
関数ローカルな静的変数ですか…
やっぱりnewするのはC++には合わないんでしょうか
それっぽくまとめてみました
状況によって、最適な実装を選択するしかないんでしょうか
ttp://ideone.com/7CrfO
0779デフォルトの名無しさん
2011/10/29(土) 19:27:32.31場合によるだろ。
あとその組み方あんま良くないね。
未初期化か、初期化済みかは、未初期化を表すオブジェクトと、
初期化済みを表すオブジェクトで表現すべきだ。
bool値で判定するもんじゃない。
0780デフォルトの名無しさん
2011/10/29(土) 19:31:43.19どうしても必要な場合 >>705
0781デフォルトの名無しさん
2011/10/29(土) 19:33:42.37別の引数のコンストラクタを呼び出すことって出来ないのですか?
VC++ 2010 Expressつかっています。
Javaだとそんな書き方したりしますよね?
よろしくお願いします。
0782デフォルトの名無しさん
2011/10/29(土) 19:36:52.000783デフォルトの名無しさん
2011/10/29(土) 19:36:54.380784781
2011/10/29(土) 19:43:21.80即レスありがとうございますっ!
落ち着いて考えると、
他にメソッド用意して両方からそれを呼ぶだけでイイか、
と思ったのですけど、
C++11 で実装されるって事は、あった方が便利って事なんですよね?
継承とか使ってると無いと不便になるんでしょうか?
0785デフォルトの名無しさん
2011/10/29(土) 19:49:14.02そもそもシングルトンじゃなければ使う側で同じ関数内やクラス内に
変数の定義を並べるなどするだけで順番を確定できるのに。
その状況でさらにシングルトンを増やすとか、何がしたいのか。
0786デフォルトの名無しさん
2011/10/29(土) 19:53:57.060787デフォルトの名無しさん
2011/10/29(土) 19:58:10.37>未初期化か、初期化済みかは、未初期化を表すオブジェクトと、
>初期化済みを表すオブジェクトで表現すべきだ。
>bool値で判定するもんじゃない。
???
0788デフォルトの名無しさん
2011/10/29(土) 20:13:52.87最初はそうしていたんですが、シングルトンにしろと
叩かれてしまいまして…
たぶん皆さん基本的に、static領域に確保するんだと思います
ただ、タイミングを指定してデリートできるようにするには、
やっぱり生ポインタしか駄目なんでしょうか?
できるだけ、例外安全に実装したいのですが…
あと、メモリの確保についてなんですが
○スタックに確保
○ヒープ/フリーストアに確保
○静的領域に確保
速度的にどれくらいの差があるんでしょうか?
スタック >> 静的領域 > ヒープ/フリーストア
みたいな感じになるんでしょうか?
0789デフォルトの名無しさん
2011/10/29(土) 20:20:15.530790デフォルトの名無しさん
2011/10/29(土) 20:20:36.08class Device
{
PhisicalDevice *core;
Device(void){DeviceUpdate(NULL)}
public:
void DeviceUpdate( PhisicalDevice *device )
{
if( device )
core = device;
else
core = NullDevice::Object();
}
static Device *Object()
{
static Device object;
return &object;
}
/* 他メンバー */
};
0791デフォルトの名無しさん
2011/10/29(土) 20:29:45.70> 最初はそうしていたんですが、シングルトンにしろと
> 叩かれてしまいまして…
どういう理屈で叩かれたのか、気になる。
0792デフォルトの名無しさん
2011/10/29(土) 20:29:56.32異なるクラスのデストラクタで、順序に依存するリソース解放を行っているんです
1つのクラスに統合できればいいんですが、それだとカプセル化が壊れる…
こっちを取ると、あっちが立たない状態なんです
外部でデリートされる可能性があっても、スマポ管理のシングルトンを
注意して使えば、例外安全だしおkかな。。
0793デフォルトの名無しさん
2011/10/29(土) 20:30:37.40ヒープは確実に遅いが、スタック領域と静的領域どっちが速いのかは用途による。
単純な変数ならスタックが一番早い。
0794デフォルトの名無しさん
2011/10/29(土) 20:31:55.01コードを上げてみ。
0795デフォルトの名無しさん
2011/10/29(土) 20:32:55.38一般的にはこんなもんかね?
静的確保(実行時コスト0)>スタック(レジスタ減算)>>>フリーストア
初期化も含めれば割合的にどうでもよくなってくるし、起動時に済ませるんなら
なおさらどうでもいいと思うけど。
0796デフォルトの名無しさん
2011/10/29(土) 20:34:32.79> 1つのクラスに統合できればいいんですが、それだとカプセル化が壊れる…
どういうことなの・・・
0797デフォルトの名無しさん
2011/10/29(土) 20:36:33.02メンバ初期化子使ってると、メソッド用意しても無駄だからね
0798デフォルトの名無しさん
2011/10/29(土) 20:39:51.98他の開発者が誤ったコード書いても、致命傷にならないクラス設計してね、みたいな…
>>793
静的領域にメモリ確保した方が、newするよりも断然速いんですね。。
スタックが一番速いのは聞いたことあったんですが、
ヒープと静的領域の速度差がよく分からなかったんです
静的領域へのメモリ確保って、結構速いんですね。ありがとうございます
0799デフォルトの名無しさん
2011/10/29(土) 20:43:22.29クラススコープの初期化の方がいい。
>>795
staticは大概レジスタに乗らないから、
スタックの方が速いべ。
まぁこの辺気にするぐらいだったら、
アルゴリズムをどうにかすべきだが。
0800デフォルトの名無しさん
2011/10/29(土) 20:44:49.03まあ多すぎるとメモリが足りないとプログラムロードに失敗するという問題もあるけど
よほどでかい配列作らない限りは大丈夫だと思われ
0801デフォルトの名無しさん
2011/10/29(土) 20:45:00.14ローカルクラスみたいになってんの
0802デフォルトの名無しさん
2011/10/29(土) 20:45:38.27意図的に終了処理の逆順でオブジェクトを生成するか、
終了処理を自前で書くか、だな
終了処理を実行する関数をオブジェクト生成時にatexitで登録しておけば
main終了後に勝手に終了処理してくれる
(クラスAとBで両方同じ関数を登録するので、二度呼ばれても大丈夫なように作る必要はある)
0803デフォルトの名無しさん
2011/10/29(土) 20:50:09.78修正して、クラス外でのインスタンス削除を禁止できないものでしょうか…
外部での削除を禁止したいので、デストラクタはprivateにするしかない
でもそうすると、スマポのデリータークラスが削除できない
といって、フレンドを設定すると、意図した用途で削除はできるけど
外部で同じスマポから削除されると、二重デリートになる…
これは詰んだかOTL
0804デフォルトの名無しさん
2011/10/29(土) 20:50:21.74Singletonは、ガワだけにして本体を外に出せ。
そうすりゃ順番制御なんていくらでもできる。
int main()
{
RealTypeA instanceA;
RealTypeB instanceB;
Singleton *object = Singleton::Object();
object->ChangeInstanceA( &instanceA );
object->ChangeInstanceB( &instanceB );
}
てか、その前にSingletonはヤメロ。せめてMonostateにしろ。
0805デフォルトの名無しさん
2011/10/29(土) 20:51:43.26ポインタじゃなく参照で返せばdeleteするバカは減るだろ。
0806デフォルトの名無しさん
2011/10/29(土) 21:02:39.91>>802
自前で終了処理を書くことにします。
そもそも、関数ローカルな静的変数を使って実装した時点で、デストラクタの
呼び出し順がはっきりせず、Javaと似た状況になるんですから
Javaと同じように終了処理関数を明示的に呼ぶのが適切なんでしょうね
あと、関数ローカルな静的変数なんですが
メモリ確保…プログラムのロード時
コンストラクタ実行…変数宣言に制御が移った時
でいいんでしょうか?
基本は、大域変数と同じで、コンストラクタ実行が遅延される、という理解ですよね
0807デフォルトの名無しさん
2011/10/29(土) 21:14:11.45ttp://ideone.com/Tj1BA
メモリ確保がロード時に行われるのかどうかは、確かめる術がないのであきらめますOTL
みなさん、アドバイスありがとうございました
0808デフォルトの名無しさん
2011/10/29(土) 21:17:00.54少し遅くなるけど事故るよりマシだから気にしない
0809デフォルトの名無しさん
2011/10/29(土) 21:19:42.64シングルトン<モノステートの理由は?
0810デフォルトの名無しさん
2011/10/29(土) 21:25:10.740811デフォルトの名無しさん
2011/10/29(土) 21:33:00.941.Singletonは実体が1つである必要がある場合に使うものだから。
今回の質問者の言っているようなケースは大概そう用途じゃない。
2.モノステートは、見た目は他のクラスと全く変わらないため、
テンプレートやらで扱いやすい。
3.上の理由によりnew,deleteも自然に可能。
4.呼び出し地点を観測できる。コンストラクタ、
デストラクタで参照カウントとかも可能。
5.必要に応じ呼び出し側に合わせて制御もできるので
整合性を取りやすい。
0812デフォルトの名無しさん
2011/10/29(土) 21:51:37.16ある関数で正常に処理された場合は戻り値にオブジェクトを、
処理に以上が発生した場合などにはNULLか何かを返したいのですが、
return NULL;とすると"オブジェクトの型ではないから駄目"みたいなエラーがでます。
こういった場合はどうしたら良いか教えてください。
0813デフォルトの名無しさん
2011/10/29(土) 21:55:53.380814デフォルトの名無しさん
2011/10/29(土) 22:05:17.350815デフォルトの名無しさん
2011/10/29(土) 22:10:52.280816デフォルトの名無しさん
2011/10/29(土) 22:12:42.750817デフォルトの名無しさん
2011/10/29(土) 22:15:12.44その関数の戻り値はポインタ型だよね?
0818デフォルトの名無しさん
2011/10/29(土) 22:18:29.83なるへそ
0819デフォルトの名無しさん
2011/10/29(土) 22:18:38.22例外は今ひとつ好くわかんないんですが
これから勉強しようと思います。
>>817
いえ、ポインタ型ではなくクラスの型(?)にしています hogeClass a(){} 見たいな感じです。
0820デフォルトの名無しさん
2011/10/29(土) 22:21:52.08if (!flag) {
return NULL;
}
}
↓
hogeClass * a() {
if (!flag) {
return NULL;
}
}
こうしてみ
0821デフォルトの名無しさん
2011/10/29(土) 22:22:53.30ポインタじゃなけりゃNULLは返せん。
例外が導入された理由の一端でもある。
0822デフォルトの名無しさん
2011/10/29(土) 22:24:33.28無理にNULLで返すようにさせるなよ。
>>819は例外のことすら知らんレベルだし。
どうしてもNULLで返さなきゃいけない理由を持ってないんだから。
0823デフォルトの名無しさん
2011/10/29(土) 22:25:11.36bool func(type & buff);
0824デフォルトの名無しさん
2011/10/29(土) 22:25:42.12NULL は hogeClass に変換できない
戻り値の型は hogeClass だが、NULL の型は hogeClass * だから
0825812
2011/10/29(土) 22:30:40.76参考にさせてもらって修正をかけたいと思います。
0826デフォルトの名無しさん
2011/10/30(日) 21:09:24.81std::mapのキーをintで使ってたのだけど、これをlistにしたら何か変わるかな?
0827デフォルトの名無しさん
2011/10/30(日) 21:16:08.71比較に時間が掛かるのですごく遅くなりそう
0828デフォルトの名無しさん
2011/10/31(月) 07:34:28.990829デフォルトの名無しさん
2011/10/31(月) 08:18:50.39数や目的にもよるけど、
基本読み出し計算量オーダーがO(logN)からO(N)になる
0830デフォルトの名無しさん
2011/10/31(月) 11:28:26.65標準コンテナにはoperator<が最初から定義されている
0831デフォルトの名無しさん
2011/10/31(月) 17:03:03.67void * p(NewData()) ;
if(p) { DeleteData(p) ; }
これがコンパイラに再配置されて
void * p(NewData()) ;
std::vector<char> v(100) ;
if(p) { DeleteData(p) ; }
こうなって
v(100)でbad_alloc、pがリーク
なんていう現象って起こりうるんですか?
0832679
2011/10/31(月) 17:18:01.03レスありがとう。詳細を調べるのがラクになりました。
もうひとつお願いします。
namespace A
{
class Class B
{
static 型 hoge();
}
namespace D
{
型 hoge();
}
}
という感じのメソッドhoge()があるのですけど、何を意図してこういうつくりにするかわかります?
「静的クラスメソッドと名前空間指定した関数と」なんですけど、違いがわからない。
「どちらにするか」というルールが途中で変わって、片方は後方互換性のために残ったという感じが予想されますか?
それとも「静的クラスメソッドと名前空間指定した関数と」で用途が違いますか?
0833679
2011/10/31(月) 17:19:34.59namespace A
{
class Class B
{
static 型 hoge();
}
namespace D
{
型 hoge();
}
}
0834デフォルトの名無しさん
2011/10/31(月) 17:36:00.73そのソースの意図はわからないけど
クラスの静的メンバ関数はそのクラスの非publicなメンバにもアクセスできるので普通の関数とは別物
0835832-833
2011/10/31(月) 17:51:04.76本当に申し訳ないです。
「静的関数はpublicです」と書くのを忘れて、もう一回投稿するかしないか迷ってしませんでした。
おっしゃるとおりで、「private static メソッドである」且つ「static フィールドにアクセスしている」ならわかるんですよね。
ソースを追ってみると、プライベートのフィールドにアクセスしていなくて、
結局「namespace D」のfoo()に合流していました。
オーバーロード関数がたくさんあったので、まとめるのに時間がかかりました。
ここまで確認してから投稿すべきでした。申し訳ない…。
0836832-833
2011/10/31(月) 17:52:38.88○「private static フィールドにアクセスしている」
0837832-833
2011/10/31(月) 17:53:40.68○「public static メソッドである」
落ち着け、俺!
0838679
2011/10/31(月) 21:18:27.97あと、静的関数メンバーは、staticに限らず
オブジェクトの変数を操作できる。
言ってしまえばfriend関数と同じ。
普通は静的変数を弄るよりこっちの用途の方が多いと思う。
class Base
{
protected:
virtual int Value(void) const {return 0;}
static int PeekValue( const Base &base )
{
return value();
}
};
class Derived:private Base
{
public:
void Example( const Base &base )
{
std::cout << PeekValue( base ) << std::end;
}
};
0839デフォルトの名無しさん
2011/10/31(月) 21:23:45.93class Base
{
protected:
virtual int Value(void) const {return 0;}
static int PeekValue( const Base &base )
{
return base.Value();
}
};
0840デフォルトの名無しさん
2011/10/31(月) 22:37:31.92typedef char One;
typedef struct { char dammy[2]; } Two;
template< typename C > static One test( int C::* );
template< typename C > static Two test( ... );
public:
enum { Yes = sizeof( IsClassType< T >::test< T >( 0 ) == 1 };
enum { No = !Yes };
};
ありがとう static 関数。
0841832-833
2011/10/31(月) 22:40:22.73レスありがとうございます。
まず、>>638を名乗ったこと、申し訳ないです。
落ち着きがありませんでした。678は、「Boost総合スレ part9」で書き込んだ残骸です。
理解出来ました。
protectedは、意味は知っていたのですが、使ったことがなかったので教示いただいた用途は思いつきませんでした。
ありがとうございます。
0842デフォルトの名無しさん
2011/11/01(火) 01:46:04.10結果が変わるような最適化は基本的に許されない。
一部のオブジェクトのコピーは例外。
ただし未定義動作に踏み込んでしまえばこういった点も含めて
何の保証もなくなる。
0843デフォルトの名無しさん
2011/11/01(火) 07:23:49.89準拠率やコンパイラのバグを考えると
あらゆる事に保証が無い事に気付く
0844デフォルトの名無しさん
2011/11/01(火) 11:45:13.83LoadImage関数で読み込む方法を教えてください。
それと、LoadImage関数でBITMAPを取得したら背景透過は消えるのでしょうか?
合わせて教えてください。
↓躓いている部分
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"Test.png",IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);
0845デフォルトの名無しさん
2011/11/01(火) 11:51:15.43これの前半にある画像を左右に揺らすPGって結構簡単?
0846デフォルトの名無しさん
2011/11/01(火) 11:56:22.76> >>838
> レスありがとうございます。
> まず、>>638を名乗ったこと、申し訳ないです。
> 落ち着きがありませんでした。678は、「Boost総合スレ part9」で書き込んだ残骸です。
> 理解出来ました。
> protectedは、意味は知っていたのですが、使ったことがなかったので教示いただいた用途は思いつきませんでした。
> ありがとうございます。
>638と名乗ったのか>678と名乗ったのか>679と名乗ったのか知らんが、兎に角落ち着けw
0847デフォルトの名無しさん
2011/11/01(火) 11:58:22.28環境依存OKのスレか、WinAPIのスレへでも。
つーか、LoadImage()とやらはPortableNetworkGraphics画像フォーマットに対応しているのか?
0848デフォルトの名無しさん
2011/11/01(火) 12:00:35.22分かりました。
そっちへ行ってみます。
0849デフォルトの名無しさん
2011/11/01(火) 13:26:22.26try
{
char * p = new char [k256Mega];
delete [] p ;
return true ;
}
caych(...)
{
return false ;
}
でわかるけど、速度が足りてるかどうかってどうやってしらべるべき?
正確でなくて大雑把でいいんだけど、行列計算とかではかるのかな
0850デフォルトの名無しさん
2011/11/01(火) 14:17:18.58いいえ。
0851デフォルトの名無しさん
2011/11/01(火) 14:41:17.60クラス自身のメンバ関数にする方法(引数は1つ)と、
グローバルなフレンド関数にする方法(引数は2つ)があるようですが、
この2つはどのように使い分けるものなのでしょうか?
0852デフォルトの名無しさん
2011/11/01(火) 15:25:55.66自分自身と比較する時はメンバーに持ってもいいが、operator<<みたいに
std::streamみたいな別のクラスも引数に取る時はフレンドにするしかない
それから叙述関数にする時はフレンドにしないとそもそも呼び出せない
0854デフォルトの名無しさん
2011/11/01(火) 17:56:20.65でもフレンドでしか出来ない場合もあるという事
メンバ関数で出来るものはメンバ関数でした方がいいに決まってる
0855デフォルトの名無しさん
2011/11/01(火) 18:18:44.100856デフォルトの名無しさん
2011/11/01(火) 19:41:52.47メモリは実際に書き込みが行われるまで確保されない。
OSの割り込み監視対象になるだけ。
0857デフォルトの名無しさん
2011/11/01(火) 19:46:12.57グローバルのoperatorでそれを呼び出す手もある。
意外とこっちの方が便利。
0858デフォルトの名無しさん
2011/11/02(水) 06:38:57.34メモリリークするのがどうしてなのかさっぱりわからないです。
逆にデタッチするとヒープにある何が開放されるのですか?スレッド自体はデタッチしても動き続けられますよね?
0859デフォルトの名無しさん
2011/11/02(水) 07:05:18.66複数ファイルからなるプログラムを作成しているのですが、
各ファイルでincludeするのが面倒なので、
ひとつのヘッダーファイルにincludeするヘッダーを全て記述して、本体ファイルたちはこのファイルのみincludeしてます。
なんかコンパイルがすごく遅いんですけど、どうしてでしょうか?
件のヘッダーファイルは、複数回読まれないように#pragma onceしているのですけど…。
0860858
2011/11/02(水) 07:57:42.52自己解決しました。
スレッドに関する情報を格納した構造体が、用意されて、スレッドを生成したときの変数はそれを参照してるのですね。
変数自体が情報を記録する構造体だと思っていました。
だから、呼び出し元の変数がスコープから外れて開放されても、ヒープにあるものは開放されないと。
pthreadのマニュアルみてたら、pthread_self()を見つけたのですけど、自分を指すってどういうことです?
スレッド起動時に用意される新しいスタックの一番下にスレッドに関する情報(か、それへのポインタ)がとられていて、そこを参照しているとか?
0861デフォルトの名無しさん
2011/11/02(水) 08:07:54.21ソースコード度に全てのヘッダーを取り込んでるから。
インクルードガードが効くのは個々のソースの中だけ。
0862デフォルトの名無しさん
2011/11/02(水) 10:45:28.82特定環境の話題は環境依存スレへ。
0863デフォルトの名無しさん
2011/11/03(木) 11:19:20.530864デフォルトの名無しさん
2011/11/03(木) 11:25:56.750865デフォルトの名無しさん
2011/11/03(木) 11:40:54.010866デフォルトの名無しさん
2011/11/03(木) 13:24:16.22public:
shared_ptr<Piyo> GetPiyo() { return pPiyo; } // 1
shared_ptr<Piyo> & GetPiyo() { return pPiyo; } // 2
private:
shared_ptr<Piyo> pPiyo;
};
1と2、どちらの使用方法がより正しいですか?
0867865
2011/11/03(木) 13:26:12.24誤:shared_ptr<Piyo> & GetPiyo() { return pPiyo; } // 2
正:const shared_ptr<Piyo> & GetPiyo() { return pPiyo; } // 2
0868デフォルトの名無しさん
2011/11/03(木) 13:26:36.700869デフォルトの名無しさん
2011/11/03(木) 13:28:04.800871デフォルトの名無しさん
2011/11/03(木) 14:34:25.920873デフォルトの名無しさん
2011/11/03(木) 15:10:57.51普通に生ポ返せばよくね?
パフォーマンスが気になるほどgetしないなら別にコピーしてもいいと思うけど
0874デフォルトの名無しさん
2011/11/03(木) 15:18:09.010875デフォルトの名無しさん
2011/11/03(木) 15:28:42.37一般的に
参照を返すと、内部に実体を持っている(その後も持ち続ける)ことが必要になってしまう。
コピーを返すようにしておけばそんなことはなくて、そのぶん実装が自由になる。
実際にどの程度の差になるかは場合によるんだけど。
0876デフォルトの名無しさん
2011/11/03(木) 15:51:33.50保持してしばらく使うが、無くなったら無くなったで良いものとする(無くなった事の検出は必要) → weak_ptr
完全に共有する → shared_ptr
いずれにしても参照は使わない(使ったら意味が無い)
あと循環参照には気をつけれ
0877デフォルトの名無しさん
2011/11/03(木) 16:49:31.290878デフォルトの名無しさん
2011/11/03(木) 17:40:49.14ハンドルを公開するのは保険として必要なんだよね
0879デフォルトの名無しさん
2011/11/03(木) 18:16:20.220880デフォルトの名無しさん
2011/11/03(木) 18:20:15.20・抽象化クラスは値返しできない。
・かといってnewするのはコストが大きすぎる。
・受け取るときにコピーすりゃ十分。
そういう時は、static変数を参照で返す手もある。
ただし、関数実行後、コピー前にその関数が呼ばれるとマズイので
関数呼び出しに側に配慮を求める必要がある。
0881デフォルトの名無しさん
2011/11/03(木) 18:40:32.690882デフォルトの名無しさん
2011/11/03(木) 18:52:35.53たとえば数値のintやfloatで大小を比べるhikaku<int>(a,b)やhikaku<float>(a,b)とつかうものに
hikaku<char *>(a,b)などとやられる可能性もありますよね?
オーバーロードで書いたほうがそれしかできないためわかりやすいと思うのですが
0883デフォルトの名無しさん
2011/11/03(木) 19:02:22.58template <> hkaku< char * >( a,b ) { fおちんぽだいすきじゅぽじゅぽ(); }
とでもやっておけばSFINAE原則によりchar*で呼び出せなくなる。
0884デフォルトの名無しさん
2011/11/03(木) 19:02:57.360885デフォルトの名無しさん
2011/11/03(木) 19:03:21.38別の設計に変えるほうがいいんですか?
0886デフォルトの名無しさん
2011/11/03(木) 19:08:20.690887デフォルトの名無しさん
2011/11/03(木) 19:09:22.88なんでダメやねん。返してええねん。
メモリ確保に失敗した場合とかヌルポ返さんでどうすんねん。
0888デフォルトの名無しさん
2011/11/03(木) 19:12:25.190889デフォルトの名無しさん
2011/11/03(木) 19:23:36.25そういうケースは例外返せよ。
NULLを登録したものから、
NULLが取り出せる事は問題ない。
そういうケースならNULL返せばいい。
0890デフォルトの名無しさん
2011/11/03(木) 19:29:40.21スマポじゃ共変の型を使えんぞ。
0891デフォルトの名無しさん
2011/11/03(木) 19:45:21.47例外はほんとうに例外の時以外は返してはいけない。
0892デフォルトの名無しさん
2011/11/03(木) 19:48:12.560893デフォルトの名無しさん
2011/11/03(木) 19:49:21.54正しい値を返せなきゃ例外事項だ。
禿のQA読め。
0894デフォルトの名無しさん
2011/11/03(木) 19:50:47.40nullptrは正しい値。
0895デフォルトの名無しさん
2011/11/03(木) 19:51:40.30こう書いてまともに動かないなら例外事項。
FunctionA(FunctionB());
0896デフォルトの名無しさん
2011/11/03(木) 19:54:14.77「ほんとうに例外の時」って、客観的に判断できるの?
0897デフォルトの名無しさん
2011/11/03(木) 19:55:50.28例外でもぬるぽでも強制終了でも、それぞれに正当な理由がある。
0898デフォルトの名無しさん
2011/11/03(木) 19:56:39.72逆に、客観的に判断できないとき、返却値の定義がおかしくないか疑う
0899デフォルトの名無しさん
2011/11/03(木) 19:57:15.62cross = InnerProduct( line1, line2 ) + direction;
ってなオブジェクトを組み合わせた数式から簡潔にエラーを
綺麗に取り出す意味がある。もしoperator + がNULLなんかだしたら、
とんでもないことになる。あと、nullptrは基本的に初期化や代入用。
0900デフォルトの名無しさん
2011/11/03(木) 19:58:31.23C#ではbreakができて便利だった
breakが出来ないなら価値が半減する
0901デフォルトの名無しさん
2011/11/03(木) 19:59:09.09メイヤーの方がずっと偉いし、はるかに正しい。
愚者は経験に学ぶ、賢者は歴史(すなわち書籍)に学ぶ。
0902デフォルトの名無しさん
2011/11/03(木) 20:00:25.350903デフォルトの名無しさん
2011/11/03(木) 20:03:07.57BOOST_FOREACHつかえば?
0904デフォルトの名無しさん
2011/11/03(木) 20:20:17.00つまり「ほんとうに例外の時」=「返却値の定義に従えない時」ってこと?
0905デフォルトの名無しさん
2011/11/03(木) 20:36:29.91エラーが発生したら、NULLで値返して、エラー内容をerrnoに記述する関数書くんだろうよ。
0906デフォルトの名無しさん
2011/11/03(木) 20:39:46.770907デフォルトの名無しさん
2011/11/03(木) 20:49:38.72ただ、例外が発生した時点で、望んだ計算結果が得られないんだから、
速度なんて0.1秒以上止まるとかじゃなきゃ問題ない。
1フレームが何ミリ秒とかいってる世界で、例外が発生してもなお
処理を継続するなんてことはまず無いだろ。処理を放棄して
再試行をユーザーに問い合わせるぐらいだ。
0908デフォルトの名無しさん
2011/11/03(木) 20:52:24.820909デフォルトの名無しさん
2011/11/03(木) 20:56:41.84まあtryもコスト0ではないけど、以上に細かくtry書かなきゃ大したことは無い
0910デフォルトの名無しさん
2011/11/03(木) 20:57:09.450911デフォルトの名無しさん
2011/11/03(木) 20:57:53.81正しい値を返せる、または、戻り値が重要ではない場合は例外を返すべきじゃないな。
0912デフォルトの名無しさん
2011/11/03(木) 21:00:13.87ご自由にどうぞ。4GBメモリと500GB以上のストレージが一般的になっても、
200KB程度の増加が気になって仕方ないんなら使わないのも一つの手だ。
0913866
2011/11/03(木) 21:03:12.89レスありがとう
とりあえず素直に値返ししておきます。
まず非const shared_ptrを返そうとしている理由ですが、これはMCを使いたいからです。
次になぜ参照を返そうとしているかですが、これは単純にパフォーマンス上の理由です。
BOOST_SP_DISABLE_THREADSを使わないとこのコピー動作がボトルネックになりかねる重さだったと覚えているのでそうしました
0914デフォルトの名無しさん
2011/11/03(木) 21:07:12.79そんな環境じゃないし。なんでPC前提なんだよ
0915デフォルトの名無しさん
2011/11/03(木) 21:07:18.89呼び出し元がメモリ管理していて、呼び出し先がメモリ確保に失敗した時
一旦 NULL 返して、呼び出し元がいらないオブジェクト削除するとかメモリ
整理して再び呼び出す場合とかかな
0916デフォルトの名無しさん
2011/11/03(木) 21:14:32.69どれぐらい膨らむのが問題なの?
0917デフォルトの名無しさん
2011/11/03(木) 21:18:12.364MBしかメモリない
0918デフォルトの名無しさん
2011/11/03(木) 21:20:25.95へぇ。
で、例外使うとどれぐらい膨らむの?
何%とか、何KBとか。
0919デフォルトの名無しさん
2011/11/03(木) 21:21:18.22800KB
0920デフォルトの名無しさん
2011/11/03(木) 21:22:20.80そういうケースなら例外扱いだわ。
尤も、関数がNULLを返す前に、
メモリーアロケーターが通常のメモリ確保に
失敗した時点で、解放ハンドラを起動して
メモリーの確保に務めるべきだろうし。
それでも確保できないなら、メモリアロケーター内部から例外で抜ける。
ハンドラの呼びかけでメモリーを確保出来たなら、
メモリーを使用する関数はNULLなんざ返さなくても処理を
続行できる訳だし。
0921デフォルトの名無しさん
2011/11/03(木) 21:22:29.470922デフォルトの名無しさん
2011/11/03(木) 21:23:42.99だから、そういう環境なら使わないのは自由だって。
0923デフォルトの名無しさん
2011/11/03(木) 21:25:59.71おめーが勝手にPC前提で決めつけた癖に何いってんだ
0924デフォルトの名無しさん
2011/11/03(木) 21:26:08.71なるほど。そりゃキツいな。
ちなみにコンパイラの情報をもらえるとうれしい。
gcc ならバージョンがいくつだとか。
0925デフォルトの名無しさん
2011/11/03(木) 21:31:04.68気になるんなら自由だって書いたじゃん。引きずんなよ。
0926デフォルトの名無しさん
2011/11/03(木) 21:37:31.64その時に解放できるオブジェクトをメモリアロケータが知らない時(という場合が多いと
思うんだけど) はどうするの?
0927デフォルトの名無しさん
2011/11/03(木) 21:38:28.27特定のハード構成を一般的と言い切る御仁の、○○程度の××という皮肉を飲まないと、そう読めない
どこの馬の骨とも知らんやつに、何でそんな侮辱をされにゃならんのだ
0928デフォルトの名無しさん
2011/11/03(木) 21:50:58.78今回問題になってる場所以外でも、他にどこでアロケーターを
使って確保したか解ってるんでしょ?
それに、アロケーターを使った場所は、メモリーがいつになったら
不要になるか知ってるんでしょ?
だったら、不要かどうかは判断できる筈じゃん。
Allocator allocator; //内部のstatic変数と関数でoperator newと繋がってる。
//contextが無効になったらtargetの解放処理を呼ぶ。
allocator.RegisterHandler( new MemoryHandler( context, target ) );
0929デフォルトの名無しさん
2011/11/03(木) 21:52:03.49その程度が嫌なら肥溜めに書き込むなよw
0930デフォルトの名無しさん
2011/11/03(木) 21:53:56.250931デフォルトの名無しさん
2011/11/03(木) 22:08:58.22おまえらのクソみたいな議論は無意味なんだよw
0932デフォルトの名無しさん
2011/11/03(木) 22:09:01.63そもそも例外なんて実装してあるのか?
0933デフォルトの名無しさん
2011/11/03(木) 22:12:22.33ドヤ顔で書き込んでいるが、
えらいのはメイヤーであってお前ではないからな?
0934デフォルトの名無しさん
2011/11/03(木) 22:14:17.68いちいち揚げ足とらんで煽らんでもよろし
0935デフォルトの名無しさん
2011/11/03(木) 22:18:45.00http://japan.renesas.com/products/tools/coding_tools/compilers_assemblers/sh_compiler/child_folder/sh_compiler_components_child.jsp
そもそも gcc が使えるしな。
0936デフォルトの名無しさん
2011/11/03(木) 22:23:01.82これを符号なしの形で保管し、必要とあれば符号つきに戻したいのですが
単に符号つき整数を同じビット数の符号なし整数にキャストし
それをまた同じビット数の符号つき整数にキャストした場合
元の数値への復元は仕様で出来ると保証されますか?
0937デフォルトの名無しさん
2011/11/03(木) 22:32:40.43保証されません。
2つめの符号つき整数への変換が実装依存となる場合があります。
4.7 p3
> If the destination type is signed, the value is unchanged if it can be represented in the destination type (and
> bit-field width); otherwise, the value is implementation-defined.
0938デフォルトの名無しさん
2011/11/03(木) 22:33:04.780939デフォルトの名無しさん
2011/11/03(木) 22:37:16.69どっかで保証されてないのかな
ポインタにして戻すのが大丈夫と保証されてるのと同じように
0940デフォルトの名無しさん
2011/11/03(木) 22:42:36.04例外が起こっていない間は例外のほうが早いよ
コードサイズはでかくなりやすいけど
0941デフォルトの名無しさん
2011/11/03(木) 22:43:15.04負の値を、符号なしに渡しても、符号なしから負の値で
符号付き変数に代入できる実装したって問題ないんだから仕方ない。
0942デフォルトの名無しさん
2011/11/03(木) 22:46:00.05そうですか…ではちょっとやり方を変えてみます
符号つき整数を単に同サイズの符号なし整数へと変換した場合
その結果は一意に定まりますか?
つまり
同じ符号つき数からのキャストは同じ符号なし数へ、
違う符号つき数からのキャストは違う符号なし数へ、
となるかどうかです
この変換結果を配列の添字として利用するつもりです
素直に大きいサイズに入れて
INT_MAX(だったっけ?)の半分を足した数とかを使ったほうがいいのかなー
0943デフォルトの名無しさん
2011/11/03(木) 22:51:53.070944デフォルトの名無しさん
2011/11/03(木) 22:53:02.97int x = 100;
unsigned int ux = *reinterpret_cast<unsigned int *>(&x);
int x2 = *reinterpret_cast<int *>(&x);
unsigned intはすべてのビット表現に対する値が
定義できる型なので戻せるはず。
0945デフォルトの名無しさん
2011/11/03(木) 23:00:16.68しかも、unsigned intに負の値をキャストした場合が非常にマズイ。
0946デフォルトの名無しさん
2011/11/03(木) 23:07:04.00メイヤー、メイヤー連呼する前に、例外概念の原典
Exception Handling : False Sense of Securityから説明してみろや。
例外構文の基礎設計はここから始まってる。
0947デフォルトの名無しさん
2011/11/03(木) 23:15:12.74auto u_i = static_cast<unsigned int>(i);
はiが負の場合implementation definedなので、一意な値にならないとまずいが、
auto u_i = *reinterpret_cast<unsigned int *>(&i);
ならu_iは一意なのでまずくないと言っている。
ただしu_iの値はiのビット表現に依存するので戻す以外に使えない。
0948デフォルトの名無しさん
2011/11/03(木) 23:19:33.81配列の添字に使うといってるんだから、-1なんか突っ込んだら
~0になって使い物にならないだろ。
0949デフォルトの名無しさん
2011/11/03(木) 23:41:34.86とりあえず
unsigned int index = (long int)x - INT_MIN;
として、それを使うことにしようと思います
0950デフォルトの名無しさん
2011/11/03(木) 23:45:30.82http://ptgmedia.pearsoncmg.com/images/020163371x/supplements/Exception_Handling_Article.html
これ?
これのどこが何の原典になってるのか、さっぱり見えてこないんだけど。
0951デフォルトの名無しさん
2011/11/03(木) 23:46:28.960952デフォルトの名無しさん
2011/11/03(木) 23:55:09.680953デフォルトの名無しさん
2011/11/03(木) 23:59:54.07規格策定中の文だし。頭の方から例外処理は何が重要か書いてあるだろ。
throw catchが重要ではない、例外部以外に影響与えることなくとかな。
0954デフォルトの名無しさん
2011/11/03(木) 23:59:58.98long intは大抵32ビットやで(それも環境依存だが)
そもそも環境依存なんて言っても、大丈夫な環境がほとんどだし
大丈夫じゃない環境でコンパイルする事もないだろう
環境依存気にしすぎても仕方が無い
(特に、特定のOSのAPIを使ってる場合とか)
0955デフォルトの名無しさん
2011/11/04(金) 00:15:32.36今となっては「RAII 使え」とか「strong/basic guarantee というものがあってね・・・」で
一蹴されるような古い主張しか書いてないように見えるんだけど。
RAII や例外安全性保証という考え方の重要性を考えるためのきっかけのひとつに
なったと言えなくはないかもしれないが、それでもって原典などと言うのはどうにも解せない。
0956デフォルトの名無しさん
2011/11/04(金) 00:19:46.65long intとintが同サイズだったりするのですね…long long なら何とかなるかな?
なんでこのフレームワークはステートを直接参照させてくれずに
イベントでOn/Offされたステート番号を通知するだけなんだろ
しかもそのステート番号が単なるintとしか規定されてないから符号つきの可能性を考慮しなきゃならんという…
0957デフォルトの名無しさん
2011/11/04(金) 00:25:51.89素朴に std::map<int, ...> ではダメなのか?
0958デフォルトの名無しさん
2011/11/04(金) 00:30:30.60あほ
バイナリ互換を保証する試みはいくつかあり、お望みならそれを使えと言うだけ
おまえみたいな盲信はたまたまそいつらの枠内で助かっているだけ
0959デフォルトの名無しさん
2011/11/04(金) 00:45:31.62どこら辺を読んでそういう結論に至ったのか解からん。
大体RAIIってスマポの事でも行ってんのかもしれんが、
肝心のスマポ作る時だって同じことだろ。
strong/basic guarantee も本質的に関係ないし。
あとこの文章、結構いろんなところで紹介されてる。MSDNとかね。
http://msdn.microsoft.com/ja-jp/library/cc440184(v=vs.71).aspx
0960デフォルトの名無しさん
2011/11/04(金) 00:51:09.05そうか、曲がりなりにもC++なんだからSTL使えばいいんですよね…
今のところモロにベターC的なコードになっちゃってるから
STL使えばいいという発想に至ってなかったです、ありがとうございます
0961デフォルトの名無しさん
2011/11/04(金) 00:55:09.900962デフォルトの名無しさん
2011/11/04(金) 00:57:17.6810年前からタイムスリップでもしてきたのか?
>950の中のどこが現代のC++でも通用する話なの?
真に受けると変に例外を怖がることにしかならんと思うんだが。
MSDNのその記事も、なんで日本語訳だけしつこく生き残ってるのかねぇ。
第16部を読まずに勘違いする人を増やしてそう。
0963デフォルトの名無しさん
2011/11/04(金) 01:05:16.86ここでも紹介されてるぞ。
http://www.boost.org/community/exception_safety.html
迷信のもととなってしまったものとしてな。
0964デフォルトの名無しさん
2011/11/04(金) 01:16:09.61どこを見てそう思ったのか具体的に書きだしてくれ。
特に、例外を避けることができればそれに越したことがないが、
実際例外を出さず安全確保は難しいという内容に関してな。
new で0を返すとか仕様が古いとかそんな事はどうでもいいから。
0965デフォルトの名無しさん
2011/11/04(金) 01:52:39.08> 特に、例外を避けることができればそれに越したことがないが、
> 実際例外を出さず安全確保は難しいという内容に関してな。
意味が分からんな。
それ>950のどこに書いてあんの?見てる文書が違うのかな?
もし>959のMSDNの記事のことなら、そもそも例外を避けようとした
動機自体が意味不明だから。
0966デフォルトの名無しさん
2011/11/04(金) 01:54:11.63特定OSに限定してるのに
あり得ない環境を想定しても仕方が無い
それどころか、OSのAPI自体がそういうキャストを要求したりとかザラ
本当に移植性が必要なケースでもない限りコストの無駄
そもそも型のビット数すら環境依存だし
0967デフォルトの名無しさん
2011/11/04(金) 02:30:28.95C++相談室 part92
http://hibari.2ch.net/test/read.cgi/tech/1320339482/
0968デフォルトの名無しさん
2011/11/04(金) 02:48:10.96Unix、Windowsは例外が投げられるとプログラム内で拾って適切な処理を
する文化だけど、Linuxなんかだとプログラム内では余計な処理を何も
行わずにOSが拾ってコアダンプを吐く文化。
つまり、余計な処理を行わないだけLinux文化の方が洗練されているんだよね。
MSDNに例外に注意を払えという文書があるのは、これ正にWindows文化で
プログラマなら本来は徹底抗戦するべきなんだよね。
だってあのM$だぜ?
悪魔とさえ言われてる。
つまり、例外は使って放置が正しい。
例外の処理は適切なOS(たとえばLinuxやMac)に任せるのが筋。
0969デフォルトの名無しさん
2011/11/04(金) 03:25:08.19CPUやOSの例外とC++の例外との区別ぐらいはできるようになってから語れよデコスケヤロウ
0970デフォルトの名無しさん
2011/11/04(金) 03:37:53.27アホかC++の例外の話だ。
スレタイ読めよ。
0971デフォルトの名無しさん
2011/11/04(金) 04:09:41.680972デフォルトの名無しさん
2011/11/04(金) 04:36:47.77作ったやつだっせーから情報送っていい?とか言ってくるんだけどこれも一応c++例外の話じゃないかな?
0973デフォルトの名無しさん
2011/11/04(金) 07:17:38.020974デフォルトの名無しさん
2011/11/04(金) 07:29:11.96それはC++の例外としての機能がOSに実装されてるんじゃなくて、
C++の例外をキャッチしない場合にOSの機能を呼び出すようにコンパイルした時に当てはめてるだけだと思う。
何が言いたいのかよく分からなくなってきたが、要するに作ったやつだせーから情報送っていいかどうかというOSの機能とは関係ないという話だ。
0975デフォルトの名無しさん
2011/11/04(金) 08:25:55.69馬鹿の極み
0976デフォルトの名無しさん
2011/11/04(金) 09:21:59.090977デフォルトの名無しさん
2011/11/04(金) 09:34:08.70拒否はしないけど
0978デフォルトの名無しさん
2011/11/04(金) 09:45:45.540979デフォルトの名無しさん
2011/11/04(金) 12:59:39.16小さなコマンドの組み合わせでシステムを運用する方針だから。
実際、開放していないコマンドがざらにある。
これはシステムが適切に解放してくれるから。
もうWindows終わったな。
0980デフォルトの名無しさん
2011/11/04(金) 13:19:04.29ソフトがたくさん出て来ればな
今の所は難しいだろ
King Office位しかねーじゃん
0981デフォルトの名無しさん
2011/11/04(金) 13:21:34.89頭の中がずいぶんとお花畑ですが大丈夫ですか?
0982デフォルトの名無しさん
2011/11/04(金) 14:00:58.210983デフォルトの名無しさん
2011/11/04(金) 19:01:35.07おつ
0984デフォルトの名無しさん
2011/11/04(金) 21:33:46.35それさえできないなら、OSとは言えないでそ?
0985デフォルトの名無しさん
2011/11/04(金) 21:39:11.550986デフォルトの名無しさん
2011/11/04(金) 22:08:39.07つかんだプリンタ、つかんだ音源、つかんだちんちん…
これらはアプリケーションが適切に開放しないと、
えんえんリソースを浪費したままとなる。
…かもしれないとWindows 3.1現役ユーザーの俺は思うのだが
最近の64bit OSは違うのかな?^^
0987デフォルトの名無しさん
2011/11/04(金) 22:19:02.96わざわざプロセス間共有メモリ確保とかしてない限り。
0988デフォルトの名無しさん
2011/11/04(金) 22:22:41.440989デフォルトの名無しさん
2011/11/04(金) 22:25:52.60今もntdvm使えばやってくれないよ
ちゃんと設定すればvm上でメモリリークする
0990デフォルトの名無しさん
2011/11/04(金) 22:31:58.38DOS Virtual Machineじゃなくて
Virtual DOS Machineだ
0991デフォルトの名無しさん
2011/11/05(土) 03:57:41.770992デフォルトの名無しさん
2011/11/05(土) 10:29:47.160993デフォルトの名無しさん
2011/11/05(土) 14:03:02.140994デフォルトの名無しさん
2011/11/05(土) 18:19:52.080995デフォルトの名無しさん
2011/11/05(土) 18:20:10.250996デフォルトの名無しさん
2011/11/05(土) 19:30:03.400997デフォルトの名無しさん
2011/11/05(土) 19:36:01.70C++相談室 part92
http://hibari.2ch.net/test/read.cgi/tech/1320339482/
0998デフォルトの名無しさん
2011/11/05(土) 20:25:57.83/ / {┳ }
>{、 ,>-<
// -\__/ -ヽ \ 、_、-‐ 1
1 i_工7 ┐ . { |⊂⊃ i ⊂⊃| } } 、 T¨Τ
_」- L.L/ {_ノ―、 \ヽ 「 ̄ ̄ フ / / 、-7 ̄ г¨Τ二7
ノ ー|フ /∨ } r─\ ゝ ─ ' 厶二⊃ / \ ΓΤ J
ー'⌒ 、-┴‐、 ヽハ _ノ  ̄`|  ̄ ̄ ̄ ̄ `ーァ / ヽ、 |
\ /
>、___ イ
し′ し′
0999デフォルトの名無しさん
2011/11/05(土) 20:28:49.871000デフォルトの名無しさん
2011/11/05(土) 20:31:20.6010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。