12/02/18 06:07:36.70
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part93
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
URLリンク(codepad.org)
URLリンク(ideone.com)
2:デフォルトの名無しさん
12/02/18 06:08:02.58
■基本■
[C++ FAQ]
URLリンク(www.parashift.com)
URLリンク(www.bohyoh.com) (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
URLリンク(en.cppreference.com) (英語)
URLリンク(ja.cppreference.com) (↑の日本語訳だけどまだ未完)
[Stroustrup]
URLリンク(www2.research.att.com)
[C++ International Standard]
URLリンク(www.iso.org)
[JTC1/SC22/WG21 - C++]
URLリンク(www.open-std.org)
ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
URLリンク(www.jisc.go.jp)
ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
3:デフォルトの名無しさん
12/02/18 06:08:18.34
■Libraries■
[Boost]
Boost URLリンク(www.boost.org)
(日本語) URLリンク(www.kmonos.net)
(日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
SGI-STL URLリンク(www.sgi.com)
STLport URLリンク(stlport.sourceforge.net)
GNU libstdc++ URLリンク(gcc.gnu.org)
Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
STLFilt URLリンク(www.bdsoft.com)
(日本語) URLリンク(episteme.wankuma.com) (※1999年発行注意)
[Loki]
URLリンク(sourceforge.net)
LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)
4:デフォルトの名無しさん
12/02/18 06:09:42.63
■Books■
amazon C,C++関連書籍
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp)
The C++ Programming Language
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
C++ Primer (3rd Edition)
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
The C++ Standard Library
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
Effective C++
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
More Effective C++
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
More Exceptional C++
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++ Style
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
5:デフォルトの名無しさん
12/02/18 06:10:08.52
■Books(Templateまわり)■
Effective STL
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
Modern C++ Design
URLリンク(www.amazon.com)
URLリンク(www.amazon.co.jp) (翻訳)
C++ Templates
URLリンク(www.amazon.com)
C++ Template Metaprogramming
URLリンク(www.amazon.com)
6:デフォルトの名無しさん
12/02/18 12:27:29.38
/ ̄\
| ^o^ | < はんにんは このなかにいます
\_/
/ ヽ
| | | |
| | | |
|| ||
し| i |J=二フ
.| ||
| ノ ノ
.| .| (
/ |\.\
し'  ̄
_
| / ̄\
 ̄| |
_| ̄ \_/
7:デフォルトの名無しさん
12/02/18 12:28:57.89
お前やろ
8:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/18 15:04:50.54
配置new
10:デフォルトの名無しさん
12/02/18 15:29:32.50
make_sharedでnewの呼び出しを2回から1回に減らせる。
11:デフォルトの名無しさん
12/02/18 17:17:53.40
単純な質問ですみませんが、
何故shared_ptr側にオブジェクトを自動アロケートする
メソッドが無いのでしょうか?
引数でオブジェクトのポインタを渡すよりshared_ptr側で
オブジェクトを生成させた方が安全だと思うのですが?
12:デフォルトの名無しさん
12/02/18 17:19:38.08
>>11
make_sharedがあるから
13:デフォルトの名無しさん
12/02/18 17:46:14.86
>>12
あっなるほど・・・
make_sharedってCustom Deleter使いたい時は
自前でAllocator作るしかないですかね?
14:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/18 21:29:49.91
int a[] = {7,0,3,4,0,6};
を
{7,3,4,6,0,0}
のように0を後ろに移動させるようなSTLのアルゴリズムありますか?
16:デフォルトの名無しさん
12/02/18 21:31:34.47
std::remove
17:デフォルトの名無しさん
12/02/18 21:40:24.18
0を削除するつもりではないならstd::partition
18:デフォルトの名無しさん
12/02/18 21:43:14.15
順番を保存したいならstable_partition
19:デフォルトの名無しさん
12/02/18 21:56:33.44
stable_partitionでうまいこと出来ました。
20:デフォルトの名無しさん
12/02/18 22:05:16.24
iostreamに関する質問です
自作マニピュレータでストリームのモードを一時的に変えて、元に戻したいのですが
std::ios::dec等、引数の無い書式フラグの戻し方はわかったのですが、
(例えばlong sv_f = setf(ios::hex, basefileld); →自作処理後、最後に setf(sv_f)で戻す)
setfill('0')の戻し方がわかりませんボスケテ、
21:デフォルトの名無しさん
12/02/18 22:14:33.09
removeとpartitionってどう違うんだ?
22:20
12/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:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/18 23:35:57.33
>>23
なるほど
25:デフォルトの名無しさん
12/02/19 03:18:16.37
C++ではCと異なり変数宣言をスコープの先頭で行わなくてもよくなりましたが、
あるC++のコードでは、次行で即代入を行うような変数もわざわざ宣言を分けてスコープの先頭に置いていました。
{
int a;
a = some_process();
}
こうすることの意味を私なりに考えてみましたが、
・C言語からの移行・もしくは癖
・コーディングルールによるため
・非POD型との統一のため
・デバッグのし易さ(?)
・表記ミス
個人的には可読性の面からも宣言と初期化をまとめたくなりますが、
int a = some_process();
何か意味があれば教えてください。
26:デフォルトの名無しさん
12/02/19 03:23:50.70
昔は
int a;と
a = some_process();の間に変数aを使うコードがあったが削除されて無くなった
つまり分けてる意味は特にない
27:デフォルトの名無しさん
12/02/19 04:05:48.29
objective-cの後に習う言語はC++かCだと、どっちがいいですか?
28:デフォルトの名無しさん
12/02/19 04:09:05.43
>>26
特に意味は無いのですね。ありがとうございます。
29:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/19 12:25:40.50
そういう仕様だから
31:デフォルトの名無しさん
12/02/19 13:19:14.41
さらに
XXX( **********func );
これでもOKだ
32:デフォルトの名無しさん
12/02/19 13:27:27.81
プログラミングアートの基本テクニックの一つだね
33:デフォルトの名無しさん
12/02/19 14:18:30.05
&付けるのが言語仕様的に正しいんだっけ?
34:デフォルトの名無しさん
12/02/19 14:23:11.14
普通の関数はあっても無くても良い
メンバ関数は必須
35:デフォルトの名無しさん
12/02/20 02:19:13.38
Cとの互換性のため引き継いだ仕様とC++の仕様
36:デフォルトの名無しさん
12/02/20 18:06:44.33
fprintf(FILE *,・・・) があると思います。
ここの FILE * のところには stdout も使えると思いますが、
この部分に指定するストリームを自作したいのですが、どんな感じにするんでしょうか。
とりあえず手始めに
fprintf したら指定ファイルのほか、同時に stdout にも出力するような拡張ストリーム作りたいです。
37:デフォルトの名無しさん
12/02/20 18:44:58.48
つ[popen("tee specified.file")]
38:デフォルトの名無しさん
12/02/20 18:46:31.55
>>36
方法が無いわけではないけど、出来ないと思った方がいい
標準Cライブラリ(printf系)でなく標準C++ライブラリ(iostream)を使うこと
もしくは単にfprintfを2回(ファイルとstdout)呼ぶ
fprintfに指定するのはOSが管理するファイルディスクリプタなので
介入するには低レイヤーなライブラリを使うか、fprintfを自作関数として置き換えるか
環境依存な方法(ファイルシステムソケットなど)を使うか、など
・・・普通はやらない
39:デフォルトの名無しさん
12/02/20 19:36:56.53
ストリームを自作するならiostream側でやろうぜ
streambufを自作してiostreamに食わせりゃいい
40:デフォルトの名無しさん
12/02/20 21:24:02.82
C++ストリーム形式のライブラリって頑張って作った割にみんな使ってくれなくてちょっと泣きそうになるよね
オペレーターがキモいのはわかるんだけどでも標準なんだから仕方ないじゃんみたいな
41:デフォルトの名無しさん
12/02/20 21:27:38.01
キモいというのもあるけど
printf形式が楽なんだよね
boost::format使えばいいんだろうけど
42:デフォルトの名無しさん
12/02/20 22:12:49.62
フォーマットマニピュレータくらい用意しててもいいのにな
新旧標準出力同士なぜ上位互換的使い勝手は目指さなかったのか
43:デフォルトの名無しさん
12/02/20 22:36:18.95
演算子オーバーロードが楽しくて
ちょっとはしゃいじゃったんだよ
44:デフォルトの名無しさん
12/02/21 00:24:46.79
反面教師になったのさ
45:デフォルトの名無しさん
12/02/21 07:23:50.17
boost::formatがC++11に入らなかったのは何でだろう
46:デフォルトの名無しさん
12/02/21 08:02:00.07
いまさら言語内言語風に後戻りとかアホすぎだから
プラグインスクリプトか諦めてC++素直に使い括弧バカで通すほうがマシだわ
47:デフォルトの名無しさん
12/02/21 09:34:44.74
iostreamはオーバーヘッド少な目で拡張性の高い仕組みだと思うけど
<<のオーバーロードはホントはしゃいじゃった感じだな
48:デフォルトの名無しさん
12/02/21 10:45:14.60
stream と vector<bool> は可愛い存在。
49:デフォルトの名無しさん
12/02/21 11:03:37.93
個人的にはvector<bool>に助けられてる。
50:デフォルトの名無しさん
12/02/21 11:06:33.30
ベクブー使う奴はクズ
51:デフォルトの名無しさん
12/02/21 11:37:04.47
iomanipは補間候補さえ出てくれば問題ないんだけどなあ
52:デフォルトの名無しさん
12/02/21 12:05:10.54
> 個人的にはvector<bool>に助けられてる。
サイズはbool*size()じゃないでしょ?
53:デフォルトの名無しさん
12/02/21 20:18:00.37
ビット配列なんて別クラスでいいのに・・・
54:デフォルトの名無しさん
12/02/21 20:24:00.49
ビットセットあるやん
55:デフォルトの名無しさん
12/02/21 20:25:14.97
ビットセットはいつもなんか忘れてるな
56:デフォルトの名無しさん
12/02/21 20:25:54.46
実際のブツのできはともかく
論理的な機能と物理的な実装を切り分ける好例ではある
57:デフォルトの名無しさん
12/02/21 20:35:09.59
bitsetはサイズ固定じゃないの
58:デフォルトの名無しさん
12/02/21 20:35:45.52
やるならboost::dynamic_bitsetだな
59:デフォルトの名無しさん
12/02/21 20:38:47.85
サイズ非固定のbitsetって何に使うんだ?
60:デフォルトの名無しさん
12/02/21 20:48:19.89
bitsetすら使う事がないからよく分からない
61:デフォルトの名無しさん
12/02/21 20:59:10.80
基数変換がちゃんと出来る人は、Bitsetで多倍長演算クラスつくると凄そうだなーと思う。
俺できないから、そういうクラス作るとどうしても無駄が出来る。
62:デフォルトの名無しさん
12/02/22 00:05:39.34
>>59
グラフ構造、論理閉包
63:デフォルトの名無しさん
12/02/22 12:31:04.89
パイプすると一回で読み取れるのがスペースか改行までに
勝手になっているんですけど、改行だけにすることはどうやればできますか?
64:デフォルトの名無しさん
12/02/22 12:39:34.03
まず関数名でも書こうか
65:デフォルトの名無しさん
12/02/22 12:40:11.97
読み取り関数名ですか?
それなら<<ですけど。
66:デフォルトの名無しさん
12/02/22 12:40:27.36
訂正
>>でした。
67:デフォルトの名無しさん
12/02/22 13:07:43.75
getline
68:デフォルトの名無しさん
12/02/22 13:16:21.91
ありがとうございます。
69:デフォルトの名無しさん
12/02/22 14:40:33.95
64ビットアプリのばあい
intの代わりにlong longを使い
floatの代わりにdoubleを使うという選択で
最高のパフォーマンスが出せるという
認識であってますか?
70:デフォルトの名無しさん
12/02/22 14:41:50.41
あってない
71:デフォルトの名無しさん
12/02/22 14:42:56.61
どこがあってませんか?
詳しく教えてください。
72:デフォルトの名無しさん
12/02/22 14:46:21.22
大きいものを使う必要あるの?
73:デフォルトの名無しさん
12/02/22 14:51:58.61
>>71
ちょっと考えればわかる
解らなければ向いてないから違う業界に行ったほうが君のためだよ
74:デフォルトの名無しさん
12/02/22 15:07:06.87
業界に入ってないのでわかりません教えてください。
75:デフォルトの名無しさん
12/02/22 15:09:49.99
じゃあ向いてないからやめなさい
76:デフォルトの名無しさん
12/02/22 15:10:19.50
なぜ実測しない
77:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/22 15:43:17.65
こうじゃね?
template<>
void hoge<int,int>(const int&, const int&){} //D
79:デフォルトの名無しさん
12/02/22 16:02:07.82
>>76
わかっているなら教えてくださいよ。
80:77
12/02/22 17:07:46.65
>>78 なるほど、これならいけました。
引数が2つあるので、Aの特殊化になるみたいですね。
BとCを定義した状態で
void hoge<int>(const int&, const int&){} //D
としたら、特殊化できませんでした。
曖昧な場合は特殊化できないみたいですね。
しかも、どうやっても明示できない状況もあるようです。
81:デフォルトの名無しさん
12/02/22 18:03:26.58
>>71
intの定義を調べましょう
intが32bitだと断定してるところはクソサイトだと思って構いません
82:デフォルトの名無しさん
12/02/22 18:05:20.01
>>81
それは知ってます。
16ビットが32ビットになったときみたいに64ビットになったと思っていたら
32ビットだったという経験をしたからlong longを使うという発想にいたったわけです。
83:デフォルトの名無しさん
12/02/22 18:36:04.78
本当に調べましたか?
intは「処理系に最適なサイズ」になります
コンパイラ開発者達が最適だと判断したものよりも
long longの方が最適であると思うのならばそちらを使うのも良いでしょう
その際は実測してから使うことを勧めます
84:デフォルトの名無しさん
12/02/22 18:52:27.95
64bit整数が最適でも32bit整数のほうが速いなんてことはいくらでもある
ケースバイケースで実測する他無い
85:デフォルトの名無しさん
12/02/22 19:17:29.75
intが最速って保証は無かったような…
実測するしかない
86:デフォルトの名無しさん
12/02/22 19:21:42.18
>>82
数値演算の速度と64bitアプリかどうかは無関係
「64bitアプリ」の「64bit」はアドレス空間のこと
int, long long, float, doubleには関係ない
関係あるのはポインタ
87:デフォルトの名無しさん
12/02/22 20:01:13.58
32bitで2回処理が必要なところを64bit1回で済むなら速くなる
そうでなければ変わらない
88:デフォルトの名無しさん
12/02/22 20:04:21.14
実測してから使うのは良いけど
その実測も注意が必要だな
仮に算術演算で64bit整数の方が良い性能だったとしても
配列などで要素数が多い箇所を64bit整数にすると逆に性能が劣化するということがあり得る
単純なケースでの実測結果があらゆるケースに適用出来るとは限らないことを
認識しておく必要がある
89:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/22 22:01:01.44
どこの世界の普通だ
91:デフォルトの名無しさん
12/02/22 22:09:43.57
intが64bitの処理系挙げてみろよ
92:デフォルトの名無しさん
12/02/22 22:10:38.42
64bitでも互換性等の理由からintは32bitが普通だw
ILP64の実例なんて聞いた事無いぞ
93:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/22 22:12:00.33
IP64って規格違反じゃね
95:デフォルトの名無しさん
12/02/22 22:12:07.99
IP64とか規格で許されないのになんで載せてんだか
96:デフォルトの名無しさん
12/02/22 22:15:27.44
intが64bitだと16bitか32bitのどちらかが
拡張整数作らないと使えないからねえ
97:デフォルトの名無しさん
12/02/23 09:32:31.60
32ビットだとレジスターにintを二つ入れて並列演算するから
long longより速いなんてことないですよね?
98:デフォルトの名無しさん
12/02/23 09:33:59.99
は?
99:デフォルトの名無しさん
12/02/23 09:37:22.82
ひ?
100:デフォルトの名無しさん
12/02/23 09:42:30.05
ふ?
101:デフォルトの名無しさん
12/02/23 09:44:38.00
>>97
そんなあなたにMMX?
102:デフォルトの名無しさん
12/02/23 11:21:14.88
昔、卒研でロボティクスのシミュレーションを書いたときに、
プリミティブなdoubleが何の単位を表しているか分からずにデバッグに苦労したことがあります。
書店で立ち読みしてたら、ドメイン固有の型を取り込めなんて金言を読みました。
class Ampere;
class Ohm;
class Volt;
上みたいな型があったら、V=RIに相当する
複数のオペレータをオーバーロードしろってことであってるでしょうか?
103:デフォルトの名無しさん
12/02/23 11:29:00.96
違う型同士の計算を禁止するのが目的だから。
その本の内容はその事例には当てはまらないっぽいよ。
104:デフォルトの名無しさん
12/02/23 12:13:53.94
あの本の内容だと同じ型だけですか。(´・∀・`)ヘー
もうちょっと汎用的な話だと思ってました。
Volt operator*(Ampere,Ohm);
みたいなの書いてたら、コンストラクタの呼び出しが遅いだろうなとか思ったので、
誰かexpression templateみたくアレゲなサンプルコードを書いて欲しいな、なんて。
(実際は面倒だろうから本番用だけtypedefでdoubleにするけども)
105:デフォルトの名無しさん
12/02/23 12:27:21.59
時限付き数値計算したいのならboost使えばいいよ
実装が知りたければboostを読めばいいよ
106:デフォルトの名無しさん
12/02/23 12:43:57.57
boost::Unitsなんてのあったんですね。トンクス
107:デフォルトの名無しさん
12/02/24 08:47:15.96
C++でプログラム書くのを覚えるとCでプログラム書くのは無理
Cを読むくらいならできるけど、Cで書くなんてバカらしくてやってらんない
108:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/24 09:15:32.96
そんなことしなくても
boost::functionとかstd::functionとか使えばいいんじゃない?
110:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/24 09:48:49.33
template< class T >
class test { ... }
みたく書けばいいのじゃないか?
113:デフォルトの名無しさん
12/02/24 10:33:33.42
ひとつのデリゲートならfunction + bind
イベントハンドラのように複数のデリゲートならsignals2 + bind
114:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/24 22:25:49.82
>>114 エラーメッセージ貼れよ
116:デフォルトの名無しさん
12/02/25 01:26:45.97
漠然とエラーと言われてもなあ
117:デフォルトの名無しさん
12/02/25 08:38:52.67
std::cin>>aをstd::getline(a)と同じ様に改行まで読み込めて
スペースも読み込むようにできませんか?
118:デフォルトの名無しさん
12/02/25 08:39:27.35
訂正
std::cin>>aをstd::cin.getline(a)と同じ様に改行まで読み込めて
スペースも読み込むようにできませんか?
119:デフォルトの名無しさん
12/02/25 08:43:01.49
>>117-118
class Line { ... };
std::istream& operator >> (std::istream& s, Line& a) { return s.getline(a....); }
120:デフォルトの名無しさん
12/02/25 08:46:44.29
ありがとうございます
121:デフォルトの名無しさん
12/02/25 10:00:36.01
そこまでして>>を使わざるを得ないのか
何かの途中で使いたいのかな
122:デフォルトの名無しさん
12/02/25 10:04:08.25
入力の始めの2行はスペースがないと仮定して
cin>>a
cin>>a
cin.getline(a)
ってやるとなぜかgetline(a)が4行目になっているんですよ。
不思議ですね。
123:デフォルトの名無しさん
12/02/25 10:05:07.22
getline(cin, a);
としか使わないな
何か昔cin.getline(a);として
思い通りの動きにならなかった記憶がある
124:デフォルトの名無しさん
12/02/25 12:53:37.04
未だにバッファにバイナリでreadして自前処理してるわ俺
C++のストリームの機能全然使いこなせてない
iteratorとか使ってドヤ顔したい
125:デフォルトの名無しさん
12/02/25 14:02:40.51
>>124
自分の意図通りの細かいことをやりたければ、結局そこに行き着くんだが。>自前処理
126:デフォルトの名無しさん
12/02/25 14:11:47.17
>>122
読み込ませているファイルも提示しないで何言ってるんだか。
取り敢えず、全てgetline()で試してみたらどうだ?
127:デフォルトの名無しさん
12/02/25 14:35:31.84
普通に
11111111111111111111111
11111111111111111
111111111111111111111
111111111111111111
111111111111111111111
11111111111111111
みたいなスペースも何も無いファイルなんですけど・・・・
改行文字が\r\nじゃなくて\nだからですかね?
128:デフォルトの名無しさん
12/02/25 15:16:55.62
まさかと思うがWindowsか?
だとしたら、ios::inだけでなくios::binaryも指定してみたらどうだろう。
129:デフォルトの名無しさん
12/02/25 15:42:24.95
いまどきwindowsは恥ずかしいからlinuxに移行しようと思ったんですけど
どうしても動かない機器があるので仕方なくwindows7使ってます。
スミマセンでした。
あとは言われたとおりにして見ます。
ありがとうございました。
130:デフォルトの名無しさん
12/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は色々な部分で使い回したい。(だから上の例では継承して変数関数を追加した)
②全てのクラスをBへのポインタで多態的に操作したい(ダウンキャストもしたくない)
を満たすよううまいこと改良できないでしょうか。テンプレートとか使えないかな。
BにB2、DにD2の機能を纏めてしまえば上手くいくんだけど、それだと①が満たせなくて困ってます。
B2にBという機能を持たせたくて、それでいてD2との継承構造も保っていたいみたいな。
B←B2
↑ ↑
D←D2
こんなイメージにしたいんだがここまで書いて自分の説明の下手さに絶望した。
エスパーさん助けてください。
131:デフォルトの名無しさん
12/02/26 12:11:52.31
仮想継承とかそういう話?
132:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/26 17:07:23.73
②次元配列を宣言した後また代入し直したいのですが
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 17:09:58.92
連投失礼します。上の例は不規則ではないですけど実際は不規則な感じになってます
136:デフォルトの名無しさん
12/02/26 17:11:03.73
memcpyあたりで一気にやればいいと思うよ
137:デフォルトの名無しさん
12/02/26 17:12:47.54
>>134
最後の要素のカンマはアウツ
138:デフォルトの名無しさん
12/02/26 17:17:18.71
ありがとうございます
139:デフォルトの名無しさん
12/02/26 17:20:42.42
>>137
アウツじゃないよ
アウツなのはenum
C++11でOKになったけど
140:デフォルトの名無しさん
12/02/26 17:23:08.80
肝腎なことを書けよ。
>>134
二重に括弧が必要。
141:デフォルトの名無しさん
12/02/26 18:00:01.16
実はカッコを二重にする事は必須ではない
すべきだけど
142:デフォルトの名無しさん
12/02/26 18:04:30.80
hoge::hoge()
: a(),
b(),
c(),
{}
も認めて欲しい。
143:デフォルトの名無しさん
12/02/26 18:09:03.38
hoge::hoge() :
a(),
b(),
c(),
{}
の方が統一性があっていいな
144:デフォルトの名無しさん
12/02/26 18:10:08.30
hoge::hoge()
: a()
, b()
, c()
{}
145:デフォルトの名無しさん
12/02/26 18:22:35.19
hoge::hoge(int x){int y=x/2;a();b(x);c(y); }
の記述でOKと成るようにメンバ初期化ツリーの構築くらいコンパイラ側で面倒見てくれればよかったのに
146:デフォルトの名無しさん
12/02/26 18:26:14.89
hoge::hoge()
: a()
: b()
: c()
{}
がいい
147:デフォルトの名無しさん
12/02/26 18:53:19.38
そういうの言い出したらキリが無いからなあ・・・
if (
a ||
b ||
c ||
) {
}
とか
hoge(
a,
b,
c,
);
とか
148:デフォルトの名無しさん
12/02/26 19:09:42.74
>>144
コロン ( : ) とカンマ ( , ) で意味が違うものをそろえてもしょうがない、
て言うか単なる馬鹿。
149:デフォルトの名無しさん
12/02/26 19:10:56.50
if文の{}は省略出きるんだから関数やクラスも省略出来るべき
int hoge()
return 0;
class hoge
int a;
150:デフォルトの名無しさん
12/02/26 19:33:15.03
>>148
意外と見かけるというか
VC自体がそういうインデントに対応してた気がする
151:デフォルトの名無しさん
12/02/26 19:55:28.61
俺もVCで綺麗になるから>>144だな。
152:デフォルトの名無しさん
12/02/26 20:30:17.35
俺はキモいからやらないけどな
153:デフォルトの名無しさん
12/02/26 20:34:16.85
Emacsも>>144だった気がする
154:デフォルトの名無しさん
12/02/26 20:34:30.72
プロは一行にぶち込んで終わり
素人ほどくだらない形式にこだわる
155:デフォルトの名無しさん
12/02/26 21:09:26.88
自称プロ キタ--------------------ッ!!
156:デフォルトの名無しさん
12/02/26 21:17:34.51
>>134
URLリンク(ideone.com)
157:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/26 22:13:12.65
>>157
> STLアルゴリズムの関数オブジェクトってunary_functionとかbinary_functionの継承って必須ですか?
98のころのファンクションアダプタ(bind1stやnot1とか)に引数と戻り値の型を知らせるのに使ってただけだから
そういったものを使わないならいらない。
(そして11ではunary_function、binary_functionやそういった古いアダプタは将来廃止予定になった)
159:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/27 14:32:40.43
swprintf つかえ
161:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/27 14:41:49.58
swprintf_s つかえ
163:デフォルトの名無しさん
12/02/27 14:44:57.72
通りました!ありがとうございました!
どうしてなんでしょうか!?
164:デフォルトの名無しさん
12/02/27 14:48:02.76
警告をエラーとして扱いオプションをオンにしていたから
コンパイルが失敗した
165:デフォルトの名無しさん
12/02/27 14:50:30.35
なるほど!ありがとうございました!
166:デフォルトの名無しさん
12/02/28 02:38:25.61
template <class T0...>
void func(const T0& val0...)
みたいな引数の型と引数を延々と伸ばしていくようなプリプロセス処理はどのようい書けばいいんでしょうか?
以下のような意図です
URLリンク(ideone.com)
Boost.PP使うと楽という話は聞いたことがあるんですが、
Boostが使用できない環境なので、C++標準の方法でなんとかする書き方を知っている方がいれば、是非お願いします。
167:デフォルトの名無しさん
12/02/28 03:48:39.64
C99のプリプロセッサを使えばOK。
168:デフォルトの名無しさん
12/02/28 07:18:45.90
可変引数マクロはC++11にも追加されるぜ
コンパイラが対応していない場合はどうしようもないが
可変引数テンプレートが使えるような環境なら対応してるんじゃないの?
__VA_ARGS__でググれ
169:デフォルトの名無しさん
12/02/28 07:32:15.09
でも可変引数テンプレートが使える環境なら
マクロじゃなくてテンプレート使えとも思うけど
170:166
12/02/28 11:02:20.46
済みません確かにコンパイラ書いてませんでした
コンパイラはMSVC10です
C++11への対応やその他の要素と可搬性考えて、C++03の範囲でなんとか...
171:デフォルトの名無しさん
12/02/28 11:21:50.91
C++で基本クラスの仮想関数をオーバライドする際、
基本クラスにその関数がなければコンパイルエラーとなるような
指定方法って無いものですか?
なんで仮想関数なのに基本クラスのほうが呼ばれるのか延々と悩んでいたら、
関数名のスペルミスだった、なんてことがあったので。
172:デフォルトの名無しさん
12/02/28 11:44:27.09
>>171
C++11#明示的な仮想関数オーバーライド
URLリンク(ja.wikipedia.org)
>C++11では、overrideキーワードの導入により、このような問題が解消された
C++11で良いなら出来る
173:デフォルトの名無しさん
12/02/28 12:00:37.54
なんでムーブ代入演算子は自分のデータをデリートするのではなくて
相手のデータと交換するんですか?
174:デフォルトの名無しさん
12/02/28 12:05:19.74
実装が簡単で効率がいいからです
175:デフォルトの名無しさん
12/02/28 12:22:42.65
>>172
どうもです。
最新仕様に組み込まれたということは、やっぱりそういう仕組みが求められてたのか。
純粋仮想関数をオーバライドした派生クラスをさらに派生するときには
必ずその関数を再オーバライドしなければいけない
という指定もできればよかったな。
176:デフォルトの名無しさん
12/02/28 13:04:57.73
関数ポインタを持つクラスをシリアライズするにはどうすればいいですか?
関数に静的なID振ってそれを保存するしかないですかね?
この場合template関数の場合にどうするべきか・・・
177:デフォルトの名無しさん
12/02/28 13:54:54.53
printf("%p", func)
でいいだろ。テンプレートだろうと。
何を問題にしているのかわからん
178:デフォルトの名無しさん
12/02/28 14:28:34.48
>>177
意味不明
179:デフォルトの名無しさん
12/02/28 14:30:58.80
>>173
むしろswapによる効率化を標準化した結果moveが出来上がったようなもの
180:デフォルトの名無しさん
12/02/28 14:34:25.13
>>176
関数ポインタ諦めて関数オブジェクト持たせるようにするとか……
>>177
関数のアドレスが変化しないなら良いのかもしれんが、それはどうだろう
>>178
アドレスを書きだせって意味でしょ
181:デフォルトの名無しさん
12/02/28 14:36:13.79
>>173
削除するコストが無駄だから
移動跡地のオブジェクトは使われないっていう前提だし
182:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/02/28 20:25:48.06
>>170
C++03だと無理だねえ
#define hoge(a) printf a
hoge(("hoge%d", 9));
のような事ならできるけど、
結局関数が必要になるので
根本的な解決にはなってないだろうし
184:デフォルトの名無しさん
12/02/28 21:16:09.51
C++03の範囲でやろうと無茶したのがboost.PPだし
やるならboost.PP見てマネするしか・・・
185:デフォルトの名無しさん
12/02/29 00:45:10.62
boost.PPはCPPの暗黒面に落ちてるだろ
スクリプトで我慢しろよ
186:デフォルトの名無しさん
12/02/29 14:04:47.98
C++11のスレッド機能はどこで勉強しましたか?
教えてください。
187:デフォルトの名無しさん
12/02/29 14:49:45.63
国内です
188:デフォルトの名無しさん
12/02/29 16:03:13.60
wikipediaさんやgoogle先生に教えてもらいました
189:デフォルトの名無しさん
12/03/01 15:14:43.41
引数ありのコンストラクタが引数無しのコンストラクタ
class Test{
bool po;
public:
Test()
:po(NULL)
{
190:デフォルトの名無しさん
12/03/01 15:16:01.15
途中で書き込んでしまいましたすいません
引数ありのコンストラクタが引数無しのコンストラクタ呼ぶことって可能ですか?
class Test{
bool po;
public:
Test()
:po(NULL)
{
}
Test( int i )
{
// ここでTest()のやつをうごかしたい
}
};
191:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/01 16:06:49.62
なおC++11になれば普通に可能
193:デフォルトの名無しさん
12/03/01 17:40:26.30
で?
194:デフォルトの名無しさん
12/03/01 17:46:44.47
C++03で出来ないから代替手段を示したんだと思うが
195:デフォルトの名無しさん
12/03/01 18:08:49.02
>>184
配置newを使えば出来ないことも無いだろ
PODじゃないメンバーを持っているとちょっとまずいが
196:デフォルトの名無しさん
12/03/01 18:09:39.11
間違えた
184じゃなくて194だ
197:デフォルトの名無しさん
12/03/01 18:21:56.39
スタック配置にplacement newは処理系依存とか以前見たことあるけど大丈夫?
スタック配置不可クラスにするならいいけど
198:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/01 19:32:07.96
Test a = Test(); イコール Test a();だから
200:デフォルトの名無しさん
12/03/01 19:39:23.03
最適化されてるだけ
Test()はどうせすぐに消えてなくなるオブジェクトだからいちいちコピーしないで横取りしてしまおうとコンパイラが気を利かせてくれた
201:デフォルトの名無しさん
12/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
12/03/01 20:34:01.08
>>199-201
どうもです。
気を利かせてくれるのはいいけど悩みました
203:デフォルトの名無しさん
12/03/04 09:41:25.32
A
└B
├C1
└C2
というような継承関係になっていて、
A*型のポインタの先が「Bそのもの」かを判定したい場合、
どのような方法がありますか?
dynamic_cast<B*>だとC1やC2だったときにも成功してしまうと思うのですが。
204:デフォルトの名無しさん
12/03/04 10:43:47.11
typeid
205:203
12/03/04 11:49:25.28
>>204
こんなものがあったんですか。
キャストばかり調べてました。
206:デフォルトの名無しさん
12/03/05 14:06:02.61
void hoge(){}
void moge(){return hoge();}
ってVC2008だとエラーでないんですけど正しい文法ですか?
207:デフォルトの名無しさん
12/03/05 14:06:33.83
正しい文法
208:デフォルトの名無しさん
12/03/05 14:47:26.66
ラムダ関数で再帰する方法ありますか?
209:デフォルトの名無しさん
12/03/05 15:22:12.07
はい
210:デフォルトの名無しさん
12/03/05 15:30:47.00
>>209
ありがとうございます。
211:デフォルトの名無しさん
12/03/05 15:31:58.50
いえいえ
212:デフォルトの名無しさん
12/03/09 13:45:52.33
c++のstring型でsprintfみたいな文字列を編集する関数ってありますか?
charを使ったc言語風の文字列操作がc++ではできずに困っています
初心者過ぎる質問で申し訳ない
213:デフォルトの名無しさん
12/03/09 13:49:27.60
std::stringstreamでいいよ
214:デフォルトの名無しさん
12/03/09 15:48:20.68
boost::formatでいいよ
215:デフォルトの名無しさん
12/03/09 16:44:30.17
マニピュレーターのきもさは異常
216:デフォルトの名無しさん
12/03/09 20:45:34.99
まにぴゅっ
どぴゅっ
217:デフォルトの名無しさん
12/03/09 22:30:54.38
無名構造体でググルと偉そうに講釈垂れてるくせに
使い方知らんヤツ多いな。すぐ解る話だろうになんでだろ。
218:デフォルトの名無しさん
12/03/09 22:46:47.92
まともなやつはそんなの使わない
219:デフォルトの名無しさん
12/03/09 22:48:18.77
無名構造体はunionでブロック共有するくらいしか使わない気がする。
220:デフォルトの名無しさん
12/03/09 22:50:43.14
>>219
そうそう
union X{ struct{int a;}; struct{char b}; };
ってのが用途だよな。
221:デフォルトの名無しさん
12/03/09 23:15:17.62
何いってんのこいつ
222:デフォルトの名無しさん
12/03/09 23:19:27.29
無名構造体とかCなら常用だろ
typedef struct {
...
} hoge;
とか
223:デフォルトの名無しさん
12/03/09 23:22:12.45
普通に使うな、うん。
224:デフォルトの名無しさん
12/03/09 23:26:49.81
そもそも無名構造体は規格違反だし
225:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/09 23:36:05.83
ああ、無名構造体って共用体で使う変数名ない方の事言ってんのか
あれは規格違反だな
227:デフォルトの名無しさん
12/03/09 23:38:24.39
タグ名って省略出来なかったっけ?
228:デフォルトの名無しさん
12/03/09 23:40:56.37
無名の共用体と言われて何のことか
ダイレクトにわかんねーやつは禿本をもっと読んだほうがいい
229:デフォルトの名無しさん
12/03/09 23:44:05.46
無名構造体はタグ名のない構造体の事ではないらしい
230:デフォルトの名無しさん
12/03/09 23:44:54.47
>>229
了解。
231:デフォルトの名無しさん
12/03/09 23:46:04.78
普通に名前付けるかその場でtypedefしないとエラーだよ
232:デフォルトの名無しさん
12/03/10 00:04:51.06
unionで使う無名構造体について詳細キボン
この会話の意味を知りたい
233:デフォルトの名無しさん
12/03/10 00:08:41.16
>>226
struct Example{int x;};
struct Holder{Example};
Holder holder;
holder.x = 10;
こういう匿名構造体とは違うぞ。
234:デフォルトの名無しさん
12/03/10 00:14:08.15
>>232
共用体の中に即席の構造体を作れる。
共用体以外で用の無い構造体を使うときに使う物。
例えば、X11風のWindow Messageはこう書ける。
struct Message
{
int type;
union
{
struct{ /* マウスイベント用 */ };
struct{ /* キーボードイベント用 */ }
/*** その他イベント用構造体が続く ***/
};
};
235:デフォルトの名無しさん
12/03/10 00:17:56.33
>>234
エラー
236:デフォルトの名無しさん
12/03/10 00:23:05.86
>>235
コンパイラによっちゃ引っかかるわな
237:デフォルトの名無しさん
12/03/10 00:25:44.82
unionの外からはアクセスできないデータ集合ができるということ?
238:デフォルトの名無しさん
12/03/10 00:26:10.24
コンパイラによっては拡張でおk
239:デフォルトの名無しさん
12/03/10 00:28:52.44
>>238
コレは拡張だろうけど、exportもコンパイラによって実装具合が違うよな。
240:デフォルトの名無しさん
12/03/10 00:29:23.87
exportさんはC++11で退学になったのでもうどうでもいい
241:デフォルトの名無しさん
12/03/10 00:30:38.07
要するに、>>234でいうと例えば、union内でマウスイベントが int, Point 型を持っていたとしたら
Messageのポインタを
struct MouseMessage { int a; int b; Point p; };
型のポインタに変換して使わせるとかそういう目的のテクニックという認識でいいの?
242:デフォルトの名無しさん
12/03/10 00:34:07.09
>>237
うんにゃ。
Message message;
message.構造体のメンバー名;
って事で、直接構造体メンバーを指定すれば操作できる。
んで、同じ構造体のメンバーを操作する限りは、
タダの構造体と同じだけど、違う構造体のメンバーに触った場合は、
メモリー上同じ位置にある構造体のメンバーすべてが書き換わる。
243:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/10 00:45:51.26
>>243
だからエラーだって
VC++とかの糞環境じゃないと無名構造体は使えないの
245:デフォルトの名無しさん
12/03/10 00:47:28.25
>>240
VCより遥かに準拠率高いBorland C++ Builder XとComeau C/C++馬鹿にすんな
246:デフォルトの名無しさん
12/03/10 00:47:42.06
いずれにしろ標準の機能ではないということさ
247:デフォルトの名無しさん
12/03/10 00:47:51.46
はいはい
248:デフォルトの名無しさん
12/03/10 00:48:13.37
>>244
使える環境でのはなししてんだろ
コミュ障かよ
249:デフォルトの名無しさん
12/03/10 00:49:10.46
>>243
名前重複させられないのでエラー
250:デフォルトの名無しさん
12/03/10 00:49:40.29
>>244
お前ってかわいそうだな
251:デフォルトの名無しさん
12/03/10 00:53:04.76
>>244
アスペは黙ってろ
252:デフォルトの名無しさん
12/03/10 00:53:52.53
>>250
心理学では研究され尽くしてメジャーなネタだけど知ってるか?
議論口論で論理的に勝てないとなったら人間って無意識に人格攻撃を始めるんだぜ
解りやすいやつだなお前は
253:デフォルトの名無しさん
12/03/10 00:55:06.54
へーうんちく垂れたきゃ他所の板でやりな
254:デフォルトの名無しさん
12/03/10 00:55:26.20
>>252
「空気」⇦読めますか?
255:デフォルトの名無しさん
12/03/10 00:57:25.03
規格外の話はほかのスレでやってくれ
何のために環境依存OKのスレがあると思ってるんだ
256:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/10 11:14:12.58
>>256
だったらスレ統一しろ
分かれてるってことは暗黙に禁止されてるってことだよ
そんなこともわからねーのか
喫煙室があるのに共同スペースでタバコふかす汚物並に調子乗ってんなお前らって
258:デフォルトの名無しさん
12/03/10 11:38:01.76
>>257
悔しいのぉ悔しいのぉ
259:デフォルトの名無しさん
12/03/10 11:39:51.46
>>258
そういう幼稚なあおりしかできないわけ?
放射能に頭やられちまったみたいだな
260:デフォルトの名無しさん
12/03/10 11:42:37.44
いいから環境依存スレ行けば全て解決するんだからお前らまとめてあっち行けや
261:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/10 12:37:41.70
>>261
内部で参照カウントされてるから問題ないよ
それとは関係ないところでミスってる可能性大
263:デフォルトの名無しさん
12/03/10 12:45:05.47
>>259
( ´,_ゝ`)プッ
264:デフォルトの名無しさん
12/03/10 13:18:59.12
>>263
なんだBOTか
相手して損したわ
265:デフォルトの名無しさん
12/03/10 14:24:34.52
>>262
そうすか
ちょっと見なおしてみます
266:デフォルトの名無しさん
12/03/10 15:35:03.73
Javascript/ECMAscriptスレに飽きてこっちにキたのか?
267:デフォルトの名無しさん
12/03/10 21:28:09.73
_beginthreadexで3つのスレッドを作る場合
_endthreadexでここのスレッドを判別するにはどうしたら良いのでしょうか?
268:デフォルトの名無しさん
12/03/10 21:45:29.47
_endthreadexはスレッド内から呼ぶものであって
判別もなにもないぞ
269:デフォルトの名無しさん
12/03/10 22:09:55.29
>>267 その話をすると >>257 が湧いてくるぞ
_beginthreadexは方言の話以上に、OS依存の話だからな。
270:デフォルトの名無しさん
12/03/10 22:12:09.75
>>267
スレッドのポインタを使う
271:デフォルトの名無しさん
12/03/10 22:19:41.38
_endthreadexを使うのと、_beginthreadexの戻り値で取得したハンドルをCloseHandleで消す方法ってどう違うの?
272:デフォルトの名無しさん
12/03/10 22:30:04.82
>>271
_endthreadexにはバグがあって100%メモリリークするから
常にCloseHandleを使う方法を利用するほうがいい
_endthreadexは忘れてもいいよ
273:デフォルトの名無しさん
12/03/10 22:33:09.91
>>272
マジですか?
有用な情報ありがとう!
274:デフォルトの名無しさん
12/03/10 22:33:21.03
_endthreadexなんて何に使うの?
普通にreturn 0;で戻ればいいだけじゃね?
275:デフォルトの名無しさん
12/03/10 22:36:21.65
>>274
それだとスレッドが永遠に走り続けるからヤバイ
276:デフォルトの名無しさん
12/03/10 23:01:52.31
>>275
うそん
URLリンク(msdn.microsoft.com)(v=vs.80).aspx
277:デフォルトの名無しさん
12/03/10 23:04:37.17
あれじゃん。メモリーリークするつってんのは、デストラクターが呼ばれないからでしょ。
return;でスレッド関数終了するとちゃんとデストラクター呼ばれるし、そのあと自動で_
endthreadex呼ばれてスレッド自体もちゃんと破棄されるじゃん。
278:デフォルトの名無しさん
12/03/10 23:06:13.69
あと、CloseHandleはスレッドハンドル閉じるもんでしょ、
ハンドルのリソース解放するもんで_endthreadexとは毛色がちがうじゃん。
279:デフォルトの名無しさん
12/03/10 23:26:04.51
_beginthreadexって基本クソだよね
他のが使えるなら他の使うのが良い
280:デフォルトの名無しさん
12/03/10 23:42:01.49
exit(int)のスレッド版でしょ。
代替手段を考えるにしても_exitthreadexを使おうと思うに至る事自体が稀だと思うが。
281:デフォルトの名無しさん
12/03/11 00:04:45.82
throwしてスレッドエントリでcatchすべき
スレッド内でcatchされない例外があるとプログラムが死ぬ
282:デフォルトの名無しさん
12/03/11 02:25:57.18
>>272
_endthreadexとCloseHandleを同列に見るやつ前もいたけどcalleeとcallerの区別もついてないのかよ
283:デフォルトの名無しさん
12/03/11 04:20:10.08
マクドナルドでの便利な呪文:
「callerください。あ、calleeは抜きで!」
284:デフォルトの名無しさん
12/03/11 05:46:41.76
【審議中】 ( ´・ω) (´・ω・) (・ω・`) (ω・` )
285:デフォルトの名無しさん
12/03/11 07:57:50.53
最近なるべくconstを付けるように意識してるんですが、constなメンバを持つクラスの
operator =を書くときに困っています。
たとえば内部に持つバッファのサイズなどはコンストラクタで決まり、以後変更されないのでconstにしています。
が、そうするとconst_castでconstをはがさないと代入演算子が書けないわけで・・・
こういうときはどうするべきなのでしょう。
1.constではなくmutableにすべき
2.代入演算子を書くべきでない。使うときはコピーコンストラクタで済ませるべき
3.そもそもその程度の不変性ならconstにするな
アドバイスいただけると嬉しいです。
286:デフォルトの名無しさん
12/03/11 09:34:11.03
3だね
287:デフォルトの名無しさん
12/03/11 12:02:34.88
メンバでconstってほとんどつかわんよ
コンパイル時定数ぐらい
288:デフォルトの名無しさん
12/03/11 12:06:44.76
俺も定数以外では引数にしか使わないな
289:デフォルトの名無しさん
12/03/11 12:14:39.10
メンバでconst使うとしたら
コピーコストの大きなオブジェクトを
コンストラクタのconst参照で受け取って保持するときくらいだな。
寿命の管理に気をつけないといけないけど。
290:デフォルトの名無しさん
12/03/11 12:17:04.81
そもそも代入の対象が const って、超初歩的な誤りじゃん
291:285
12/03/11 12:25:51.16
なるほど・・・納得しました。
constつけないように変更してみます、ありがとうございました。
292:デフォルトの名無しさん
12/03/11 12:30:29.30
構築された後は、そのオブジェクトにどんな操作をしても値が変わらないメンバならconstにすべきだろうけど
293:デフォルトの名無しさん
12/03/11 17:16:33.24
ポインター以外にどうしてもconstつけたいなら、
代入演算系をprivateにして制限するのも手よ。
imutableオブジェクトの完成だ。
294:デフォルトの名無しさん
12/03/11 21:34:23.89
ハンドルされていない例外が発生しました。
↑が直らないんですが、どうやって対処すれば良いのでしょうか・・・
295:デフォルトの名無しさん
12/03/11 21:53:56.51
>>294
例外をハンドルすればいいと思うよ。
296:デフォルトの名無しさん
12/03/11 22:31:10.52
>>295
日本語でおk
297:デフォルトの名無しさん
12/03/11 22:42:45.65
訳すと馬鹿には無理
298:デフォルトの名無しさん
12/03/11 22:47:22.51
>>294
教えてもらおうとしても駄目
このスレには屑しかいないんだから
299:デフォルトの名無しさん
12/03/11 22:48:11.87
>>294
例外の中身を調べてみろよ
300:デフォルトの名無しさん
12/03/11 23:35:07.57
「例外をハンドルするには」でググったらいい
301:デフォルトの名無しさん
12/03/11 23:40:03.44
>>300
catchする時、型が解ってなけりゃいつまで経っても
ハンドルできんだろう
302:デフォルトの名無しさん
12/03/12 00:01:33.95
try{ throw exception(); }catch(...){}
303:デフォルトの名無しさん
12/03/12 01:41:36.01
動的配列の途中に挿入・削除をする方法を教えてください。
listである条件に当てはまるものを削除したいときは
remove_if()を使えばいいらしいのですが、使い方が分かりません。
304:デフォルトの名無しさん
12/03/12 01:56:24.45
erase insert使えばいいよ
305:デフォルトの名無しさん
12/03/12 09:01:46.79
>>303
此処読んでみな。
URLリンク(marupeke296.com)
306:デフォルトの名無しさん
12/03/12 11:22:45.03
URLリンク(ideone.com)
307:デフォルトの名無しさん
12/03/12 18:29:50.20
>>305
ありがとうございます
これで大方理解できました。
>>306
[](int val){ return val == 2 || val == 3; }のようにわざわざ他で関数を作らなくてもできるんですね。参考になります。
[](type n){}の書き方の[]の意味は戻り値の型の略称ということでいいんでしょうか。
308:デフォルトの名無しさん
12/03/12 18:36:26.00
よくないです
309:デフォルトの名無しさん
12/03/12 18:38:07.37
「c++ ラムダ式」でググるといい
特に[]の中の指定は結構特殊だから
310:デフォルトの名無しさん
12/03/12 18:38:16.12
C++でFortranのようにベクトル計算するにはどうすればいいんですか?
311:デフォルトの名無しさん
12/03/12 19:53:31.50
>>309
普通に使う分にはある程度できるようになりました。
ありがとうございます。
あとはクラスがどうのこうのを学ばないとなぁ
312:デフォルトの名無しさん
12/03/12 20:53:36.74
>>310
uBlus or Blits++
313:デフォルトの名無しさん
12/03/13 19:05:49.64
boost::shared_ptrをvoid*に入れたいのですが、できますでしょうか?
フレームワークに設けられている便利に使っていいvoid*なんですが
&でアドレス取得して入れたら、うまく動作しませんでした。
&でアドレス取得する場合、参照カウントが増えなくて消えちゃうみたいです。
こういう時ってどう実装するものなのでしょう?。。
314:デフォルトの名無しさん
12/03/13 19:21:32.29
struct foo{boost::shared_ptr ptr;};とかやればいいんじゃねーの
315:デフォルトの名無しさん
12/03/13 19:55:09.32
>>314
ありがとうございます。試してみます。
316:デフォルトの名無しさん
12/03/13 20:21:24.59
boost::shared_ptr を new して void* に渡すとか
317:デフォルトの名無しさん
12/03/13 22:35:58.79
すみません、アルゴリズム的な作曲をやろうとしている文系です…
ソースを貼らせてください
URLリンク(codepad.org)
余計な部分は省略しています。
これで、コンパイル時のエラーはないのですが、scanfが実行される前に、
プログラムが止まってしまいます。
本当に稚拙なプログラムで済みません、初心者なもので。
どなたか問題点を教えていただけないでしょうか。
318:デフォルトの名無しさん
12/03/13 22:39:51.79
p = 0 じゃなくて p == 0 だな
319:デフォルトの名無しさん
12/03/13 22:40:09.29
他にも色々な所で同じ間違いがあるね
320:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/13 23:12:41.47
エラー復帰してないから
エラーを clear() してから a を読み捨てないと、
永遠に先まで読み進められない
322:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/13 23:36:16.35
>>321
エラー復帰とは具体的にどういうことをすればよいのでしょうか?
初心者で申し訳ありません
324:デフォルトの名無しさん
12/03/13 23:46:00.25
> > エラー復帰とは具体的にどういうことをすればよいのでしょうか?
> エラーを clear() してから a を読み捨てる
325:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/14 00:21:23.51
>>324
何をclearすればよいのでしょうか?
cin.clear();
をやってみたのですがダメでした・・
327:デフォルトの名無しさん
12/03/14 00:25:04.26
>>326
>a を読み捨てる
328:デフォルトの名無しさん
12/03/14 00:28:09.60
初心者でもそれくらい調べろよ
329:326
12/03/14 15:19:23.31
cin.clear();
cin.ignore();
をしたら解決しました
>>321の言うとおりclearしてignoreしたら正常に動作しました
ありがとうごさいました
ただ何故こうしたらうまくいくのかよくわかりません
上の2つを逆にしてもダメでした
どなたか解説して頂けると助かります
330:322
12/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:デフォルトの名無しさん
12/03/14 23:49:53.69
いや、そのへん以前に
j <= p <= j+2
は
(j <= p) <= j+2
であってpがある範囲内にあるかどうかの判定になっていないから
332:322
12/03/14 23:54:51.40
>331さん
なるほど!
ではpがある範囲内にあるかどうかの判定は、
j <= p && p <= j +2
とでもすればいいのでしょうか。
333:デフォルトの名無しさん
12/03/15 00:09:21.33
>>329
ちったぁ考えれ
cin >> num; で a が見つかってエラーになって、cin.clear(); しても、
次の読み込みはまた a からなの
正しく読めるまで先には進まないの
だからまたエラーになるの
これがずっと続くってわけ
334:デフォルトの名無しさん
12/03/15 00:10:46.51
初心者ってcinを使いたがるけど、これ初心者には必要ないよね。
つーか誰にも必要ないよね。
335:デフォルトの名無しさん
12/03/15 01:05:51.31
>>332
それでいい
336:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/15 10:04:21.02
>>336 this->CBaseA::operator=(obj)
338:デフォルトの名無しさん
12/03/15 10:05:43.28
別にキャストいらんだろ
てかdynamic_castは間違い
339:デフォルトの名無しさん
12/03/15 10:14:28.60
>>337
有難うございます!
こういう書き方も出来たんですね!
>>338
ダウンキャストは承知していましたが、継承元のoperator=を呼ぶ必要があったために
やむ終えず>>336の書き方をしていました。
知識不足で恥ずかしい限りです。
340:デフォルトの名無しさん
12/03/15 15:03:40.92
キャスト使うならこうだろ
static_cast<CBaseA &>(*this) = obj;
341:デフォルトの名無しさん
12/03/15 21:11:41.42
>>334
Linux関連じゃ、istreamに突っ込んでんのをたまに見る
342:デフォルトの名無しさん
12/03/15 21:12:46.78
>>337
thisもいらんだろ
343:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/18 16:46:01.81
オーバーフローしてんじゃね
345:デフォルトの名無しさん
12/03/18 17:08:10.03
>>343
そりゃ、1画素がchar 1個分だもんな。
1画素をchar 6個分(double)で読み込みゃそりゃずれるで
346:デフォルトの名無しさん
12/03/18 17:15:48.22
doubleは8個分
347:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/18 19:14:02.74
テンプレのFAQが英語なんですけど翻訳して読めってことですかコレ
349:デフォルトの名無しさん
12/03/18 19:51:44.93
どのプログラミング言語にしても英語が読めたほうが捗るぞ。
なんたって言語作者の9割以上が外国人だしな。
350:デフォルトの名無しさん
12/03/18 20:12:39.10
フランスに渡米するみたいなもんか
351:デフォルトの名無しさん
12/03/18 20:16:47.83
そりゃ人間の9割以上が外国人なんだから当然だろうよ。
352:デフォルトの名無しさん
12/03/18 20:21:36.94
Rubyは貴重だな
353:デフォルトの名無しさん
12/03/18 20:26:28.13
英悟は別格で置いとくとしてGoogleで調べると日本語と他の国言語では
Rubyに限らずコンテンツ量が一桁以上違うから
内容の濃淡は知らんけど日本は恵まれてると思うよ
354:デフォルトの名無しさん
12/03/18 21:44:20.01
ちょっと日本語がわからない。
もう少しわかりやすく。
355:デフォルトの名無しさん
12/03/18 21:45:35.76
いうても、日本語ほど英語と文法の離れてる言語も多くないよな。
多少ひねれば英語化できる言語圏じゃ、母国語資料の少なさなんて
大した問題じゃないんだろ。リーナスやハゲだってフィンランド人だし。
356:デフォルトの名無しさん
12/03/18 22:13:22.65
多いよ
SVOは全言語中でむしろマイナー
日本語と同じSOVが45%を占めている
357:デフォルトの名無しさん
12/03/18 23:04:35.70
母国語でここまで頑張っている、というのもある意味驚異的なことでして。
358:デフォルトの名無しさん
12/03/18 23:42:15.55
プログラムに限らず母国語話者に対する期待の違いだろうね
途上国言語で話題振っても誰も付いてこない来れない悲しみと対極にある
359:デフォルトの名無しさん
12/03/19 00:02:14.89
そういう国は英語で頑張ってるからな
360:デフォルトの名無しさん
12/03/19 00:07:25.08
ボビーオロゴンとかアホそうな振る舞いしてたけど
真面目に話したら、俺らよりはるかに頭いいんだろうな
何せマルチリンガルらしいし
361:デフォルトの名無しさん
12/03/19 00:13:38.15
C++に関しては繁体字圏がコンテンツ量で結構頑張ってるな
perlやHaskellなんかだと日本語と比べるべくも無いが
362:デフォルトの名無しさん
12/03/19 02:23:37.24
>>344-347
回答ありがとうございます。
やっぱり全然本質を理解できてないですね^^;参考になりました。
もうひとつ聞きたいことがあるのですが
バイナリで書かれたppm形式は画素値はバイナリで書かれていますが、ヘッダはテキストで書かれています。
このときifstreamを使ってファイルを読み込むときはオープンモードはbinaryを指定したほうがいいのですか?
またヘッダのテキスト部分がコメント等で長さが分からない場合に、ヘッダ部分を読み飛ばすにはどうしたらいいのでしょうか?
環境はVC++2010です。
363:デフォルトの名無しさん
12/03/19 02:35:39.30
>>362
ppmを厳密に解釈するなら、libpnmのソースと同じようにやるしか。
簡易的には、バイナリで開いておいて行単位に読み出して、コメント行か有効行か判断する。
幅、高さ、濃度最大値を取得できたら、その後はバイト単位で読み出す。
364:デフォルトの名無しさん
12/03/19 02:36:02.85
テキストは特別な意味を持ったバイナリなので、やりやすい方を選ぶといいよ。
でも、テキストでオープンすると改行コードをイジっちゃうのでバイナリの意味が変わっちゃうことがあると思う。
365:デフォルトの名無しさん
12/03/19 02:56:31.39
今回のケースはバイナリppmの読み込みだから、本体を読むときはテキストモードじゃダメ。
366:デフォルトの名無しさん
12/03/19 13:31:21.65
RPGでいういわゆるイベントのクラスを作り起動時にバイナリファイルから読み込ませたいのですが
あるイベントは会話が何ページもあったりと可変長なデータがあるためインスタンスによってサイズはバラバラです
このような大きさがバラバラなデータが詰まったバイナリファイルからデータを読み込むには
普通どのような仕様にしているのでしょうか?全然想像がつきません 環境はVC++2010です
367:デフォルトの名無しさん
12/03/19 13:37:28.25
>>366 std::string, std::vector などのコンテナを使う。
368:デフォルトの名無しさん
12/03/19 14:08:38.64
ありがとうございます
vectorコンテナでデータを書きこむ時に
データの長さも同時に書きこんでおくといった方法でいけそうですね
369:デフォルトの名無しさん
12/03/19 14:11:58.88
?
370:366,368
12/03/19 14:27:55.83
>>369
例えば2つの可変長データを含む構造体をバイナリで保存した場合、
それぞれの長さが分からないと、
読み込む時最初の可変長データの次のデータが可変長データの続きなのか、
それとも次の可変長データなのか判断する方法がないと思ったのですがおかしいでしょうか?
371:デフォルトの名無しさん
12/03/19 14:36:19.03
>>366
なんでバイナリなの?
xmlは使えないの?
データ構造とファイル設計は混同しちゃダメだよ。
372:デフォルトの名無しさん
12/03/19 14:37:39.25
vector<構造体> msg;
で、必要な数だけpush_backする。
表示する場合は、msg.begin()��msg.end()を使えば良いのでは?
373:366
12/03/19 15:43:41.33
>>371
xmlが使えるといいなと思うのですが、ファイルの中身が見えてしまうもので
ゲームというジャンルのために暗号をかけたバイナリデータに拘っていました。
本当はバイナリデータなんて使いたくないのですが…。
>>372
きちんとロードできるか試してみます。
表示はそれでいけると思います。
ありがとうございます。
374:デフォルトの名無しさん
12/03/19 17:33:23.80
>>373
XMLだって暗号化できるでしょ?
データの記述方法とデータ構造とファイル構造をごっちゃにしちゃだめだよ。
375:デフォルトの名無しさん
12/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
12/03/19 18:37:22.16
>>374
xmlってそんなこともできるのですね知りませんでした、お恥ずかしい限りです。
xmlについて勉強してみます。
377:デフォルトの名無しさん
12/03/19 19:34:03.99
大学でC言語習ったけど全くこのスレのレベルについていけない半年ROMるとなんか変わるの?
378:デフォルトの名無しさん
12/03/19 19:40:54.84
>>375
weakをlockしたらshared_ptr取れちゃわない?
俺も似たような問題で悩んでweak_ptrのようにオブジェクトの生存確認が
できるけど所有権は主張しない生ポインタとスマートポインタの中間みたいなやつを
実装しようか迷った末やらなかった
379:デフォルトの名無しさん
12/03/19 19:45:52.94
>>376
XMLというか、文字列orバイナリについて暗号化かけるだけだから、
別にXMLどうこうじゃないよね
例えば全部の文字についてXORかければ最低でも普通には読めないで高速な暗号化できるわけで。
380:デフォルトの名無しさん
12/03/19 20:15:38.57
>>378
ありがとうございます。取れちゃいますね、、
weak_ptrのlock()が *get()になるようなバージョンがあるといいんですが。
素直にポインタで公開するのが妥当なのでしょうか?
381:デフォルトの名無しさん
12/03/19 20:20:29.26
普通に生ぽでいいんじゃね
どうせ呼んでる間は死なないんだろ
382:デフォルトの名無しさん
12/03/19 22:06:28.71
>>377
さすがに半年ROMったらかわるっしょ
383:デフォルトの名無しさん
12/03/19 22:07:30.27
>>380
ハンドルを使う方法もあるけど、
実際ポインタで困ることはそんなに無い気がする
384:デフォルトの名無しさん
12/03/19 23:53:51.31
>>377
とりあえず自分に必要なものを作ってみて、実用しないとニーズの比重がわからないよ。
385:デフォルトの名無しさん
12/03/20 13:37:16.64
C++では、Cのように関数の引数の型宣言を)と{の間に
書けないとのことですが、引数が多い場合は、()の中に
改行して書けということでしょうか?
386:デフォルトの名無しさん
12/03/20 14:00:00.62
そうだよ
387:デフォルトの名無しさん
12/03/20 14:54:19.71
今時そんな構文使えるCコンパイラあるんけ?
388:デフォルトの名無しさん
12/03/20 15:09:18.14
Ruby開発者がなぜかこれにしがみついてたなあ
389:デフォルトの名無しさん
12/03/20 15:18:26.47
むしろ使えないCコンパイラがどんだけあるんだよって話
390:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/20 16:20:35.89
Code Pad上ならエラーになるな
まぁGCCの問題だけど
URLリンク(codepad.org)
いま動くコンパイラって何が有るの?
16bit時代のコンパイラ?
392:デフォルトの名無しさん
12/03/20 16:23:00.68
>>385
int Function
(
int arg1,
int arg2,
int arg3,
)
{
return 0;
}
初めて見たときは寒気が走ったがこういう書き方するところも有る。
393:デフォルトの名無しさん
12/03/20 16:26:01.05
全角スペースでエラーになるのがgccの問題とか言っちゃう男の人って・・・
394:デフォルトの名無しさん
12/03/20 16:41:08.16
>>391
あいたたたたた
395:デフォルトの名無しさん
12/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:デフォルトの名無しさん
12/03/20 16:47:47.41
メンゴメンゴやっぱうごいたわ
URLリンク(codepad.org)
397:デフォルトの名無しさん
12/03/20 16:49:06.61
>>395
カッコの揃える派とカッコどうでもいい派に好みは別れるよね
398:デフォルトの名無しさん
12/03/20 16:56:42.52
既存にあわせちゃう
399:デフォルトの名無しさん
12/03/20 16:59:09.59
>>396
この書き方だと型チェックが行われないので
1.2 が double 値のままスタックに積まれて、
それを int 値として取り出した結果、無茶苦茶なことになっている
簡単に未定義動作が起きる極めて危険なものなので
今時決して使ってはいけない
400:デフォルトの名無しさん
12/03/20 17:05:06.31
>>390
C99でも廃止予定事項なだけで使えるぞ。
401:デフォルトの名無しさん
12/03/20 19:49:26.83
385です。先輩方いろいろ教えて下さり有難うございます。
括弧の中に書くのはやっぱり慣れてないというのもあって、
不細工な気がしますね。諦めてpascalに行こうかしら。
402:デフォルトの名無しさん
12/03/20 23:10:23.09
その方がいいと思う。
そんな危ない書き方を慣れてないという理由だけで継続するとかとんでもない話だし。
403:デフォルトの名無しさん
12/03/21 08:42:18.70
>>399
これでOK。
URLリンク(codepad.org)
型を省略したらint型ってことだけど、危なくてしゃぁないな。
404:デフォルトの名無しさん
12/03/21 11:07:25.08
以前このスレッドでラムダ関数(ラムダ式)の再帰が出来ると聞いたのですけど。
具体的にはどのようにやるのですか?
例:
ある型 f;
f=[ & f ](int a){if(a==0)return; else f(a-1 )};
ってかんじですか?
405:デフォルトの名無しさん
12/03/21 11:47:34.68
URLリンク(ideone.com)
406:デフォルトの名無しさん
12/03/21 11:50:18.46
>>405
ありがとうございます。
autoとfunctionの違いは教えてくれませんよね?
407:デフォルトの名無しさん
12/03/21 11:55:23.10
>>406
ググれ
408:デフォルトの名無しさん
12/03/21 23:46:09.58
メモリ断片化対策としてメモリプールを使ったメモリ確保を実装したいのですが
STLや標準ライブラリなどはいちいち自前のアロケータを指定する方法しかないんでしょうか?
409:デフォルトの名無しさん
12/03/21 23:49:18.96
それ以外のどんな方法がほしいんだ?
410:デフォルトの名無しさん
12/03/21 23:49:43.38
>>408
プールの実装に確保サイズ以外の情報を使わないのであれば ::operator new () を
置き換えるという方法もあるよ。
411:デフォルトの名無しさん
12/03/22 00:01:40.50
>>410
new/delete演算子をグローバルなオーバーロードをすれば
STLや標準ライブラリからも呼ばれるということでしょうか?
412:デフォルトの名無しさん
12/03/22 00:12:39.92
>>411
そういうこと。少なくともアロケータ引数を取るテンプレートはデフォルトで std::allocator を
使うことになってて、デフォルトの std::allocator 実装は ::operator new を使うことになってる。
この場合の ::operator new/delete の定義はオーバーロードじゃないけどね。
あとSTLも標準ライブラリの一部な。
413:デフォルトの名無しさん
12/03/22 00:20:42.01
>>412
ありがとうございます。
やってみます。
414:デフォルトの名無しさん
12/03/23 01:16:08.89
newを自作関数に置き換える手法も容易して欲しいよな。
415:デフォルトの名無しさん
12/03/23 03:36:11.12
>>414
それが >>410-413 じゃないのか?
416:デフォルトの名無しさん
12/03/23 08:52:23.54
>>414
何言ってんだかわかんねーな
417:デフォルトの名無しさん
12/03/24 01:09:01.95
operator new で乗っ取れるんだが、ヘッダにインラインで書けないんだよ
418:デフォルトの名無しさん
12/03/24 01:34:29.07
>>417
グローバルに置き換えるんじゃ何か都合が悪いのか?
都合が悪い、指定した対象だけに絞りたいとすれば、それは
アロケータでの指定を行うのが妥当ということにはならないのか?
419:デフォルトの名無しさん
12/03/24 23:34:30.02
高速化のために自作newをインライン展開したいんだけどね。
できる処理系と出来ない処理系がある。
420:デフォルトの名無しさん
12/03/24 23:38:11.15
クラス内に new 置けばできるでしょ。
421:デフォルトの名無しさん
12/03/25 01:48:53.74
きょ、局所的・・・。なんでもないよ。
422:デフォルトの名無しさん
12/03/27 09:32:26.41
相談室ということで何やらぼんやりとした質問ですが
virtualとはつまるところ、こいつを継承した何かがあるかもしれないから継承先があるかどうかチェックしてね、という目印のようなものでしょうか
423:デフォルトの名無しさん
12/03/27 10:18:58.88
>>422
仮想関数、純仮想関数、ポリモーフィズムとかについて調べた?
424:デフォルトの名無しさん
12/03/27 16:00:04.90
答える必要があるのかしら?
425:デフォルトの名無しさん
12/03/27 16:06:27.51
答えなくてもいいが答えてくれるとは思うな的な
426:デフォルトの名無しさん
12/03/27 16:08:31.14
エリートでらっしゃったのね
427:デフォルトの名無しさん
12/03/27 17:45:48.25
相談室に居ながら答えを出し渋る書き込みをする事に何の意味があるのだろうか
教えないつもりなら素直にスルーしとこうぜ
せっかくこういうスレがあってもわざわざ妨害してたら何にもならんし
428:デフォルトの名無しさん
12/03/27 18:56:37.91
セイラさんは黙っててくださいよ!
429:デフォルトの名無しさん
12/03/27 19:12:33.48
>>422
基底クラスのポインタや参照を使ってメンバ関数を呼んでも
本来のクラスのメンバ関数が呼ばれるというもの
430:デフォルトの名無しさん
12/03/27 21:51:38.93
>>422
virtualの有無で、コンパイル結果をアセンブラレベルで比較したことがある。
明らかに違うんだよね。当たり前だが。
で、ポリモーフィズムの仕組みを妙に納得したり。
431:デフォルトの名無しさん
12/03/28 21:52:36.51
Smalltalk環境として動作してくれるC++のライブラリってないですかね。
別に、Smalltalkのワールドみたいなウィンドウ表示とかは要らないんで、
Smalltalkのイメージファイルを読み込んで、メソッドを記述した文字列を
送ってやると値を返したり、何らかの振る舞いをするってものでいいんですが。
432:デフォルトの名無しさん
12/03/28 22:33:58.48
テンプレートメタプログラミングが関数型に近い動作というのを聞いたこと有るよ。俺、関数型知らないけど。
プリミティブから作るかBoostにもあったような気がする。
433:デフォルトの名無しさん
12/03/28 22:48:08.42
日本語で書いてくれ
434:デフォルトの名無しさん
12/03/28 23:51:36.82
テンプレートメタプログラミングが関数型に近いって!フフフッ
でもね、関数型知らないんだ♪
プリミティブかBoostでいい感じ~☆
わかんないけど、とりあえずオッケー☆ウフフ☆ タコヤキ!
435:デフォルトの名無しさん
12/03/28 23:59:41.95
>プリミティブから作るかBoostにもあったような気がする。
ここが何言いたいのかさっぱり解らん
前の文とつながってない
436:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 00:57:09.00
えーっと、プリミティブって書いたのはifとかforとかから構築が必要ってこった。タコヤキ!
・・・どこからタコヤキ出てきたんだろう。
さいきんのわかいもんは!・・・なんでもないよ。
437:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 07:20:55.86
Objective-C++でいいんじゃね
438:営利利用に関するLR審議中@詳細は自治スレへ
12/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審議中@詳細は自治スレへ
12/03/29 10:24:50.56
>>438
共変の返却値。仕様で認められてるのでDerived*でいい。
440:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 10:43:26.27
>>439
ありがとうございます。そういう専門用語があったのですね。
「共変の返却値」でググったら、全く同じような質問が出てきました。
失礼しました。
441:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 16:55:43.84
共変と反変、どっちがどっちか未だに調べないと思い出せない。
442:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 18:06:22.51
技術用語って時々、英語のまま考えたほうが理解できることがある。
443:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 18:42:38.31
せっかく母国語化しても漢字に含まれる情報が誤誘導するのって
ソース中の無駄に多いコメントみたいなモンだな
444:営利利用に関するLR審議中@詳細は自治スレへ
12/03/29 20:00:18.82
字面で見ると漢字の方がわかりやすい
445:431
12/03/29 20:02:26.55
Panda SmalltalkというScript Engineで解決できそうです。有難うございました。
446:営利利用に関するLR審議中@詳細は自治スレへ
12/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審議中@詳細は自治スレへ
12/03/30 22:27:00.73
>>446
右辺値参照は普通の参照も受け取れちゃうから。
完全に転送したいならstd::forwardでも使いな。
448:営利利用に関するLR審議中@詳細は自治スレへ
12/03/31 00:06:50.58
>>446
Hoge(Hoge&& rhs) { //ここでrhsという名前をつけているからこれは既に右辺値ではなく左辺値になる。
*this = rhs; // 1
//ここでrhsを使おうとする場合があるかもしれない
}
449:営利利用に関するLR審議中@詳細は自治スレへ
12/03/31 10:08:25.95
URLリンク(www5b.biglobe.ne.jp)
このページの通りにやったのですがデバックして実行ボタンを押すとフリーズしてしまいます
まだ初めて日が浅いのでどうかおしえてください
450:営利利用に関するLR審議中@詳細は自治スレへ
12/03/31 10:12:23.55
それはC++じゃありません
スレリンク(tech板)
こっちで聞いてね
それにしても初心者がC++/CLIなんて自殺行為だぞ
451:営利利用に関するLR審議中@詳細は自治スレへ
12/03/31 10:31:16.28
>>450
ありがとうござます
それなら別にフォームアプリケーションを作る方法があるのですか?