1 :
デフォルトの名無しさん :
2009/07/18(土) 02:54:58
9 :
8 :2009/07/18(土) 03:39:56
10 :
8 :2009/07/18(土) 03:41:12
コンパイラは gcc 3.4.4 です
ostream operator<<(ostream &stream, coord<U> ob) istream operator>>(istream &stream, coord<U> &ob) ↑ ここに&がないじぇ
>>11 ご指摘ありがとうございました。うまくいきました。参照返しなのを忘れておりました。
だよね。オブジェクトのコピーか参照かっていうのは本質的な違いだよね。
前スレ1000gj
15 :
デフォルトの名無しさん :2009/07/19(日) 01:28:32
もし、(a==真かつb==真かつc==偽)かつ(d==真またはe==)が 真のときf=真 else { f=偽 } endif なif文書きたい場合、どういった工夫をしたらいいですか? 乱視な俺にはカッコのインデントがチカチカして頭痛が痛い
16 :
デフォルトの名無しさん :2009/07/19(日) 01:29:33
c==偽)または(d== 添削ミスですorz
e==真として、そのままf = (a && b && !c) || (d && e);と書き下す以外に書き方ってあるの?
if(){if(){if()hoge}endif}endif・・・
次のような条件があるなら関数にすればいい ・ 判定方法に名前をつけられる ・ メンバー変数による判定、あるいは、何度か使用する判定
21 :
デフォルトの名無しさん :2009/07/19(日) 19:38:35
シングルトンクラスを作りたいと思います。 インスタンスを得るのにgetInstance()など 作って使うのが一般的だと思いますが、 operator new()の中に含めても、同等の機能が 実現出来る気がします。 operator new()にすると、何か目に見えるデメリットなど ありますか?
>>21 まず無駄にdeleteを実装しなきゃならない上、ユーザーにシングルトンオブジェクト
のライフサイクルを考えさせることになる。
だったらgetInstance()一発の方が楽だと思うが。
>>21 newの戻りが常に同じポインタにするのかな?deleteが困っちゃうね。
既存の関数をオーバーロードするときに明らかに違う機能を入れると混乱の元だよ。
「初回使用時生成」でググってみよう
その前にまずシングルトンにすることのメリットがあるのかどうか、よく考えたほうがいいだろうな。
>>22-24 お答えありがとうございます。
>>その前にまずシングルトンにすることのメリットがあるのかどうか、よく考えたほうがいいだろうな。
対象は、MDIの子ウインドウクラスです。
子ウインドウのインスタンスは唯一になります。
サンプルがシングルトンを使っていたので、
同様に使うようにしましたが、確かにシングルトンでなくても
良い気がします。そっちの方を考えてみます。
>>delete
これは例えば、C#等のガペコレがあるやつだと
無問題になるのでしょうか。
>>明らかに違う機能を入れると混乱の元
確かにそうですね、考え直します。
>>25 C#などのガベージコレクタでは問題はおきない。それと引き換えにガベージコレクタの処理が重くなっている。これがいわゆる等価交換である。
子ウィンドウがシングルトンなんてありえないだろjk
>>25 もし子ウインドウが1つしか存在し得ないのなら、そもそもMDIを使うのが
間違いだな。
シングルトンってシングルスレッドでは単に関数の中にstaticな変数をラップするだけなのね。
BOOST_TYPEOFってどんな実装なの?コード書いてあるとこよく分んないんだけど…
>>31 ,32
ありがとう。これは使い物にならんわ…
C++の入門書の通り、mainに cout<<"Hello, world" って書いたらいきなりコンパイルエラーがでて笑った。 ちょっと調べたらusingでstd::を省略できることはわかったけど、 そうすると全てのstd::の名前空間が含まれてしまうらしいなw C++って仕様がちょっとマヌケすぎないか?
その入門書がマヌケなだけ
using std::cout;でおk
ろくに知らないのに馬鹿な発言して恥をかく典型。
そのクソ入門書がこれ以上売れてしまわないように書名を晒すのが君の義務だ
数時間かけて その入門書片手にくだらないレスを考えていたんだろうから バカでも許してやろうぜ。
GetRand()関数について質問させてください。 0〜100の乱数の中のひとつがほしいときは、 GetRand(100) で受け取れるんですが、100〜200の中の乱数がほしいときは どのように記したらいいんでしょうか。 どうやっても出来ないんで、誰か助けてください。
GetRand(100) + 100で問題あるの?
すみません、知識不足すぎました。 GetRand内だけで済ませようとした自分がアフォすぎました。 低レベルすぎてすみませんでした。 お騒がせして申し訳ありませんでした。。。 では。
アフォすぎたとへこむより、そう考えるのかーと思えないとなぁ
46 :
デフォルトの名無しさん :2009/07/23(木) 19:50:07
#ifndef HOGE_H #define HOGE_H #endif HOGE_H ヘッダーのインクルードガードの#endifにマクロが記述してあるコードを見たんですが、これってどうなんですか? どういう役割があるのか、やった方がいいのか悪いのか、誰か解説して下さい。
どういう意味もない。無視される
無視されることは決められてるの? #endif //HOGE_H というスタイルは割と見る
無視はされないだろ 普通に#defineが何度も定義されるだけだと思うが
詳しくお願いします。
>>48 #ifndef HOGE_H
#define HOGE_H ←ここでHOGE_Hを#defineしてるから
#endif HOGE_H ←ここのHOGE_Hは空白に置き換えられる
53 :
49 :2009/07/23(木) 20:36:56
勘違いでしたすいませんorz
実装方法のスタンダードを教えてください。 自分で作ったクラスに、 「WM_PAINT時に動かしたい paint メソッド」と、 「WM_CREATE時に動かしたい create メソッド」と、 「WM_CLOSE時に動かしたい close メソッド」 があるとします。 今までは、特定ウィンドウのメッセージループでいちいち paint 等を呼び出していましたが、サブクラス化できるように 構成を変えたいと思います。 サブクラス化する手法として、もっとも一般的な実装方法を ご教授ください。
55 :
54 :2009/07/23(木) 23:42:15
すみません、語弊がありました。 ×サブクラス化する手法として ○サブクラス化するためのインターフェイスの手法として よろしくおねがいします。
>>54 その自分で作ったクラスから派生させるなり、
paint,create,closeを持ったインターフェース用意してそれを呼ぶようにしたりしちゃダメなの?
いやいや、SetPropとかSetWindowLongPtr使えってテンプレ回答では?
>>57 そういうことか
メッセージループでswitch文書きたくないのかと思った
ある関数void foo(unsigned int num)内の出来事。 引数numに格納された値を使って、 char* array = new char[num]; として確保して使いたい。 ところが使用後(fooスコープを脱出後)には自動的に破棄されるようにしたい。 これを実現するのに一番簡単な方法は何でしょうか? デストラクタを利用して出来そうな気がするのですが。 よろしくお願いいたします。
std::vector<char> v(num); char *array = &v[0];
61 :
59 :2009/07/24(金) 15:01:42
>>60 なるほど、vectorの内部の配列は連続していることが保証されているというのを使うわけですね。
ありがとうございました。
#include <boost/scoped_array.hpp> boost::scoped_array<char> s( new char[num] ); char *array = &s[0]; これだとダメかな? 知ってる人いません?
63 :
62 :2009/07/24(金) 15:13:36
char *array = s.get(); でしたね。 失礼。
後でサイズ変更しないならいいんじゃねぇの
int型のベクターの初期化で楽な方法ってありますか? int配列はint a[]={1,2,3}みたいにかけるので 今は一時的にint配列をつかってこんな風にやってるんですが vector<int> v; int d[]={1,3,2,5,6,17,8,0,2}; copy(d,d+sizeof(d)/sizeof(d[0]),back_inserter(v));
vector<int> v(&d[0], &d[sizeof(d)/sizeof(d[0])]);
ありがとうございました
boostにそれ用のコーポネントがある。 boost::assignでぐぐれ
C++ code - 39 lines - codepad
ttp://codepad.org/6eGTAvJT ここにある関数
call_display_1(&d);
call_display_2(d);
call_display_3(d);
のうち、call_display_1とcall_display_3はdisplay()が仮想関数として
定義されているので挙動は理解出来ます。
call_display_2(d);
は、引数をconst参照で受け取っていますが、これでも仮想関数は必ず有効で
標準出力に"Derived Class."が出力されると保証されていますか?
「参照はポインタを使って実装されている」
と聞いたことがありますが、こういった実装上の理由ではなく、
標準C++の仕様上確かに保証されていますか?
はい
色々やってみたけど結局templateでjavaジェネリクスのextends条件はできませんでした。
こんなのどうよ class A {}; class B : public A {}; class C {}; template <typename T> class X { public: X(){ T *t = 0; A *a = t; // Aの派生クラスでなければここでERROR }}; int main() { X<A> a; // OK X<B> b; // OK X<C> c; // ERROR }
>>71 じゃあJavaに変えると良いよ。
スレ違い。
Boost.ConceptCheckのConceptAssertとTypeTraitsのisBaseOfでできるな
// boostだとこうなる。参考書丸パクリだが #include <iostream> #include <typeinfo> #include <boost/type_traits.hpp> #include <boost/utility/enable_if.hpp> template< typename sub_class, typename super_class, class = void > class X{ public: X() { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型ではありません。") << std::endl;} }; template< typename sub_class, typename super_class > class X< sub_class, super_class, typename boost::enable_if< boost::is_base_of< super_class, sub_class > >::type >{ public: X() { std::cout << typeid(sub_class).name() << _T("は、") << typeid(super_class).name() << _T("の派生型です。") << std::endl;} }; struct A{}; struct B : A{}; struct C{}; int _tmain(int argc, _TCHAR* argv[]) { X< B, A > x0; // strect Bは、strect Aの派生型です。 X< C, A > x1; // strect Cは、strect Aの派生型ではありません。 return 0; }
>>76 まさに真理だなw
黒魔術というか、テンプレートメタプログラミングはチューリング完全だから
効率を気にしなければ他のプログラミング言語で実現出来ることは何でも出来る。
>>77 むしろ実行効率は良いという、恐ろしいことが証明されているんだよね。
ただし開発効率は発狂物だろうがww
という事は超頑張ればコンパイル時にMP3を鳴らす事も!・・・
>>79 本当にやってるヤツが世界にはいるのではないだろうかw
C++ code - 169 lines - codepad
ttp://codepad.org/0JbIj2qe ここにあるコードを
Windows XP HomeEd SP2
g++ (GCC) 3.4.5 (mingw special)
でコンパイルして実行したところ、
「実行時エラー」
になりました。
本来は上記のサイトにあるようにコンパイル時エラーになって欲しい物ですが、
どうして実行時エラーになってしまうのでしょうか?
ちなみに意図的にコメントアウトしてある
// friend bool operator == (const MyInt& lhs, const MyInt& rhs){return lhs.num==rhs.num;}
の部分をコメント解除すると問題無く動作するようになります。
初心の者ですが、派生クラスのコンストラクタで悩んでいます。 派生クラスのコンストラクタをクラスを定義するスコープの外で定義することは可能でしょうか。 class Base { private: int x; public: Base(int x); }; Base::Base(int x) { this->x = x; } class Derived : public Base { private: int y; public: Derived(int x, int y) : Base(x); }; Derived::Derived(int x, int y) : Base(x) { this->y = y; } ではコンパイラから叱られてしまいます。どのように書けばいいのでしょうか。
public: Derived(int x, int y);
84 :
69 :2009/07/25(土) 20:14:00
85 :
81 :2009/07/25(土) 20:16:29
自決しました。 どうやらコンパイラ(g++ (GCC) 3.4.5 (mingw special))の仕様のようです。 バグって言い切っていいのかは分かりませんが。 自決方法 Windows XP HomeEd SP2 g++ (TDM-1 mingw32) 4.4.0 この環境でなら問題無く動作するようになります。
86 :
71 :2009/07/25(土) 20:30:16
>>73 すみません
>>74-76 ありがとうございます。そしてごめんなさい。
使用コンパイラがbcc5.5なのですが、is_base_ofの中核部分だけを取り出して
コンパイルした結果、bccではうまく判別できず、VC2008ではうまく判別できました。
どうやらbccでは定数の初期化式に関数の呼出し等があると、コンパイルは通っても
値は0?とかになってしまうようです。だめですね…
88 :
82 :2009/07/25(土) 21:42:32
std::maxのような関数テンプレートは どの標準ヘッダに定義されていますか??
algorithm
>>85 いろいろ問題がありそうなコードだけど
コンパイルエラーになることが、
"問題無く動作する"ってことなの?
92 :
85 :2009/07/25(土) 23:36:04
>>91 > コンパイルエラーになることが、
> "問題無く動作する"ってことなの?
はい、g++としてはコンパイル時エラーで教えてくれる方が
正しい挙動だと思いまして。
> いろいろ問題がありそうなコードだけど
例えばどこが問題でしょうか?
93 :
89 :2009/07/25(土) 23:37:04
94 :
85 :2009/07/25(土) 23:41:38
>>91 > いろいろ問題がありそうなコードだけど
#define OPERATOR_MY〜〜
などのマクロが登場していることや
public :
int_t num;
の様にメンバが丸裸のpublicアクセス指定されている事
以上2点はサンプルコードだからです。
さすがにこんなクソコードは実務では書きません。
なんか後出しじゃんけんみたいになってしまって恐縮です。
申し訳ありません。
自決でビール吹いたw
自決やべー後からくるわ。
自決しました より 自決方法 にじわじわくる XPとg++でどう死ぬんだと
未定義動作とか使うんだろうかw
鼻から出てきた百足に目を食い破られて死ぬんじゃないかなぁ
それ自決じゃない 自決といえばdelete thisだろ
>>101 うちの会社でよく見るコードだわ
なんとか動いてるけど恐ろしい・・・
delete thisは使い方さえ間違わなければ合法だよ
>>103 そうなんだけど、よくわからんやつが適当にいじると
そのあとメンバ触ってあぼんぬとかよくあるからさ
おまけにそのデバッグやらされるの俺だし
今ならコンストラクタをprivateにして、shared_ptr返すファクトリ関数作る delete thisは過去の遺物だな
delete thisって何だ? 初めて知ったんだが。 ファクトリメソッドやshared_ptrなどは知っています。 delete thisは俺が新参者だから知らないだけか?
delete p; とかと一緒 thisを削除
delete thisは、COMみたいに自分で寿命を管理するときに使う。 まぁ、前時代的な実装だね。
109 :
106 :2009/07/27(月) 22:53:58
ふーん。 そうなんだ。 思い返してみたけどやっぱ見たこと無ねぇな。 まあ理解しなくても良いよね。 どーも。
boost::intrusive_ptrの使用例を検索してみると、 delete thisを見られるよ。
Stateパターンで遷移後状態を返す直前に自状態を始末する際に delete thisすることが多かったかな。最近はsmart pointerを 使うことが多くなったが。
delete this じゃないが デストラクタを明示的に呼ぶコードってのはたまーに使うな。 まあ大半の人が、STLコンテナの内部で使われているのを利用しているが。
>>112 そうそう、デストラクタって明示的に呼べるんだよね。
いつ使うのか全然しらない。
114 :
112 :2009/07/28(火) 12:00:42
つながりの無い事柄みたいになっちゃったが、 要は void T::reconstruct() { this->~T(); new (this) T(); } から連想したんだ。許してくれ。
115 :
デフォルトの名無しさん :2009/07/28(火) 13:30:04
C2227のエラーが出て解決できないのですが、どういうことが理由なのでしょうか
>>115 たぶんVCなのだと思うが、だとすれば、間接参照不可能なポインタ変数を
間接参照しようとしているから。
これ以上はソースを見ないと言い様が無い。
間接参照不可能なポインタ変数を間接参照することは問題ないだろ。 問題なのは、間接参照不可能なポインタ変数を使って間接参照することだ。
日本語でおk
>>118 じゅうぶんわかる。
間接参照不可能なポインタ変数を間接参照することは問題ないね。
いやまて 間接ポインタ変数を間接参照不可能な参照で間接参照にすることは問題なんじゃないか?
間接参照不可能なポインタ変数ってvoidポインタのことでしょ? ->演算子でアクセスできないことも間接参照不可能っていうの?
MyClassクラスのテンポラリオブジェクトを返す関数の戻り値は const MyClass& temp で受け取って束縛しても大丈夫ですよね? そのスコープから外れるまでは有効ですよね?
テンポラリオブジェクトを返す関数のスコープを抜けるまで有効です。
関数の戻り値をconst指定しておけば、参照変数が生きてる間束縛される
>>125 > 関数の戻り値をconst指定しておけば
おかなくてもだろ?
え、まじで?無知ごめん
っていうか、そうだよね。constは関係ないね。 ちょっと考えれば分かる話でしたorz
>>113 placement new したオブジェクトを消すとき
130 :
123 :2009/07/28(火) 19:53:50
みなさんありがとうございます。
>>129 placement deleteじゃだめなの?
132 :
デフォルトの名無しさん :2009/07/28(火) 20:02:53
λ式ってブースト使わないと利用不可?
placement deleteはデストラクタを呼ばないから、自分でデストラクトする必要がある。
ラムダ式なんてオタのオナニー道具です 使っちゃいけません
>>132 ラムダはちょっとしたところで使うなら便利。
あまり多用すると自分が困るかもしれないがね。
結局は使いようなんだが。
140 :
132 :2009/07/28(火) 21:02:17
あり^^
データを出力するときにn行おきに空行を入れたいのですがどうすればいいですか?
繰り返しつかえばあ
144 :
デフォルトの名無しさん :2009/07/28(火) 22:23:37
for(int i = 0; i < num; i++) { cout << line[i] << endl; if(i % n == n-1) cout << endl; }
なんかもっと初心者向けのスレに行けば? たぶん宿題だろうし
あっそ
そういう態度は失礼だってママに言われなかった?
ママは彼が物心つく前に鬼籍に入りまして。。。
今日からパパがママよ!
152 :
デフォルトの名無しさん :2009/07/29(水) 08:51:51
struct Point { int x; int y; Point(int x, int y) : x(x), y(y) {} }; struct Size { int width; int height; }; Size Hoge() { Point point; ... return *reinterpret_cast<Size *>(&point); …(1) return *reinterpret_cast<Size *>(Point(0, 0)); …(2) } 例が良くないかも知れないのですが、 この書き方ってC++におけるインスタンスの 生存期間的に問題はあるでしょうか?
>>152 (1)はダメ
Hoge()を抜けた途端にpointのインスタンスが消滅してしまう
あほくさ
>>152 (1) はコピー返しなので問題ない
(2) は生存期間以前にポインタでないものをポインタにキャストしてるから滅茶苦茶なことが起きるだろう
>>126 いやいや、一時オブジェクトを束縛して寿命を延ばす効果があるのはconst参照だけだろ。
戻り値がconstである必要は無いというお話
throwはreturnやbreakと同じようにスコープを抜ける つまり自動変数のデストラクタ呼び出しが保障されてるんでしょうか?
されます。例外が送出された時点でローカルスコープは「突然」終了し、 可能な限りスタックを巻き戻すことになってます。 なので、(一般に)デバッグ用途には使えません。 …メモリダンプを見ても変数の中身が消えちゃってるので。
前にbcc5.5でboost::is_base_ofを使おうとしてた者です。あの後いろいろやってたらできました。(多分) 他にも使いたい人はいると思うんで一応載せときます。 struct yes_type{char t[100];}; struct no_type{char u[10];}; template<typename T,typename U> struct test_helper{ template<typename S> static no_type test(void const volatile * ,S ); static yes_type test(T const volatile * const,int ); }; template<typename T,typename U> class is_base_of{ struct pointer_type{ operator U const volatile *(); }; enum{ delived = sizeof( test_helper<T,U>::test(pointer_type(),0) ) }; public: enum{ value = delived == sizeof(yes_type), }; }; 使い方は is_base_of< Hoge,Piyo >::value とし、後のクラスが前のクラスの派生クラスの場合は1をそうでない場合は0を返します。 長文失礼しました。
あー、これだと両方同じ型を指定した時は必ず成功してしまいますね…。 型の比較なんてないですよね?どうしよう…
bcc5.5なんて糞コンパイラを窓から投げ捨てろ
VCの複雑さが無くなれば捨ててもいいけど・・・
コマンドラインで単なるC++コンパイラとして使うときに、 VCが特に複雑と言うほどBCCと何か違うことってあるか?
さっきのis_base_ofですが、value = ...の条件式に以下を加えてください。 !is_void<T>::value && is_class<U>::value && type_equal == sizeof(no_type) && is_voidやis_classや自分で作るかなんかしてください。 次にtest_helperに以下の関数を追加 static yes_type type_equal(T*); template<typename S> static no_type type_equal(S*); 最後にis_base_ofの一個目のenumに以下を追加 type_equal = sizeof( test_helper<T,U>::type_equal((U*)NULL) ), これで、抜けはありそうですが、とりあえず判定はできると思います。
>>158 例外がmainでcatchされずに飛び出るとterminateが呼ばれて
破棄処理が実行されない可能性がある
お勧めのC++用リファクタリングツールを教えてください。
メモ帳
169 :
デフォルトの名無しさん :2009/08/01(土) 00:05:34
mapとかsetをデフォルト引数にする場合ってどの様に書けば良いでしょうか? 下記のように、vectorっぽくやりたいのですが。 void func( set<int> s = set<int>(0) ) { if( s.size() == 0 ){ ... } else{ ... } } int main() { set<int> s; s.insert(100); func( s ); func( ); }
>>169 setやmapには、vectorのような要素数を指定するコンストラクタがないから、
単にデフォルトコンストラクタで初期化すればいい。
void func( set<int> s = set<int>() )
質問なんですが、 #include<stdio.h> main() {int suuji[10],i,x,s,n; float r; i=0; s=0; while(x!=0){ if(i==50); printf("数字="); scanf("%d",&x); suuji[i]=x; n=i; i=i+1; s=s+y; } r=s/n; printf("平均=%d\n",&r); } の形を使って数字を幾つか入れてその平均点をfloatを使った状態でだしたいのですが数字が何も出てきません。 上のプログラムの修正をよろしくお願いします。
r=(float)s/n; printf("平均=%f\n",&r); あたりでうごく?
173 :
169 :2009/08/01(土) 01:25:54
>>172 r=(float)s/n;
を習ってないので使ってはいけないんですよ…
なんででないのかわからない…
%d→%fは直します。ありがとうございます!
ならこう。 #include<stdio.h> main() { float suuji[10]; float x, s, r; int i, n; i = 0; s = 0; while(x != 0) { if (i == 10) break; printf("数字="); scanf("%f", &x); suuji[i] = x; n = i; i = i + 1; s = s + y; } r = s / n; printf("平均=%f\n", r); }
よくみたらx初期化してないし、sに加算してないし そもそもC++のプログラムじゃないし レスした自分が恥ずかしい s+=x;な
宿題スレでやれよ
まあC++コンパイラで通るからいいかなと思った。今は反省している。
>>177 そこはお客に丸投げしていただいたありがたい課題を解いて楽しむという反教育な場ですから。
>>177 すいません…
>>178 C++じゃなかったんですか!自分はずっとC++と思い込んでました。
ありがとうございます。
>>180 なんていうか、先が思いやられるな。未来のこの人の先輩がんばってください。
>>180 いや、間違いなくC++だよ
Cコンパイラでも通るかもしれないというだけで
183 :
デフォルトの名無しさん :2009/08/02(日) 01:21:46
コンストラクタで例外投げてもいいですか?
shared_ptrとかauto_ptrとかの類をきちんと使っていれば、全然問題ないですよ。
いいですよ。
デストラクタで例外投げてもいいですか?
恐いお兄さん達にリンチされるのでやめた方がいいです
わかりました やめておきますね
__ | / / __|__ .__/__ | | | . | | | | | | ー―――― ..| | |  ̄ ̄| ̄ ̄ | ̄ ̄ ̄ ̄ ∧ ∧ | \____ノ / V ヽ /┏╋┓ \ / ┗╋┛ \ < 2chでせいぜいほざいてろ。フフン (.`ヽ(`> 、 /_______ \ `'<`ゝr'フ\ +. 彡 ⌒ ⌒ ミ;;;! ⊂コ二Lフ^´ ノ, /⌒) , +ゞi" ̄ フ‐! ̄~~|-ゞ+ ⊂l二L7_ / -ゝ-')´ .+ ヾi `ー‐'、 ,ゝ--、' 〉;r' \_ 、__,.イ\ + `,| / "ii" ヽ |ノ (T__ノ Tヽ , -r'⌒! ̄ `":::7't ト‐=‐ァ ./ ヽ¬. / ノ`ー-、ヘ<ー1´| ヽ | :::::::::::::ト、ヽ `ー‐'",/ 、 \l__,./ i l.ヽ! | .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、 ___________________________ ___ | | | | | | | | | | | | | || | |中|中|中|中|中|中|中|中|中|中|中|中|中||中|
>>186 デストラクタ内でキャッチするならいいよ
191 :
デフォルトの名無しさん :2009/08/03(月) 07:57:09
ヤフーメッセンジャーのチャットのログを記録したいと思っています。 ブラウザのチャットのログの取得はわかるのですが、メッセンジャーなどのアプリからどのようにしてログを取得できるものなのでしょうか? サイトを探しましたが、どのサイトもHTMLソースの取得方法しか書いてありませんでした。 どうか教えてください。
192 :
191 :2009/08/03(月) 08:19:38
libyahoo2というものがありまして自分で調べます。 ご迷惑おかけしました。
193 :
デフォルトの名無しさん :2009/08/03(月) 18:24:02
教えてください. 変数sに振幅値を入れておいて, サンプリング周波数fでsを再生したいのですが 以下のプログラムで再生することができません…. よろしくお願いします. #include <iostream> #include<windows.h> #include <math.h> #pragma comment(lib,"winmm") #define FILENAME "white-3dB.WAV" using namespace std; int test(){ int i; int f=1000; double s[48000]; for(i=1;i<48000;i++){ s[i] = sin(2*3.14*f*(i/48000)); } bool PlaySound (s,f,SND_MEMORY | SND_LOOP | SND_ASYNC); return 0; }
>>193 PlaySoundの前のboolは何?
それと、PlaySoundにはちゃんと.wavファイルの形をしたデータを与えてやらないとだめだ
波形だけ与えても鳴らない
あと、fって何さ、そこはHMODULEを渡すところでは?
最後に、スレ違い
Win32APIの質問はWin32APIスレへどうぞ
195 :
デフォルトの名無しさん :2009/08/04(火) 08:52:09
static const int MAP_X = 64; class A { int[ MAP_X ]; } 以上が定数式エラー出る defineではエラーでない。 C++風にconst使ってみたんだが配列確保には使えない認識でおk?
変数名が無え…。
>>195 ちゃんと書けば、ちゃんと使える。
そうそう、古いコンパイラでは使えないかも知れない。
それが最新のVC2008EEなんだな 無料だから制限つけてるのか
>>195 実際のコードとコンパイルエラーを「そのまま」貼り付けてみて。
原因がわかりました ×static const float MAP_X = 64; ○static const int MAP_X = 64; floatにしてたのが原因でした intに変更したら成功。
201 :
デフォルトの名無しさん :2009/08/04(火) 11:38:22
アホか
static const intしかclass内での定数は定義できないと 規格票に書いてある 規格票はintではなく整数と書いてあるが
>>202 なら「static const 整数しか〜と規格票に書いてある」って最初っから言えよ。
どうせそんな書き方もしてないんだろうけどな。
最初からもなにも
>>195 みたいな不完全で実際のものと違うコード提示されたところで
的確な指摘なんて出来るわけないよな
enumで妥協
このあたり、いいかげんなんとかして
207 :
デフォルトの名無しさん :2009/08/04(火) 20:39:31
PODデータでの値渡しとconst参照渡しの 一般的な速度の分岐点は何バイトくらい?
環境も書かずに何聞いてんだ
>>203 エラーの出る最低限のサイズのコードを上げろ
>>207 エスパーして代表的な環境について述べます。
Linux + gccはどちらの場合も最高速を叩き出します。
Windows + vcはどちらも低速でした。
つまり、プログラムでチマチマ最適化を図るよりLinuxを導入するほうが
良いと思われます。
x86なら特に指定がなければVCもgccも同じl呼び出し規約を 使うのだからそんな速度の違いが出るわけない。
レジストリにのってるかどうか調べればいいんじゃねぇの
sjis→utf8の変換処理を自作したいのですが、 サンプルになるようなサイトてありますか? CとかVC++はみかけるんですがC++は見つからなくて… 環境はlinux+gccです
>>213 お前がほしいのはサンプルじゃなくてコピペ元だろ
たぶんCのやつそのまま使えるから問題なし
ああ、レジスタか。 何言い出してんのかと思った
216 :
212 :2009/08/04(火) 23:46:41
Releaseコンパイル後のexeファイルにクラス名とかがアスキーで残るんですけど(typeid用?) これを無くしたい場合はどうすればいいとですか…?
邪道な方法ではUPXを使うとか?
邪道臭いけど、名前丸見えではないようですし(zipのヘッダが見えた気はするけど・・・) これでも大丈夫そうです。ありがとうございました。
>>207 boost::call_traits あたりを見ると参考になるかもしれない。
>>217 コンパイルオプションの /GR を取ればいいってことかな?
VS2005 だと、プロジェクトのプロパティの 「ランタイム型情報を有効にする」 → 「いいえ」
typeid の他に dynamic_cast がつかえなくなるっぽい。
そのあたりはややこしい話になるので割愛。
>>212 なんの疑問もなく読んでしまった。
だめだ今日は。。。
localeをjapaneseにするとlexical_castで整数を文字列に変換したときに 3桁ごとにコンマがついてしまうのですが、これを防止するにはどうしたら よいのでしょうか?
224 :
デフォルトの名無しさん :2009/08/05(水) 15:21:44
c++でネットワーク上のファイル(天気予報XMLファイル)を取得したいのですが、 方法がわかりません。 ググってみるとVC++ではできるようなのですが、 Linux + gcc環境ですので参考になりません。 最悪 system() + wgetコマンド という手がありますが、 もっとスマートな方法(ライブラリとか)があったら教えて下さい。
>>223 localeを"C"に戻す
いちいち面倒ならLC_NUMERICだけjapaneseに変えないでおく
>>224 >最悪 system() + wgetコマンド という手がありますが、
の方がスマートだよ.
227 :
デフォルトの名無しさん :2009/08/06(木) 01:36:46
Boost.Asioを使ってゴリゴリ書くとか。
#include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> class A :public boost::enable_shared_from_this< A > { public: A(){ /*shared_from_this();*/ } void F(){shared_from_this(); } }; int main() { boost::shared_ptr< A > a( new A() ); a->F(); return 0; } c-torで、shared_from_this()すると例外が飛ぶんだけど、何で?
>>228 まだ生成が済んでないオブジェクトへの shared_ptr は存在しない、と考えれば
わりと自然な気がする。
仮にそこで shared_ptr が得られたとして、その後に例外が発生してコンストラクタが
中断したらどうなるの?とか。
231 :
デフォルトの名無しさん :2009/08/06(木) 13:08:19
「このクラスを継承してサブクラスを作ることはない」っていうクラスを記述するとき、デストラクタにvirtual付けますか? 自分は「このクラスを継承しちゃダメ」という意思表示の意味でvirtual付けてないんだけど、 そういうやり方って一般的なのかな? 一応どっかでそういう意見を見て、ふーんって思ってやってたことなんだけど、正しいことなのか今になって不安になってきた。
コンストラクタをprivateに封じて代わりにstaticファクトリを提供すれば誰も継承できないクラスの完成
>>231 付けない。
継承される予定のクラスでも、アップキャストして使う予定のない物は、非virtualのprotectedデストラクタにする。
ここから先は個人的な好みなので参考程度に聞いて欲しいが、
「データメンバを持たない仮想関数のみで構成されたクラス」しか継承する事は考えない。
データメンバを持つクラスを継承したいと思った時は、コンポジションにする。
普通は書かないかな つーか継承をコンパイルエラーにする記述とか無いもんかな インターフェイスとファクトリだけ提供して実装は隠す、位しか実装の継承を禁止する方法が思い浮かばない
235 :
デフォルトの名無しさん :2009/08/06(木) 14:32:23
final宣言ほしいよね。
finalって0xで入るんじゃなかったかな
>>231 付けない。例えばstring(basic_string<char>)なんかも継承を前提としていので
仮想デストラクタではなかったと思う。
238 :
237 :2009/08/06(木) 14:47:23
>>237 継承を前提としていので×
継承を前提としていないので○
boostのvaultとかsandboxにnon derivableとかいうのがあったと思う
[[final]]
何度見てもキモいシンタックスだ。
#define final [[final]] ってするだけだろ。
いいかげん define を捨てたい俺には、 それはもっと悪い。
244 :
デフォルトの名無しさん :2009/08/07(金) 09:12:02
基本的にはC++に関することではなく、Windowsプログラミングに関することですが、 開発環境がC++のため、質問させていただきます。 例えばIE7のようなWebブラウザがあるとします。 そのWebブラウザと連携させるようなツールを使うにはどうすればいいのでしょうか? 具体的には毎回同じ文字でログイン名などを入力するのが面倒なときに、自動で入力して そのあとにログインボタンをクリックし、勝手にログインしてくれるようなツールを作成したいと思ってます。 一部ではAmazonの激安祭りなどでスクリプトとか呼ばれているものです。 使用用途はそういったものではなく、単純にプログラムの勉強としてそういったものを作る方法が 勉強したいだけです。(これは本当です。) わかる方がもしいらっしゃれば回答よろしくお願いいたします。
じゃ俺は開発環境がC++なんで、RPGの作り方教えてください
ついでに開発環境がC++なんで、エロゲの作り方教えてください
Pinkのどっか行ってきます
249 :
272 :2009/08/07(金) 11:29:26
どうしても参照を付け替えたいのですが、何か良いアイディアはないでしょうか? int a = 1; int b = 2; int& r; のときに動的にrをaかbを指すように付け替えたいです。 無理は承知でお願いします。
>>249 int& r = boolean ? a : b;
ではだめかいな?
251 :
250 :2009/08/07(金) 11:36:36
後は int * p; if(xxx) {p = &a;} else {p = &b;} int& r = *p;
252 :
272 :2009/08/07(金) 11:42:15
>>251 その方法でいけました! まさかこんな方法があろうとは。
本当に有難うございました。
一回途中にポインターをかませば良かったんですね。
253 :
272 :2009/08/07(金) 11:57:59
ウソです。無理でした。ごめんなさい。
int &r = *p; の代わりに #define r (*p) と書けばおk
255 :
251 :2009/08/07(金) 12:33:29
>>253 #include <iostream>
int main()
{
bool flag;
std::cin >> flag;
int a = 1;
int b = 2;
int * p;
if(flag)
{p = &a;}
else
{p = &b;}
int& r = *p;
std::cout << r << std::endl;
return 0;
}
これでダメだったって事?
そんな面倒な事をせずに普通にポインタを使えばいいだろ 参照じゃないと駄目な理由は何だ?
参照のほうが綺麗だから
258 :
272 :2009/08/07(金) 13:27:42
int a = 1; int b = 2; int* p = &a; int& r = *p; cout << "r = " << r << "\n"; p = &b; cout << "r = " << r << "\n"; で、1、2と表示して欲しかった。 (実際は両方とも1) どうしても参照でなければならない理由があるのです。 理由は内緒。
そもそも参照は ・初期化しなければいけない ・代入できない という仕様だから切り替えはできないよ
>>258 そういうことか。
ちなみにそんな状況は俺は出くわしたことはないんだが。
> 理由は内緒。 馬鹿丸出し
264 :
デフォルトの名無しさん :2009/08/07(金) 14:19:24
プログラムの実行に掛かった時間を表示していて思った疑問です。
#include <ctime>
cerr << clock()/(float)CLOCKS_PER_SEC << " [s] passed." << endl;
上記のプログラムでは、プロセス開始からの時間がミリ秒の桁まで表示されるのですが
ctime の include をしない場合、秒単位の表示が出てきます。
なぜコンパイルエラーにならないのかよくわからんです。
参考にしたサイトはここ↓です
ttp://www.sasaraan.net/program/cpp/cpp_time.html 環境は WindowsXP + gcc でコマンドラインアプリケーションです。
そこだけ別関数として切り出すのがいいんじゃね void hoge(int& r) { std::cout << r << std::endl; } int a=1; int b=2; hoge(a); hoge(b);
>>264 秒単位の表示って、 0, 1, 2, ... とか?
それとも 0.0, 1.0, 2.0, ... なの?
あと、上記のプログラムって言ってコンパイルも通らないソースが貼ってあるのが怪しい。
省略したところに問題があるのかもしれない。
265よ ここはC++スレだぞ何故その方向へ逸れるの?
参照じゃないといけない理由のほうがすごく気になるな 既存ソースの改造でもやってんのかな
個人的に
>>256-257 ってのは同意できるな
void hoge(char **pp)
return *(*pp)++; // わかりにくい。ってかタイピングが面倒
}
↓
void hoge(char *&rp)
{
return *rp++; // ほらきれい
}
voidじゃねえcharだた
C++ code - 22 lines - codepad
ttp://codepad.org/QgkLwIsV このようにコンパイル時エラーになってしまうのですが、
どうすれば解決できるでしょうか?
11行目と14行目のzeroを別名(hogehogeなど)にすれば
解決するのですが、そうではなく同名のまま(zeroのまま)解決したいと
思っています。
よろしくお願いいたします。
>>271 メンバに同名の zero がある限り、クラス外の zero を指すなら ::zero などとスコープを
明示する必要がある。
template<typename int_t>
class MyTempl;
template<typename int_t>
bool zero(const MyTempl<int_t>& arg);
template<typename int_t>
class MyTempl
{
int_t m_num;
public :
MyTempl(int_t arg = 0) : m_num(arg) {}
static MyTempl zero()
{return MyTempl<int_t>(0);}
friend bool ::zero<>(const MyTempl& arg);
bool is_zero() const
{return ::zero(*this);}
};
template<typename int_t>
bool zero(const MyTempl<int_t>& arg)
{return arg.m_num ? true : false;}
template class MyTempl<int>;
本来初期化しかできない参照を変な使い方して ほら綺麗 とか言われても
変な使い方ってどこが?
ポインタと参照は原理は同じだが違うものだよ。
質問というか相談。以下のような多相性を目的としないクラス階層がある。 struct A {}; // 空の基底 struct B: virtual A { Foo foo; }; template<typename T> struct C: virtual A { T t; }; template<typename T> struct D: B, C<T> {}; // fooとtを両方持つ // B, C, Dを保持するクラス、後でaをダウンキャストして使う struct Holder { A *a; }; Holderを使う時に必要な型(Foo, T)は判っているが、A*の実際の型(B, C, D)は判らない。 この例だとAを仮想継承しないといけないが、そうするとB, C, Dのどれを実体化しても サイズがポインタ分増えてしまう。これらを持つHolderは大量に作成されるので、 各オブジェクトのサイズは少しでも減らしたい。 どうしたらいいだろうか?やはり仮想継承するしかない?
>>277 > ポインタと参照は原理は同じ
って何を根拠に。
確かに
参照はポインタを使って実現している実装が多いけど
それは言語仕様には規定されていないだろ。
正確には
ポインタと参照は同じ原理で実現できる
とかだな。
>>278 よくわからないな・・・なんで仮想継承が必要?
普通に継承するのはだめなの?
オレだったら struct Bのインスタンスを持った struct Cの特殊化を struct Dの親か Dの実装にするね
>>264 int clock()
と仮定されて、intが返ってる可能性はないかね。
283 :
278 :2009/08/07(金) 17:58:59
>>280 D<T>*からA*にアップキャストするときB*経由かC<T>*経由かで
曖昧になるから仮想継承が必要…だよね?
ちなみにHolderから値を取り出すにはこんな感じの関数を使う。
Foo get_foo(const Holder &h) { return static_cast<B*>(h.a)->foo; }
template<typename T>
T get_t(const Holder &h) { return static_cast<C<T>*>(h.a)->t; }
>>281 済まないけどよくわからない…
特殊化するとA*からTを取り出すときにCを特殊化したかどうかの
情報が必要にならない?
クラスの宣言中、そこに直接メンバ関数を実装すると 自動的にそのメンバ関数はインライン要請がなされると 聞きました。 では クラステンプレートで template<typename int_t> class MyTempl { public: void foo() const{std::cout << "foo";} }; この様にした場合、foo()はインライン関数として扱われますか? それとも template<typename int_t> class MyTempl { public: inline void foo() const{std::cout << "foo";} }; とする必要がありますか?
>>283 つねにB経由にするなどと決めておけばいいかと
キャスト自体は曖昧な部分をちゃんと明示すれば通るし
D<T>* d = ... ;
A* a = static_cast<A*>(static_cast<B*>(d));
>>284 扱われます
inlineは付けても付けなくても一緒
インライン展開したくない場合は
template<typename int_t>
class MyTempl {
public: void foo() const;
};
template<typename int_t>
void MyTempl<int_t>::foo() const {
std::cout << "foo";
};
などのように別に中身を書く
287 :
284 :2009/08/07(金) 18:31:54
>>286 分かりやすい解説ありがとうございました。
逆に宣言に定義を含めてインライン化しないようにするにはどうするの?
インライン関数をインライン展開しないというコンパイルオプションを付けてコンパイルする クラス定義の中に定義を書いた関数はインライン関数だと規格で決まっているから、そこはどうにもならんよ
>>286 テンプレート使った場合ってインライン展開されないようにできるの?
コンパイル単位的に難しい気がするんだけど
>>290 普通にできる
ただしクラスの定義も各関数の定義も両方ともヘッダに書く
同じものがコンパイル単位ごとにコンパイルされても、リンカが重複分を破棄する等して上手くやる
インライン展開は関数呼び出しのオーバーヘッドがなくなるけど テンプレート関数はオーバーヘッドなくならんでしょ。
そりゃなくならない 別物だし
>>292 一人だけ別の話題をしているようにしか見えないぞw
インラインのテンプレート関数使えばいいだけじゃん
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
>>294 つまり、テンプレートはそもそも淫乱展開じゃないんじゃないの?って話。
298 :
244 :2009/08/07(金) 22:17:43
やはり難しいかったでしょうか? わかる方がおられない残念な結果となったため、質問への回答を打ち切らせていただきます。
アイちゃんより下がいるとは。
>>298 単にスレ違いなだけ。
せめて、環境依存OKと言っているとことか、WindowsならWin32APIスレのほうで聞きなさい。
まあ、そこ行っても答えが貰える保証はないけど。
スクリプトをC++で作るのって難しいと思うが、どうなの?
難しくないよ
class A{ A(char *buf); } A::A(char *buf){ buf= new char[10]; buf="gomi" } int main(){ char *buf A kakuho(buf) printf("%s",buf); }; コンストラクタの中でメモリ確保したいんですが できません。助けてください
class A{ A(char **buf); } A::A(char **buf){ *buf= new char[10]; strcpy(buf,"gomi"); } int main(){ char *buf A kakuho(&buf) printf("%s",buf); }; かな
strcpy(*buf,"gomi");だた
なんでchar*を使うの?メモリ的な制約か?stringとか使えばいいじゃん。
>>302 そなの?
COMとかActiveXなら作れるけどスクリプトはなんだか大変そうな気がして
>>298 せめてアイちゃんレベルにはなって欲しいな。
三項演算子a?b:cと if elseを用いた構文が 意味的に同じ場合、 どちらが望ましいでしょうか? (速さや可読性など。)
俺のイメージでは、 式の一部として使うなら、三項演算子が読みやすく、 そうでなければif elseが読みやすい。 デバッグトレースするならif else。 実行速度はどっちもほとんど変わらん。
311 :
309 :2009/08/08(土) 00:48:23
>>309 自分の場合、三項演算は、参照型と const 変数の初期化や、戻り値
の分岐に限定して使用している。
>>297 別に実体化してリンクしても問題ないが。
並列化やベクトル化をするコンパイラの場合、分岐を使うと最適化を拒否られるが三項演算子だと最適化してくれたりする。 豆知識な
コンパイラの例を挙げてくれてればよかったなあ。。。
条件演算子と呼んでください。 いつか三項の仲間が増えてもごっちゃにならないように。
>>309 よく考えたら、意味的に同じなんてありえなくね?
条件演算子は「 a が真のとき b 、そうじゃなければ c 」
if else 文は「 a が真のとき b をする、そうじゃなければ c をする」
処理の意味によってどっちに当てはめたほうが読みやすいかは決まってくるでしょ。
たとえば b, c が副作用を持つ場合に条件演算子だと読みにくいだろうなぁ、とか。
a == true ? printf("true") : printf("false");
printf(a ? "true" : "false"); こうだろjk
printf("true\0false"+5*!a);
無名namespace内でのtypedefについてなんですが、以下のコードは正しいでしょうか? #include <iostream> namespace{ typedef unsigned long ulong; typedef unsigned int uint; typedef unsigned short ushort; typedef unsigned char uchar; } ulong a() { return 1; } uint b() { return 2; } ushort c() { return 3; } uchar d() { return 4; } int main(int argc, char** argv) { a(); b(); c(); d(); return 0; } これをCygwinのg++ 3.4.4でコンパイルすると error: `uint' does not name a type error: `ushort' does not name a type というエラーが出ます(ulong, ucharについては何もエラーが出ません)。 ただし、#include <iostream> の行をコメントアウトするか、関数 a(), b(), c(), d() を無名namespace内に入れると コンパイルが通ります。 これはCygwinのg++がおかしいのか、それともコードに問題があるのか、どっちなんでしょうか?
無名namespaceって ::ulong で参照しなかったっけ。
今の時代Cygwinでファーストコード通してる人が居るんだなぁと ちょっと意外に感じた。
>>322 それはグローバルnamespaceじゃないですか?
>>301 boost::spiritを使うと簡単
>>322 それはグローバルだな。
無名は特に外部から参照は出来ない。
その翻訳単位内でのみ参照可能。
327 :
314 :2009/08/08(土) 10:12:26
>>315 日立SR8000の最適化コンパイラ
って言っても縁ないでしょ。
>>327 縁がないから言ってもしょうがないでしょって思ってんのかな
return で返される値は 返り値 戻り値 など色々呼び名があると思いますが、 C++用語としてはどれが正しいでしょうか?
>>321 gcc -E してみたら、 /usr/include/sys/types.h でグローバルに uint と ushort の typedef が
あった。どうもこいつらが影響してるみたい。
ちなみに、ソース先頭で #define _POSIX_SOURCE しとくとこれらの typedef が無くなるんで、
ふつうに通るようになる。
というわけで、問題を縮小していくと以下の3行で同じ問題が発生する。
typedef int I;
namespace{ typedef int I; }
I i;
> :3: error: `I' does not name a type
> :3: error: extra `;'
typedef に限らず、グローバルスコープと無名名前空間の中に同じ名前の宣言があると、
宣言自体は通るのに、その後で実際には宣言された名前が使えなくなるみたい。
gcc のバグっぽいけど、標準ではどうなるべきなんだろうか?
2つの宣言のどっちを使うのか曖昧だからエラーになってほしいところ。
>>330 いちおう、 JIS 規格では「返却値」。
ほとんどの場合はどれでも通じるから、どれが正しいとも正しくないとも思わないけどね。
>>332 返却値ですか。
ありがとうございました。
>>331 検証サンクスです。グローバルnamespaceと無名namespaceで重複するとおかしくなるんですね。
どっちが優先されるべきなのか少し調べてみましたが、よくわかりませんでした。
というか、宣言の時点でエラーなり警告なり出して欲しいですね。
とりあえずtypedefについては無名namespace外でも使う場合はグローバルスコープに置くことにしようと思います。
でも、仮にグローバルnamespaceが無名namespaceより優先されるとしたら 名前の重複が起こった場合、無名namespaceの方には外側からアクセスできなくなっちゃいますね。 とすると本来は無名namespaceが優先されるべきなのかな??
An unnamed-namespace-definition behaves as if it were replaced by namespace unique { /* empty body */ } using namespace unique ; namespace unique { namespace-body } つまり typedef int Integer; namespace{ typedef long Integer; Integer l; //OK:long } Integer i; //NG ::Integer i; //OK:int グローバルと重複したとき無名名前空間外から参照する方法はない 無名名前空間内では無名名前空間側が優先
MyClassは自作のクラスで、そのコピーコンストラクタは重いとします。 MyClass foo() { //とても重い処理 return 〇〇; } この関数を呼び出した側で返り値を長く使いたい(ただし変更はしない)場合、 const MyClass retval =foo(); とするべきか、 const MyClass& retval =foo(); とするべきか どちらが望ましいでしょうか? コンパイラによる「戻り値最適化」が行われないとすれば前者は後者より重いと推測されますが、 コンパイラによる「戻り値最適化」が行われるとすれば前者は後者より参照の解決が不要な分 速いのではと思っているのですが、この理解で正しいでしょうか?
>>337 戻り値最適化を行うような、処理速度について配慮されたコンパイラであれば、
テンポラリを束縛した参照について「参照の解決」などという処理に時間をかけることは
無いだろう。
339 :
314 :2009/08/09(日) 02:42:42
>>329 ひねくれたやっちゃな。
コンパイラ個別の特徴じゃないしな。
if文があったらループの最適化をサボるってのは。
それを3項演算子で抜けられる可能性があるってのは一般論として知っておいて損はないだろ。
具体的なコンパイラの名前が必要な話か?
縁がないだろって思ってるコンパイラでしか有効じゃない機能をわざわざ紹介する理由は確かに分からん
一般論に対して例外の存在を補足しただけじゃねーの。
342 :
337 :2009/08/09(日) 10:12:42
>>338 ということは、最適化が出来るコンパイラなら
どちらも同じだろうと言うことですね。
ありがとうございました。
struct B を継承するときに、 class cD : B struct sD : B これら二つの違いは何でしょうか? cDはBをprivate継承していて、sDはBをpublic継承しているだけだと いう理解でよろしいでしょうか?
はい
ごめん
えっ?
えっ?
えっ?
えっ?
351 :
343 :2009/08/09(日) 15:53:36
ありがとうございました。
いえいえ、どういたしまして。
numeric_limits - C++ Reference
ttp://www.cplusplus.com/reference/std/limits/numeric_limits/ ここを読んでみましたが、
staticメンバ関数の
min()
epsilon()
この二つの違いが分かりません。
std::numeric_limits<double>::min()
std::numeric_limits<double>::epsilon()
の例で違いを教えていただけませんでしょうか?
なお、私の環境
Windows XP SP2
g++ (TDM-1 mingw32) 4.4.0
では
std::numeric_limits<double>::min() = 2.22507e-308
std::numeric_limits<double>::epsilon() = 2.22045e-016
となりました。
>>353 min() は浮動小数点で表現できる最小の数
epsilon() は「機械イプシロン」を調べていただければわかるが、数値 1.0 とそのとなりにある実数との差
この二つは異なる概念なんですね。
355 :
353 :2009/08/09(日) 16:21:31
>>354 理解出来ました。
ありがとうございます。
356 :
デフォルトの名無しさん :2009/08/09(日) 16:26:04
>>353 minというのは、その名の通り、double型で表現できる(絶対値が)最小の値。
epsilonというのは、double型で表現できる、「1の次の」値から1を引いた値。
詳しくはIEEE754をよく読んで欲しいんだけど、要するにdouble型で表現できる値っていうのは
0付近では密で、絶対値が大きくなればなるほど疎になる性質がある。
例えばdouble型は0〜1の間には10億個ぐらいの表現できる値があるけど、
1〜2の間には800万個ぐらいしかない。
みなさんありがとうございます。 申し訳ないのですが、 quiet_NaN() Representation of quiet (non-signaling) "Not-a-Number", if available. signaling_NaN() Representation of signaling "Not-a-Number", if available. この二つの違いも教えていただけますでしょうか。 前者が「静かな」というのが今ひとつ分かりません。
>>357 一般的に、NaNというのはなんかエラーな感じの数のこと。
NaN+普通の数とか、普通の数÷NaNとか、とにかくNaNがどっかに含まれる演算を行なったとき、
・Quiet NaNを使ったときは、演算結果としてNaNを返す
・Signaling NaNを使ったときは、浮動小数点例外が発生する(0除算を行った時みたいに、プログラムの実行が停止する)
多分だけど計算中にNaNが現れたときsignalを発生するかしないかじゃないかな?
プログラム技術2ch掲示板のC++のスレ見ても、dynamic_cast演算子を使ったソース がほとんど見掛けないな。皆そんなに使わないのかいな。大変な努力をして、 C++を学習したのに、それを使う機会が無いって、物足りないな、困ったもんだ。
ダウンキャストかクロスキャストの時しか使わないじゃん 普通は仮想関数だけで十分
>>360 goto と似たようなもんだ。使わないで済むならそれでいい。
C++には多用しちゃいけない機能もあるからな dynamic_castやtypeidもそうだし、あと例外指定とか
>>363 mutable もだな。
reinterpret_cast 級の危険機能だと思う。
使い方を間違えなければmutableは非常に役立つよ。
いざという時に、せめて可能な限り安全にわかりやすく ダーティーなやり口に手を染めるためのもの、という感じかな。 漫画によくある場面で喩えるなら、主人公が出発前に 「できればこれを使わずに済ませたいものだが・・・」 とか言いながら見つめてる武器みたいな。
それ絶対使うじゃんw
もうCでいいじゃん。
>>367 この手の場面に相当するような「デカい仕事」では、実際結構な確率で
いま出ているような物を使うことになると思う。
危険な機能を使わないためと言って変な黒魔術で無理矢理回避する方がよっぽど危険だしな
Windowsでプログラムしていると reinterpret_cast と dynamic_cast のオンパレードですよ^^
>>371 キャストが必要になるのはわかるが、オンパレードはおかしいだろ。
同じ意味のキャストはてきとうにラップしろよ。
ダウンキャストの意味わかってるのか? 存在しないメンバにアクセスして鼻から悪魔が出るのを承知で 使わないといけないんだぞ
HWND(構造体へのポインタ)をCWndクラスにキャストさせたり、Windowsプログラミングは楽しいなぁ^^
C++やりたての頃はこういう鼻から悪魔の意味もわからなかった #include <iostream> class Base { int i; public: virtual void print() const { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() const { std::cout << "Derived" << std::endl; } }; int main() { Base *p; p = dynamic_cast<Derived*>(new Base); p->print(); // ouch! }
>>376 BaseにはDerived::print()がない
実行してみればわかるが正しく動かない
>>376 dynamic_cast<Derived*>(new Base) この結果がヌルポインタになる。
その後の p-> でヌルポインタをデリファレンスして未定義動作。
ごめんこういう場合に使うんだったね #include <iostream> class Base { int i; public: virtual void print() const { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() const { std::cout << "Derived" << std::endl; } }; int main() { Base* p; p = dynamic_cast<Base*>(new Derived); if (!p) std::cout << "dynamic_cast failed." << std::endl; p->print(); // ouch! }
381 :
376 :2009/08/09(日) 23:27:43
>>380 いや、 Derived* → Base* は暗黙変換で通るから、 dynamic_cast の出番じゃない。
しかも、せっかく dynamic_cast の結果にチェックを入れたのにメッセージ表示の後に
結局 p-> してたらダメじゃん。
わかんね dynamic_castの正しい使い方知ってる人教えて
DerivedがBaseとBase2を継承してるとして ・Derived* → Base* (アップキャスト) 常に成功し、Baseのポインタが得られる ・Base* → Derived* (ダウンキャスト) DerivedのBase部分を指してるポインタだったら正しいDerivedのポインタが得られる そうでなければヌルポインタが返ってくる ・Base* → Base2* (クロスキャスト) DerivedのBase部分を指してるポインタだったら正しいBase2のポインタが得られる そうでなければヌルポインタが返ってくる ・Base* → int* (無関係) 常にヌルポインタが返ってくる 参照の場合は、以上の「ポインタ」を「参照」、「*」を「&」、 「ヌルポインタが返ってくる」を「std::bad_cast例外が投げられる」に読み替えればいい
よく見ろよw
>>375 のは
p = dynamic_cast<Derived*>(new Base);
どこにもDerivedのインスタンスは生成されない
そりゃNULLが帰ってくるだろうって
388 :
357 :2009/08/10(月) 00:18:37
>>369 そういう話ではなく
> 「できればこれを使わずに済ませたいものだが・・・」
といったらそれは使うフラグ
仕事のデカさは関係ないってことじゃないの?
dynamic_castの意味を今まで勘違いしてたわ ダウン・キャストしても安全に使用できるかどうかの判定なのね
VS2008のVC++MFCで ボタンクリックでピクチャーコントロールにjpgファイルの画像をサイズを変えて表示しています。 以下ソース CImage img; CImage img2; HDC hdc; img2.Create(80,60,24); img.Load("jpgファイルのフルパス"); hdc = img2.GetDC(); SetStretchBltMode(hdc, HALFTONE); img.Draw(hdc, 0, 0, 80, 60); img2.ReleaseDC(); m_xcPic01.SetBitmap( (HBITMAP)img2 ); img.Destroy(); img2.Detach(); img2.Destroy(); jpgファイルが変わる毎に、画面上の画像も切り替えたいので 上の処理を呼び出して、画面を切り替えてます。 しばらく動かしていたところで気付いたのですが、 メモリの使用量がかなり多くなっていました・・・ ファイルロード側のDestroyやリサイズ後側のDetach、Destroyだけでは解放してくれないのでしょうか? わかる方、または参考になるサイトやスレをご存知の方、よろしくお願いします。
Detachしてしまったビットマップは削除されないのでは
395 :
デフォルトの名無しさん :2009/08/10(月) 15:48:42
ヘッダーに変数を定義することって出来たんでしたっけ? いや、さっき書いてみたら出来たんで、ちょっとびっくりしたんですが。 インクルードガードしてないとエラーが出るってだけなのかな。Cではどうなんでしょう。 まあ、作法としてはインクルードガードしててもやっちゃダメなのかもしれないですけど。ですよね?
本当ならリンカが多重定義のエラーを吐くはずだが、デフォルトでは吐かない奴もいる
397 :
393 :2009/08/10(月) 15:58:12
>>394 レスありがとうございます
Detach後にDestroyすると、メモリ上に残る・・・
つまり、リサイズ後用のimg2がどんどん溜まっている状態
ってことでしょうか?
ためしにimg2.Detach();をコメントアウトして動作させると、
別ウィンドウの後ろに隠れると画像が消えると言う症状がでました。
私、根本的に作り方を間違えているのかも・・・
399 :
393 :2009/08/10(月) 16:28:29
>>398 MFC相談室の方に移動させていただきます。
スレ汚しすみませんでした。
>>395 ヘッダだからできない事というのはないよ
やるべきじゃないことは、ある。
>>400 >ヘッダだからできない事というのはないよ
へー、そうなんですか。
逆に、ソースだとできないことってのはありますよね?
テンプレートの定義とか。
>>401 .hも.cppもC++の上では本質的には変わりないんだよ。
テンプレートの定義だって、別に.cppの上でやったっていい。
その定義が他の.cppから見えるかどうかは別問題だがな。
>>401 だからできないことはないって。
逆に聞くが、ヘッダとソースってどうやって区別してんの?
定義そのまま他の.cppに丸ごとコピペすればいいわけだが、 後々修正する際に全部直して回るのが面倒だからそういうことはやらないだけだ
#include "header.cpp" この場合、header.cpp はヘッダなのかソースなのか
オブジェクト指向について質問なんだけど。 クラスAのインスタンスをクラスBで作り クラスBのメソッドからクラスAのprivateにあるメンバ変数をゲッターセッターを使って弄る(クラスBのメンバ変数にも同期させる)。 そして、又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。 そういう風に包含を重ねて行くのがオブジェクト指向なの? C++をやって間もないんだけど、俺のプログラムはこんな感じなんだ。 良いのか悪いのか分からない、アドバイスお願い
>>405 学生の時にバイトしていた会社のコードにそういうのがあった
日本のロケットがクソ高くて落ちるわけだ、と思った
クソコードでバグを入れて、 そのバグを取るのが仕事ですから それでいいんです。
>>407 俺はメソッドとかC++標準にない用語を使われても起こらない。
しかし
>>クラスAのインスタンスをクラスBで作り
これはどういう意味だい?
>>410 えっと
クラスBのprivate領域に、クラスAの実体を包含するって意味で書いたつもりだった
>>406 クソかどうかは関係ない。
できないことがあるのかどうかが論点であり、やるべきではないことはまた別の話
>>407 >又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。
クラスBでクラスBのメンバ変数を参照して判定するようにして、外からメンバ変数を
見せないように隠蔽するのが、オブジェクト指向のカプセル化の基本かな。
セッタ/ゲッタはそれを破ってしまうから避ける様に設計するのがお勧め。
雪駄とか下駄はオブジェクト指向じゃないと個人的には思う。 単一責任原則をはたすためにも、 メソッドは単に状態を書き換えるだけでは十分でないと思うから。
セッタ/ゲッタは最終手段であり、 それに突入した瞬間からクソコードが始まると考えて 「一般には」さしつかえないくらい。
C++ code - 95 lines - codepad
ttp://codepad.org/xR4PHa3G この
std::numeric_limits
の明示的特殊化のコードは、
g++ 4.4.0では問題無くコンパイル・実行できました。
しかし
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
では
error C2910: 'std::numeric_limits<MyTempl<MyInt>>' : 明示的な特殊化にすることはできません。
となり、コンパイルエラーとなってしまいます。
VCでも通す方法はありませんでしょうか?
Compiler Error C2910
ttp://msdn.microsoft.com/en-us/library/cx7k7hcf (VS.71).aspx
このあたりを読んでみましたが、よく分かりませんでした。
よろしくお願いします。
stdの中を無理矢理いじくってるからかなあ 多分ヘッダーlimitsのどこかとぶつかってるよ
418 :
416 :2009/08/10(月) 20:56:41
std名前空間は 新しい物を追加したりすれば未定義の動作となる。 しかし関数・クラステンプレートの特殊化のみ 認められる。 ということは知っているのですが、 私のやり方がまずいのでしょうか。。。
template <typename MyInt> この行いらない
420 :
416 :2009/08/10(月) 21:04:44
すみません。
その辺確かにまずかったです。
C++ code - 95 lines - codepad
ttp://codepad.org/yovzUoIJ これはどうでしょうか?
やりたいことは
template <typename hoge_t>
struct numeric_limits< MyTempl<hoge_t> > : numeric_limits< hoge_t >
の部分で現れていると思います。
template <typename hoge_t> の前の template <> が要らないんじゃ
422 :
416 :2009/08/10(月) 21:25:35
>>421 それで通りました!
皆様ありがとうございます。
本気で助かりました。。。
そのままで通るBCC6.1.3は欠陥コンパイラという事か
いやg++も通っているから別に欠陥ではないのでは? VCが厳しいのかな。 g++ + 訂正前 -> 通る g++ + 訂正後 -> 通る VC++ + 訂正前 -> 通らない VC++ + 訂正後 -> 通る BCC6.1.3 + 訂正前 -> 通る BCC6.1.3 + 訂正後 -> ??? 訂正後はBCCで通る?
g++ + 訂正前 -> 通る g++ + 訂正後 -> 通る VC++ + 訂正前 -> 通らない VC++ + 訂正後 -> 通る BCC6.1.3 + 訂正前 -> 通る BCC6.1.3 + 訂正後 -> 通る じゃあ通る動作と通らない動作、 どっちが規格的には正しいのだろう?
BCCは歴代的にテンプレート周りが怪しいとして(もっとも 今回のバージョンからboostに部分的に対応しているんだが) g++が通ってるんだからvc++が厳しすぎるんじゃね?
@aaaaaaaaa.cpp
ttp://codepad.org/8b4slwrj こうすると、VC++では
error C3767: 'foo': 候補の関数はアクセス可能ではありません。
'aaaaaaaaa.cpp(26)' の friend 関数である可能性があります : 'foo' [引数依存の
照合を使って検出される可能性があります]
というエラーになります。
ところが
namespace MyNS
を外してグローバルスコープにすると
ttp://codepad.org/nBmNHA3H このコードのようになりますが、VC++で通ります。
なお、g++ではどちらも通ります。
Aまた、//問題の箇所2の行をコメントアウトした
C++ code - 50 lines - codepad
ttp://codepad.org/J3kjckz1 はg++, VCどちらも通らなくなります。
(インスタンス化されていないため?)
@Aの問題の原因としては
//問題の箇所1
あたりのやりかたがまずいのかと思っているのですが、
正解のコーディングをご教示いただけますでしょうか?
よろしくお願いいたします。
BCC6.1.3はg++に準ずる結果となりました VC++だけ挙動が違うね
VC++, g++, BCC 以上に 標準C++準拠度が高いコンパイラって無いのかな? 性能は悪くても良いから標準C++準拠度だけを命にしているコンパイラ。
Comeau C++とかか?
using namespace MyNS;で通るね MSDNによると Friend function names are no longer introduced into containing namespace だそうなのでMyNS::fooの時点でADLが利かなくなるってことかな?規格なんて読んだことないから知らないけど。
補足 using namespaceしてからMyNS::fooをfooだけに
違いますか? どのあたりが違いますか?
435 :
430 :2009/08/10(月) 23:35:35
事実上exportキーワードに対応させてるコンパイラは 今の所これだけだしな
437 :
434 :2009/08/10(月) 23:37:55
誤爆しました。 失礼しました。
438 :
428 :2009/08/10(月) 23:56:23
Comeau C++のWebサイトで
で
ttp://codepad.org/J3kjckz1 を実行してみました。
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ noC++0x_extensions
"ComeauTest.c", line 44: error: namespace "MyNS" has no member "foo"
MyNS::foo<double>(MyNS::MyTempl<MyNS::MyInt>());
^
"ComeauTest.c", line 44: error: type name is not allowed
MyNS::foo<double>(MyNS::MyTempl<MyNS::MyInt>());
^
2 errors detected in the compilation of "ComeauTest.c".
だそうです。
という事は例のダイヤモンド継承のバグを除けば VC++の方が標準に近いわけか
440 :
428 :2009/08/11(火) 00:05:46
>>420 の
ttp://codepad.org/yovzUoIJ のtemplate <>あり&無しについて
g++ + 訂正前 -> 通る
g++ + 訂正後 -> 通る
VC++ + 訂正前 -> 通らない
VC++ + 訂正後 -> 通る
BCC6.1.3 + 訂正前 -> 通る
BCC6.1.3 + 訂正後 -> 通る
Comeau C++ + 訂正前 -> 通らない
Comeau C+++ 訂正後 -> 通る
でした。
441 :
428 :2009/08/11(火) 00:07:05
>>428 の@の
ttp://codepad.org/8b4slwrj ttp://codepad.org/nBmNHA3H は両方とも通りません。
(VC++で通った)グローバルスコープにおいたら方の
ttp://codepad.org/nBmNHA3H でも
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ noC++0x_extensions
"ComeauTest.c", line 41: error: identifier "foo" is undefined
foo<double>(MyTempl<MyInt>());
^
"ComeauTest.c", line 41: error: type name is not allowed
foo<double>(MyTempl<MyInt>());
^
2 errors detected in the compilation of "ComeauTest.c".
となりました。
どうやらComeau C++が正しいとすれば、
私の@のコードはどちらも「通る方がおかしい」コードという事になるようです。
気になったので少し調べてみた でも憶測も入ってるので間違ってたら突っ込みキボン 1. グローバルかMyNSかで違う クラス内で定義されたfriend関数はADLを通してしか利用できないっぽい なので、定義をグローバルに置いたからじゃなくて、 利用側で名前空間を指定しなくなったからコンパイルが通るようになるんだと思う 2. それでもComeauでは通らない これはワカンネ 関数テンプレートのテンプレート実引数が暗黙的に決まるようにして、 関数呼び出し時に明示的な指定をしないように変えたら、MyNSに入っていてもコンパイルできるようになった 明示的にテンプレート実引数を指定するとダメ 誰か理由を教えてくれ
443 :
428 :2009/08/11(火) 15:55:47
どこで聞いたのか失念したけど friendとtemplateを併用するとADLがうまく働かなくなるって話を 聞いた事がある
446 :
428 :2009/08/11(火) 16:07:21
みなさんありあがとうございます。
とりあえずfriendにすることを諦めて、次のような逃げ道に走ってみました。
C++ code - 55 lines - codepad
ttp://codepad.org/yBp6Lo3p こちらのコードは、
g++ 4.4.0
VC++ 2008
BCC5.5.1
Comeau C++
の4つで問題無くコンパイル・実行できました。
事前のインスタンス化なども不要なので、
逃げたような気がしてなりませんが一応解決はできました。。。
規格票を持っていたら§14.5.3 Friends を参照してみて欲しい いろいろと制限がきついことがわかると思う
448 :
428 :2009/08/11(火) 16:45:41
namespace MyNS { //省略 template<typename int_t> class MyTempl; template <typename hoge_t, typename boke_t> hoge_t foo(const boke_t& arg); template<typename int_t> class MyTempl { public : int_t num; MyTempl(int_t n = 0) : num(n) {} template <typename hoge_t> friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1 { return static_cast<hoge_t>(arg.num.num); } }; }//namespace MyNS
450 :
449 :2009/08/11(火) 17:06:42
Comeau C++でコンパイルOK VC++2008で実行可能 だった。
451 :
449 :2009/08/11(火) 17:16:19
template<typename int_t> class MyTempl; この前方宣言は要らなかった。スマソ。
452 :
449 :2009/08/11(火) 17:17:00
namespace MyNS { //省略 template <typename hoge_t, typename boke_t> hoge_t foo(const boke_t& arg); template<typename int_t> class MyTempl { public : int_t num; MyTempl(int_t n = 0) : num(n) {} template <typename hoge_t> friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1 { return static_cast<hoge_t>(arg.num.num); } }; }//namespace MyNS
453 :
428 :2009/08/11(火) 17:22:28
>>449 さん
その方法なら
テンプレートかつクラス内定義friend関数に
できるのですね。
ありがとうございます。
454 :
428 :2009/08/11(火) 17:47:41
>>449 さんのコードを記しました。
ttp://codepad.org/xotYKfl3 g++ 4.4.0
VC++ 2008
Comeau C++
では通りましたが、
BCC5.5.1
では通りません。
まあどうせBCCが悪いのだろうとは思いますが。
BCC6.1.3をお持ちの方、試していただけませんでしょうか?
struct { ... } var; という感じで名前のないクラス/構造体を作れると思いますが、 これにコンストラクタ/デストラクタを付けたいなら名前を付けるしかないですか。
>>454 エラー E2015 codepad9.cpp 49: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad9.cpp:8' と
'MyNS::double foo<double>(const MyNS::MyTempl<MyNS::MyInt> &)' の区別が曖昧(関数 main() )
と出てしまいます
459 :
428 :2009/08/11(火) 18:02:27
>>457 #include <cstdio>
class {
int foo;
public:
void func() {printf("Whee!:%d\n", foo);}
void set(int v) {foo = v;}
} bar;
int main()
{
bar.set(3);
bar.func();
return 0;
}
--
無事に実行できるけど?
>>460 元質はコンストラクタ/デストラクタが作れるか聞いているのは判る?
462 :
457 :2009/08/11(火) 18:12:22
>>460 つまり、そのサイトはダメダメということで宜しいか?
>>459 エラー E2015 codepad10.cpp 59: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:8' と
'MyNS::double foo<double,MyNS::MyInt>(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:38' の区別が曖昧(関数 main() )
となってやはりbcc6.1.3でも無理です
465 :
428 :2009/08/11(火) 18:45:35
>>464 Borlandはこのあたり伝統的に対応がおそいようですね。
ありがとうございます。
template <typename T> bool is_not_zero(const T& arg); テンプレート引数T型はint型からT型へ暗黙のキャストが可能なものを選ぶとするとき、 operator!=(const T&, const T&)が定義されていれば template <typename T> bool is_not_zero(const T& arg) {return arg!=static_cast<T>(0);} とし、定義されていないならoperator==(const T&, const T&)を利用して template <typename T> bool is_not_zero(const T& arg) {return !(arg==static_cast<T>(0));} とする。 こんな方法は可能でしょうか? 可能でしたらご教示ください。
467 :
デフォルトの名無しさん :2009/08/11(火) 18:56:51
今朝来たMSDNのメールて、 【64 ビット プログラミング ガイド日本語版を公開中!】 次世代 Windows 環境に備えよう なんてのが届いたので、みていたら。 int i1 = -2; unsigned int i2 = 1; char *s = "Hello"; printf("%s", s + 1 + (i1 + i2)); このコードは32ビットなら動くけれども、64bitだと修正しろとあります。 ぱっと見た目変なところはなさそうにみえるのですが・・・ 1.int が 64bit → 問題なし 2.int/unsigend は 32bit で64bit int にキャストされる → 問題なし 3.int + unsigned = unsigned → 0x000000000ffffffffL になるから? なんで long int になんねーんだよwなのだろうか? 64bitもっている人誰かいたら解説ください。
そんな不気味なコード書かないだろうたぶん たしかWindowsはlongも32ビットだから、size_tやptrdiff_tを使わないとだめなんじゃ?
printfの行がキモすぎるwww たぶんポインタまわりのことを言いたいんだと思うが。
windowsはLLP64だから i1 + i2 -> unsigned int (0xffffffffU:32bit) s + 1 -> char* (64bit) s + 1 + (i1 + i2) -> s + 1 + 0x000000000ffffffffULL 何ビットだろうがそんなコード書くな
もっと他のまともな例があった気がする。 どこで見たっけな。
class { class testのメンバ変数hogeを返す場合 以下の定義で何が違うのでしょうか? inline const Hoge getHoge(...) const Hoge & getHoge(...) Hoge getHoge(...)
VC++2005だとこんなコードを32bitでコンパイルしても64bit移植性警告出るね。 char* s="hello"; int a=reinterpret_cast<int>(s);
>>473 ああそれ鬱陶しかったよね。
2008にして良かった。
>>474 鬱陶しいなら警告切ればいいだけだと思うのだけど……。
デフォルトで、2005はオン、2008はオフというだけなのだから。
>>473-474 妥当な警告じゃないの?
intptr_t とか、適切なサイズの整数を使えって意味で。
>>476 32bitでコンパイルする場合に出るんだよ。
まあ、10年は32bitの時代だね。
>>444 それはたぶん、暗黙の型変換とごっちゃになってるんじゃ…
>>477 何ビットだろうが、ポインタと int のビット数の大小を決め付けてるのはおかしいってことね。
>>472 inline const Hoge getHoge は、
- 戻ってくるときにHogeのコピーコンストラクタが呼び出される
- 戻ってきたHogeの非constメンバ関数は呼べない
const Hoge &getHoge は、
- 戻ってくるときにHogeのコピーコンストラクタは呼び出されない
- 戻ってきたHogeの非constメンバ関数は呼べない
Hoge getHoge は、
- 戻ってくるときにHogeのコピーコンストラクタが呼び出される
- 戻ってきたHogeのメンバ関数は全て呼べる
クラスのデストラクタがvirtualではないクラス を継承する安全な方法はないですよね?
boost::shared_ptrを使うと、デストラクタがvirtualじゃなくても適切なデストラクタが呼び出される はず
protected継承にする。
>>457 そのリンク先の
> out.num1 = 10;
という使い方を初めて知った。これって合法なのかな
無名構造体のメンバを作ってそれ経由しかしたことなかった(
>>460 の方法)
>>484 無名クラスはスルーできるみたいよ。
例えばgccだと`int OuterClass::<anonymous class>::num1'と解釈するみたい。
つーか、>460の型名のないクラスは無名クラスとは呼ばないのかな?
言葉の定義は誰か詳しい人よろしく。
`丶´ ̄ ̄ '' ‐- - - - ァ /)ヾ / /ア| ,, -‐ '' / ///)::/\/ /' |∧ヾ `丶 / /,.=゙''"//::_/ ', ミ / / i f ,.r='"-‐'つ/ \ / i ::l / / / _,.-‐'~ :::} f:(_)ヽ .r(_)、l :::l ', こまけぇこたぁいいんだし!! . / ,i ,二ニ⊃..::ノ {O:c::j {::c::::}| :::| ヽ / ノ il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::| ;;\ゞ ,イ「ト、 ,!,!ヽ、|/レ小、. { _ノ ノ :/|/ヾ、l / iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/
誤爆した すまん
池田ァ!!
まさかム板でこまけぇこたあAAしかも池田かよw
そんなやつは絶対プログラミングできないなw
>>487 `丶´ ̄ ̄ '' ‐- - - - ァ
/)ヾ / /ア| ,, -‐ '' /
///)::/\/ /' |∧ヾ `丶 /
/,.=゙''"//::_/ ', ミ /
/ i f ,.r='"-‐'つ/ \ / i ::l /
/ / _,.-‐'~ :::} f:(_)ヽ .r(_)、l :::l ', こまけぇこたぁいいんだし!!
. / ,i ,二ニ⊃..::ノ {O:c::j {::c::::}| :::| ヽ
/ ノ il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::| ;;\ゞ
,イ「ト、 ,!,!ヽ、|/レ小、. { _ノ ノ :/|/ヾ、l
/ iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/
C++でシステム毎に定義された円周率の値を求めることは出来ますか? 例えばnumeric_limitsの様な感じで。
>>487 486を除く
このスレ書き込み自己申告して下さい。
>>492 #include <cmath>
M_PI
とか?
495 :
486 :2009/08/12(水) 20:32:17
誤爆した すまん
円周率定数は標準にはないので 2*asin(1)でも使うといい
498 :
492 :2009/08/13(木) 00:24:02
ありがとうございます。 両方とも考慮していきます。
x87ならFLDPI命令呼びたいよなー。
#include <stdio.h> int main(void) { double d; __asm { FLDPI FSTP [d] } printf("%16.15f\n", d); return 0; } 3.141592653589793
2.0*asin(1.0)をFLDPIにしてくれるコンパイラが欲しいゾ
幾つかpieを計算する関数を試してみた。 処理時間は概ね、acos(-1) > asin(1) * 2 >> atan2(0, -1)になった。
環境を変えたら入れ替わったりするんだろうか? 関数呼び出しのオーバーヘッド分とか 2倍する演算の分とかその辺の差のような気がする。
調査している人がいてもおかしくない気もするが。 とりあえずdoubleに限るなら #IFDEFでM_PIがあるかどうかで分けるのが正解な気がしますが。
ぐぐると6*asin(0.5)ってのがよく出てくるけどこの方がいいのかな
結果定数なんだから定数で置き換えてくれればいいのに。 そういうのをコンパイラに伝える機能って新しく追加されたりしないんだっけ? javaだったかな。
constexprっていうまさにそういう機能がC++0xで追加されるよ
thx
511 :
502 :2009/08/13(木) 12:36:11
>>506 はいな、時間だよ。勿論、atan2(0, -1) >>>>> 定数 だろうけれど。
因みに、gccはpow(2, -23)とかは定数にしてくれるけど>502はM_PIにもfldpiにもならなかった。
尤も、fld1も使う場合と使わない場合があるようだけど。
512 :
466 :2009/08/13(木) 12:51:27
確かに、πを数値計算する場合、
asin(x)のテイラー展開(正確にはマクローリン展開)が一番自然で、
しかも誤差の項にx^nがかかるため
asin(1)よりもasin(0.5)の方が圧倒的に収束は速いと考えられますね。
そのため6*asin(0.5)が良いという可能性はありますよね。
ところでどなたか
>>466 をお答えいただけませんでしょうか?
C++と関係ない話は他でやれ
別にこれ位いいだろ
>>504 の疑問に答えただけだ
ご教示願います。 詳説C++ではデストラクタは継承されないとあります。 Accelerated C++では仮想デストラクタは継承されるとあります。 非仮想のデストラクタは継承されない。 仮想デストラクタは継承される。 という認識で正しいでしょうか?
So death.
>>516 「継承される」ってどういう状態のこと言ってんの?
デストラクタは必ず派生クラスで再定義されるから、普通のメンバ関数や
メンバ変数みたいに基底クラスのものがそのまま使われるってことは無いよ。
あ、少なくとも言語仕様上はね。派生側で追加の処理が無ければまったく
同じ関数が走るようにコンパイルされることは考えられる。
でも、これは virtual 付いてようが付いてなかろうが同じ話。
>>512 メンバ関数(演算子)の有無で切り替えたいというのなら、C++はできなかったと思う。
その代わり、関数の有無を継承したクラスで示すタグディスパッチという手法がある。
class EQ_tag{};//==があることを示すタグのクラス
class NE_tag{};//!=があることを示すタグのクラス
class A :public EQ_tag
{
public:
bool operator==(int val)const{return val==3;};
};
class B :public NE_tag
{
public:
bool operator!=(int val)const{return val!=3;};
};
template<class T>bool _isEQ(const T& s,int val,const EQ_tag&){return s==val;}
template<class T>bool _isEQ(const T& s,int val,const NE_tag&){return !(s!=val);}
template<class T>bool isEQ(const T& s,int val){return _isEQ(s,val,s);}// この第3引数で切り替える。
int _tmain(int argc, _TCHAR* argv[])
{
A a;
B b;
isEQ(a,3); //==が呼ばれる
isEQ(b,3); //!=が呼ばれる
return 0;
}
>>517 >>518 結局、基底クラスのデストラクタを仮想にしておけば
・派生クラスのデストラクタ
・基底クラスのデストラクタ
がこの順番で呼び出されるので納得しました。
>>520 仮想で宣言した場合としていない場合、
どう違うか
たぶん理解してないよ、それ。
基底クラスのポインタにキャストしてdeleteした場合について
限定しているわけじゃないでしょ?
522 :
466 :2009/08/13(木) 15:10:29
>>519 タグディスパッチとは、
input_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
output_iterator_tag
と同じような物でしょうか?
template <class T> class Hoge { T val; //詳細が続く。 } こんなTクラスのラッパクラスであるHogeに対して、 hoge->T方向のキャスト演算子をオーバーロードしたいのですが、 const operator T()const{return val;} operator T(){return val;} のような2通りのバージョンを用意すべきでしょうか? それとも上の1つだけにした方が望ましいですか?
524 :
523 :2009/08/13(木) 15:16:12
正しくは operator const T &()const{return val;} operator T &(){return val;} かもしれません。 参照をいまいち理解出来ていなくて。。。
525 :
519 :2009/08/13(木) 15:18:09
参照でない(コピーを返す)なら、const版だけでいい 参照を返すなら、valを変更されてもよければ2つとも用意する valを変更されたくなければconst版だけ
527 :
466 :2009/08/13(木) 15:22:22
>>525 ありがとうございます。
そのあたり、もっと勉強してきます。
528 :
523 :2009/08/13(木) 15:27:36
>>526 valはHogeのプライベートメンバなのですが、
T型へのキャストでvalを変更可能にするのとしないのと、
クラス設計としてはどちらが望ましいとかはありますか?
そのラッパクラスの目的、どういう利用方法を想定しているかによる
530 :
デフォルトの名無しさん :2009/08/13(木) 15:41:16
なるほど、一概には言えませんということですか。 ありがとうございました。
class hogeのインスタンスメソッドbokeをthreadや、 APIのコールバック設定関数の引数void (*arg)(void)に渡したいんですが、どうすればいいでしょうか? 頼みのboost.bindやfunctionも、boost内部のクラスで定義され、void (*arg)()にキャスト不可能でした
APIのコールバック関数は大抵void*のパラメータを渡せるようになってるはずなので、 それ使ってthisを渡してstatic関数経由で呼べばいいと思います
- -―- 、 /...::::::::::::::.. ヽ / ..:::::::::::::::::::/\ ヽ /..:::/::::/::::// ヽ l:. l. l:::::!::::/●) (●)|:: | . !:::l::::l/// ,, ///l:i:l ェェエエ工工 ヽ:i::!、 r ― ァ ノノ' ` l\`ー './ ノヽ \_フ.ヽ |_ 丶 ヽ . | |' 初心者)
>>521 いえ大丈夫です。
ありがとうございます。
535 :
531 :2009/08/13(木) 16:47:58
>>532 が、できたら苦労はないんですけど、
引数void (*arg)(void)からわかる通り、指定できるコールバック関数の引数が0個なんですよ…
なので、クラスメソッド→インスタンスメソッド経由だと、インスタンスのアドレスもわからないですし
複数のインスタンスを扱う事を考えるとグローバル変数も使えずで…途方に暮れてます
じゃあ、適当に10個くらいコールバック関数を用意して、 どのオブジェクトがどのコールバック関数を使用中か管理して、 空いてるコールバック関数を使う 一杯だったらリソース不足ってことにしてあきらめる CPUが決まってるなら、実行時に各オブジェクト用のコードを その場で生成するっていう手もないこともない・・・
537 :
531 :2009/08/13(木) 17:18:23
>>536 そうですね…、やはり管理クラスを別で作るしかなさそうな感じです。
コールバックごときに時間も掛けてられないので、この仕様で行こうと思います。
ありがとうございました。
538 :
519 :2009/08/13(木) 18:02:35
>>535 プライベートなスタティック変数を経由する。
539 :
デフォルトの名無しさん :2009/08/13(木) 19:07:06
複数のグローバル変数を1つのclassで包めば安全度あがる?
オブジェクトとして扱うなら
あがりません。 グローバル変数のまずい点の一つは 密結合であるということだからです。
安全度ってものが何を意味するか微妙だけど、 とりあえず何の名前空間にも含まれていないグローバル変数が 複数あるならその段階でコードがクソ設計である可能性は高い。 ・・・って誰もこんな事聞いてないか。
MapDataというマップダータの変数があるとして マップ描写、当たり判定、キャラなどのクラスからアクセスがあるなら グローバル変数以外にどう実装すればおk? 全部ひとつのクラスで包めばいいかもしれないが それぞれのクラスにMapDataを渡すとなれば引数が多くなりスマートにならないんじゃね
今日はじめてC++の文法解説サイトを読みました。 C++というか構造体++に見えてしまうんですが、 オブジェクト指向とか仰々しい名前が付いててこんなもんですか?
オブジェクト指向なんて今時珍しくもなんともないだろ
テンプレート超楽しい
>>543 マップデータを内包するMapDataというクラスにマップ描写や当たり判定を行うメンバ関数を用意する。
キャラクラスからのアクセスはどんなものかわからんので知らない。
オブジェクト指向の入門書はJavaやC#の方が多いくらいだし C++学ぶ段階でオブジェクト指向ってなんですか?って言う人は減ったわな。
C++特有の物といったら多重継承ぐらいなもんだしな それを使ったオブジェクト指向入門書というのは割と少ない
普通はMapDataのインスタンスを受け取ってデータ取得や当り判定、描画を行うクラスを用意する。
>>545 >継承と仮想関数があってもですか?
これから読んできます!
クラスの解説読んでるとSQLとRelationalDatabaseで良いじゃん!と思ってしまんですが、
クラスのありがたみってどのあたりで現れてきますか?
>>552 君はGoF読むか独習デザインパターンC++を読みなさい
>>552 おいっす、明日ジュンク堂あたりでじっくり読んできます。
とは言うものの、デザインパターンって昔読んでさっぱり分からなかったんですが、
デザインパターンその物の解説本よりも、
デザインパターンを使って作ってみましょう!見たいな本はないですか?
>>556 ありがとうございます。
聞いてくる前にまず読んできます。
クラス解説とSQLがどうしても結びつくのかわからない・・・
だから初心者なんだろ
いやー、なんか値の代わりに関数が登録されてるように見えて、 検索して値を取り出すのが、関数の呼び出しに見えてしまったんですが、 SQL勉強しなおしですかね・・・・
いあいあ、なるほどそういう見方もあるのかと 思ってしまった ありかとう
オブジェクト指向データベースってあったなぁ…あれどうなったんだろう。
構造体+アクセス・セキュリティ強化 → 関数管理ライブラリ? 構造体+データ処理特化 → リレーショナルデータベース? 見たいなあいまいな知識しかもってません(笑) むかーし、Cの構造体でDB組んでて、 DBが大規模化して手に負えなくなって、 構造体に機能追加してったら、 関数ライブラリを管理するのにちょうど良いので その方向に進化させたのがクラスなのかなーとか
Cで構造体に機能追加って、Cの構造体はメンバ関数持てないでしょ
>>564 メンバ関数として第一変数を構造体へのポインタにすればいいだけでは?
Cの構造体に機能追加(メンバ関数を持てる様にした)したのが C++のクラスなのかなーという認識で、 初心者の戯言です。
>>566 それはカプセル化ね
データと手続きを今まで別々に扱っていた不自然さを
統一して解決したわけですよ
仮想関数と継承はまた別
C++はテンプレートを利用したコンパイル時静的多相解決という とんでもない仕組みも持っているけどね そのおかげでBoostという怪物ライブラリが現れて来た
>>567 ありがとうございます。
データと手続きは別個の方が自然だと思ってましたorz
>>568 奥が深いですね・・・
もう一度解説サイト読み直してきます。
C++でGUIのあるアプリケーションを作ろうとしたら.net?とかいうライブラリを使うんでしょうか。
>>568 テンプレートメタプログラミングってすげぇよな。
俺できないけど、みんなは出来る物なの?
ライブラリ作る職業の人すら出来るのかあやしいんだが。
コンパル時に結果を演算してしまうというのはものすごい技術だけど、 一方で、エラーメッセージが意味不明だったり、 リアルタイムコンパイルによって実現されているMicroshiftのインテリセンスと相性が悪かったり… VS2010で改善されないかなぁ。
>>569 データと手続きが別個だとプログラムの規模が上がった時に
一人で扱える限度を超えて手に負えなくなるんですよ
.NETはC++/CLIという全く別個の言語ですので混同しないように
他にC#とかVB.NETなどもある
>>569 自然かどうかはちょっと微妙なところがあるとおもうけど、
自分や他人の作った複数のクラスが
うまく組み合わさって動くその様は、まさに壮観。
盛り上がっているところ失礼します。 const unsigned int num = 10; と書くと、numはコンパイル時に定数となると聞きました。 const unsigned int hoge = 3 + 4; や const unsigned int piyo = (3 + 4 - 1) * 2 / 3; はコンパイル時に定数になりますか?
なります
なるかどうかはコンパイラ次第だったりしない? 最適化を禁止してアセンブラコード出させてみるとか。
>>572 >データと手続きが別個だとプログラムの規模が上がった時に
>一人で扱える限度を超えて手に負えなくなるんですよ
なるほどー
>.NETはC++/CLIという全く別個の言語ですので混同しないように
>他にC#とかVB.NETなどもある
あさってな質問ですいませんorz
GUIのあるアプリケーション作ろうとするなら開発環境のスレに移るべきでしょうか?
>>573 >自然かどうかはちょっと微妙なところがあるとおもうけど、
>自分や他人の作った複数のクラスが
>うまく組み合わさって動くその様は、まさに壮観。
多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか?
呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。
578 :
574 :2009/08/13(木) 23:06:11
>>575 >>576 ありがとうございます。
const unsigned int num = 10;
const unsigned int hoge = 3 + 4;
const unsigned int piyo = (3 + 4 - 1) * 2 / 3;
char a[10], b[num], c[hoge], d[piyo];
がg++で通ることは確認しました。
>>554 よく理解できないがすげー参考になったわ
>>577 GUIの話題ならコンパイラスレに行った方がいいな
>呼び出し方は最初に決めるけど、データ構造と処理の仕方は各々見えないところで好き勝手やってOK見たいな。
それは仕様書の話だね
OOPとは関係ない
>>577 >多人数で大規模なプログラムを作るための工夫の結果がクラスっていう概念なんでしょうか?
いい表現だね。
まあ工夫の一つってことだけど。
クラスはテンプレートと組み合わせたときもまたすごいことになる。
例えば君が有理数クラスを作ったとして普通に使うとintが分母分子の型になるけど、
誰かが多倍長整数クラスを作ってくれていればそれを使うことで
多倍長桁数で分母分子を管理する有理数クラスが一瞬で出来る。
そうだなクラスの目玉機能の一つとして演算子の多重定義というのがあるな これをテンプレートと組み合わせるとtraitsになる
>>580 了解しました。コンパイラスレ探しに行ってきます。
初心者の的はずれな質問に付き合って頂いてありがとうございます。
>>581 難しいですねw
理解するにはまだまだ勉強が必要みたいです。
大は小を兼ねる的な、
基本的な関数を、継承使ってちょっとカスタマイズすることで、
ゼロから書くよりは大幅に工数を削減して欲しい関数を実現する見たいな?
大規模開発ではクラスは使わない クラスと言う名の構造体しか使わない
>>583 実際は仮想関数を使うために仕方なくpublic継承を使うけど
できることならコンポジションで対応出来る所はそうしたい
継承は使いすぎるとプログラムの見通しが悪くなるんですよ
実際にプログラム書いてみるとわかるけど
それからUML図にも慣れるといいね
UML無しにOOPしようとすると頭が爆発します
templateは継承とはまた全然別の機能
ジェネリック・プログラミングのための機能でこれがあるために
C++は特別な言語になっちゃってます
>>585 ありがとうございます。
実のところ、
UMLライクなお絵かきするとCコードを生成してくれる環境に慣れすぎてて、
裏で何が起きてるのかさっぱ分からないという状況に慌てて、
連休利用してCの文法見直してたらいつの間にかここに辿り着いたといった次第です。
(作って覚えるVC#とかの本でキーボード叩くのえらい難儀しました。)
継承とtemplateの違いがまださっぱりなので、
明日もじっくり解説サイト読んで来ることにします。
レスくれた人ありがとうございます。&おやすみなさいー
一応Cは理解していると思っているのですが C++を最初から勉強しようとした時、何かオススメの書籍なりサイトはありますか? 猫とかやさしい〜ってのはやめとけみたいな話を「C言語なら俺に聞け」というスレで目にしたもので
>>587 ロベールのC++を読んでおけ
規格書に近い内容まで知りたいなら詳説C++も読め
ロベール=ピエール
>>587 AcceralatedC++一択じゃないか?
それはいいけど、折角書籍スレがあるんだから見てきたら?
>>590 C++を「一から」理解したい人に「AcceralatedC++」は
違うだろうと思うんだけど
それよりC++ in-depth seriesそのものが違うだろうと思う
あれは中級者が上級者に進むためのシリーズだろう
Webサイトの方のロベールはだめだ。いろいろ古い。 推奨されないコーディングもある。 本はそういうところ直されてるから、そっちを読んだほうがいい。
gotoって処理自体は軽いでしょうか? gotoを使うと無駄なコンストラクタを一回さけられる状況なんですが。
そのコンストラクタを避けるのは本当に必要なことか? 何か速度的に重要な場面? gotoは、ローカル変数のデストラクタを呼ばなきゃいけなかったり tryブロックの出入りが必要な場合を除けば、軽い
goto使うなんて言ったら最後、 何回レビューして注意書き何箇所に追記せにゃならんか・・・ って状況でもなければ作って走らせて比較してみては?
597 :
594 :2009/08/14(金) 21:05:25
>>595 > そのコンストラクタを避けるのは本当に必要なことか?
そのコンストラクタはhoge_t型をテンプレート引数にもつクラステンプレートの
ものであるため、hoge_t次第で重さが変わります。
> 何か速度的に重要な場面?
速度はあまり重要ではありません。
>>596 gotoを使ってあると、
「こいつ(の技術や作ったクラステンプレートは)大丈夫か?」
って思われますかね、やっぱ。
使う理由とドキュメンテーションがしっかりしてればいいんじゃね
599 :
594 :2009/08/14(金) 21:19:45
びびってきたんで止めときます。 こうして一生gotoを使わないまま過ごしそうです。
601 :
600 :2009/08/14(金) 21:31:02
class queue { 〜 } の中に using DataStruct<T>::buff; と書く
603 :
600 :2009/08/14(金) 21:40:38
ありがとうございました。 テンプレートについて詳しく書かれた教科書を探さなければ。
>>597 MISRA-Cなんかだと例外処理の時のみ認められてるかな?
gotoその物は悪くないんだ、ただ下手な使い手が多かっただけで、
このあたりはアメリカの銃問題と似たような感じ、
銃が悪いのか銃を使った人間が悪いのか、
銃が悪いのか、子供の手の届くところに銃を放置した親が悪いのか、ってな感じでね。
そのgoto使う箇所ってどのくらいの頻度で呼ばれるの?
CPUもメモリも豊かな時代だからよほどのことがない限り使わないけど。
>>597 よく読んでなかったスマソ
実行速度はもちろん、コードの可読性が上がるみたいな理由がなければ、
基本的に使わないのが無難かな、
イスラム教徒とか黒人だってだけで差別されるっしょ?
あんな感じよ。
そこまでの差別意識はないけど、ここ十数年gotoは使ったことない。 使う理由が見出せないだけだがな。もしgoto使った人間が近くにいたら、 理由を聞いて見たい、いや問い詰めたい気分がするのは間違いない。
607 :
597 :2009/08/14(金) 22:48:52
>>604 呼ばれる頻度はたいしたこと無いと思います。
>>605 可読性はむしろ下がると思います。
>>606 ですよね、自分も他の人間が使っていたら是非聞いてみたいと思います。
やはり使わないのが無難という感じでしょうか。。。
俺はそれほど気にしない派 しかし可読性が下がるのは戴けない 速度がよほど気になる場合以外は、可読性を取るべき
末尾再帰したいけど最適化が保証されないからgoto使ったことあったかも
gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・
条件演算子で避けられたりしないか?
612 :
597 :2009/08/15(土) 08:12:23
ありがとうございます。 > gotoでコンストラクタが1回避けられる状況ってほうが謎だ・・・ 既に作ってあるオブジェクトを返せばいいっていう状況です。 ちょっとここのあたり(もしgotoを使ったら)スパゲティプログラムに突入します。 > 条件演算子で避けられたりしないか? さけがたいです。
>>612 ifとauto_ptrで回避できると思うんだがどうよ
もっとも、実行速度にあまり影響ないなら分岐を避けたほうがいいかもね
VC++6.0をもってるんだけど、これで勉強すればいいのかなぁ?7.0とかあるの?
VC6は窓から捨てるべき 2008のExpressを使いなさい
616 :
612 :2009/08/15(土) 12:51:19
>>613 newして得たオブジェクトでしたらauto_ptrを使うことも考えますが、そうではないのでこのまま分岐を避けようと思います。
>>614 VC6で勉強するのは、今現在は相当悪い選択肢だと思いますよ。
VC8かgccがオススメです。
619 :
デフォルトの名無しさん :2009/08/15(土) 13:15:06
VC6は現行の標準C++じゃないと思ったほうがいい。 C++ライクなVC6独自言語だと思いましょう。
コンストラクタで配列の要素数を自動で取得したいのですが... TCHAR a[] = _T("123"); my_array<TCHAR> v = a; 見たいなことをやりたい 理想は、 my_array<TCHAR> v = _T("123"); だけどこっちはまあいいや
my_arrayが何かわからないけどこういうこと? std::basic_string<TCHAR> v = _T("123");
こうですねわかります template<typename T> struct my_array { template<std::size_t L> my_array(T (&a)[L]) { std::cout << "length: " << L << std::endl; } template<std::size_t L> my_array(T const (&a)[L]) { std::cout << "length: " << L << std::endl; } }; int main() { my_array<TCHAR> v = _T("123"); }
変数の実体がない。 myclassスコープ外で int myclass::i=0;
628 :
624 :2009/08/15(土) 19:38:06
>>625 ,
>>627 ありがとうございます。そういうことなんですね。
これからもちょくちょくこのような初心の質問にあがると思いますが、どうかよろしくお願いいたします。
C++で、 誤差のない小数計算(実数計算)が出来るライブラリは ありませんか? Boostにはなさそうで。
どんな計算をしたいのか?
三角関数です。 誤差のない小数計算型 x; sin(x)+cos(x) とかです。
その計算結果をどのような形で受け取りたいの?
>>629 有限ビットで誤差が無いなんて可能なんですかね?
僕も知りたいです。
>>633 有理数ならboost::rationalで表現できる。
RealLibでも使えば?
三角関数は一部の結果を除いて無理数でしょ。
>>635 RealLibは遅延評価で計算してるのかな?
639 :
629 :2009/08/16(日) 12:33:08
710 名前:□7×7=4□□[sage] 投稿日:2009/07/29(水) 19:17:00 ID:X3ZTVshE
[タイトル] Cargo Bridge
[タイプ] 橋かけ・構造力学パズル
[URL]
http://www.limexgames.com/ [感想]
bridge builderとかやったことある人ならわかりやすいとおもう。
キャラクタが荷物を押して倉庫まで運ぶために、途中の谷に橋をかけるゲーム。
パーツは4種類あり、足場になるパーツと足場にならず支えにだけなるパーツ、それぞれが木製と鉄製の2種類ずつ。
足場になるものの方が高価で、鉄製の方が高価。はじめは木製の2種類だけが使える。
使用できるパーツは右上の予算範囲内に抑えなければならない。安上がりでできるほど高得点。
橋にかかる負荷が、キャラクタが運ぶ荷物の種類によっても大きく変化したり、片道でいいところと往復するところがあったり、
いろいろ考える要素の多いゲーム。今16面挑戦中。
キャラクタが谷に落ちていくときの声がシュールw
こういうゲームがあるんだけど、参考ソースとかってどっかにないかな・・・
linear programmingでwikipedia.enれ
>>641 それは計算機にゲームを解かせる場合の方法論であって、ゲームの作り方の
ガイドにはならんだろ。
>>639 最終的に計算結果として数値が欲しいのでは?
>>640 デザインパターンのどれかに当てはまりそうだけどちょっと思いつかないわ。
645 :
639 :2009/08/16(日) 13:35:21
>>643 最終的には文字列表記で計算結果が欲しいです。
>>640 こういうゲーム大好きだw
参考ソースは思い浮かばないけど、
高校物理の力学をシミュレートしてるだけに過ぎないのでは?
FEMだろ
>>648 有限要素法ではないと思う。別に力学的解析が必要なわけではないし。
具体的に何桁の精度が必要なのか明示しないと無理なんじゃない? 浮動小数点とかの概念も知らなさそうだし。
∧_∧ / ̄ ̄ ̄ ̄ ̄ ( ‘∀‘)< オマエガナー ( ) \_____ | | | (__)_)
>>640 コードは知らないが、ニュートン力学で十分シミュレートできるだろうね。
パラメータの調整が面倒だと思うが。
>>647 既に上で言及されている。linear programming = 線形計画法。
シンプレックス方は線形計画法の解き方の一つ。
線形計画法は関係ないな
くみ上げるのはユーザーなんだから、 最適解の算出とか不要でしょ
656 :
642 :2009/08/16(日) 15:22:35
だから関係ないって言っているんだが。
>>645 文字列って、数式の文字列?だったらmathmaticaを使えばいいんじゃないかな。
>>657 ライブラリを求めてるんだろ。
お前ライブラリの意味分かってる?
数式処理ライブラリがあるなら教えて
660 :
658 :2009/08/16(日) 17:19:14
661 :
639 :2009/08/16(日) 17:30:05
>>657 いえ、ただ出力するときに
std::cout << static_cast<double>(計算結果)
などいうバカなことはしないってことです。
ようするに出力時には精度指定で
std::stringもしくはconst char* const型
で結果が得られると良いのですが。
>>691 最終的に有限の精度で返すなら誤差は存在することになりますね。
従って計算は、最終的に必要な精度が得られる有限の精度で(誤差のある)計算をすればよいことになります。
664 :
639 :2009/08/16(日) 18:19:31
>>662 そうでも無いのです。
例えば
sin(acos(-1))
などです。
だから数式処理システム使えよ
>>665 ライブラリが欲しいのです。
数式処理システムだと使い物になりません。
あと、数式には文字式はありません。
>>664 結果が0にならないね。有限の精度ならそうなるし、数値演算ではよくある話になる。
その辺はいろいろテクニックを使うんだ。たとえばsqrt(1.0-x*x)を使うとか。
数値演算の誤差について調べたほうがいい。
そんなことは知った上で聞いてると思うが
670 :
639 :2009/08/16(日) 20:41:50
皆さんありがとうございました 紹介されたRealLibのスレのリンク先などを見て挑戦してみます。
>>666 バックエンドで数式処理システム動かしておいて
そいつと通信するライブラリを自作したら?
いまいち何がやりたいのか伝わってこないんだけど
>>671 お前は何でそこまでライブラリを嫌うんだ?
> バックエンドで数式処理システム動かしておいて
> そいつと通信するライブラリを自作したら?
まじめに言ってるの?
開発したことある?
俺ライブラリのブラのあたりが嫌いだわ。 なんかブラブラ揺れてそうで。
>>672 なぜ俺に食いつく?
この件に関しては初カキコなんだが
少し落ち着け
もう本人いねーんじゃね。
int型の変数hogeにビット演算を施したいのですが、 ビット演算は環境依存になってしまったりしますか? 2で除算したりするときはビット演算のが速いのではないかと思いまして。 (それともコンパイラの最適化があれば変わらないのでしょうか。)
>>677 そんな判断ができないくらいなら、素直に2で割っておけ。
速度比較結果自体は最近見掛けたが、結論は出てないと思うぞ。
679 :
677 :2009/08/17(月) 10:46:58
>>678 レスありがとうございます。
ビット演算は実はやったことがないので、
もし速いのならこの機会に勉強してみようかなと思いまして。
でもint型なので負の数が混ざると複雑になりますかね。
速さについての云々は、 まず実測してみたらってのがいつもの結論じゃね。
681 :
677 :2009/08/17(月) 10:56:18
>>680 やっぱ実測なんでしょうか?
まあビット演算は腰が重いので、速さを追求する時までは止めておきます。
ありがとうございました。
VC++2008にて const int b = 2; c = a / b; このソースが sar eax, 1になる件。 素人が思ってる以上にコンパイラはうまいことやってくれるよ。
683 :
677 :2009/08/17(月) 11:01:26
>>682 私よりコンパイラの方が頭が良さそうなので
コンパイラの最適化に頼る事とします。
>>682 正確には
cdq
sub eax,edx
sar eax, 1
だな。
でないと負の数で端数を切り下げてしまう。
アセンブラって全然分からないんですが 勉強しなきゃダメですかね。。。
>>685 必要になるまでしなくていいと思うよ。
少なくとも、ビット演算がどうのこうのと言うよりも後でいいし、
そもそも他にやるべきことは幾らでもある。
class base class a : public base class b: public base func(base *pb){ if(typeid(pb) == typeid(a*){ aアクセス用のポインタ作成 }else{ bアクセス用のポインタ作成 } オーライドされたそれぞれの関数にアクセス } ってことがやりたんだけどポインタ作成の部分がわかりません こういう場合って同じ処理をif文の中に2回書かないと出来ないの?
>>687 C++の初歩を勉強してください。
そうすれば、pb->func()で事が足りるかどうか判断できるでしょう。
base の関数をvirtualにしたら出来た
#undefしていようがいまいが 別のソースで同名のマクロがあったらどうしようも無いわけですので、 #undefすることの意義がいまいち分かりません。 #undefは心がけた方が良いのでしょうか?
691 :
690 :2009/08/18(火) 18:28:15
×別のソースで ○別のヘッダーで
おまえはまだC++でマクロを使いたいのか。
はい。
694 :
690 :2009/08/18(火) 19:13:22
>>692 「マクロって超便利!」
→「inline関数ってすげー!
templateもすげー!」
→「やっぱりマクロにしか出来ないこともあるじゃん。両立が大事だよな。」
今の私はこの心境なんです。
例えば似たような演算子を一斉に定義するときなど、
#define MACRO(..., op,...)
のようにしてopに演算子を入れたりとか
まあ色々使い道はあるじゃないですか。
それはない。
ほとんど重複してるけどちょっと違うコードとかマクロ使っちゃうよね
確かにね。MFCやATLのメッセージマップなんかはマクロの恩恵なしには実現し得ないしね。 Effective C++でもまだまだ必要な部分もあると認めてはいる。 でもやっぱり危険だから、なるべく使わないに越したことはない。でも使いたい? なら、他人のプログラム領域に踏み込まないように最大限の注意を払うべきだ。 自分の管理していないようなヘッダーに自作ヘボうんこマクロを混入させてしまうようなまねは厳に慎むべきで 自分の書くマクロは1翻訳単位内に限定し、ヘッダに宣言するような真似はやめにして もしヘッダに書くなら必ず末尾で#undefして、あるいはヘッダの冒頭に 「このヘッダファイルは俺専用だからお前のプロジェクトでインクルードするなよ?絶対するなよ?」 と注意書きをしておくべき。 なんだったらヘッダファイル作らないというのも手だ。 俺の書いた関数が使いたい奴は手書きで宣言しろ、と。
>>696 関数化するか、テンプレートを使うか、データ構造を見直せば、そんな気持ちの悪いことはしなくて済むと思う。
C++2003でvariadic templateをやろうとしたらプリプロセッサ使ってパラメタ変えながら 再帰#includeとかする必要もありますしね
再帰リスト作ればいいじゃん
嫌だね
まともなライブラリ(Boostとか)のコードを お読みになれば、結構使われていることも ご理解いただけると思いますよ。 コンパイラ毎にコードをかえるためとかそれだけのため だけではありません。
話し中すみません。 boost\date_time\int_adapter.hpp 等で (::std::numeric_limits<int_type>::max)(); と書かれているのですが、これはどうしてこの様な記法になっているのでしょうか?
より高級な機能がないから仕方なく使われてる、って以外に マクロが重要になるケースって何かあるの?
>>704 基本的には「仕方なく」使われていますよね。
仕方なくじゃない使い方としては
Boost.Preprocessor
に代表されるプリプロセッサメタプログラミングがあるのではないでしょうか?
>>703 Boost本家スレで
773 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 20:59:38
BOOST_PREVENT_MACRO_SUBSTITUTION
っていうマクロはどういった用途で使う(or使われている)のでしょうか?
そもそも定義されている部分すら見つけられません。。。
774 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:14:07
boost/config/suffix.hpp にあるよ
775 名前:デフォルトの名無しさん[sage] 投稿日:2009/07/28(火) 22:15:44
>>773 prefix.hppで定義されてる
使い方は,たとえば某MSのヘッダファイルのように
#define min(a,b) ...
#define max(a,b) ...
と定義されてあった場合,
std::min(lhs, rhs) や std::max(lhs, rhs) や std::numeric::limits<hoge>::max()
などの min, max がマクロで置換されてしまうけど,
std::min BOOST_PREVENT_MACRO_SUBSTITUTION (lhs, rhs)
と呼び出せばこれを防げる.
つっても,冗長すぎるから普通は(std::min)(lhs, rhs)ってやるけどNE
776 名前:773 [sage] 投稿日:2009/07/28(火) 22:25:46
ありがとうございます。
理解出来ました!
てな会話が行われていたよ。
707 :
703 :2009/08/18(火) 20:44:37
>>706 ありがとうございます。
そうしますと、私がこれから定義するmaxテンプレートなども
全て(max)にした方が望ましいと言うことですよね。
ありがとうございました。
#include <vecter> とやっているのですがerrorC1083が出てしまいます VC++2008EEを仕様しています。 ちなみに#include <list.とかはエラーを出しません
ごめんなさいvectorでした・・・
(´ー`)
ウヒヒ
713 :
デフォルトの名無しさん :2009/08/20(木) 00:40:25
このスレ過疎ってるな。
714 :
713 :2009/08/20(木) 00:43:37
いや過疎ってなかったか。 見間違えた、
過疎ってねーだろ
int foo(double val) { if( val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 } こんな関数があります。 この処理の部分で、valの値によってはfooを再帰呼び出ししたいことがあります。 その場合に単に普通に再帰呼び出しをしてもいいのですが、 再帰呼び出しでは無駄な処理(引数の範囲エラーチェックなど)を飛ばせるように フラグ変数をboolで引数に持たせる事はしても問題ありませんか?
717 :
716 :2009/08/20(木) 00:51:58
つまり int foo(double val, bool recursive_call = false) { if( !recursive_call && val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 } として、再帰時はfoo(val, true)とすることで無駄な処理を飛ばせるようにするのは 設計上まずいとかありますでしょうか?
liboctaveについて質問なのですが Matrix型などで各要素でlong double型を扱うことはできますか? 標準だとdouble型になってしまうのですが・・・ できればやり方も教えていただけるとうれしいです
719 :
718 :2009/08/20(木) 01:01:39
すいません octaveのスレがあるようなのでそちらで聞くことにします それでは失礼します
>>717 無駄を飛ばすと言って無駄なフラグを足すのがアホっぽい。
int foo(double val) { /*無駄な処理(引数の範囲エラーチェックなど)*/ foo_r(val); } int foo_r(double val) { if( val == 0.0 /*その他重い判定処理*/ ) assert(false); //処理 foo_r(val); }
722 :
716 :2009/08/20(木) 01:19:16
>>720 処理の無駄は実行時間の無駄ですが
フラグ引数はコンパイル時間の無駄なわけですので
必ずしもおかしなことでは無いと思っております。
どうすればよろしいでしょうか?
>>721 確かに処理を分けるのがよさそうですね。
ありがとうございます。
それ以前に重い処理を再帰すんな 設計を見直せ
>>722 > 処理の無駄は実行時間の無駄ですが
> フラグ引数はコンパイル時間の無駄なわけですので
何を根拠にそんなこと言ってんの?
余計な引数があれば実行時間も食うしスタック消費量も増える。
「増える」は言い過ぎた。 「増えてもおかしくない」だな。
726 :
722 :2009/08/20(木) 01:56:45
>>723 再帰と言えば再帰ですが、最大で2回までの再帰でして
これ以上軽量化は厳しい状況です。
>>725 > 処理の無駄は実行時間の無駄ですが
> フラグ引数はコンパイル時間の無駄なわけですので
は主として困る弊害をあげたものです。
bool引数が一つ増えたところで
if(
val == 0.0
/*その他重い判定処理*/
)
assert(false);
を上回るほど実行時間は食いませんしスタック消費量も増えないと
思うのですが。
というか確定的だと。
>>726 最大2回までの再帰ってのがすでに何かおかしい気がする
関数の役割や関係を見なおしてみたら?
>>726 そんなに判定が重いなら、判定部分とその後の処理部分を別の関数に
分ければいいだろう。
そういう風に分けたら、結局再帰なんて必要なくなると思うが。
>>726 >> 処理の無駄は実行時間の無駄ですが
>> フラグ引数はコンパイル時間の無駄なわけですので
>は主として困る弊害をあげたものです。
引数にフラグを追加すると、コンパイル時間の無駄が「主として困る弊害」になるの?
すごいコンパイラを使ってるんだなぁ。
本当にその無駄が処理のボトルネックになってるならそういう書き換えをやるのもアリだろうが、 そうでなければ全く意味が無いぞ ちゃんとプロファイルとって調べたか?
compile time debugger compile time profiler
class A{ int a; ... void func(){sizeof(*this);} }; class B : public A{}; Aの仮想関数func()内でsizeof(*this)したところ、サイズは128でした。 ところが、Bのfunc()での実行結果はクラスサイズが176なのに、Aと同じ128という結果でした。 Bのfunc()でも176というサイズを得るにはどのようにすれば良いでしょうか? B側でfunc()を定義し直せば解決するのですが、できればAのfunc()のみをいじって解決したいと思います。 環境はVC++2005です。
733 :
732 :2009/08/20(木) 12:16:58
virtual void func(){sizeof(*this);} でした。すみません。
>>731 TMPやってると欲しかったりする
あるのかな
>>732 こんな感じの醜いコードを書くくらいしかできないと思う
if (typeid(*this) == typeid(A)) {
return sizeof(A);
} else if (typeid(*this) == typeid(B)) {
return sizeof(B);
} else {
throw std::runtime_error();
}
>>732 A の側では B の存在すら知らない状態だし、実行時型情報として sizeof を取り出す
標準的な方法も無いので、無理。
こういうのはだめ? クラスBなどAの派生クラスにも、継承元をAからAImplBase<B>へと変更するという修正を加える必要があるけど。 #include <iostream> class A { char a[128]; public: virtual std::size_t this_size() {return sizeof (A);}; }; template<typename T> class AImplBase : public A { public: virtual std::size_t this_size() {return sizeof (T);}; }; class B : public AImplBase<B> { char b[128]; }; int main() { B b; std::cout << b.this_size() << std::endl; }
738 :
732 :2009/08/20(木) 14:28:26
>735-737 回答ありがとうございます。 難しいようですね。勉強になりました。 >737さんの案を元にちょっと考えてみます。
MFC勉強してるんだけど動画の再生ってできるのかな? フレーム取り出して一枚一枚ペイントしてくしかない?
>>739 DirectShowで再生するのが一般的かと
DirectShowの質問は専用スレがあるからそっちでどうぞ
動画再生するのが一番の目的じゃなくて 入力動画→処理→出力動画ってのを並べて同時再生とかできれば こんなに変わったんだよって分かりやすいかなと思ったんですよね とりあえずDirectShowについて少し調べてみますありがとうございます
きっと泥沼になる
処理がリアルタイムじゃないならそんなに難しくないけど・・・
配置のニュアンスとしては 入力動画1 入力動画2 合成動画 のように表示したいので MFC上で動画表示したいなと思ったのですが無理そうなら画像列で表示しようと思います
クラス設計に関しては割とましになってきたような気がするけど クラス間の連携がどうもうまくいかない・・・ Mediatorとかためして見たんだけど、メディエータのメンバ関数が増えまくってしまう・・・
http://codepad.org/7lYft1tr bad_weak_ptrが出ちゃう。誰か助けて。
ライブラリ側にBaseクラスがあって、何も変更できない。
やりたいことは、Derivedクラスのメンバ関数のファンクタを作りたい。
(コールバック用のファンクタがほしい)
オブジェクトのライフタイムの関係上、
shared_from_this()の代わりにthisを渡したくない。
くそーわけわかめだぜ
>>747 enable_shared_from_this が2つあるからダメなんじゃないの?
Base が変更できないなら Derived のほうは enable_shared_from_this つけなくて
いいでしょ。
>>747 こうすると、shared_ptrに捕まえられたファンクタがfに代入される。ただ、F()でF()のファンクタを作る意味がないけど。さらにfで保持すると参照カウンタが0にならなくなる。
ファンクタを作りたいなら、mainで bind(&Derived::F,d)とすればすむ筈。
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/function.hpp>
typedef boost::function< void () > func_t;
class Base
{
public:
void N(){};
};
class Derived :public Base,
public boost::enable_shared_from_this< Derived >
{
public:
void F()
{
f = boost::bind( &Derived::F, this->shared_from_this() );
};
func_t f;
};
int main()
{
boost::shared_ptr< Derived > d( new Derived );
d->F();
func_t x=boost::bind(&Derived::F,d);
return 0;
}
>>748 >>749 レスさんすこ。
単純に、enable_shared_(ryだと、
BaseクラスにFメンバ関数がないから、コンパイルが通らないから、
Derivedでも継承させた。
今ぶち当たってる問題を単純なコードに落としただけだから、意味は考えないでくだしあw
>さらにfで保持すると参照カウンタが0にならなくなる。
メンバに自分自身を持たせるとダメなの?
よくわからん。確かにdtorが走ってなかった・・・
>>747 Baseのenable_sahred_from_thisを活用する、つまりダウンキャストはだめ?
class Derived : public Base
{
public:
void F()
{
f = boost::bind( invoke_f, shared_from_this() );
};
static void invoke_f(boost::shared_ptr<Base> b)
{
boost::shared_polymorphic_downcast<Derived>(b)->F();
}
func_t f;
};
invoke_fはlambdaやbindで実装できるなら不要。
Baseに仮想関数がないなら、shared_polymorphic_downcastの代わりにshared_static_castを使えばいい。
あと、お前の例でも通用するか分からないが、安直にweak_ptrを使えば当然デストラクタも呼ばれるようになる。
void F()
{
boost::weak_ptr<Base> wp = shared_from_this();
f = boost::bind( invoke_f, wp );
};
static void invoke_f(boost::weak_ptr<Base> b)
{
if (boost::shared_ptr<Base> sp = b.lock())
{
boost::shared_static_cast<Derived>(sp)->F();
}
}
>>750 fがDerivedをつかんでいる限りDerivedは開放されない。fがDeriviedを放すのはDerivedが開放されるときだから。
DerivedでFのファンクタを保持する必要性はほとんど無いと思われるので、その辺を検討しよう。
質問があるのですが、 以下のソースのように、例外をいっさい投げれない関数内で例外を投げる処理を書いていまして、 プログラムが異常終了するのを期待しているのですが、VC++2008のコンパイラだと例外をキャッチしてしまいます。 これって理由ありますでしょうか? ちなみに他のコンパイラ(bcc32, g++)では期待通りに異常終了します。 #include <iostream> using namespace std; void test() throw() { throw 0; } int main() { try { test(); } catch(...) { cout << "test\n"; } return 0; }
C++ Coding Standards 第75項によると 「強制されない限り、自分の関数に例外仕様を書かないこと」と書いてありまっする。
756 :
753 :2009/08/22(土) 06:07:01
>>754 , 755
どうもありがとうございました!
すっきりしました。
>>753 以前vc9(betaだったかも)でいろいろ試したときは
throw()つきの関数内で例外を投げるコードをreleaseビルドしたバイナリを実行したときは異常終了したと思う
嘘だったらごめん
>>755 その理由は?
その関数が投げる例外が正体不明になったら普通困らないかな?
>>758 まずコストとして、
try-catchブロックが挿入される
でそれが最適化の妨害をする
違反した際はunexpected_handlerに飛ぶだけになって、
指定しなかった場合において得られる可能性のある例外の情報は失われる
得られるものは動的なチェックだけ、
それも例外仕様に違反したら精々「違反した」だけ言って落ちるだけの貧相なもの
備考として、
テンプレートが関わるとどんな例外が来るかは定義時点では決定不能なので
適切な例外のリストを作ることは無理
こういう性質のもので関数が投げる例外が明確になる?
使う価値あると思う?
それってthrow()も駄目なのか? まぁ別に大抵は書く必要も無いけどなthrow()なんて
throw()だけは価値がある場合もあるかもしれない、俺は書かないけどね と書いてある
762 :
753 :2009/08/22(土) 16:17:01
>>757 IDEを起動してreleaseで実行したところ異常終了しました。
違いがよく分かりませんが、debugにすると例外をキャッチしました。
デフォルトだと例外仕様違反するとunexpected()->terminate()->abort()が呼ばれることになってるから 異常終了するのが正常
throw(hoge)って書いても関数仕様変更すると広域に波及して変更が大変。労力に見合ったメリットってない気がする。 ただthrow()は例外安全を示すメリットはあると思う。 そういえばデストラクタにthrow()はなんで書かないんだろうか?
アホなコンパイラがtryブロック挿入する可能性があるから
例外投げない保証は有用なのにthrow()がクソすぎるから C++0xでnoexceptというのを型システムに組み込もうぜという話がある
allocator とか auto_ptr とか vector<bool> とか どんどんゴミがたまっていきますね^^
おまえallocatorとauto_ptrなめんなよ
まあauto_ptrはunique_ptrに移行してdeprecatedの予定ですけどね
だがゴミではない。現行の規格では重要なものだ。
同情の余地がないvector<bool>さんパネェ
おまえら予約語なのにスルーされてるexportさんに謝れ
export は普通に関数名とかに使いたいときがあって困るな。 キーワードは変に短縮されてるほうがいいんじゃないかとすら思うよ。 int とか const とか、まず自分で使う気にはならん。
まともな実装がないexportを何故標準に入れたのか 標準化委員会は狂っているとしか思えない
Comeauなめんな
>>747 コールバックのための関数オブジェクトはこれ Derived オブジェクトの外に配るんですよね?
コールバックのための関数オブジェクトをメンバとして保持せずに
外に配るときに毎回作る + shared_ptr<Base> を downcast したものを持たせる,
で良いのでは?
>>774 >435-436
時々で良いから、Comeauの事を思い出してあげて下さい
>>766 確かに、constメンバ関数と同じように例外安全性の指定ができればいいなーと思ったことはある
C++ Sourceにテンプレートを使って実現する技法が投稿されてたけど、
あれを実践するのは正直ムリだと思った
export の実装ってそんなに難しいかなあ。 オブジェクトファイルにソースコード埋め込んで、リンカからコンパイラ呼べば 済むと思うんだけど。
>>779 よく分からんがそのお前の案とやらで
gccでexportが実装できたら
このスレの神プログラマとして
あがめられるな。
すくなくともテンプレには確実に入る。
Comeauが3人年かけてexport実装して「もうやだ実装したくない」って禿に泣きついた話が D&Eに載ってるから読むがいい
その話に関してはどちらかというと Exceptional C++ Style を紹介したほうが良いような?
783 :
デフォルトの名無しさん :2009/08/23(日) 03:08:52
boost::functionの型引数について教えてください。 boost::function<int (int)>と宣言したときに、 どうやってシグネチャから戻り値の型と引数の型を取り出しているのでしょうか?
template<typename T> class function<T()>{/******/}; template<typename T, typename U> class function<T(U)>{/******/}; template<typename T, typename U, typename V> class function<T(U,V)>{/******/}; ; とかやってんじゃないの 知らないけど
全力でソース追いかければ何とかなるんじゃね、知らんけど
H S P で や れ
本気で宣伝するならまとめページ作ってそこのリンク張るようにしてくれ vipのスレのリンクなんか張ってもすぐdat落ちして見れなくなってしまうじゃないか 本当に見る人のこと考えてないんだな
790 :
デフォルトの名無しさん :2009/08/23(日) 11:49:15
valarray<T>::apply(T func(T))が,ふつうの関数しか受け付けないのですが, 関数オブジェクトを関数へのポインタに変換する関数って標準で用意されていますか? つまりptr_funの逆関数はあるでしょうか?という質問です. (自分で書けば一行ですが,メソッドが増えるのはよくないでしょう) 唐突ですが,よろしくお願いします.
関数オブジェクトは関数の形をしてはいるものの、 それ自身のアドレスは持ってないから逆関数なんてないよ
792 :
デフォルトの名無しさん :2009/08/23(日) 14:06:41
なるほど.わかりやすい説明ありがとうございます.
あれ、なんか調子悪い?
c_functionとかいうのがあるんじゃなかったっけ 使ったことないけど
795 :
デフォルトの名無しさん :2009/08/23(日) 16:17:05
796 :
デフォルトの名無しさん :2009/08/23(日) 16:22:50
うわっ.っていうかBoost VaultはBoostですらないんですね. みなさん,ありがとうございました.
>>796 Boost File Vault
Boostライブラリには入っていないけれど、その叩き台としたい、 というようなソースが転がっています。宝の山。^^
ってk.inaba氏が言ってた。
valarrayを捨てる手もありそうだが
>>790 valarray<T> y = x.apply(functor);としたいとして、
代わりにこれで我慢するのはだめ?
valarray<T> y(x.size());
std::transform(&x[0], &x[0] + x.size(), &y[0], functor);
valarrayも要素が連続している保証があるからこんなことして平気なはず。
void関数ではその処理を終えて外のスコープに処理を戻したい場合は return; を記述しても良いということでしたが、 コンストラクタでも同様にreturn;を記述しても 良いのでしょうか? 記述した際にはそれより後ろにある処理は実行されないと期待してよろしいですか? g++ではこの通りの動作でしたが、これがC++の仕様なのでしょうか。
>800 大丈夫です. 蛇足ながら対応するであろう規格の文言は (6.6.3/2), (12.1/12)
795があぼんなんだがまたfaith and braveでも貼ったのか? いい加減にしろ。
あぼんしてるなら触れるなよ アホなのか?
何のためのあぼーんなんだよなw
何でFaith and Braveを貼っちゃいけないんですか?
あぼーんであれスルーであれ、「お前の言葉は俺に効いてない」とアピールしたいあまり、 それを自分から言い出して、効いてるのがバレバレになる奴はたまに見かける。 たぶん居留守を使う時なんかも、居ないとアピールしたい一心で ドアの向こうの人に「いま居ません」とか言っちゃうんだろう。
「レス番飛んでるんだけど、何きたの? ねぇ、何きたの?」 「お前、NGに入れたから」 「あ、そう。でさぁ(ry」 「NGに入れたっつってんだろぉぉぉぉぉ!」
言葉にしない間しか成立しない主張を、言葉にすることで殺しちゃうんだよな。 「誰もお前にレスする奴なんかいねえよ」とか。 自分の言葉で直接相手を悔しがらせたい衝動、みたいなもんが低脳にはあって、 それに勝てずに自爆してしまうんだろうか。
あ…あんたのことなんて、何とも思ってないんだからねっ! ってパターンも。
あるあるwww
811 :
デフォルトの名無しさん :2009/08/24(月) 17:06:45
すみません.レス遅れました.
>>797 自分で適当にソースを改竄すればいいってことですね.
>>798 valarray<bool> って嬉しくないですか?
(vector<bool>のかわりに・・・)
>>799 コピーコストに目をつぶって,これでいこうと思います.
>>802-6 まったく議論が理解できないのですが,気分を害したのならすみません.
c_function って検索してもあまり出てこなかったので便利かと思って
リンク貼りました.他意はありません.
正直,あまり回答には期待していなかったのですが,
色々アイディアをもらえて感激しています.ありがとうございました.
> 正直,あまり回答には期待していなかったのですが, > 色々アイディアをもらえて感激しています.ありがとうございました. この一言はどうして書いちゃったんだ。 「お前らには大して期待してなかったけど いないよりは役に立ったな」 って意味にしかとれないんだけど。 実生活でこれいったらもう目も当てられない ようなことになるぞ。
それはお前の読解力がおかしいんじゃないのか
>>813 いやおかしくないだろ。
別に悪意を持って読んだわけじゃないけど、
そう思った人は俺以外にもいるだろ。
>>813 お前の読解力だと
> あまり回答には期待していなかった
これは「誰の回答に期待してなかった」んだと思う?
書き方が悪いのは確かだな。 あまり反応してもらえるとは思わなかったが、と書くべき所。
> あまり回答が付くことは期待していなかった ならいいけど、 > あまり回答には期待していなかった=ろくな回答は無いと思っていた と取られるとね。 まあ2chだから当然な予測かもしれないけど、 わざわざ書かなくても良かったかもね。 でもそこは噛みつく程でもない気がするが。
むしろ
>>812 みたいなことをいちいち言っちゃう人のほうが
実社会では目も当てられない。
最近キレる人が増えたのは、
無礼な人が増えたよりも
他人の無礼をまったく許容できない赤ん坊のような糞人間が増えたからだって
どっかの新聞に書かれてたなぁ。
で?
820 :
デフォルトの名無しさん :2009/08/25(火) 01:29:40
平謝りです.ごめんなさい. > 実生活でこれいったらもう目も当てられない この通りですね,弁解の余地はありません. 人によって2ちゃんねるとの付き合い方は違うのに, それを無視した迂闊な発言でした. 感謝を伝えたかったのに・・・(涙)
>人によって2ちゃんねるとの付き合い方は違うのに, >それを無視した迂闊な発言でした. 別にダメじゃないが何というか、一言多いよね。 再帰的に迂闊。
再帰的わろたうぇw
要するに、回答内容に期待してなかったんじゃなくて、回答されることを期待して なかったんだろ?
>>821 そこ、俺も同じこと思った。
「俺の2chとの付き合い方を、迂闊どころか当然の顔をして無視し、踏みにじるお前ら」
って言いたいのかなと。
ある要素xを、自分より相手のほうがより強く持っていると判断した時に、
「xを持つことは悪いこと」という概念を大仰に押し立てて「xを持っててすみません」と平身低頭、
実はそういう皮肉攻撃、っていうデザインパターン。
べつにいいんじゃね
ぶっちゃけ何をそこまで絡んでるのか分からん
世の中うぜえ奴ばっか
ケンカ売る気なら最初から本気でかかってこいや この偽善者め とまあ、そんなことではないかと
普通の #ifndef HOGE #define HOGE 本文 #endif というインクルードガードがあるにも関わらず、 同時に 「コンパイラの種類がVCであるか、 もしそうならVCのバージョンを調べて #pragma once」 としているものがあるのですが これは意味があるのでしょうか? どうして前者のインクルードガードだけでは不足なのでしょうか?
>>830 なるほど、
昔の冗長インクルードガードと同じですか。
ありがとうございます。
尚、pragma onceの使える環境であればインクルードガードを省略できると言う考えは間違いである。
え? #pragma once を使える環境でインクルードガード書かないと何かマズイの?
シンボリックリンクとかの関係でファイルの同一性がどうのこうのって問題?
そりゃ昔のバギーな実装の問題だろ。
滅多なことでは問題にならんからなぁ。 gcc3.4で解決されたって話もあるし。 それにVCとgccとで使えるから、ふつーのひとはもう何も考えずに#pragma onceしちゃっていいんじゃないかなぁ。
同じ内容の別のファイルをインクルードするときにバッティングが発生するのを防止することができない。 インクルードガードなら、それができる。その点を無視していいのなら、prgama onceで充分。
#pragma onceの問題点は非標準であるという一点に尽きる。 一々各コンパイラが対応しているかを調べるのは面倒。 ちなみに、上で#pragma onceの時のみに最適化される可能性があると書いてあるが GCCではインクルードガードを使った場合に同様の最適化が効く。
VC++2005なんだがDLLを配布したいんだけど libとh同封しとけばVC6とかVC++2008とかの人でも使えるんかな?
VC8で#pragma onceの効果があるかどうか調べたけど効果はあったよ
毎回インクルードガード書くより#pragma onceに対応してるか調べた方が結局楽、と いう考えもある インクルードガードなら枯れてるから安心して使える、という考えもある インクルードガードは記述時にヒューマンエラーが起きやすいから嫌だ、という考えも ある #pragma onceはコードではなくファイルに依存するので、シンボリックリンクなどで 別のパスからインクルードされた時の問題などがあって嫌だ、という考えもある まぁ色々それぞれだな #pragma onceにユニークな識別名を付けられるようなのが最初からあれば最強だった んだろうが ちなみに#pragma onceは対応している処理系は結構多い
出来るだけ多くの環境でも使えるようにしたいもののヘッダは インクルードガードをかけるしかない。 たとえ#pragma once の利点を十分承知し、対応する処理系が増えているとしても。 そして、その利点を生かすためには、#ifdefで切り分けて#pragma onceも併用するという 一見アホらしいコードを書くしかない。 例えば、MSのWin32処理系では、全て#pragma onceが使用可能だが PSDK等のヘッダファイルは、他の処理系でも利用可能にするために インクルードガードも併用されている。
仮にビルドが通らない処理系があったとして、 それがpragma onceのせいってのは、ありえないと思うけどな。 それ以前のクリティカルな要因で止まるだろ常考。
インクルードガードと#pragma onceが両方とも有効な状態って問題ある?
インクルードガードはインクルードを読み込む順番が固定できるから、循環参照を防げるメリットがあるね。
インクルードガードを矛、#pragma onceを盾だとして、 両方有効な状態だと、両手が砕けて紫龍が負ける そんぐらいです。
別に両方書いても、片方が仕事してもう片方が潰されるだけのこと ライブラリ屋は「VC++なら#pragma onceが先に掛かるようにした方が軽いな」とか 有効な順番を意識するが、別にしなくてもコンパイルが僅かに遅いとかその程度
>>844 問題ない。実際Boostの一部のヘッダではVCの場合に併用している。
>>842 によるとWin32 APIのヘッダでも同様のことをやってるようだし。
仕様として #include と書けば何度でもファイルを開いて展開するんだろうけど その仕様が役に立つことってあるの?
>>849 assert.h を #define NDEBUG して #include したり #under NDEBUG して #include したり。
Boost.Preprocessorを使った再帰#includeでVariadic Template みたいなことをするテクニックとか…
#ifndef HOGE_H #define HOGE_H #if defined(_MSC_VER) && defined(__GNUC__) && ... #pragma once #endif 本文 #endif 結局こうするのがベストなのか めんどくせーな
>>852 それじゃどんなコンパイラでも#pragma onceが使われないぞw
いや、
VC++でコンパイルする時に -D__GNUC__ -D__BORLANDC__ をオプションにつける
GCCでコンパイルする時に -D_MSC_VER -D__BORLANDC__ をオプションにつける
という技を駆使しろ、という
>>852 のお告げ。
>>852 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
これだけでいい。併用は単にコンパイル時間の高速化の意味しか無いから、違いの出る
VC++だけ書けば十分。
>>853 この書き方でちゃんと使われる。
ちなみに
>>847 は半分間違い。
>>852 で両方とも有効に働く。
凄いな神の技だ・・
>>855 > この書き方でちゃんと使われる。
アホ? &&の意味も分からないのか?
>>855 #pragma once は、VC++4.2(_MSC_VER=1020)からサポートされたと考えていい?
1000にしてるライブラリもある 1020にしてるライブラリもある
なぜならmergeというのはマージソートでいうところのマージを行う関数だからです
こじつけ気味に言うとjoinでなくmergeだから。プログラム関連ではだいたい以下のニュアンス。 join:二つのものをつなげて一つにする。繋ぎ目で切り離せば元の二つに戻る。 merge:二つのものを混ぜて一つにする。元の二つに戻すには構成要素を一つずつより分ける必要がある。
>>861 しっかりドキュメント読め。
lst1.merge(lst2)はソートする。O(n)
lst1.splice(lst2)はソートしない。O(1)
>>863 も書いているけど、mergeはどちらかと言うと順序関係を保存して結合する
という意味合いが強いね。順序関係を作るためにソートが必要になるということ
だと思う。
865 :
861 :2009/08/26(水) 23:11:55
ご教唆ありがとうございました。まだひとり立ちしてドキュメントが読めるような者ではありませんが、すこしずつ学んで生きたいと思います。
教唆
これは斬新だ…
この犯罪者どもが。
なんつーかさ、 背伸びして、あたかも難しいことを知っているかのように振舞いたいんだろうね。 日本語にしても、プログラミング言語にしても。
難しいことを難しく言うことは誰でもできる 難しいことをわかりやすく言うことは非常に難しい
mergeは事前にsortされてないと鼻から悪魔じゃないかい
親方ー鼻から女子中学生が
23.2.2.4 list operations p22
> void merge(list<T,Allocator>& x);
> template <class Compare> void merge(list<T,Allocator>& x, Compare comp);
> Requires: comp defines a strict weak ordering (25.3), and the list and the argument list
> are both sorted according to this ordering.
両方ソート済みじゃないと未定義動作になるね。
>>864 はどのドキュメントを読んだんだろう?
>>873 それは当然。リストがソート済みじゃなけりゃO(N)でmergeできんぞ。
別に
>>864 は間違ったこと言ってないだろ。そもそもcodepadのコードでは
lst1, lst2ともにソート済みなんだから。
/: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ ___ /;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、 / ヽ /ヽヽ: ://: :!:,X~::|: /;,,;,/: :/ リ!: ::/ノ l`ヽl !: : |: : : :l: :l: リ / そ そ お \ /: : ヽヾ/: : l/::l |/|||llllヾ,、 / |: :/ , -==、 l\:::|: : : :|i: | / う う 前 | . /: : : //ヾ ; :|!: イ、||ll|||||::|| ノノ イ|||||||ヾ、 |: ::|!: : イ: ::|/ な 思 が /: : ://: : :ヽソ::ヽl |{ i||ll"ン ´ i| l|||l"l `|: /|: : /'!/l ん う ∠: : : ~: : : : : : : :丶ゝ-―- , ー=z_ソ |/ ハメ;, :: ::|. だ ん i|::ハ: : : : : : : : : : : 、ヘヘヘヘ 、 ヘヘヘヘヘ /: : : : : \,|. ろ な |!l |: : : : : : : : :、: ::\ 、-―-, / : : :丶;,,;,:ミヽ う ら 丶: :ハ、lヽ: :ヽ: : ::\__ `~ " /: : ト; lヽ) ゝ レ `| `、l`、>=ニ´ , _´ : :} ` / ,,、r"^~´"''''"t-`r、 _ -、 ´ヽノ \ノ / お ・ ,;'~ _r-- 、__ ~f、_>'、_ | で 前 ・ f~ ,;" ~"t___ ミ、 ^'t | は ん ・ ," ,~ ヾ~'-、__ ミ_ξ丶 | な 中 ・ ;' ,イ .. ヽ_ ヾ、0ヽ丶 l / ( ;":: |: :: .. .`, ヾ 丶 ! \____/ ;;;; :: 入:: :: :: l`ー-、 )l ヾ 丶 "~、ソ:: :い:: : \_ ノ , ヾ 丶
超低レベルな質問ですが、 unsigned char x=2; std::cout << x << std::endl; とすると、2という数字ではなく、文字化けした文字が表示されるのですが、 これはなぜですか? どうすれば回避できるのでしょうか。
std::cout << (int)x << std::endl;
charは文字型なので、文字コード2の文字を表示した結果であろう 2という文字を表示したいのなら 2 ではなく '2' と書くべき 文字ではなく数値として扱いたいのなら char ではなく int を使うべき
std::cout << (int)x << std::endl;
int(x)
コード書いて確かめたわけでもなんでもないんだけどこのスレ的には static_cast<int>(x)じゃないの?
int(x)はstatic_cast<int>(x)と等価。よってint(x)が良い。
int(x)はstatic_cast<int>(x)と等価。よってどちらが良いかは宗教論争。
また基地外か
xがint*やconst intだとstatic_cast<int>(x)の方が安全 だがそんなことよりタイプ量が少ないことの方が大事なのでint(x)を使うべき
何のためのキャストかを明示するためにstatic_cast<int>が良い。 さらに言えば、boost::numeric_cast<int>が萌える。
887 :
881 :2009/08/27(木) 20:52:56
別に宗教戦争引き起こすために書いたんじゃないんだ C++スレ的にはそうなんじゃないかなぁと思っただけ 俺はsatatic_castを使う派だけど、タイプ量少ないしint()で十分だと思う
>>885 > xがint*やconst intだとstatic_cast<int>(x)の方が安全
両者は等価なんだが、どこがどう安全なんだ?
>>886 > 何のためのキャストかを明示するためにstatic_cast<int>が良い。
勘違いするなよ。何のためのキャストか分からないのは(int)xであって
int(x)は明示している。
885は(int)xとの区別が出来ないんだよきっと
>>888 static_castはポインタ-整数間の変換やconst外しは出来ない
(int)xとint(x)はできる
>>889 (int)xとint(x)はまったく同じだぞ
自分ならboost::implicit_cast、次点でstatic_castだな。
>>890 嘘乙。
> static_castはポインタ-整数間の変換やconst外しは出来ない
> (int)xとint(x)はできる
両者ともconst外しは出来るし、ポインタからの変換はどちらも無理。
const外しはconst_castだろ
>>894 (int)xはstatic_castができない状況ではreinterpret_castとして働くことになってるからできるよ
嘘乙
>>895 両者ってのはint(x)とstatic_cast<int>(x)のことな。
(int)xとint(x)はまったく同じだってば
まず見た目からして違う
さすがIT土方ばかりなのか、馬鹿ばっかだなw 禿本の6.2.8にint(x)とstatic_cast<int>(x)が等価であることが書いてあるから しっかり読んでおけ
はい規格読もうね 5.2.3 Explicit type conversion (functional notation) 1 A simple-type-specifier followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4). (後略) int(x)は(int)xとequivalentです
ところでint(x)でどうやってconst外しやるんだ? 誰か教えてくれ
const intで渡された値がintになるぜー、とか頭悪いこと考えてる可能性も
結局何が正しいんだ
C++スレなんだからstatic_cast,const_castを使うのがいいと思うよん個人的にはね
とはいえconst_cast<int*>(static_cast<const int*>(hoge))なんて書くのは冗長だし読みにくいし コンパイルや実行速度遅くなりかねんし安全性が上がるわけでもない C形式の方が多くの場面で優れている
いいからもう寝ろよ
そんな書き方が必要になるコードを書く奴ならCの方がそりゃ合ってるだろうな
const char*をint*にしたいってくらいならC++だって普通にあるだろ
>>907 実行速度が遅くされるのは dynamic_cast だけでしょう。
最適化が糞だったらstatic_castとconst_castが別々の命令になっちゃうかもしれない 大した差ではないかもしれないがC形式で一気に変換して防げるならその方がいい
>>910 まああるな。
でも、どうせクラスで封じ込めるから、
たった1度だけだし907みたいに書いてやるかという気分になる。
普段使っているのも、VCとかg++とか最適化もそんなにヘボじゃないコンパイラばかりだし。
C++みたいに道具が揃ってるのに、そんな変換を頻繁に書かなきゃならないのは 問題があるだろ
>>910 これってエイリアシングの問題は発生しないの?
発生しない条件下で使うんじゃね? 普通に糞設計としか思えないけど、コードを見ないと何とも
直接ポインタ変換はstrict-aliasingなんちゃらって警告されるから使いたくないなあ
警告されてしかるべきだしな そもそも、どういう条件だと問題が起きないんだ?
919 :
デフォルトの名無しさん :2009/08/28(金) 05:02:54
小さな数だけ扱いたかったので、charを選択していたのですが、 intにした方が良いのですね。 short等もまた、数字を扱うべきではないのでしょうか?
そういうレベルの疑問が出るならC言語初心者スレとかに行くべきなのではなかろうか
>>923 11th ed.までは
For a built-in type T, T(e) is equivalent to static_cast<T>(e).
と書いてあるが、これは明らかにerrorの訂正であってclarificationではない。
禿も往生際が悪いな。
AAAとBBBというクラスがあるとして、継承をせずにBBBでAAAのインスタンスを作り、BBB内のAAAのインスタンスを使ってAAA内に宣言した関数(BBB内の変数の値を変える)にアクセスすると、BBBクラス内の変数が全て変な数になりました。 どうしてこんなことが起こるのかわかりません。わかる方がいたら回答お願いします
>>925 追記
関数内の処理の途中ではなく、関数にアクセスした時にBBB内の変数が壊れます
>>925-926 おちょくってるんじゃないなら、ソースと、何を見て「変数が全て変な数に」なったと思ったのか
書いてもらわないとわからん。
わからない人は書き込まないでください。 最近のゆとりはソースコードをみないと回答もできないんですか? 想像力が欠如している証拠です。ラノベばかりじゃなく、文学を読んでください。
それは想像力や読解力というものではなく、ESPというものです
想像で回答してもいいが、それがお前さんの状況と一致するとは限らんぞ 役に立たない回答をもらってどうするつもり?
>>928 まともな質問も出来ないでキレてる方がよほどゆとりw
質問に答えられないくせに偉そうな人ばかりですね^^
質問がデタラメなので回答不能、という明確な答が 即座に返されたじゃないかw
まずソースをさらさないことには、なんとも。
940 :
920 :2009/08/28(金) 23:41:24
"hogehoge" というような文字列リテラルの型はなんですか? char* char* const const char* const char* const のうちどれだと考えればよろしいでしょうか?
>>942 申しわけありませんが
標準C++でお願いいたします。
>>943 const char[9] っぽい
#include <typeinfo>
#include <stdio.h>
int main() {
if (typeid("hogehoge") == typeid(const char[9])) {
printf("It's true!\n");
} else {
printf("It's false...\n");
}
}
型にconstは含まれないよ
いや、念のためVC++で試したら、typeid(char[9]) と typeid(const char[9]) が別だったもので・・・
アレっ? g++だと同じ
gcc 4.2.1では同じだったよ。
950 :
941 :2009/08/29(土) 13:20:33
>>944-945 typeidで自分で調べる方法もあったんですね。
ありがとうございました。
>>951 の
ttp://codepad.org/Af5eErTrを実行してみると g++では
typeid("hogehoge") == typeid(char[9]) is true!
typeid("hogehoge") == typeid(const char[9]) is true!
VC++では
typeid("hogehoge") == typeid(char[9]) is false!
typeid("hogehoge") == typeid(const char[9]) is true!
Borland C++ 5.5.1では
typeid("hogehoge") == typeid(char[9]) is true!
typeid("hogehoge") == typeid(const char[9]) is true!
だな。
ISO/IEC 14882:2003の2.13.4 1だな 普通の文字列リテラル(ordinaly/narrow string literal)ではconst char[n] Lプレフィックス付き(wide string literal)ならばconst wchar_t[n] その長さnについては2.13.4 5で定義されてる
955 :
941 :2009/08/29(土) 13:37:59
皆様ここまでお調べくださり ありがとうございました。 とても助かりました。
#include <stdio.h> #include <boost/type_traits/is_const.hpp> #include <boost/type_traits/remove_pointer.hpp> template <typename T> bool is_const_type(T) { return boost::is_const< boost::remove_pointer<T>::type >::value; } int main () { printf( "%d", static_cast<int>(is_const_type("")) ); } こういうコードだとどうなる? 厳密には、関数の値渡し引数として与えた場合にテンプレートでどう解決されるか、の テストだから、const int a = 0;とか変数作ってis_const_type(a)すると0が返って きちゃうが。
>>956 VC8だと1が返るね。
リテラルはconst char* だけど、Cとの互換性のためにリテラルはchar*に代入できる事になってるって昔聞いたことある。
template<class T>
T test(T a)
{
return a;
}
int main ()
{
const char* a=test("hoge"); //ok
char* b=test("fuga"); //error
const char* c="piyo"; //ok
char* d="hanya"; //ok
}
リテラルをchar*に代入して書き換えるのって合法なんだっけ?
>>958 規格は知らないけど禁止でしょう。
Windows上では書込み禁止のエリアにリテラルは配置されているので書き換えようとするとメモリ違反の例外が出る。
BCCだともっと困る事態が起きる -d オプションを付けてコンパイルすると同一の並びの文字列リテラルは マージされて全て同じアドレスを指すようになる(Javaみたいな感じ) この状態で文字列リテラルを書き換えると同一の並びの文字列リテラル が全て書き換わってしまう事になる
おおこわいこわい
>>960 文字列の比較にstrcmpじゃなくてポインタの比較使ってる初歩的なバグが
たまたまテストに文字列リテラルばっかり使ってたせいで発覚しなかったのを思い出した
>>962 strcmp()はCの初心者の時から苦労したなあ
文字列を比較できない言語ってのに何しろ初めて遭遇したもんだから
>>960 VC++にも文字列プールオプションはあるし、他のコンパイラにもあるんじゃね
安価ミスか
ミスっぽいの見当たらないけど
>>967 そのエラー内容だと、g++だとどっかでis_const_typeが既に使われてるのかも
占拠にいこう
970 :
デフォルトの名無しさん :2009/08/30(日) 11:08:50
.netで グローバル変数のように複数のクラスで参照したくて クラスの外で変数を定義しても グローバルまたは静的変数は、マネージ型 'hoge' を含むことはできません というエラーが出てしまいます。 グローバル変数を定義できないということで 下のようにmain 関数内でクラスhogeのインスタンスを作成しても 他のクラスで参照する方法がわかりません。 どうしたらよいでしょう? int main(array<System::String ^> ^args) { hoge^ ho = gcnew hoge; // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; }
英数字だけでなく日本語等の2バイト文字を含む文字列に対して、先頭から1文字ずつ調べていくにはどうしたらよいのでしょうか? 1バイト文字か2バイト文字の一部であるかの判定なども自分で作らないといけないのでしょうか?
うん。C++に限った話しじゃないけどね
>>972 wchar_tやlocale使ってもだめだからね
大抵のC++処理系には独自の関数が装備されているのだが
975 :
972 :2009/08/30(日) 14:15:40
ありがとうございます。やはりそうでしたか・・・。 wchar_tを使っても駄目なのはなぜなのでしょうか? これならうまくいきそうだと思ったところだったのですが・・・。 あと、何か便利な関数とかあったら教えていただけないでしょうか?
>>969 その誤字は場合によっては警察沙汰だぞ。
>>975 例えばちょっとマイナーになるが
C++Builder2010とかC#だとUnicode文字列が使えて
特別な関数は必要ない
>>976 とあるアニメの「通販で小惑星を買った話」というサブタイトルが、
アニメ情報サイトで「通販で小学生を買った話」とtypoされてたのを思い出した。
979 :
972 :2009/08/30(日) 15:15:16
>>977 ありがとうございます。
まだいまいち理解できていない部分があるのですが、
Unicode文字列をwchar_tで扱う方法でうまくいきそうです。
>>979 unicodeでも、サロゲートペアやら連結文字とかあるから、1char1文字だとうまくいかないことがある。
だな 勝手な事を言い出す国があって結局65536文字に全文字を 収める事ができなかったので2〜4バイトで可変長だしな
よくできたライブラリを使うんでない限り文字列関係で楽をしようとは考えない方がいいよ
>>981 そもそも世界のありとあらゆる文字を65536個の中におしこめる発想がどうかしている。
だが52個しか文字を持たない国の人たちは本気でそれで十分と考えてた
欧州ですら52個じゃ収まらないのに^^
7ビット圏の発想がそもそも原因でしょ C/C++を英語以外のキーボードで使っても知らないよって 言ってる人達だもん 1ビット余るのでそれでpackedしようなんて発想だし wchar_tだってgccにまともにインプリメントされるまでどれだけ 時間がかかったか
まぁ何度も何度も何度も何度もメモリ空間の壁とかHDD容量の壁とかと戦ってるのと ある意味同じ
大東亜共栄圏が樹立されていれば話も違っただろうに。
C#(.net)ならStringInfoを使えばいいけど、win32のCharNextは連結文字には対応してるのに、 サロゲートぺアには対応してないって中途半端さ。
operator voidって出来ないんですか?
できたとして何もできないじゃないすか
引数列を2つ取る関数オブジェクトを作りたかったので、 例えばhoge(a,b)(c,d);みたいに書くと、hoge(a,b)が中間的な関数オブジェクトを返して それに(c,d)を適用するようにしました しかしhoge(a,b);みたいに引数列一つだけのものは意図してないのでエラーにしたいんです そこで中間オブジェクトのoperator voidにassertを張っておけば検出できると思ったんです ダメ?
中間オブジェクトにフラグを設けて、operator()が呼ばれずにデストラクタが 呼び出されたらassertすればいい。
それでもいいんですけどフラグ変数を#ifndef NDEBUGで囲むのが嫌だったんです 式の最終結果が特定の型になったかどうかを検出する方法ってないんですかね?
100;がエラーにならない言語に無茶言わないで!!
>>990 出来るけど、明示的に呼び出したとき以外、呼ばれないはず。
素直に引数列の方をオブジェクトにすりゃいいんじゃね
いい方法あったら知りたいな hoge[i][j]とかにも使えそうだし
正直、hackっぽくていまいちな方法だと思うな
中継関数オブジェクト::operator 左辺値() にassertion仕掛けるとか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。