2012年3月プログラム17: C++相談室 part94 (456) TOP カテ一覧 スレ一覧 2ch元 削除依頼
UNIXプログラミング質問すれ Part10 (438)
【激突】関数型言語 VS オブジェクト指向言語 (407)
Lisp Scheme Part34 (336)
文字コード総合スレ part7 (606)
CORBAなら俺に聞け (134)
★初心者にVisual C++を教えるスレ★ Part38 (236)

C++相談室 part94


1 :12/02/18
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part93
http://toro.2ch.net/test/read.cgi/tech/1324922431/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1323692486/
■長いソースを貼るときはここへ。■
 http://codepad.org/
 http://ideone.com/

2 :12/02/18
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://en.cppreference.com/w/cpp (英語)
 http://ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完)
[Stroustrup]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 http://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 :12/02/18
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

4 :12/02/18
■Books■
amazon C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
 http://www.amazon.co.jp/b/?node=754384
The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳)
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)

5 :12/02/18
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

6 :12/02/18
         / ̄\
         | ^o^ | < はんにんは このなかにいます
         \_/
         /   ヽ   
        | |   | |
        | |   | |     
        ||   ||
        し|  i |J=二フ
          .|  ||
         | ノ ノ
         .| .| (
         / |\.\ 
         し'   ̄
     _
       |  / ̄\
        ̄|    |
     _| ̄ \_/

7 :12/02/18
お前やろ

8 :12/02/18
shared_ptr<IHoge> make_hoge(int id) {
switch(id) {
case HOGE0: return shared_ptr<IHoge>(new Hoge0);
case 〜
}
}
上のようにポリモーフィックな返り値を返す関数があるんだけどnewのコストを削りたい
アロケーターを使う他になにかいい手はないですか?
標準で可変長のスタック領域を扱えたりすると便利なんですが…

9 :12/02/18
配置new

10 :12/02/18
make_sharedでnewの呼び出しを2回から1回に減らせる。

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

12 :12/02/18
>>11
make_sharedがあるから

13 :12/02/18
>>12
あっなるほど・・・
make_sharedってCustom Deleter使いたい時は
自前でAllocator作るしかないですかね?

14 :12/02/18
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 :12/02/18
int a[] = {7,0,3,4,0,6};

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

16 :12/02/18
std::remove

17 :12/02/18
0を削除するつもりではないならstd::partition

18 :12/02/18
順番を保存したいならstable_partition

19 :12/02/18
stable_partitionでうまいこと出来ました。

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

21 :12/02/18
removeとpartitionってどう違うんだ?

22 :12/02/18
なんとなく自己解決したっぽい
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 :12/02/18
>>21
removeが確実に移動・コピーするのは残す値のみで、除去する値をわざわざ末尾の方に移動・コピーするかは実装依存。
int a[] = {7,0,3,4,0,6};
のときにremoveで0を除去した場合
{7,3,4,6,0,6}
のようになる実装もある。

24 :12/02/18
>>23
なるほど

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

26 :12/02/19
昔は
int a;と
a = some_process();の間に変数aを使うコードがあったが削除されて無くなった
つまり分けてる意味は特にない

27 :12/02/19
objective-cの後に習う言語はC++かCだと、どっちがいいですか?

28 :12/02/19
>>26
特に意味は無いのですね。ありがとうございます。

29 :12/02/19
(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 :12/02/19
そういう仕様だから

31 :12/02/19
さらに
XXX( **********func );
これでもOKだ

32 :12/02/19
プログラミングアートの基本テクニックの一つだね

33 :12/02/19
&付けるのが言語仕様的に正しいんだっけ?

34 :12/02/19
普通の関数はあっても無くても良い
メンバ関数は必須

35 :12/02/20
Cとの互換性のため引き継いだ仕様とC++の仕様

36 :12/02/20
fprintf(FILE *,・・・) があると思います。
ここの FILE * のところには stdout も使えると思いますが、
この部分に指定するストリームを自作したいのですが、どんな感じにするんでしょうか。
とりあえず手始めに
fprintf したら指定ファイルのほか、同時に stdout にも出力するような拡張ストリーム作りたいです。

37 :12/02/20
つ[popen("tee specified.file")]

38 :12/02/20
>>36
方法が無いわけではないけど、出来ないと思った方がいい
標準Cライブラリ(printf系)でなく標準C++ライブラリ(iostream)を使うこと
もしくは単にfprintfを2回(ファイルとstdout)呼ぶ
fprintfに指定するのはOSが管理するファイルディスクリプタなので
介入するには低レイヤーなライブラリを使うか、fprintfを自作関数として置き換えるか
環境依存な方法(ファイルシステムソケットなど)を使うか、など
・・・普通はやらない

39 :12/02/20
ストリームを自作するならiostream側でやろうぜ
streambufを自作してiostreamに食わせりゃいい

40 :12/02/20
C++ストリーム形式のライブラリって頑張って作った割にみんな使ってくれなくてちょっと泣きそうになるよね
オペレーターがキモいのはわかるんだけどでも標準なんだから仕方ないじゃんみたいな

41 :12/02/20
キモいというのもあるけど
printf形式が楽なんだよね
boost::format使えばいいんだろうけど

42 :12/02/20
フォーマットマニピュレータくらい用意しててもいいのにな
新旧標準出力同士なぜ上位互換的使い勝手は目指さなかったのか

43 :12/02/20
演算子オーバーロードが楽しくて
ちょっとはしゃいじゃったんだよ

44 :12/02/21
反面教師になったのさ

45 :12/02/21
boost::formatがC++11に入らなかったのは何でだろう

46 :12/02/21
いまさら言語内言語風に後戻りとかアホすぎだから
プラグインスクリプトか諦めてC++素直に使い括弧バカで通すほうがマシだわ

47 :12/02/21
iostreamはオーバーヘッド少な目で拡張性の高い仕組みだと思うけど
<<のオーバーロードはホントはしゃいじゃった感じだな

48 :12/02/21
stream と vector<bool> は可愛い存在。

49 :12/02/21
個人的にはvector<bool>に助けられてる。

50 :12/02/21
ベクブー使う奴はクズ

51 :12/02/21
iomanipは補間候補さえ出てくれば問題ないんだけどなあ

52 :12/02/21
> 個人的にはvector<bool>に助けられてる。
サイズはbool*size()じゃないでしょ?

53 :12/02/21
ビット配列なんて別クラスでいいのに・・・

54 :12/02/21
ビットセットあるやん

55 :12/02/21
ビットセットはいつもなんか忘れてるな

56 :12/02/21
実際のブツのできはともかく
論理的な機能と物理的な実装を切り分ける好例ではある

57 :12/02/21
bitsetはサイズ固定じゃないの

58 :12/02/21
やるならboost::dynamic_bitsetだな

59 :12/02/21
サイズ非固定のbitsetって何に使うんだ?

60 :12/02/21
bitsetすら使う事がないからよく分からない

61 :12/02/21
基数変換がちゃんと出来る人は、Bitsetで多倍長演算クラスつくると凄そうだなーと思う。
俺できないから、そういうクラス作るとどうしても無駄が出来る。

62 :12/02/22
>>59
グラフ構造、論理閉包

63 :12/02/22
パイプすると一回で読み取れるのがスペースか改行までに
勝手になっているんですけど、改行だけにすることはどうやればできますか?

64 :12/02/22
まず関数名でも書こうか

65 :12/02/22
読み取り関数名ですか?
それなら<<ですけど。

66 :12/02/22
訂正
>>でした。

67 :12/02/22
getline

68 :12/02/22
ありがとうございます。

69 :12/02/22
64ビットアプリのばあい
intの代わりにlong longを使い
floatの代わりにdoubleを使うという選択で
最高のパフォーマンスが出せるという
認識であってますか?

70 :12/02/22
あってない

71 :12/02/22
どこがあってませんか?
詳しく教えてください。

72 :12/02/22
大きいものを使う必要あるの?

73 :12/02/22
>>71
ちょっと考えればわかる
解らなければ向いてないから違う業界に行ったほうが君のためだよ

74 :12/02/22
業界に入ってないのでわかりません教えてください。

75 :12/02/22
じゃあ向いてないからやめなさい

76 :12/02/22
なぜ実測しない

77 :12/02/22
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 :12/02/22
こうじゃね?
template<>
void hoge<int,int>(const int&, const int&){} //D

79 :12/02/22
>>76
わかっているなら教えてくださいよ。

80 :12/02/22
>>78 なるほど、これならいけました。
引数が2つあるので、Aの特殊化になるみたいですね。
BとCを定義した状態で
void hoge<int>(const int&, const int&){} //D
としたら、特殊化できませんでした。
曖昧な場合は特殊化できないみたいですね。
しかも、どうやっても明示できない状況もあるようです。

81 :12/02/22
>>71
intの定義を調べましょう
intが32bitだと断定してるところはクソサイトだと思って構いません

82 :12/02/22
>>81
それは知ってます。
16ビットが32ビットになったときみたいに64ビットになったと思っていたら
32ビットだったという経験をしたからlong longを使うという発想にいたったわけです。

83 :12/02/22
本当に調べましたか?
intは「処理系に最適なサイズ」になります
コンパイラ開発者達が最適だと判断したものよりも
long longの方が最適であると思うのならばそちらを使うのも良いでしょう
その際は実測してから使うことを勧めます

84 :12/02/22
64bit整数が最適でも32bit整数のほうが速いなんてことはいくらでもある
ケースバイケースで実測する他無い

85 :12/02/22
intが最速って保証は無かったような…
実測するしかない

86 :12/02/22
>>82
数値演算の速度と64bitアプリかどうかは無関係
「64bitアプリ」の「64bit」はアドレス空間のこと
int, long long, float, doubleには関係ない
関係あるのはポインタ

87 :12/02/22
32bitで2回処理が必要なところを64bit1回で済むなら速くなる
そうでなければ変わらない

88 :12/02/22
実測してから使うのは良いけど
その実測も注意が必要だな
仮に算術演算で64bit整数の方が良い性能だったとしても
配列などで要素数が多い箇所を64bit整数にすると逆に性能が劣化するということがあり得る
単純なケースでの実測結果があらゆるケースに適用出来るとは限らないことを
認識しておく必要がある

89 :12/02/22
> intの代わりにlong longを使い
64bit環境なら、intは64bitにするというのが普通。
処理系によっては、わざと32bitにしてるかもしれん。
じゃあ、64bit環境でのlong longは何bitなのか?
処理系依存だよなぁ、わからん。
> floatの代わりにdoubleを使うという選択で
昔のC処理系の仕様では、内部演算はdoubleで行うことになってた。
floatでの演算には、必ずdoubleとの型変換が介在した。
なので、floatよりdoubleの方が速かった。
今のC++処理系の実装は、知らん。
どっちみち、処理系の実装に依存することに変わりはないわけだ。

90 :12/02/22
どこの世界の普通だ

91 :12/02/22
intが64bitの処理系挙げてみろよ

92 :12/02/22
64bitでも互換性等の理由からintは32bitが普通だw
ILP64の実例なんて聞いた事無いぞ

93 :12/02/22
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 :12/02/22
IP64って規格違反じゃね

95 :12/02/22
IP64とか規格で許されないのになんで載せてんだか

96 :12/02/22
intが64bitだと16bitか32bitのどちらかが
拡張整数作らないと使えないからねえ

97 :12/02/23
32ビットだとレジスターにintを二つ入れて並列演算するから
long longより速いなんてことないですよね?

98 :12/02/23
は?

99 :12/02/23
ひ?

100 :12/02/23
ふ?

101 :12/02/23
>>97
そんなあなたにMMX?

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

103 :12/02/23
違う型同士の計算を禁止するのが目的だから。
その本の内容はその事例には当てはまらないっぽいよ。

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

105 :12/02/23
時限付き数値計算したいのならboost使えばいいよ
実装が知りたければboostを読めばいいよ

106 :12/02/23
boost::Unitsなんてのあったんですね。トンクス

107 :12/02/24
C++でプログラム書くのを覚えるとCでプログラム書くのは無理
Cを読むくらいならできるけど、Cで書くなんてバカらしくてやってらんない

108 :12/02/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 :12/02/24
そんなことしなくても
boost::functionとかstd::functionとか使えばいいんじゃない?

110 :12/02/24
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 :12/02/24
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 :12/02/24
template< class T >
class test { ... }
みたく書けばいいのじゃないか?

113 :12/02/24
ひとつのデリゲートならfunction + bind
イベントハンドラのように複数のデリゲートならsignals2 + bind

114 :12/02/24
メンバ関数の中で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 :12/02/24
>>114 エラーメッセージ貼れよ

116 :12/02/25
漠然とエラーと言われてもなあ

117 :12/02/25
std::cin>>aをstd::getline(a)と同じ様に改行まで読み込めて
スペースも読み込むようにできませんか?

118 :12/02/25
訂正
std::cin>>aをstd::cin.getline(a)と同じ様に改行まで読み込めて
スペースも読み込むようにできませんか?

119 :12/02/25
>>117-118
class Line { ... };
std::istream& operator >> (std::istream& s, Line& a) { return s.getline(a....); }

120 :12/02/25
ありがとうございます

121 :12/02/25
そこまでして>>を使わざるを得ないのか
何かの途中で使いたいのかな

122 :12/02/25
入力の始めの2行はスペースがないと仮定して
cin>>a
cin>>a
cin.getline(a)
ってやるとなぜかgetline(a)が4行目になっているんですよ。
不思議ですね。

123 :12/02/25
getline(cin, a);
としか使わないな
何か昔cin.getline(a);として
思い通りの動きにならなかった記憶がある

124 :12/02/25
未だにバッファにバイナリでreadして自前処理してるわ俺
C++のストリームの機能全然使いこなせてない
iteratorとか使ってドヤ顔したい

125 :12/02/25
>>124
自分の意図通りの細かいことをやりたければ、結局そこに行き着くんだが。>自前処理

126 :12/02/25
>>122
読み込ませているファイルも提示しないで何言ってるんだか。
取り敢えず、全てgetline()で試してみたらどうだ?

127 :12/02/25
普通に
11111111111111111111111
11111111111111111
111111111111111111111
111111111111111111
111111111111111111111
11111111111111111
みたいなスペースも何も無いファイルなんですけど・・・・
改行文字が\r\nじゃなくて\nだからですかね?

128 :12/02/25
まさかと思うがWindowsか?
だとしたら、ios::inだけでなくios::binaryも指定してみたらどうだろう。

129 :12/02/25
いまどきwindowsは恥ずかしいからlinuxに移行しようと思ったんですけど
どうしても動かない機器があるので仕方なくwindows7使ってます。
スミマセンでした。
あとは言われたとおりにして見ます。
ありがとうございました。

130 :12/02/26
何言ってるかちょっと分からんと思うが、
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 :12/02/26
仮想継承とかそういう話?

132 :12/02/26
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 :12/02/26
すまん適当にかいて間違えたね
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 :12/02/26
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 :12/02/26
連投失礼します。上の例は不規則ではないですけど実際は不規則な感じになってます

136 :12/02/26
memcpyあたりで一気にやればいいと思うよ

137 :12/02/26
>>134
最後の要素のカンマはアウツ

138 :12/02/26
ありがとうございます

139 :12/02/26
>>137
アウツじゃないよ
アウツなのはenum
C++11でOKになったけど

140 :12/02/26
肝腎なことを書けよ。
>>134
二重に括弧が必要。

141 :12/02/26
実はカッコを二重にする事は必須ではない
すべきだけど

142 :12/02/26
hoge::hoge()
: a(),
b(),
c(),
{}
も認めて欲しい。

143 :12/02/26
hoge::hoge() :
 a(),
 b(),
 c(),
{}
の方が統一性があっていいな

144 :12/02/26
hoge::hoge()
 : a()
 , b()
 , c()
{}

145 :12/02/26
hoge::hoge(int x){int y=x/2;a();b(x);c(y); }
の記述でOKと成るようにメンバ初期化ツリーの構築くらいコンパイラ側で面倒見てくれればよかったのに

146 :12/02/26
hoge::hoge()
 : a()
 : b()
 : c()
{}
がいい

147 :12/02/26
そういうの言い出したらキリが無いからなあ・・・
if (
 a ||
 b ||
 c ||
) {
}
とか
hoge(
 a,
 b,
 c,
);
とか

148 :12/02/26
>>144
コロン ( : ) とカンマ ( , ) で意味が違うものをそろえてもしょうがない、
て言うか単なる馬鹿。

149 :12/02/26
if文の{}は省略出きるんだから関数やクラスも省略出来るべき
int hoge()
return 0;
class hoge
int a;

150 :12/02/26
>>148
意外と見かけるというか
VC自体がそういうインデントに対応してた気がする

151 :12/02/26
俺もVCで綺麗になるから>>144だな。

152 :12/02/26
俺はキモいからやらないけどな

153 :12/02/26
Emacsも>>144だった気がする

154 :12/02/26
プロは一行にぶち込んで終わり
素人ほどくだらない形式にこだわる

155 :12/02/26
自称プロ キタ--------------------ッ!!

156 :12/02/26
>>134
ttp://ideone.com/JnDx7

157 :12/02/26
STLアルゴリズムの関数オブジェクトってunary_functionとかbinary_functionの継承って必須ですか?
struct MyFunc : ??? {
  template <class Object> void operator (Object const & object) const {
    DoSomething(object);
  }
};
MyFuncのようにオーバーライドされた関数オブジェクトの場合
ベースとなる関数オブジェクトアダプタをどう書けばいいのかわかりません

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

159 :12/02/27
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 :12/02/27
swprintf つかえ

161 :12/02/27
ありがとうございます
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 :12/02/27
swprintf_s つかえ

163 :12/02/27
通りました!ありがとうございました!
どうしてなんでしょうか!?

164 :12/02/27
警告をエラーとして扱いオプションをオンにしていたから
コンパイルが失敗した

165 :12/02/27
なるほど!ありがとうございました!

166 :12/02/28
template <class T0...>
void func(const T0& val0...)
みたいな引数の型と引数を延々と伸ばしていくようなプリプロセス処理はどのようい書けばいいんでしょうか?
以下のような意図です
http://ideone.com/U2XMN
Boost.PP使うと楽という話は聞いたことがあるんですが、
Boostが使用できない環境なので、C++標準の方法でなんとかする書き方を知っている方がいれば、是非お願いします。

167 :12/02/28
C99のプリプロセッサを使えばOK。

168 :12/02/28
可変引数マクロはC++11にも追加されるぜ
コンパイラが対応していない場合はどうしようもないが
可変引数テンプレートが使えるような環境なら対応してるんじゃないの?
__VA_ARGS__でググれ

169 :12/02/28
でも可変引数テンプレートが使える環境なら
マクロじゃなくてテンプレート使えとも思うけど

170 :12/02/28
済みません確かにコンパイラ書いてませんでした
コンパイラはMSVC10です
C++11への対応やその他の要素と可搬性考えて、C++03の範囲でなんとか...

171 :12/02/28
C++で基本クラスの仮想関数をオーバライドする際、
基本クラスにその関数がなければコンパイルエラーとなるような
指定方法って無いものですか?
なんで仮想関数なのに基本クラスのほうが呼ばれるのか延々と悩んでいたら、
関数名のスペルミスだった、なんてことがあったので。

172 :12/02/28
>>171
C++11#明示的な仮想関数オーバーライド
http://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 :12/02/28
なんでムーブ代入演算子は自分のデータをデリートするのではなくて
相手のデータと交換するんですか?

174 :12/02/28
実装が簡単で効率がいいからです

175 :12/02/28
>>172
どうもです。
最新仕様に組み込まれたということは、やっぱりそういう仕組みが求められてたのか。
純粋仮想関数をオーバライドした派生クラスをさらに派生するときには
必ずその関数を再オーバライドしなければいけない
という指定もできればよかったな。

176 :12/02/28
関数ポインタを持つクラスをシリアライズするにはどうすればいいですか?
関数に静的なID振ってそれを保存するしかないですかね?
この場合template関数の場合にどうするべきか・・・

177 :12/02/28
printf("%p", func)
でいいだろ。テンプレートだろうと。
何を問題にしているのかわからん

178 :12/02/28
>>177
意味不明

179 :12/02/28
>>173
むしろswapによる効率化を標準化した結果moveが出来上がったようなもの

180 :12/02/28
>>176
関数ポインタ諦めて関数オブジェクト持たせるようにするとか……
>>177
関数のアドレスが変化しないなら良いのかもしれんが、それはどうだろう
>>178
アドレスを書きだせって意味でしょ

181 :12/02/28
>>173
削除するコストが無駄だから
移動跡地のオブジェクトは使われないっていう前提だし

182 :12/02/28
>>173
例えばポインタを持つクラスを移動する場合
移動先(自分)が管理するポインタをdelete、移動元が管理するポインタをもらう、移動元のポインタをNULLにする
その後移動元のデストラクタが起動してNULLにdeleteして終わり
 delete pTo;
 pTo = pFrom;
 pFrom = NULL;
 delete pFrom;
移動元のデストラクタは否応無しに動くんだから
自分のポインタを渡してdeleteしてもらえばいい
 swap(pTo, pFrom);
 delete pFrom;

183 :12/02/28
>>170
C++03だと無理だねえ
#define hoge(a) printf a
hoge(("hoge%d", 9));
のような事ならできるけど、
結局関数が必要になるので
根本的な解決にはなってないだろうし

184 :12/02/28
C++03の範囲でやろうと無茶したのがboost.PPだし
やるならboost.PP見てマネするしか・・・

185 :12/02/29
boost.PPはCPPの暗黒面に落ちてるだろ
スクリプトで我慢しろよ

186 :12/02/29
C++11のスレッド機能はどこで勉強しましたか?
教えてください。

187 :12/02/29
国内です

188 :12/02/29
wikipediaさんやgoogle先生に教えてもらいました

189 :12/03/01
引数ありのコンストラクタが引数無しのコンストラクタ
class Test{
bool po;
public:
Test()
:po(NULL)
{

190 :12/03/01
途中で書き込んでしまいましたすいません
引数ありのコンストラクタが引数無しのコンストラクタ呼ぶことって可能ですか?
class Test{
bool po;
public:
Test()
:po(NULL)
{
}
Test( int i )
{
// ここでTest()のやつをうごかしたい
}
};

191 :12/03/01
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 :12/03/01
なおC++11になれば普通に可能

193 :12/03/01
で?

194 :12/03/01
C++03で出来ないから代替手段を示したんだと思うが

195 :12/03/01
>>184
配置newを使えば出来ないことも無いだろ
PODじゃないメンバーを持っているとちょっとまずいが

196 :12/03/01
間違えた
184じゃなくて194だ

197 :12/03/01
スタック配置にplacement newは処理系依存とか以前見たことあるけど大丈夫?
スタック配置不可クラスにするならいいけど

198 :12/03/01
コピーコンストラクタの質問です。
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 :12/03/01
Test a = Test(); イコール Test a();だから

200 :12/03/01
最適化されてるだけ
Test()はどうせすぐに消えてなくなるオブジェクトだからいちいちコピーしないで横取りしてしまおうとコンパイラが気を利かせてくれた

201 :12/03/01

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 :12/03/01
>>199-201
どうもです。
気を利かせてくれるのはいいけど悩みました

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

204 :12/03/04
typeid

205 :12/03/04
>>204
こんなものがあったんですか。
キャストばかり調べてました。

206 :12/03/05
void hoge(){}
void moge(){return hoge();}
ってVC2008だとエラーでないんですけど正しい文法ですか?

207 :12/03/05
正しい文法

208 :12/03/05
ラムダ関数で再帰する方法ありますか?

209 :12/03/05
はい

210 :12/03/05
>>209
ありがとうございます。

211 :12/03/05
いえいえ

212 :12/03/09
c++のstring型でsprintfみたいな文字列を編集する関数ってありますか?
charを使ったc言語風の文字列操作がc++ではできずに困っています
初心者過ぎる質問で申し訳ない

213 :12/03/09
std::stringstreamでいいよ

214 :12/03/09
boost::formatでいいよ

215 :12/03/09
マニピュレーターのきもさは異常

216 :12/03/09
まにぴゅっ
どぴゅっ

217 :12/03/09
無名構造体でググルと偉そうに講釈垂れてるくせに
使い方知らんヤツ多いな。すぐ解る話だろうになんでだろ。

218 :12/03/09
まともなやつはそんなの使わない

219 :12/03/09
無名構造体はunionでブロック共有するくらいしか使わない気がする。

220 :12/03/09
>>219
そうそう
union X{ struct{int a;}; struct{char b}; };
ってのが用途だよな。

221 :12/03/09
何いってんのこいつ

222 :12/03/09
無名構造体とかCなら常用だろ
typedef struct {
 ...
} hoge;
とか

223 :12/03/09
普通に使うな、うん。

224 :12/03/09
そもそも無名構造体は規格違反だし

225 :12/03/09
struct{int operator()(int a){return a*b;}int b;}f={2};
for (int i;i<AMOUNT;++i)x[f(i)]=0;

226 :12/03/09
ああ、無名構造体って共用体で使う変数名ない方の事言ってんのか
あれは規格違反だな

227 :12/03/09
タグ名って省略出来なかったっけ?

228 :12/03/09
無名の共用体と言われて何のことか
ダイレクトにわかんねーやつは禿本をもっと読んだほうがいい

229 :12/03/09
無名構造体はタグ名のない構造体の事ではないらしい

230 :12/03/09
>>229
了解。

231 :12/03/09
普通に名前付けるかその場でtypedefしないとエラーだよ

232 :12/03/10
unionで使う無名構造体について詳細キボン
この会話の意味を知りたい

233 :12/03/10
>>226
struct Example{int x;};
struct Holder{Example};
Holder holder;
holder.x = 10;
こういう匿名構造体とは違うぞ。

234 :12/03/10
>>232
共用体の中に即席の構造体を作れる。
共用体以外で用の無い構造体を使うときに使う物。
例えば、X11風のWindow Messageはこう書ける。
struct Message
{
      int type;
      union
      {
             struct{ /* マウスイベント用 */ };
             struct{ /* キーボードイベント用 */   }
             /*** その他イベント用構造体が続く ***/
      };
};

235 :12/03/10
>>234
エラー

236 :12/03/10
>>235
コンパイラによっちゃ引っかかるわな

237 :12/03/10
unionの外からはアクセスできないデータ集合ができるということ?

238 :12/03/10
コンパイラによっては拡張でおk

239 :12/03/10
>>238
コレは拡張だろうけど、exportもコンパイラによって実装具合が違うよな。

240 :12/03/10
exportさんはC++11で退学になったのでもうどうでもいい

241 :12/03/10
要するに、>>234でいうと例えば、union内でマウスイベントが int, Point 型を持っていたとしたら
Messageのポインタを
struct MouseMessage { int a; int b; Point p; };
型のポインタに変換して使わせるとかそういう目的のテクニックという認識でいいの?

242 :12/03/10
>>237
うんにゃ。
Message message;
message.構造体のメンバー名;
って事で、直接構造体メンバーを指定すれば操作できる。
んで、同じ構造体のメンバーを操作する限りは、
タダの構造体と同じだけど、違う構造体のメンバーに触った場合は、
メモリー上同じ位置にある構造体のメンバーすべてが書き換わる。

243 :12/03/10
それが可能ならば
同じメンバ変数名を持つけれども順番が違う構造体同士が入っている場合の挙動はどうなっちゃうの?
struct Message{
int type;
union{
struct{ Target target; int i; float f; };
struct{int j; short s; Target target};
};
};
こういう場合の Message m; m.target の扱いとか

244 :12/03/10
>>243
だからエラーだって
VC++とかの糞環境じゃないと無名構造体は使えないの

245 :12/03/10
>>240
VCより遥かに準拠率高いBorland C++ Builder XとComeau C/C++馬鹿にすんな

246 :12/03/10
いずれにしろ標準の機能ではないということさ

247 :12/03/10
はいはい

248 :12/03/10
>>244
使える環境でのはなししてんだろ
コミュ障かよ

249 :12/03/10
>>243
名前重複させられないのでエラー

250 :12/03/10
>>244
お前ってかわいそうだな

251 :12/03/10
>>244
アスペは黙ってろ

252 :12/03/10
>>250
心理学では研究され尽くしてメジャーなネタだけど知ってるか?
議論口論で論理的に勝てないとなったら人間って無意識に人格攻撃を始めるんだぜ
解りやすいやつだなお前は

253 :12/03/10
へーく垂れたきゃ他所の板でやりな

254 :12/03/10
>>252
「空気」⇦読めますか?

255 :12/03/10
規格外の話はほかのスレでやってくれ
何のために環境依存OKのスレがあると思ってるんだ

256 :12/03/10
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 :12/03/10
>>256
だったらスレ統一しろ
分かれてるってことは暗黙に禁止されてるってことだよ
そんなこともわからねーのか
喫煙室があるのに共同スペースでタバコふかす汚物並に調子乗ってんなお前らって

258 :12/03/10
>>257
悔しいのぉ悔しいのぉ

259 :12/03/10
>>258
そういう幼稚なあおりしかできないわけ?
放射能に頭やられちまったみたいだな

260 :12/03/10
いいから環境依存スレ行けば全て解決するんだからお前らまとめてあっち行けや

261 :12/03/10
質問
OpenGLだけど
const char* pVer = glGetString(GL_VERSION);
printf("version is %s¥n",pVer);
これだとOKで
printf("version is %s¥n",glGetString(GL_VERSION));
これだとダメだったんだが、もしかして返り値の寿命が関係してるの?
だとすると寿命はどう捉えるべき?

262 :12/03/10
>>261
内部で参照カウントされてるから問題ないよ
それとは関係ないところでミスってる可能性大

263 :12/03/10
>>259
( ´,_ゝ`)プッ

264 :12/03/10
>>263
なんだBOTか
相手して損したわ

265 :12/03/10
>>262
そうすか
ちょっと見なおしてみます

266 :12/03/10
Javascript/ECMAscriptスレに飽きてこっちにキたのか?

267 :12/03/10
_beginthreadexで3つのスレッドを作る場合
_endthreadexでここのスレッドを判別するにはどうしたら良いのでしょうか?

268 :12/03/10
_endthreadexはスレッド内から呼ぶものであって
判別もなにもないぞ

269 :12/03/10
>>267 その話をすると >>257 が湧いてくるぞ
_beginthreadexは方言の話以上に、OS依存の話だからな。

270 :12/03/10
>>267
スレッドのポインタを使う

271 :12/03/10
_endthreadexを使うのと、_beginthreadexの戻り値で取得したハンドルをCloseHandleで消す方法ってどう違うの?

272 :12/03/10
>>271
_endthreadexにはバグがあって100%メモリリークするから
常にCloseHandleを使う方法を利用するほうがいい
_endthreadexは忘れてもいいよ

273 :12/03/10
>>272
マジですか?
有用な情報ありがとう!

274 :12/03/10
_endthreadexなんて何に使うの?
普通にreturn 0;で戻ればいいだけじゃね?

275 :12/03/10
>>274
それだとスレッドが永遠に走り続けるからヤバイ

276 :12/03/10
>>275
うそん
http://msdn.microsoft.com/ja-jp/library/hw264s73(v=vs.80).aspx

277 :12/03/10
あれじゃん。メモリーリークするつってんのは、デストラクターが呼ばれないからでしょ。
return;でスレッド関数終了するとちゃんとデストラクター呼ばれるし、そのあと自動で_
endthreadex呼ばれてスレッド自体もちゃんと破棄されるじゃん。

278 :12/03/10
あと、CloseHandleはスレッドハンドル閉じるもんでしょ、
ハンドルのリソース解放するもんで_endthreadexとは毛色がちがうじゃん。

279 :12/03/10
_beginthreadexって基本クソだよね
他のが使えるなら他の使うのが良い

280 :12/03/10
exit(int)のスレッド版でしょ。
代替手段を考えるにしても_exitthreadexを使おうと思うに至る事自体が稀だと思うが。

281 :12/03/11
throwしてスレッドエントリでcatchすべき
スレッド内でcatchされない例外があるとプログラムが死ぬ

282 :12/03/11
>>272
_endthreadexとCloseHandleを同列に見るやつ前もいたけどcalleeとcallerの区別もついてないのかよ

283 :12/03/11
マクドナルドでの便利な呪文:
「callerください。あ、calleeは抜きで!」

284 :12/03/11
【審議中】 ( ´・ω) (´・ω・) (・ω・`) (ω・` )

285 :12/03/11
最近なるべくconstを付けるように意識してるんですが、constなメンバを持つクラスの
operator =を書くときに困っています。
たとえば内部に持つバッファのサイズなどはコンストラクタで決まり、以後変更されないのでconstにしています。
が、そうするとconst_castでconstをはがさないと代入演算子が書けないわけで・・・
こういうときはどうするべきなのでしょう。
1.constではなくmutableにすべき
2.代入演算子を書くべきでない。使うときはコピーコンストラクタで済ませるべき
3.そもそもその程度の不変性ならconstにするな
アドバイスいただけると嬉しいです。

286 :12/03/11
3だね

287 :12/03/11
メンバでconstってほとんどつかわんよ
コンパイル時定数ぐらい

288 :12/03/11
俺も定数以外では引数にしか使わないな

289 :12/03/11
メンバでconst使うとしたら
コピーコストの大きなオブジェクトを
コンストラクタのconst参照で受け取って保持するときくらいだな。
寿命の管理に気をつけないといけないけど。

290 :12/03/11
そもそも代入の対象が const って、超初歩的な誤りじゃん

291 :12/03/11
なるほど・・・納得しました。
constつけないように変更してみます、ありがとうございました。

292 :12/03/11
構築された後は、そのオブジェクトにどんな操作をしても値が変わらないメンバならconstにすべきだろうけど

293 :12/03/11
ポインター以外にどうしてもconstつけたいなら、
代入演算系をprivateにして制限するのも手よ。
imutableオブジェクトの完成だ。

294 :12/03/11
ハンドルされていない例外が発生しました。
↑が直らないんですが、どうやって対処すれば良いのでしょうか・・・

295 :12/03/11
>>294
例外をハンドルすればいいと思うよ。

296 :12/03/11
>>295
日本語でおk

297 :12/03/11
訳すと馬鹿には無理

298 :12/03/11
>>294
教えてもらおうとしても駄目
このスレには屑しかいないんだから

299 :12/03/11
>>294
例外の中身を調べてみろよ

300 :12/03/11
「例外をハンドルするには」でググったらいい

301 :12/03/11
>>300
catchする時、型が解ってなけりゃいつまで経っても
ハンドルできんだろう

302 :12/03/12
try{ throw exception(); }catch(...){}

303 :12/03/12
動的配列の途中に挿入・削除をする方法を教えてください。
listである条件に当てはまるものを削除したいときは
remove_if()を使えばいいらしいのですが、使い方が分かりません。

304 :12/03/12
erase insert使えばいいよ

305 :12/03/12
>>303
此処読んでみな。
http://marupeke296.com/TIPS_No12_ListElementErase.html

306 :12/03/12
ttp://ideone.com/Z10hJ

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

308 :12/03/12
よくないです

309 :12/03/12
「c++ ラムダ式」でググるといい
特に[]の中の指定は結構特殊だから

310 :12/03/12
C++でFortranのようにベクトル計算するにはどうすればいいんですか?

311 :12/03/12
>>309
普通に使う分にはある程度できるようになりました。
ありがとうございます。
あとはクラスがどうのこうのを学ばないとなぁ

312 :12/03/12
>>310
uBlus or Blits++

313 :12/03/13
boost::shared_ptrをvoid*に入れたいのですが、できますでしょうか?
フレームワークに設けられている便利に使っていいvoid*なんですが
&でアドレス取得して入れたら、うまく動作しませんでした。
&でアドレス取得する場合、参照カウントが増えなくて消えちゃうみたいです。
こういう時ってどう実装するものなのでしょう?。。

314 :12/03/13
struct foo{boost::shared_ptr ptr;};とかやればいいんじゃねーの

315 :12/03/13
>>314
ありがとうございます。試してみます。

316 :12/03/13
boost::shared_ptr を new して void* に渡すとか

317 :12/03/13
すみません、アルゴリズム的な作曲をやろうとしている文系です…
ソースを貼らせてください
http://codepad.org/C3hsBjQo
余計な部分は省略しています。
これで、コンパイル時のエラーはないのですが、scanfが実行される前に、
プログラムが止まってしまいます。
本当に稚拙なプログラムで済みません、初心者なもので。
どなたか問題点を教えていただけないでしょうか。

318 :12/03/13
p = 0 じゃなくて p == 0 だな

319 :12/03/13
他にも色々な所で同じ間違いがあるね

320 :12/03/13
数字を入力するプログラムで下のように書いたとき
「-1」と入力すると”数が正しくありません〜”とでて次の”数を入力してください->”に戻るけど
「a」と入力すると”数が正しく〜”と”数を入力〜”がずっとでつづけます
なぜなんでしょうか?
while(1) {
cout << "数を入力してください->";
cin >> num;
state =cin.rdstate();
if (num <= 0 || state != std::ios_base::goodbit){
cout << "数が正しくありません。最初に戻ります。\n" << endl;
continue;
}

}

321 :12/03/13
エラー復帰してないから
エラーを clear() してから a を読み捨てないと、
永遠に先まで読み進められない

322 :12/03/13
>>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 :12/03/13
>>321
エラー復帰とは具体的にどういうことをすればよいのでしょうか?
初心者で申し訳ありません

324 :12/03/13
> > エラー復帰とは具体的にどういうことをすればよいのでしょうか?
> エラーを clear() してから a を読み捨てる

325 :12/03/14
>>322
>p == k または p == h になってしまったら
It means
if (p == k || p == h) {
}
not
if (p != k && p != h) {
}

326 :12/03/14
>>324
何をclearすればよいのでしょうか?
cin.clear();
をやってみたのですがダメでした・・

327 :12/03/14
>>326
>a を読み捨てる

328 :12/03/14
初心者でもそれくらい調べろよ

329 :12/03/14
cin.clear();
cin.ignore();
をしたら解決しました
>>321の言うとおりclearしてignoreしたら正常に動作しました
ありがとうごさいました
ただ何故こうしたらうまくいくのかよくわかりません
上の2つを逆にしてもダメでした
どなたか解説して頂けると助かります

330 :12/03/14
>>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 :12/03/14
いや、そのへん以前に
 j <= p <= j+2

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

332 :12/03/14
>331さん
なるほど!
ではpがある範囲内にあるかどうかの判定は、
j <= p && p <= j +2
とでもすればいいのでしょうか。

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

334 :12/03/15
初心者ってcinを使いたがるけど、これ初心者には必要ないよね。
つーか誰にも必要ないよね。

335 :12/03/15
>>332
それでいい

336 :12/03/15
継承元の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 :12/03/15
>>336 this->CBaseA::operator=(obj)

338 :12/03/15
別にキャストいらんだろ
てかdynamic_castは間違い

339 :12/03/15
>>337
有難うございます!
こういう書き方も出来たんですね!
>>338
ダウンキャストは承知していましたが、継承元のoperator=を呼ぶ必要があったために
やむ終えず>>336の書き方をしていました。
知識不足で恥ずかしい限りです。

340 :12/03/15
キャスト使うならこうだろ
static_cast<CBaseA &>(*this) = obj;

341 :12/03/15
>>334
Linux関連じゃ、istreamに突っ込んでんのをたまに見る

342 :12/03/15
>>337
thisもいらんだろ

343 :12/03/18
初心者です。
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 :12/03/18
オーバーフローしてんじゃね

345 :12/03/18
>>343
そりゃ、1画素がchar 1個分だもんな。
1画素をchar 6個分(double)で読み込みゃそりゃずれるで

346 :12/03/18
doubleは8個分

347 :12/03/18
ppm の形式は知らないけど
char r,g,b;
pixels[x][y] = (double)r * 0.299 + (double)g * 0.587 + (double)b * 0.114;
じゃないの?

348 :12/03/18
テンプレのFAQが英語なんですけど翻訳して読めってことですかコレ

349 :12/03/18
どのプログラミング言語にしても英語が読めたほうが捗るぞ。
なんたって言語作者の9割以上が外国人だしな。

350 :12/03/18
フランスに渡米するみたいなもんか

351 :12/03/18
そりゃ人間の9割以上が外国人なんだから当然だろうよ。

352 :12/03/18
Rubyは貴重だな

353 :12/03/18
英悟は別格で置いとくとしてGoogleで調べると日本語と他の国言語では
Rubyに限らずコンテンツ量が一桁以上違うから
内容の濃淡は知らんけど日本は恵まれてると思うよ

354 :12/03/18
ちょっと日本語がわからない。
もう少しわかりやすく。

355 :12/03/18
いうても、日本語ほど英語と文法の離れてる言語も多くないよな。
多少ひねれば英語化できる言語圏じゃ、母国語資料の少なさなんて
大した問題じゃないんだろ。リーナスやハゲだってフィンランド人だし。

356 :12/03/18
多いよ
SVOは全言語中でむしろマイナー
日本語と同じSOVが45%を占めている

357 :12/03/18
母国語でここまで頑張っている、というのもある意味驚異的なことでして。

358 :12/03/18
プログラムに限らず母国語話者に対する期待の違いだろうね
途上国言語で話題振っても誰も付いてこない来れない悲しみと対極にある

359 :12/03/19
そういう国は英語で頑張ってるからな

360 :12/03/19
ボビーオロゴンとかアホそうな振る舞いしてたけど
真面目に話したら、俺らよりはるかに頭いいんだろうな
何せマルチリンガルらしいし

361 :12/03/19
C++に関しては繁体字圏がコンテンツ量で結構頑張ってるな
perlやHaskellなんかだと日本語と比べるべくも無いが

362 :12/03/19
>>344-347
回答ありがとうございます。
やっぱり全然本質を理解できてないですね^^;参考になりました。
もうひとつ聞きたいことがあるのですが
バイナリで書かれたppm形式は画素値はバイナリで書かれていますが、ヘッダはテキストで書かれています。
このときifstreamを使ってファイルを読み込むときはオープンモードはbinaryを指定したほうがいいのですか?
またヘッダのテキスト部分がコメント等で長さが分からない場合に、ヘッダ部分を読み飛ばすにはどうしたらいいのでしょうか?
環境はVC++2010です。

363 :12/03/19
>>362
ppmを厳密に解釈するなら、libpnmのソースと同じようにやるしか。
簡易的には、バイナリで開いておいて行単位に読み出して、コメント行か有効行か判断する。
幅、高さ、濃度最大値を取得できたら、その後はバイト単位で読み出す。

364 :12/03/19
テキストは特別な意味を持ったバイナリなので、やりやすい方を選ぶといいよ。
でも、テキストでオープンすると改行コードをイジっちゃうのでバイナリの意味が変わっちゃうことがあると思う。

365 :12/03/19
今回のケースはバイナリppmの読み込みだから、本体を読むときはテキストモードじゃダメ。

366 :12/03/19
RPGでいういわゆるイベントのクラスを作り起動時にバイナリファイルから読み込ませたいのですが
あるイベントは会話が何ページもあったりと可変長なデータがあるためインスタンスによってサイズはバラバラです
このような大きさがバラバラなデータが詰まったバイナリファイルからデータを読み込むには
普通どのような仕様にしているのでしょうか?全然想像がつきません 環境はVC++2010です

367 :12/03/19
>>366 std::string, std::vector などのコンテナを使う。

368 :12/03/19
ありがとうございます
vectorコンテナでデータを書きこむ時に
データの長さも同時に書きこんでおくといった方法でいけそうですね

369 :12/03/19


370 :12/03/19
>>369
例えば2つの可変長データを含む構造体をバイナリで保存した場合、
それぞれの長さが分からないと、
読み込む時最初の可変長データの次のデータが可変長データの続きなのか、
それとも次の可変長データなのか判断する方法がないと思ったのですがおかしいでしょうか?

371 :12/03/19
>>366
なんでバイナリなの?
xmlは使えないの?
データ構造とファイル設計は混同しちゃダメだよ。

372 :12/03/19
vector<構造体> msg;
で、必要な数だけpush_backする。
表示する場合は、msg.begin()msg.end()を使えば良いのでは?

373 :12/03/19
>>371
xmlが使えるといいなと思うのですが、ファイルの中身が見えてしまうもので
ゲームというジャンルのために暗号をかけたバイナリデータに拘っていました。
本当はバイナリデータなんて使いたくないのですが…。
>>372
きちんとロードできるか試してみます。
表示はそれでいけると思います。
ありがとうございます。

374 :12/03/19
>>373
XMLだって暗号化できるでしょ?
データの記述方法とデータ構造とファイル構造をごっちゃにしちゃだめだよ。

375 :12/03/19
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 :12/03/19
>>374
xmlってそんなこともできるのですね知りませんでした、お恥ずかしい限りです。
xmlについて勉強してみます。

377 :12/03/19
大学でC言語習ったけど全くこのスレのレベルについていけない半年ROMるとなんか変わるの?

378 :12/03/19
>>375
weakをlockしたらshared_ptr取れちゃわない?
俺も似たような問題で悩んでweak_ptrのようにオブジェクトの生存確認が
できるけど所有権は主張しない生ポインタとスマートポインタの中間みたいなやつを
実装しようか迷った末やらなかった

379 :12/03/19
>>376
XMLというか、文字列orバイナリについて暗号化かけるだけだから、
別にXMLどうこうじゃないよね
例えば全部の文字についてXORかければ最低でも普通には読めないで高速な暗号化できるわけで。

380 :12/03/19
>>378
ありがとうございます。取れちゃいますね、、
weak_ptrのlock()が *get()になるようなバージョンがあるといいんですが。
素直にポインタで公開するのが妥当なのでしょうか?

381 :12/03/19
普通に生ぽでいいんじゃね
どうせ呼んでる間は死なないんだろ

382 :12/03/19
>>377
さすがに半年ROMったらかわるっしょ

383 :12/03/19
>>380
ハンドルを使う方法もあるけど、
実際ポインタで困ることはそんなに無い気がする

384 :12/03/19
>>377
とりあえず自分に必要なものを作ってみて、実用しないとニーズの比重がわからないよ。

385 :12/03/20
C++では、Cのように関数の引数の型宣言を)と{の間に
書けないとのことですが、引数が多い場合は、()の中に
改行して書けということでしょうか?

386 :12/03/20
そうだよ

387 :12/03/20
今時そんな構文使えるCコンパイラあるんけ?

388 :12/03/20
Ruby開発者がなぜかこれにしがみついてたなあ

389 :12/03/20
むしろ使えないCコンパイラがどんだけあるんだよって話

390 :12/03/20
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 :12/03/20
Code Pad上ならエラーになるな
まぁGCCの問題だけど
http://codepad.org/ceAMmTJC
いま動くコンパイラって何が有るの?
16bit時代のコンパイラ?

392 :12/03/20
>>385
int Function
(
     int arg1,
     int arg2,
     int arg3,
)
{
     return 0;
}
初めて見たときは寒気が走ったがこういう書き方するところも有る。

393 :12/03/20
全角スペースでエラーになるのがgccの問題とか言っちゃう男の人って・・・

394 :12/03/20
>>391
あいたたたたた

395 :12/03/20
>>392
最後のコンマは書けないぞ
俺はこうか
int Function(
 int arg1,
 int arg2,
 int arg3
) {
 return 0;
}
こうだな
int Function(
 int arg1,
 int arg2,
 int arg3)
{
 return 0;
}
エディタとの相性に合わせて使う

396 :12/03/20
メンゴメンゴやっぱうごいたわ
http://codepad.org/3TQKnfBZ

397 :12/03/20
>>395
カッコの揃える派とカッコどうでもいい派に好みは別れるよね

398 :12/03/20
既存にあわせちゃう

399 :12/03/20
>>396
この書き方だと型チェックが行われないので
1.2 が double 値のままスタックに積まれて、
それを int 値として取り出した結果、無茶苦茶なことになっている
簡単に未定義動作が起きる極めて危険なものなので
今時決して使ってはいけない

400 :12/03/20
>>390
C99でも廃止予定事項なだけで使えるぞ。

401 :12/03/20
385です。先輩方いろいろ教えて下さり有難うございます。
括弧の中に書くのはやっぱり慣れてないというのもあって、
不細工な気がしますね。諦めてpascalに行こうかしら。

402 :12/03/20
その方がいいと思う。
そんな危ない書き方を慣れてないという理由だけで継続するとかとんでもない話だし。

403 :12/03/21
>>399
これでOK。
http://codepad.org/oyP2YgaY
型を省略したらint型ってことだけど、危なくてしゃぁないな。

404 :12/03/21
以前このスレッドでラムダ関数(ラムダ式)の再帰が出来ると聞いたのですけど。
具体的にはどのようにやるのですか?
例:
ある型 f;
f=[ & f ](int a){if(a==0)return; else f(a-1 )};
ってかんじですか?

405 :12/03/21
ttp://ideone.com/Vdw5h

406 :12/03/21
>>405
ありがとうございます。
autoとfunctionの違いは教えてくれませんよね?

407 :12/03/21
>>406
ググれ

408 :12/03/21
メモリ断片化対策としてメモリプールを使ったメモリ確保を実装したいのですが
STLや標準ライブラリなどはいちいち自前のアロケータを指定する方法しかないんでしょうか?

409 :12/03/21
それ以外のどんな方法がほしいんだ?

410 :12/03/21
>>408
プールの実装に確保サイズ以外の情報を使わないのであれば ::operator new () を
置き換えるという方法もあるよ。

411 :12/03/22
>>410
new/delete演算子をグローバルなオーバーロードをすれば
STLや標準ライブラリからも呼ばれるということでしょうか?

412 :12/03/22
>>411
そういうこと。少なくともアロケータ引数を取るテンプレートはデフォルトで std::allocator を
使うことになってて、デフォルトの std::allocator 実装は ::operator new を使うことになってる。
この場合の ::operator new/delete の定義はオーバーロードじゃないけどね。
あとSTLも標準ライブラリの一部な。

413 :12/03/22
>>412
ありがとうございます。
やってみます。

414 :12/03/23
newを自作関数に置き換える手法も容易して欲しいよな。

415 :12/03/23
>>414
それが >>410-413 じゃないのか?

416 :12/03/23
>>414
何言ってんだかわかんねーな

417 :12/03/24
operator new で乗っ取れるんだが、ヘッダにインラインで書けないんだよ

418 :12/03/24
>>417
グローバルに置き換えるんじゃ何か都合が悪いのか?
都合が悪い、指定した対象だけに絞りたいとすれば、それは
アロケータでの指定を行うのが妥当ということにはならないのか?

419 :12/03/24
高速化のために自作newをインライン展開したいんだけどね。
できる処理系と出来ない処理系がある。

420 :12/03/24
クラス内に new 置けばできるでしょ。

421 :12/03/25
きょ、局所的・・・。なんでもないよ。

422 :12/03/27
相談室ということで何やらぼんやりとした質問ですが
virtualとはつまるところ、こいつを継承した何かがあるかもしれないから継承先があるかどうかチェックしてね、という目印のようなものでしょうか

423 :12/03/27
>>422
仮想関数、純仮想関数、ポリモーフィズムとかについて調べた?

424 :12/03/27
答える必要があるのかしら?

425 :12/03/27
答えなくてもいいが答えてくれるとは思うな的な

426 :12/03/27
エリートでらっしゃったのね

427 :12/03/27
相談室に居ながら答えを出し渋る書き込みをする事に何の意味があるのだろうか
教えないつもりなら素直にスルーしとこうぜ
せっかくこういうスレがあってもわざわざ妨害してたら何にもならんし

428 :12/03/27
セイラさんは黙っててくださいよ!

429 :12/03/27
>>422
基底クラスのポインタや参照を使ってメンバ関数を呼んでも
本来のクラスのメンバ関数が呼ばれるというもの

430 :12/03/27
>>422
virtualの有無で、コンパイル結果をアセンブラレベルで比較したことがある。
明らかに違うんだよね。当たり前だが。
で、ポリモーフィズムの仕組みを妙に納得したり。

431 :12/03/28
Smalltalk環境として動作してくれるC++のライブラリってないですかね。
別に、Smalltalkのワールドみたいなウィンドウ表示とかは要らないんで、
Smalltalkのイメージファイルを読み込んで、メソッドを記述した文字列を
送ってやると値を返したり、何らかの振る舞いをするってものでいいんですが。

432 :12/03/28
テンプレートメタプログラミングが関数型に近い動作というのを聞いたこと有るよ。俺、関数型知らないけど。
プリミティブから作るかBoostにもあったような気がする。

433 :12/03/28
日本語で書いてくれ

434 :12/03/28
テンプレートメタプログラミングが関数型に近いって!フフフッ
でもね、関数型知らないんだ♪
プリミティブかBoostでいい感じ〜☆
わかんないけど、とりあえずオッケー☆ウフフ☆ タコヤキ!

435 :12/03/28
>プリミティブから作るかBoostにもあったような気がする。
ここが何言いたいのかさっぱり解らん
前の文とつながってない

436 :12/03/29
えーっと、プリミティブって書いたのはifとかforとかから構築が必要ってこった。タコヤキ!
・・・どこからタコヤキ出てきたんだろう。
さいきんのわかいもんは!・・・なんでもないよ。

437 :12/03/29
Objective-C++でいいんじゃね

438 :12/03/29
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 :12/03/29
>>438
共変の返却値。仕様で認められてるのでDerived*でいい。

440 :12/03/29
>>439
ありがとうございます。そういう専門用語があったのですね。
「共変の返却値」でググったら、全く同じような質問が出てきました。
失礼しました。

441 :12/03/29
共変と反変、どっちがどっちか未だに調べないと思い出せない。

442 :12/03/29
技術用語って時々、英語のまま考えたほうが理解できることがある。

443 :12/03/29
せっかく母国語化しても漢字に含まれる情報が誤誘導するのって
ソース中の無駄に多いコメントみたいなモンだな

444 :12/03/29
字面で見ると漢字の方がわかりやすい

445 :12/03/29
Panda SmalltalkというScript Engineで解決できそうです。有難うございました。

446 :12/03/30
右辺値参照について教えて下さい。
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 :12/03/30
>>446
右辺値参照は普通の参照も受け取れちゃうから。
完全に転送したいならstd::forwardでも使いな。

448 :12/03/31
>>446
Hoge(Hoge&& rhs) { //ここでrhsという名前をつけているからこれは既に右辺値ではなく左辺値になる。
*this = rhs; // 1
//ここでrhsを使おうとする場合があるかもしれない
}

449 :12/03/31
http://www5b.biglobe.ne.jp/~suugaku/vc++kougi/kiso/dai7koudai2wa.html
このページの通りにやったのですがデバックして実行ボタンを押すとフリーズしてしまいます
まだ初めて日が浅いのでどうかおしえてください

450 :12/03/31
それはC++じゃありません
http://toro.2ch.net/test/read.cgi/tech/1268613679/
こっちで聞いてね
それにしても初心者がC++/CLIなんて自行為だぞ

451 :12/03/31
>>450
ありがとうござます
それなら別にフォームアプリケーションを作る方法があるのですか?

452 :12/03/31
>>451
C#を使うのが普通
今からでも遅くないからC#勉強しなさい
>>450のスレ流し読みしてそれでも使いたいっていうんなら止めないが…

453 :12/03/31
>>452
自分は工業高校生で一年間C++でコンソールを作ってきたのでフォームアプリに挑戦したいと思って最近やってみたのですが
C#のほうがいいとは知りませんでした
ありがとうございます

454 :12/03/31
C++/CLIとか、業務で使わざるを得ないんでもなけりゃ見たくもないわ……

455 :12/03/31
C++/CLIを使う意味はないな。
C#を勉強した方が早い。

456 :12/03/31
>>453
C++でGUIやりたいならQt調べろ。C#より楽だぞ。
TOP カテ一覧 スレ一覧 2ch元 削除依頼
【モダン推奨】Perlについての質問箱 50箱目 (162)
【会津】パソコン甲子園2004【若松】 (775)
【Google】Androidアプリ作成part13 (294)
なぜ、 = が 代入 を 表す 記号 に なったか? (568)
パR、パチスロの基盤のプログラム 2 (478)
Visual Studio 2008 Part 21 (537)
--log9.info------------------
失恋あるある Part 1 (259)
相思相愛だが付き合えないってあるんだな (163)
ネットで失恋。2 (360)
失恋した一人暮らし (260)
今、彼女を振ったが死ぬほどつらい (264)
女が嘘をつく理由 (104)
中村さんが好きだった人のスレ3 (648)
好きな人を忘れる方法2 (323)
神新庄という神ですが、お話しませんか? (378)
【返事待ち】告白してきたお【結果報告】 (174)
浜松市民の失恋 (333)
【相性】占いにはまった奴【性格】 (160)
片思いと失恋以外の恋愛経験がない (485)
●次の恋への近道● (702)
【臨時】スレたてお願いスレ【かもめ帰還】 (520)
妊娠→中絶→別れ→復縁 (163)
--log55.com------------------
草野正宗をどうすれば自首させられるか
The Mirraz/ミイラズ 13巻目
【リトグリ】Little Glee Monster ★101
【Kaede】Negicco Part10【connie】
B'zライブジム要注意人物名鑑
Sound Horizon→504番目の地平線→Linked Horizon
♪Silent Siren♪ Part 24
ELLEGARDEN part34