C++相談室 part91

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前には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
2デフォルトの名無しさん: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)に対応。
3デフォルトの名無しさん:2011/09/13(火) 23:02:51.36
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4デフォルトの名無しさん:2011/09/13(火) 23:03:04.84
5デフォルトの名無しさん:2011/09/13(火) 23:03:22.58
6デフォルトの名無しさん:2011/09/14(水) 00:09:22.81
>>2
> [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

しばらくは両方載せといたほうがいいかもね。
7デフォルトの名無しさん:2011/09/14(水) 00:44:41.38
C++の作者が書いた、C++によるプログラミング入門はどうよ?
8デフォルトの名無しさん:2011/09/14(水) 00:49:30.96
>>7 スレ違いかな
9デフォルトの名無しさん:2011/09/14(水) 16:21:31.90
class Item {}

std::list<shared_ptr<IItem>> items;

itemsに登録されているItemインスタンスを、自身で登録から外すための方法ってどんなのがある?
Itemクラスまたはその派生クラスのサイズはできる限り押さえたいんだけど・・・
10デフォルトの名無しさん:2011/09/14(水) 16:23:26.97
あぁ、ちょっと誤解を招きそうな部分があるな
IItem っていう記述があるけど、それは Item クラスのことです
11デフォルトの名無しさん:2011/09/14(水) 16:26:28.63
・itemsへの参照をもたせる
・itemsを広域にする
12デフォルトの名無しさん:2011/09/14(水) 17:05:15.64
>>11
その2つのうち、どちらかを選ぶとしたら
・itemsへの参照をもたせる
かなぁ


Itemフラグを持たせておいて、あるタイミングで立っていたら外側から削除、とか
Itemクラスのインスタンス関数の戻り値で、外側に削除して欲しいことを伝える、みたいな
使い道が限られる方法でも、何かあったら教えて欲しい
13デフォルトの名無しさん:2011/09/14(水) 19:57:12.30
Itemの寿命が尽きたときにitemsから削除させたいなら
std::list<weak_ptr<Item>> items;
にして、定期的にitemsを掃除するとか。
いや、どんな使い方するのか知らんけどさ。
14デフォルトの名無しさん:2011/09/14(水) 21:30:05.01
相互参照に綺麗な答えなんて無いよ
みっともなくて泥臭い方法でやるしか無い
15デフォルトの名無しさん:2011/09/14(水) 21:40:40.67
>>9
組み込み環境ならいざ知らず、
8バイトや4バイトぐらいケチケチすんなや。
169:2011/09/15(木) 05:17:40.89
ノード毎に bool exists を持たせて、イテレータも独自のものを作成する

リスト.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, ...> が使用しているイテレータやノードを独自のものにする簡単な方法なんてありますか?
17デフォルトの名無しさん:2011/09/15(木) 12:38:35.80
イテレータアダプタ
189:2011/09/17(土) 13:02:16.42
>>17
亀レスでごめん
色々調べてみたが、>>16の構造はそれで解決できそうだ。ありがとう
19デフォルトの名無しさん:2011/09/18(日) 19:55:52.24
クラスのありがたみを実感できるような
簡単すぎず長すぎない
プログラム練習問題を出して下さい
20デフォルトの名無しさん:2011/09/18(日) 19:56:39.16
○×ゲームでも作ればいいと思うよ
21デフォルトの名無しさん:2011/09/18(日) 20:28:46.75
>>19
多倍長整数演算クラスでも作ってみな
演算子オーバーロードの良い練習になるぞ
22デフォルトの名無しさん:2011/09/18(日) 20:36:20.53
>>19
ベクトルクラスとか、簡単なコンテナクラスとか

まあクラスも万能ではないし、固執しすぎない程度にやればいいと思う。
23デフォルトの名無しさん:2011/09/18(日) 21:09:54.09
>>19
双方向リストを実装せよ
24デフォルトの名無しさん:2011/09/18(日) 23:42:48.13
>>19
スマートポインタ
25デフォルトの名無しさん:2011/09/18(日) 23:45:37.97
>>19
プログラムの実行時間を計測できるようなストップウォッチ機能
26デフォルトの名無しさん:2011/09/18(日) 23:55:47.61
>>19
引数解析機
これの実装を書いてみ。

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 );
27デフォルトの名無しさん:2011/09/19(月) 00:11:13.57
AIに提示する環境情報をどういう風に与えるか考えたことあります?
かなり長いこと悩んでるんですが…。
28デフォルトの名無しさん:2011/09/19(月) 00:11:47.05
すいません、誤爆しましたm(_ _)m
29デフォルトの名無しさん:2011/09/19(月) 02:01:21.58
>>19です
みなさんレスありがとうございます
ですが、もっと低レベルなものを期待していたので
(ネコとかみかんとかが出てきそうな)
もっと勉強してから出直してきます
すみませんでした
30デフォルトの名無しさん:2011/09/19(月) 02:42:25.72
>>29
>>24の双方向リストは俺もおすすめだな
シンプルだしアルゴリズムとデータ構造の基本も分かって一石二鳥
一気に実力が伸びると思うので手が届きそうならぜひ
31デフォルトの名無しさん:2011/09/19(月) 02:43:09.14
あ、>>23だったわゴメ
32デフォルトの名無しさん:2011/09/19(月) 04:05:09.36
簡単なラッパーとかは?win32apiとかの
33デフォルトの名無しさん:2011/09/19(月) 13:37:02.03
初心者にWINAPIラップしろとか鬼畜かよ
34デフォルトの名無しさん:2011/09/19(月) 15:50:07.24
例えば、演算をするクラスaと描画をするクラスbの両方が
設定データを管理するクラスcを使いたい場合

そういう設計ってあり、というか一般的ですか?

アリの場合、
クラスcは最初にインスタンス化されたときだけ
メモリ実体をアロケートするような小細工するのでしょうか?
35デフォルトの名無しさん:2011/09/19(月) 15:51:27.41
シングルトンだろうな
36デフォルトの名無しさん:2011/09/19(月) 16:16:01.78
>34
あり
"共有メモリ"かな

シングルトンとは違うぞw
37デフォルトの名無しさん:2011/09/19(月) 16:17:56.64
シングルトンのコンストラクタで共有メモリをアロケートするというのはどうだ
38デフォルトの名無しさん:2011/09/19(月) 16:26:06.14
なに一店の 静的メンバ だろ
じょうしきてきにかんがえて
39デフォルトの名無しさん:2011/09/19(月) 16:32:45.23
必要な情報は全部引数で渡せば良いんじゃね。
40デフォルトの名無しさん:2011/09/19(月) 17:38:21.02
>>39
参照する関数が数十以上になることを考えて頂戴
41デフォルトの名無しさん:2011/09/19(月) 17:42:01.74
皆さんありがとうございました!
42デフォルトの名無しさん:2011/09/19(月) 20:47:43.35
シングルトンはねーよ。
設定ソース.引数に設定(設定先描画オブジェクト);

とした方が設定ソースだけがほかのオブジェクトに
依存するだけだからまし。
しかも設定情報の入れ子を押さえられるし、設定ソースの切り替えで、
レジストリからXMLの切り替えも簡単。
シングルトンだとすべてのクラスがシングルトンに
依存するから修正が大変。
エラー処理とか身動きがとれなくなる。
43デフォルトの名無しさん:2011/09/19(月) 21:00:58.02
aとbがcを使いたいのにその構造はどうなのよ
44デフォルトの名無しさん:2011/09/19(月) 21:25:16.35
cがaとbをfriendにしとけばいいじゃない
45デフォルトの名無しさん:2011/09/19(月) 23:03:20.07
いろんなライブラリのソースを読む
46デフォルトの名無しさん:2011/09/19(月) 23:20:00.20
>>43
それ事態がおかしいでしょ。
極端な話、設定値は決めうちでいい。
それを敢えて外に出してるんだから、
設定部分が処理オブジェクトに依存してると考えるのが自然。
処理するオブジェクトだって常に設定ファイルから
値を渡されなきゃならない義理は無いし他の
処理するオブジェクトから値を受け取ったっていい。
47デフォルトの名無しさん:2011/09/19(月) 23:24:14.84
決めうちでいいわけないだろ
48デフォルトの名無しさん:2011/09/19(月) 23:30:32.93
極端な話とはどういう慣用句だろうか。
49デフォルトの名無しさん:2011/09/19(月) 23:34:46.93
>>47
>>46の樹脂とは関係ないけど一部決めうちなんて良くある話じゃない
Direct Xの引数全部の値を外部からとりこむなんて無いじゃん。
50デフォルトの名無しさん:2011/09/19(月) 23:36:37.44
Direct Xだって設定オブジェクトに依存して無いな。
51デフォルトの名無しさん:2011/09/19(月) 23:49:44.63
所詮一部だろ
設定はある程度外部に出すのは良くある話
52デフォルトの名無しさん:2011/09/19(月) 23:59:26.33
C++で作られた計算ロジックを呼び出すGUIを作りたい。
C++もしくはC++と相性の良い言語で
アニメーションを含むリッチなGUIを作成する方法について
おすすめがあれば教えていただきたい。

環境はWindowsのみ。
計算ロジックはVC++で開発中。
そこそこ複雑な画面になる予定。

QtはWindows標準と動作が異なる部分が多いので遠慮したい。
wxWidgetsやWTLでアニメーションはしんどそう。
WPFは理想に近いけどできればもっと軽くてランタイムのいらないものがいい。

妥協策でも教えて頂けると嬉しい。
53デフォルトの名無しさん:2011/09/20(火) 00:01:47.91
「設定データを管理するクラスのインスタンス」が絶対に1つしか存在しないのか、それとも複数存在する可能性があるのかで、話の内容が2分されるだろ。なぜ最初にそれを問わないんだ?
1つしか存在しないのであれば static でもシングルトン、
複数存在するのであれば、C のインスタンスを作成→ポインタなりを A と B のインスタンスに渡すか、A と B のメンバ関数の呼び出しの際に、引数として C のインスタンスを渡すだけだろ
54デフォルトの名無しさん:2011/09/20(火) 01:26:41.64
ゲームの当たり判定で敵と自機ではクラスが違うので座標が渡せません
なにかいい方法はありませんか?
55デフォルトの名無しさん:2011/09/20(火) 01:27:49.00
>>52
Qtがダメってことはtcl/tkやGTK+も同じ理由でダメってことだろうし、
OpenGLやDirectXに対応してるようなGUIエンジン( http://wiki.gamedev.net/index.php/Libraries#GUI )もWindows標準とはいえない。
ということは最初からWinAPIかMFCくらいしか選択肢ないようなきがす
56デフォルトの名無しさん:2011/09/20(火) 01:28:44.78
>>54
どちらも座標を返す共通の関数を持たせればいい。仮想関数とか。
57デフォルトの名無しさん:2011/09/20(火) 01:50:09.40
>>56
できそうな気がします
ありがとうございました
58デフォルトの名無しさん:2011/09/20(火) 07:46:58.24
>>55
そうか・・・
サンクス
59デフォルトの名無しさん:2011/09/20(火) 08:37:24.36
>>53
設定データというのは例えばシステムのiniファイルだったり
具体的なリソースとしては唯一のものです。

その前提で、aとbにcのインスタンスを生成させるべきかどうか、
という所からの質問と捉えていただけると助かります。
60デフォルトの名無しさん:2011/09/20(火) 10:10:41.00
>>51
極端な話…。
61デフォルトの名無しさん:2011/09/20(火) 10:20:40.58
「トポロジー的には極端な話取手付のコップとドーナツは同じ」
とかっていう言い回しは通じないんだろうよ。
62デフォルトの名無しさん:2011/09/20(火) 11:44:30.57
http://d.hatena.ne.jp/mb2sync/
この人の作ってるライブラリ
http://p-stade.sourceforge.net/
が非常に便利で使いたいなと思うのですが
更新が2008年で止まってるみたいです

ひょっとして他のboostと整合性とれなくなってるんじゃないかと不安なんですが
使ってる人は割といるライブラリなのでしょうか
6362:2011/09/20(火) 11:50:55.77
と思ったらこんなスレが

Oven/Egg総合スレ part1
http://hibari.2ch.net/test/read.cgi/tech/1231080841/

やぱりみんな使ってるのね
64デフォルトの名無しさん:2011/09/20(火) 17:24:25.92
それはパイプ構文が非常にキモイので使ってない
65デフォルトの名無しさん: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;
}
66デフォルトの名無しさん:2011/09/20(火) 17:55:38.25
>>65
ios::ateの意味は単に「ファイルを開いた時にファイルポインタをファイルの最後に
シークするだけだから、ios::appとOR取らないとだめでしょ

std::ofstream Fout("test.txt", std::ios::out | std::ios::ate | std::ios::app);

いやateは不要かもしれんな
67デフォルトの名無しさん:2011/09/20(火) 17:57:23.79
ちなみに意味のある組み合わせは

in
out
out | trunc
out | app
in | out
in | out | trunc

これ以外のフラグの組み合わせは許可されていない
68デフォルトの名無しさん:2011/09/20(火) 18:01:15.84
面倒くせー仕様だな
C++最初に考えた奴はそうとうひねくれてるんだろうな
誰だかしらねーけど多分融通きかない頭硬そうなやつだから禿げてるよ
69デフォルトの名無しさん:2011/09/20(火) 18:04:38.78
知らん
規格表にそう書いてあるもん
70デフォルトの名無しさん:2011/09/20(火) 18:07:04.60
ちなみにC++オープンモードとCのオープンモードを対比させて覚えておくとよい

in "r"
out "w"
out | trunc "w"
out | app "a"
in | out "r+"
in | out | trunc "w+"

ateは補助的なフラグでオープン直後にファイルの最後にシークするだけで
主な動作は上の組み合わせで決まる
71デフォルトの名無しさん:2011/09/20(火) 18:09:37.87
"a+"がねーな

in | out | app かな?よくわからん
72デフォルトの名無しさん:2011/09/20(火) 18:13:50.97
>>71
正解
結局ateの動作が問題になるだけ

appでオープンすると書き込み時は常にファイルエンドにシークするが
ateでオープンすると任意の場所から書き込み可能
73デフォルトの名無しさん:2011/09/20(火) 18:18:21.99
>>63-64
可変テンプレートがVisualStudioで使えないから
代用品探してるんだけど
これに変わるものがみつからない

boost::anyみたいにパーフォーマンスに影響あるのかソース見ないとわからないから
そこも不安だ
74デフォルトの名無しさん:2011/09/20(火) 18:50:18.83
>>65です。できました。みんなありがとう。
CとC++のオープンモードの対比がわかりやすすぎて泣けました。
75デフォルトの名無しさん:2011/09/20(火) 20:10:33.85
>>73
特殊化とデフォルトテンプレート引数駆使すれば相応のものができる。
ただし、16個までとか32個までとか上限を決める必用が有るけどね。
16も有れば普通は十分。
76デフォルトの名無しさん:2011/09/20(火) 21:03:59.37
なんでC++のブログって
開始後1年後ぐらいにハスケル始めるん?
77デフォルトの名無しさん:2011/09/21(水) 06:21:40.47
template <typename T>
class 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)にデメリットはありますか?
78デフォルトの名無しさん:2011/09/21(水) 10:34:46.86
>>77
大丈夫かというのなら心配している点を言って欲しいな。
デメリットを考えるのなら比較対照を示して欲しいな。

とりあえず、継承を使うと POD にならないとか、 Hoge も template だったり
すると途端に面倒になるとか、 scoped_ptr しか要らないところでも他のやつの
#include が必要になるとか、そんなのが思いつくけど。
79デフォルトの名無しさん:2011/09/21(水) 10:53:27.01
こういう構造は気を付けないと循環参照を起こしやすそうであまり好きではないかな。
リスト作りたいならlistとかに任せたらいいのではと思うんだけども。
8077:2011/09/21(水) 11:28:49.08
>>78
しいて言えば、この継承によって
1. Hoge インスタンスのサイズが増えないか
2. Hoge インスタンスの作成(コンストラクタの呼び出し)が遅くならないか
3. Hoge インスタンスの破棄(デストラクタ(ry
ここら辺です
自分の知識ではこれらのデメリットは発生しないと思いましたが、念のためです

>>79
話題の中心は typedef_smart_ptr_to ←これです
Hogeクラスの構造はこのクラステンプレート(で定義されている typedef)の使用例として書いただけです
81デフォルトの名無しさん:2011/09/21(水) 12:02:15.69
>>80
効率は実測が基本。

ここで問題ないという答えが返ってきたところで、あなたの使っている環境や
作っているものについて問題にならないとは限らない。
82デフォルトの名無しさん:2011/09/21(水) 12:31:46.23
内部に侵入しなくてもいいように作られてるshared_ptrを
思いっきり内部に取り込んでる設計は好ましくない
8377:2011/09/21(水) 16:09:09.21
>>81
「一般的にどうであるか」を尋ねています。

>>82
「typedef boost::shared_ptr<T> shared_ptr;」などを Hoge クラス内で宣言するべきではないということでしょうか
クラス外で「typedef boost::shared_ptr<Hoge> HogePtr;」を宣言するのは問題ありませんか?
84デフォルトの名無しさん:2011/09/21(水) 16:15:08.87
QZ臭せえ〜
85デフォルトの名無しさん:2011/09/21(水) 16:35:07.08
>>77
A1. 大丈夫
A2. デメリットはない

けど外部に委ねられるものをインターフェースとして内包する……という設計には疑問を感じる
>>83
そうだね
それで代替できるのならそうしたほうがいい
86デフォルトの名無しさん:2011/09/21(水) 17:04:57.49
>>77
わざわざ継承している理由がいちいち子クラスで
typedefするのがめんどい程度しか感じられない。
8777:2011/09/21(水) 17:19:13.27
>>85
回答ありがとうございます
しかしtypedefのためにクラステンプレートを使うのはマズのか・・・
他の方のレスと合わせて、ちょっと使用は控えようかと思います

>>86
まさに「typedefがめんどくさい」から考えた構造です
88デフォルトの名無しさん:2011/09/21(水) 19:17:09.85
>>84
QZは低脳なのでC++はやらないのでは?
89デフォルトの名無しさん:2011/09/21(水) 21:24:59.29
標準にもstd::unary_functionとかあるから問題外ってことはない。
しかし一々typedefするのが深刻なほど問題になるような状況は考えにくいな。
子クラスがものすごく単純な構成ばかりで、typedefが総行数の半分以上とかになるようなら
使ってもいいって所。
90デフォルトの名無しさん:2011/09/21(水) 21:34:02.69
まあunary_functionも廃止予定だし
91デフォルトの名無しさん:2011/09/21(水) 21:36:36.09
>>83
アホ?

81 は「一般論など意味がない」と答えているのに
それが水掛け論で答えが変わったら何か得られるとでも思ってるんだろ

ああ、効率いいよ
これでご満足か?

# ごね得を拾う生き方の人は自然科学が相手じゃない道を選んだ方がいい
92デフォルトの名無しさん:2011/09/21(水) 22:21:48.25
C++スレなんだからコメントは//にしろよ
93デフォルトの名無しさん:2011/09/21(水) 22:33:45.23
>>83
Hogeの中だけで使うスマポとしてtypedefするならいいと思うよ
でもHogeのポインタを扱うときにはこのスマポを使ってね、という意味で公開typedefを用意するのは良い設計とは思えない(たまにこういうことをする人がいるから指摘した)
9477:2011/09/21(水) 23:21:25.43
>>93
>Hogeのポインタを扱うときにはこのスマポを使ってね、という意味で公開typedefを用意する
まさにこれをやろうとしていました
クラス外であれば使う都度、typedefを使わず宣言した方が良さそうですね
95デフォルトの名無しさん:2011/09/21(水) 23:29:10.23
素人丸出しの質問ですまん。
長いプログラム書くときどういった手順で作成してる?
俺の場合main関数に大体の流れを書く→クラス、関数を作る→
不備があればmain関数を弄る→エンドレスって感じなんだが、
どうも、しっくりこない。何かいい方法ある?
96デフォルトの名無しさん:2011/09/21(水) 23:41:22.05
>>95
最初から全部は考えない。部分目標を作ってちまちま継ぎ足していく。
まずはウィンドウを表示する、とか。ランキングデータを取得して表示してみる、とか。
必要と思った関数、クラスはそのつど作成する。
その過程でリファクタリングしたりもする。
2,3回は全部投げ捨てて最初から作り直したくなる衝動にかられる。
そして完成する前に飽きてエター。
97デフォルトの名無しさん:2011/09/21(水) 23:50:46.61
コード書く前に設計する
どうやって設計するかは本で勉強してください
設計が終わればあとはそのとおりにコードを書くだけ
98デフォルトの名無しさん:2011/09/21(水) 23:58:26.63
そんなやついねえ
99デフォルトの名無しさん:2011/09/22(木) 00:54:13.34
>>95
既存の枯れたコードやアルゴリズムを使って、その長いプログラムを短くすることを考える。
100デフォルトの名無しさん:2011/09/22(木) 01:54:15.81
まず必要なクラス名を列挙して大雑把に設計する。
同時に、曖昧な手続きはmainにテストコードを書いて確認する。
あ、これでいいんじゃね?となったら書き始める。
101デフォルトの名無しさん:2011/09/22(木) 03:48:59.77
アプリケーションなら実行の流れと論理構造は別物なので分けて考える。
コマンドラインアプリのようなひとつの仕事をして終了するタイプや、GUIアプリのような
恒常性のあるタイプといった類型があるので、それぞれのタイプに沿った設計手法をとる。
大まかに全体像を把握したらそれを関数やクラス構造に落とし込んでいく。
102デフォルトの名無しさん:2011/09/22(木) 07:35:44.97
いずれにしても、このスレでする話じゃないな。
103デフォルトの名無しさん:2011/09/22(木) 10:28:28.35
設計はどこで話せばいいの?
104デフォルトの名無しさん:2011/09/22(木) 11:18:14.86
>>103
スレタイ検索するとか↓とか。
http://hibari.2ch.net/test/read.cgi/tech/1312926165/
105デフォルトの名無しさん:2011/09/23(金) 03:20:58.69
つい最近bullet使い始めてみて、疑問に思ったことなんだが

void* ってかっこよく型を戻すことできないの?
getType()を仮想関数にして、判別しているんだがもっといい設計がある気がする。
http://codepad.org/SOTom56e

こんなこと出来ないの?
void *p = hoge.getUserPointer();
static_cast<typename getType(p)>(p);

106デフォルトの名無しさん:2011/09/23(金) 05:35:54.97
>>105
型情報を別途持つ特殊なポインタクラスを造れば実現できるけど、それは既にvoid *じゃないね。
つーか、型情報を持たないvoid *を例えば関数の引き数として受け取ってどうやって元の型を知るのかと。
107デフォルトの名無しさん:2011/09/23(金) 07:56:18.61
Baseから派生してるんだからBase*を使えばいいのであって、void*にする必然性が無いな。
ついでに言えば仮想関数で呼び出せばRTTIもいらない。
108デフォルトの名無しさん:2011/09/23(金) 08:18:39.79
bulletライブラリがvoid*を使う仕様なんだからしょうがないんじゃね
109デフォルトの名無しさん:2011/09/23(金) 08:59:03.90
クラスの継承で質問があります。
privateで継承した場合って、派生クラスでも基底クラスのメンバにはアクセス不可能なんですよね?
ではこのprivateで継承することって何か意味あるんですか?
110デフォルトの名無しさん:2011/09/23(金) 10:39:30.88
public以外の継承は考えたことなかったなあ・・・
↓に詳しく書いてあったよ。アクセスできるって
http://www.geocities.jp/ky_webid/cpp/language/032.html
111デフォルトの名無しさん:2011/09/23(金) 10:39:35.96
>>109
例えばboost::noncopyable
private継承することでコピーコンストラクタと代入演算子を無効化できる。

ただ
private部分の親クラスの動作を変えたい、
とかは親がそう設計されていなければやはり無理。
親を修正するしかない。
この点においてオブジェクト指向の限界というか、
柔軟性の無い点だとも感じるがなぁ
112111 :2011/09/23(金) 10:41:16.28
ただ〜からは必要のない不適切な話だったスマソ
113デフォルトの名無しさん:2011/09/23(金) 10:43:57.28
ほぼ包含で代用できるので忘れていいです
114デフォルトの名無しさん:2011/09/23(金) 10:46:56.15
>>110-113
派生クラスからは、privateで継承したとしても、基底クラスのprotectedやpublicのメンバにはアクセスできるんですね。
皆さんありがとうございました。
115デフォルトの名無しさん:2011/09/23(金) 10:54:37.93
つっこむの面倒になるレベル
116デフォルトの名無しさん:2011/09/23(金) 11:00:39.57
そういうのは書きこまなくていいです^^
117デフォルトの名無しさん:2011/09/23(金) 11:01:01.65
prot
まぁいいか
118デフォルトの名無しさん:2011/09/23(金) 11:21:15.12
ちょっと待ってください
私が何か勘違いしているのなら教えて欲しいです
119デフォルトの名無しさん:2011/09/23(金) 11:30:55.86
>>105
というか一回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;
}

120デフォルトの名無しさん:2011/09/23(金) 14:26:52.04
>>106
>つーか、型情報を持たないvoid *を例えば関数の引き数として受け取ってどうやって元の型を知るのかと。
すいません。書き方悪かったです。templateからうまくやりたかったんですが…
こんな感じかな
templateClass<voidPtr>::type voidPtr;

自分でもよくわかりませんww というかvoid*を渡してどうする気なの自分。
virtualな typedef をしたいんだと思います。
初期案はこんな感じでしたが、書けませんでした。http://codepad.org/tMVtOiyZ

>>119
仮想関数で処理するのが一般的だと思いましたが、bulletのコールバック関数内で型別に処理したほうがいい場合があるかなと感じたんで、とりあえずあんな感じにしときました。
最終的には IActor みたいなクラス作って、仮想関数で処理すると思います。

>>109
protectedだけど
http://codepad.org/s7Vlq2BL
121デフォルトの名無しさん:2011/09/23(金) 14:35:10.60
ああーContainerのアドレス消し忘れた
要はvirtualじゃないデストラクタのクラスを委譲しようとしたときに便利なことがある。
ぶっちゃけ、理解する必要はない
122デフォルトの名無しさん: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);
}
123デフォルトの名無しさん:2011/09/24(土) 02:57:13.84
>>122
data<int> と data<float> は違う型なので、それらをまとめてひとつの型とすることはできない。
どんな型でもまとめて格納できる配列が欲しいのなら、 boost::any の配列を使うといいかもしれない。
124デフォルトの名無しさん:2011/09/24(土) 02:57:29.80
誤爆です。
125デフォルトの名無しさん:2011/09/24(土) 02:58:15.75
>>123
ありがとうございます。
やっぱ、無理ですよね…
126デフォルトの名無しさん:2011/09/24(土) 06:11:07.93
なんでも入れれる配列があったら便利なのにってたまに猛烈に思うよね
で、やってみたら取り出す時に面倒だしたいして便利でもないことに気づくんだが
なぜかしばらくするとそのことを忘れる
127デフォルトの名無しさん:2011/09/24(土) 08:18:42.86
そこまで馬鹿ならそういう気付いたことを書きこむメモを用意しておいて都度読むようにしたら?
128デフォルトの名無しさん:2011/09/24(土) 09:19:31.32
バリアント型でもいいな
129デフォルトの名無しさん:2011/09/24(土) 13:38:23.67
dataクラスを継承した個々のクラスを作っといて
data* data_child1 = new child_data1();
data* data_child2 = new child_data2();
とかしてdata_child1とdata_child2をコンテナに突っ込んどいて
get_data()したら個々のサブクラスのデータが取り出せるとかいう話じゃなくて?
130デフォルトの名無しさん:2011/09/24(土) 15:45:30.95
なんでも詰め込めてんぎも”っぢいいいなんてやってるような情弱はアプリ設計力皆無のスクリプト土方
131デフォルトの名無しさん:2011/09/24(土) 17:05:20.00
Smalltalk に対する禿の批判がそういう方面の話だったな
132デフォルトの名無しさん:2011/09/24(土) 17:23:24.88
急にキレてるヤツなんなの
嫌な思い出でもあるのか
133デフォルトの名無しさん:2011/09/24(土) 17:37:58.54
キレてる人なんていないけど…?
134デフォルトの名無しさん:2011/09/24(土) 19:10:13.05
c++のために大量のエラー処理や書法を覚えて
ゲロゲロなコードを書くやつ奴がバカなのか、
それとも覚えられない奴がバカなのか教えて下さい。
135デフォルトの名無しさん:2011/09/24(土) 19:27:10.51
>>134
それは C++ に限った問題じゃないだろ

ioccc の中の人はバカだと思うか?
あれが読めないとバカか?

// ioc++cc は今できないだろうな
136デフォルトの名無しさん:2011/09/24(土) 19:44:22.95
STLのQueueの用途が解らん。
非同期ならパイプやOSのキュー使うし、
同期なら必要ないし、いったいどういう用途を想定してんだろ
137デフォルトの名無しさん:2011/09/24(土) 19:49:06.65
あんなアーティティックなコードを例に挙げられてもな…。
気になっているのは、cとc++の間にある大きな隔たりだよ。
STLや例外処理なんて本当に必要だったのか?
綺麗なcのコードを読んだ後に、ゲロゲロとした自分のc++のコードを見ると
もはやc++の存在自体が邪悪に見えてくるんだよ
138デフォルトの名無しさん:2011/09/24(土) 20:05:56.94
>>137
なんで自分のせいだと思わないの?
139デフォルトの名無しさん:2011/09/24(土) 20:08:47.01
奇麗なcのコードなんて存在しない
140デフォルトの名無しさん:2011/09/24(土) 20:12:47.70
そりゃ、おまえの回りに派遣グラマや土方しかいないからだろ
141デフォルトの名無しさん:2011/09/24(土) 20:13:31.28
>>137
なんでCで満足してるやつがC++使ったらゲロゲロなコードになるんだ?
ほとんど同じコードで同じ動作するのに。
142デフォルトの名無しさん:2011/09/24(土) 20:38:15.05
C 好きだからこそ例外と RTTI が早く醒めて欲しい悪夢なんだよ
STL は中途半端がいやなだけでそれ自体が消えて欲しいわけではない
143デフォルトの名無しさん:2011/09/24(土) 20:42:23.22
使わなきゃいいじゃん
Cだって標準で用意されてるからってgets使うやつはいないでしょ

例外とRTTIは規約で禁止してるとこも多いんじゃないかな?
144デフォルトの名無しさん:2011/09/24(土) 21:05:15.21
>>142
俺は使わんけど実行時型情報の何がだめなのか解らん。
構造体情報を短期的に保存するなら実行時型情報便利じゃん。
短期保存用途にも関わらずわざわざ同じ仕組みを用意するのは無駄。
145デフォルトの名無しさん:2011/09/24(土) 22:13:39.16
decltpypeも似たようなものか?

というか、こちらの方が便利さよりも混乱をもたらすように思うが。
146デフォルトの名無しさん:2011/09/24(土) 22:38:44.22
デクルトパイプッ
147デフォルトの名無しさん:2011/09/24(土) 22:52:01.32
例外批判するやつは多いけどそういうやつで戻り値とerrnoチェックしてるやつが少ないんだよな
結局エラー処理のないコードが綺麗に見えてるだけ。そりゃそうだろうよ

もちろん大半がそうってだけでちゃんと書いてるやつもいるけど
148デフォルトの名無しさん:2011/09/24(土) 23:06:17.49
>>136
単にインターフェースが制限されたdequeだと思えばいいよ
149デフォルトの名無しさん: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 内でも使いたい。
150デフォルトの名無しさん:2011/09/24(土) 23:15:49.33
finaly の位置がおかしいけど気にしないで
151デフォルトの名無しさん:2011/09/24(土) 23:18:11.73
ああ、例外自体を否定してるわけじゃないです。
戻り値とは別にエラーを返せるのはありがたいし。
ただ、try 文でスコープを完結させるのはマジ勘弁
152デフォルトの名無しさん:2011/09/24(土) 23:40:47.74
>>144
便利というだけで言語がサポートすべきなら GC もそうなんだが
だったら C++ 自体がいらない子
153デフォルトの名無しさん:2011/09/24(土) 23:45:50.29
>>149
場合によりけりかなぁ
例えばprintfはエラーを返すけどその中のどこでエラーが起きたか……なんて気にしないでしょ。標準ライブラリでなくてもPOSIXやWin32でも。

どこで起きたかって情報を完全に不要にするのは難しいしそれが必要になることもあるけど、その情報が頻繁に必要になるのは関数が持つエラー通知のインターフェースの作りがよくないんだと思うよ
これはエラー処理にC++の例外を使用するかは関係ない
154デフォルトの名無しさん:2011/09/25(日) 00:02:00.17
>>149
どこで起きたかの情報を保持する例外投げればいいんじゃない?あなたはあほなの?
155デフォルトの名無しさん:2011/09/25(日) 00:12:43.34
本当定期的に例外が使えない奴が沸くよな
組み込みやゲームとか処理がタイトなものならともかく、
普通使うだろ
156デフォルトの名無しさん:2011/09/25(日) 00:25:38.82
例外使ったほうが速度も出るってレポートどっかにあったよね
157デフォルトの名無しさん:2011/09/25(日) 00:28:49.56
>>152
主張は理解できるが
GCが便利かといわれるとちょっとどうかなw

RTTIはテストやデバッグ実行時のときは便利だよね
それ以外ではコンパイラでoffにしてる
エラー発生位置もそうだけどRTTIつかいまくりの設計もどうにかしたほうがいいと思うぞ
便利なのはわかるけど普通不要だから
158デフォルトの名無しさん:2011/09/25(日) 00:30:25.67
仮想関数を正しく使うとRTTIが必要な場面は滅多にないな
if文の羅列とかもうやめたい
159デフォルトの名無しさん:2011/09/25(日) 00:30:29.41
>>144
サイズが増える
160デフォルトの名無しさん:2011/09/25(日) 00:51:58.21
>>159
組み込みの現場ぐらいでしか問題にならんだろ
161デフォルトの名無しさん:2011/09/25(日) 00:55:55.89
>>158
dynamic_castってRTTI使ってたっけ?
仮想関数テーブルで判定してるだけじゃない?
162デフォルトの名無しさん:2011/09/25(日) 01:00:48.71
>>161
使ってる
163デフォルトの名無しさん:2011/09/25(日) 05:28:10.30
dynamic_castはクロスキャストもいけるからな
結構複雑
164デフォルトの名無しさん:2011/09/25(日) 08:33:42.66
class IItem {};
class 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. その他
165デフォルトの名無しさん:2011/09/25(日) 09:17:58.62
型の判断が必要な処理は全部仮想関数にする。
そういう風に基底クラスのインタフェースを定義する。
166デフォルトの名無しさん:2011/09/25(日) 09:46:25.09
仮想関数で完結するのがベストだな
じゃないと何の為に派生してるのやら分からん

ただ、AにBの派生クラスを登録して、
Aの派生クラスからBの派生クラスを使う、
というような場合にはdynamic_castもやむを得ない場合もある
167デフォルトの名無しさん:2011/09/25(日) 13:09:59.73
コンパイラスイッチ一発でgc走るようにならんかな
メモリリーク周りのバグだけ残して、期限までに納品とかできるのにな
バックログは後々で修正してさ
168デフォルトの名無しさん:2011/09/25(日) 15:59:41.98
今どきCならともかくC++でメモリリークって起きにくくね
169デフォルトの名無しさん:2011/09/25(日) 16:08:32.66
言語に関係なく解放しなければメモリリークする
170デフォルトの名無しさん:2011/09/25(日) 18:53:08.88
デストラクタのあるC++でメモリリーク
させる奴は殺害もの
171デフォルトの名無しさん:2011/09/25(日) 19:02:43.66
>>164
なんのために抽象化したリストに突っ込むかによるだろ。
ダウンキャスト的な動作が必要なら、少々とこばっても最初から
元の型を保持したリストを別途用意しとくほうがマシ。
そもそも抽象化したリストに投入する事は、元の型を捨てるという意味だから。

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);
172デフォルトの名無しさん:2011/09/25(日) 21:20:11.60
標準のファイルでcloseに失敗したとしてそれを復旧する方法ってあるの?
無視してそのままアプリ実行したらまずいのかな
173デフォルトの名無しさん:2011/09/25(日) 21:27:11.82
書き込み完了を確実にしたいならflush();
flush()で失敗したら、書き出し先ドライブを変えるとかユーザーにリカバリーを選択させる。
closeで失敗したら、失敗したよってユーザーに通知することぐらいしかできないだろ。
あとは、ダンプを作成してどっかに吐き出しとくことぐらいか。
174デフォルトの名無しさん:2011/09/25(日) 21:30:15.27
>>170
そうはいってもメモリ管理はミスる時にはミスります。malloc()/free() となんらかわりません。
175デフォルトの名無しさん:2011/09/25(日) 21:31:07.40
なるほど
フラッシュで失敗したばあいはいくらでも復旧可能
フラッシュで成功したばあいは直後のクローズで失敗しても特に実害は無いのでご自由に
というかんじか
フラッシュの使い道初めて知ったよとんくす
176デフォルトの名無しさん:2011/09/25(日) 21:32:57.13
コンストラクターでメモリ開放してなかったりな。
そもそもコンストラクターでオブジェクトの作成なんてする必要があるか疑問だが。
配列を確保するならまだしもね。
177デフォルトの名無しさん:2011/09/25(日) 22:00:40.25
>>176
何が言いたいのかさっぱりわからない。
コンストラクタでオブジェクト作成しなかったら何するの?って感じなんだけど。
178デフォルトの名無しさん:2011/09/25(日) 22:06:43.41
オブジェクトの作成というかnewか。
基本的にはメンバー変数に実体を置くか、
外部のオブジェクトを参照するだけで十分な筈。
メモリー操作が必要となるのは、配列かAPIのリソースぐらいじゃん。
179デフォルトの名無しさん:2011/09/25(日) 22:09:55.79
一応close()が失敗しても回復処理とる事もできなくは無いけどな。
新たに別のファイルを開き直して、もう一回出力とか。
180デフォルトの名無しさん:2011/09/25(日) 23:02:56.12
>>178
お前がそう思うんならそうなんだろう、お前ん中ではな(AA略
181デフォルトの名無しさん:2011/09/25(日) 23:10:29.50
>>176
もしかして誤字ではなく本気で open と言っているのか?
182デフォルトの名無しさん:2011/09/25(日) 23:12:39.10
他にどんな用途でオブジェクトをnewするんだよ。
まさか、クラスのメンバーにfstreamのポインター置いて、
クラス内で new と delete を繰り返してるとか?
それともfunctionクラスみたいに型をカプセル化する
オブジェクトを内包しててnewで生成してるとか?
前者は作りを見直すべきだし、後者は滅多に
つくるようなもんじゃないよな。
183デフォルトの名無しさん:2011/09/25(日) 23:13:42.92
>>181
誤爆か?
184デフォルトの名無しさん:2011/09/25(日) 23:19:33.79
ポインタにNULLを代入して何回でもdeleteしてやる
185デフォルトの名無しさん:2011/09/25(日) 23:29:25.53
>>176 はたぶん
「RAII の徹底が不十分な場合、コンストラクタの途中で例外が出てメモリリークする
 ことがある」
ということを言いたかったんだと思うんだけど、合ってるかな?
186デフォルトの名無しさん:2011/09/25(日) 23:37:28.34
コンストラクターの途中で例外でメモリーリークはその通り。
例外が発生すればメモリーリークになるわけじゃないけど、
ちゃんと例外発生時の例外処理を書いてないとメモリーリークになる。

RAIIはどうでもいいけど。いくら例外処理で対処できるとはいえ、
NULL初期化とかが必要になるコンストラクターのメモリ操作自体は減らすべき。
187デフォルトの名無しさん:2011/09/25(日) 23:38:19.03
pimplとか
188デフォルトの名無しさん:2011/09/25(日) 23:43:33.52
要するにこう書くのがミスしやすくて問題なんだろ

class 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;
        }
};
189デフォルトの名無しさん:2011/09/25(日) 23:57:53.46
なんのためにスマポがあると思ってん
190デフォルトの名無しさん:2011/09/25(日) 23:57:56.14
ユニポでおk
191デフォルトの名無しさん:2011/09/25(日) 23:58:15.75
それって「素直にスマートポインタ使っとけ」で結論でてると思ってたんだけど違うの?
192デフォルトの名無しさん:2011/09/26(月) 00:05:40.59
>>186
なんでその文脈でRAIIを選択肢から外すんだよw
193デフォルトの名無しさん:2011/09/26(月) 00:07:47.94
例外とRAIIを否定する奴は大抵の場合アホ
194デフォルトの名無しさん:2011/09/26(月) 00:08:00.12
>>188
その catch の中の a,b,c へのアクセスはすべて未定義動作。ミスとか関係ない。
195デフォルトの名無しさん:2011/09/26(月) 00:10:11.32
もともとメンバーに実体で割り当てりゃいいものをいちいちスマポで割り当てる理由が解からん。
196デフォルトの名無しさん:2011/09/26(月) 00:13:14.36
>>194
なんで未定義になるんだ?
197デフォルトの名無しさん:2011/09/26(月) 00:13:43.22
>>195
実体で割り当てたんじゃ要求を満たせないときに new するに決まってんだろ。
メンバの寿命とクラスの寿命がずれてるとか、途中で具象クラスを入れ替えるとか、
考えれば出てきそうなもんだ。
198デフォルトの名無しさん:2011/09/26(月) 00:15:34.48
>>194
え?
199デフォルトの名無しさん:2011/09/26(月) 00:16:00.87
>>196
http://blogs.wankuma.com/episteme/archive/2011/02/20/197105.aspx#197169
15.3 p10 でそう決められているから、らしい。

そんなのコンパイルエラーにしろよとは思う。
200デフォルトの名無しさん:2011/09/26(月) 00:17:19.68
まともにやってるヤツは構わんけど、よくよく考えれば無意味にnewした
メンバー割り当てるヤツがいるから書いたんだよ。
pimpとかは大事だけど、単にリソース開閉のためだけにメモリ操作するなんて無駄じゃん。
201デフォルトの名無しさん:2011/09/26(月) 00:20:37.49
>>199
そこ見ても解るけど問題起きるのは規格に準拠してないコンパイラだけでしょ。
202デフォルトの名無しさん:2011/09/26(月) 00:21:09.41
>>199
ああ >>188 よく見たら function try block になってる(?)のか。
コンストラクタ本体の中で try ... catch するぶんには問題ないよね。
203デフォルトの名無しさん:2011/09/26(月) 00:23:20.69
>>200
そこから「コンストラクタでnew」まで攻撃対象を辺に拡大するから話がおかしくなってる。
ふつうにその無駄を叩けよ。
204デフォルトの名無しさん:2011/09/26(月) 00:27:23.90
すまん。
205デフォルトの名無しさん:2011/09/26(月) 00:28:21.20
>>202
そうだけど、188が function try block のつもりじゃないとしたら、 throw; が抜けてる。
206デフォルトの名無しさん:2011/09/26(月) 00:29:13.71
>>199
これは : がないからfunction-try-blockじゃなくて普通にコンストラクタ内部のtryブロックだろ
{}を書き忘れただけじゃねーかな
207デフォルトの名無しさん:2011/09/26(月) 00:29:31.45
>>201
どこにそんなこと書いてあるの?
208デフォルトの名無しさん:2011/09/26(月) 07:06:32.24
delete 0;は常に何もしないことが保証されてなかったか?
209デフォルトの名無しさん:2011/09/26(月) 07:28:53.09
親クラスで例外が出た場合、
メンバー関数が初期化された状態で、
例外処理に入るとは限らない。
的な事じゃ無いんだろうか。
210デフォルトの名無しさん:2011/09/26(月) 12:33:45.41
WinRTで>>52が望んでいたものがそのまま出てきたな
211デフォルトの名無しさん:2011/09/26(月) 13:24:29.55
>>208-209
コンストラクタでfunction-try-blockを使ってるなら
function-try-block中で例外が発生した時点で構築済みの基底クラスやメンバ変数は破棄されて無効なオブジェクトになるので
その後のcatch節の中ではアクセスしてはいけない、ってこと。
ttp://codepad.org/6zad5CVy
212デフォルトの名無しさん:2011/09/26(月) 14:12:37.12
もっとも>>188はfunction-try-blockではないようなので>>211とは関係ないんだけど
213デフォルトの名無しさん:2011/09/26(月) 15:14:06.62
もうみなさんはlambdaをガンガン使ってコード書いてるの?
214デフォルトの名無しさん:2011/09/26(月) 21:18:22.73
>>211
引数はどうなんの?やっぱり未定義かえ?
215デフォルトの名無しさん:2011/09/26(月) 22:15:43.84
発見しちゃったんだけどなんか使い道あるかな?
class a{
operator a(); // これ作れちゃうんだ
};
216デフォルトの名無しさん:2011/09/26(月) 22:30:59.94
mmapで確保したメモリー空間にヒープを構築しようと思う。
プールを渡してやったらファーストフィットやらベストフィットやらを
サクッと構築できるライブラリとかないかな。
217デフォルトの名無しさん:2011/09/27(火) 00:07:08.50
>>214
引数の寿命はfunction-try-blockのハンドラを抜けるまで延長される。だから引数にはアクセスできる。
ttp://codepad.org/0wwV4V4w
218デフォルトの名無しさん:2011/09/27(火) 01:01:19.97
延長されるっていうか、普通に考えておkってことだね。
219デフォルトの名無しさん:2011/09/27(火) 01:02:49.39
char*が引き数ってなんなんだよ…
220デフォルトの名無しさん:2011/09/27(火) 07:13:06.38
>>217
規格上はやっぱりセーフなんだ。良かった。
221デフォルトの名無しさん:2011/09/27(火) 07:36:18.86
>>215
aにキャストしても呼ばれないし、
aの派生クラスbを作ってaに代入やキャストしても呼ばれないし、
operator aを直接呼ばないと呼ばれないっぽ
環境依存かもしれないけど
使い道はなさげ
222デフォルトの名無しさん:2011/09/27(火) 08:19:27.19
C++でググったサイト見てると、C++の例外はgdgdなので使わない方がいいという意見があり、スコット・メイヤー先生の著書ではエラー処理には例外を使えとあるのですが、みなさんは例外使ってます?
223デフォルトの名無しさん:2011/09/27(火) 09:24:53.29
うん。
224デフォルトの名無しさん:2011/09/27(火) 09:48:59.65
>>222
> 使わない方がいいという意見
どこ見たの?
225デフォルトの名無しさん:2011/09/27(火) 11:42:28.77
類は群れる
226デフォルトの名無しさん:2011/09/27(火) 12:17:30.45
ラムダは割と使う
便利だし
227デフォルトの名無しさん:2011/09/27(火) 13:01:40.64
ラムダをループ毎に一回一回生成すると無駄にコストが掛かりますか?
228デフォルトの名無しさん:2011/09/27(火) 13:06:09.17
>244 本人じゃないが
試しにググって見たら、「C++ 例外 使わない」 で12,400件でたぞ。意外と多い。w
おれは、半々だな、使う部分と使わない部分がある。
229デフォルトの名無しさん:2011/09/27(火) 13:20:16.77
>>216
構造としてのヒープじゃなくて領域としてのヒープか?
ファーストフィットだけならsimple segregated storageってのがあるからそれを実装したライブラリで領域を外から与えられるやつ探せばいいと思うよ
一応boostにもあるけど領域を外から与えられるかどうかはわからん


データ構造のほうならstd::make_heapで
230デフォルトの名無しさん:2011/09/27(火) 18:50:38.32
Google先生は例外を使わないと規約で決めてるっぽいけど
それを達成するには例外を利用する標準ライブラリを
例外の出ないタイプのものに置き換える必要があるから
正直そこまでやるのもどうかと思う
231デフォルトの名無しさん:2011/09/27(火) 19:05:00.98
徹底したくなるほど過去の資産の価値がすごいんだろう
232デフォルトの名無しさん:2011/09/27(火) 19:34:48.29
1. 戻り値として true/false か NULL を返せない
2. エラーが発生したときに落ちることを許可しない

1 && 2 であれば、例外を使用する

bool TryGetHoge(Hoge * pOutput) // Nothrow
const Hoge * GetHogeOrNull() // Nothrow
const Hoge & GetHogeOrThrow() // Hoge が取得できないばあいはスロー
const Hoge & GetHogeOrDie() // Hoge が取得できない → 死
233デフォルトの名無しさん:2011/09/27(火) 19:42:16.44
>>227
無駄にコストが掛かる、ってのはどういうこと?
C++は原則的に要求された機能を実現するのに必要なだけのコストしか掛けない。
プログラマが実際には使わない機能を含めて要求していたならその分無駄にコストが掛かるといえるけど
それは具体的な状況次第。
234デフォルトの名無しさん:2011/09/27(火) 19:58:52.24
キャプチャ次第じゃないの
関数の本体自体を生成してるわけじゃないんだし
235デフォルトの名無しさん:2011/09/27(火) 20:02:51.22
キャプチャしないとただの関数に最適化される
236デフォルトの名無しさん:2011/09/27(火) 20:05:16.85
[&]ならどうせスタックフレーム渡してるだけだろうから
大した事ないよね
237デフォルトの名無しさん:2011/09/27(火) 20:15:39.34
>>232
例外が発生したところで、根っこでキャッチする限り落ちることはなくね?
それが良いわけでもないけどさ。
逆にエラー無視してたらまずくね?
いずれセグメントエラーでも起こして無断で死ぬでしょ。
238デフォルトの名無しさん:2011/09/27(火) 20:17:09.46
ごめん例外を出さないパターンとはやとちりした。
239デフォルトの名無しさん:2011/09/27(火) 20:21:25.77
int main(void)
{
try { return Main(void); } catch(...) { Message("Fackin Error !!!"); return 1 ; }
}
240デフォルトの名無しさん:2011/09/27(火) 21:34:14.78
あまり酷いエラーはそのまま死んだ方がいいってこともあるよね
241デフォルトの名無しさん:2011/09/27(火) 21:40:07.15
>>229
simple segregated storageかいいね。ありがとう。
242デフォルトの名無しさん:2011/09/28(水) 19:33:43.19
コンストラクタのメンバ関数ポインタって取得できますか?
243デフォルトの名無しさん:2011/09/28(水) 19:36:12.71
とれませんよそんなの
244デフォルトの名無しさん:2011/09/28(水) 19:57:25.79
ありがとう。そして素早い回答に感動した
245デフォルトの名無しさん:2011/09/28(水) 20:08:28.29
>>225

チムポも蒸れる
246デフォルトの名無しさん:2011/09/28(水) 20:18:05.22
コンストラクタのメンバ関数ポインタを取得する裏技はないものかねえ
247デフォルトの名無しさん:2011/09/28(水) 20:26:59.49
そんなものいらん
248デフォルトの名無しさん:2011/09/28(水) 20:27:37.84
コンストラクタはメンバ関数じゃないから
249デフォルトの名無しさん:2011/09/28(水) 20:32:50.41
>>246
初期化のコンスラクタを呼びたいだけじゃないのか?
それならるぞ。
250デフォルトの名無しさん:2011/09/28(水) 20:42:54.84
可変テンプレートを自作すりゃ見せかけは出来なくはないがね。

Type (*constractor)(int) = &Constractor<Type(int)>;
Type object = constractor(10);
251デフォルトの名無しさん:2011/09/28(水) 20:45:30.98
標準のnewやmallocはスレッドセーフですか?
252デフォルトの名無しさん:2011/09/28(水) 20:52:11.40
>>251
マルチすると一部の人はヘソを曲げて答えてくれなくなっちゃうぞ
253デフォルトの名無しさん:2011/09/28(水) 20:55:55.25
>>252
すいません
向こうは違う人が連投してるので埋もれてしまうかと思ったのでこっちにも書きました
254デフォルトの名無しさん:2011/09/28(水) 21:05:50.85
>>251
VCならmtライブラリの物はスレッドセーフだろうけど他のコンパイラは知らん
一応アトミックにしとかないとまずいんじゃね?
255デフォルトの名無しさん:2011/09/28(水) 21:09:00.94
C++11以前のC++はスレッドの事を知らんだろ。
処理系依存じゃね。
256デフォルトの名無しさん:2011/09/28(水) 21:09:34.40
new delete malloc freeは単体ではスレッドセーフだが、
new - delete malloc - free はついだから、注意がとても必要。
257デフォルトの名無しさん:2011/09/28(水) 21:11:37.90
まあスレッドセーフじゃないとな
258デフォルトの名無しさん:2011/09/28(水) 21:13:41.58
えっ標準でいちいちロックしてんのか
規格表にあったっけ
259デフォルトの名無しさん:2011/09/28(水) 21:16:07.36
>new - delete malloc - free はついだから、注意がとても必要。
これ、誤解受けそうだから、
new  deleteが別のスレッドでもいいが、主にタイミングの問題な。
260デフォルトの名無しさん:2011/09/28(水) 21:17:05.34
mmapとかVirtualAllocとか、低レベルなOSの実装部がやってるだろ。
newのコンストラクタ呼び出しとか、deleteデストラクタ呼び出しとかは、
スレッド関係ないから、その辺は排他なんて何もしてないだろうけど。
261デフォルトの名無しさん:2011/09/28(水) 21:19:30.73
まとめると
malloc, free, operator new, operator delete
はそれぞれの関数内ではスレッドセーフということですかね
ありがとうございました
262デフォルトの名無しさん:2011/09/28(水) 21:21:07.32
OK
263デフォルトの名無しさん:2011/09/28(水) 21:25:09.48
>>261
向こうのスレに解決したこと書いておくように
マルチすると解決したあとも面倒だぞ
264デフォルトの名無しさん:2011/09/28(水) 21:27:10.45
単純にoperator newとoperator deleteと言うと基本的にスレッドセーフじゃ無い
上の方でヒープを自作するといってる人がいたが、そういう自作できる人が
排他を組み込んでなかったらアウト。
265デフォルトの名無しさん:2011/09/28(水) 21:33:54.38
オーバーロードされたらその限りではない、
ってのは演算子の基本ではあるわな
&&と||のショートサーキットとか
266デフォルトの名無しさん:2011/09/29(木) 00:57:17.41
>>251-265
C++11 から、それら自体に要求される Data race 耐性が規定されるようになったよ。
18.6.1.4 [new.delete.dataraces]
267デフォルトの名無しさん:2011/09/29(木) 01:09:52.66
11が普通に使えるように普及するのは何年後になるかねぇ。
268デフォルトの名無しさん:2011/09/29(木) 01:37:55.19
streamの拡張について相談です。
ここ( 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>で行わせたいんです。
269デフォルトの名無しさん:2011/09/29(木) 01:44:19.93
270268:2011/09/29(木) 02:01:42.34
>>296
boost.iostreamsのページは一応読んだんだけどもうまく頭に入らなくて……
寝て起きたらもう一回読んでみる
271デフォルトの名無しさん:2011/09/29(木) 04:40:36.40
std::stringstreamじゃだめなのか
272デフォルトの名無しさん:2011/09/29(木) 05:44:21.92
シリアライズして機種間の依存を無くしたいのでは?
stringstreamではエンディアンの問題が残ってしまう
273デフォルトの名無しさん:2011/09/29(木) 14:11:38.30
cout << "name1 " << name1 << " name2 " << name2 ...
みたいなデバックプリントをもっとタイプ数少なくやってくれるlibraryとか便利関数ないものでしょうか
stdの中にあるとincludeするだけで使えて一番いいのですが
274デフォルトの名無しさん:2011/09/29(木) 17:21:43.14
自分でそういう関数作れば可変長引数とsprintfとかですぐできそうだが
275デフォルトの名無しさん:2011/09/29(木) 17:31:30.91
バグベアードでも使っとけよ
276デフォルトの名無しさん:2011/09/29(木) 17:48:49.41
setjmp/longjmp をクラスのデストラクタと一緒に使うとおかしなことおきるみたいですが
http://d.hatena.ne.jp/chiharunpo/20110509/1304942799
常に安全側に自動的になるような仕組みないでしょうか?

普通の関数でも
boost::functionに代入してからいろいろしてるので
setjmp/longjmp
使うの不安だ
277デフォルトの名無しさん:2011/09/29(木) 18:00:05.11
>>276
ない
278デフォルトの名無しさん:2011/09/29(木) 18:01:39.96
>>276
mallocとdeleteを組み合わせるようなもんじゃねーの
279デフォルトの名無しさん:2011/09/29(木) 18:36:03.44
std::ostringstream と std::sprintf どっちが早いですか?
280デフォルトの名無しさん:2011/09/29(木) 19:22:10.92
>>279
sprintf
281デフォルトの名無しさん:2011/09/29(木) 19:41:15.36
そもそもC++でsetjmp/longjmpは使うな
絶対にだ
282デフォルトの名無しさん:2011/09/29(木) 19:46:29.35
c++0xでもダメなの?
283デフォルトの名無しさん:2011/09/29(木) 19:55:30.62
C++03
The 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.
284デフォルトの名無しさん:2011/09/29(木) 20:00:46.38
std::longjmp
なんてものがあるんだね
285デフォルトの名無しさん:2011/09/29(木) 20:04:25.74
C++03
シグネチャ longjmp(jmp_buf jbuf, int val) はこの国際規格では(Cの規格)より振る舞いが制限されている。
任意の自動変数が例外によってプログラム内の制御が別の所に移動する事により破棄されようとするような場合に、
その throw を行う地点での別の場所に制御を移動するような longjmp(jbuf, val) の呼び出した際の振る舞いは未定義である。

分かりにくい表現だけど、要するに、
throw だと制御が他に移動した時にもちゃんとデストラクタ呼んでくれることが保証されるけど、
throw の代わりに longjmp を使った場合はそれが保証されない(未定義になる)ということ。

C++11も文言は変わってるけど似たような事を言ってる。
286デフォルトの名無しさん:2011/09/29(木) 20:05:13.41
何か日本語おかしくなってたけど
直した所で分かりやすくならないのでいいや
287デフォルトの名無しさん:2011/09/29(木) 21:06:29.06
C++でsetjmp/longjmpが必要な時点で何かがおかしい
288デフォルトの名無しさん:2011/09/29(木) 21:17:53.32
例外使用禁止だお
だからsetjmp/longjmp使うお
289デフォルトの名無しさん:2011/09/30(金) 05:56:37.28
やーーめーーろーーよーー
戻り値エラーコードで我慢しろ
290デフォルトの名無しさん:2011/09/30(金) 06:03:01.35
そんなに例外が嫌いならEC++でも使ってろ
291デフォルトの名無しさん:2011/09/30(金) 06:05:27.95
俺は禁止される側だお
292デフォルトの名無しさん:2011/09/30(金) 06:08:59.17
インターフェースがエラーコード返すようになってないお
インターフェースは変更できないお
293デフォルトの名無しさん:2011/09/30(金) 06:27:01.75
例外catchしてエラーコード返すようにラッピングすればいい
294デフォルトの名無しさん:2011/09/30(金) 06:34:25.41
それ例外使ってるやん
295デフォルトの名無しさん:2011/09/30(金) 06:40:19.69
利用してないだろ
296デフォルトの名無しさん:2011/09/30(金) 06:44:58.77
それってC++例外を有効にするをいいえにしても使えるのかお?
どっちにしろコードレビューではねられる気がするお
297デフォルトの名無しさん:2011/09/30(金) 06:48:37.87
そもそも例外を使うなという条件で
そのインタフェースを提示してる時点で
コードレビューにひっかかるだろw
298デフォルトの名無しさん:2011/09/30(金) 06:54:03.14
インターフェースはコードレビューする人が決めるお
299デフォルトの名無しさん:2011/09/30(金) 07:12:42.76
例外使う前提でインタフェース決めてるってことだから
そこに例外使うなというのを後から突っ込んでる時点で
まともな話にならないのは当然だお
300デフォルトの名無しさん:2011/09/30(金) 07:38:59.94
template <typename T, typename U>
bool try_lexical_cast(const U & input, T * pOutput)
{
 try {
  *pOutput = lexical_cast<T>(input);
  return true;
 } catch (bad_lexical_castだっけ? &) {
  return false;
 }
}
301デフォルトの名無しさん:2011/09/30(金) 08:13:13.76
>>288
signalかerrnoを使えばいい
302デフォルトの名無しさん:2011/09/30(金) 08:29:33.44
すべての関数をnothrowにして返り値型をoptionalで統一すればいいよ
303デフォルトの名無しさん:2011/09/30(金) 09:09:15.30
boost::optional<void>
304デフォルトの名無しさん:2011/09/30(金) 09:20:20.49
関数を全て継続渡し形式にしたら遅くなった

C++11のlambdaって
まさかコンパイル時じゃなくて実行時生成なの?
305デフォルトの名無しさん:2011/09/30(金) 11:38:31.56
>>304
普通の関数オブジェクトになるよ
キャプチャしてればその領域の確保を実行時に行う
してないなら普通の関数と同じ

もちろん処理系によってはそうじゃないかもしれないが
306デフォルトの名無しさん:2011/09/30(金) 12:52:44.62
>>302
エラーの種類やメッセージとか全部捨てていいならな。
307デフォルトの名無しさん:2011/09/30(金) 16:42:13.17

ifstreambuf_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>での
例題しか載っていません。


308デフォルトの名無しさん:2011/09/30(金) 17:08:13.75
bool TryGetHoge(Hoge *pHoge)
っていう関数があるとする

戻り値が false であったばあい、*pHoge は
1. NULL が代入されている
2. 全く手付かず
どちらの方が連想されて、どちらの方が望ましい?
309デフォルトの名無しさん:2011/09/30(金) 17:12:46.38
色々とミスったので再投稿

bool TryGetHoge(Hoge **ppHoge)
っていう関数があるとする

戻り値が false であったばあい、*ppHoge は
1. NULL が代入されている
2. 全く手付かず
どちらの方が連想されて、どちらの方が望ましい?
310デフォルトの名無しさん:2011/09/30(金) 17:25:00.96
>2. 全く手付かず
意味不
311デフォルトの名無しさん:2011/09/30(金) 18:32:15.51
>>306
オプショナルを真似て自作すればいいじゃん
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 ; }
こんな感じのインターフェースで十分だろ
312デフォルトの名無しさん:2011/09/30(金) 18:35:36.33
>>309
エラーが発生した場合
@保証なし
Aメモリリークなどが起こらない保証
B関数を呼ぶ直前まで巻き戻る保証
基本的に数字が大きいほど親切な設計
ただし数字が大きいほど無駄なコストが掛かる場合が多い
コストが気にならない処理なら常にBを心がけよう
313デフォルトの名無しさん:2011/09/30(金) 18:50:49.70
>>307
残念ながらifstreambuf_iteratorはそういう風に使うものじゃない
charかwchar_tしか使えないものと思うべし
(traisを定義したらうまくいくのかもしれないけど、まずそういう使い方しないのでよく分かんない)
314デフォルトの名無しさん:2011/09/30(金) 18:54:04.34
>>307
boost::serialization 使え
315デフォルトの名無しさん:2011/09/30(金) 18:59:25.28
>>308
実際に存在するasprintfという関数だと実装で真っ二つなんだよなぁ
ただC++だとまずそのプロトタイプがどうなのよ?
316デフォルトの名無しさん:2011/09/30(金) 19:11:06.76
C++なら普通参照じゃね?ってことか
newして返されてもなー
317デフォルトの名無しさん:2011/09/30(金) 19:12:02.72
の前に、*pHogeの型はHogeだから
NULL代入ってのがよく分かんないってことか
318309:2011/09/30(金) 19:52:12.99
確かな話、Hoge * GetHoge() でエラー発生時に NULL 返すのが正しいわな

>>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
お前が何をいっているのか理解不能状態
319309:2011/09/30(金) 20:05:54.42
>>315
まさにそれの話やで
C#ならout引数にnullなりdefaultなりをつっ込まれることが予想できるんだが・・・
320デフォルトの名無しさん:2011/09/30(金) 20:12:06.41
ごめん
引数がHoge*に見えてた
321デフォルトの名無しさん:2011/09/30(金) 20:16:25.59
ぶっちゃけるとそういう細かい違いは「プロジェクトによって異なる(プロジェクト内では揃えたほうがいい)」以上の答えはないよ
その時々でサイコロでも振るか多数決でもすればいい
322デフォルトの名無しさん:2011/09/30(金) 20:26:35.80
エラーが発生したならその後は*ppHogeの値を利用してはいけない、
って意味でドキュメントには
 この関数がHogeの取得に失敗した場合はfalseを返し*ppHogeの値は不定となる。
って書いておいて実装は好きにすればいい。
323デフォルトの名無しさん:2011/09/30(金) 20:27:01.68
どうなるか規定してあれば使う側でどうとでもするよ
324307: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 を調べてみます。

325デフォルトの名無しさん:2011/09/30(金) 21:02:57.29
template <typename charT, typename traits = char_traits<charT> > だな
あくまで文字型を指定することを想定して作られてる
326デフォルトの名無しさん:2011/10/01(土) 09:03:48.34
意図的にメモリを断片化させてヒープ使用量を大きくする単純なサンプルないですか?
アプリ起動からどの程度でprivate bytesの上昇が落ち着くか見たいんだけど、自作のアプリじゃ処理を繰り返しても一向に横ばいにならなくて。
リークはしてないはずだけど同じ処理を100回ぐらいするとなぜか50KBくらいprivate bytesがぽこっと上がってメモリリーク疑われてます。
327デフォルトの名無しさん:2011/10/01(土) 09:07:40.15
リークはしてないはずという自信はどこから来るのか
328デフォルトの名無しさん:2011/10/01(土) 09:17:22.05
valgrindなりページヒープ使えって
329デフォルトの名無しさん:2011/10/01(土) 09:31:10.17
10000回で5MBなら間違いなくリークしてる
330デフォルトの名無しさん:2011/10/01(土) 10:18:02.36
質問
テンプレートクラスをヘッダファイルと定義を書いたcppファイルに分けて記述した場合、
これを更に他のファイルからヘッダのみインクルードし具体的な型にして使おうとすると、
その具体的な型の定義が見えないらしく、ヘッダかどこかで具体化してやる必要があります・・・か?
つまり、
テンプレートクラスの宣言をヘッダファイルに、定義をcppファイルに別々に書いた場合、
使うには一々具体化してやらねばならず、例えば将来定義する新たな型に対してはその都度
具体化してやらなければなりませんか?
言い換えると
任意の型に対しこれを適応するには宣言と定義別々に書いてはだめ、ということですか?
長くてスイマセン
331デフォルトの名無しさん:2011/10/01(土) 10:34:55.80
>>330
例えばこういうやり方はできる

/*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はつまり具体的な型がないとコンパイルできない
332デフォルトの名無しさん:2011/10/01(土) 10:42:50.98
>>331
ヘッダにcppインクルードしちゃうんですね
そんなやり方が有りとは
2重定義になったりしそうと思うのは杞憂ですかね?
333デフォルトの名無しさん:2011/10/01(土) 10:56:22.12
cpp違うのか、inl...
別に記述することはできるが、h-cppの組みでは無理そうですかねぇ
というのもこれまではテンプレートクラスは使わずよく使う関数・クラスをヘッダに宣言
cppに定義を、というスタイルでやっていたのでそのスタイルを保てるかなーと思ったんですが
334デフォルトの名無しさん:2011/10/01(土) 11:17:54.36
>>326
template<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]; }
335デフォルトの名無しさん:2011/10/01(土) 11:25:01.47
334の配列と返値無茶苦茶だった。まいいや
336デフォルトの名無しさん:2011/10/01(土) 11:46:56.73
nothrow信者向けのSTLっぽいライブラリってありますん?
337デフォルトの名無しさん:2011/10/01(土) 12:59:29.49
>>330
テンプレートクラスは定義も直接クラス内に書くのが一番だよ
外に出すと記述がやたら複雑になって読み辛いから

クラス内に書くとinline扱いになるけど、実質大して変わらない
(最適化レベルが上がれば大体の処理系でinlineの有無は関係なくなる)
338デフォルトの名無しさん:2011/10/01(土) 13:00:03.42
>>336
Googleに入社すれば好きなだけ使えるかと
339309:2011/10/01(土) 13:14:10.96
なるほど、どちらが良いかは一概にはいえないってことか
未定義の線で進めることにするよ
340デフォルトの名無しさん: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);
341デフォルトの名無しさん:2011/10/01(土) 13:50:18.39
みたいに分けれたらいいのに
342デフォルトの名無しさん:2011/10/01(土) 14:08:22.11
他の言語じゃ一覧性なんてないからそこは別にどうでも
オブジェクトブラウザやアウトラインみたいなので見ればいいじゃんいいじゃん
343デフォルトの名無しさん:2011/10/01(土) 19:30:37.04
>>326
そんな方法より、newとmalloc、deleteとfreeをオーバーロードかマクロで置き換えて、
確保されたメモリのアドレスがちゃんと解放に渡されてるか調べたほうが確実だろ。
344デフォルトの名無しさん:2011/10/01(土) 20:32:49.18
VC++ならメモリリーク検出関数があるぜ
345326:2011/10/02(日) 00:40:32.92
ツールの静的解析は既にやってるし、new、deleteも問題ないんだよね。
メモリのスナップショットとって解析したけどアプリ分のリソースに問題なさそうだし。
スレッドをバカバカ作成するポンコツアプリだから断片化してる可能性があるかなと。
常に斜めにメモリが上がるんじゃなく、不特定のタイミングで100回に1回ぐらい50KBくらい上がるってなんなんだろう?
346デフォルトの名無しさん:2011/10/02(日) 00:47:51.01
リソースリークの可能性は?
347デフォルトの名無しさん:2011/10/02(日) 02:35:47.16
>>345
RAIIは徹底しててその状態なの?
348デフォルトの名無しさん:2011/10/02(日) 09:43:09.60
本当にリークしてるのかってことがまず問題。そして

> ツールの静的解析は既にやってるし、new、deleteも問題ないんだよね。
> メモリのスナップショットとって解析したけどアプリ分のリソースに問題なさそうだし。
本当に問題ないかは最終的に原因が判明したあとで原因ではなかったところについてしかいうことはできない。
真犯人(=リークの原因)が明らかになるまでは可能性のある人全て(=リソースを扱う全ての箇所)が容疑者。
349デフォルトの名無しさん:2011/10/02(日) 09:59:19.46
>new、deleteも問題ないんだよね
と書いてるけど、自前でnew/deleteやってんのか?
350326:2011/10/02(日) 10:56:40.05
質問の仕方が悪かったみたいですね。すみません。
リークしてない前提でヒープをバシバシ使いメモリを断片化させる作りの悪いアプリを使い続けたときの動作を検証したいんです。
OSがデフラグして動きが安定するか、それがどんなタイミングなのか、またOS毎に違いがあるのか。
半年ぐらいかけてメモリの増加量を1/10ぐらいにして、もう分らなないので外部のコンサル会社に調査依頼したら、
「リーク以外にメモリの断片化がありますね」って回答なんだけど、断片化については運用環境で違うから環境毎に検証して、うちのアプリと動作を比較したいんです。
351デフォルトの名無しさん:2011/10/02(日) 11:06:12.86
>>350
そういえば、windowsだとマルチスレッドの場合、ランタイムはスタティックリンクするとリークするってのがあったと思うけど、それはどうかな?
352デフォルトの名無しさん:2011/10/02(日) 11:14:25.95
断片化くらい沢山newして歯抜けでdeleteすればいいだけだろ
353デフォルトの名無しさん:2011/10/02(日) 11:40:58.88
メモリを必要分確保して自前で管理したら断片化しないが。
354デフォルトの名無しさん:2011/10/02(日) 11:43:38.10
>>352
そのnew、deleteの繰り返しが断片化の原因なんだが。
一度、確保したらアプリ終了までその領域を使い回せば断片化なし。
355デフォルトの名無しさん:2011/10/02(日) 11:45:46.89
>>354
お前は何を言ってるんだ?
356デフォルトの名無しさん:2011/10/02(日) 12:55:53.97
なんか用語の意味がずれてて話がかみあっていないような。

一般的にいわれる断片化による問題ってのは空き容量は充分にあるのに
空き容量以下だけどある大きさ以上の連続した領域が確保できなくなるってもので、
謎のメモリ使用量があるっていう>>326の話とは違うものだろ。

>>326がいってるのは任意の大きさでなく既定の大きさ(固定や2のべき乗)でしかメモリ確保できない環境での
要求量と確保量のずれによる無駄の話なんじゃないのか。
357326:2011/10/02(日) 13:16:19.94
>>351
以前はそれもあったのでリークしないほうの新しいAPIに置き換えてます。

>>353
自前で使う分はなんとかリファクタリングしたんですが、スレッド生成とかでもヒープを使用するとかで、スレッド部分は見直したけどまだあるみたいです。

アプリ起動時からメモリ領域の再利用が始まり安定するまである程度期間がかかるらしいんだけど、その安定ポイントがいつなのか説明できなくて。
「メモリ使用量は少し上昇してますが、これはOSのオーバーヘッドで時間がたてば落ち着きます」って説明できればベストなんだけど、今その時間を調べてるところで。
逆にそれで落ち着かなければまたリークを見直す必要もあります。

いろいろすみません。

358デフォルトの名無しさん:2011/10/02(日) 13:17:57.04
なにそのjemalloc
要求を2の累乗にしろってのも馬鹿な話だよなアレ
359デフォルトの名無しさん:2011/10/02(日) 13:22:58.63
リークしているように見える原因はLow Fragmentation Heap割とガチで
360デフォルトの名無しさん:2011/10/02(日) 18:40:47.75
>>356
OSのある環境だと「連続領域が確保できなくなる」→「新しい連続領域がプロセスに割り当てられる」
ってことが起こるから、違う話だとは思わんな。
361デフォルトの名無しさん:2011/10/03(月) 06:43:31.27
double test_fn(){ cout << "test fn called " <<endl; return 100;}

auto fn_obj=std::ptr_fun( test_fn);


なんでエラーになるんだ
std::ptr_funは関数オブジェクト返すはずなんじゃないの?
362デフォルトの名無しさん:2011/10/03(月) 06:59:26.94
>>361
ひとりごとのつもりじゃないなら完全なコードとエラーメッセージ貼れよ。
363デフォルトの名無しさん:2011/10/03(月) 07:02:15.46
>>361
test_fnの引数が一つもないからダメ
364デフォルトの名無しさん:2011/10/03(月) 10:53:57.60
スクール水着を履いてオナニーしてます。
365デフォルトの名無しさん:2011/10/03(月) 20:48:02.48
mapみたいに1対1の対応じゃなくて
候補キーが2ついじょうあってそのどれからでも効率よく検索ができるようなmapを
STLを組み合わせてパパっとつくれますか?
366デフォルトの名無しさん:2011/10/03(月) 21:05:36.29
値としてアドレス持っときゃいいんじゃないの
どこかに実体は必要だけど
367デフォルトの名無しさん:2011/10/04(火) 00:17:11.54
shared_ptrでいいじゃん
368デフォルトの名無しさん:2011/10/04(火) 03:24:28.96
挿入削除が倍以上の負担になるからハッシュテーブルならまだしも二分木だときついな
369デフォルトの名無しさん:2011/10/04(火) 04:57:31.42
C++0xの可変長テンプレートで、引数の総数を知る方法を教えてください
370デフォルトの名無しさん:2011/10/04(火) 05:03:58.72
ググったらすぐに見つかったわけだが
http://en.wikipedia.org/wiki/Variadic_template
sizeof...(Args)
371デフォルトの名無しさん:2011/10/04(火) 05:06:58.03
>>370
ありがとう。
日本語しか読めなくて。
372デフォルトの名無しさん:2011/10/04(火) 09:38:43.09
あるクラスのコンストラクタでメンバ変数のcharをnewした場合、ヒープ領域を確保すると思いますが
クラスのヘッダーにchar name[MAX_PATH]と定義してクラスをnewした場合、ヒープかスタックどちらの領域を使用しますか?
373デフォルトの名無しさん:2011/10/04(火) 09:56:20.32
ヒープ
374デフォルトの名無しさん:2011/10/04(火) 16:41:40.70
>>373
ありがとうございます。
と、いうことはクラスをdeleteする時にメンバ変数も同時にdeleteされるということですね。
375デフォルトの名無しさん:2011/10/04(火) 16:45:02.24
>>374
自分でnewした奴は勝手にdeleteされないよ
スマポを使え
それかデストラクタにdelete書いておくか
376デフォルトの名無しさん:2011/10/04(火) 19:20:02.31
char name[MAX_PATH]はnewしてないからdeleteの必要ないだろ
377デフォルトの名無しさん:2011/10/04(火) 20:03:56.33
間抜けな回答はスルーでよいですよ
378デフォルトの名無しさん:2011/10/04(火) 20:17:14.48
初心者が真に受けたらまずいだろ
379デフォルトの名無しさん:2011/10/04(火) 20:41:46.31
+ hoge
 + 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/"に置くべきか
380デフォルトの名無しさん:2011/10/04(火) 20:51:04.90
hoge/shapesに置くべきだろう
381デフォルトの名無しさん:2011/10/04(火) 20:56:13.28
ShapeManagerもshapesに置かないの
382デフォルトの名無しさん:2011/10/04(火) 21:53:35.95
下のコードをgcc 4.6.1でコンパイルすると、自分の環境ではコンパイル中にsegmentation faultするのですが、コードに問題があるのでしょうか。
それとも単に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; }
383デフォルトの名無しさん:2011/10/04(火) 22:01:44.41
(1)をクラステンプレート外に出したらちゃんと動くね(constも取り外して)
こりゃgccのバグだな

>コンパイラ内部エラー: Segmentation fault: 11
>完全なバグ報告を送って下さい。
>適切ならば前処理後のソースをつけてください。
><http://gcc.gnu.org/bugs.html> を見れば方法が書いてあります。
384デフォルトの名無しさん:2011/10/04(火) 22:03:32.42
staticメンバにしても動くね
385デフォルトの名無しさん:2011/10/05(水) 04:10:42.14
>>379
名前空間とフォルダ構成を一致させるのはめんどいしファイル探しにくいし親が複数だとルール崩れるしでいいとこないぞ
Project-Namespace-Class.hpp
こっちがオススメ
386デフォルトの名無しさん:2011/10/05(水) 11:27:22.08
http://codepad.org/wwipNSob
これの上の方法を文字2つじゃなくて文字列でやりたいんだけどどうにかならないかな
Func<"[]">(3, 5);
Func<"[)">(3, 5);
っていう感じにしたい
387デフォルトの名無しさん:2011/10/05(水) 12:01:01.56
素直にtype出しにしろよ
namespace 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>{〜};
388デフォルトの名無しさん:2011/10/05(水) 12:19:11.49
>>386
何でテンプレート?関数オブジェクトとかじゃだめなの?
389379:2011/10/05(水) 22:23:27.05
>>381
ShapeManagerは説明のために適当に名づけたもの・・・なんだけど、
ShapeContainerみたいなコンテナ系のクラスであればshapes/に置くべきかな?

>>385
結構前からその方法を使おうか迷ってたんだが、踏み切れないな
どこか、ある程度の規模のプロジェクトで使用されていた実績でもあればやってみたいんだが


390デフォルトの名無しさん:2011/10/06(木) 00:29:39.71
>>385
フォルダわけされてないほうが探しにくいような気がするし、
「親が複数」がどんな状況を指してるのかよくわからない。
391デフォルトの名無しさん:2011/10/06(木) 00:31:53.27
探すも何も普通は覚えてると思うけど
分からなけりゃ検索すりゃいいじゃん
392デフォルトの名無しさん:2011/10/06(木) 00:38:48.99
1つのフォルダにぶち込んでアプリで管理だろ
手動でフォルダ分けとか前時代的すぎる
393デフォルトの名無しさん:2011/10/06(木) 00:57:26.28
Javaは名前空間でフォルダ分けしてるね
394デフォルトの名無しさん:2011/10/06(木) 01:25:39.60
関数オブジェクトを使って、変数と配列の加算をしたいんだけど、
algorithmを見ると配列同士の操作しか無いように見える。
これってvalarray使えって事?速度より利便性が欲しいんだけど。
395デフォルトの名無しさん:2011/10/06(木) 01:30:00.53
>>394
配列の各要素にみんな同じ変数の値を足すなら、 transform() じゃないかな?
なんで valarray が出てくるのかよくわからないんで読み違えてるのかもしれないけど。
396デフォルトの名無しさん:2011/10/06(木) 01:33:20.73
Javaだとフォルダ分けがメンドイんでインターフェースに突っ込んでるわ。
C++ likeな使い方ができる。

interface Arg extends arguments.Package{} //パッケージインポート
interface Package //パッケージ定義
{
        //公開するクラスだけ中に書く
         class TypeA{}
         class TypeB{}
}
//公開しないクラスは外に書く
class TypeC{}
397デフォルトの名無しさん:2011/10/06(木) 01:36:31.92
>>395
transformじゃ配列(コンテナ)同士じゃないとできなくない?
動かないイテレータを自作するなら別だろうけど。
398デフォルトの名無しさん:2011/10/06(木) 01:38:16.73
>>397 transform(c.begin(), c.end(), c.begin(), f) で。
399デフォルトの名無しさん:2011/10/06(木) 01:38:43.69
ああ、bind1st,bind2ndか。解ったありがとう。
400デフォルトの名無しさん:2011/10/06(木) 01:40:41.92
sumみたいな処理をしたいのかな?
名前忘れたけど専用の関数が標準にあるよ
401デフォルトの名無しさん:2011/10/06(木) 11:29:32.82
>>400
accumulate?

そうじゃなくてやりたいのは
std::transform(v.begin(), v.end(), v.begin(), std::bind2nd(std::plus<int>(), value))
みたいなのでしょ
402デフォルトの名無しさん:2011/10/06(木) 22:55:46.20
>>401
やろうとしてたのはそういうヤツ。
403デフォルトの名無しさん:2011/10/06(木) 23:08:59.96
bindはC++11だと非推奨だっけ?
404デフォルトの名無しさん:2011/10/06(木) 23:15:38.01
>>403
古いbind1st bind2ndはね。代わりに強化された汎用のbindがある。
405デフォルトの名無しさん:2011/10/06(木) 23:18:24.36
boost::bindみたいなもんか
406デフォルトの名無しさん:2011/10/06(木) 23:20:32.26
boost::bindのが入ったんでしょ
407デフォルトの名無しさん:2011/10/06(木) 23:22:01.46
_1とか_2とかのやつだっけ
408デフォルトの名無しさん:2011/10/06(木) 23:24:59.40
あの気持ち悪い仕様のまま標準に入るの?
409デフォルトの名無しさん:2011/10/06(木) 23:27:19.40
気持ち悪くないC++なんて存在しないよ
410デフォルトの名無しさん:2011/10/06(木) 23:29:00.35
lambdaあるんだから11でbindなんかいらんだろ
411デフォルトの名無しさん:2011/10/06(木) 23:29:16.21
魔術的な実装だというだけで
使う分には使いやすいんじゃない?
412デフォルトの名無しさん:2011/10/06(木) 23:31:14.39
俺はstd::functionにメンバ関数入れるときなんかによく使うな
413デフォルトの名無しさん:2011/10/07(金) 00:27:22.46
>>410
lambdaで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); };
}
414デフォルトの名無しさん:2011/10/07(金) 00:58:22.51
バインダをインクルードするコンパイル時コスト
std::functionの実行時コスト(型消去など)
名前空間をタイプする労力
これならautoとλを使ったほうがマシ
415デフォルトの名無しさん:2011/10/08(土) 07:30:54.40
struct array{
 int *p;
 int &operator[](int t){return p[t];}
 const int &operator[](int t)const{return p[t];}
};

こういうconstメンバ関数が冗長なのをなんとかできませんか?
416デフォルトの名無しさん:2011/10/08(土) 08:26:07.31
どうにもならない
関数内がどうしようもなく複雑になるようなら
実装をまとめてconst_castするのも手だが
まあ普通はそこまでする必要はないわな
417デフォルトの名無しさん:2011/10/08(土) 08:59:23.59
getter以外でconstと非constが共存することはほぼないから我慢する
418デフォルトの名無しさん:2011/10/08(土) 11:55:28.29
const_castもどきオブジェクトの皮一枚を被せればいいんじゃないかな
やった事無いし、オーバーロードが面倒で反ってラビリンスな感じだけど
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);} };
419415:2011/10/08(土) 14:37:38.26
>>417 arrayとかstringとかのライブラリを作って勉強しているので、
getterのような関数ばっか書いててこう思ったのです。

>>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つ作れば良いので、この方法を検討してみます。

ありがとうございました。
420デフォルトの名無しさん:2011/10/08(土) 15:29:41.41
同じ名前のヘッダってどうやって作成すんの?
Sequenceフォルダ内に
Parent.h
Gameフォルダ内に
Parent.h
を作成したいんだけど…
421デフォルトの名無しさん:2011/10/08(土) 16:06:25.04
無理です
422デフォルトの名無しさん:2011/10/08(土) 16:09:47.09
え? VC++だとできるぞ。
423デフォルトの名無しさん:2011/10/08(土) 16:12:27.68
あぁ別のフォルダだったか・・・
じゃあ普通に作ればいいんじゃないか
424デフォルトの名無しさん:2011/10/08(土) 16:35:55.15
>>420
VC++の話だったら手作業でフォルダとファイル作って後でVC++に項目追加する
425デフォルトの名無しさん:2011/10/08(土) 16:38:35.23
ごめん言葉が足りなかった
Sequenceフォルダ内に
Parent.h
Sequenceフォルダ内のGameフォルダに
Parent.h
を作りたいんだ。サンプルでは作成出来てるんだけど、
俺が作ろうとすると、すでに存在すると言われ作れない。
426デフォルトの名無しさん:2011/10/08(土) 16:42:17.66
>>425
vc++のソリューションエクスプローラじゃなくて、
普通にOSのエクスプローラでファイルを追加してから、ソリューションエクスプローラにドラックアンドドロップする
427デフォルトの名無しさん:2011/10/08(土) 16:45:46.18
>>422 >>423 >>424 >>426
出来た!皆ありがとう!!
428デフォルトの名無しさん:2011/10/08(土) 17:00:20.84
なんでVCはフォルダとフィルタ別構造なの
429デフォルトの名無しさん:2011/10/08(土) 18:12:56.88
扱うのが簡単だから
430デフォルトの名無しさん:2011/10/08(土) 18:43:48.93
可変長の配列をファイルから読み込みたいんですが、どうしたらいいんでしょうか?

ttp://codepad.org/qllGCv19
431デフォルトの名無しさん:2011/10/08(土) 18:50:23.96
>>430
ポインタを値渡ししてるだけじゃデータ受け取れないぞ
432デフォルトの名無しさん:2011/10/08(土) 18:54:46.89
まずmain関数内でpの領域を確保しないのは何故?
readFile関数内で割り当てるつもりなら、main関数では
readFile(&p, &size);
の形で呼び出すでしょ。まぁそんな作りには普通しないと思うけど。
433デフォルトの名無しさん:2011/10/08(土) 19:03:54.58
>>432
読み出すサイズがファイルを読み込まないとわからないんです。
自分もありえないつくりだと思っています。クラスでも作ります。

>>431
参照渡しにしました。というか2重ポインタ?でやったほうがかっこいい

関数の名前下のほうがいいよね。
void readFile( int* &pOutArray, int* pOutSize )
void readFile( int* &pRefOutArray, int* pOutSize )

434デフォルトの名無しさん:2011/10/08(土) 19:05:21.44
途中で書き込んでしまいました

返信ありがとうございました。
435デフォルトの名無しさん:2011/10/08(土) 19:25:44.92
bool readFile(std::vector<int>& output);
とかでよくね?必要ならファイル名でも増やせば
もっとエラー処理が必要なら例外でも使うがよろし
436デフォルトの名無しさん:2011/10/08(土) 19:34:41.81
>>419
> constによる最適化
何のこと?たぶん何か勘違いしてると思うんだけど。
437デフォルトの名無しさん:2011/10/08(土) 19:48:53.98
ファイルの丸読みはメモリがもったいない
かといってストリームのエラーを毎度チェックするのはめんどくさいからまる読みしたい
僕はどうすればいいんだ
438デフォルトの名無しさん:2011/10/08(土) 19:57:16.62
>>437 stream.exceptions(badbit | failbit)
439デフォルトの名無しさん:2011/10/08(土) 23:13:02.52
>>428
フォルダだと非ツリー構造(グラフ構造)を表せないから
単一継承ならツリーにはなるけど、多重継承はツリーにならんでしょ
継承に限らず依存関係はグラフ構造がメインなんでフォルダわけってのは使い辛い
440415:2011/10/09(日) 11:37:58.84
>>436
constの効果を以下のように認識しているのですが、
間違っているところがあればご指摘ください。

1 値を書換えられない。値を書換えられる型に暗黙に変換できない。
2 constがついている変数からは値を書換えないことが保証されているので
キャッシュからメモリへの書戻しをスキップするなどの 最適化を行える。(実装依存?)
3 constがついているものを外してしまうと 外したことを認識できる場所では2の最適化を
行わないようにしてくれる(inline展開された場合など?)
4 constがついているものを外して値を書換えると 外したことを認識できない場所では、2の最適化が
そのまま行われて、キャッシュ不整合になる。 (constを外すと動作保証外になる要因?)

この場合はconstを外しても値を書換えないので4が起ることはないと思うのですが
3が起ってしまう可能性を考えたのです。
441デフォルトの名無しさん:2011/10/09(日) 11:59:52.17
constは最適化には影響しないんじゃなかった?
442デフォルトの名無しさん:2011/10/09(日) 12:32:00.77
コンパイラによっていくらでも変わりそうだな
443デフォルトの名無しさん:2011/10/09(日) 13:24:08.19
struct hoge { static int const v = 0; };
void Func(int const & v) { const_cast<int &>(v) = 1; }
int main(void) { Func(hoge::v); return 0 ;}

未定義?
444デフォルトの名無しさん:2011/10/09(日) 13:31:50.92
元々constな変数をconst_castしての変更は未定義だな
445デフォルトの名無しさん:2011/10/09(日) 13:45:03.64
元々constなののconstはがして変更ってのは未定義
元がconstじゃないものをconstにしたものなら大丈夫だったはず
446デフォルトの名無しさん:2011/10/09(日) 13:58:34.74
と言うことは関数の外からどちらがくるかわからないから
Funcの動作も未定義ということか
447デフォルトの名無しさん:2011/10/09(日) 14:08:22.13
Funcにhoge::vを渡すのが未定義なだけ
元々constじゃないものを渡す分には問題ないはず
448デフォルトの名無しさん:2011/10/09(日) 14:22:38.74
はず、はず、じゃあれなので規格から

5.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参照にリテラルを渡した時に一時オブジェクトを作成して渡すというアレの事)
さらに、ポインタの仮引数を通じても、定数でないオブジェクトの値を変更することができる。
449デフォルトの名無しさん:2011/10/09(日) 16:19:53.41
>>440
生成時点で const が付いていた値について、 1, 2 は正しい。
const_cast で書き換えるようなコードは書けるが、その場合は
未定義動作となるので動作保証する必要が無く、それにより
最適化が可能になる。

後から参照やポインタとして const が追加されたものについては
const_cast やグローバル変数経由などによる書き換えが可能なので
2 のような最適化はできない。

ただし const に頼らず、値アクセスの間にある操作をすべて
解析した上で 2 と同様の最適化を行うことは可能。

const 外しを認識したところで、対象の値に生成時点で const が
付いていたのを知らない限り、生成されるコードに影響は無い。
450デフォルトの名無しさん:2011/10/09(日) 16:26:18.59
実測しろ
451デフォルトの名無しさん:2011/10/09(日) 19:14:20.56
constはprivateみたいな可視性の制御に過ぎないって禿が言ってた。
452デフォルトの名無しさん:2011/10/09(日) 20:52:32.40
ただしコンパイル時定数は除く
453デフォルトの名無しさん:2011/10/10(月) 01:15:24.24
スレチだったらスマン。
ゲームのプログラマってアルゴリズムどうしてんの?
全部自分で考えてる訳じゃないよな?本やネットから引用してるよな?
454デフォルトの名無しさん:2011/10/10(月) 01:18:28.99
Gemsとか
455デフォルトの名無しさん:2011/10/10(月) 01:33:18.29
STGの敵の動きとかは既存のもの影響はどうしても受けてるだろうし
入力に合わせて自キャラが動くなんてのはほとんど定番的なやり方があるだろうけど
独自のルールやゲームシステムがあるならそれに合わせた独自のアルゴリズムを考える必要があるだろ
456デフォルトの名無しさん:2011/10/10(月) 05:18:30.33
>>453
ほとんど自分で考えてるよ。
457デフォルトの名無しさん:2011/10/10(月) 09:23:29.88
コアな部分ではほとんど再利用可能なので最利用する
アプリケーション独自の部分は拘ってクールなアルゴリズムとか考えても費用対効果薄いからやりたいことを素直にシンプルに書く
458デフォルトの名無しさん:2011/10/10(月) 18:12:37.97
質問させてください。

行列の指数計算(eの行列乗というか)をC++で行いたいのですが、
そのような計算ができるライブラリなどを知っている方がいたら教えてください。
459デフォルトの名無しさん:2011/10/10(月) 18:25:46.98
C言語によるスーパーLinuxプログラミングで紹介されてる
460デフォルトの名無しさん:2011/10/10(月) 18:28:41.35
…されてたような気がする
461デフォルトの名無しさん:2011/10/10(月) 19:10:46.78
boostあたりにあるんじゃねえの
462デフォルトの名無しさん:2011/10/10(月) 19:16:30.54
boost::numeric::ublasとかで出来るんじゃね
blasは行列計算とかで業界標準だとかなんとか聞いた覚えがある
463デフォルトの名無しさん:2011/10/11(火) 08:43:58.21
質問です。
グローバル変数として宣言したオブジェクトのコンストラクタを呼び出すスレッドは、
main()を呼び出すスレッドと同じということは、規格は保証してくれるのでしょうか。
どうかご教示夜露死苦お願いします。
464デフォルトの名無しさん:2011/10/11(火) 08:46:59.31
くれます
465デフォルトの名無しさん:2011/10/11(火) 08:50:58.69
>>464
ありがとうございました。
466デフォルトの名無しさん:2011/10/11(火) 14:00:16.33
vc++で、タスクトレイにアプリケーションを格納する方法を教えてください。
467デフォルトの名無しさん:2011/10/11(火) 14:10:44.61
468デフォルトの名無しさん:2011/10/12(水) 12:26:24.03
ソート済みの配列から一定の値の範囲を取得するアルゴリズム教えてください。
const int a = {4,5,6,7,8,9,10,11};
から6以上10以下を取得するような感じです。
469デフォルトの名無しさん:2011/10/12(水) 12:57:01.52
6と10をサーチするだけ。
470デフォルトの名無しさん:2011/10/12(水) 12:58:37.05
追加すると。
a[0]〜a[7]で6をサーチしてi=2がわかったら
a[i]〜a[7]で10をサーチ。
すこしだけ計算量が減る。大差はないと思うが。
471デフォルトの名無しさん:2011/10/12(水) 13:03:29.74
1:a[0]4〜a[7]11から6-10の範囲(10-6)/(11+1-4)=50%、(11-4)*50%=4、
 4〜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:範囲の再算出をやり直し
472デフォルトの名無しさん:2011/10/12(水) 13:32:55.09
小さい配列なら前から順に見ていくだけ
大きいなら二分探索二回でおk
473デフォルトの名無しさん:2011/10/12(水) 14:14:24.35
>>472 後者
探索位置が2つの探索対象の間に入るまでは共通だから単純に2回ではない
474デフォルトの名無しさん:2011/10/12(水) 14:39:01.97
std::lower_boundとstd::upper_boundで
475デフォルトの名無しさん:2011/10/12(水) 14:45:31.99
既存の二分探索を二回使えよ。
476デフォルトの名無しさん:2011/10/12(水) 14:46:44.84
2回使います
477デフォルトの名無しさん:2011/10/12(水) 15:15:12.46
あかん綺麗に書けない
template <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, " "));
}
478デフォルトの名無しさん:2011/10/12(水) 15:24:45.11
あほっぱい
479デフォルトの名無しさん:2011/10/12(水) 15:29:44.62
>>478
本当はコメントアウトしてあるように

std::reverse_iterator<T::iterator> riterfrom(to);
std::reverse_iterator<T::iterator> riterto(from);
ForwardIterator pos2 = std::find(riterfrom, riterto);

で一発で後ろから調べられたはずなんだけど、intは逆反復子を持ってないと
コンパイラに叱られた
480デフォルトの名無しさん:2011/10/12(水) 15:33:14.00
>>474
lower_bound()とupper_bound()は既存の順序を崩さないように要素を挿入出来る
位置を返すだけなので、該当の要素が存在する事を確実にするにはbinary_search()
を併用しないといけないから、この問題は見てくれよりも難しいぞ
481デフォルトの名無しさん:2011/10/12(水) 15:35:52.73
STLがラムダ式を使う事を前提に書いてあればいいのに const T& val とか
決め打ちで値を入れるから使いにくい
find_if()ならラムダ式は使えるが最初に見つかった一個しか返さないし
482デフォルトの名無しさん:2011/10/12(水) 15:53:23.28
うむ
互換性無くしていいからもっと使いやすい標準ライブラリを追加してほしいわ

483デフォルトの名無しさん:2011/10/12(水) 15:58:37.35
でも禿の事だからやらないんだろうな
というかもうC++11の規格固まっちまったし
右辺値参照によるスピードアップだけだな
484デフォルトの名無しさん:2011/10/12(水) 16:05:16.03
const int a[] = {4, 5, 6, 7, 8, 9, 10, 11};
const 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, ","));
これじゃだめなん?
485デフォルトの名無しさん:2011/10/12(水) 16:11:21.41
>>484
lower_bound()は該当要素が存在しなければ「存在したであろう位置」を返す
だから4,5,11とかだと11の位置をを返してしまう

upper_boundは該当要素が存在しなければ「存在したであろう最後の位置」を返す
だから1,2,3とかだと3の位置を返してしまう
486デフォルトの名無しさん:2011/10/12(水) 16:12:23.87
あ、間違い
×3の位置を返してしまう
○past-to-the-3の位置を返してしまう
487デフォルトの名無しさん:2011/10/12(水) 16:15:02.59
const_iter result_low = beg;
const_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);
}
488デフォルトの名無しさん:2011/10/12(水) 16:16:16.45
break;抜けてた
489デフォルトの名無しさん:2011/10/12(水) 16:29:26.97
ソート済みなんだから頭から順番に探すのが確実だな
でも要素数が多くなるとなんとかlower_boundとかbinary_searchを使えないかと思う
490デフォルトの名無しさん:2011/10/12(水) 17:50:10.64
>>468が一般的な『値の集合からm以上n以下のすべての値を取得する』
という問題の具体化にすぎないなら元の集合にmやnが含まれている保障も必要もない。その場合なら>>484で充分。
491デフォルトの名無しさん:2011/10/12(水) 18:37:18.37
>>484では重複して検索してるから遅い
492デフォルトの名無しさん:2011/10/12(水) 19:04:49.58
重複?upper_boundの検索範囲はlower_boundの結果で絞り込んでるけど
それと線形探索の話をしてるのもいる中で二分探索同士の差で遅いとかいってもな
493デフォルトの名無しさん:2011/10/12(水) 23:44:01.27
>>485-486
確かに4,5,11,endに対してlower_bound(...,6)は11の位置を返す。
ただしupper_bound(...,10)も11の位置を返すので結果は要素数0の空の範囲となりなんの問題もない。
494デフォルトの名無しさん:2011/10/13(木) 10:33:04.28
配列の参照に変換するoperatorはどのように書けば良いですか?

template<typename T, int SZ> class array
{
T t[SZ];

operator T (&)[SZ]()
operator T (&())[SZ]
(operator T &())[SZ]

{return t;}
};
495デフォルトの名無しさん:2011/10/13(木) 12:00:39.18
typedef T (&A)[SZ];
operator A() { return t; }
496デフォルトの名無しさん:2011/10/13(木) 13:44:54.27
typedef、decltype、std::identityを使わず、その場で完結する方法を知りたいです。
497デフォルトの名無しさん:2011/10/13(木) 15:19:19.45
無理です
498デフォルトの名無しさん:2011/10/13(木) 20:56:42.99
法と@に何か関係ってあるのだろうか・・・
sting ssss;
ssss.substr(0,ssss.find('@'))
ssssの文字列に法の字が入っていると法の字が消えて代わりに・,って入ってしまう
499デフォルトの名無しさん:2011/10/13(木) 21:01:06.78
>>498
"法"はシフトJISで0x4096
@は0x40

だからじゃね
500デフォルトの名無しさん:2011/10/13(木) 21:02:49.82
おっと0x9640だ
エンディアンが逆になってるのか
501デフォルトの名無しさん:2011/10/13(木) 21:02:53.05
なるほど

うーん@を改行代わりにするのは失敗だったか
502デフォルトの名無しさん:2011/10/13(木) 21:05:13.53
>>498
文字コードは Shift-JIS だな
'@' は 0x40、'法' は 0x96, 0x40 だから find() が 2 バイト目にヒットする

回避策は _mbschr() を使うか、地道に自分で文字コードをチェックしながら検索
するか (Shift-JIS の 2 バイト文字の範囲はググれ)、処理する文字コードを
Shift-JIS 以外のものに変えるしかない
503デフォルトの名無しさん:2011/10/13(木) 21:09:07.95
サロゲートペアにはもっと泣かされるぞ
504デフォルトの名無しさん:2011/10/13(木) 21:18:55.08
俺は改行マークを'@'から"@@"に変更した。コレなら被らないな

しかしこんなこともあるのか。覚えておくか・・・
505デフォルトの名無しさん:2011/10/13(木) 21:27:36.97
それって "法@" でも大丈夫なの?
506デフォルトの名無しさん:2011/10/13(木) 21:30:50.55
ソ系ダメ文字とポ系ダメ文字について読んでおくといいよ
多分同じ問題にぶつかる
507デフォルトの名無しさん:2011/10/13(木) 21:34:47.44
void Hoge()
{
 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 ソースの綺麗さ(見易さ)
508デフォルトの名無しさん:2011/10/13(木) 22:25:27.57
Piyo()
509デフォルトの名無しさん:2011/10/13(木) 23:02:32.61
>>505
なんかダメそうに見えるな・・・
>>506を調べておくことにするよ
510デフォルトの名無しさん:2011/10/13(木) 23:14:34.41
http://smdn.jp/programming/tips/check_ngchar/

これなんかはC#だけど同じような問題だ
「全角半角混在」でぐぐるとたくさん引っかかる
511デフォルトの名無しさん:2011/10/14(金) 10:29:50.12
boost::program_options::variables_map
がstd::mapをpublic継承しています。

ソースはここhttp://www.boost.org/doc/libs/1_47_0/boost/program_options/variables_map.hpp

仮想デストラクタを持たないクラスを
public継承したら危険だと考えていたのですが、
variables_mapのケースはどうなのでしょうか。
boostはレビューがあるし、そう簡単に危険な
コードは入り込まないと思っていますが・・・。
512デフォルトの名無しさん:2011/10/14(金) 10:42:32.90
>>511
class CBase {
};

class CSub : public CBase {
};

CBase* pbase = new CSub;
delete pBase;
こういうのがダメなのであって
CSub sub;として使う分にはなんの問題もない
513デフォルトの名無しさん:2011/10/14(金) 10:59:07.55
>>512
ありがとうございます。
ということは、variables_mapは
public std::map<std::string, variable_value>* p
= new boost::program_options::variables_map();
delete p;
と使ってはいけないということですね。
使っちゃだめよとドキュメントに書いてあるか要確認ですね。
514デフォルトの名無しさん: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
515507:2011/10/14(金) 20:22:41.23
>>508
レスありがとう
言い切ってくれるのは非常に助かる
516デフォルトの名無しさん:2011/10/14(金) 20:34:05.93
2ch ソースに言い切ってもらったから何だよw
不都合な事実が出てき瞬間オワるぞ
517デフォルトの名無しさん:2011/10/15(土) 00:26:14.88
何いってんだコイツ
518デフォルトの名無しさん:2011/10/15(土) 00:41:20.95
C++03でunique_ptrっぽいスマポを作るにはどうする?
shared_ptrより軽くてコンテナに入れられるスマポが欲しい
519デフォルトの名無しさん:2011/10/15(土) 00:43:10.62
ヘッダからコピペすればいいいんじゃないかな
520デフォルトの名無しさん:2011/10/15(土) 08:19:44.26
内部で持ってるポインタをmutableにして
コピーコンストラクタをムーブ的に実装すればなんとか
521デフォルトの名無しさん:2011/10/15(土) 09:13:55.27
>>520
できた、ありがとう
auto_ptrってシンタックスの問題でしかなくて、論理的にはコンテナに入れてもいいものだったのね
522デフォルトの名無しさん:2011/10/15(土) 09:21:30.90
まあちょっと怖いけどね
523デフォルトの名無しさん:2011/10/15(土) 09:32:54.84
さらにboost::optionalで包む
524デフォルトの名無しさん:2011/10/15(土) 09:35:37.62
boostありならboost::interprocess::unique_ptrを最初から使うだろw
525デフォルトの名無しさん:2011/10/15(土) 10:03:29.40
コンテナに入れる用途ならptr_containerでいいだろ
526デフォルトの名無しさん:2011/10/15(土) 11:15:57.46
> auto_ptrってシンタックスの問題でしかなくて、論理的にはコンテナに入れてもいいものだったのね
だめだろ。
03までのコンテナ周りの実装はコンテナ内の要素の値をコンテナ外やコンテナ内の複数の場所にコピーすることがあるので
コピーでポインタの所有権が移るauto_ptrを入れるとしねるぞ。
527デフォルトの名無しさん:2011/10/15(土) 11:29:30.79
VC++は何故かそのままauto_ptrを入れられたような
528デフォルトの名無しさん:2011/10/15(土) 11:31:28.65
>>526
どこの実装よそれ
529デフォルトの名無しさん:2011/10/15(土) 11:38:29.97
普通にremoveとかヤバそうじゃね
530デフォルトの名無しさん:2011/10/15(土) 12:18:09.19
>>527
VC6時代の糞仕様のことは忘れてください
531デフォルトの名無しさん:2011/10/15(土) 13:38:13.37
ポインタの配列でremoveなんて使わないと思う
532デフォルトの名無しさん:2011/10/15(土) 14:52:35.44
コンテナ内部で無意味にコピーをとって置いても規格違反じゃないならアウトか
533デフォルトの名無しさん:2011/10/18(火) 00:02:23.57
std::unordered_mapとstd::mapって、コンテナに要素を追加した時は
コンテナ内の他の要素を指すポインタ無効になりますか?
534デフォルトの名無しさん:2011/10/18(火) 00:07:39.07
実装上はならんだろうけど規格で保証されてるかはわからんなぁ
535デフォルトの名無しさん:2011/10/18(火) 01:24:00.14
>>533
unordered_mapの場合、要素への参照は無効にはならない。イテレータは無効になるときがある。
mapの場合、参照もイテレータも無効にはならない。
536デフォルトの名無しさん:2011/10/18(火) 01:29:36.00
イテレータは無効になる事があるけど
参照は無効にならないってのは
どういう実装なんだろう?
537デフォルトの名無しさん:2011/10/18(火) 01:55:35.72
>>536
iteraotrは少なくとも次のelementへのiteraotrへのreferenceを持っているのだけれど、
containerにelementsを追加した時に順序的に対象のiteraotrの次のelementに入る場合はそのiteratorは無効になる。
しかし、referenceというのはiteratorのallocateには直接関わりを持たない構造になっている。
iteratorがelementへのpointerを持っていると言えば分かりやすいかな。
だからiteratorが無効になってもreferenceは無効にならないし、elementsを追加する度に
他のelementsもstd::vectorみたいにallocateしなおしになったら大変なコストになるでしょ?
538デフォルトの名無しさん:2011/10/18(火) 07:23:10.97
listなんかだとノード自身が次の要素への参照を持ってて
追加時にその参照を書き換えるから大丈夫なんだけど
unordered_mapだと何が問題なんだろう、と思ってね
539デフォルトの名無しさん:2011/10/18(火) 07:38:46.84
ハッシュテーブルのバケツはdequeが使われてることが多いからかな。
540デフォルトの名無しさん:2011/10/18(火) 08:44:09.90
イテレーターで巡回するときに要素の追加が発生する場合はどうするのがいいのだろう
@そのまま巡回(挿入する値とタイミングによっては、新しい要素が巡回されたりされなかったりする)
A追加分は別のバッファにとるように書いて巡回の後で追加する(追加した分は巡回しない)
BAと同様だがもう一本バッファを増やして、追加された分も巡回して、新たに追加される要素がなくなるまで繰り返す
541デフォルトの名無しさん:2011/10/18(火) 08:55:28.47
>>539
dequeだと参照も無効にならねーか?
542デフォルトの名無しさん:2011/10/18(火) 10:48:06.53
>>541
横からだが、ハッシュテーブル自体の参照は無効になっても要素への参照は無効にはならない。
543デフォルトの名無しさん:2011/10/18(火) 13:30:11.82
ランダムで1〜55の数値を出力。1回出た数値は2度と出さないようにするコードを書け。

わかんねぇ・・・
544デフォルトの名無しさん:2011/10/18(火) 13:33:07.85
>>543
宿題は宿題スレへ。
60個出力しろって言われたら無理だから、出力する個数についても情報を添えてな。

C/C++の宿題片付けます 152代目
http://hibari.2ch.net/test/read.cgi/tech/1312201995/
545デフォルトの名無しさん:2011/10/18(火) 13:52:27.02
線形合同方の値域と周期を調整するだけ
546デフォルトの名無しさん:2011/10/18(火) 14:04:01.06
int main() {
std::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; }
}
こんなんでどうか
547デフォルトの名無しさん:2011/10/18(火) 15:24:07.07
>>543
長さ55のブール型の配列作ってn-1で中身がTrueかFalseか比較すりゃ良いだろ
548デフォルトの名無しさん:2011/10/18(火) 15:25:51.20
あ、nはランダムな数値の入ってる変数な


549デフォルトの名無しさん:2011/10/18(火) 16:05:23.39
C++でゲーム作成をしたいのですがオブジェクトの使い方で躓きました。
分からないのは、【@関数の戻り値にオブジェクトを使う時】【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;
};
550デフォルトの名無しさん:2011/10/18(火) 16:19:03.50
>>549
(1):
Monsterクラスが巨大じゃなければ、宣言はそれでいいよ。
場合によっては、Monster Item(char key) const;にすべきだけど。

(2):
これも別にいいんでないかい?

何が問題だと思っているのか知らんが、エラーが起きるならエラーコードを。
551デフォルトの名無しさん:2011/10/18(火) 16:21:04.34
つーか、オブジェクト指向云々以前のレベルじゃね?
char Name, Text;とか、どんなデータを持つ積もりだよ。
モンスターの名前や情報なら、std::string Name, Text; だろ。
552デフォルトの名無しさん:2011/10/18(火) 16:22:11.25
その部分は誰も問題にしてないっていうね
553デフォルトの名無しさん:2011/10/18(火) 16:27:53.28
MonstersListなんて作らずstd::map<char,Monster>にすればいいんじゃね
直さなくて済みそう
554デフォルトの名無しさん:2011/10/18(火) 17:45:47.36
>>550
とりあえずエラーコードを書きます。

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
お二方の仰る事は正しいんだと思うのですが、
自分の現段階では飲み込むスキルが無いっぽいです。
もうちょっと良く考えます。
555デフォルトの名無しさん:2011/10/18(火) 17:46:59.95
設計の話じゃなくて文法レベルの話だったのか^^;
556デフォルトの名無しさん:2011/10/18(火) 17:49:36.84
>>554
エラーのメッセージを読んで一つ一つ順番に対応すればいいよ
557550:2011/10/18(火) 17:51:45.01
型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
となるのは何が引っかかってるんでしょうか?
558デフォルトの名無しさん:2011/10/18(火) 17:53:39.66
>>557
MonsterとMonsterListを書く順番変えてみな
エラーがだいぶ減るから
559デフォルトの名無しさん:2011/10/18(火) 17:56:10.04
>>558
おおおおおおおおおお
確かに直りました!

ありがとうございます。
560デフォルトの名無しさん:2011/10/18(火) 18:35:01.17
エエエエエエ
561デフォルトの名無しさん:2011/10/18(火) 18:44:46.50
> 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
↓翻訳
この行に宣言されていない型識別子が使用されています。

>>549がまんまソースコードだとしたら、
> Monster Item(char key);      //@
この地点でコンパイラは"Monster"が何か分からない(型名であるかも分からない)ので、上のエラーが発生する。
562デフォルトの名無しさん:2011/10/19(水) 08:55:23.16
VC2008対応のMSDNライブラリってどこにあるんですか?
563デフォルトの名無しさん:2011/10/19(水) 14:58:58.26
ストリームのオープンモードをあとから調べられないの?
bool IsTextStream(std::fstream const & f);
的な関数を作りたいんだけど
564デフォルトの名無しさん:2011/10/19(水) 16:20:16.21
fd()で取れるからそれに_setmode()を2回
565デフォルトの名無しさん:2011/10/19(水) 16:33:49.03
>>564
さんくすこ
566デフォルトの名無しさん:2011/10/20(木) 08:53:28.13
テキストファイルの読み込みで、指定した区切り文字ごとに読み込むことができる関数って無いかな
具体的には テキストファイルで改行した所までを1文字列として読み込みたい
これをループさせて全ての行の文字列を取ってくる。 みたいな事をしたい
567デフォルトの名無しさん:2011/10/20(木) 09:12:04.22
>>566 std::getline()
568デフォルトの名無しさん:2011/10/20(木) 09:35:45.95
>>567
サンクス!
569デフォルトの名無しさん:2011/10/20(木) 10:06:32.69
getline
570デフォルトの名無しさん:2011/10/20(木) 11:36:36.01
getline関数を使おうと思ったんだけど、「引数が違います。もしくは足りません。」みたいなエラーが帰ってくる。(C2780)
getline関数の引数教えてくだしあ。
571デフォルトの名無しさん:2011/10/20(木) 11:47:45.99
>>570
つ [std::ifstream::getline()]
572デフォルトの名無しさん:2011/10/20(木) 12:14:29.38
使ってるコンパイラのマニュアルに書いてある
573デフォルトの名無しさん:2011/10/20(木) 14:18:58.34
超初心者で申し訳ないんですが質問させてください。

文字列を指定する際の”a"と'a'はどのように使い分けするのが正しいんですか?
574デフォルトの名無しさん:2011/10/20(木) 14:29:54.53
'a'は文字列じゃなくて文字(っていうか整数)
575デフォルトの名無しさん:2011/10/20(木) 18:02:16.40
'a' == 97
"a" == { 'a', '\0' } == { 61, 0 }
"hoge" == { 'h', 'o', 'g', 'e', '\0' } == { 104, 114, 106, 104, 0 }
576デフォルトの名無しさん:2011/10/20(木) 18:04:38.12
'abcd'
は?
577デフォルトの名無しさん:2011/10/20(木) 18:06:13.43
>>576
そういう書き方は出来ない
578デフォルトの名無しさん:2011/10/20(木) 18:14:27.32
implementation-definedだろ。
579デフォルトの名無しさん:2011/10/20(木) 18:17:57.14
intになることだけは決まってるんだっけ
580デフォルトの名無しさん:2011/10/20(木) 18:21:19.22
>>576

'a' -> char型の値
 char test = a;

"a" -> char[]型の値
 char test[] = "a";
 char test[10] = "a";

'abcd' -> char型の値・・・ではない
 char型(1バイト)に4文字も入らないのぉ・・・
581デフォルトの名無しさん:2011/10/20(木) 18:34:05.02
手元のvc2008はprintf("0x%08x\n", 'abcd');で0x61626364と出る
もう一文字増やすとコンパイルエラー

規格では処理系定義らしい
こういう仕様だ、と決めてあればどういう値でもいいしコンパイルエラーでもいい
582デフォルトの名無しさん:2011/10/20(木) 19:08:15.18
jsでは同じだよね?そっちから入ると少し混乱しそう
583デフォルトの名無しさん:2011/10/20(木) 20:35:22.67
>>579
Yes
584デフォルトの名無しさん:2011/10/20(木) 22:56:27.36
>>581
古いCコンパイラとの互換性を考慮したのかね
C++になったときコンパイルエラーで統一してくれてもよかったのに
585デフォルトの名無しさん:2011/10/20(木) 22:59:53.72
処理系定義なのはマルチバイト文字用の仕様じゃないのかな
まあチャンクコードのような使い方を考えてる可能性もあるけど
(ビッグエンディアンじゃないと意味ないけど)
586デフォルトの名無しさん:2011/10/21(金) 01:07:37.07
逆にすりゃいいだけだろ
587デフォルトの名無しさん:2011/10/21(金) 07:27:24.05
可読性がだな
588デフォルトの名無しさん:2011/10/21(金) 10:13:03.21
文字列”ABC , ef , ghi”から"ABC"っていう文字を取得するっていうのはどうすればいいんですか?
VBでいうsplit関数みたいなのは無いですか?
589デフォルトの名無しさん:2011/10/21(金) 10:21:59.92
strtok
590デフォルトの名無しさん:2011/10/21(金) 10:43:58.53
591デフォルトの名無しさん:2011/10/21(金) 10:58:40.31
つ[sscanf(foo, "%[^,]", bar);]
592デフォルトの名無しさん:2011/10/21(金) 11:08:32.73
strtok関数って第一関数にchar配列しか指定できないの? std::stringとかもできるのかな
593デフォルトの名無しさん:2011/10/21(金) 12:04:04.17
>>592
中身書き換えるから、std::stringだとダメ。
594デフォルトの名無しさん:2011/10/21(金) 13:03:40.17
>>588の場合strtok使えないんじゃないか
charは一文字しか入らないから失敗した記憶があるんだが
595デフォルトの名無しさん:2011/10/21(金) 13:15:41.08
ttp://codepad.org/7ZwUoWoN
前後の空白も切り取りたいって話か?
596デフォルトの名無しさん:2011/10/21(金) 13:52:51.80
ゲットライン関数で取ってきた値を切り取る―で失敗した苦い記憶
597デフォルトの名無しさん:2011/10/21(金) 14:21:28.43
598デフォルトの名無しさん:2011/10/21(金) 14:33:30.43
599デフォルトの名無しさん:2011/10/21(金) 20:57:46.61
std::list<Base> baseList;
std::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はどうやってキャストしたらいい?
600デフォルトの名無しさん:2011/10/21(金) 21:08:18.17
reinterpret_cast
601デフォルトの名無しさん:2011/10/21(金) 21:09:21.59
reinterpret_cast< std::list<Base> & >(derivedList)
602デフォルトの名無しさん:2011/10/21(金) 21:21:00.48
>>599
std::list<Base>とstd::list<Derived>は何の関係もない型
603デフォルトの名無しさん:2011/10/21(金) 21:33:28.51
reinterpret_castしても死ぬだけだお
604599: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;
}

基本クラスのオーバーライドの戻り値に関して、派生クラスでは戻り値もその派生物を返したいんだけど、どうしたらいいんだろう
605デフォルトの名無しさん:2011/10/21(金) 23:06:49.22
C#のジェネリックと違って共変性も反変性もないから簡単には無理。

ぶっちゃけポインタを格納するコンテナならreinterpret_castで動くと思うけど保証されない。
606デフォルトの名無しさん:2011/10/21(金) 23:11:04.89
DerivedListを定義して何をしたいのか不明だけど、
PiyoはBaseListを保持していて、その要素にDerived *を突っ込むのが普通だと思う
607デフォルトの名無しさん:2011/10/22(土) 22:10:03.25
class BaseList {
protected:
  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()); }
};

うーん…
608デフォルトの名無しさん:2011/10/23(日) 01:43:33.42
Cstringとstd::;stringの違いって何?
609デフォルトの名無しさん:2011/10/23(日) 01:52:32.19
Cstringもstd::;stringも存在しません
610デフォルトの名無しさん:2011/10/23(日) 02:03:10.92
w
611デフォルトの名無しさん:2011/10/23(日) 09:18:36.72
typedef void* Bucchake;

612デフォルトの名無しさん:2011/10/23(日) 17:52:44.37
608は何処へ
613デフォルトの名無しさん:2011/10/23(日) 18:28:21.35
D3DXVECTOR3 p;
の時
p = D3DXVECTOR3(0,1,2);

p.x = 0; p.y = 1; p.z = 2;
はコンパイラが気を利かせて処理速度的に等価になるのでしょうか?
それとも差が出るのでしょうか?
614デフォルトの名無しさん:2011/10/23(日) 18:29:22.94
↓コンパイラによるとか気の利かない回答するアホ
615デフォルトの名無しさん:2011/10/23(日) 18:30:51.74
どうせインライン化されるでしょ
616デフォルトの名無しさん:2011/10/23(日) 18:40:00.45
上のほうが最適化しやすいよ
617デフォルトの名無しさん:2011/10/23(日) 18:52:14.34
>>613
その質問をする人が、そんなレベルの最適化さえも必要な程に
高度な要求をされる可能性はごくごく僅かだから、
気にしない方が良いと思う。
618デフォルトの名無しさん:2011/10/23(日) 20:08:21.21
コンパイラとそのオプションスイッチに依ります。マジで
619599:2011/10/23(日) 21:52:45.57
亀レスになってしまった。すまん

>>607
自分でも色々やってみたんだが、どのみち遠回りな実装になってしまう
>>606の言うとおり、素直にコーディングした方が良さそうだなぁ
620デフォルトの名無しさん:2011/10/23(日) 22:07:45.65
>>613
前者の方が最適化されやすいと考えていい
D3DXVECTOR3はともかく、ベクトル化を狙ったコードの一部だとしても同様
621デフォルトの名無しさん:2011/10/23(日) 22:09:49.34
>>620
616で既出
622デフォルトの名無しさん:2011/10/24(月) 13:29:16.69
>>621
知ってた
623デフォルトの名無しさん:2011/10/25(火) 21:13:02.52
これって64bit環境じゃレジスタ使うからアウトだよな。
64bitでもvolatileとか使って上手いこと動かせる方法ってある?
void Function( double x, double y, double z )
{
 double *trivector = &x;
 trivector[0]; //x
 trivector[1]; //y
 trivector[2]; //z
}
624デフォルトの名無しさん:2011/10/25(火) 21:25:41.07
最初から配列で渡そうぜ
625デフォルトの名無しさん:2011/10/25(火) 21:25:41.51
環境関係なく規格上アウト
規格無視するならdoubleの引数をスタックに積む関数の呼び出し規約を指定すれば期待通りに動くこともあるだろ
626デフォルトの名無しさん:2011/10/25(火) 21:29:01.41
64bitの呼び出し規約は最初のいくらかをレジスタ渡しして、
その分スタック空けた状態で残りを積んでcallだっけ(順番逆だが)
ただし、スタックは16バイト境界に合わせる、と
>>623はムリダナ
627デフォルトの名無しさん:2011/10/25(火) 22:27:47.39
なんでこんなキチガイなことをやりたがるんだと思った
628デフォルトの名無しさん:2011/10/25(火) 23:21:53.43
色々試すのはいいことだと思う
629デフォルトの名無しさん:2011/10/25(火) 23:25:23.80
64bitでcdeclとか使えないの?
630デフォルトの名無しさん:2011/10/25(火) 23:27:13.78
ゲーム技術の本でそういう書き方してる本があった
631デフォルトの名無しさん:2011/10/25(火) 23:44:50.56
インラインアセンブラすれば・・・と言いたいが
64bitだと使えないんだよな
何でだろ
632デフォルトの名無しさん:2011/10/25(火) 23:55:19.76
VC++ならあのコードが動いてしまうようになるデバッグ用コンパイラオプションがあるが救済したくないな
コードを直すべき
633デフォルトの名無しさん:2011/10/26(水) 00:17:20.92
こういう用途で、配列に代入しなおすとコストが2度の代入が無駄だと思ったんだが、
virtual Vector Function( double x, double y, double z )
{
 return Vector( reinterpret_cast<(*)[3]>( &x ) );
}

そもそもレジスタ渡しになるんだったら、配列への代入コストに気を使う必要もなかったな。
634デフォルトの名無しさん:2011/10/26(水) 00:32:55.97
メモリからメモリへのコピーより
レジスタからメモリへの代入の方が速いべ
635デフォルトの名無しさん:2011/10/26(水) 00:48:23.51
どうしてもそこがボトルネックになるのならいろいろ試すのもいいかもしれないが……それでもその書き方はないな
その関数の場合素直に書くのが一番速いと思うよ
636デフォルトの名無しさん:2011/10/26(水) 01:02:53.66
コンパイラだって少数のトリッキーなソースより大多数の最適化しやすい普通のコードを最適化するよう方向に傾倒するだろうしな
637デフォルトの名無しさん:2011/10/26(水) 01:26:44.07
古株のユーザに不利な最適化をしたら寝返られるからそんなに甘くない
638デフォルトの名無しさん:2011/10/26(水) 01:45:49.61
>>630 書名晒せ
639デフォルトの名無しさん:2011/10/26(水) 05:44:08.43
inlineでpacker作れと言いかけたけど需要なかった
640デフォルトの名無しさん:2011/10/26(水) 18:23:40.72
C++から Access2010のファイル、例えば C:\DAT\TEST.accdb を起動するにはどうしたら良いでしょうか
パスワードを含めたいので、GetObjectみたいのでなくオートメーションで起動したいのですが

これ、http://support.microsoft.com/kb/306686
見たのですが、マクロの起動は不要で、択画面の表示も不要で、Access2010のファイルを起動して自身は終了するだけで良いのですが
どの部分を使ったら良いのか全く分かりません

全くの素人でスミマセン
641デフォルトの名無しさん:2011/10/26(水) 19:37:58.94
>>640
つ[ShellExecute()]
642デフォルトの名無しさん:2011/10/26(水) 19:55:50.40
>>641
スミマセン、それだとパスワードが渡せないんです
Accessオブジェクトを作って、AccessApplication.OpenCurrentDatabase(引数にパスワード渡せる) メソッドで開かないと
643デフォルトの名無しさん:2011/10/26(水) 19:59:07.89
644デフォルトの名無しさん:2011/10/26(水) 20:10:42.16
>>643
スミマセン、DAOやADOでAccessデータベースにデータアクセスするのではなく、アクセスアプリケーションを開きたいんです
645デフォルトの名無しさん:2011/10/26(水) 22:37:17.93
少しかっこよくシングルトンを作ろうとしたのですが、
コンパイルエラーで詰まってしまいました。
どうすれば通りますか?
ttp://codepad.org/f10NR3dM
646デフォルトの名無しさん:2011/10/26(水) 22:44:55.69
循環してるんじゃね
647デフォルトの名無しさん:2011/10/26(水) 23:04:06.42
class Single : public singleton<Single>

Singleが完成しないとsingletonが完成しない。
singletonが完成しないとsingletonが完成しない。
以下無限ループ。

関係ないけど、C++なんだからSingletonなんてダサいもんじゃなく、
モノステート使ったら?
モノステート:全てのメンバー変数はstatic、メンバー変数にアクセスする関数は全て非static
648645:2011/10/26(水) 23:11:41.02
>>646-647
ああ、そうか落ち着いて考えたらループしてまね・・・
やはりnewしないとこの形では無理なのですね

モノステートがええですかね、助かりました、ありがとうございます。
649デフォルトの名無しさん:2011/10/26(水) 23:20:01.12
mainで初期化してアプリ用のMain関数に引数で渡せばいい。シングルトンは甘え
650デフォルトの名無しさん:2011/10/26(水) 23:33:03.41
何十階層も引数で渡していくの?
途中の階層で全く使われてなくて下層に渡すだけとかでも?
651デフォルトの名無しさん:2011/10/26(水) 23:34:44.66
何十回層も書くほうがアホなので設計を見なおす
652デフォルトの名無しさん:2011/10/26(水) 23:58:09.67
デバッグ用スタックトレースとログは、引数渡しすると、
通常運転時にデッドウェイトになりすぎてマズイ。
あと固定デバイス関係も引数で引きずると、
高速ループで引数渡しが発生してこっちもマズイ。

ただ、設定とかスレッド間変数をモノステートやら
シングルトンやらにするのはアホ。
653デフォルトの名無しさん:2011/10/27(木) 00:08:17.42
>>652
どうするのがいいの?
654デフォルトの名無しさん:2011/10/27(木) 00:08:36.96
グローバル変数にしたいだけなのにシングルトンとか間違ってる
655デフォルトの名無しさん:2011/10/27(木) 00:08:42.00
グローバル変数は駄目だと言われたら如何なる状況でも使うべきでないと思うらしい
656デフォルトの名無しさん:2011/10/27(木) 00:18:44.23
>>655
よほどの理由が無い限り広域変数を使うもんじゃないのは確かだろ。
せいぜい許されるのは、PCIデバイスを開発する時とか、
割り込み制御するときぐらい。その時でさえstaticにするのに。
b = function( a );
こう呼び出したとき、functionの結果にa以外の何が
影響するかなんて到底想像できん。
下手したら無限ループや、不安定な分岐が発生する。
657デフォルトの名無しさん:2011/10/27(木) 00:21:03.40
> class Single : public singleton<Single>
この形自体は問題ない。
ただしこの形の場合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;
}
658デフォルトの名無しさん:2011/10/27(木) 00:24:49.68
ソフトウェアの構造によるが正解
659645:2011/10/27(木) 00:26:31.84
>>657
やるならポインタで、ってことですかねー、どうもです。
660デフォルトの名無しさん:2011/10/27(木) 00:27:07.17
クロスプラットフォームでzip rar lzhファイルの中身のファイル名を列挙したり、特定のファイルをメモリ内に解凍できたりするライブラリないですか?
できれば渡したファイル名の拡張子から自動判断で処理切り変えて抽象化されて纏まっているようなのがいいです
すれ違いだったらすいません
661デフォルトの名無しさん:2011/10/27(木) 00:30:11.70
>>653
何を?設定の事か?
設定なら、設定を読み込んだオブジェクトが、
既存の設定対象のプログラムを操作するようにする。

ProcessorA a;
ProcessorB b;

Configuration config;
config.RestoreA( &a );
config.RestoreB( &b );

あくまで設定は本来プログラム内にある値を外部に置いてるだけ。
実処理してる部分は、設定は、プログラム内で定数で渡された値と同様に扱うべき。
実処理が設定部に依存してちゃいけない。
662デフォルトの名無しさん:2011/10/27(木) 00:32:51.13
>>660
クロスプラットフォームなのに拡張子でファイルを判断するライブラリは
多分無いと思うぞ。拡張子でファイルを判別するOSはWindowsぐらいだし。
663デフォルトの名無しさん:2011/10/27(木) 00:37:47.63
>>662
そうなの?
じゃあファイルの中身見てファイル形式判断して処理切り替えてやってくれるのでいいからない?
664デフォルトの名無しさん:2011/10/27(木) 00:41:43.62
ゲームプログラミングでサウンド再生処理をクラス化した場合にシングルトンにせずに引数で渡して使った方がいいの?
665デフォルトの名無しさん:2011/10/27(木) 00:44:13.96
タイトル画面とかプレイ画面とかエンディング画面とかでソフトウェアを分けると思うんだけど
そのどこからでも使われるわけで引数で渡すと面倒なんだけど
666デフォルトの名無しさん:2011/10/27(木) 00:48:29.85
シングルトンにする事と引数で渡す事の関連性が分からん
667デフォルトの名無しさん:2011/10/27(木) 00:49:41.54
シングルトンやグローバル変数は絶対使ったら駄目で引数にすることで回避すべきと主張してるんじゃないの
668デフォルトの名無しさん:2011/10/27(木) 00:52:55.17
適材適所
669デフォルトの名無しさん:2011/10/27(木) 00:53:47.64
getterでおk
670デフォルトの名無しさん:2011/10/27(木) 00:54:30.65
>>669
671デフォルトの名無しさん:2011/10/27(木) 00:56:38.59
下駄履きでもどうぞってことだろ。言わせんな、恥ずかしい。
672デフォルトの名無しさん:2011/10/27(木) 00:59:14.46
シングルトン使わずにサウンド再生クラスを使うゲームプログラムのうまいソフトウェア設計を答えろや
673デフォルトの名無しさん:2011/10/27(木) 01:01:04.77
引数で渡せばぁー?
674デフォルトの名無しさん: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を指定してゲームの実行を開始する
675デフォルトの名無しさん:2011/10/27(木) 01:04:47.81
こんなんするの?センスなくね

main{
  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);
  }
}
676674: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 );
677デフォルトの名無しさん:2011/10/27(木) 01:14:28.47
良く分からんけどloaderとかsaverってのがグローバル変数みたいなものじゃないの
外部ファイルを介してデータを入出力してるようなイメージしか持てないんだが
678デフォルトの名無しさん:2011/10/27(木) 01:20:04.27
>>677
いや。まず関数の中に設置されるし。
loader,saverに渡したオブジェクト以外の値はなんら影響はしない。
もっと言えば、広域変数のようなクラスの利用者側が意図していない振る舞いが起きることはない。
679デフォルトの名無しさん:2011/10/27(木) 01:39:33.35
Drivenが解らないと、BindXXXXの部分が何をしてるか解らないかもしれないんで、
一応一番簡単なDrivenの実装書いて補足しとく。(この短い例はゲームに不向き)

void Driven( Phase *phase )
{
       while( phase = phase->Do() );
}

Doを実行すると、phaseがBindXXXで取り込んだオブジェクトの
ポインタを、一つ選んで返す。PhaseのオブジェクトはDoが呼ばれている間、
オブジェクト自身に課せられた課題(Play画面とか)を実行する。
BindXXXXはポインタを取り込むだけで、取り込んだポインタのメンバー関数を呼んだりはしない。
680デフォルトの名無しさん:2011/10/27(木) 01:40:51.08
音を鳴らしたい場所に
Sound::play(SE);
と一行書けばいいだけなのになんでそんあ面倒なことするの
としか思えない
681デフォルトの名無しさん:2011/10/27(木) 01:43:19.21
playだけじゃダメなの?
682デフォルトの名無しさん:2011/10/27(木) 01:44:37.00
音だけじゃなく画面とか全てを一貫して管理するからだよ。
683デフォルトの名無しさん:2011/10/27(木) 01:49:15.91
>>680-681って>>665じゃ無かったか。
画面と設定値の管理だと思って書いて話が食い違ってた。
余計なこと言ったわ。ごめん。
684デフォルトの名無しさん:2011/10/27(木) 07:40:39.58
loaderって毎回ファイルから値読むのか?
起動時設定覚えておけないじゃん
685デフォルトの名無しさん:2011/10/27(木) 07:56:55.15
int main(void) {
try {
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()
}
}

これでいいじゃん
引数で渡すっていっても毎フレーム律儀に引数で渡す必要はない
686デフォルトの名無しさん:2011/10/27(木) 08:50:48.39
>>684
意味がわからんが、loaderは、読み込み指示が
あったときだけ実行される。
読み込んだ値は各種phaseが適切な形で保持する。
687デフォルトの名無しさん:2011/10/27(木) 13:04:18.05
>>685
何に向かって言ってるのか分からんけど、
そのやりかだとシングルトンと同じで拡張性がない。
1.Frameworkクラスがシーンより後に定義され、
各シーンが抽象化クラスを通して、
framework に
アクセスしている場合はダウンキャストが必要。
2.Frameworkクラスがシーンの前に定義してある場合は
メンバー追加のたびにFramework を変更するので、
シーンをライブラリ化できない。

更に言えば新しいシーンを追加したとき、
新しいシーンはFramework 以外のオブジェクトを
設定として受け取れない。
688デフォルトの名無しさん:2011/10/27(木) 13:31:17.85
シングルトン否定厨はバカでFA
689デフォルトの名無しさん:2011/10/27(木) 13:35:46.87
引数で渡すコストがーっていう人はシングルトンのgetInstanceのコストは無視なの?
引数ならinline化でコスト減らせるかもしれないけどgetInstanceはその性質上最適化できないよね
690デフォルトの名無しさん:2011/10/27(木) 18:40:13.73
シングルトンはインスタンスを1つしか作らないならグローバル変数と同じ
getInstanceに置き換えてるだけだもの

通信とか、複数がありうるけど無制限は許されないときに使うもの
シングルトンて名前がよくないんだな
691デフォルトの名無しさん:2011/10/27(木) 18:47:48.33
インスタンスが複数あったらシングルトンにならないだろ
692デフォルトの名無しさん:2011/10/27(木) 18:58:23.33
シングルトンの本質は生成するインスタンス数が制限できることだろ
良く使われる利用法では1個しか作らないだけで
693デフォルトの名無しさん:2011/10/27(木) 19:22:15.86
「シングルトンパターン」はインスタンスがひとつの場合
複数作る場合はシングルトンもどき
元々デザインパターンってよく使われるのをパターン化したやつだしそんなもん
694デフォルトの名無しさん:2011/10/27(木) 19:25:26.32
シングルトン使わずにサウンド再生クラスを使うゲームプログラムのうまいソフトウェア設計を答えろや
695デフォルトの名無しさん:2011/10/27(木) 19:42:41.20
論理的に1つでないとダメなんじゃなくてハードの制限とかで1つになるんだから
カウントして例外投げるほうがわかりやすくていい
数値オーバーフローで例外投げるときと同じ感覚
696デフォルトの名無しさん:2011/10/27(木) 19:59:17.44
オブジェクトの数を一つだけにできるメリットってなんなん今市有効活用法が見つからないんだけど
それよりもどこからgetobjしても最初のgetobjでだけオブジェクト生成して2回目以降は状態が保存されてることの方がメリットとして大きいと思うんだが
697デフォルトの名無しさん:2011/10/27(木) 20:13:08.80
>>696
単なるstatic変数とかでいいんじゃね?
698デフォルトの名無しさん:2011/10/27(木) 20:32:00.60
本に書いてあることそのまま垂れ流してるだけだろ
699デフォルトの名無しさん:2011/10/27(木) 21:00:33.21
>>692
面白い見方だな
FILE[] はシングルトン?
700デフォルトの名無しさん:2011/10/27(木) 21:08:34.51
複数作るのは別名があったようななかったような
701デフォルトの名無しさん:2011/10/27(木) 21:11:05.72
ファクトリなんちゃらだろ
702デフォルトの名無しさん:2011/10/27(木) 21:51:02.22
>>692
シングルじゃねぇー
703デフォルトの名無しさん:2011/10/27(木) 22:00:25.80
namespace hoge { class _fuga ; }

_を前につけるのはどんな場合でもダメなんだっけか?
704デフォルトの名無しさん:2011/10/27(木) 22:01:17.05
どんな場合でもというわけではない
でも細かい規則を覚えるの面倒だしつけるなら後ろにしてる
705デフォルトの名無しさん:2011/10/27(木) 22:05:54.76
>>696
Nullオブジェクトとか、不変オブジェクト。あと状態のないI/O系。

Example *example1 = Null::Instance();
Example *example2 = Null::Instance();

Mode *mode1 = AlphaMode::Instance();
Mode *mode2 = AlphaMode::Instance();
mode2 = BetaMode::Instance();

実体が一つなんで無駄が無くなる。
I/O系は、元々副作用があるから、シングルトンでも
引数渡しでも大して変わらん。

あと、シングルトンをグローバル変数替わりに使うのは間違い。
シングルトンのInstance();を呼び出すのは、他のクラスであれば
コンストラクタを呼ぶタイミングに限らないといけない。
706デフォルトの名無しさん:2011/10/27(木) 22:11:50.36
__は駄目
_+大文字も駄目
_+小文字はグローバル名前空間でだけは駄目

だっけ?
707デフォルトの名無しさん:2011/10/27(木) 22:14:57.71
>>706
実は、全大文字変数もだめ。
全大文字はマクロ用だからね。
708デフォルトの名無しさん:2011/10/27(木) 22:18:26.11
>>707
そんな規則はねえよ(規格上)
709デフォルトの名無しさん:2011/10/27(木) 22:25:02.89
>>708
規格には無いが、禿がマクロ用だから絶対大文字で変数を書くなといってる。
http://www.libjingu.jp/trans/bs_faq2-j.html#constplacement

マクロで変数上書きしても警告でなかったり、エラーにならない事があるからな。
710デフォルトの名無しさん:2011/10/27(木) 22:26:54.23
リンク先間違えたこっちだ
http://www.libjingu.jp/trans/bs_faq2-j.html#Hungarian
711デフォルトの名無しさん:2011/10/27(木) 22:30:52.63
マクロを全部大文字で書かないバカは死んだほうがいい
712デフォルトの名無しさん:2011/10/27(木) 22:36:10.04
#ifdef __cplusplus
# undef >>711
#endif
713デフォルトの名無しさん:2011/10/27(木) 22:38:01.65
そこは自分好みの命名規則について語ってるところだし
規格中にもoffsetofとか非予約語小文字マクロが混ざってるのがいたい

まあ自分が書くときは大文字にするけど
714デフォルトの名無しさん:2011/10/27(木) 23:01:25.54
C++11を勉強しないとダメなの?
715デフォルトの名無しさん:2011/10/27(木) 23:10:38.51
windows.hのmin/maxだけは死ぬまで許さない
716デフォルトの名無しさん:2011/10/27(木) 23:17:35.93
far、near、THIS、smallモナ
717デフォルトの名無しさん:2011/10/27(木) 23:30:21.26
hage*
718デフォルトの名無しさん:2011/10/27(木) 23:34:31.92
homu
719デフォルトの名無しさん:2011/10/28(金) 00:24:08.61
>>709
確かに全て大文字はマクロ用として使うのが普通だけど
今は規格の話だ
720デフォルトの名無しさん:2011/10/28(金) 00:58:16.27
>>715
ほーれほーれ
int c = (std::min)(a, b);
721デフォルトの名無しさん:2011/10/28(金) 03:04:49.21
>>715
#define NOMINMAX
722デフォルトの名無しさん:2011/10/28(金) 03:28:51.16
>>714
autoとかラムダ式とかはガチで便利やで?
723デフォルトの名無しさん:2011/10/28(金) 03:49:56.93
>>714
VCがC++11にほとんど対応してない以上、仕事としては覚える意味はない。
趣味で何か作ってるなら覚えてると便利。
724デフォルトの名無しさん:2011/10/28(金) 07:20:20.55
>>721
stdafx.hいじらせてもらえないんだ・・・
725デフォルトの名無しさん:2011/10/28(金) 08:11:52.68
>>724
自分のcppの範囲内だけ有効になるように書いても問題ないよ
726デフォルトの名無しさん:2011/10/28(金) 20:54:48.58
NOMINMAXするにはもう手遅れじゃん
min, maxを#undefするしかない
727デフォルトの名無しさん:2011/10/28(金) 22:01:09.14
しかないってカッコで括るとかusingするとか型を明示するとかあるだろ
728デフォルトの名無しさん:2011/10/28(金) 22:08:44.47
コンストラクターのアドレスを高速に取る方法って無い?
シンボルテーブル漁れば取れるっちゃ取れるけど遅い。
ちなみに用途はデバッグ用。
int Function()
{
   ScopeTrace tracer;
}
スタック情報を元に関数の開始と終了時点で
ログを出力するクラスを作ったんだが、
呼び出し元の関数がインライン展開されると
呼び出し情報が消しとぶんで、ScopeTrace tracer( Fuction );
ってな感じでアドレスを渡してる。コンストラクターの
アドレス取得だけが手間がかかってひたすら遅い。
729デフォルトの名無しさん:2011/10/28(金) 22:19:28.57
インライン化を抑止したほうがいいんじゃない?
730デフォルトの名無しさん:2011/10/28(金) 22:38:12.06
しかし、VC++は何でtypedefで別名つけるのが好きなんだろ?


ワレ、いいかげんにせいよ!この糞マイクロが!
と言いたくなる。
731デフォルトの名無しさん:2011/10/28(金) 22:41:28.06
インライン化自体はしてもらわないと困るんだよね。
ScopeTraceの呼び出しはインライン化で消し飛んでくれる。
デバッグじゃなく通常モードだと、関数のアドレス代入と
if文2回だけのコストしか掛からないから、それはそれでありがたい。
732デフォルトの名無しさん:2011/10/28(金) 22:41:57.69
typedefじゃなかったらどうやって別名つけるんだ
733デフォルトの名無しさん:2011/10/28(金) 22:43:35.53
>>730
コンパイラによって型が違うからだろうけど、
それにしてもやりすぎだよな。WPARAMとかDWORDでいい。
734デフォルトの名無しさん:2011/10/28(金) 22:50:28.69
>>727
そうしなくて良い方法について話してるんだが
735デフォルトの名無しさん:2011/10/28(金) 22:56:18.05
そういやWinAPIってハンガリアンな時点でクソだけど、
構造体や型名が大文字ってのも糞だな。
どういうつもりで命名規則作ったんだろ。あのタコども。
736デフォルトの名無しさん:2011/10/28(金) 22:57:24.04
WORDとつく型名なんて作らなければよかったのに
737デフォルトの名無しさん:2011/10/28(金) 23:00:28.40
intですらINTってつけてるからなぁ
738デフォルトの名無しさん:2011/10/28(金) 23:02:21.53
LPCTSTRとかもうね
739デフォルトの名無しさん:2011/10/28(金) 23:03:57.45
>>733
それだと64bit環境で困っちゃう

>>737
一貫性してていいと思う
でもPINTなどのポインタのtypedefはいらんよね
740デフォルトの名無しさん:2011/10/28(金) 23:05:46.56
constもいらんね
741デフォルトの名無しさん:2011/10/28(金) 23:06:50.29
16bitと32bitの過渡期にはintが16bitの処理系と32bitの処理系があったりしてな・・・
で、なんでtypedef int LONGにすりゃいいのにlongが64bitじゃねぇんだよ。
742デフォルトの名無しさん:2011/10/28(金) 23:20:20.05
ま、スレ違いなので続きは他所で。
743デフォルトの名無しさん:2011/10/29(土) 00:10:33.98
newでクラスの配列を実体化する場合、コンストラクタに引数を渡せないということは、
デフォルトコンストラクタを用意して、後で引数を渡すのが一般的ですか?
それとも何か一発でやる方法が?
744デフォルトの名無しさん:2011/10/29(土) 00:34:08.31
std::vectorを使うのが普通
745デフォルトの名無しさん:2011/10/29(土) 00:38:03.39
Cでも、確保したメモリーを0ぐらいでしか初期化できないし、
実際配列をデフォルト値以外で初期化する意味もないしな。
やるとしたらテンプレートでラップして初期値を与えるぐらいじゃね。
746デフォルトの名無しさん:2011/10/29(土) 00:39:37.69
char配列でメモリ確保してreplace newを使うんだよ
747デフォルトの名無しさん:2011/10/29(土) 00:45:51.46
んな中途半端な事するぐらいだったら、
fill使えばよくね。
Type *array = (Type*)new char[n];
fill( array, arrray + n, Type( x, y ) );

と思ったが、delete[]でデストラクタがこける気がする。
748デフォルトの名無しさん:2011/10/29(土) 00:46:49.56
>>737
大文字で名前統一したいなーっていうのはまだ許せるんだけど
WinMainでいきなりint使ってるるところに怒りを抑え切れない
INT使ってやれよって
749デフォルトの名無しさん:2011/10/29(土) 00:53:06.55
>>743
#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;
}
750デフォルトの名無しさん:2011/10/29(土) 02:49:47.19
>>743
C++11限定なら
ttp://ideone.com/3pGz0

ちなみに03でもこんなことはできたり
ttp://ideone.com/KTWB9
(おっと、ideoneだと不定値にならんな、ローカルで試して)
751743:2011/10/29(土) 07:05:51.67
>>744-750
ありがとうございます
とりあえずvectorなら自分にも使えそうです
他の方法は勉強いたします
ご教示感謝
752デフォルトの名無しさん:2011/10/29(土) 07:15:50.34
テキストファイルの読み込み時に
指定した行を1行だけ読み込む為の関数って無いですか?
753デフォルトの名無しさん:2011/10/29(土) 07:52:11.06
あるウインドウに指定した画像が描画、表示されてるかチェックする関数ってありませんか?
754デフォルトの名無しさん:2011/10/29(土) 08:05:29.88
>>746
placement newな
755デフォルトの名無しさん:2011/10/29(土) 08:42:51.71
>>752
ないから自作
756デフォルトの名無しさん:2011/10/29(土) 09:10:05.44
行先頭の位置をキャッシュしとけ
757デフォルトの名無しさん:2011/10/29(土) 11:58:25.01
static変数とnew使う以外で、関数から、抽象化クラスのオブジェクトを返す方法ねぇかなぁ。
758デフォルトの名無しさん:2011/10/29(土) 12:06:06.64
malloc
759デフォルトの名無しさん:2011/10/29(土) 12:11:04.61
ヒープ確保すんのが嫌なんだから変わんねぇよ
760デフォルトの名無しさん:2011/10/29(土) 12:20:42.71
boost::optional みたいな仕組みで返せばいいと思うよ
761デフォルトの名無しさん:2011/10/29(土) 12:29:20.54
>>757
TMPで派生クラス全部のサイズとアライン調べて、全部入るストレージを用意
ストレージをラップしてインターフェースを整える
ラップしたクラス内で配置newして返す
ってやれば出来るけどぶっちゃけ高速化をアロケータ−に任せてスマポ返すほうが正解だろうな
762デフォルトの名無しさん:2011/10/29(土) 12:48:05.02
関数の引数に「インデックスまたはキー」のどちらかを指定してね
みたいに表現するにはどうしたら良いんですか
763デフォルトの名無しさん:2011/10/29(土) 12:49:10.34
>>761
やっぱアロケータ自作か。
764デフォルトの名無しさん:2011/10/29(土) 12:51:35.05
>>762

class Order;
class Index:public Order;
class Key:public Order;
Exampe operator[]( const Order& );
765デフォルトの名無しさん:2011/10/29(土) 13:01:32.22
>>762
知らない訳はないと思うが、単純にオーバーロードすりゃいいんじゃね。
766デフォルトの名無しさん:2011/10/29(土) 13:13:40.05
インデックスとキーが同じ型だったらどうしよう
767デフォルトの名無しさん:2011/10/29(土) 13:19:25.53
>>766
traitsでラップすればいい
っておい、利用者はどう使い分けているんだ??
768デフォルトの名無しさん:2011/10/29(土) 13:21:26.51
static_cast<const Key&>( complex_order );
static_cast<const Index&>( complex_order );
とか
complex_order.To<Key>();
complex_order.To<Index>();
とか
Key &key = complex_order;
Index &index = complex_order;
とか
好きなのを選べ。
769デフォルトの名無しさん:2011/10/29(土) 16:54:01.56
シングルトンの実装を考えているんですが、インスタンスの確保の仕方で迷っています

(1) 静的メンバ変数であるunique_ptr<>に、静的メンバ関数instance()内でnewで確保したメモリアドレスを入れる
(2) 静的メンバ関数instance()内で、static変数としてメモリを確保する

これらの実装に何か違いはあるんでしょうか?
あと、速度面では、やはり(2)の方が速いのでしょうか?

ttp://ideone.com/oMMR8
770デフォルトの名無しさん:2011/10/29(土) 16:57:20.55
unique_ptrをわざわざ使う理由がわからん
771デフォルトの名無しさん:2011/10/29(土) 17:07:59.84
賢く見せたいお年頃なんじゃね
772デフォルトの名無しさん:2011/10/29(土) 17:09:54.36
スマートポインタだけにな!
773デフォルトの名無しさん:2011/10/29(土) 18:08:15.40
どっちもダメな実装だけどunique_ptrを使うことでよりダメになっている
774デフォルトの名無しさん:2011/10/29(土) 18:32:57.54
馬鹿はC言語だけで組めよ
775デフォルトの名無しさん:2011/10/29(土) 19:08:42.69
>>769
まず
X xinstance;
では嫌な理由から説明してもらおうか。
776デフォルトの名無しさん:2011/10/29(土) 19:09:32.46
>>769
まずSingletonを使わない事を考えろ。
次に、Monostateパターンを検討しろ。
それでもダメなら、本当に実体が一つでないと困るか
クラス図を書いて本気で考えろ。
そうすりゃ、どういう実装にすべきかおのずと決まる。
777デフォルトの名無しさん:2011/10/29(土) 19:12:40.38
>>769
newはいらないよ。↓でお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;
}
778デフォルトの名無しさん:2011/10/29(土) 19:24:56.21
>>775
別のシングルトンクラスがある場合に、どの順番でデストラクタが
呼ばれるのかはっきりさせたいんです
終了処理を明示的に記述して、呼び出した方がいいんでしょうか

>>776
どうしてもシングルトンが必要な場合について、教えてくだしあ

>>777
関数ローカルな静的変数ですか…
やっぱりnewするのはC++には合わないんでしょうか

それっぽくまとめてみました
状況によって、最適な実装を選択するしかないんでしょうか
ttp://ideone.com/7CrfO
779デフォルトの名無しさん:2011/10/29(土) 19:27:32.31
>>777
場合によるだろ。
あとその組み方あんま良くないね。
未初期化か、初期化済みかは、未初期化を表すオブジェクトと、
初期化済みを表すオブジェクトで表現すべきだ。
bool値で判定するもんじゃない。
780デフォルトの名無しさん:2011/10/29(土) 19:31:43.19
>>778

どうしても必要な場合 >>705
781デフォルトの名無しさん:2011/10/29(土) 19:33:42.37
コンストラクタの定義内で、
別の引数のコンストラクタを呼び出すことって出来ないのですか?

VC++ 2010 Expressつかっています。
Javaだとそんな書き方したりしますよね?

よろしくお願いします。
782デフォルトの名無しさん:2011/10/29(土) 19:36:52.00
C++11をお待ちください
783デフォルトの名無しさん:2011/10/29(土) 19:36:54.38
C++11で可能になったがVC10では実装されていない
784781:2011/10/29(土) 19:43:21.80
>>781, >>782
即レスありがとうございますっ!

落ち着いて考えると、
他にメソッド用意して両方からそれを呼ぶだけでイイか、
と思ったのですけど、
C++11 で実装されるって事は、あった方が便利って事なんですよね?
継承とか使ってると無いと不便になるんでしょうか?
785デフォルトの名無しさん:2011/10/29(土) 19:49:14.02
>>778
そもそもシングルトンじゃなければ使う側で同じ関数内やクラス内に
変数の定義を並べるなどするだけで順番を確定できるのに。

その状況でさらにシングルトンを増やすとか、何がしたいのか。
786デフォルトの名無しさん:2011/10/29(土) 19:53:57.06
数学関数をまとめたクラスとかシングルトンにするなよ
787デフォルトの名無しさん:2011/10/29(土) 19:58:10.37
>>779
>未初期化か、初期化済みかは、未初期化を表すオブジェクトと、
>初期化済みを表すオブジェクトで表現すべきだ。
>bool値で判定するもんじゃない。
???
788デフォルトの名無しさん:2011/10/29(土) 20:13:52.87
>>785
最初はそうしていたんですが、シングルトンにしろと
叩かれてしまいまして…

たぶん皆さん基本的に、static領域に確保するんだと思います
ただ、タイミングを指定してデリートできるようにするには、
やっぱり生ポインタしか駄目なんでしょうか?

できるだけ、例外安全に実装したいのですが…

あと、メモリの確保についてなんですが

○スタックに確保
○ヒープ/フリーストアに確保
○静的領域に確保

速度的にどれくらいの差があるんでしょうか?

スタック >> 静的領域 > ヒープ/フリーストア
みたいな感じになるんでしょうか?
789デフォルトの名無しさん:2011/10/29(土) 20:20:15.53
なんでデリートせないかんの
790デフォルトの名無しさん:2011/10/29(土) 20:20:36.08
>>787
class 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;
        }
        /* 他メンバー */
};
791デフォルトの名無しさん:2011/10/29(土) 20:29:45.70
>>788
> 最初はそうしていたんですが、シングルトンにしろと
> 叩かれてしまいまして…

どういう理屈で叩かれたのか、気になる。
792デフォルトの名無しさん:2011/10/29(土) 20:29:56.32
>>789
異なるクラスのデストラクタで、順序に依存するリソース解放を行っているんです
1つのクラスに統合できればいいんですが、それだとカプセル化が壊れる…

こっちを取ると、あっちが立たない状態なんです

外部でデリートされる可能性があっても、スマポ管理のシングルトンを
注意して使えば、例外安全だしおkかな。。
793デフォルトの名無しさん:2011/10/29(土) 20:30:37.40
>>788
ヒープは確実に遅いが、スタック領域と静的領域どっちが速いのかは用途による。
単純な変数ならスタックが一番早い。
794デフォルトの名無しさん:2011/10/29(土) 20:31:55.01
>>792
コードを上げてみ。
795デフォルトの名無しさん:2011/10/29(土) 20:32:55.38
>>788
一般的にはこんなもんかね?
静的確保(実行時コスト0)>スタック(レジスタ減算)>>>フリーストア

初期化も含めれば割合的にどうでもよくなってくるし、起動時に済ませるんなら
なおさらどうでもいいと思うけど。
796デフォルトの名無しさん:2011/10/29(土) 20:34:32.79
>>792
> 1つのクラスに統合できればいいんですが、それだとカプセル化が壊れる…

どういうことなの・・・
797デフォルトの名無しさん:2011/10/29(土) 20:36:33.02
>>784
メンバ初期化子使ってると、メソッド用意しても無駄だからね
798デフォルトの名無しさん:2011/10/29(土) 20:39:51.98
>>791
他の開発者が誤ったコード書いても、致命傷にならないクラス設計してね、みたいな…

>>793
静的領域にメモリ確保した方が、newするよりも断然速いんですね。。

スタックが一番速いのは聞いたことあったんですが、
ヒープと静的領域の速度差がよく分からなかったんです

静的領域へのメモリ確保って、結構速いんですね。ありがとうございます
799デフォルトの名無しさん:2011/10/29(土) 20:43:22.29
そういや、大抵の実装じゃ関数内static変数には分岐が入るから、
クラススコープの初期化の方がいい。

>>795
staticは大概レジスタに乗らないから、
スタックの方が速いべ。

まぁこの辺気にするぐらいだったら、
アルゴリズムをどうにかすべきだが。
800デフォルトの名無しさん:2011/10/29(土) 20:44:49.03
静的領域へのメモリ確保は、単にプログラムロード時のメモリ使用量が変わるだけでしょ
まあ多すぎるとメモリが足りないとプログラムロードに失敗するという問題もあるけど
よほどでかい配列作らない限りは大丈夫だと思われ
801デフォルトの名無しさん:2011/10/29(土) 20:45:00.14
シングルトンって一旦作ったらずっとそのまま使いまわすものじゃないの?
ローカルクラスみたいになってんの
802デフォルトの名無しさん:2011/10/29(土) 20:45:38.27
singletonオブジェクトの終了処理の順番を決めたいなら、
意図的に終了処理の逆順でオブジェクトを生成するか、
終了処理を自前で書くか、だな
終了処理を実行する関数をオブジェクト生成時にatexitで登録しておけば
main終了後に勝手に終了処理してくれる
(クラスAとBで両方同じ関数を登録するので、二度呼ばれても大丈夫なように作る必要はある)
803デフォルトの名無しさん:2011/10/29(土) 20:50:09.78
うーん、何とかして >>778 のサンプルコード36〜65行目を
修正して、クラス外でのインスタンス削除を禁止できないものでしょうか…

外部での削除を禁止したいので、デストラクタはprivateにするしかない
でもそうすると、スマポのデリータークラスが削除できない

といって、フレンドを設定すると、意図した用途で削除はできるけど
外部で同じスマポから削除されると、二重デリートになる…

これは詰んだかOTL
804デフォルトの名無しさん:2011/10/29(土) 20:50:21.74
>>798
Singletonは、ガワだけにして本体を外に出せ。
そうすりゃ順番制御なんていくらでもできる。

int main()
{
       RealTypeA instanceA;
       RealTypeB instanceB;

       Singleton *object = Singleton::Object();
       object->ChangeInstanceA( &instanceA );
       object->ChangeInstanceB( &instanceB );
}

てか、その前にSingletonはヤメロ。せめてMonostateにしろ。
805デフォルトの名無しさん:2011/10/29(土) 20:51:43.26
>>803
ポインタじゃなく参照で返せばdeleteするバカは減るだろ。
806デフォルトの名無しさん:2011/10/29(土) 21:02:39.91
Javaみたいに、無名インナクラスが使えればいいのに…

>>802
自前で終了処理を書くことにします。

そもそも、関数ローカルな静的変数を使って実装した時点で、デストラクタの
呼び出し順がはっきりせず、Javaと似た状況になるんですから
Javaと同じように終了処理関数を明示的に呼ぶのが適切なんでしょうね

あと、関数ローカルな静的変数なんですが

メモリ確保…プログラムのロード時
コンストラクタ実行…変数宣言に制御が移った時

でいいんでしょうか?
基本は、大域変数と同じで、コンストラクタ実行が遅延される、という理解ですよね
807デフォルトの名無しさん:2011/10/29(土) 21:14:11.45
コンストラクタ実行は、やはり変数宣言時ですね
ttp://ideone.com/Tj1BA

メモリ確保がロード時に行われるのかどうかは、確かめる術がないのであきらめますOTL
みなさん、アドバイスありがとうございました
808デフォルトの名無しさん:2011/10/29(土) 21:17:00.54
初期化解放の順番を守りたいだけならカウンタ使えばいいよ
少し遅くなるけど事故るよりマシだから気にしない
809デフォルトの名無しさん:2011/10/29(土) 21:19:42.64
>>804
シングルトン<モノステートの理由は?
810デフォルトの名無しさん:2011/10/29(土) 21:25:10.74
賢く見える
811デフォルトの名無しさん:2011/10/29(土) 21:33:00.94
>>809
1.Singletonは実体が1つである必要がある場合に使うものだから。
 今回の質問者の言っているようなケースは大概そう用途じゃない。
2.モノステートは、見た目は他のクラスと全く変わらないため、
 テンプレートやらで扱いやすい。
3.上の理由によりnew,deleteも自然に可能。
4.呼び出し地点を観測できる。コンストラクタ、
 デストラクタで参照カウントとかも可能。
5.必要に応じ呼び出し側に合わせて制御もできるので
 整合性を取りやすい。
812デフォルトの名無しさん:2011/10/29(土) 21:51:37.16
質問なのですが、
ある関数で正常に処理された場合は戻り値にオブジェクトを、
処理に以上が発生した場合などにはNULLか何かを返したいのですが、
return NULL;とすると"オブジェクトの型ではないから駄目"みたいなエラーがでます。

こういった場合はどうしたら良いか教えてください。
813デフォルトの名無しさん:2011/10/29(土) 21:55:53.38
NULLじゃなく例外を投げる。
814デフォルトの名無しさん:2011/10/29(土) 22:05:17.35
戻り値をboost::optionalにする
815デフォルトの名無しさん:2011/10/29(土) 22:10:52.28
異常が発生したのにoptionalって・・・
816デフォルトの名無しさん:2011/10/29(土) 22:12:42.75
例外を使いたくないならアリだろ
817デフォルトの名無しさん:2011/10/29(土) 22:15:12.44
>>812
その関数の戻り値はポインタ型だよね?
818デフォルトの名無しさん:2011/10/29(土) 22:18:29.83
>>811
なるへそ
819デフォルトの名無しさん:2011/10/29(土) 22:18:38.22
>>813
例外は今ひとつ好くわかんないんですが
これから勉強しようと思います。

>>817
いえ、ポインタ型ではなくクラスの型(?)にしています hogeClass a(){} 見たいな感じです。
820デフォルトの名無しさん:2011/10/29(土) 22:21:52.08
hogeClass a() {
 if (!flag) {
  return NULL;
 }
}



hogeClass * a() {
 if (!flag) {
  return NULL;
 }
}

こうしてみ
821デフォルトの名無しさん:2011/10/29(土) 22:22:53.30
>>819
ポインタじゃなけりゃNULLは返せん。
例外が導入された理由の一端でもある。
822デフォルトの名無しさん:2011/10/29(土) 22:24:33.28
>>820
無理にNULLで返すようにさせるなよ。
>>819は例外のことすら知らんレベルだし。
どうしてもNULLで返さなきゃいけない理由を持ってないんだから。
823デフォルトの名無しさん:2011/10/29(土) 22:25:11.36
これでいいじゃん
bool func(type & buff);
824デフォルトの名無しさん:2011/10/29(土) 22:25:42.12
あぁ、多分色々と無理だろうな。>>820は無視してくれ
NULL は hogeClass に変換できない
戻り値の型は hogeClass だが、NULL の型は hogeClass * だから
825812:2011/10/29(土) 22:30:40.76
皆さま、色々とサンクス!
参考にさせてもらって修正をかけたいと思います。
826デフォルトの名無しさん:2011/10/30(日) 21:09:24.81
前に書いたコードを再利用しようとして読んでいたら、
std::mapのキーをintで使ってたのだけど、これをlistにしたら何か変わるかな?
827デフォルトの名無しさん:2011/10/30(日) 21:16:08.71
>>826
比較に時間が掛かるのですごく遅くなりそう
828デフォルトの名無しさん:2011/10/31(月) 07:34:28.99
listで大小比較どうすんの
829デフォルトの名無しさん:2011/10/31(月) 08:18:50.39
>>826
数や目的にもよるけど、
基本読み出し計算量オーダーがO(logN)からO(N)になる
830デフォルトの名無しさん:2011/10/31(月) 11:28:26.65
>>820
標準コンテナにはoperator<が最初から定義されている
831デフォルトの名無しさん:2011/10/31(月) 17:03:03.67
std::vector<char> v(100) ;
void * p(NewData()) ;
if(p) { DeleteData(p) ; }

これがコンパイラに再配置されて

void * p(NewData()) ;
std::vector<char> v(100) ;
if(p) { DeleteData(p) ; }

こうなって
v(100)でbad_alloc、pがリーク
なんていう現象って起こりうるんですか?
832679:2011/10/31(月) 17:18:01.03
>>827-829
レスありがとう。詳細を調べるのがラクになりました。

もうひとつお願いします。
namespace A
{
class Class B
{
static 型 hoge();
}
namespace D
{
型 hoge();
}
}
という感じのメソッドhoge()があるのですけど、何を意図してこういうつくりにするかわかります?
「静的クラスメソッドと名前空間指定した関数と」なんですけど、違いがわからない。
「どちらにするか」というルールが途中で変わって、片方は後方互換性のために残ったという感じが予想されますか?
それとも「静的クラスメソッドと名前空間指定した関数と」で用途が違いますか?
833679:2011/10/31(月) 17:19:34.59
↑すみません。半角のインデントが消えました…。

namespace A
{
  class Class B
  {
   static 型 hoge();
  }

  namespace D
  {
   型 hoge();
  }
}
834デフォルトの名無しさん:2011/10/31(月) 17:36:00.73
>>832-833
そのソースの意図はわからないけど
クラスの静的メンバ関数はそのクラスの非publicなメンバにもアクセスできるので普通の関数とは別物
835832-833:2011/10/31(月) 17:51:04.76
レスありがとうございます。

本当に申し訳ないです。
「静的関数はpublicです」と書くのを忘れて、もう一回投稿するかしないか迷ってしませんでした。

おっしゃるとおりで、「private static メソッドである」且つ「static フィールドにアクセスしている」ならわかるんですよね。
ソースを追ってみると、プライベートのフィールドにアクセスしていなくて、
結局「namespace D」のfoo()に合流していました。

オーバーロード関数がたくさんあったので、まとめるのに時間がかかりました。
ここまで確認してから投稿すべきでした。申し訳ない…。
836832-833:2011/10/31(月) 17:52:38.88
×「static フィールドにアクセスしている」
○「private static フィールドにアクセスしている」
837832-833:2011/10/31(月) 17:53:40.68
×「private static メソッドである」
○「public static メソッドである」

落ち着け、俺!
838679:2011/10/31(月) 21:18:27.97
>>679ってお前じゃないだろ
あと、静的関数メンバーは、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;
       }
};
839デフォルトの名無しさん:2011/10/31(月) 21:23:45.93
間違えた。

class Base
{
protected:
      virtual int Value(void) const {return 0;}
      static int PeekValue( const Base &base )
      {
           return base.Value();
      }
};
840デフォルトの名無しさん:2011/10/31(月) 22:37:31.92
template< typename T > class IsClassType {
typedef 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 関数。
841832-833:2011/10/31(月) 22:40:22.73
>>838
レスありがとうございます。
まず、>>638を名乗ったこと、申し訳ないです。
落ち着きがありませんでした。678は、「Boost総合スレ part9」で書き込んだ残骸です。

理解出来ました。
protectedは、意味は知っていたのですが、使ったことがなかったので教示いただいた用途は思いつきませんでした。
ありがとうございます。
842デフォルトの名無しさん:2011/11/01(火) 01:46:04.10
>>831
結果が変わるような最適化は基本的に許されない。
一部のオブジェクトのコピーは例外。

ただし未定義動作に踏み込んでしまえばこういった点も含めて
何の保証もなくなる。
843デフォルトの名無しさん:2011/11/01(火) 07:23:49.89
規格はあくまで規格だから
準拠率やコンパイラのバグを考えると
あらゆる事に保証が無い事に気付く
844デフォルトの名無しさん:2011/11/01(火) 11:45:13.83
WIN32APIで、透過PNGを読み込んでDCに貼り付けたいのですがうまくいきません。
LoadImage関数で読み込む方法を教えてください。

それと、LoadImage関数でBITMAPを取得したら背景透過は消えるのでしょうか?
合わせて教えてください。

↓躓いている部分
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"Test.png",IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);
845デフォルトの名無しさん:2011/11/01(火) 11:51:15.43
http://www.youtube.com/watch?v=KTc8vUpI_5Q
これの前半にある画像を左右に揺らすPGって結構簡単?
846デフォルトの名無しさん:2011/11/01(火) 11:56:22.76
> 841 名前:832-833[sage] 投稿日:2011/10/31(月) 22:40:22.73
> >>838
> レスありがとうございます。
> まず、>>638を名乗ったこと、申し訳ないです。
> 落ち着きがありませんでした。678は、「Boost総合スレ part9」で書き込んだ残骸です。
> 理解出来ました。
> protectedは、意味は知っていたのですが、使ったことがなかったので教示いただいた用途は思いつきませんでした。
> ありがとうございます。

>638と名乗ったのか>678と名乗ったのか>679と名乗ったのか知らんが、兎に角落ち着けw
847デフォルトの名無しさん:2011/11/01(火) 11:58:22.28
>>844
環境依存OKのスレか、WinAPIのスレへでも。
つーか、LoadImage()とやらはPortableNetworkGraphics画像フォーマットに対応しているのか?
848デフォルトの名無しさん:2011/11/01(火) 12:00:35.22
>>847
分かりました。
そっちへ行ってみます。
849デフォルトの名無しさん:2011/11/01(火) 13:26:22.26
メモリが足りるかどうかは
try
{
char * p = new char [k256Mega];
delete [] p ;
return true ;
}
caych(...)
{
 return false ;
}
でわかるけど、速度が足りてるかどうかってどうやってしらべるべき?
正確でなくて大雑把でいいんだけど、行列計算とかではかるのかな
850デフォルトの名無しさん:2011/11/01(火) 14:17:18.58
>でわかるけど
いいえ。
851デフォルトの名無しさん:2011/11/01(火) 14:41:17.60
クラスに対するoperator<やoperator==などの比較関数を、
クラス自身のメンバ関数にする方法(引数は1つ)と、
グローバルなフレンド関数にする方法(引数は2つ)があるようですが、
この2つはどのように使い分けるものなのでしょうか?
852デフォルトの名無しさん:2011/11/01(火) 15:25:55.66
>>851
自分自身と比較する時はメンバーに持ってもいいが、operator<<みたいに
std::streamみたいな別のクラスも引数に取る時はフレンドにするしかない

それから叙述関数にする時はフレンドにしないとそもそも呼び出せない
853851:2011/11/01(火) 15:41:46.76
>>852
ということは、メンバ関数にもできるものは、
わざわざフレンド関数にする必要も無いということですね。
854デフォルトの名無しさん:2011/11/01(火) 17:56:20.65
フレンドにすると保守が面倒になるからな
でもフレンドでしか出来ない場合もあるという事
メンバ関数で出来るものはメンバ関数でした方がいいに決まってる
855デフォルトの名無しさん:2011/11/01(火) 18:18:44.10
めっちゃ無理して強引にメンバ関数にしてる某言語を、こういうときくらい笑い飛ばせなきゃ
856デフォルトの名無しさん:2011/11/01(火) 19:41:52.47
>>849
メモリは実際に書き込みが行われるまで確保されない。
OSの割り込み監視対象になるだけ。
857デフォルトの名無しさん:2011/11/01(火) 19:46:12.57
フレンド使わんでも、staticメンバーで本体定義して、
グローバルのoperatorでそれを呼び出す手もある。
意外とこっちの方が便利。
858デフォルトの名無しさん:2011/11/02(水) 06:38:57.34
スレッドを作ったらデタッチかジョインしないとならないのはどうして?
メモリリークするのがどうしてなのかさっぱりわからないです。
逆にデタッチするとヒープにある何が開放されるのですか?スレッド自体はデタッチしても動き続けられますよね?
859デフォルトの名無しさん:2011/11/02(水) 07:05:18.66
一件お願いします。
複数ファイルからなるプログラムを作成しているのですが、
各ファイルでincludeするのが面倒なので、
ひとつのヘッダーファイルにincludeするヘッダーを全て記述して、本体ファイルたちはこのファイルのみincludeしてます。
なんかコンパイルがすごく遅いんですけど、どうしてでしょうか?
件のヘッダーファイルは、複数回読まれないように#pragma onceしているのですけど…。
860858:2011/11/02(水) 07:57:42.52
>>858です。
自己解決しました。
スレッドに関する情報を格納した構造体が、用意されて、スレッドを生成したときの変数はそれを参照してるのですね。
変数自体が情報を記録する構造体だと思っていました。
だから、呼び出し元の変数がスコープから外れて開放されても、ヒープにあるものは開放されないと。

pthreadのマニュアルみてたら、pthread_self()を見つけたのですけど、自分を指すってどういうことです?
スレッド起動時に用意される新しいスタックの一番下にスレッドに関する情報(か、それへのポインタ)がとられていて、そこを参照しているとか?
861デフォルトの名無しさん:2011/11/02(水) 08:07:54.21
>>859
ソースコード度に全てのヘッダーを取り込んでるから。
インクルードガードが効くのは個々のソースの中だけ。
862デフォルトの名無しさん:2011/11/02(水) 10:45:28.82
>>860
特定環境の話題は環境依存スレへ。
863デフォルトの名無しさん:2011/11/03(木) 11:19:20.53
不透明な型を継承する(あるいはしたように見えるでもいい)テクニックってないですか?
864デフォルトの名無しさん:2011/11/03(木) 11:25:56.75
内包すれば
865デフォルトの名無しさん:2011/11/03(木) 11:40:54.01
クラステンプレートをなんだと思ってんのか
866デフォルトの名無しさん:2011/11/03(木) 13:24:16.22
class Hoge {
public:
 shared_ptr<Piyo> GetPiyo() { return pPiyo; } // 1
 shared_ptr<Piyo> & GetPiyo() { return pPiyo; } // 2

private:
 shared_ptr<Piyo> pPiyo;
};

1と2、どちらの使用方法がより正しいですか?
867865:2011/11/03(木) 13:26:12.24
間違えました。

誤:shared_ptr<Piyo> & GetPiyo() { return pPiyo; } // 2
正:const shared_ptr<Piyo> & GetPiyo() { return pPiyo; } // 2
868デフォルトの名無しさん:2011/11/03(木) 13:26:36.70
どっちも違うんじゃね?
869デフォルトの名無しさん:2011/11/03(木) 13:28:04.80
CRTPの話かと思ってた
870865:2011/11/03(木) 14:21:12.34
>>868
非const Piyo を指すshared_ptrを取得する関数を書きたいのですが、正しい書き方を教えていただけますか?
871デフォルトの名無しさん:2011/11/03(木) 14:34:25.92
なぜ参照なんだ
872866:2011/11/03(木) 15:05:45.72
855ではなくて866でした。失礼しました

>>871
値返しというか、コピー動作の価値が分からないからです
873デフォルトの名無しさん:2011/11/03(木) 15:10:57.51
>>872
普通に生ポ返せばよくね?
パフォーマンスが気になるほどgetしないなら別にコピーしてもいいと思うけど
874デフォルトの名無しさん:2011/11/03(木) 15:18:09.01
ポインターって面倒くさいから参照ばっかり使っちゃう
875デフォルトの名無しさん:2011/11/03(木) 15:28:42.37
>>872
一般的に
参照を返すと、内部に実体を持っている(その後も持ち続ける)ことが必要になってしまう。
コピーを返すようにしておけばそんなことはなくて、そのぶん実装が自由になる。

実際にどの程度の差になるかは場合によるんだけど。
876デフォルトの名無しさん:2011/11/03(木) 15:51:33.50
一時的な使用のみを目的としている → 生ポ
保持してしばらく使うが、無くなったら無くなったで良いものとする(無くなった事の検出は必要) → weak_ptr
完全に共有する → shared_ptr

いずれにしても参照は使わない(使ったら意味が無い)
あと循環参照には気をつけれ
877デフォルトの名無しさん:2011/11/03(木) 16:49:31.29
内部のハンドルを返すのはやめよう(メイヤー)
878デフォルトの名無しさん:2011/11/03(木) 17:40:49.14
でも実際問題マニアックな使い方されるケースもあるので
ハンドルを公開するのは保険として必要なんだよね
879デフォルトの名無しさん:2011/11/03(木) 18:16:20.22
public公開する必要はないけどな。
880デフォルトの名無しさん:2011/11/03(木) 18:20:15.20
>>876
・抽象化クラスは値返しできない。
・かといってnewするのはコストが大きすぎる。
・受け取るときにコピーすりゃ十分。

そういう時は、static変数を参照で返す手もある。
ただし、関数実行後、コピー前にその関数が呼ばれるとマズイので
関数呼び出しに側に配慮を求める必要がある。
881デフォルトの名無しさん:2011/11/03(木) 18:40:32.69
ボトルネックでもなければ安全に倒すのがC++だろカスが
882デフォルトの名無しさん:2011/11/03(木) 18:52:35.53
テンプレート関数でどんなクラスも指定できると困ったことになりませんか?
たとえば数値のintやfloatで大小を比べるhikaku<int>(a,b)やhikaku<float>(a,b)とつかうものに
hikaku<char *>(a,b)などとやられる可能性もありますよね?
オーバーロードで書いたほうがそれしかできないためわかりやすいと思うのですが
883デフォルトの名無しさん:2011/11/03(木) 19:02:22.58
だったら、特殊化すればいいんじゃね?^^
template <> hkaku< char * >( a,b ) { fおちんぽだいすきじゅぽじゅぽ(); }
とでもやっておけばSFINAE原則によりchar*で呼び出せなくなる。
884デフォルトの名無しさん:2011/11/03(木) 19:02:57.36
あ、ぜんぜん構文間違ってるよ、おれ^^
885デフォルトの名無しさん:2011/11/03(木) 19:03:21.38
ヌルポインターを返す関数って駄目なんですか?
別の設計に変えるほうがいいんですか?
886デフォルトの名無しさん:2011/11/03(木) 19:08:20.69
関数テンプレートは特殊化できません。多重定義できるだけです。
887デフォルトの名無しさん:2011/11/03(木) 19:09:22.88
>>885
なんでダメやねん。返してええねん。
メモリ確保に失敗した場合とかヌルポ返さんでどうすんねん。
888デフォルトの名無しさん:2011/11/03(木) 19:12:25.19
そのときは切腹や
889デフォルトの名無しさん:2011/11/03(木) 19:23:36.25
>>887
そういうケースは例外返せよ。

NULLを登録したものから、
NULLが取り出せる事は問題ない。
そういうケースならNULL返せばいい。
890デフォルトの名無しさん:2011/11/03(木) 19:29:40.21
>>881
スマポじゃ共変の型を使えんぞ。
891デフォルトの名無しさん:2011/11/03(木) 19:45:21.47
>>889
例外はほんとうに例外の時以外は返してはいけない。
892デフォルトの名無しさん:2011/11/03(木) 19:48:12.56
デバイスロストは個人的感情的にはどうみても例外なのに通常フローにしろって怒られた
893デフォルトの名無しさん:2011/11/03(木) 19:49:21.54
>>891
正しい値を返せなきゃ例外事項だ。
禿のQA読め。
894デフォルトの名無しさん:2011/11/03(木) 19:50:47.40
>>893
nullptrは正しい値。
895デフォルトの名無しさん:2011/11/03(木) 19:51:40.30
>>894
こう書いてまともに動かないなら例外事項。
FunctionA(FunctionB());
896デフォルトの名無しさん:2011/11/03(木) 19:54:14.77
>>891
「ほんとうに例外の時」って、客観的に判断できるの?
897デフォルトの名無しさん:2011/11/03(木) 19:55:50.28
メモリ確保の失敗にどう対処するかはメイヤーの本にあるとおりだな。
例外でもぬるぽでも強制終了でも、それぞれに正当な理由がある。
898デフォルトの名無しさん:2011/11/03(木) 19:56:39.72
>>896
逆に、客観的に判断できないとき、返却値の定義がおかしくないか疑う
899デフォルトの名無しさん:2011/11/03(木) 19:57:15.62
そもそも例外ってのは、
cross = InnerProduct( line1, line2 ) + direction;
ってなオブジェクトを組み合わせた数式から簡潔にエラーを
綺麗に取り出す意味がある。もしoperator + がNULLなんかだしたら、
とんでもないことになる。あと、nullptrは基本的に初期化や代入用。
900デフォルトの名無しさん:2011/11/03(木) 19:58:31.23
std::for_eachでbreakができない
C#ではbreakができて便利だった
breakが出来ないなら価値が半減する
901デフォルトの名無しさん:2011/11/03(木) 19:59:09.09
いや、おまえらの意見なんかどうでもいい。
メイヤーの方がずっと偉いし、はるかに正しい。

愚者は経験に学ぶ、賢者は歴史(すなわち書籍)に学ぶ。
902デフォルトの名無しさん:2011/11/03(木) 20:00:25.35
じゃほっとけよ。
903デフォルトの名無しさん:2011/11/03(木) 20:03:07.57
>>900
BOOST_FOREACHつかえば?
904デフォルトの名無しさん:2011/11/03(木) 20:20:17.00
>>898
つまり「ほんとうに例外の時」=「返却値の定義に従えない時」ってこと?
905デフォルトの名無しさん:2011/11/03(木) 20:36:29.91
多分ネットからHTML取ってきて、DOMを返す関数作るときも、
エラーが発生したら、NULLで値返して、エラー内容をerrnoに記述する関数書くんだろうよ。
906デフォルトの名無しさん:2011/11/03(木) 20:39:46.77
例外って遅くないの?
907デフォルトの名無しさん:2011/11/03(木) 20:49:38.72
そりゃ、mallocよんだりするし、例外用コンテキストの構築したりするから遅いよ。
ただ、例外が発生した時点で、望んだ計算結果が得られないんだから、
速度なんて0.1秒以上止まるとかじゃなきゃ問題ない。
1フレームが何ミリ秒とかいってる世界で、例外が発生してもなお
処理を継続するなんてことはまず無いだろ。処理を放棄して
再試行をユーザーに問い合わせるぐらいだ。
908デフォルトの名無しさん:2011/11/03(木) 20:52:24.82
逆に言うと、処理を続行できる場合は例外を出すべきではない?
909デフォルトの名無しさん:2011/11/03(木) 20:56:41.84
例外が遅いのは発生した時だけ
まあtryもコスト0ではないけど、以上に細かくtry書かなきゃ大したことは無い
910デフォルトの名無しさん:2011/11/03(木) 20:57:09.45
例外はファイルサイズ膨らむから使ってない
911デフォルトの名無しさん:2011/11/03(木) 20:57:53.81
何をもって処理を続行できると行ってんのか解からんが、
正しい値を返せる、または、戻り値が重要ではない場合は例外を返すべきじゃないな。
912デフォルトの名無しさん:2011/11/03(木) 21:00:13.87
>>910
ご自由にどうぞ。4GBメモリと500GB以上のストレージが一般的になっても、
200KB程度の増加が気になって仕方ないんなら使わないのも一つの手だ。
913866:2011/11/03(木) 21:03:12.89
>>873-881
レスありがとう
とりあえず素直に値返ししておきます。

まず非const shared_ptrを返そうとしている理由ですが、これはMCを使いたいからです。
次になぜ参照を返そうとしているかですが、これは単純にパフォーマンス上の理由です。
BOOST_SP_DISABLE_THREADSを使わないとこのコピー動作がボトルネックになりかねる重さだったと覚えているのでそうしました
914デフォルトの名無しさん:2011/11/03(木) 21:07:12.79
>>912
そんな環境じゃないし。なんでPC前提なんだよ
915デフォルトの名無しさん:2011/11/03(木) 21:07:18.89
>>911
呼び出し元がメモリ管理していて、呼び出し先がメモリ確保に失敗した時
一旦 NULL 返して、呼び出し元がいらないオブジェクト削除するとかメモリ
整理して再び呼び出す場合とかかな
916デフォルトの名無しさん:2011/11/03(木) 21:14:32.69
>>910
どれぐらい膨らむのが問題なの?
917デフォルトの名無しさん:2011/11/03(木) 21:18:12.36
>>916
4MBしかメモリない
918デフォルトの名無しさん:2011/11/03(木) 21:20:25.95
>>917
へぇ。
で、例外使うとどれぐらい膨らむの?
何%とか、何KBとか。
919デフォルトの名無しさん:2011/11/03(木) 21:21:18.22
>>918
800KB
920デフォルトの名無しさん:2011/11/03(木) 21:22:20.80
>>915
そういうケースなら例外扱いだわ。
尤も、関数がNULLを返す前に、
メモリーアロケーターが通常のメモリ確保に
失敗した時点で、解放ハンドラを起動して
メモリーの確保に務めるべきだろうし。
それでも確保できないなら、メモリアロケーター内部から例外で抜ける。
ハンドラの呼びかけでメモリーを確保出来たなら、
メモリーを使用する関数はNULLなんざ返さなくても処理を
続行できる訳だし。
921デフォルトの名無しさん:2011/11/03(木) 21:22:29.47
その800KBをcab圧縮しなさい
922デフォルトの名無しさん:2011/11/03(木) 21:23:42.99
>>917
だから、そういう環境なら使わないのは自由だって。
923デフォルトの名無しさん:2011/11/03(木) 21:25:59.71
>>922
おめーが勝手にPC前提で決めつけた癖に何いってんだ
924デフォルトの名無しさん:2011/11/03(木) 21:26:08.71
>>919
なるほど。そりゃキツいな。
ちなみにコンパイラの情報をもらえるとうれしい。
gcc ならバージョンがいくつだとか。
925デフォルトの名無しさん:2011/11/03(木) 21:31:04.68
>>923
気になるんなら自由だって書いたじゃん。引きずんなよ。
926デフォルトの名無しさん:2011/11/03(木) 21:37:31.64
>>920
その時に解放できるオブジェクトをメモリアロケータが知らない時(という場合が多いと
思うんだけど) はどうするの?
927デフォルトの名無しさん:2011/11/03(木) 21:38:28.27
>>912 の言い方は「自由だ」か?
特定のハード構成を一般的と言い切る御仁の、○○程度の××という皮肉を飲まないと、そう読めない

どこの馬の骨とも知らんやつに、何でそんな侮辱をされにゃならんのだ
928デフォルトの名無しさん:2011/11/03(木) 21:50:58.78
>>926
今回問題になってる場所以外でも、他にどこでアロケーターを
使って確保したか解ってるんでしょ?
それに、アロケーターを使った場所は、メモリーがいつになったら
不要になるか知ってるんでしょ?
だったら、不要かどうかは判断できる筈じゃん。

Allocator allocator; //内部のstatic変数と関数でoperator newと繋がってる。
//contextが無効になったらtargetの解放処理を呼ぶ。
allocator.RegisterHandler( new MemoryHandler( context, target ) );
929デフォルトの名無しさん:2011/11/03(木) 21:52:03.49
>>927
その程度が嫌なら肥溜めに書き込むなよw
930デフォルトの名無しさん:2011/11/03(木) 21:53:56.25
未だに2chを肥溜めと呼ぶ奴がいるんだ
931デフォルトの名無しさん:2011/11/03(木) 22:08:58.22
だからメイヤー本に一つ一つ理由が載ってるだろ。
おまえらのクソみたいな議論は無意味なんだよw
932デフォルトの名無しさん:2011/11/03(木) 22:09:01.63
組み込み用のコンパイラで
そもそも例外なんて実装してあるのか?
933デフォルトの名無しさん:2011/11/03(木) 22:12:22.33
>>931
ドヤ顔で書き込んでいるが、
えらいのはメイヤーであってお前ではないからな?
934デフォルトの名無しさん:2011/11/03(木) 22:14:17.68
環境によっていくらでも結論が変わるものに対して、
いちいち揚げ足とらんで煽らんでもよろし
935デフォルトの名無しさん:2011/11/03(木) 22:18:45.00
936デフォルトの名無しさん:2011/11/03(木) 22:23:01.82
int型の変数xがあります
これを符号なしの形で保管し、必要とあれば符号つきに戻したいのですが

単に符号つき整数を同じビット数の符号なし整数にキャストし
それをまた同じビット数の符号つき整数にキャストした場合
元の数値への復元は仕様で出来ると保証されますか?
937デフォルトの名無しさん:2011/11/03(木) 22:32:40.43
>>936
保証されません。
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.
938デフォルトの名無しさん:2011/11/03(木) 22:33:04.78
問題ないだろうけど、保証はできん。
939デフォルトの名無しさん:2011/11/03(木) 22:37:16.69
符号つきを符号なしに変換した物を変更してない状態で符号つきに戻すのくらいは
どっかで保証されてないのかな
ポインタにして戻すのが大丈夫と保証されてるのと同じように
940デフォルトの名無しさん:2011/11/03(木) 22:42:36.04
>>906
例外が起こっていない間は例外のほうが早いよ
コードサイズはでかくなりやすいけど
941デフォルトの名無しさん:2011/11/03(木) 22:43:15.04
>>939
負の値を、符号なしに渡しても、符号なしから負の値で
符号付き変数に代入できる実装したって問題ないんだから仕方ない。
942デフォルトの名無しさん:2011/11/03(木) 22:46:00.05
>>937
そうですか…ではちょっとやり方を変えてみます

符号つき整数を単に同サイズの符号なし整数へと変換した場合
その結果は一意に定まりますか?

つまり
同じ符号つき数からのキャストは同じ符号なし数へ、
違う符号つき数からのキャストは違う符号なし数へ、
となるかどうかです

この変換結果を配列の添字として利用するつもりです

素直に大きいサイズに入れて
INT_MAX(だったっけ?)の半分を足した数とかを使ったほうがいいのかなー
943デフォルトの名無しさん:2011/11/03(木) 22:51:53.07
>>942 4.7 p2
944デフォルトの名無しさん:2011/11/03(木) 22:53:02.97
reinterpret_castなら保証されてるでしょ。
 int x = 100;
 unsigned int ux = *reinterpret_cast<unsigned int *>(&x);
 int x2 = *reinterpret_cast<int *>(&x);

unsigned intはすべてのビット表現に対する値が
定義できる型なので戻せるはず。
945デフォルトの名無しさん:2011/11/03(木) 23:00:16.68
そういう話じゃないだろ。
しかも、unsigned intに負の値をキャストした場合が非常にマズイ。
946デフォルトの名無しさん:2011/11/03(木) 23:07:04.00
>>931
メイヤー、メイヤー連呼する前に、例外概念の原典
Exception Handling : False Sense of Securityから説明してみろや。
例外構文の基礎設計はここから始まってる。
947デフォルトの名無しさん:2011/11/03(木) 23:15:12.74
>>945
auto u_i = static_cast<unsigned int>(i);
はiが負の場合implementation definedなので、一意な値にならないとまずいが、
auto u_i = *reinterpret_cast<unsigned int *>(&i);
ならu_iは一意なのでまずくないと言っている。
ただしu_iの値はiのビット表現に依存するので戻す以外に使えない。
948デフォルトの名無しさん:2011/11/03(木) 23:19:33.81
>>947
配列の添字に使うといってるんだから、-1なんか突っ込んだら
~0になって使い物にならないだろ。
949デフォルトの名無しさん:2011/11/03(木) 23:41:34.86
連続質問に答えて頂きありがとうございました
とりあえず

unsigned int index = (long int)x - INT_MIN;

として、それを使うことにしようと思います
950デフォルトの名無しさん:2011/11/03(木) 23:45:30.82
>>946
http://ptgmedia.pearsoncmg.com/images/020163371x/supplements/Exception_Handling_Article.html
これ?
これのどこが何の原典になってるのか、さっぱり見えてこないんだけど。
951デフォルトの名無しさん:2011/11/03(木) 23:46:28.96
このスレはアホばかりですね ┐(´ー`;)┌
952デフォルトの名無しさん:2011/11/03(木) 23:55:09.68
953デフォルトの名無しさん:2011/11/03(木) 23:59:54.07
>>950
規格策定中の文だし。頭の方から例外処理は何が重要か書いてあるだろ。
throw catchが重要ではない、例外部以外に影響与えることなくとかな。
954デフォルトの名無しさん:2011/11/03(木) 23:59:58.98
>>949
long intは大抵32ビットやで(それも環境依存だが)

そもそも環境依存なんて言っても、大丈夫な環境がほとんどだし
大丈夫じゃない環境でコンパイルする事もないだろう
環境依存気にしすぎても仕方が無い
(特に、特定のOSのAPIを使ってる場合とか)
955デフォルトの名無しさん:2011/11/04(金) 00:15:32.36
>>953
今となっては「RAII 使え」とか「strong/basic guarantee というものがあってね・・・」で
一蹴されるような古い主張しか書いてないように見えるんだけど。

RAII や例外安全性保証という考え方の重要性を考えるためのきっかけのひとつに
なったと言えなくはないかもしれないが、それでもって原典などと言うのはどうにも解せない。
956デフォルトの名無しさん:2011/11/04(金) 00:19:46.65
>>954
long intとintが同サイズだったりするのですね…long long なら何とかなるかな?

なんでこのフレームワークはステートを直接参照させてくれずに
イベントでOn/Offされたステート番号を通知するだけなんだろ
しかもそのステート番号が単なるintとしか規定されてないから符号つきの可能性を考慮しなきゃならんという…
957デフォルトの名無しさん:2011/11/04(金) 00:25:51.89
>>956
素朴に std::map<int, ...> ではダメなのか?
958デフォルトの名無しさん:2011/11/04(金) 00:30:30.60
>>954
あほ

バイナリ互換を保証する試みはいくつかあり、お望みならそれを使えと言うだけ
おまえみたいな盲信はたまたまそいつらの枠内で助かっているだけ
959デフォルトの名無しさん:2011/11/04(金) 00:45:31.62
>>955
どこら辺を読んでそういう結論に至ったのか解からん。
大体RAIIってスマポの事でも行ってんのかもしれんが、
肝心のスマポ作る時だって同じことだろ。
strong/basic guarantee も本質的に関係ないし。

あとこの文章、結構いろんなところで紹介されてる。MSDNとかね。
http://msdn.microsoft.com/ja-jp/library/cc440184(v=vs.71).aspx
960デフォルトの名無しさん:2011/11/04(金) 00:51:09.05
>>957
そうか、曲がりなりにもC++なんだからSTL使えばいいんですよね…
今のところモロにベターC的なコードになっちゃってるから
STL使えばいいという発想に至ってなかったです、ありがとうございます
961デフォルトの名無しさん:2011/11/04(金) 00:55:09.90
例外風評被害加害者ってまだいたんだwww
962デフォルトの名無しさん:2011/11/04(金) 00:57:17.68
>>959
10年前からタイムスリップでもしてきたのか?

>950の中のどこが現代のC++でも通用する話なの?
真に受けると変に例外を怖がることにしかならんと思うんだが。

MSDNのその記事も、なんで日本語訳だけしつこく生き残ってるのかねぇ。
第16部を読まずに勘違いする人を増やしてそう。
963デフォルトの名無しさん:2011/11/04(金) 01:05:16.86
>>959
ここでも紹介されてるぞ。
http://www.boost.org/community/exception_safety.html
迷信のもととなってしまったものとしてな。
964デフォルトの名無しさん:2011/11/04(金) 01:16:09.61
>>962
どこを見てそう思ったのか具体的に書きだしてくれ。
特に、例外を避けることができればそれに越したことがないが、
実際例外を出さず安全確保は難しいという内容に関してな。
new で0を返すとか仕様が古いとかそんな事はどうでもいいから。
965デフォルトの名無しさん:2011/11/04(金) 01:52:39.08
>>964
> 特に、例外を避けることができればそれに越したことがないが、
> 実際例外を出さず安全確保は難しいという内容に関してな。

意味が分からんな。

それ>950のどこに書いてあんの?見てる文書が違うのかな?

もし>959のMSDNの記事のことなら、そもそも例外を避けようとした
動機自体が意味不明だから。
966デフォルトの名無しさん:2011/11/04(金) 01:54:11.63
>>958
特定OSに限定してるのに
あり得ない環境を想定しても仕方が無い
それどころか、OSのAPI自体がそういうキャストを要求したりとかザラ
本当に移植性が必要なケースでもない限りコストの無駄
そもそも型のビット数すら環境依存だし
967デフォルトの名無しさん:2011/11/04(金) 02:30:28.95
968デフォルトの名無しさん:2011/11/04(金) 02:48:10.96
それはOSによって文化が違うからなあ。
Unix、Windowsは例外が投げられるとプログラム内で拾って適切な処理を
する文化だけど、Linuxなんかだとプログラム内では余計な処理を何も
行わずにOSが拾ってコアダンプを吐く文化。
つまり、余計な処理を行わないだけLinux文化の方が洗練されているんだよね。
MSDNに例外に注意を払えという文書があるのは、これ正にWindows文化で
プログラマなら本来は徹底抗戦するべきなんだよね。
だってあのM$だぜ?
悪魔とさえ言われてる。
つまり、例外は使って放置が正しい。
例外の処理は適切なOS(たとえばLinuxやMac)に任せるのが筋。
969デフォルトの名無しさん:2011/11/04(金) 03:25:08.19
>>968
CPUやOSの例外とC++の例外との区別ぐらいはできるようになってから語れよデコスケヤロウ
970デフォルトの名無しさん:2011/11/04(金) 03:37:53.27
>>969
アホかC++の例外の話だ。
スレタイ読めよ。
971デフォルトの名無しさん:2011/11/04(金) 04:09:41.68
え、だってOSが拾うとかOSに任せるとか、明らかにC++例外の話じゃなくなってるぜ・・・
972デフォルトの名無しさん:2011/11/04(金) 04:36:47.77
Windowsならc++の例外をキャッチしないでいるとOSが拾ってメッセージボックスだして
作ったやつだっせーから情報送っていい?とか言ってくるんだけどこれも一応c++例外の話じゃないかな?
973デフォルトの名無しさん:2011/11/04(金) 07:17:38.02
そりはぬるぽもOS任せでよいってぐらい乱暴だな。
974デフォルトの名無しさん:2011/11/04(金) 07:29:11.96
>>972
それはC++の例外としての機能がOSに実装されてるんじゃなくて、
C++の例外をキャッチしない場合にOSの機能を呼び出すようにコンパイルした時に当てはめてるだけだと思う。
何が言いたいのかよく分からなくなってきたが、要するに作ったやつだせーから情報送っていいかどうかというOSの機能とは関係ないという話だ。
975デフォルトの名無しさん:2011/11/04(金) 08:25:55.69
>>968
馬鹿の極み
976デフォルトの名無しさん:2011/11/04(金) 09:21:59.09
例外拒否する奴って例外をよくわかってなくて処理しきれてない奴がほとんどって話あるよね
977デフォルトの名無しさん:2011/11/04(金) 09:34:08.70
俺か
拒否はしないけど
978デフォルトの名無しさん:2011/11/04(金) 09:45:45.54
スローバージョンとノースローバージョンを用意すればすべてうまくいく
979デフォルトの名無しさん:2011/11/04(金) 12:59:39.16
Linuxではメモリーの開放もしなくていい。
小さなコマンドの組み合わせでシステムを運用する方針だから。
実際、開放していないコマンドがざらにある。
これはシステムが適切に解放してくれるから。
もうWindows終わったな。
980デフォルトの名無しさん:2011/11/04(金) 13:19:04.29
>>979
ソフトがたくさん出て来ればな
今の所は難しいだろ
King Office位しかねーじゃん
981デフォルトの名無しさん:2011/11/04(金) 13:21:34.89
>>979
頭の中がずいぶんとお花畑ですが大丈夫ですか?
982デフォルトの名無しさん:2011/11/04(金) 14:00:58.21
もう触らないほうがいいな
983デフォルトの名無しさん:2011/11/04(金) 19:01:35.07
>>967
おつ
984デフォルトの名無しさん:2011/11/04(金) 21:33:46.35
Windowsだって、コマンドが終われば適切に解放してくれるだろ?
それさえできないなら、OSとは言えないでそ?
985デフォルトの名無しさん:2011/11/04(金) 21:39:11.55
DOS時代はそんなことやってくれなかった気が
986デフォルトの名無しさん:2011/11/04(金) 22:08:39.07
メモリーはな。しかしそれ以外のリソースはそうとは限らない。
つかんだプリンタ、つかんだ音源、つかんだちんちん…

これらはアプリケーションが適切に開放しないと、
えんえんリソースを浪費したままとなる。
…かもしれないとWindows 3.1現役ユーザーの俺は思うのだが
最近の64bit OSは違うのかな?^^
987デフォルトの名無しさん:2011/11/04(金) 22:19:02.96
プロセス終了すればだいたい開放されるだろ。
わざわざプロセス間共有メモリ確保とかしてない限り。
988デフォルトの名無しさん:2011/11/04(金) 22:22:41.44
なんだ小さいプログラムしか書いたことのない素人か
989デフォルトの名無しさん:2011/11/04(金) 22:25:52.60
>>985
今もntdvm使えばやってくれないよ
ちゃんと設定すればvm上でメモリリークする
990デフォルトの名無しさん:2011/11/04(金) 22:31:58.38
>>989
DOS Virtual Machineじゃなくて
Virtual DOS Machineだ
991デフォルトの名無しさん:2011/11/05(土) 03:57:41.77
うめ
992デフォルトの名無しさん:2011/11/05(土) 10:29:47.16
うめ
993デフォルトの名無しさん:2011/11/05(土) 14:03:02.14
ume
994デフォルトの名無しさん:2011/11/05(土) 18:19:52.08
佐々木↓
995デフォルトの名無しさん:2011/11/05(土) 18:20:10.25
996デフォルトの名無しさん:2011/11/05(土) 19:30:03.40
うめ
997デフォルトの名無しさん:2011/11/05(土) 19:36:01.70
998デフォルトの名無しさん:2011/11/05(土) 20:25:57.83
                       _ / \ _
                     / /    {┳ }
                     >{、     ,>-<
                    // -\__/ -ヽ \     、_、-‐     1
    1   i_工7     ┐    .  {  |⊂⊃ i  ⊂⊃|  }       }  、   T¨Τ
    _」-  L.L/   {_ノ―、     \ヽ 「 ̄ ̄ フ  / /     、-7 ̄   г¨Τ二7
    ノ   ー|フ  /∨   }   r─\ ゝ ─ '  厶二⊃       / \    ΓΤ J
   ー'⌒ 、-┴‐、 ヽハ _ノ      ̄`|  ̄ ̄ ̄ ̄  `ーァ    /    ヽ、    |
                       \       /
                        >、___ イ
                        し′  し′
999デフォルトの名無しさん:2011/11/05(土) 20:28:49.87
u
1000デフォルトの名無しさん:2011/11/05(土) 20:31:20.60
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。