[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 04/23 14:20 / Filesize : 191 KB / Number-of Response : 803
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part94



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

前スレ
C++相談室 part93
toro.2ch.net/test/read.cgi/tech/1324922431/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
toro.2ch.net/test/read.cgi/tech/1323692486/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

2 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:08:02.58 ]
■基本■
[C++ FAQ]
 www.parashift.com/c++-faq/
 www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 en.cppreference.com/w/cpp (英語)
 ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
 www2.research.att.com/~bs/
[C++ International Standard]
 www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
 www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。

3 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:08:18.34 ]
■Libraries■
[Boost]
 Boost www.boost.org/
 (日本語) www.kmonos.net/alang/boost/
 (日本語) shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL www.sgi.com/tech/stl/
 STLport stlport.sourceforge.net/
 GNU libstdc++ gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) stdcxx.apache.org/
 STLFilt www.bdsoft.com/tools/stlfilt.html
 (日本語) episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

4 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:09:42.63 ]
■Books■
amazon C,C++関連書籍
 www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
 www.amazon.co.jp/b/?node=754384

The C++ Programming Language
 www.amazon.com/exec/obidos/ASIN/0201700735/
 www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 www.amazon.com/exec/obidos/ASIN/0201824701/
 www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 www.amazon.com/exec/obidos/ASIN/0201379260/
 www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 www.amazon.com/exec/obidos/ASIN/0201924889/
 www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 www.amazon.com/exec/obidos/ASIN/020163371X/
 www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 www.amazon.com/exec/obidos/ASIN/0201615622/
 www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 www.amazon.com/exec/obidos/ASIN/020170434X/
 www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
 www.amazon.com/exec/obidos/ASIN/0201760428/
 www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)

5 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:10:08.52 ]
■Books(Templateまわり)■
Effective STL
 www.amazon.com/exec/obidos/ASIN/0201749629/
 www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 www.amazon.com/exec/obidos/ASIN/0201704315/
 www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 www.amazon.com/exec/obidos/ASIN/0321227255/

6 名前:デフォルトの名無しさん [2012/02/18(土) 12:27:29.38 ]
         / ̄\
         | ^o^ | < はんにんは このなかにいます
         \_/
         /   ヽ   
        | |   | |
        | |   | |     
        ||   ||
        し|  i |J=二フ
          .|  ||
         | ノ ノ
         .| .| (
         / |\.\ 
         し'   ̄

     _
       |  / ̄\
        ̄|    |
     _| ̄ \_/

7 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 12:28:57.89 ]
お前やろ

8 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 14:44:40.01 ]
shared_ptr<IHoge> make_hoge(int id) {
switch(id) {
case HOGE0: return shared_ptr<IHoge>(new Hoge0);
case 〜
}
}

上のようにポリモーフィックな返り値を返す関数があるんだけどnewのコストを削りたい
アロケーターを使う他になにかいい手はないですか?
標準で可変長のスタック領域を扱えたりすると便利なんですが…

9 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 15:04:50.54 ]
配置new

10 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 15:29:32.50 ]
make_sharedでnewの呼び出しを2回から1回に減らせる。



11 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:17:53.40 ]
単純な質問ですみませんが、
何故shared_ptr側にオブジェクトを自動アロケートする
メソッドが無いのでしょうか?
引数でオブジェクトのポインタを渡すよりshared_ptr側で
オブジェクトを生成させた方が安全だと思うのですが?

12 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:19:38.08 ]
>>11
make_sharedがあるから

13 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:46:14.86 ]
>>12
あっなるほど・・・

make_sharedってCustom Deleter使いたい時は
自前でAllocator作るしかないですかね?


14 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 17:59:13.89 ]
class Hoge {
public:
Hoge(int x);
void func(void) ;
};

template <class Del> class HogeEx : public Hoge {
public:
HogeEx(int x, Del const & del) : Hoge(x), mDel(del) {}
~HogeEx(void) { mDel(this); }
private:
Del mDel;
} ;

shared_ptr<Hoge> p =
make_shared<HogeEx<DelType> >(100, deleter) ;

適当に書くとこんな感じかな
HogeExとmake_sharedはもう少し工夫して汎用化してもいい

15 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:29:49.91 ]
int a[] = {7,0,3,4,0,6};

{7,3,4,6,0,0}
のように0を後ろに移動させるようなSTLのアルゴリズムありますか?

16 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:31:34.47 ]
std::remove

17 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:40:24.18 ]
0を削除するつもりではないならstd::partition

18 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:43:14.15 ]
順番を保存したいならstable_partition

19 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:56:33.44 ]
stable_partitionでうまいこと出来ました。

20 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 22:05:16.24 ]
iostreamに関する質問です
自作マニピュレータでストリームのモードを一時的に変えて、元に戻したいのですが
std::ios::dec等、引数の無い書式フラグの戻し方はわかったのですが、
(例えばlong sv_f = setf(ios::hex, basefileld); →自作処理後、最後に setf(sv_f)で戻す)
setfill('0')の戻し方がわかりませんボスケテ、




21 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 22:14:33.09 ]
removeとpartitionってどう違うんだ?

22 名前:20 mailto:sage [2012/02/18(土) 22:23:38.25 ]
なんとなく自己解決したっぽい
ostream::fill()を使うらしいですた、
つまり、次のでおk
ios_base::fmtflags sv_f = stream.setf(ios::dec, ios::basefield);
char sv_ch = stream.fill('0');
stream << setw(2) << s << setw(2) << d << /* ... */ << ends; // 自作処理の一例
stream.setf(sv_f);
stream.fill(sv_ch);
return stream;

23 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:12:12.49 ]
>>21
removeが確実に移動・コピーするのは残す値のみで、除去する値をわざわざ末尾の方に移動・コピーするかは実装依存。
int a[] = {7,0,3,4,0,6};
のときにremoveで0を除去した場合
{7,3,4,6,0,6}
のようになる実装もある。

24 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:35:57.33 ]
>>23
なるほど

25 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 03:18:16.37 ]
C++ではCと異なり変数宣言をスコープの先頭で行わなくてもよくなりましたが、
あるC++のコードでは、次行で即代入を行うような変数もわざわざ宣言を分けてスコープの先頭に置いていました。
{
int a;
a = some_process();
}
こうすることの意味を私なりに考えてみましたが、
・C言語からの移行・もしくは癖
・コーディングルールによるため
・非POD型との統一のため
・デバッグのし易さ(?)
・表記ミス
個人的には可読性の面からも宣言と初期化をまとめたくなりますが、
int a = some_process();
何か意味があれば教えてください。

26 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 03:23:50.70 ]
昔は
int a;と
a = some_process();の間に変数aを使うコードがあったが削除されて無くなった
つまり分けてる意味は特にない

27 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 04:05:48.29 ]
objective-cの後に習う言語はC++かCだと、どっちがいいですか?

28 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 04:09:05.43 ]
>>26
特に意味は無いのですね。ありがとうございます。

29 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 04:36:16.67 ]
(1)(2)のように自由関数を引数とする場合には、&が有っても無くても動作するのに、
(3)(4)のようにメンバ関数を引数とする場合には、&が無いと動作しません。
これはなぜでしょうか?

---------------------------------

struct Test{
void testFunc( ){ cout << "Test::func()" << endl; }
};

void func( ){ cout << "::func()" << endl; }


template<class T>
void XXX( T f ){ f( ); }

template<class T, class U>
void YYY( T obj, U f ){ (obj.*f)( ); }


int main( )
{
 XXX( &func ); // (1)OK
 XXX( func ); // (2)OK

 YYY( Test(), &Test::testFunc ); // (3)OK
 //YYY( Test(), Test::testFunc ); // (4)NG

 return 0;
}


30 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 12:25:40.50 ]
そういう仕様だから



31 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 13:19:14.41 ]
さらに
XXX( **********func );
これでもOKだ

32 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 13:27:27.81 ]
プログラミングアートの基本テクニックの一つだね

33 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 14:18:30.05 ]
&付けるのが言語仕様的に正しいんだっけ?

34 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 14:23:11.14 ]
普通の関数はあっても無くても良い
メンバ関数は必須

35 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 02:19:13.38 ]
Cとの互換性のため引き継いだ仕様とC++の仕様

36 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 18:06:44.33 ]
fprintf(FILE *,・・・) があると思います。
ここの FILE * のところには stdout も使えると思いますが、
この部分に指定するストリームを自作したいのですが、どんな感じにするんでしょうか。

とりあえず手始めに
fprintf したら指定ファイルのほか、同時に stdout にも出力するような拡張ストリーム作りたいです。

37 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 18:44:58.48 ]
つ[popen("tee specified.file")]

38 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 18:46:31.55 ]
>>36
方法が無いわけではないけど、出来ないと思った方がいい
標準Cライブラリ(printf系)でなく標準C++ライブラリ(iostream)を使うこと
もしくは単にfprintfを2回(ファイルとstdout)呼ぶ

fprintfに指定するのはOSが管理するファイルディスクリプタなので
介入するには低レイヤーなライブラリを使うか、fprintfを自作関数として置き換えるか
環境依存な方法(ファイルシステムソケットなど)を使うか、など
・・・普通はやらない

39 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 19:36:56.53 ]
ストリームを自作するならiostream側でやろうぜ
streambufを自作してiostreamに食わせりゃいい

40 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 21:24:02.82 ]
C++ストリーム形式のライブラリって頑張って作った割にみんな使ってくれなくてちょっと泣きそうになるよね
オペレーターがキモいのはわかるんだけどでも標準なんだから仕方ないじゃんみたいな



41 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 21:27:38.01 ]
キモいというのもあるけど
printf形式が楽なんだよね
boost::format使えばいいんだろうけど

42 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:12:49.62 ]
フォーマットマニピュレータくらい用意しててもいいのにな
新旧標準出力同士なぜ上位互換的使い勝手は目指さなかったのか

43 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 22:36:18.95 ]
演算子オーバーロードが楽しくて
ちょっとはしゃいじゃったんだよ

44 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 00:24:46.79 ]
反面教師になったのさ

45 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 07:23:50.17 ]
boost::formatがC++11に入らなかったのは何でだろう

46 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 08:02:00.07 ]
いまさら言語内言語風に後戻りとかアホすぎだから
プラグインスクリプトか諦めてC++素直に使い括弧バカで通すほうがマシだわ

47 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 09:34:44.74 ]
iostreamはオーバーヘッド少な目で拡張性の高い仕組みだと思うけど
<<のオーバーロードはホントはしゃいじゃった感じだな

48 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 10:45:14.60 ]
stream と vector<bool> は可愛い存在。

49 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 11:03:37.93 ]
個人的にはvector<bool>に助けられてる。

50 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 11:06:33.30 ]
ベクブー使う奴はクズ



51 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 11:37:04.47 ]
iomanipは補間候補さえ出てくれば問題ないんだけどなあ

52 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 12:05:10.54 ]
> 個人的にはvector<bool>に助けられてる。

サイズはbool*size()じゃないでしょ?

53 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:18:00.37 ]
ビット配列なんて別クラスでいいのに・・・

54 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:24:00.49 ]
ビットセットあるやん

55 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:25:14.97 ]
ビットセットはいつもなんか忘れてるな

56 名前:デフォルトの名無しさん [2012/02/21(火) 20:25:54.46 ]
実際のブツのできはともかく
論理的な機能と物理的な実装を切り分ける好例ではある

57 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:35:09.59 ]
bitsetはサイズ固定じゃないの

58 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:35:45.52 ]
やるならboost::dynamic_bitsetだな

59 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:38:47.85 ]
サイズ非固定のbitsetって何に使うんだ?

60 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:48:19.89 ]
bitsetすら使う事がないからよく分からない



61 名前:デフォルトの名無しさん mailto:sage [2012/02/21(火) 20:59:10.80 ]
基数変換がちゃんと出来る人は、Bitsetで多倍長演算クラスつくると凄そうだなーと思う。
俺できないから、そういうクラス作るとどうしても無駄が出来る。

62 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 00:05:39.34 ]
>>59
グラフ構造、論理閉包

63 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 12:31:04.89 ]
パイプすると一回で読み取れるのがスペースか改行までに
勝手になっているんですけど、改行だけにすることはどうやればできますか?

64 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 12:39:34.03 ]
まず関数名でも書こうか

65 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 12:40:11.97 ]
読み取り関数名ですか?
それなら<<ですけど。

66 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 12:40:27.36 ]
訂正
>>でした。

67 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 13:07:43.75 ]
getline

68 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 13:16:21.91 ]
ありがとうございます。

69 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 14:40:33.95 ]
64ビットアプリのばあい
intの代わりにlong longを使い
floatの代わりにdoubleを使うという選択で
最高のパフォーマンスが出せるという
認識であってますか?

70 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 14:41:50.41 ]
あってない



71 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 14:42:56.61 ]
どこがあってませんか?
詳しく教えてください。

72 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 14:46:21.22 ]
大きいものを使う必要あるの?

73 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 14:51:58.61 ]
>>71
ちょっと考えればわかる
解らなければ向いてないから違う業界に行ったほうが君のためだよ

74 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 15:07:06.87 ]
業界に入ってないのでわかりません教えてください。

75 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 15:09:49.99 ]
じゃあ向いてないからやめなさい

76 名前:デフォルトの名無しさん [2012/02/22(水) 15:10:19.50 ]
なぜ実測しない

77 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 15:21:18.75 ]
template<typename T, typename U>
void hoge(const T&, const U&){} //A

template<typename T>
void hoge(const T&, const int&){} //B

template<typename U>
void hoge(const int&, const U&){} //C

template<>
void hoge(const int&, const int&){} //D

BとCを定義すると、Dは特殊化ではないとなりました。
BかCのどちらかを削除するとコンパイルできたのですが
DはAの特殊化なのか、BまたはCの特殊化なのか
どちらですか? (区別する必要性はおいといて)

78 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 15:43:17.65 ]
こうじゃね?

template<>
void hoge<int,int>(const int&, const int&){} //D

79 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 16:02:07.82 ]
>>76
わかっているなら教えてくださいよ。

80 名前:77 mailto:sage [2012/02/22(水) 17:07:46.65 ]
>>78 なるほど、これならいけました。
引数が2つあるので、Aの特殊化になるみたいですね。

BとCを定義した状態で
void hoge<int>(const int&, const int&){} //D
としたら、特殊化できませんでした。

曖昧な場合は特殊化できないみたいですね。
しかも、どうやっても明示できない状況もあるようです。



81 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 18:03:26.58 ]
>>71
intの定義を調べましょう
intが32bitだと断定してるところはクソサイトだと思って構いません

82 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 18:05:20.01 ]
>>81
それは知ってます。
16ビットが32ビットになったときみたいに64ビットになったと思っていたら
32ビットだったという経験をしたからlong longを使うという発想にいたったわけです。

83 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 18:36:04.78 ]
本当に調べましたか?
intは「処理系に最適なサイズ」になります

コンパイラ開発者達が最適だと判断したものよりも
long longの方が最適であると思うのならばそちらを使うのも良いでしょう

その際は実測してから使うことを勧めます

84 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 18:52:27.95 ]
64bit整数が最適でも32bit整数のほうが速いなんてことはいくらでもある
ケースバイケースで実測する他無い

85 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 19:17:29.75 ]
intが最速って保証は無かったような…
実測するしかない

86 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 19:21:42.18 ]
>>82
数値演算の速度と64bitアプリかどうかは無関係

「64bitアプリ」の「64bit」はアドレス空間のこと
int, long long, float, doubleには関係ない
関係あるのはポインタ

87 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 20:01:13.58 ]
32bitで2回処理が必要なところを64bit1回で済むなら速くなる
そうでなければ変わらない

88 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 20:04:21.14 ]
実測してから使うのは良いけど
その実測も注意が必要だな

仮に算術演算で64bit整数の方が良い性能だったとしても
配列などで要素数が多い箇所を64bit整数にすると逆に性能が劣化するということがあり得る

単純なケースでの実測結果があらゆるケースに適用出来るとは限らないことを
認識しておく必要がある

89 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 21:58:51.00 ]
> intの代わりにlong longを使い

64bit環境なら、intは64bitにするというのが普通。
処理系によっては、わざと32bitにしてるかもしれん。

じゃあ、64bit環境でのlong longは何bitなのか?
処理系依存だよなぁ、わからん。


> floatの代わりにdoubleを使うという選択で

昔のC処理系の仕様では、内部演算はdoubleで行うことになってた。
floatでの演算には、必ずdoubleとの型変換が介在した。
なので、floatよりdoubleの方が速かった。
今のC++処理系の実装は、知らん。

どっちみち、処理系の実装に依存することに変わりはないわけだ。


90 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 22:01:01.44 ]
どこの世界の普通だ



91 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 22:09:43.57 ]
intが64bitの処理系挙げてみろよ

92 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 22:10:38.42 ]
64bitでも互換性等の理由からintは32bitが普通だw
ILP64の実例なんて聞いた事無いぞ

93 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 22:10:41.85 ]
Wikiより

データモデル short int long long long ポインタ 処理系
LLP64 16 32 32 64 64 Microsoft Win64 (X64/IA64)
LP64 16 32 64 64 64 ほとんどのUnixとUnix風OS (Solaris, Linux, etc.)
IP64 16 64 32 64 64 ?
ILP64 16 64 64 64 64 HAL
SILP64 64 64 64 64 64 ?

94 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 22:12:00.33 ]
IP64って規格違反じゃね

95 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 22:12:07.99 ]
IP64とか規格で許されないのになんで載せてんだか

96 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 22:15:27.44 ]
intが64bitだと16bitか32bitのどちらかが
拡張整数作らないと使えないからねえ

97 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 09:32:31.60 ]
32ビットだとレジスターにintを二つ入れて並列演算するから
long longより速いなんてことないですよね?

98 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 09:33:59.99 ]
は?

99 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 09:37:22.82 ]
ひ?

100 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 09:42:30.05 ]
ふ?



101 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 09:44:38.00 ]
>>97
そんなあなたにMMX?


102 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 11:21:14.88 ]
昔、卒研でロボティクスのシミュレーションを書いたときに、
プリミティブなdoubleが何の単位を表しているか分からずにデバッグに苦労したことがあります。
書店で立ち読みしてたら、ドメイン固有の型を取り込めなんて金言を読みました。
class Ampere;
class Ohm;
class Volt;
上みたいな型があったら、V=RIに相当する
複数のオペレータをオーバーロードしろってことであってるでしょうか?

103 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 11:29:00.96 ]
違う型同士の計算を禁止するのが目的だから。
その本の内容はその事例には当てはまらないっぽいよ。

104 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 12:13:53.94 ]
あの本の内容だと同じ型だけですか。(´・∀・`)ヘー
もうちょっと汎用的な話だと思ってました。
Volt operator*(Ampere,Ohm);
みたいなの書いてたら、コンストラクタの呼び出しが遅いだろうなとか思ったので、
誰かexpression templateみたくアレゲなサンプルコードを書いて欲しいな、なんて。
(実際は面倒だろうから本番用だけtypedefでdoubleにするけども)

105 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 12:27:21.59 ]
時限付き数値計算したいのならboost使えばいいよ
実装が知りたければboostを読めばいいよ

106 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 12:43:57.57 ]
boost::Unitsなんてのあったんですね。トンクス

107 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 08:47:15.96 ]
C++でプログラム書くのを覚えるとCでプログラム書くのは無理
Cを読むくらいならできるけど、Cで書くなんてバカらしくてやってらんない


108 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 09:10:08.24 ]
自作関数から、呼び出し元が指定した先へコールバックさせたいのですが
コールバック先が普通の関数のときは上手くできましたが、クラスの中のメンバ関数のときの方法がよく分かりません。

class test {
 public:
  test();
  void attach( void (*_fptr)(void)) {fptr = _fptr;} ←●成功
  template<typename T> void attach(T *_tptr, void (T::*_mptr)(void)) {tptr=_tptr;mptr=_mptr;} ←★エラー

  void main_no_syori();

 private:
  void (*fptr)(void);  ←●成功

  template<typename T> T *tptr;       ←★エラー
  template<typename T> (T::*mptr)(void);  ←★エラー
}

とテキトーに書きましたが、★の書き方が違うようでコンパイルエラー
どんな風に書くといいんでしょうか

109 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 09:15:32.96 ]
そんなことしなくても
boost::functionとかstd::functionとか使えばいいんじゃない?

110 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 09:35:52.43 ]
boost::function をググっみましたが理解不能・・・

たとえば先ほどの例だ

void callback() {
  処理;
}

void main() {
  test t;
  t.attach(&callback);
}

と普通に利用できますが、オブジェクトの中で利用するとき

class main {
 public:
  main() {t.attach(this, &main::callback);}
 private:
  test t;
  callback();
}

こんな風に使いたいと思うのですが・・・



111 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 09:46:52.64 ]
class test {
void attach(boost::function<void ()> func) { m_callback = func; }

private:
boost::function<void ()> m_callback;
};

class main {
public:
  main() {t.attach(boost::bind(&main::callback, this));}
private:
  test t;
  void callback();
}
これで m_callback();とすれば呼び出せる

112 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 09:48:49.33 ]
template< class T >
class test { ... }
みたく書けばいいのじゃないか?

113 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 10:33:33.42 ]
ひとつのデリゲートならfunction + bind
イベントハンドラのように複数のデリゲートならsignals2 + bind

114 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 22:18:45.67 ]
メンバ関数の中でgetlineが使いたいのですがエラーが出ます
どうすれば使えるようになるでしょうか?

class Str{
public:
Str();
void Count();
private:
string hoge;
};
void Str::Count(){
fstream file;

file.open("hoge.txt" , ios::in);
getline(file, hoge);  ←ここ
}

115 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 22:25:49.82 ]
>>114 エラーメッセージ貼れよ

116 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 01:26:45.97 ]
漠然とエラーと言われてもなあ

117 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 08:38:52.67 ]
std::cin>>aをstd::getline(a)と同じ様に改行まで読み込めて
スペースも読み込むようにできませんか?

118 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 08:39:27.35 ]
訂正
std::cin>>aをstd::cin.getline(a)と同じ様に改行まで読み込めて
スペースも読み込むようにできませんか?



119 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 08:43:01.49 ]
>>117-118
class Line { ... };
std::istream& operator >> (std::istream& s, Line& a) { return s.getline(a....); }

120 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 08:46:44.29 ]
ありがとうございます



121 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 10:00:36.01 ]
そこまでして>>を使わざるを得ないのか
何かの途中で使いたいのかな

122 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 10:04:08.25 ]
入力の始めの2行はスペースがないと仮定して
cin>>a
cin>>a
cin.getline(a)
ってやるとなぜかgetline(a)が4行目になっているんですよ。
不思議ですね。

123 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 10:05:07.22 ]
getline(cin, a);
としか使わないな
何か昔cin.getline(a);として
思い通りの動きにならなかった記憶がある

124 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 12:53:37.04 ]
未だにバッファにバイナリでreadして自前処理してるわ俺
C++のストリームの機能全然使いこなせてない
iteratorとか使ってドヤ顔したい

125 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 14:02:40.51 ]
>>124
自分の意図通りの細かいことをやりたければ、結局そこに行き着くんだが。>自前処理


126 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 14:11:47.17 ]
>>122
読み込ませているファイルも提示しないで何言ってるんだか。
取り敢えず、全てgetline()で試してみたらどうだ?

127 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 14:35:31.84 ]
普通に
11111111111111111111111
11111111111111111
111111111111111111111
111111111111111111
111111111111111111111
11111111111111111
みたいなスペースも何も無いファイルなんですけど・・・・
改行文字が\r\nじゃなくて\nだからですかね?

128 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 15:16:55.62 ]
まさかと思うがWindowsか?
だとしたら、ios::inだけでなくios::binaryも指定してみたらどうだろう。

129 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 15:42:24.95 ]
いまどきwindowsは恥ずかしいからlinuxに移行しようと思ったんですけど
どうしても動かない機器があるので仕方なくwindows7使ってます。
スミマセンでした。
あとは言われたとおりにして見ます。
ありがとうございました。

130 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 12:05:50.97 ]
何言ってるかちょっと分からんと思うが、
class B {
 virtual void foo();
};
class D : public B {
 void foo();
};
↑こんな感じのクラス階層でBやDに変数や関数を追加しようと思ったら
class B2 : public B {
 bool b;
 void bar();
};
class D2 : public D {
 void ahn();
};
こうなると思うんだ。
で、
@BやDは色々な部分で使い回したい。(だから上の例では継承して変数関数を追加した)
A全てのクラスをBへのポインタで多態的に操作したい(ダウンキャストもしたくない)
を満たすよううまいこと改良できないでしょうか。テンプレートとか使えないかな。

BにB2、DにD2の機能を纏めてしまえば上手くいくんだけど、それだと@が満たせなくて困ってます。
B2にBという機能を持たせたくて、それでいてD2との継承構造も保っていたいみたいな。
B←B2
↑  ↑
D←D2
こんなイメージにしたいんだがここまで書いて自分の説明の下手さに絶望した。
エスパーさん助けてください。



131 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 12:11:52.31 ]
仮想継承とかそういう話?

132 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 13:07:16.66 ]
class D2 : public B {
SmartPtr<D> m_pD ;
public:
D2(void) : m_pD(new D) { }
void bar(void) { m_pD->bar() ; }
void ahn(void) ;
} ;

ヒント: ブリッジパターン

133 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 13:12:13.01 ]
すまん適当にかいて間違えたね

class D2 : public D {
B2 m_b2 ;
public :
void bar(void) { m_b2.bar() ; }
void ahn(void) ;
} ;

これでおk
B にアップキャスト可能
foo , bar , ahn を使用可能
B , D には変更なし


134 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:07:23.73 ]
A次元配列を宣言した後また代入し直したいのですが

test[15][20] =
{
  0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
} ;
このような形ではエラーが出るので、どうすればいいですか?
不規則なので1個1個入れるのは大変です。

135 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:09:58.92 ]
連投失礼します。上の例は不規則ではないですけど実際は不規則な感じになってます

136 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:11:03.73 ]
memcpyあたりで一気にやればいいと思うよ

137 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:12:47.54 ]
>>134
最後の要素のカンマはアウツ

138 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:17:18.71 ]
ありがとうございます

139 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:20:42.42 ]
>>137
アウツじゃないよ
アウツなのはenum
C++11でOKになったけど

140 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 17:23:08.80 ]
肝腎なことを書けよ。

>>134
二重に括弧が必要。



141 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:00:01.16 ]
実はカッコを二重にする事は必須ではない
すべきだけど

142 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:04:30.80 ]
hoge::hoge()
: a(),
b(),
c(),
{}

も認めて欲しい。

143 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:09:03.38 ]
hoge::hoge() :
 a(),
 b(),
 c(),
{}
の方が統一性があっていいな

144 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:10:08.30 ]
hoge::hoge()
 : a()
 , b()
 , c()
{}

145 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:22:35.19 ]
hoge::hoge(int x){int y=x/2;a();b(x);c(y); }
の記述でOKと成るようにメンバ初期化ツリーの構築くらいコンパイラ側で面倒見てくれればよかったのに

146 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:26:14.89 ]
hoge::hoge()
 : a()
 : b()
 : c()
{}
がいい

147 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:53:19.38 ]
そういうの言い出したらキリが無いからなあ・・・
if (
 a ||
 b ||
 c ||
) {
}
とか
hoge(
 a,
 b,
 c,
);
とか

148 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 19:09:42.74 ]
>>144
コロン ( : ) とカンマ ( , ) で意味が違うものをそろえてもしょうがない、
て言うか単なる馬鹿。

149 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 19:10:56.50 ]
if文の{}は省略出きるんだから関数やクラスも省略出来るべき
int hoge()
return 0;

class hoge
int a;

150 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 19:33:15.03 ]
>>148
意外と見かけるというか
VC自体がそういうインデントに対応してた気がする



151 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 19:55:28.61 ]
俺もVCで綺麗になるから>>144だな。

152 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 20:30:17.35 ]
俺はキモいからやらないけどな

153 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 20:34:16.85 ]
Emacsも>>144だった気がする

154 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 20:34:30.72 ]
プロは一行にぶち込んで終わり
素人ほどくだらない形式にこだわる

155 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 21:09:26.88 ]
自称プロ キタ--------------------ッ!!

156 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 21:17:34.51 ]
>>134
ttp://ideone.com/JnDx7

157 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 21:36:14.75 ]
STLアルゴリズムの関数オブジェクトってunary_functionとかbinary_functionの継承って必須ですか?

struct MyFunc : ??? {
  template <class Object> void operator (Object const & object) const {
    DoSomething(object);
  }
};

MyFuncのようにオーバーライドされた関数オブジェクトの場合
ベースとなる関数オブジェクトアダプタをどう書けばいいのかわかりません

158 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 22:13:12.65 ]
>>157
> STLアルゴリズムの関数オブジェクトってunary_functionとかbinary_functionの継承って必須ですか?
98のころのファンクションアダプタ(bind1stやnot1とか)に引数と戻り値の型を知らせるのに使ってただけだから
そういったものを使わないならいらない。
(そして11ではunary_function、binary_functionやそういった古いアダプタは将来廃止予定になった)

159 名前:デフォルトの名無しさん [2012/02/27(月) 14:25:04.76 ]
POINT pos;のx,yをWCHARに入れたくて、pos.x pos.yの型はLONG tagPOINT::xと出るので
WCHAR str[100];_swprintf_l(str,L"x: %ld y: %ld " ,long(pos.x),long(pos.y));
としたのですが
: error C2665: '_swprintf_l' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした
int _swprintf_l(wchar_t *,size_t,const wchar_t *,_locale_t,...)' の可能性があります。
または 'int _swprintf_l(wchar_t *,const wchar_t *,_locale_t,...)'
引数リスト '(WCHAR [100], const wchar_t [15], long, long)' を一致させようとしているとき

となります。助けてください

160 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 14:32:40.43 ]
swprintf つかえ



161 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 14:40:35.23 ]
ありがとうございます
error C2220: 警告をエラーとして扱いました。'object' ファイルは生成されません。
warning C4996: 'swprintf': swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.
'swprintf' の宣言を確認してください。

となりました。どうすればいいのでしょうか?

162 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 14:41:49.58 ]
swprintf_s つかえ

163 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 14:44:57.72 ]
通りました!ありがとうございました!
どうしてなんでしょうか!?

164 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 14:48:02.76 ]
警告をエラーとして扱いオプションをオンにしていたから
コンパイルが失敗した

165 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 14:50:30.35 ]
なるほど!ありがとうございました!

166 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 02:38:25.61 ]
template <class T0...>
void func(const T0& val0...)
みたいな引数の型と引数を延々と伸ばしていくようなプリプロセス処理はどのようい書けばいいんでしょうか?
以下のような意図です
ideone.com/U2XMN

Boost.PP使うと楽という話は聞いたことがあるんですが、
Boostが使用できない環境なので、C++標準の方法でなんとかする書き方を知っている方がいれば、是非お願いします。

167 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 03:48:39.64 ]
C99のプリプロセッサを使えばOK。

168 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 07:18:45.90 ]
可変引数マクロはC++11にも追加されるぜ
コンパイラが対応していない場合はどうしようもないが
可変引数テンプレートが使えるような環境なら対応してるんじゃないの?
__VA_ARGS__でググれ

169 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 07:32:15.09 ]
でも可変引数テンプレートが使える環境なら
マクロじゃなくてテンプレート使えとも思うけど

170 名前:166 mailto:sage [2012/02/28(火) 11:02:20.46 ]
済みません確かにコンパイラ書いてませんでした
コンパイラはMSVC10です
C++11への対応やその他の要素と可搬性考えて、C++03の範囲でなんとか...



171 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 11:21:50.91 ]
C++で基本クラスの仮想関数をオーバライドする際、
基本クラスにその関数がなければコンパイルエラーとなるような
指定方法って無いものですか?

なんで仮想関数なのに基本クラスのほうが呼ばれるのか延々と悩んでいたら、
関数名のスペルミスだった、なんてことがあったので。

172 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 11:44:27.09 ]
>>171
C++11#明示的な仮想関数オーバーライド
ja.wikipedia.org/wiki/C%2B%2B11#.E6.98.8E.E7.A4.BA.E7.9A.84.E3.81.AA.E4.BB.AE.E6.83.B3.E9.96.A2.E6.95.B0.E3.82.AA.E3.83.BC.E3.83.90.E3.83.BC.E3.83.A9.E3.82.A4.E3.83.89
>C++11では、overrideキーワードの導入により、このような問題が解消された

C++11で良いなら出来る

173 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 12:00:37.54 ]
なんでムーブ代入演算子は自分のデータをデリートするのではなくて
相手のデータと交換するんですか?

174 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 12:05:19.74 ]
実装が簡単で効率がいいからです

175 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 12:22:42.65 ]
>>172
どうもです。
最新仕様に組み込まれたということは、やっぱりそういう仕組みが求められてたのか。

純粋仮想関数をオーバライドした派生クラスをさらに派生するときには
必ずその関数を再オーバライドしなければいけない
という指定もできればよかったな。

176 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 13:04:57.73 ]
関数ポインタを持つクラスをシリアライズするにはどうすればいいですか?
関数に静的なID振ってそれを保存するしかないですかね?
この場合template関数の場合にどうするべきか・・・


177 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 13:54:54.53 ]
printf("%p", func)
でいいだろ。テンプレートだろうと。
何を問題にしているのかわからん

178 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 14:28:34.48 ]
>>177
意味不明

179 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 14:30:58.80 ]
>>173
むしろswapによる効率化を標準化した結果moveが出来上がったようなもの

180 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 14:34:25.13 ]
>>176
関数ポインタ諦めて関数オブジェクト持たせるようにするとか……

>>177
関数のアドレスが変化しないなら良いのかもしれんが、それはどうだろう

>>178
アドレスを書きだせって意味でしょ



181 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 14:36:13.79 ]
>>173
削除するコストが無駄だから
移動跡地のオブジェクトは使われないっていう前提だし

182 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 14:56:22.44 ]
>>173
例えばポインタを持つクラスを移動する場合

移動先(自分)が管理するポインタをdelete、移動元が管理するポインタをもらう、移動元のポインタをNULLにする
その後移動元のデストラクタが起動してNULLにdeleteして終わり

 delete pTo;
 pTo = pFrom;
 pFrom = NULL;
 delete pFrom;

移動元のデストラクタは否応無しに動くんだから
自分のポインタを渡してdeleteしてもらえばいい

 swap(pTo, pFrom);
 delete pFrom;

183 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 20:25:48.06 ]
>>170
C++03だと無理だねえ

#define hoge(a) printf a
hoge(("hoge%d", 9));

のような事ならできるけど、
結局関数が必要になるので
根本的な解決にはなってないだろうし

184 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 21:16:09.51 ]
C++03の範囲でやろうと無茶したのがboost.PPだし
やるならboost.PP見てマネするしか・・・

185 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 00:45:10.62 ]
boost.PPはCPPの暗黒面に落ちてるだろ
スクリプトで我慢しろよ

186 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 14:04:47.98 ]
C++11のスレッド機能はどこで勉強しましたか?
教えてください。

187 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 14:49:45.63 ]
国内です

188 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 16:03:13.60 ]
wikipediaさんやgoogle先生に教えてもらいました

189 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 15:14:43.41 ]
引数ありのコンストラクタが引数無しのコンストラクタ

class Test{
bool po;
public:
Test()
:po(NULL)
{

190 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 15:16:01.15 ]
途中で書き込んでしまいましたすいません

引数ありのコンストラクタが引数無しのコンストラクタ呼ぶことって可能ですか?

class Test{
bool po;
public:
Test()
:po(NULL)
{
}
Test( int i )
{
// ここでTest()のやつをうごかしたい
}
};



191 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 15:19:07.74 ]
class Test {
bool po;
public:
Test(void) { initialize(); }
Test(int i) { initialize(i); }
private:
void initialize(void) { po = false; }
void initialize(int i) {
// ここでinitialize()のやつをうごかす
}
};


192 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 16:06:49.62 ]
なおC++11になれば普通に可能

193 名前:デフォルトの名無しさん [2012/03/01(木) 17:40:26.30 ]
で?

194 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 17:46:44.47 ]
C++03で出来ないから代替手段を示したんだと思うが

195 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 18:08:49.02 ]
>>184
配置newを使えば出来ないことも無いだろ
PODじゃないメンバーを持っているとちょっとまずいが

196 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 18:09:39.11 ]
間違えた
184じゃなくて194だ

197 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 18:21:56.39 ]
スタック配置にplacement newは処理系依存とか以前見たことあるけど大丈夫?
スタック配置不可クラスにするならいいけど

198 名前:デフォルトの名無しさん [2012/03/01(木) 19:28:11.11 ]
コピーコンストラクタの質問です。
struct Test {
  Test(){
    TRACE( "コンストラクタ\n" );
  }
  Test(const Test& src){
    TRACE( "コピーコンストラクタ\n" );
  }
  ~Test(){
    TRACE( "デストラクタ\n" );
  }
  void operator=( const Test& src ){
    TRACE( "オペレータ\n" );
  }
};
 :
 :
Test  a = Test();
 :
 :
右辺のコンストラクタ → 左辺のコピーコンストラクタ → 右辺のデストラクタ
の順に呼ばれると想像しましたが、実際は右辺のコンストラクタしか呼ばれませんでした。

また、Test&  a = Test();
とやっても、右辺のコンストラクタしか呼ばれませんでした。
(失効参照が得られると思っていた)
なぜでしょうか?


199 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 19:32:07.96 ]
Test a = Test(); イコール Test a();だから

200 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 19:39:23.03 ]
最適化されてるだけ
Test()はどうせすぐに消えてなくなるオブジェクトだからいちいちコピーしないで横取りしてしまおうとコンパイラが気を利かせてくれた



201 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 20:05:01.90 ]

8.5 Initializer 12
The initialization that occurs in argument passing, function return, throwing an exception (15.1), handling
an exception (15.3), and brace-enclosed initializer lists (8.5.1) is called copy-initialization and is equivalent
to the form
T x = a;
The initialization that occurs in new expressions (5.3.4), static_cast expressions (5.2.9), functional
notation type conversions (5.2.3), and base and member initializers (12.6.2) is called direct-initialization
and is equivalent to the form
T x(a);

202 名前:198 mailto:sage [2012/03/01(木) 20:34:01.08 ]
>>199-201
どうもです。
気を利かせてくれるのはいいけど悩みました

203 名前:デフォルトの名無しさん mailto:sage [2012/03/04(日) 09:41:25.32 ]
A
└B
 ├C1
 └C2

というような継承関係になっていて、
A*型のポインタの先が「Bそのもの」かを判定したい場合、
どのような方法がありますか?
dynamic_cast<B*>だとC1やC2だったときにも成功してしまうと思うのですが。


204 名前:デフォルトの名無しさん mailto:sage [2012/03/04(日) 10:43:47.11 ]
typeid

205 名前:203 mailto:sage [2012/03/04(日) 11:49:25.28 ]
>>204
こんなものがあったんですか。
キャストばかり調べてました。

206 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 14:06:02.61 ]
void hoge(){}
void moge(){return hoge();}
ってVC2008だとエラーでないんですけど正しい文法ですか?

207 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 14:06:33.83 ]
正しい文法

208 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 14:47:26.66 ]
ラムダ関数で再帰する方法ありますか?

209 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 15:22:12.07 ]
はい

210 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 15:30:47.00 ]
>>209
ありがとうございます。



211 名前:デフォルトの名無しさん mailto:sage [2012/03/05(月) 15:31:58.50 ]
いえいえ

212 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 13:45:52.33 ]
c++のstring型でsprintfみたいな文字列を編集する関数ってありますか?

charを使ったc言語風の文字列操作がc++ではできずに困っています

初心者過ぎる質問で申し訳ない

213 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 13:49:27.60 ]
std::stringstreamでいいよ


214 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 15:48:20.68 ]
boost::formatでいいよ

215 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 16:44:30.17 ]
マニピュレーターのきもさは異常

216 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 20:45:34.99 ]
まにぴゅっ
どぴゅっ

217 名前:デフォルトの名無しさん mailto:age [2012/03/09(金) 22:30:54.38 ]
無名構造体でググルと偉そうに講釈垂れてるくせに
使い方知らんヤツ多いな。すぐ解る話だろうになんでだろ。

218 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 22:46:47.92 ]
まともなやつはそんなの使わない

219 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 22:48:18.77 ]
無名構造体はunionでブロック共有するくらいしか使わない気がする。

220 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 22:50:43.14 ]
>>219
そうそう
union X{ struct{int a;}; struct{char b}; };
ってのが用途だよな。



221 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:15:17.62 ]
何いってんのこいつ

222 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:19:27.29 ]
無名構造体とかCなら常用だろ

typedef struct {
 ...
} hoge;

とか

223 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:22:12.45 ]
普通に使うな、うん。

224 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:26:49.81 ]
そもそも無名構造体は規格違反だし

225 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:27:45.21 ]
struct{int operator()(int a){return a*b;}int b;}f={2};
for (int i;i<AMOUNT;++i)x[f(i)]=0;

226 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:36:05.83 ]
ああ、無名構造体って共用体で使う変数名ない方の事言ってんのか
あれは規格違反だな

227 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:38:24.39 ]
タグ名って省略出来なかったっけ?

228 名前:デフォルトの名無しさん [2012/03/09(金) 23:40:56.37 ]
無名の共用体と言われて何のことか
ダイレクトにわかんねーやつは禿本をもっと読んだほうがいい

229 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:44:05.46 ]
無名構造体はタグ名のない構造体の事ではないらしい

230 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:44:54.47 ]
>>229
了解。



231 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 23:46:04.78 ]
普通に名前付けるかその場でtypedefしないとエラーだよ


232 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:04:51.06 ]
unionで使う無名構造体について詳細キボン
この会話の意味を知りたい

233 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:08:41.16 ]
>>226
struct Example{int x;};
struct Holder{Example};
Holder holder;
holder.x = 10;
こういう匿名構造体とは違うぞ。


234 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:14:08.15 ]
>>232
共用体の中に即席の構造体を作れる。
共用体以外で用の無い構造体を使うときに使う物。
例えば、X11風のWindow Messageはこう書ける。

struct Message
{
      int type;
      union
      {
             struct{ /* マウスイベント用 */ };
             struct{ /* キーボードイベント用 */   }
             /*** その他イベント用構造体が続く ***/
      };
};

235 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:17:56.33 ]
>>234
エラー

236 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:23:05.86 ]
>>235
コンパイラによっちゃ引っかかるわな

237 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:25:44.82 ]
unionの外からはアクセスできないデータ集合ができるということ?

238 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:26:10.24 ]
コンパイラによっては拡張でおk

239 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:28:52.44 ]
>>238
コレは拡張だろうけど、exportもコンパイラによって実装具合が違うよな。

240 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:29:23.87 ]
exportさんはC++11で退学になったのでもうどうでもいい



241 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:30:38.07 ]
要するに、>>234でいうと例えば、union内でマウスイベントが int, Point 型を持っていたとしたら
Messageのポインタを
struct MouseMessage { int a; int b; Point p; };
型のポインタに変換して使わせるとかそういう目的のテクニックという認識でいいの?

242 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:34:07.09 ]
>>237
うんにゃ。
Message message;
message.構造体のメンバー名;
って事で、直接構造体メンバーを指定すれば操作できる。
んで、同じ構造体のメンバーを操作する限りは、
タダの構造体と同じだけど、違う構造体のメンバーに触った場合は、
メモリー上同じ位置にある構造体のメンバーすべてが書き換わる。

243 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:43:39.63 ]
それが可能ならば
同じメンバ変数名を持つけれども順番が違う構造体同士が入っている場合の挙動はどうなっちゃうの?
struct Message{
int type;
union{
struct{ Target target; int i; float f; };
struct{int j; short s; Target target};
};
};
こういう場合の Message m; m.target の扱いとか

244 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:45:51.26 ]
>>243
だからエラーだって
VC++とかの糞環境じゃないと無名構造体は使えないの


245 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:47:28.25 ]
>>240
VCより遥かに準拠率高いBorland C++ Builder XとComeau C/C++馬鹿にすんな

246 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:47:42.06 ]
いずれにしろ標準の機能ではないということさ

247 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:47:51.46 ]
はいはい

248 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:48:13.37 ]
>>244
使える環境でのはなししてんだろ
コミュ障かよ

249 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:49:10.46 ]
>>243
名前重複させられないのでエラー

250 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:49:40.29 ]
>>244
お前ってかわいそうだな



251 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:53:04.76 ]
>>244
アスペは黙ってろ

252 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:53:52.53 ]
>>250
心理学では研究され尽くしてメジャーなネタだけど知ってるか?
議論口論で論理的に勝てないとなったら人間って無意識に人格攻撃を始めるんだぜ
解りやすいやつだなお前は

253 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:55:06.54 ]
へーうんちく垂れたきゃ他所の板でやりな

254 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:55:26.20 ]
>>252
「空気」⇦読めますか?

255 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 00:57:25.03 ]
規格外の話はほかのスレでやってくれ
何のために環境依存OKのスレがあると思ってるんだ


256 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 11:07:19.90 ]
union reg_t {
 short ax;
 struct {
  signed char al;
  signed char ah;
 } s;
} r;

で r.s.al とかやるより

union reg_t {
 short ax;
 struct {
  signed char al;
  signed char ah;
 };
} r;

で r.al とする方が楽という単にそれだけのもの

>>255
ガチ規格準拠C専用スレとは違って
このスレは別に環境依存を禁止はしてないよ

257 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 11:14:12.58 ]
>>256
だったらスレ統一しろ
分かれてるってことは暗黙に禁止されてるってことだよ
そんなこともわからねーのか
喫煙室があるのに共同スペースでタバコふかす汚物並に調子乗ってんなお前らって

258 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 11:38:01.76 ]
>>257
悔しいのぉ悔しいのぉ

259 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 11:39:51.46 ]
>>258
そういう幼稚なあおりしかできないわけ?
放射能に頭やられちまったみたいだな

260 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 11:42:37.44 ]
いいから環境依存スレ行けば全て解決するんだからお前らまとめてあっち行けや



261 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 12:00:01.52 ]
質問
OpenGLだけど
const char* pVer = glGetString(GL_VERSION);
printf("version is %s¥n",pVer);
これだとOKで
printf("version is %s¥n",glGetString(GL_VERSION));
これだとダメだったんだが、もしかして返り値の寿命が関係してるの?
だとすると寿命はどう捉えるべき?

262 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 12:37:41.70 ]
>>261
内部で参照カウントされてるから問題ないよ
それとは関係ないところでミスってる可能性大

263 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 12:45:05.47 ]
>>259
( ´,_ゝ`)プッ

264 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 13:18:59.12 ]
>>263
なんだBOTか
相手して損したわ

265 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 14:24:34.52 ]
>>262
そうすか
ちょっと見なおしてみます

266 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 15:35:03.73 ]
Javascript/ECMAscriptスレに飽きてこっちにキたのか?

267 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 21:28:09.73 ]
_beginthreadexで3つのスレッドを作る場合
_endthreadexでここのスレッドを判別するにはどうしたら良いのでしょうか?

268 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 21:45:29.47 ]
_endthreadexはスレッド内から呼ぶものであって
判別もなにもないぞ

269 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:09:55.29 ]
>>267 その話をすると >>257 が湧いてくるぞ
_beginthreadexは方言の話以上に、OS依存の話だからな。

270 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:12:09.75 ]
>>267
スレッドのポインタを使う



271 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:19:41.38 ]
_endthreadexを使うのと、_beginthreadexの戻り値で取得したハンドルをCloseHandleで消す方法ってどう違うの?

272 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:30:04.82 ]
>>271
_endthreadexにはバグがあって100%メモリリークするから
常にCloseHandleを使う方法を利用するほうがいい
_endthreadexは忘れてもいいよ

273 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:33:09.91 ]
>>272
マジですか?
有用な情報ありがとう!

274 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:33:21.03 ]
_endthreadexなんて何に使うの?
普通にreturn 0;で戻ればいいだけじゃね?

275 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:36:21.65 ]
>>274
それだとスレッドが永遠に走り続けるからヤバイ

276 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:01:52.31 ]
>>275
うそん
msdn.microsoft.com/ja-jp/library/hw264s73(v=vs.80).aspx

277 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:04:37.17 ]
あれじゃん。メモリーリークするつってんのは、デストラクターが呼ばれないからでしょ。
return;でスレッド関数終了するとちゃんとデストラクター呼ばれるし、そのあと自動で_
endthreadex呼ばれてスレッド自体もちゃんと破棄されるじゃん。

278 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:06:13.69 ]
あと、CloseHandleはスレッドハンドル閉じるもんでしょ、
ハンドルのリソース解放するもんで_endthreadexとは毛色がちがうじゃん。

279 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:26:04.51 ]
_beginthreadexって基本クソだよね
他のが使えるなら他の使うのが良い

280 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:42:01.49 ]
exit(int)のスレッド版でしょ。
代替手段を考えるにしても_exitthreadexを使おうと思うに至る事自体が稀だと思うが。



281 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 00:04:45.82 ]
throwしてスレッドエントリでcatchすべき
スレッド内でcatchされない例外があるとプログラムが死ぬ

282 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 02:25:57.18 ]
>>272
_endthreadexとCloseHandleを同列に見るやつ前もいたけどcalleeとcallerの区別もついてないのかよ

283 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 04:20:10.08 ]
マクドナルドでの便利な呪文:
「callerください。あ、calleeは抜きで!」

284 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 05:46:41.76 ]
【審議中】 ( ´・ω) (´・ω・) (・ω・`) (ω・` )

285 名前:デフォルトの名無しさん [2012/03/11(日) 07:57:50.53 ]
最近なるべくconstを付けるように意識してるんですが、constなメンバを持つクラスの
operator =を書くときに困っています。
たとえば内部に持つバッファのサイズなどはコンストラクタで決まり、以後変更されないのでconstにしています。

が、そうするとconst_castでconstをはがさないと代入演算子が書けないわけで・・・
こういうときはどうするべきなのでしょう。

1.constではなくmutableにすべき
2.代入演算子を書くべきでない。使うときはコピーコンストラクタで済ませるべき
3.そもそもその程度の不変性ならconstにするな

アドバイスいただけると嬉しいです。

286 名前:デフォルトの名無しさん [2012/03/11(日) 09:34:11.03 ]
3だね

287 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:02:34.88 ]
メンバでconstってほとんどつかわんよ
コンパイル時定数ぐらい

288 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:06:44.76 ]
俺も定数以外では引数にしか使わないな

289 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:14:39.10 ]
メンバでconst使うとしたら
コピーコストの大きなオブジェクトを
コンストラクタのconst参照で受け取って保持するときくらいだな。
寿命の管理に気をつけないといけないけど。

290 名前:デフォルトの名無しさん [2012/03/11(日) 12:17:04.81 ]
そもそも代入の対象が const って、超初歩的な誤りじゃん



291 名前:285 mailto:sage [2012/03/11(日) 12:25:51.16 ]
なるほど・・・納得しました。
constつけないように変更してみます、ありがとうございました。

292 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:30:29.30 ]
構築された後は、そのオブジェクトにどんな操作をしても値が変わらないメンバならconstにすべきだろうけど

293 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 17:16:33.24 ]
ポインター以外にどうしてもconstつけたいなら、
代入演算系をprivateにして制限するのも手よ。
imutableオブジェクトの完成だ。

294 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 21:34:23.89 ]
ハンドルされていない例外が発生しました。
↑が直らないんですが、どうやって対処すれば良いのでしょうか・・・

295 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 21:53:56.51 ]
>>294
例外をハンドルすればいいと思うよ。

296 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:31:10.52 ]
>>295
日本語でおk

297 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:42:45.65 ]
訳すと馬鹿には無理

298 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:47:22.51 ]
>>294
教えてもらおうとしても駄目
このスレには屑しかいないんだから

299 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:48:11.87 ]
>>294
例外の中身を調べてみろよ

300 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 23:35:07.57 ]
「例外をハンドルするには」でググったらいい



301 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 23:40:03.44 ]
>>300
catchする時、型が解ってなけりゃいつまで経っても
ハンドルできんだろう

302 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 00:01:33.95 ]
try{ throw exception(); }catch(...){}

303 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 01:41:36.01 ]
動的配列の途中に挿入・削除をする方法を教えてください。

listである条件に当てはまるものを削除したいときは
remove_if()を使えばいいらしいのですが、使い方が分かりません。

304 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 01:56:24.45 ]
erase insert使えばいいよ

305 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 09:01:46.79 ]
>>303
此処読んでみな。
marupeke296.com/TIPS_No12_ListElementErase.html

306 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 11:22:45.03 ]
ttp://ideone.com/Z10hJ

307 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:29:50.20 ]
>>305
ありがとうございます
これで大方理解できました。

>>306
[](int val){ return val == 2 || val == 3; }のようにわざわざ他で関数を作らなくてもできるんですね。参考になります。
[](type n){}の書き方の[]の意味は戻り値の型の略称ということでいいんでしょうか。

308 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:36:26.00 ]
よくないです

309 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:38:07.37 ]
「c++ ラムダ式」でググるといい
特に[]の中の指定は結構特殊だから

310 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:38:16.12 ]
C++でFortranのようにベクトル計算するにはどうすればいいんですか?




311 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 19:53:31.50 ]
>>309
普通に使う分にはある程度できるようになりました。
ありがとうございます。

あとはクラスがどうのこうのを学ばないとなぁ

312 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 20:53:36.74 ]
>>310
uBlus or Blits++

313 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 19:05:49.64 ]
boost::shared_ptrをvoid*に入れたいのですが、できますでしょうか?

フレームワークに設けられている便利に使っていいvoid*なんですが
&でアドレス取得して入れたら、うまく動作しませんでした。

&でアドレス取得する場合、参照カウントが増えなくて消えちゃうみたいです。

こういう時ってどう実装するものなのでしょう?。。

314 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 19:21:32.29 ]
struct foo{boost::shared_ptr ptr;};とかやればいいんじゃねーの

315 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 19:55:09.32 ]
>>314
ありがとうございます。試してみます。

316 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 20:21:24.59 ]
boost::shared_ptr を new して void* に渡すとか

317 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:35:58.79 ]
すみません、アルゴリズム的な作曲をやろうとしている文系です…
ソースを貼らせてください

codepad.org/C3hsBjQo

余計な部分は省略しています。
これで、コンパイル時のエラーはないのですが、scanfが実行される前に、
プログラムが止まってしまいます。
本当に稚拙なプログラムで済みません、初心者なもので。
どなたか問題点を教えていただけないでしょうか。

318 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:39:51.79 ]
p = 0 じゃなくて p == 0 だな

319 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:40:09.29 ]
他にも色々な所で同じ間違いがあるね

320 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:52:01.51 ]
数字を入力するプログラムで下のように書いたとき
「-1」と入力すると”数が正しくありません〜”とでて次の”数を入力してください->”に戻るけど
「a」と入力すると”数が正しく〜”と”数を入力〜”がずっとでつづけます
なぜなんでしょうか?

while(1) {
cout << "数を入力してください->";
cin >> num;
state =cin.rdstate();
if (num <= 0 || state != std::ios_base::goodbit){
cout << "数が正しくありません。最初に戻ります。\n" << endl;
continue;
}


}




321 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:12:41.47 ]
エラー復帰してないから
エラーを clear() してから a を読み捨てないと、
永遠に先まで読み進められない

322 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:24:47.10 ]
>>318さん
>>319さん

回答有難うございます!さっそく直してみて、scanfが実行されるまではいったのですが、
そこからが進みません。
多分、N1hosei関数が悪いんだと思います。
入力したpが、12以上になってしまたらマイナスし、0以上になってしまったら
+する。
pが、jからj+2、またiからi+4の範囲にあったら、+を続け、また同時に、
p == k または p == h になってしまったら、更に+する、
つまるpが、jからj+2、iからi+4の範囲になく、かつkでもhでもない、数になるまで
演算をループさせたいのですが…

323 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:36:16.35 ]
>>321
エラー復帰とは具体的にどういうことをすればよいのでしょうか?
初心者で申し訳ありません

324 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:46:00.25 ]
> > エラー復帰とは具体的にどういうことをすればよいのでしょうか?
> エラーを clear() してから a を読み捨てる

325 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:04:08.42 ]
>>322
>p == k または p == h になってしまったら
It means
if (p == k || p == h) {
}
not
if (p != k && p != h) {
}


326 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:21:23.51 ]
>>324
何をclearすればよいのでしょうか?
cin.clear();
をやってみたのですがダメでした・・

327 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:25:04.26 ]
>>326
>a を読み捨てる

328 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:28:09.60 ]
初心者でもそれくらい調べろよ

329 名前:326 mailto:sage [2012/03/14(水) 15:19:23.31 ]
cin.clear();
cin.ignore();

をしたら解決しました
>>321の言うとおりclearしてignoreしたら正常に動作しました
ありがとうごさいました

ただ何故こうしたらうまくいくのかよくわかりません
上の2つを逆にしてもダメでした
どなたか解説して頂けると助かります

330 名前:322 mailto:sage [2012/03/14(水) 22:08:26.53 ]
>>325

返信有難うございます。
int N1hosei(int i, int j, int k, int h,int &p){//iやjの範囲内だったら、
         if(p > 12){
do{
  p--;
}while((p == k) || (p == h)); //12以上になってしまったら、h,kでなくなるまで-する。h,kでなくなったら、再び一番最初の条件に戻る
return p;
}else if (p < 0){
do{
p++;
}while((p == k) || (p == h));//0以下になってしまっていたら、i,jの範囲外になるまで+して、//h,kでなくなるまで+。で最初の条件に戻る。
return p;
}else{//0≦p≦12、つまり普通の場合は、これ
if((p == k) || (p == h)){
p ++;}
return p;
}
}

このように書き換えて見たのですが、うまくいきません…何が悪いのでしょうか。。
指摘していただけると、大変助かります。



331 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 23:49:53.69 ]
いや、そのへん以前に
 j <= p <= j+2

 (j <= p) <= j+2
であってpがある範囲内にあるかどうかの判定になっていないから

332 名前:322 mailto:sage [2012/03/14(水) 23:54:51.40 ]
>331さん

なるほど!
ではpがある範囲内にあるかどうかの判定は、
j <= p && p <= j +2
とでもすればいいのでしょうか。

333 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 00:09:21.33 ]
>>329
ちったぁ考えれ

cin >> num; で a が見つかってエラーになって、cin.clear(); しても、
次の読み込みはまた a からなの
正しく読めるまで先には進まないの
だからまたエラーになるの
これがずっと続くってわけ

334 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 00:10:46.51 ]
初心者ってcinを使いたがるけど、これ初心者には必要ないよね。
つーか誰にも必要ないよね。

335 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 01:05:51.31 ]
>>332
それでいい

336 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 09:58:01.30 ]
継承元のoperator=を使用したい時は、継承したoperator=の中でキャストして呼ぶしか無いでしょうか?
CBaseAを継承し、CSpecとします。

CSpec CSpec::operator=(const CSpec &obj ){
CBaseA *p1 = dynamic_cast <CBaseA *> ( this );
CBaseA *p2 = dynamic_cast <const CBaseA *> ( &obj );
if( (p1 != nullptr) && (p2 != nullptr) ) *p1 = *p2;
}

今はこのようにしています。

337 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 10:04:21.02 ]
>>336 this->CBaseA::operator=(obj)

338 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 10:05:43.28 ]
別にキャストいらんだろ
てかdynamic_castは間違い

339 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 10:14:28.60 ]
>>337
有難うございます!
こういう書き方も出来たんですね!

>>338
ダウンキャストは承知していましたが、継承元のoperator=を呼ぶ必要があったために
やむ終えず>>336の書き方をしていました。
知識不足で恥ずかしい限りです。

340 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 15:03:40.92 ]
キャスト使うならこうだろ
static_cast<CBaseA &>(*this) = obj;



341 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 21:11:41.42 ]
>>334
Linux関連じゃ、istreamに突っ込んでんのをたまに見る

342 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 21:12:46.78 ]
>>337
thisもいらんだろ

343 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 16:43:24.83 ]
初心者です。
ppm形式のバイナリファイルの画像を読み込み,pgm形式に変換して配列に画素値を格納したいと考えています。
そこで画素読み込み部分を以下のように書いたのですが

for(int y = 0; y < m_height; y++){
      for(int x = 0; x < m_width; x++){
double r,g,b;
ifs.read((char*) &r, sizeof(double));
ifs.read((char*) &g, sizeof(double));
ifs.read((char*) &b, sizeof(double));
pixels[x][y] = r * 0.299 + g * 0.587 + b * 0.114;
}
}

pixelsの配列内を確認してもどの位置の画素も同じ値になってしまいます
どこが間違ってるのでしょうか;;


344 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 16:46:01.81 ]
オーバーフローしてんじゃね

345 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 17:08:10.03 ]
>>343
そりゃ、1画素がchar 1個分だもんな。
1画素をchar 6個分(double)で読み込みゃそりゃずれるで

346 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 17:15:48.22 ]
doubleは8個分

347 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 17:21:19.83 ]
ppm の形式は知らないけど

char r,g,b;
pixels[x][y] = (double)r * 0.299 + (double)g * 0.587 + (double)b * 0.114;

じゃないの?


348 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 19:14:02.74 ]
テンプレのFAQが英語なんですけど翻訳して読めってことですかコレ

349 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 19:51:44.93 ]
どのプログラミング言語にしても英語が読めたほうが捗るぞ。
なんたって言語作者の9割以上が外国人だしな。

350 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:12:39.10 ]
フランスに渡米するみたいなもんか



351 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:16:47.83 ]
そりゃ人間の9割以上が外国人なんだから当然だろうよ。

352 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:21:36.94 ]
Rubyは貴重だな

353 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:26:28.13 ]
英悟は別格で置いとくとしてGoogleで調べると日本語と他の国言語では
Rubyに限らずコンテンツ量が一桁以上違うから
内容の濃淡は知らんけど日本は恵まれてると思うよ

354 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 21:44:20.01 ]
ちょっと日本語がわからない。
もう少しわかりやすく。

355 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 21:45:35.76 ]
いうても、日本語ほど英語と文法の離れてる言語も多くないよな。
多少ひねれば英語化できる言語圏じゃ、母国語資料の少なさなんて
大した問題じゃないんだろ。リーナスやハゲだってフィンランド人だし。

356 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 22:13:22.65 ]
多いよ
SVOは全言語中でむしろマイナー
日本語と同じSOVが45%を占めている

357 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 23:04:35.70 ]
母国語でここまで頑張っている、というのもある意味驚異的なことでして。

358 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 23:42:15.55 ]
プログラムに限らず母国語話者に対する期待の違いだろうね
途上国言語で話題振っても誰も付いてこない来れない悲しみと対極にある

359 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 00:02:14.89 ]
そういう国は英語で頑張ってるからな

360 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 00:07:25.08 ]
ボビーオロゴンとかアホそうな振る舞いしてたけど
真面目に話したら、俺らよりはるかに頭いいんだろうな
何せマルチリンガルらしいし



361 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 00:13:38.15 ]
C++に関しては繁体字圏がコンテンツ量で結構頑張ってるな
perlやHaskellなんかだと日本語と比べるべくも無いが

362 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:23:37.24 ]
>>344-347
回答ありがとうございます。
やっぱり全然本質を理解できてないですね^^;参考になりました。

もうひとつ聞きたいことがあるのですが
バイナリで書かれたppm形式は画素値はバイナリで書かれていますが、ヘッダはテキストで書かれています。
このときifstreamを使ってファイルを読み込むときはオープンモードはbinaryを指定したほうがいいのですか?
またヘッダのテキスト部分がコメント等で長さが分からない場合に、ヘッダ部分を読み飛ばすにはどうしたらいいのでしょうか?
環境はVC++2010です。

363 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:35:39.30 ]
>>362
ppmを厳密に解釈するなら、libpnmのソースと同じようにやるしか。
簡易的には、バイナリで開いておいて行単位に読み出して、コメント行か有効行か判断する。
幅、高さ、濃度最大値を取得できたら、その後はバイト単位で読み出す。

364 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:36:02.85 ]
テキストは特別な意味を持ったバイナリなので、やりやすい方を選ぶといいよ。
でも、テキストでオープンすると改行コードをイジっちゃうのでバイナリの意味が変わっちゃうことがあると思う。

365 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:56:31.39 ]
今回のケースはバイナリppmの読み込みだから、本体を読むときはテキストモードじゃダメ。

366 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 13:31:21.65 ]
RPGでいういわゆるイベントのクラスを作り起動時にバイナリファイルから読み込ませたいのですが
あるイベントは会話が何ページもあったりと可変長なデータがあるためインスタンスによってサイズはバラバラです

このような大きさがバラバラなデータが詰まったバイナリファイルからデータを読み込むには
普通どのような仕様にしているのでしょうか?全然想像がつきません 環境はVC++2010です

367 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 13:37:28.25 ]
>>366 std::string, std::vector などのコンテナを使う。

368 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:08:38.64 ]
ありがとうございます
vectorコンテナでデータを書きこむ時に
データの長さも同時に書きこんでおくといった方法でいけそうですね


369 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:11:58.88 ]


370 名前:366,368 mailto:sage [2012/03/19(月) 14:27:55.83 ]
>>369
例えば2つの可変長データを含む構造体をバイナリで保存した場合、
それぞれの長さが分からないと、

読み込む時最初の可変長データの次のデータが可変長データの続きなのか、
それとも次の可変長データなのか判断する方法がないと思ったのですがおかしいでしょうか?



371 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:36:19.03 ]
>>366
なんでバイナリなの?
xmlは使えないの?
データ構造とファイル設計は混同しちゃダメだよ。

372 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:37:39.25 ]
vector<構造体> msg;
で、必要な数だけpush_backする。

表示する場合は、msg.begin()msg.end()を使えば良いのでは?

373 名前:366 mailto:sage [2012/03/19(月) 15:43:41.33 ]
>>371
xmlが使えるといいなと思うのですが、ファイルの中身が見えてしまうもので
ゲームというジャンルのために暗号をかけたバイナリデータに拘っていました。
本当はバイナリデータなんて使いたくないのですが…。

>>372
きちんとロードできるか試してみます。
表示はそれでいけると思います。

ありがとうございます。

374 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 17:33:23.80 ]
>>373
XMLだって暗号化できるでしょ?
データの記述方法とデータ構造とファイル構造をごっちゃにしちゃだめだよ。

375 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 17:52:10.63 ]
class R{
shared_ptr<A> a_;
public:
weak_ptr<A> getA() {return weak_ptr<A>(a_);}
【or】
A *getA() {return a_.get();}
};
リソース管理クラスを作りたいのですが外部からAを利用したい場合weak_ptr・生ポ(constでない)どちらで取得するのが良いのでしょうか?
※a_の寿命はR内で管理したいのでshared_ptrは公開したくありません


376 名前:366 mailto:sage [2012/03/19(月) 18:37:22.16 ]
>>374
xmlってそんなこともできるのですね知りませんでした、お恥ずかしい限りです。
xmlについて勉強してみます。

377 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:34:03.99 ]
大学でC言語習ったけど全くこのスレのレベルについていけない半年ROMるとなんか変わるの?

378 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:40:54.84 ]
>>375
weakをlockしたらshared_ptr取れちゃわない?

俺も似たような問題で悩んでweak_ptrのようにオブジェクトの生存確認が
できるけど所有権は主張しない生ポインタとスマートポインタの中間みたいなやつを
実装しようか迷った末やらなかった


379 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:45:52.94 ]
>>376
XMLというか、文字列orバイナリについて暗号化かけるだけだから、
別にXMLどうこうじゃないよね
例えば全部の文字についてXORかければ最低でも普通には読めないで高速な暗号化できるわけで。

380 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 20:15:38.57 ]
>>378
ありがとうございます。取れちゃいますね、、
weak_ptrのlock()が *get()になるようなバージョンがあるといいんですが。
素直にポインタで公開するのが妥当なのでしょうか?



381 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 20:20:29.26 ]
普通に生ぽでいいんじゃね
どうせ呼んでる間は死なないんだろ

382 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 22:06:28.71 ]
>>377
さすがに半年ROMったらかわるっしょ

383 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 22:07:30.27 ]
>>380
ハンドルを使う方法もあるけど、
実際ポインタで困ることはそんなに無い気がする

384 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 23:53:51.31 ]
>>377
とりあえず自分に必要なものを作ってみて、実用しないとニーズの比重がわからないよ。

385 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 13:37:16.64 ]
C++では、Cのように関数の引数の型宣言を)と{の間に
書けないとのことですが、引数が多い場合は、()の中に
改行して書けということでしょうか?

386 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 14:00:00.62 ]
そうだよ

387 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 14:54:19.71 ]
今時そんな構文使えるCコンパイラあるんけ?

388 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:09:18.14 ]
Ruby開発者がなぜかこれにしがみついてたなあ

389 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:18:26.47 ]
むしろ使えないCコンパイラがどんだけあるんだよって話

390 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:20:35.12 ]
CならC99専用でもない限り使えると思うぜ
まあ極めて問題のある構文だから使わない方がいいが

#include <stdio.h>

int foo(a, b)
 int a, b;
{
 return a + b;
}

int main()
{
 printf("%d\n", foo(1.2, 2));
 return 0;
}

実行結果: 1931896422



391 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:20:35.89 ]
Code Pad上ならエラーになるな
まぁGCCの問題だけど
codepad.org/ceAMmTJC

いま動くコンパイラって何が有るの?
16bit時代のコンパイラ?

392 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:23:00.68 ]
>>385
int Function
(
     int arg1,
     int arg2,
     int arg3,
)
{
     return 0;
}

初めて見たときは寒気が走ったがこういう書き方するところも有る。

393 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:26:01.05 ]
全角スペースでエラーになるのがgccの問題とか言っちゃう男の人って・・・

394 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:41:08.16 ]
>>391
あいたたたたた

395 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:46:28.00 ]
>>392
最後のコンマは書けないぞ

俺はこうか

int Function(
 int arg1,
 int arg2,
 int arg3
) {
 return 0;
}

こうだな

int Function(
 int arg1,
 int arg2,
 int arg3)
{
 return 0;
}

エディタとの相性に合わせて使う

396 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:47:47.41 ]
メンゴメンゴやっぱうごいたわ
codepad.org/3TQKnfBZ

397 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:49:06.61 ]
>>395
カッコの揃える派とカッコどうでもいい派に好みは別れるよね

398 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:56:42.52 ]
既存にあわせちゃう

399 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:59:09.59 ]
>>396
この書き方だと型チェックが行われないので
1.2 が double 値のままスタックに積まれて、
それを int 値として取り出した結果、無茶苦茶なことになっている
簡単に未定義動作が起きる極めて危険なものなので
今時決して使ってはいけない

400 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 17:05:06.31 ]
>>390
C99でも廃止予定事項なだけで使えるぞ。



401 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 19:49:26.83 ]
385です。先輩方いろいろ教えて下さり有難うございます。
括弧の中に書くのはやっぱり慣れてないというのもあって、
不細工な気がしますね。諦めてpascalに行こうかしら。

402 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 23:10:23.09 ]
その方がいいと思う。

そんな危ない書き方を慣れてないという理由だけで継続するとかとんでもない話だし。

403 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 08:42:18.70 ]
>>399
これでOK。
codepad.org/oyP2YgaY

型を省略したらint型ってことだけど、危なくてしゃぁないな。

404 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:07:25.08 ]
以前このスレッドでラムダ関数(ラムダ式)の再帰が出来ると聞いたのですけど。
具体的にはどのようにやるのですか?
例:
ある型 f;
f=[ & f ](int a){if(a==0)return; else f(a-1 )};

ってかんじですか?

405 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:47:34.68 ]
ttp://ideone.com/Vdw5h

406 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:50:18.46 ]
>>405
ありがとうございます。
autoとfunctionの違いは教えてくれませんよね?

407 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:55:23.10 ]
>>406
ググれ

408 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:46:09.58 ]
メモリ断片化対策としてメモリプールを使ったメモリ確保を実装したいのですが
STLや標準ライブラリなどはいちいち自前のアロケータを指定する方法しかないんでしょうか?

409 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:49:18.96 ]
それ以外のどんな方法がほしいんだ?

410 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:49:43.38 ]
>>408
プールの実装に確保サイズ以外の情報を使わないのであれば ::operator new () を
置き換えるという方法もあるよ。



411 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:01:40.50 ]
>>410
new/delete演算子をグローバルなオーバーロードをすれば
STLや標準ライブラリからも呼ばれるということでしょうか?

412 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:12:39.92 ]
>>411
そういうこと。少なくともアロケータ引数を取るテンプレートはデフォルトで std::allocator を
使うことになってて、デフォルトの std::allocator 実装は ::operator new を使うことになってる。

この場合の ::operator new/delete の定義はオーバーロードじゃないけどね。
あとSTLも標準ライブラリの一部な。

413 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:20:42.01 ]
>>412
ありがとうございます。
やってみます。

414 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 01:16:08.89 ]
newを自作関数に置き換える手法も容易して欲しいよな。

415 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 03:36:11.12 ]
>>414
それが >>410-413 じゃないのか?

416 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 08:52:23.54 ]
>>414
何言ってんだかわかんねーな

417 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 01:09:01.95 ]
operator new で乗っ取れるんだが、ヘッダにインラインで書けないんだよ

418 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 01:34:29.07 ]
>>417
グローバルに置き換えるんじゃ何か都合が悪いのか?
都合が悪い、指定した対象だけに絞りたいとすれば、それは
アロケータでの指定を行うのが妥当ということにはならないのか?

419 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:34:30.02 ]
高速化のために自作newをインライン展開したいんだけどね。
できる処理系と出来ない処理系がある。

420 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:38:11.15 ]
クラス内に new 置けばできるでしょ。



421 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:48:53.74 ]
きょ、局所的・・・。なんでもないよ。

422 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 09:32:26.41 ]
相談室ということで何やらぼんやりとした質問ですが
virtualとはつまるところ、こいつを継承した何かがあるかもしれないから継承先があるかどうかチェックしてね、という目印のようなものでしょうか

423 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 10:18:58.88 ]
>>422
仮想関数、純仮想関数、ポリモーフィズムとかについて調べた?

424 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:00:04.90 ]
答える必要があるのかしら?

425 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:06:27.51 ]
答えなくてもいいが答えてくれるとは思うな的な

426 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:08:31.14 ]
エリートでらっしゃったのね

427 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 17:45:48.25 ]
相談室に居ながら答えを出し渋る書き込みをする事に何の意味があるのだろうか
教えないつもりなら素直にスルーしとこうぜ
せっかくこういうスレがあってもわざわざ妨害してたら何にもならんし

428 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 18:56:37.91 ]
セイラさんは黙っててくださいよ!

429 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 19:12:33.48 ]
>>422
基底クラスのポインタや参照を使ってメンバ関数を呼んでも
本来のクラスのメンバ関数が呼ばれるというもの

430 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 21:51:38.93 ]
>>422
virtualの有無で、コンパイル結果をアセンブラレベルで比較したことがある。
明らかに違うんだよね。当たり前だが。
で、ポリモーフィズムの仕組みを妙に納得したり。




431 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 21:52:36.51 ]
Smalltalk環境として動作してくれるC++のライブラリってないですかね。
別に、Smalltalkのワールドみたいなウィンドウ表示とかは要らないんで、
Smalltalkのイメージファイルを読み込んで、メソッドを記述した文字列を
送ってやると値を返したり、何らかの振る舞いをするってものでいいんですが。

432 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 22:33:58.48 ]
テンプレートメタプログラミングが関数型に近い動作というのを聞いたこと有るよ。俺、関数型知らないけど。
プリミティブから作るかBoostにもあったような気がする。

433 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 22:48:08.42 ]
日本語で書いてくれ

434 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 23:51:36.82 ]
テンプレートメタプログラミングが関数型に近いって!フフフッ
でもね、関数型知らないんだ♪
プリミティブかBoostでいい感じ〜☆
わかんないけど、とりあえずオッケー☆ウフフ☆ タコヤキ!

435 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 23:59:41.95 ]
>プリミティブから作るかBoostにもあったような気がする。
ここが何言いたいのかさっぱり解らん
前の文とつながってない

436 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 00:57:09.00 ]
えーっと、プリミティブって書いたのはifとかforとかから構築が必要ってこった。タコヤキ!
・・・どこからタコヤキ出てきたんだろう。

さいきんのわかいもんは!・・・なんでもないよ。

437 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 07:20:55.86 ]
Objective-C++でいいんじゃね

438 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 09:39:55.77 ]
class Base
{
  virtual Base* Duplicate() const { return new Base(*this); }
};

class Derived : public Base
{
  virtual Derived* Duplicate() const { return new Derived(*this); }
};

という複製処理を仮想関数として作成する場合、
Derived::Duplicate()の戻り値がDerived*でよいのは仕様として決まっていますか?
Visual Studioではちゃんと仮想関数として動くのですが。

それとも、どちらもBase*としておくべきですか?


439 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 10:24:50.56 ]
>>438
共変の返却値。仕様で認められてるのでDerived*でいい。

440 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 10:43:26.27 ]
>>439
ありがとうございます。そういう専門用語があったのですね。
「共変の返却値」でググったら、全く同じような質問が出てきました。
失礼しました。



441 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 16:55:43.84 ]
共変と反変、どっちがどっちか未だに調べないと思い出せない。

442 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 18:06:22.51 ]
技術用語って時々、英語のまま考えたほうが理解できることがある。

443 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 18:42:38.31 ]
せっかく母国語化しても漢字に含まれる情報が誤誘導するのって
ソース中の無駄に多いコメントみたいなモンだな

444 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 20:00:18.82 ]
字面で見ると漢字の方がわかりやすい


445 名前:431 mailto:sage [2012/03/29(木) 20:02:26.55 ]
Panda SmalltalkというScript Engineで解決できそうです。有難うございました。

446 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/30(金) 22:14:39.78 ]
右辺値参照について教えて下さい。
VC2010 で、
struct Hoge {
    Hoge(Hoge&& rhs) {
        *this = rhs; // 1
    }

    Hoge& operator=(const Hoge& rhs); // 2
    Hoge& operator=(Hoge&& rhs); //3
}

1 の箇所で、3 が呼ばれるかと思ったら、2 が呼ばれてしまいました。
これは、規格通りの動作なのでしょうか?
もしそうなら、右辺値参照の operator= にもっていくには、
コンストラクタの引数に対して std::move() すればいいのだと思うのですが、
どうして引数の型が && なのに、再度 std::move しなければいけないのか
理由を知っていれば教えて下さい。

447 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/30(金) 22:27:00.73 ]
>>446
右辺値参照は普通の参照も受け取れちゃうから。
完全に転送したいならstd::forwardでも使いな。

448 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 00:06:50.58 ]
>>446
Hoge(Hoge&& rhs) { //ここでrhsという名前をつけているからこれは既に右辺値ではなく左辺値になる。
*this = rhs; // 1
//ここでrhsを使おうとする場合があるかもしれない
}

449 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 10:08:25.95 ]
www5b.biglobe.ne.jp/~suugaku/vc++kougi/kiso/dai7koudai2wa.html
このページの通りにやったのですがデバックして実行ボタンを押すとフリーズしてしまいます
まだ初めて日が浅いのでどうかおしえてください

450 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:12:23.55 ]
それはC++じゃありません
toro.2ch.net/test/read.cgi/tech/1268613679/
こっちで聞いてね

それにしても初心者がC++/CLIなんて自殺行為だぞ



451 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:31:16.28 ]
>>450
ありがとうござます

それなら別にフォームアプリケーションを作る方法があるのですか?

452 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:38:15.05 ]
>>451
C#を使うのが普通
今からでも遅くないからC#勉強しなさい
>>450のスレ流し読みしてそれでも使いたいっていうんなら止めないが…

453 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 10:42:10.29 ]
>>452
自分は工業高校生で一年間C++でコンソールを作ってきたのでフォームアプリに挑戦したいと思って最近やってみたのですが

C#のほうがいいとは知りませんでした
ありがとうございます

454 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 11:04:53.79 ]
C++/CLIとか、業務で使わざるを得ないんでもなけりゃ見たくもないわ……

455 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 12:33:34.41 ]
C++/CLIを使う意味はないな。
C#を勉強した方が早い。

456 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 13:28:04.74 ]
>>453
C++でGUIやりたいならQt調べろ。C#より楽だぞ。

457 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 16:46:46.56 ]
/*-----Class.hの中身-----*/
class hoge{
private:
bool x;
public:
void set();
};

/*-----Class.cppの中身-----*/
#include"Class.h"
void hoge::set(){
turn=1;
}

とすると実行時にturn=1ができません。
理由が分からないので教えてください。

458 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 18:10:47.73 ]
>>457
turnはどこで宣言されてるの?

459 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 18:48:41.50 ]
>>468
すいません
bool x; が bool turn; です
間違えました

460 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 19:00:24.75 ]
>実行時にturn=1ができません。
何がどうなるのか具体的に書きましょう

bool型の値はtrueかfalseだけど、警告をエラーにするオプションつけてたりする?



461 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 19:13:03.86 ]
>>460
エラーも警告も出ないのですが、ここの動作にとりかかると実行が中断します。
なので、turnの宣言ができてない又はturnを参照できないのだと思うのですが…

462 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 20:01:12.03 ]
turnがboolなら、trueかfalse代入するば良かろうに。

463 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 20:06:28.41 ]
>>462
変数がbool型云々ではなく、intなどでも同じように問題が起こってるので
変数宣言自体に問題があるかと思います…

464 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 21:58:21.48 ]
hoge* h;
h->set();

とかやってんじゃねーの

465 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 22:02:58.68 ]
>>464
問題はそれでした
普通にインスタンス化したら解決しましたありがとうございます

466 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 23:12:56.30 ]
どうでもいいがC++で実体化(インスタンス化)というと
テンプレートの実体化を指す。オブジェクトをインスタンスとは言わない。

467 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 12:13:20.48 ]
マジか?

468 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 12:19:06.84 ]
>>466 んなこたーない。普通に文脈による。

469 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 16:16:40.29 ]
ロケール依存の大文字→小文字変換しようと思ってstd::ctypeみてたんだが、
tolowerって大文字/小文字のサイズが同じ前提で設計されてるように見えるんだが、
そうでない場合を考慮しておきたいときってどう書くのが妥当なんだ?
例:locale=tr_TR.UTF-8の時、大文字'I'(0x49)→小文字(0xc4 0xb1)

470 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 16:53:26.18 ]
インスタンスなんて
templateかCOMぐらいでしかいわんだろ
C++は実体が見えてる場合が多い上、
実体の共有もあんまりしないからな



471 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:06:38.85 ]
俺の周りだとクラスのインスタンスとかは言う
それを作ることをインスタンス化とは言わない

テンプレートに関してはインスタンス化と言うこともある

472 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:10:34.28 ]
メモリ上に実体化(instantiation)されたオブジェクト等と表現することは普通にあるが…
むしろインスタンス化って用語テンプレート以前の時代からあったよね?

473 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:15:50.61 ]
OOに関係なく実体という意味でのインスタンスって言葉は昔からあった
HINSTANCEとかC++すら関係ない範囲だけど

474 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 00:49:13.79 ]
ただの一般名詞だよ。特別な意味付けは無い。
eow.alc.co.jp/instance

475 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 01:57:32.24 ]
>>469 現行規格の立場だと wchar_t 使えってことになるんじゃないの?

476 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 21:43:49.98 ]
数学の本相談スレで
プログラミング板に誘導されたんですけど
もしここもスレチだったら誘導お願いします

C++、Open GL
でユーザーが図形作成できるようなアプリを作りたいです

座標幾何学の勉強をするように言われたんですけど
ぶっちゃけ知識がないので
何か勉強するのにいい本を紹介してほしいです

477 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 22:07:22.33 ]
googleにベクトルと行列について質問した方が早いぞ

478 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 23:50:42.74 ]
>>476
数学の話では線形代数になるけど、そこからだと結構回り道になるから、
3Dゲーム作成に必要な数学、みたいな本を読むのが手っ取り早いんじゃない?
タイトル忘れたけど、そんな感じの本を見かけたことあるから

しかしC++やOpenGLの使い方とかは大丈夫?全部初めてだと、なかなか敷居高いよ?

479 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 01:29:00.46 ]
>>476
>>478の言うように全部はじめてだと、それなりに時間かかると思うよ。

勉強の順番としては
まずは、C++の入門書かなんかやって
次にアプリを動かしたいプラットフォームでアプリを作る方法を学ぶ
次にOpenGLを学ぶ(べつにGLに拘らんでもいいと思うけど)。
それで、アプリの機能に必要な知識を勉強して
ようやくアプリが作れる感じ。

がんがれ。

480 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 21:26:00.23 ]
476です、遅くなりました。
授業で簡単な画像を作ったりアニメーションの練習くらいは
やったんですけど、数学が苦手なもんで…
一応卒論に関係してくるので、何か参考書とかあればなと思って
書き込みしました。
3Dのゲーム用の数学本を探してみます。
レスありがとです。ももーい。




481 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 21:55:57.25 ]
C++で構造体を使うことというのはありますか。
変数も関数も定義できるクラスだけでOkだと思ったのですが

482 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:09:51.21 ]
>>481
C互換のAPIを使うときなどは使わざるを得ない。
そのほかにも私の場合、レガシーな構造体で充分なときはstructを使う。
要は、メンバ変数を公開するかどうかかな。


483 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:37:08.26 ]
構造体でもメンバ関数定義できるでしょ

484 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:52:40.05 ]
>>482>>483
勉強になりました。ありがとうございます。

485 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 23:47:09.72 ]
>>483
メンバー関数定義したらクラスじゃね?
構造体(POD または データブロック)として使用すると、
仮想関数テーブル破壊するから極めて危険。

ちなみに、俺インターフェース用のクラスとか
メンバーが全部publicならstructにしてる。

486 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/06(金) 00:08:34.25 ]
禿が設計ミスしたから class はヌルー、割り切ってすべて struct
テンプレートテンプレート引数くらいだね class なんか使うのは
private も下痢糞だがしぶしぶ使う
他言語との上っ面だけの横並びなんかウルトラどうでもいい

487 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 13:28:43.82 ]
俺はCでコンパイル可能なのはstructでそれ以外はclassにしてる
使い捨てソースは全部structだけど

488 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 14:29:09.23 ]
構造体は,《クラスキー》structを付けて定義するクラス。
共用体は,《クラスキー》unionを付けて定義するクラス。

489 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 15:53:22.18 ]
用語としてのclassか、C++キーワードとしてのclassか
文脈から読み取らないと混乱するよ

490 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 18:29:03.06 ]
簡単な数式を引数でとって結果を返す関数をテンプレートで書こうとしてます。
template<class II, class PD, class CT>
int sansuu(II pos, PD n, CT tr)
{
for (; 0 < n ; --n, ++pos)
{
---> ここの書き方 if( tr.eq(*pos, '0') )
{

}
}
return 0;
}

int main(int argc, char* argv[])
{
const char* p = "1+1";
ここの書き方 sansuu(p, strlen(p), char_traits<char>);
const wchar* wp = L"1+1";
sansuu(wp, strlen(wp), char_traits<wchar>);

インプットイテレータとサイズを引数にして、あとcharとwcharでも
使えるようにしたいんですがどうしたらいいのでしょうか
stringを見たらchar_traitsとかあったんですがよくわかりませんでした。
お願いします。



491 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:03:20.38 ]
>>490
いいたいことはわかるんだけどまずcharだけでいいから動くもの書ける?
forの中身を全部教えろはうんざりだな

492 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 19:12:10.50 ]
>>491
中身のアルゴリズムの質問ではないんです。書き方が悪くてすいません。
テンプレートの使い方がよくわからないので、そこのところをお願いします。

493 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:17:20.53 ]
>>490
どうでもいいが、IIとかPDとか大文字だけの名前使うと
プリプロセッサと衝突するぞ

494 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:20:44.17 ]
じゃあとりあえず非テンプレートでちゃんと動くwchar_t版書いてみるところからはじめようか

495 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:21:54.66 ]
>>492
困ってるポイントがわからんから、まずテンプレートを使わず
char固定でコード書いてみてくれないか

496 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 19:34:06.85 ]
char_traits 使ってるのに strlen というあたり違和感ありあり

497 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:34:16.31 ]
>>492
とりあえずテンプレートの使い方ってことで
codepad.org/L461ZCtg

498 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:42:13.30 ]
>>497
ありがとうございます。
でもこれだと
if(*it=='+')
のところでwchar_tとcharを比較してしまうとおもってどうにかしたほうが
いいと思ったんです。

499 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:55:13.05 ]
>>498
char*はascii互換文字コード(ASCII,SJIS(MS932),EUC-JP)で入ってる文字はASCIIコード内だけ
wchar_t*はUTF-16 or UTF-32で入ってる文字はASCIIコード内だけ
という前提なら一応大丈夫・・・のはず

ASCII範囲外の文字も使うならwchar_t*だけで実装して
使う側が文字コード変換する方が良いんじゃね?多分

500 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:58:19.95 ]
追記、ascii互換文字コード(〜, UTF-8)



501 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 20:13:07.49 ]
codepad.org/hY36a3Gc
そういう中途半端なことするのやめろよ

502 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 20:32:22.44 ]
>>501
ありがとうございます。
まだ読みきれてないですが勉強します

503 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 20:46:08.50 ]
widen

504 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 18:55:48.67 ]
なんで書き込みないんここ

505 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 19:20:38.67 ]
お前が書き込まないからだよ

506 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 23:20:34.47 ]
C++のことが好きになってしまいました

507 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 23:21:52.18 ]
>>506
まずはお友達から。

508 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:55:07.85 ]
>>506
まずはCから

509 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 19:15:56.87 ]
time.h以外に興味ありません

510 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 21:27:42.52 ]
int* p = new(0) int;

pが0になる保証ってありますか?



511 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:00:03.12 ]
ヌルポに書き込んでる時点で鼻から悪魔

組み込み系とかで0番地にどうしても書き込みたい場合ならpはヌルポになるだろうけど、
普通はその前にアクセス違反で死ぬ

512 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:04:16.87 ]
と思ったけど g++ だと死なないな
int() じゃないからかと思ったけど、
int() でも死なないし、あまつさえ int(1) でも死なない
一体どう言う事だ

513 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:21:41.97 ]
あ・・・ヌルポだからメモリ確保に失敗したと思って初期化しやがらないのか
なら、0 になる事は保証されてるっぽいな

514 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:09:03.72 ]
>>510
void* をひとつ取る配置用の operator new は引数をそのまま返す。 (18.6.1.3 p2)
そして noexcept で宣言されているので、ヌルを返すことはメモリ確保失敗の意味になる。
その場合、初期化は行われず new 式の結果がヌルになるとされている。 (5.3.4 p13)

というわけで、その p は必ず 0 と等しくなる。
・・・ void* より優先される operator new のオーバーロードが宣言されてなければね。

515 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:57:16.16 ]
>>510
どんな 性癖の人が使うの?

516 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:05:37.41 ]
>>514
うぉぉ、わかりやすい説明だぜぇぇぇぇぇ。
プレースメントnewは殆ど使わないから
すぐ挙動を忘れちゃう(´・ω・`)

517 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 02:48:18.14 ]
ヌルヌルポか

518 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 12:09:56.25 ]
>>511-
ガガガガガッ

519 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 15:38:19.28 ]
ifstreamとgetlineで外部のファイルを1行ずつ読み込む処理を作りました。
しかしリリースモードで実行すると1行ずつ読み込めません。デバッグモードでは問題なく読み込めました。
原因が分かる人がいたら教えてください。 ちなみにvs2008を使っています。

520 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:16:17.36 ]
読み込むテキストファイルは同じやつか?



521 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:47:48.38 ]
どうせ未初期化の変数の値を使ってるとかの類

522 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:13:41.18 ]
さもなきゃカレントディレクトリのファイルを読もうとしていて、
DebugとReleaseでカレントが違うことを失念しているとか。

523 名前:519 mailto:sage [2012/04/13(金) 17:27:10.86 ]
getlineは通常に動いてました。すみません。
>>521さんの想像通り未初期化の変数が誤動作の原因でした。

>>520-522
アドバイスありがとうございました。


524 名前:デフォルトの名無しさん [2012/04/14(土) 01:20:20.19 ]
1 0.1
2 0.2
3 0.3
...
みたいにintとdoubleが交互にならんだ入力を、
istream_iterator<int> a(cin);
istream_iterator<double> b(cin);
で交互に読み取りたいのだが、(テーブルの列読み込み)
while (a!=istream_iterator<int>()) {
int x = *a++;
double y = *b++;
}
てやっても評価順が制御できなくて困っています。
どうすればいいんでしょうか?

525 名前:524 mailto:sage [2012/04/14(土) 02:00:41.50 ]
なんか、上のサンプルを作ろうとしたけどうまくいってしまう。
問題が別のところにある可能性もあるから、ちょっと待ってくれ。

526 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 02:12:54.47 ]
うまくいってるならそれでいいんじゃねーの?w

527 名前:524 mailto:sage [2012/04/14(土) 02:32:52.43 ]
どうもfor_eachとのからみでおかしい。
C++0xがはいっちゃうけど、流れでここに出させてもらいます。
入力は
-1 0.3
-1 0.8
...
みたいな、doubleは適当な乱数。
1/1000くらいの割合で評価順が逆になる。

#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{
auto b = istream_iterator<double>(cin);
for_each(istream_iterator<int>(cin),istream_iterator<int>(),[&b](int n){ if (*b++<0) cout << "fail" << endl; });
}
}

528 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:15:36.16 ]
乱数で0とか浮動少数じゃない数値になってんじゃないの
乱数やめて固定値でやtってみたら

529 名前:524 mailto:sage [2012/04/14(土) 03:44:48.16 ]
そうね。ちょっと適当にやりすぎたわ。
istream_iteratorがバッファリングでもしてるのかと思ってしまった。

530 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 09:56:55.43 ]
>>527
それじゃだめだろ。istream_iteratorの実装によってはインスタンス生成時に値を一回読む。



531 名前:524 mailto:sage [2012/04/14(土) 10:01:34.51 ]
>>530
まじかw
1/1000って書いたけど1/10000でもあったから、
調べてみたらたしかに1行目でドジってるw

この目的を達成するために仕様に沿った形で書けますか?
ちなみに使うときは527みたく
for_each(istream_iteratorA,...,istream_iteratorBを使った関数)
の格好(入力イテレータで読む)で。

532 名前:524 mailto:sage [2012/04/14(土) 10:09:20.74 ]
>>532

a=...
b=...
for_each(...)

別の発想で交互に読み込むことを保証するイテレータの組をつくることはできないか?

533 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 10:46:08.64 ]
>531 読み込みが決まり切ってるなら型を起こせばいいんでは?

#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

struct i_and_d { int i; double d; };
istream& operator>>( istream &is, i_and_d &id ) { return is >> id.i >> id.d; }
ostream& operator<<( ostream &os, i_and_d &id ) { return os << id.i << "," << id.d << endl; }

void testprint( i_and_d x ) { cout << x; }

int main() { for_each( istream_iterator<i_and_d>(cin), istream_iterator<i_and_d>(), testprint ); }

534 名前:524 mailto:sage [2012/04/14(土) 10:56:59.48 ]
ありがとう。return os << endl;ってできるの知らんかった。
ですが、API上、iとdは別のイテレータにしておかないといけないんです・・・


535 名前:524 mailto:sage [2012/04/14(土) 11:15:24.98 ]
いま自分で実装しようとして引っかかったんだけど、
bool operator==(const istream_iterator&, const istream_iterator&)
ってどう定義すればいいんだろ・・・

536 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:05:58.99 ]
API上別にしないといけないってどういう事?
あるタイミングで i を使って、別のタイミングで d を使うって事?
使ったかどうか覚えておけばいいだけのような

537 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:15:17.88 ]
>>534
APIって何?WinAPI? 自作エンジン操作するAPIとか?

538 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:26:28.24 ]
とりあえず、実際に使う部分を見せて欲しいな
関数名が秘密ならそのあたりは変えていいから

539 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:35:58.11 ]
>>535
イテレータ内部でストリームを basic_istream<charT,traits>* in_stream; で保持しておいて
return lhs.in_stream == rhs.in_stream; するのがstdでのやりかた

540 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:45:03.82 ]
>>524
こんな感じ?
ideone.com/n5AKA





541 名前:524 mailto:sage [2012/04/14(土) 14:43:12.69 ]
寝てたんで見るのがおそくなった。すまん。

>>540
が綺麗なんで、APIを変えることにしました。
単体の列をストリームで扱えるようにしたかったんだけど、
行ごとに読み込むストリームのほうがたしかに自然だな。
可変テンプレート引数をとるようにして(my_iter<int,double,double>)
tuple<int,double,double>が値になるようにすればテーブル読み込みできるね。
read()を書くのがちと面倒くさそうだが。

542 名前:デフォルトの名無しさん [2012/04/14(土) 18:04:19.59 ]
template <typename T, typename U>
void f(tuple<T,U>& t) {...}
template <typename T, typename U>
void f(pair<T,U>& t) { f(tuple<T,U>(t)); }
みたいな多重定義を避けられる方法ってないですか?

ただし、なんでも受け付けちゃう
template <class PairType>
void f(PairType& t) {...}
ってのは無しで。

(コンパイルでtuple<int,int,int>をつっこんでたらエラーが出るように)

543 名前:541 mailto:sage [2012/04/14(土) 18:15:50.84 ]
>>542
template <typename T, typename U, template <typename...> pair_type>
void f(pair_type<T,U>& t) {...}
かなぁ・・・他にいい案があったら教えて下さい。

544 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:35:55.99 ]
template<typename T,typename U>struct pair{〜;operator tuple<T,U>&(){return tuple<T,U>(*this);}};

545 名前:541 mailto:sage [2012/04/14(土) 18:42:36.84 ]
std::pairの仕様みてもそんなの無いんですが、暗黙の変換をどっかで定義しろってことですか?

546 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:52:58.80 ]
>>542

template<class T, class U> class tuple
{
  ・・省略・・
  tuple( const std::pair< T, U > value ){省略}
  ・・省略・・
};

もしくは、

template<class T, class U> tuple<T, U> to_tuple( const std::pair &value )
{
  return tuple< T, U >( value );
}



547 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:11:59.04 ]
c++0xにstd::tupleというのがあってだな・・・
スレ違いの話題で混乱させてしまってすみませんでした。

548 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:27:08.97 ]
脳内でネームスペースを勝手に補完したらダメだよね。

549 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:35:16.21 ]
m(__)m

550 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:50:26.85 ]
c++0x ってどんな風に入力したらこうなるんだ?



551 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 20:02:17.12 ]
俺はSTLマスターだが質問あるか?

552 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 20:05:47.40 ]
ないわー

553 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 21:18:41.74 ]
ないない

554 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 22:30:07.35 ]
>>551
std::messagesってどうやってつかうの?

555 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:16:35.57 ]
std::set<T>のインスタンス同士の一致比較(つまり、同一の集合であることの確認)ってどうやるの?
T型の要素はソートされて格納されるそうだから
インスタンスをa, bとして、a.begin()〜a.end()までとb.begin()〜b.end()をそれぞれ比較して
全部一致することと同値なのだろうか
それとも、STLの仕様的にはそこまでは保証されておらず、上の方法はたまたまうまくいっているか、処理系依存で、
やはり比較前に自前でaやbに格納されている要素をソート等せねばならないのだろうか


556 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 03:03:52.36 ]
結論だけいうと==でやれ

557 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:29:58.92 ]
> インスタンスをa, bとして、a.begin()〜a.end()までとb.begin()〜b.end()をそれぞれ比較して
> 全部一致することと同値なのだろうか

同値でしょ。

要素値を比較する前に双方の要素数を比較した方が良さそうな気がする。
// 要素数チェック
if(a.size()!=b.size()) return(1);


558 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:38:51.16 ]
mismatchでやれ

559 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:56:31.96 ]
比較オブジェクトが同一かも検査したほうがいいんじゃないか?

560 名前:555 mailto:sage [2012/04/15(日) 15:52:01.26 ]
レスdクス
とりあえず要素となる型に<演算子が定義されていれば
(ていうかstd::set<T>のTの用件なのでそもそも定義されている前提)
少なくともVS2010では>556の方法で逝けるみたいです!

STLのマニュアルとして↓ここ見ながらやってたんですが、
www.cplusplus.com/reference/stl/
グローバル関数でset<T>& operator==(set<T>&, set<T>&)が定義されるとか
どこにも書いてなかったから気づかなかったorz




561 名前:555 mailto:sage [2012/04/15(日) 15:54:45.55 ]
訂正
誤: set<T>& operator==(set<T>&, set<T>&)
正: bool operator==(const set<T>&, const set<T>&)

562 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:06:06.28 ]
std::setは赤黒木。
赤黒木は同一要素からなる集合に対してはbegin() 〜 end()までの順序構造も同じ。
だから単にsizeを見た後iteratorを回してoperator ==での直接比較か
operator <(or operator >)x2で同値比較すればよい。

563 名前:555 mailto:sage [2012/04/15(日) 16:22:00.26 ]
スマン>560でボケたことを書いたorz
要素型Tのless than演算子(operator<())だけでは
一致比較できるわけないじゃんorz(多分bool operator==(const T& a, const T& b)が必要)

set<int> a, b;についてはa==bで一致判定できましたが
Tが自作クラスの場合は要検証です検証中なう

564 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:35:32.67 ]
大抵赤黒木で実装されるけど
赤黒木でなければならないと規格で決められているわけでもない

565 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:42:12.29 ]
>563 !(a<b) && !(b<a) だな。562も書いてるけど。

566 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:46:30.43 ]
>>565
a,bの間に全順序の存在しか仮定しないときに、
果たしてそのコードでa==bと同値になるのか
冷静に考え直したほうがいいんジャマイカ、

567 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:59:04.51 ]
いやすまん>565でいいのかorz (!(x<y) && !(x>y)) ⇔ (x≧y && x≦y)⇔ (x == y)
結局、Tについてoperator<()が定義されていれば、
set<T> a, b; についてa==bできるっぽい
(実際Tを自作クラスとしても、Tのoperator<()を定義したらVS2010で動いた)

568 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:59:18.77 ]
std::setのoperator==ではstd::equalが使われstd::equalでは>>555のように比較される
というようなことをごちゃごちゃ書きたくなかったから>>556みたいにレスしたけど
ちゃんと解説したほうがよかったな

www.cplusplus.com/reference/stl/set/operators/
ここにも書いてあるぞよく読め

569 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:21:33.47 ]
>std::setのoperator==ではstd::equalが使われstd::equalでは>>555のように比較される
なるほど、、いつどのアルゴリズムを使うのかきちんと決まってるのか
std::equalの定義(というか規格上の等価テンプレート)みたら、
Tについてstd::equalが使われる場合、Tについてoperator==()は必須みたいですね
>567の最後の行は撤回(実はoperator==()が定義されてた)

570 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 00:14:55.06 ]
最近C++を勉強しだしたんだが
とりあえず学んだ範囲で簡単な電卓を作ってみたけど
なんか自信がないw動くけど 無駄な事してないかとか
ツッコミを入れて欲しい
codepad.org/uz46AcHY



571 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 02:15:07.23 ]
>>570
・グローバル変数の使用は避ける。
・calculatorの中で初期化とされてるのは初期化でなく代入。初期化と代入は別物。
・なぜcalcuratorの中でanswerに代入(初期化)?

・// a:Aの値。
 ソースを先頭から読んだ場合この時点ではAの値といわれてもなんなのか不明。
・// Yと回答されたらループ、それ以外は終了。
 実際の処理との不一致。

572 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 06:28:57.57 ]
このコードに限らずだが広域でのusing namespaceが個人的にヤダな
せめて関数の中でusing namespaceするか、using std::cout;の様に
取り込んどいて欲しい。std系統じゃぶつかりづらいがVectorとか
Listとかありふれた名前は簡単にぶつかる。

573 名前:570 mailto:sage [2012/04/16(月) 16:33:06.78 ]
ツッコミありがとうございます
それをを受けて直してみました
codepad.org/T1qZFJTB

using namespace std;はまだ私にとって「おまじない」でしかないので
std:: を省略できるなら使うか みたいな感じなので・・・

574 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 20:12:09.41 ]
男ならヘッダファイルでusing namespace std;

575 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 20:32:28.10 ]
>>574
そんな男気あふれるあなたにC言語

576 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 22:05:18.63 ]
>>574
ダメ! ゼッタイ!!

577 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 23:39:54.67 ]
>574は漏れもやったが30分で悔い改めた
それはそうと、デカいオブジェクトの実体をSTLのコンテナに格納して
複数個所から参照しつつ必要に応じて追加するということをしたいんだけど
コンテナにinsert()する前後で参照が有効であり続けるようなうまいやり方ってないですかね…
コンテナの要素型を自作クラスでうまく作ればできなくは無いけど標準的なやり方は?

578 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 23:46:58.49 ]
std::listを使う

579 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:18:51.98 ]
using namespace std; がヘッダに書いてあるライブラリを使うことを強制されているんだ!
windows.h が自動的にインクルードされていたり、まさに地獄だぜ。

>>577
listを使うか、間接参照するか

580 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:24:37.62 ]
マクロ展開出力みたいに
ADL展開出力オプション欲しいよな



581 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 02:41:59.29 ]
>>577

なんでもかんでもshared_ptrでくるんじまいなよ! コンテナ用件は自動的に満たされるぜ!

582 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 05:47:00.52 ]
using namespace std; をわざわざincludeするようのヘッダー作ってincludeしまくってるわ
とりあえずusing std::stringとかにかえてみた

583 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 06:57:21.79 ]
お前の using namespace std; のせいで
ライブラリのヘッダでコンパイルエラーが出たわ

584 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 09:46:42.23 ]
しかしこのcodepad、まさかの強制using namespace std;である

codepad.org/wzgxNgw9
codepad.org/PSECxXqW

585 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 10:06:09.92 ]
全部std::付けたり関数毎に書くのは面倒なので自分の名前空間内でusing namespaceしてる
ideone.com/uXfYk
ideone.com/IiwPB

586 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 12:38:41.41 ]
using namespaceはよほどのことがない限り使わないな。
namespace fs = boost::filesystem;
とかはよくやるが。

587 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 13:24:50.23 ]
そんなこともできるんだったな
すっかり忘れてた

588 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 13:32:52.26 ]
using namespaceを使っといて、完成版では置換すればよい。
手間の問題。

589 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 21:48:04.95 ]
using namespace したものを置換するのは困難だぞ

590 名前:デフォルトの名無しさん [2012/04/17(火) 22:09:49.45 ]
テストコードをそのまま本番に持って行ってるわけね



591 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:26:19.01 ]
class Sample
{
 const bool aaa(const a, const b) const
 const int bbb(const c) const
 const Sample(const d) const
}

最近constに触れる機会があったのですが

TYPEはintとかfloatとか
【const TYPE】 aaa(const x) const

質問なのですが、【const TYPE】の部分がconstだと
実際にはどういう利点があるのでしょうか
他の部分がconstになっていると
色々とパフォーマンスに影響がありそうだと直感的に理解できるのですが

(変数には値とかコピーが入るわけですよね?)
戻り値の型にconstがあったからといって特に意味無いような気がしてしまいまして

じゃあ、頭のconstにはどんな意味があるんじゃ!? ということで疑問が湧いてしまったのですが
どなたか意味というか意義というか、教えてくださいまし

592 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:29:04.87 ]
const TYPE&じゃなくてconst TYPEなの?

593 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:29:55.14 ]
>>581
>なんでもかんでもshared_ptrでくるんじまいなよ!
何を言いたいのかわからんが、
確かに「型Tのset」のかわりに「型Tのshared_ptrのset」にでもして
shared_ptr<T>のoperator<()とoperator==()を(適当なスコープで)定義するとしたら逝けそうですな
※ とにかくデカいオブジェクトなので同じものを複数持ちたくない。
  当然insert時は重複チェックをやる。これをも極力高速、極力コンテナに任せにしたいからlistというのもちょっと、、、

>577における「コンテナの要素型を自作クラスでうまく作」るのより良さげな回答だけど
しかしshared_ptrはSTL標準ではないのではないか

594 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:37:54.44 ]
>>591
const病の伝染をやり過ごせる利点がある

class Sample {
  int* p;
  // (適当な構築子)
  const int* GetPtrA() { return p; }
  const int* GetPtrB() const { return p; }
};
であるとして、
  const Sample foo(...);   // constオブジェクトとして構成
  int* p1 = foo.GetPtrA();  // コンパイル時エラー
  int* p2 = foo.GetPtrB();  // おk
  

595 名前:594 mailto:sage [2012/04/17(火) 22:41:43.73 ]
ああスマン頭のconstか
わからんメリットなど無いのではないか
(でもテンプレート絡みでちょっとあるのかも?テンプレートについて人類は何一つ断言できない)

596 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:57:13.88 ]
戻り値はconstにする派ってのもいたと思う
Effective C++に書いてあるけど、正直やりすぎだと思う

597 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 23:04:48.95 ]
レスありがとう
…やっぱり、頭が const TYPE の場合はあまり意味なさそうな感じですか?
恐らくコスト面でも無視できるような違いしかないってことですよね。
実際にもあまり使わないという認識でいいのかな

そういえば、 const TYPE&の存在がありましたね…。
const TYPE& はパラメーター(参照)のstd::vectorのアイテム参照とかグローバル変数の配列の参照を返す時とかに有効な気がしますが
intとかfloatみたいな値を返す時とかに積極的に使う理由ってありますか?

598 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 23:44:43.08 ]
戻り値 const Effective C++ でググれ

>・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる

>例2)
>const Rational operator* (const Ratioanl& lhs, const Rationa& rhs);

>(a * b) = c のようなコードは不正だが、const 指定すればコンパイル時エラーとなる。
>(a * b) = c; これを展開すると、const Rational (a * b) = Rational c となりエラー。

正直こんなのどうでもいいと思うが

599 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:02:43.13 ]
戻り値const派は右辺値参照の登場で窮地に立たされたな

600 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:18:49.01 ]
右辺値参照で何か不都合とかあったっけ?



601 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:21:29.89 ]
右辺値参照とconst絡みで問題なんてないと思うが
教義を貫けない的な話?

602 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:29:13.38 ]
折角右辺値参照を使ってるのに
無駄に複製が発生するようになるからじゃない

603 名前:デフォルトの名無しさん [2012/04/18(水) 00:40:30.17 ]
禿の自刃に殉じた使徒の数知れず (;ω;)

604 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:01:44.61 ]
>>598
>・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる
>・ 戻り値にconstを使うと、問題のある関数
>問題のある関数
メイヤーズ氏もついに演算子の多重定義をdisる境地に達したのか

605 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:23:01.73 ]
「定数式が必要です」と言われてしまいました……教えてください。
「sound_effect.h」に次のように書きました。簡略化しています。

#ifndef SOUND_EFFECT_H
#define SOUND_EFFECT_H
extern const int SOUND_EFFECT_MAX;
class CSoundEffect{
public:
CSoundEffect();
~CSoundEffect();
void RaiseFlag(int Num);
void LoadSet(int SoundSet_Num);
void Play();
private:
int File[SOUND_EFFECT_MAX];
int Flag[SOUND_EFFECT_MAX];
};

そして、「sound_effect.cpp」には次のように書きました。各関数の定義ははぶきます。

#include "sound_effect.h"
const int SOUND_EFFECT_MAX = 45;
CSoundEffect SE_Object;

すると、SOUND_EFFECT_MAXが代入済みの整数定数とみなされていないのか、
「構造体または共用体中にサイズが 0 の配列があります」ということになってしまいます。
なお、extern const intではなく#defineを用いるようにすれば、エラーは出なくなります。
ですが、整数定数の定義には#defineではなくconstを使うようにしろと言われてきたので……

606 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:25:49.79 ]
すみません、簡略化時に#endifを削ってしまいました。
「sound_effect.h」の末尾に#endifがあるものとしてお答えください。

607 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:28:02.72 ]
enum { SOUND_EFFECT_MAX = 45 };でいいだろ

608 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:41:50.09 ]
俺ならメンバ変数にstatic const int SOUND_EFFECT_MAX = 45; ってやっちゃうな
externだとリンクの時に初めて値が入るとかでコンパイル時にそういう風に使っちゃいけないんだろう

609 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:57:38.08 ]
どうしてもexternでやりたいなら
sound_effect.h
extern const int SOUND_EFFECT_MAX= 45;

sound_effect.cpp
const int SOUND_EFFECT_MAX;

だな

610 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 02:20:37.69 ]
クラス定義はマクロじゃないからな。



611 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 04:44:22.33 ]
const定数のリンケージがC++だと、Cと違ってそのモジュール内だけになるからだったか?
そのルールって、C++は定数式で配列が初期化できるからあるってことかな?

612 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 05:03:50.99 ]
黙して共用ヘッダの無名空間に収めとけよ

613 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 07:34:46.83 ]
外部リンケージの const 定数は配列の要素数などには使えない仕様

内部リンケージ(const が付く場合はデフォルト)であっても、
実体定義より前には配列の要素数などには使えない
宣言だけでは無理で、コンパイラは 0 であると仮定してエラー復帰してコンパイルを続けるので
連鎖的に配列が 0 要素だとか変なエラーが出る

class CSoundEffect{
public:
static const int Max = 45;
private:
int File[Max];
int Flag[Max];
};

これでFA
VC6のような化石コンパイラを使わない限りは大丈夫
VC6使うなら enum { MAX = 45 }; で

614 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 17:50:12.27 ]
皆さんありがとうございます。
おかげさまで解決いたしました。

615 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 18:50:22.14 ]
こっちにしようかC++11スレにしようか迷ったけどこっちで。
template aliasで下のコードがエラーになる(clangで)のは何故ですか?
barはfooの別名だと思うのですが。

--
template<typename T> struct foo{ /*empty */ };
template<typename T> using bar = foo<T>;
template<template<typename> class T> struct zot { /* empty */ };
void qux( zot<foo> ){ /*empty */ }

void quux( ){
 qux( zot<bar>( )); // ココ
}

616 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 19:52:51.68 ]
>>586
俺も好き。Java使わさせられるとき
同等の機能が無いから不便で仕方ない。

617 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 19:54:39.53 ]
>>615
未対応だからじゃね

618 名前:デフォルトの名無しさん [2012/04/18(水) 20:32:59.12 ]
zot に bar を渡すときに foo のインスタンス化を要求するからだろ

619 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 21:33:36.47 ]
fooのインスタンス化は出来るんじゃね?
alias使わずqux(zot<foo>());だけならideoneでも通るし

620 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 23:47:55.07 ]
C++規格素人だが>615はコンパイラの常識的挙動に照らしておかしくねえ?
template<typename T> using bar = foo<T>;
でbarを本当にfoo<T>の別名として使ってインスタンス化の片棒を担がせるには
Tの型を明示的に与えるか、型推論できるような書き方であらねばコンパイラ困っちゃう

、希ガス



621 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:15:19.40 ]
すわなち、(省略されている型パラメータUを補完したとして)
 template<typename T> struct foo{ /*empty */ };
のTはfooの自由変数だが、
 template<template<typename U> class T> struct zot { /* empty */ };
において、 U,Tは束縛変数の1, 2であって、テンプレートzotの自由変数は
実は( template<typename U> class T )という全体である

で、void qux( zot<foo> ){ /*empty */ } と書いたなら、この実体化では
zotの自由変数( typename<typename U> class T)のTがfooでUがfooの自由変数T、と解釈できる
(で、Uはzotの定義で使われないからUの定義が無くとも実体化できる。)

一方、qux( zot<bar>() )と書いたなら、barをfoo<T>の別名と解釈するときにTの定義が要るから、
上の話で言うUの定義が必要、という違いがある

、、多分、、

622 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:28:33.86 ]
いま思いついたが>621説を検証するには、>615のコードの3行目を
 template<template<typename U> class T> struct zot { U x; };
に変更したときに4行目の
 void qux( zot<foo> ) { /*empty*/ }
がエラーになるか確かめればある意味一応検証になる
エラーにならなければ>621説は反証される

623 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:52:23.75 ]
struct void std::wstring any();
return 3;

624 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 01:32:56.73 ]
エイリアステンプレートはテンプレートとしては元のテンプレートと別物扱いってことなんだろ

template<class X, class Y> class hoge {};
template<class X> using fuga = hoge<X, X>;

みたいなときはhogeは引数2つのテンプレートでfugaは引数1つのテンプレートとしてふるまうから別物扱いするのが自然だし

625 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 18:36:57.09 ]
WindowsXP以上,VC2003の環境です。
ある特定のウインドウの位置の変更や、サイズの変更があった場合に
通知を受け取るにはどうすればよいでしょうか?
いまは、ループでずっとGetWindowRect()を呼んでいます。

626 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 18:41:08.73 ]
イベントにWM_SIZEってなかったっけ?

627 名前:625 mailto:sage [2012/04/19(木) 18:51:46.80 ]
>>626
監視対象が、自分の作ったウインドウ(アプリ)じゃないんですよね。
DLL作ってフックしないといけないんでしょうかね・・・。

628 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 19:23:52.04 ]
ループ使わないなら基本的にはフックじゃね
vista以降は上位権限のプロセスのメッセージは取れないらしいけど

あと使ったことないけどCreateRemoteThreadっていうので何か出来るかもしれない

629 名前:625 mailto:sage [2012/04/19(木) 22:53:19.86 ]
とりあえず、新しいプロジェクトでDLLを作って
WM_SIZE,WM_MOVE,WM_MOVINGをフックできるようになりました。
それで、更新された新しいRECTをEXE側に渡したいのですが、
DLLからEXE側の関数を呼ぶにはどのようにすればよいでしょうか?

630 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 23:59:45.57 ]
.exeの方にdllexportの関数って用意できないっけ?
exeの方のウィンドウハンドルとってきてメッセージでもいいけど



631 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 00:23:32.12 ]
セキュリティで弾かれるのはハンドルを取得する時だけで合ってた?
違うプロセスのウィンドウハンドルを指定してゴニョゴニョは問題ないっけ?

632 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:16:30.45 ]
ヘンタイ仕様のAPIの話って、ここでして良いの?

633 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:22:36.10 ]
Mayaのプラグイン作ってそんなかでFindWindowしてSendMessageしたりしてるけど特にはじかれはしてないなぁ、Windows7ね。
exeが多重起動してたらどれからとってくるかは知らね、目的は果たせたからあんま調べてない。

634 名前:631 mailto:sage [2012/04/20(金) 01:25:31.84 ]
あ、ごめん ここC++スレだった。
でもWin32スレに書いてもまともな返答返ってこなさそうだし困ったもんだね。

635 名前:631じゃなくて633でした mailto:sage [2012/04/20(金) 01:26:30.15 ]
たびたびごめんなさい。

636 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:11:53.23 ]
Windowsは一度公開API群を再設計したほうがいい
仮想化でやってるのは内部的な整合性を保つ為だろうけど
どうせなら今までの粗雑なAPIはレガシー化させて
整合性のあるAPIとして生まれ変わったほうがいい
現状の#defineだらけのヘッダーやら互換性の為に残されたAPIやらは
一度分離してくれたほうがみんな幸せになれる

637 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:12:40.39 ]
>>636
Win64は随分まともになってるじゃないか

638 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:34:17.39 ]
Win64?
DWORD→DWORD_PTRのことかね

639 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:35:23.12 ]
.netのクラスライブラリ群がネイティブになって
winapiは、なくなるのじゃないの?

640 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:42:01.50 ]
現状では.NetのGUIはwinapiをラップしたものでしかないぞ…



641 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 03:04:20.32 ]
メッセージとか継ぎはぎ感が否めないよな

642 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 03:53:34.34 ]
C99対応を前提にして
BOOLもbool型にしとくべきだろうね

643 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 07:01:04.44 ]
>>636
WinAPI使わなきゃいいじゃん
使わない自由はある
MSだって昔は.Net Frameworkで切り捨てるつもりだったんだし

644 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 08:40:17.72 ]
だから WinRT を設計したじゃないか

645 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 10:42:47.33 ]
WPFでGUI APIを一新したかったんだろうけど、普及しなかったな。

646 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 11:38:25.04 ]
粗雑で素朴なCのAPIでもABI的な意味で需要はあるし手間の点はQtとかのラッパで十分とも言えるし

647 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 12:15:25.67 ]
Windows8でAPIが近代っぽいのに変わるんじゃなかった?
Win32APIとかのレガシーなのをやっととっかえる気になったと聞いたが

648 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:01:31.74 ]
.netとかwinrtなんてvmじゃ、いつまでたってもwinapiは撲滅させられない

649 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:21:37.49 ]
俺もWinRTには期待してた
ふたを開ければ機能限定版のWin32APIラッパだった
Windowsにフタをしてやりたくなった

650 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:59:12.08 ]
クラスについて質問です
クラス内にメンバ変数しかなかったら
newする度に変数の分だけメモリを消費するだろうと推測できるのですが
例えば、メンバ変数は2〜3個でも、メンバ関数が100個くらいある場合には
newする度にメモリの消費量が半端ない感じになってしまったりしますか?
クラスのメモリを確保した時の挙動がちょっと気になってしまいまして
詳しい方いらっしゃったら教えてくださいまし



651 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 17:12:53.29 ]
>>650
こうかな??
ttp://ideone.com/8d2zK

クラスのメンバ関数は普通の関数にthisを食わせる暗黙のパラメータがあるもんだと思ってもらえればイイと思うお。
だから、関数のインスタンスは、一個でいいし、最適化すればクラスに内包してる必要はないと思う。
ちなみに、テンプレート関数にするとちょっと事情が変わってくる。

652 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:02:11.61 ]
template<typename T> class boo
{
friend class T;
};

こんな具合にテンプレート引数をフレンドクラスにしたいのですが方法教えて下さい。

653 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:39:22.82 ]
クラスのメンバでistream&をもってるんだけど、デフォルトは何で初期化すればいいの?
class A {
istream& is;
A(): is(???) {}
A(istream& is): is(is) {}
};

654 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:41:08.84 ]
悪い事は言わないから参照ではなくてポインタを使いなさい。

655 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:41:11.70 ]
初期化できないのでA()は定義しちゃダメ

656 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:42:03.98 ]
>>653
参照だと色々不便な気がするけど大丈夫なの?
んで、デフォルトコンストラクタをProtectedにするとか・・・。

657 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:46:06.02 ]
すまん、もちろんpublic:を忘れている。
ストリームの終端をA()で表現して、
iter!=A()
的な判定をするんだが、654の根拠は何?
iostreamってあぶなっかしい?

658 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:50:04.32 ]
>>657
いや、参照は初期化時以外に実態を束縛できないのでNULL参照になりやすいからアブネーという話だと思うよ。

659 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:53:19.88 ]
istream&じゃなくてistream_iteratorとか持ったら?

660 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:54:35.39 ]
コンストラクタを別の場所から呼び出すのにthisを使う、次のようなコード(拾ってきたもの)
って規格的にはアリでしょうか?

struct sample_class
{
int value;
sample_class(int i): value(i) {}
sample_class() {
*this = sample_class(10);
}
};




661 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:57:04.04 ]
ありだけどそれぐらいならsample_class() : value(10) { }ってしたほうがいいだろ

662 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:59:04.72 ]
>>658
ふむふむ、あんまそういうのに遭遇したことがないからよくわからんが、
シングルスレッドでワンショットで終わっちゃう(走り続けない)ようなソフトでもヤバイのかね?

>>659
そういう人もったことないけど、やってみるわ。アイディアありがとう。

663 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:02:31.54 ]
>>662
実態が生きてるうちは大丈夫かな。デストラクタ走ったら死亡コース。

664 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:07:11.12 ]
>>663
なるほど。自分が書くような小さいプログラムだと、
mainの最後だけでデストラクタ呼ばれるパターンが多いから、
いつも気にしてないんだよね。
でもこれからは気をつけてみるわ。ありがとう。

665 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:21:45.54 ]
>>652
11ならこれで通る。(gccだと4.7以降)

template<typename T> class boo
{
friend T;
};

98だと直接は無理でメンバ関数をfriendにするしかないかな
codepad.org/Ako1qKqh

666 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:37:27.70 ]
さっきのistream_iteratorを使えばいいという話ですが、これが通らない・・・
メッセージが邪悪すぎるから、誰か助けてくれ〜
#include <iostream>
#include <utility>
#include <iterator>
using namespace std;

istream& operator>>(istream& is, pair<int,int>& p) {
is >> p.first >> p.second;
return is;
}
int main()
{
istream_iterator<pair<int,int> > is(cin);
}

667 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:16:13.35 ]
グローバルフックするDLLからEXEに通知を受け取るために、
boost::functionをDLL側に渡して、DLLから呼び出したんですが
デスクトップ、スタートボタン、タスクバーが消えましたww
どうしたらよいでしょうか?
(コンソールアプリや他ライブラリでDLLを使いまわしたいので、
ウインドウメッセージでは受け取りたくないんです)

いまこんな感じです↓
>// EXE側
>boost::function<bool(STRUCT&)> func = &CallbackFunction;
>StartHook(func);

>//DLL側
>boost::function<bool(STRUCT&)> callbackFunc;
>EXPORT BOOL StartHook(boost::function<bool(STRUCT&)> &func)
>{
> callbackFunc=func;
> :
> callbackFunc(struct);
>}

668 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:23:33.48 ]
>>667
そんなことできるわけねーだろアホか

669 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:42:36.38 ]
>>666
あんまりいいサンプルじゃないけどこういうのも有るよ的な。
ttp://ideone.com/qaals


正直、std::cinは使ったこと無いからメチャクチャ大変だった。そして、勉強になった。

670 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:47:36.28 ]
>>669
う〜ん、求めているものではないなぁ。
とりあえず、コンパイルエラーの意味がわからんかったんだが、
それに関して何かコメントない?



671 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:51:02.72 ]
>>670
テンプレートを使った実装を使うときにエラー起こすと意味不明な文字の羅列が出て上級者でもイラッと来るらしい。
で、コンセプトっていう機能が入る予定だったけど、ウヤムヤになって空中分解した。
コンセプトがあればエラーメッセージはもっとシンプルになる予定だったそうな。

672 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:58:11.19 ]
別に空中分解したわけじゃないよ
コンセプトマップをユーザーが定義すべきか自動で定義されるべきかが決まらなかったのでC++11に入らなかっただけ

673 名前:650 mailto:sage [2012/04/20(金) 23:59:43.85 ]
>>651さん
virtutal属性とかテンプレート関数の有無が鍵になる感じなのですね!
便利なクラスにする為に大量にメンバ関数を作る分には問題ない事が分かったので
安心してクラスを作り込みたいと思います。
ちょっと返信遅れちゃいましてごめんなさい。
どうもありがとうございました!

674 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:00:12.19 ]
すまん。ちょっと誇張した。

675 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:01:13.04 ]
>>674 -> >>672

676 名前:デフォルトの名無しさん [2012/04/21(土) 00:03:44.63 ]
>>672

677 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:03:57.15 ]
>>671
メタプログラミングとかでエラー出ても、メッセージの雰囲気でけっこうわかるんだが、
stringとiostream関連はいまだに読めないw

678 名前:デフォルトの名無しさん [2012/04/21(土) 00:09:21.77 ]
>>666
は神待ちです。

679 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:12:42.02 ]
パンピーで悪かったわね。

680 名前:677 mailto:sage [2012/04/21(土) 01:11:26.04 ]
すいません、色々調べましたがギブアップです。

EXEからDLLにコールバック関数を登録して、DLL側から構造体を受け取るにはどうすればよいでしょうか?
EXE(またはコンパイラ)が変わってもDLLを修正せずにできる方法でお願いします。



681 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:38:32.64 ]
shared_ptr使えばいけるじゃないの?

682 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:48:01.02 ]
exeが適当なウィンドウを作って
dllがFindWindowでexeが作ったウィンドウを見つけて
そのウィンドウハンドルにWM_COPYDATAで構造体を送り付けたらいい

683 名前:677 mailto:sage [2012/04/21(土) 01:54:10.77 ]
コンソールアプリや関数だけのライブラリからも呼びたいので、
メッセージは使いたくないんです><

関数ポインタはDLLとEXEでアドレス空間が違うんですかね><

>// EXE側
>
>bool CALLBACK func(STRUCT struct){
> return true;
>}
>
>int main(){
> StartHook((LPVOID)&func);
> :

>// DLL側
>EXPORT BOOL StartHook(LPVOID func) {
> STRUCT data;
> data.dat = 0;
>
> bool (*callback)(STRUCT);
> callback = (bool (*) (STRUCT))func;
> callback(data); // ←この次の行の関数呼び出しでランタイムエラー
>




684 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:57:11.92 ]
共有メモリとか名前付きパイプとか

685 名前:677 mailto:sage [2012/04/21(土) 03:43:58.56 ]
共有メモリだと、フラグとか値が変わるのを無限ループで監視しないといけないですよね?
それは無駄に重くなるのでやりたくないんですよね。。。
名前付きパイプ調べてみましたが、イベントってのが使えそうな気も・・・。

それと、DLLからEXEの関数呼び出しはなんとなくできました。
EXE側の関数をdllexportして、DLL側からEXE側にGetProcAddress()して関数アドレスを取得して
呼び出せました。これなら新しいEXEを作るときもDLLを変えずに済むかなと思ったのですが、
フックプロシージャからEXE側の関数を呼び出すと、なんかダイアログ出てきてシステムに無理やりDLLをとめられました・・・。
自分のミスなのか、フックプロシージャ内はなにか特別なのか??

686 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 03:48:34.25 ]
当たり前だろ
フックされたプロセスとフックを仕掛けたプロセスは違うんだから
呼び出せるわけがない

687 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 03:59:22.71 ]
どうでもいいけどC++関係ねぇ

688 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 04:01:23.44 ]
そろそろ
toro.2ch.net/test/read.cgi/tech/1333095907/
こっちに移るべきだな

689 名前:677 mailto:sage [2012/04/21(土) 04:04:56.72 ]
>>686
そうなんですか・・・。
EXEと静的リンクしたDLLは同じプロセス空間、
DLLのフックプロシージャの中は別のプロセス空間ということでしょうか?

690 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 07:05:04.65 ]
>>662
コンストラクターの引数は参照で、
内部ではポインターで保持したら?



691 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:49:36.25 ]
c++ではmallocとfree関数はつかわないんでしょうか?
newとdelete演算子ですか?

692 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:51:40.35 ]
deleteも使わない

693 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:53:15.77 ]
えっそうなのw
横から便乗で質問だけど、コンストラクタ・デストラクタ呼び出したい時はnew deleteなのはわかったけど
その必要がない場合でもnew deleteすべき?

694 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:53:56.00 ]
そんな質問する様なら、1つ良い事を教えてあげる。

混ぜるな危険!

695 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:17:08.33 ]
newは遅いという説が・・・・

696 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:22:17.05 ]
>>695
右辺値参照で改善に期待。

697 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:24:19.29 ]
>>695
placement newでおk

698 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:53:22.07 ]
newの中身は普通はただのmallocだよ
他にはコンストラクタも動かすけど、それはplacement newでも同じ

699 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 11:41:10.25 ]
>>697
placement newを教えるからにはstd::aligned_storageもだな…。

700 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 11:42:27.96 ]
そしてoperator new の闇に嵌まって逝く訳ですね



701 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 13:38:50.23 ]
>>666
istream_iteratorの中からは自分でグローバルに定義したoperator >>が見えない(stdのoperator >>に隠蔽される)からエラーになる。

・解決法の一つ。stdじゃない場所に自分で定義したクラスを介する。

class mypair
{
pair<int, int> p;
public:
mypair() : p() {}
mypair(pair<int, int> const & p1) : p(p1) {}
operator pair<int, int>() const { return p; }

istream & readvalue(istream & is) { return is >> p.first >> p.second; }
};

istream & operator >>(istream & is, mypair & pr)
{
return pr.readvalue(is);
}

int main()
{
istream_iterator< mypair > is(cin);
pair<int, int> p = *is;
}

702 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:01:10.22 ]
>>691
malloc()は使用する必要性がほぼ0になるが
個人的にはrealloc()はしばしばまれに使うべ
std::vector()が使えるならそれに越したことは無いが


703 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:15:42.26 ]
>>702
> しばしばまれ

どっちなんだよ…

704 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:19:38.93 ]
reallocはPOD型(C++11では概念変わったけど)にしか使えないのがねえ
まあ、環境依存でいいなら多少危険でも使えるケースはもうちょい多いと思うが

705 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 20:25:59.49 ]
>>701
諦めてたのですが、有り難い限りです!


706 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 23:52:24.21 ]
デフォルトのnewだとサイズsで取った領域をサイズs+1にしたいとき無条件にnewし直ししかないじゃん?
realloc()はヒープ管理のリンクリストに直に触るから、サイズsの既存分を動かさずに済むことがある
std::vector<T>が中で何やってるかは知らんが、案外realloc()を呼んでいるのではないか


707 名前:デフォルトの名無しさん [2012/04/21(土) 23:55:39.79 ]
>>706
reserveで出来なかったっけ?

708 名前:デフォルトの名無しさん [2012/04/22(日) 00:01:56.82 ]
newのデフォルトの実装は、環境やコンパイラに依存だろ。
reallocとかと混ぜる根性がよくあるな、おまえら。

709 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:02:23.30 ]
>>706
実装によるけど一般的には、vector<T>は要求よりも多めに確保して現在の利用状況をリポートする。
領域確保時は、何だったかな、現在の1.5倍だったかの領域をnewしてコピーするんだったかな。
まー、実装依存だわね。

710 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:09:22.80 ]
>>706
reallocなんで呼ぶわけないだろw
事前確保の容量超えたら新しくnewしてコピー/ムーブだよ

>>709
GCCとMSVCがそれぞれ1.5倍と2倍(どっちがどっちか忘れた)だったはず



711 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:08:33.21 ]
勝手にコピーや元の領域の開放を行わないreallocがあれば
vectorもどきを作るのに使えるのにね・・・
伸ばせるなら伸ばす、伸ばせなければ失敗、
あるいは、新たな領域を確保して、それを返すだけ、という

712 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:14:34.54 ]
>>711
誰がコンストラクタ走らせるの?
そういう用途はプレイスメントnewという機構があるよ。

713 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:15:34.87 ]
>>712
vectorがどういう風に実装されてるか知ってる?

714 名前:デフォルトの名無しさん [2012/04/22(日) 01:19:53.01 ]
実装を知らないと使えない、とか、
オブジェクト指向と言うかC++の思想に反するよな。

715 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:23:08.37 ]
>>714
何を言ってるのか意味が分からない

716 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:23:30.27 ]
>>713
詳しくは知らない。
でも、アロケータにメモリ確保を任せて帰ってきたメモリをプレイスメントnewしてるのかねぇ。
オブジェクトをプッシュバックしたら、コピコンかムーブで移譲だよね。
その段階で破棄されるオブジェクトのデストラクタ走るし。

俺はユーザープログラマだからそんな詳しく知らなくても使える。と、言い訳。

717 名前:716 mailto:sage [2012/04/22(日) 01:25:35.85 ]
アロケータの実装がreallocであることもある可能性は捨て切れない。

718 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:29:43.11 ]
reallocは絶対に使えないのよね
領域が移動する場合に、reallocが勝手に内容をmemcpyするから
ちゃんとしたコピーなりムーブなりが行われない

逆に言えば、この領域移動さえなければ使えると言う事

719 名前:716 mailto:sage [2012/04/22(日) 01:32:35.49 ]
ほぇ〜。そうなんだ。
アロケータのことはよく知らんのよ。実装する機会もないし。

720 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:36:35.68 ]
newした内容をmemcpyでコピーできないのと同じ事さ
アロケータの知識は正直あまり関係ない



721 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:37:04.38 ]
※ただしPOD型は除く

722 名前:716 mailto:sage [2012/04/22(日) 01:47:33.69 ]
>>720-721
なるほど。勉強になるよ〜。

723 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:03:06.82 ]
>>722
PODだろうとmalloc、realloc、freeは使うなよ
おいおいnewで確保したか、mallocで確保したか
管理しきれなくなってバグの原因になりかねんから

PODとCの関数で思い出したが、POD型にmemsetでゼロ
初期化するヤツなんなんだろうな。
Type value = {0}; こういう形で十分だろうに。

724 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:04:10.52 ]
Type value = {};
こうだろ

725 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:11:14.53 ]
>>718>>720
それって、要素型Tにコピーコンストラクタが定義されていれば
どうとでもなるんじゃねwwwwwwwwwww

代入と異なりコンストラクタは構築先が何であるかを問わないから
 (そうでない作りにすると普通の構築時に必ずバグって発覚する、)
生のメモリ領域を与えてから構築することができる

、、ハス


726 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:21:38.13 ]
>>723
それ警告出すコンパイラあるから俺は使わない

727 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:23:10.78 ]
>>725
reallocが内部でmemcpyするって言ってんじゃん
コピーコンストラクタもoperator==もガン無視でbitwiseコピーされる

728 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:24:33.50 ]
>>726
Cの仕様で定義されてるんじゃなかったっけ?
俺はそういうふうに習ったけど。

某らんどとかは、変数の初期化処理に警告だしたりするからな。あれは不味いだろうと思う。

729 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:00:04.36 ]
定義はされてるよ
でも、初期化忘れか、意図的な0クリアかを
コンパイラが機械的に判断するのは難しかろう

730 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:01:59.22 ]
>>726
じゃあどうやって初期化してるの?



731 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:19:43.82 ]
>>727
だからプレースメントnewでrealloc()した後にコピーコンストラクタで構築すればいいでしょキイッ
www.geocities.jp/ky_webid/cpp/language/036.html

というわけで、realloc()とプレースメントnewの組み合わせで
領域が増えたときのコピーの回数をしばしばたまに減らせることがある
C++ばパフォーマンス命の言語


732 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:33:04.27 ]
それともいっこ、単純にあらかじめ大きめの容量を確保しておくという戦略は
使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう欠陥がある
コンストラクタというのは初期化しか仕事しないから高速を要する処理中に極力呼びたくないわけよ
この意味でも常にぎりぎりの領域サイズでrealloc()しつつプレースメントnewというのは
高速処理中にちまちまstd::vec<T>のインスタンスを生成するのに比べたらかなり手堅い
(本当に手堅いのは高速を要する処理開始前に必要なサイズを全部確保しておくことだが)

733 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:49:59.13 ]
命令型言語のPGで新規の領域を不定値のままにして気持ち悪くない奴はカス
なぜなら、命令型言語を選択したPGはその時点でチューリングマシン教の教徒であり、
チューリングマシンは状態の書き換えによって計算を進めるモデルだからだ
そのためのType a = { }だったり(new Typeではく) new Type() 構文だろうノシ


734 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 04:03:38.84 ]
>プレースメントnewでrealloc()した後にコピーコンストラクタで構築
とか意味が分からないけどとりあえず

>使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう
std::vectorもそんな挙動はしないよ?

735 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 04:39:50.99 ]
>>734
>std::vectorもそんな挙動はしないよ?
ちょっwwwwごめwwwwwwwwっうぇwwwwVS2010のstd::vector<T>で今調べたらそうだったわwwwwwww
(確保した要素数しかデフォルトコンストラクタが呼ばれた)

>意味が分からない
サソプル イズ ベスト:
struct TypeB {
 int x;
 TypeB() : x(-1) { }
 TypeB(const TypeB& other) { x = other.x + 100; } }; // コピーされたら100足される

void test2() { const int n = 100;
  TypeB* sizableArray = (TypeB*)realloc(0, sizeof(TypeB) * n);
  for (int i = 0; i < n; ++i) {
    TypeB a;
    a.x = i;
    new(sizableArray + i) TypeB(a);   // It's new!
  }
  for (int i = 0; i < n; ++i) cout << "sizableArray[" << i << "]=" << sizableArray[i].x << endl;
}
実行結果は、sizeableArray[0] = 100\c\rsizableArray[1]= 101\c\r...

736 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 08:46:29.23 ]
語るね〜

終わったら呼んで。

737 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 13:56:10.85 ]
>>731
bitwiseコピーした後にどうコピコンすんだよ
既にアドレス変わってる上に、初期化元は自分自身だろ

738 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:11:44.62 ]
>>737
>new(sizableArray + i) TypeB(a);   // It's new!


739 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:25:17.62 ]
>>738
a って何だ?

740 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:27:32.56 ]
>>739
アドレスsizableArray + i以外の場所にあるTypeB型のオブジェクト



741 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:29:39.39 ]
元データを論理的に保存しないといけないのに
なんで別のものでコピコンすんの?

742 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:34:26.68 ]
>>741
コピコンで元データが論理的に保存されないとする根拠は?

>735のサンプルにおけるTypeBのコピコンにおいて、仮に100を足すのをやめたら
>738で(スタック上の)aと論理的に同じオブジェクトがアドレスsizableArray + iにできるわけだけど?


743 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:35:49.79 ]
>>742
そもそも、realloc したら元データが元の場所から無くなるんだよ

744 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:41:54.04 ]
というか、>>735 読んでなかったが、今話してる事じゃねえよこれ
vectorの伸張の話してんだぞ?

745 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:46:30.01 ]
>>743
ああスマン、それはそうね
p1がTypeBのコピー元配列srcArrayを指しているとして、
 TypeB* p2 = realloc(p1, sizeof(TypeB) * n)
の実行後、p2 != p1でありなおかつsrcArrayの要素がsrcArray内の他要素のアドレスに依存するならそうね

しかし>702以降の流れはstd::vector<T>との比較という文脈なのを思い出してホスイ、
Tにそのような型が許されるだろうか?

746 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:56:54.97 ]
>>711からの流れだと思ってたのだがまあいいや

747 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:51:11.01 ]
>>731
意味が解らん。reallocで1度コピーreplacement newでもう一度初期化。
処理が遅くなるだけだろ何のメリットが有るんだ?

748 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:53:19.14 ]
>>733
命令型ってbashとかzshだろ
メモリ確保は自動で行われるから
確保も開放も意識する必要は無い

749 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:54:29.33 ]
あれだけruby厨だったuy( >>735 )がC++に手を出すようになったか


750 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:00:12.55 ]
>>735
その内容ならmallocでいいだろ



751 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:04:47.26 ]
>>730
memset か std::fill に決まってるジャン(std::fill_n は警告出る事あるのでやはり使わない)
= { 0 } は可読性に劣るとも思うしね
初期化忘れか意図的な 0 クリアかが
コメント残さないと確実に伝えられないから
最初の 0 がある意味マジックナンバーじみているのも気持ち悪い

752 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:30:08.71 ]
普通構造体に = { 0 }してたら初期化だと思うがな。
あと組み込み向けのしょぼいコンパイラーだとこっちの方が早いことがある
逆にmemsetの方が早いってのは聞いたことないけどね

753 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:43:36.33 ]
>>751
それ初期化じゃないじゃん。
それに
={};
で初期化し忘れと読み取るアホはおらんよ。

754 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:04:39.00 ]
= { }; は C で使えないよね

755 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:09:06.33 ]
使えないけど、それがどうかしたの?

756 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:13:57.52 ]
知らない人が結構いそうだから使いたくないわ

757 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:24:10.37 ]
>>747
>reallocで1度コピー
領域拡大時であってもrealloc()だとコピーが起きないことがある
縮小時はもちろんほぼ常に起きないことが期待できる

>replacement newでもう一度初期化。
誰も2回も初期化しないわけだが
つかデフォルトのnewは使えば必ずメモリ確保してから初期化するのに対し、
プレースメントnewはそれ自体はメモリ確保しないから、
メモリがすでに確保されている場合はより早いの
ワカル?


758 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:38:05.66 ]
>>757
理解出来てないなら黙ってろ

759 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:38:21.85 ]
>>748
ソウジャナイ
破壊的代入が本質的(それ無しには何事も進まない)のが命令型言語、
非破壊的代入で全て済ますのが関数型言語
前者はチューリングマシン、後者はλ式をそれぞれ数学的基礎とする

一方で書けるアルゴリズムは他方でも書けるという意味で両者の計算能力は等価
ただし得手不得手はもちろん違う


760 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:41:11.32 ]
>>758
どこらへんがおかしいのかkwsk

つかrealloc()が勝手にコピーするとオブジェクト必ず壊れるとか思ってる?
std::vector<T>の要素型として使える型Tについてはそれは心配せんでええ




761 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:50:37.51 ]
>領域拡大時であってもrealloc()だとコピーが起きないことがある
>縮小時はもちろんほぼ常に起きないことが期待できる

どういう理屈なんだ?

762 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:51:25.25 ]
>>759
お前が言ってるのは手続き型だろ

763 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:54:06.90 ]
>>759
関数型は、演算式と制御文を全て関数で記述する事を目的とした言語
破壊的代入が無いというだけだと宣言型とダブるので、
破壊的代入が無い = 関数型というのはおかしい

764 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:03:04.70 ]
>>761
K&Rの終わりぐらいに書いてあるmalloc()の実装例でも読めばおk
サイズs1、s2の領域がこの順で隣接しており、s2が開放されたなら
サイズs1をサイズs1+s2までコピー無しで拡大することができる
(※簡単のため管理用のヘッダサイズは無視)

>>762
関数型言語であってもリストで手続き(順序的な処理)を表わせるから
手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念
Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、
手続き型というのはそれの対義語


765 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:12:41.32 ]
>>763
宣言型というのは、ようわからんが非手続き型っていうのとほぼ同義ジャネ?
破壊的代入無しでチューリングマシンの計算能力と等価な言語、
といえば多分λ式ベースの言語(つまり関数型言語)しかないんじゃないかなあ、、
なお、関数型は、(関数で)新しい関数を作り出すことしかしない故に関数型


766 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:12:47.96 ]
>>764
mallocじゃなくreallocの内部の話なんだけど
実際コピーしない処理系が存在するのか?
gccのreallocはソース公開されてるがコピーしてる
実際どの処理系がしてるんだ?
普通に考えてもmalloc内部の実装に依存するreallocなんてクソだろ

767 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:15:18.80 ]
>>764
>関数型言語であってもリストで手続き(順序的な処理)を表わせるから
>手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念
>Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、
>手続き型というのはそれの対義語

お前だけの常識で語られてもなぁ

768 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:32:45.54 ]
>>766
realloc()をmalloc()と別階層とすべきですかそうですか、、
コピーを生じない処理系の具体例については、
少なくとも下記コードをVS2010で走らせるとp1 == p2なんだけど?
  void* p1 = malloc(1000);
  void* p3 = malloc(1000);
  free(p3);
  void* p2 = realloc(p1, 2000);
  cout << "p1=" << p1 << ", p2=" << p2 << endl;

glibcのソースをよく読みなおすことをお勧めする

>>767
漏れだけの常識がどうかはようわからんが、そうなの?
>764で妥当だと思うがなあ〜


769 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:35:05.31 ]
で、いつまでちんたらちんたら続くんだ?

770 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:36:14.02 ]
>>760
おいおい、オブジェクト領域でreallocなんか使ったら壊れるだろうがw

ポインタ関係が全部おかしくなるわ。



771 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:38:31.10 ]
>>768
サイズ変更が「可能な場合」はコピーされない。不可能な場合はコピーされる。


コピーされる場合はありえるんだが、たまたま特定環境化で動作するから使っていいとかアホの極み。ドシロウト。

仕事でそれ使ってたらリアルで背任でクビになるようにもっていく。

772 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:39:33.64 ]
>>768
そのコードじゃそりゃそうだろ。
つかそのコードはreallocの問題じゃねぇ。言い方悪かも試練が偶然だ。
解放された領域をもう一度使用してるのは意図して書けばできる事だが、
reallocが同じ領域であることを知っててコピー処理を省略してるかどうかは別問題。


773 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:40:57.09 ]
>>770
>ポインタ関係が全部おかしくなるわ。
ポインタを含まないか、ポインタを含んでも指す先が移動対象でないなら
そういうオブジェクトは勝手にコピーされても無問題でしょ?
で、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、それは成立している、というしくみ


774 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:45:00.34 ]
>>771>>772
まあ冷静に
コピーされる場合がありえるし、コピーされる/されないを
realloc()の呼び出し側で制御できないのは承知していますから
ただ、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、
プレースメントnewをうまく使って安全にrealloc()で領域管理できるという話

775 名前:デフォルトの名無しさん [2012/04/22(日) 21:54:51.43 ]
マジレスしないでニヨニヨ笑ってる人が絶対いる悪寒
あまりにも不自然すぎる

776 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:56:42.25 ]
>>774
二重コピーされる分realloc使うのが無駄なのは事実だろ
まだmalloc, free, mallocしてreplacemente new呼んだ方がマシだ

777 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:06:36.44 ]
>>776
ちょっと前のレスから気になってたが、replacement newってなんぞね?
また、realloc()の呼び出し1回で同一オブジェクトのコピーが2回起きるみたいな書き方も気になるが、
それっていつどういうシチュで??

もし>738のようなコピーコンストラクタ呼び出しの回数のことを言ってるのなら、
それはrealloc()一回につき同一オブジェクト当たり1回以下にできる
(realloc()がコピーするかしないかや呼び出し下で制御できないが、
 領域の移動があったかどうかは呼び出し元で判定でき、移動しなかったオブジェクトについて呼ぶ必要はないため。)


778 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:08:51.64 ]
その程度の処理が問題になるなら動的確保自体使わなきゃいいだろ。

まずはEffectiveC++でも嫁やザコ

779 名前:777 mailto:sage [2012/04/22(日) 22:10:35.64 ]
スマン訂正
std::vector<T>の要素型として使えるような型Tのオブジェクトなら、
勝手にコピーされても何もする必要がないから、領域の移動は関係なかったな、、


780 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:14:06.10 ]
>>777
reallocで1回、new( buffer ) Type();で1回、合わせて2回だろ。



781 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:23:58.97 ]
>>773
自分自身をさすポインタをもつ場合、コピーコンストラクタ/operator=を正しく書けばvectorに入れられるが、メモリコピーでは正しく処理できない。

782 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:34:14.86 ]
>>780
普通そうはならないべ

サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。)
運が悪ければ、領域の移動を要し、サイズs1の部分のみコピーされる(コピー1回)。
ここには今の想定だと構築済みオブジェクトが入っているが、コピー安全なオブジェクトなのでそれ以外なにもしなくていい。つまり、コピーはオブジェクト毎に高々1回。

で、new(p) Type(); が必要なのは、新規に確保されたサイズs2の領域だけ。よって、2回コピーされるオブジェクトは生じない。

なお、細かいことを言えば、new(p) Type()はアドレスpについてType型のデフォルトコンストラクタを呼び出すだけなのでコピーではない。
また、Typeのデフォルトコンストラクタが全フィールドを確実に初期化する保証があるなら
new(p) Type(); と書くより new(p) Type; の方がよろしい。(0 fillが省略されるから早くなる。いつの規格からかは知らん。)

>>781
ああすまん、それはそうね。

783 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:41:23.02 ]
>>782
>サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。)

この前提が間違ってるって何度も指摘されてるだろ

784 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:45:14.75 ]
>>782
手間が増えるだけでreallocするメリットねぇじゃねぇか

785 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:45:21.40 ]
>>783
>何度も指摘
kwsk
すくなくとも、(たまたまかどうかはともかくとして)realloc()前後で領域が移動しなかった実例が>768にあるわけだが
これって呼び出し前後でアドレスが変わらない部分についてもrealloc()は律儀にコピーしてるってことなの??
>738おすすめのヒープメモリ管理方式を聞いてみたい気がするカモメ、


786 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:49:16.76 ]
>>785
ことなの?じゃなくコールスタック追いかけるか
逆アセしてみろよ。memcpy呼ばれてるだろ

787 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:06:31.08 ]
>>786
VS2010のデバッグモードでmemcpy()にブレークポイントしかけて見て見たが、
>768のコードにおける4行目
void* p2 = realloc(p1, 2000);
の呼び出し中のmemcpy(src, dst, count)の呼び出し回数は3回、ただしcountはどれも2だったべ
これはリンクリストか何かのコピーじゃねーの?
(>783の指摘どおりだとしたら1000バイト級のmemcpy()が起きないとおかしいが)

で、仮に万が一>783の指摘が正しかったとして、2回コピーされる件はどうなったのよさ?
主張を取り下げて>782で納得?


788 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:09:34.08 ]
不毛だ

789 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:27:27.52 ]
>>787
2回コピーは俺だが。新しい領域のみコンストラクターの結果を
コピーするんならたしかにコピーは1回だな。そこは納得するよ。

790 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:45:41.19 ]
>>787
codepad.org/tlYgmcrc
そもそも、同じアドレスだからと言って一旦解放された領域に
同じ値が入ってるとも限らんからな
このコードVSにコピペして実行してみ



791 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:13:06.56 ]
>>790
ちょっwwwwwwおまwwwwwwwwww
例示のコードはrealloc()とは話が違うわけだが
そりゃーfree()で本当に解放してしまった領域には誰に何書かれるかわからんでしょうよ
(別スレッドあり、デバッグビルドのfree()だと丁重に0xccccccccで埋めてくれたりすることあり。
 セキュリティー目的で埋めるライブラリもあるかも試練、)

なんつーか>768のコードの意図が伝わってないようだけど、
K&R式なmalloc()およびrealloc()な実装の下で>768をシングルスレッド状況で走らせると
>782で言うコピー0回な挙動になるんすよ
>768は、その挙動を演出するために、使用中の領域(p1)とは関係ない領域(p3)を一旦malloc()後にfree()してるだけ
p1が指す領域は一貫してfree()されない。

792 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:26:27.20 ]
>>779
vector の要素型に realloc() で発生しうる memcpy() への耐性なんて要求されてないんだが

793 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:43:35.76 ]
>>791
realloc内部でfreeされるがな

794 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 02:08:56.95 ]
だから、C++ならnewだけを使えよ。
わざわざ危険を犯そうとする冒険者になることは、ない。

795 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 02:19:24.31 ]
newの使い方よりも
newそのものの速度が問題になる状況って
どんな状況だ?

796 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 03:05:19.97 ]
もうほっとけよ

797 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 03:19:14.56 ]
class MyClass{
public:
bool hoge();
}

MyClass instance;

があるとして、

「instance.hoge()」

が与えられたときに、

「MyClass::hoge(),&instance」

を返すようなマクロは作れませんでしょうか?

798 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 04:24:58.06 ]
メンバ関数ポインタ

799 名前:797 mailto:sage [2012/04/23(月) 04:25:55.73 ]
なんとか、
「instance.hoge()」
という記述から、メンバ関数ポインタとthisポインタを取得したいんですよね。。。

800 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 06:50:18.40 ]
「&MyClass::hoge,&instance」が欲しい理由じゃないのか?



801 名前:797 mailto:sage [2012/04/23(月) 12:43:53.90 ]
これが欲しい理由は、一度&MyClass::hogeと&instanceを保存しておいて、
あとでそのメンバ関数を呼び出したいんです。
使う箇所が多いので、テンプレートとかでなんとかできないかと思いました。

802 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 12:53:08.14 ]
std::bindとstd::functionでおk






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<191KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef