テンプレ終了。例のやつは、もう飽きたんで好きな人は勝手にやって。 過去スレ一覧、 2ch のアドレス貼っても HTML 化されるわけじゃないし、 そろそろ考え直したほうがいいかも。
>>11 激しく乙。
過去スレのリンクは、datを探してる人(いるのか?)には有益だから、そのままでもいいと思うよ。
あるいは、テンプレサイトか。
まだ続けるつもりなのか。。。
そうだ。話は終わっている。誰も答えなくていいよ。
糞スレ化が進んでいます
C/C++には、言語的なオーバーフロー検地方法が無いので、次のいずれかの方法を取ります。 1. オーバーフローしないサイズの型を選択する 2. 計算前にチェックする 3. 計算後にチェックする 4. クラスを作ったりする。 F.A.
どれも微妙だ。。4.は何を作るか次第だけど難しそう。
だからケースバイケースなんですよ。
>>18 例えばNumricクラスを作って四則演算を演算子オーバーロードして、
オーバーフロー時に例外をthrowするようにするとか。これだと簡単でしょ。
でも普通は1.だと思うけど。
まあそんな感じにはなるんだろうけど汎用的なものが作れるなら 既にboostとかにありそうな気も。あと基本型のみのoperatorは できないような。。片方はクラスに入れてとか?
いえいえ、オーバーフローする危険性のある変数は、全てNumeric型のインスタンスに するという意味です。
てか、マジでそのレベルの回答を求めてたのか。。。
全ての整数型をNumeric型にするのはパフォーマンス的にも作業的にも 現実的じゃなさそうですし、オーバーフローしそうな箇所のみを特定して おいてNumeric型にするというのがやはり妥当なんですかねえ。。
まあそんな感じでめんどくさくなって結局__int64にしとけばいいやって なって脆弱なプログラムができあがるわけだ
26 :
デフォルトの名無しさん :2006/08/26(土) 03:43:51
メモリが許す限りの無限桁の整数を扱う基本的手法を教えてください
なんで急にあげ。。 BigIntで検索しよう。がんばって作るんだよ。
>>26 多倍長整数を扱うライブラリを拾ってくる。
29 :
デフォルトの名無しさん :2006/08/26(土) 04:03:27
質問させてください、 今DLLを作っているのですが、例えば文字列を char *ではなくstring でやりとりするような関数をDLLで作ったとき、 1.そのDLLを利用するアプリケーション側 と 2.DLL側 とで 開発環境が異なっていてstringの実装詳細が違っていたりしたら 実行時エラーとかが起こってしまうのでしょうか? ご回答よろしくお願いします。
>>29 stringが規格に則って正しく実装されているなら、
実装の詳細は関係ない。
31 :
29 :2006/08/26(土) 04:20:46
>>29 起こってしまいます。
>>30 DLL とのインターフェースではバイナリ互換性が要求される。
規格にバイナリ互換性についての規定は無い。
class string { size_t n; char* p; ... };
class string { char* p; size_t n; ... };
↑の2つの string はどちらも規格に適合した実装となり得るが、
一方の実装が使われた DLL での string を、他方の実装が使われた
プロセスで正しく操作することはできない。
33 :
29 :2006/08/26(土) 04:38:22
>>32 ありゃorz
なるほど了解です、あきらめてchar *で受け渡すようにします。
勉強になりました、ありがとうございました。
34 :
デフォルトの名無しさん :2006/08/26(土) 05:09:35
VC++7でdynamic_castで基底クラスへのポインタを派生クラスのポインタに変換しようとすると 変換できない場合NULLが返るということらしいのですが、そうならなくて、代わりにaccess violationが発生します なぜですか?
>>34 問題が再現する最小のソースを作ってみよう。
>>34 RTTIを使用するためのコンパイラオプションを設定していないのではないか?
VC++ 7ではそれを指定しないとRTTIが使えなかった気がする。
>>24 世の中それでパフォーマンスが問題になるほど最適化があほなC++コンパイラばかりでもないぞ。
まあ作業時の方が問題だというのはそうだろうな。
38 :
26 :2006/08/26(土) 08:50:46
>>25 C++でオーバーフローチェックしてるプログラムなどほとんどない。
>>39 そりゃあらかじめ要素の範囲が解ってる設計してるからじゃないのか?
そういえばBASICって変数の型を指定していなかった場合、 処理の途中で現在の型の範囲を超える値になった時に その変数の型をより大きな範囲を表現できる型に自動で変更してくれる。
42 :
34 :2006/08/26(土) 14:47:21
>>35-37 レスありがとうございます。
コンパイラオプションが必要ということはまったく知りませんでした。
ためしに同じソースを家のVC++7だとコンパイルできた。
プロパティーの「言語」の「ランタイム型情報を有効にする」は「いいえ」になっています。
会社のとバージョンが違うのかな。。
もっと調査してみます。
>>35 bad_cast例外ってC++の例外ですよね?Win32例外でしたので。
>>42 コンパイルは通るよ。
実行時にエラーが出るけど。
44 :
デフォルトの名無しさん :2006/08/27(日) 02:42:56
STLも質問していいですか? vectorとかのbegin()は、もし要素がない場合nposを返すのですか? それとも要素がない場合を判定するにはend()と比較するのですか? nposと書いたらコンパイルエラーになったもので。
そうなんですか。サンクス
empty()で最初に調べる手もあるよ。
>>44 vec.size()<1
ループなら
for(int i=0; i<vec.size(); i++){
でOK
文字列std::stringならempty()
iteratorって長いんだよね… Dのautoみたいなのがあればいいんだけど。
>>48 vector でも empty() だよ。
何故empty()がvectorにも用意されているか考えましょう。 #つーか、EffectiveSTLは必読書だと思う。
vectorだろうがstringだろうが、全部ではないにしても 共通のインターフェースで処理を行うことが出来るのが利点の一つだよな。 初心者向けのAccelerated C++にさえ載っている。
containerはempty()必須です。 stringはcontainerじゃないが。
stringをコンテナと考えても差し支えない気もする。違うけど。
stringは確かにchar型のコンテナだな。文字列の結合・部分的取り出し・ 置き換え・挿入などが頻繁に行われるので、いろんなメンバ関数を 持ってる所が他のコンテナと違うけどな。
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない。 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 スマン・・・どうしても・・・
>>58 いいんだ。
俺もそれをいつ入れようかと思っている間にスレ番があっという間に
進んでしまい、躊躇していた。
60 :
デフォルトの名無しさん :2006/08/27(日) 12:27:14
>>58 > すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
STL使うのにスタティックリンクかダイナミックリンクで違いが?
違うコンパイラ・リンカもあるってことだろ
例のヒトの予感
ぶっちゃけ経緯の分からんやりとりの一部載せられても 粘着にしか見えね
同じ議論の繰り返しが予想されるから晒してるだけじゃね。
こういうのが職場にいるとやる気下がるな
魔よけの御札みたいなもんだろ。 むしろ変なものを呼んでるけど。
燃料か釣りかありがたい壷にしかみえない
>>55-56 21.3.2 にこんなん書いてあるよ。
"The class template basic_string conforms to the requirements of a Sequence, as specified in (23.1.1).
Additionally, because the iterators supported by basic_string are random access iterators (24.1.5),
basic_string conforms to the the requirements of a Reversible Container, as specified in (23.1)."
70 :
モンガー :2006/08/27(日) 21:47:56
継承関係になくても、 instantiateに成功すればいいってもがC++だからね。
>>70 古い。
アジソン=ウエズレイの"The C++ In-Depth Series"で、
網羅されていて、しかも内容も新しくなっている。
古文書やD&Eを読む趣味がある人は読んでもいいと思う。
いまだにPDFになってないオリジナルの著名論文も読めるし。
73 :
モンガー :2006/08/27(日) 22:57:22
JavaにClosureが導入されるかも〜という話を聞いて、もう、C++でいいだろとか思ったぜ むしろ、C++からJVMのバイトコードし、Javaのクラスライブラリが C++からも利用できれば、C++最強じゃね?とか妄想したり。
ostringstreamってバッファはどうなってるんだろう。 <<で、連結していくと、どっかでバッファ拡張するようにな仕組みなんかな。 なんとなく重い気がする。JavaでいうStringBuilderみたいなの作った方がよいのかな。
それ、昔俺も調べたけどわからなくて 結局<<を諦めてstring+reserveでお茶を濁した覚えがある。
以前、tietewがcppllに文字列の連結をstringとして評価されるまで遅延して 領域の確保を一度で済ませるようなコードをポストしていた気がする。
79 :
デフォルトの名無しさん :2006/08/28(月) 23:25:51
自作クラスのoperator=()で、メンバ変数を全てコピーしたいのですが、 void operator = (const T& t) { a = t.a; b = t.b; } のように1つひとつコピーだと、メンバ変数が増えたときにコード量が多くなってしまいます。 thisを使って一気にコピーしたいのですが、 void operator = (const T& t ) { *this = t; } のように書くと無限ループに陥ってしまいます; どのように記述すればよいでしょうか? あと、 T a, b, c; a = b = c; のように記述したいときは、 T& operator = ( const T& t ) { ...... return *this } でいいですか?
>>79 そりゃ自分で自分自身を呼び出せば無限ループになるだろう。
基本的にはメンバ毎にコピーするしかない。
>>79 メンバ変数を代入するだけなら暗黙に定義されるoperator=で十分じゃね。
82 :
デフォルトの名無しさん :2006/08/28(月) 23:42:23
operatorのオーバーロードで()演算子をオーバーロードした関数オブジェクトってものが出てきたんですが、 これって何に使うんですか? メンバ関数にhoge()って一つ用意するよりずっと便利な使い方とかあるんでしょうか
83 :
デフォルトの名無しさん :2006/08/28(月) 23:43:12
下手だなあ
>>79 君は・・・
データのまとめ方が圧倒的に下手・・・!
class mydata
{
public:
int a,b;
};
mydata data;
void operator = (const T& t ) {
data = t.data;
}
これで万事解決・・・!
すげえシュールだ。感動した。
>>79 全メンバを普通にコピーするだけならデフォルトの方が良い
メンバが増えるたびに書き直す必要がなくなるし、コンパイラの最適化も効く
>>82 関数オブジェクト(Functor)のありがたさを本当に実感するには、
STLのコンテナにアルゴリズムを適用させるようになってからだろう。
87 :
79 :2006/08/28(月) 23:48:29
>>80-83 ありがとうございます。
無知なもので、operator=が暗黙的に定義されることを知りませんでした。
やりたいことはメンバ変数の代入だけなので、それで解決しました。
ポインタはコピーしないようにな。
89 :
79 :2006/08/28(月) 23:55:55
>>88 以前は配列にポインタを使っていたんですが、vectorに変えたので大丈夫です。
わざわざありがとうございます。
vectorってビット毎のコピーで大丈夫なんかな?実装にもよるけど、 ヒープ領域に実体を持ってて、メンバにはポインタを含んでいそうな 気がするんだけど。
91 :
79 :2006/08/29(火) 00:03:48
>>90 vectorのoperator=で、新しくヒープに領域を確保すると思ってたんですが・・・
そう言われると不安になってきました
92 :
79 :2006/08/29(火) 00:06:07
int main() { myClass t; for( ;; ) { }
93 :
79 :2006/08/29(火) 00:07:13
すいません、
>>92 は間違い・・・
int main()
{
myClass t;
for( ;; ) {
myClass t2;
t=t2;
break;
}
t.show();
}
で確認したのでおそらく大丈夫かと思われます
>>90 >>91 問題ない。コンテナはデフォルトのoperator=でコピーしても
メモリリークとか二重解放しないように設計されている。
std::stringとかのメンバーならコピーすれば内容も新しいヒープにコピーされる。 自分のクラスのメンバ変数がポインタで、そこに何かを格納している場合、 コピーを作るときは、自分でnewして、そこにポインタの指すメモリ内容を転写するんだよ。 同じものを複数のポインタが見ていて問題ない設計ならOKだが。
メンバにPOD型でないクラスを含んでいた時は、それらはビット毎の コピーは適用されなくて、クラスのoperator=を呼び出すんじゃね? 規格書のどこに書いてあるかは忘れたが。
え
お
§12.8.13当たりだな。 13 The implicitly-defined copy assignment operator for class X performs memberwise assignment of its subobjects. The direct base classes of X are assigned first, in the order of their declaration in the base-specifierlist, and then the immediate nonstatic data members of X are assigned, in the order in which they were declared in the class definition. Each subobject is assigned in the manner appropriate to its type: ? if the subobject is of class type, the copy assignment operator for the class is used (as if by explicit qualification; that is, ignoring any possible virtual overriding functions in more derived classes); ? if the subobject is an array, each element is assigned, in the manner appropriate to the element type;
>>95 ,96,99
「全部 operator= が適用される」で済む話をわざわざ複雑にするな。
ま、端的にいうとそうなんですが。
>>100 ありがとうございます。参考になりました
class A { public: void hoge() {} private: char buf[256]; }; A a1; A a2 = a1; a2 = a1; こういうメンバ変数がPOD型だけのクラスの場合 デフォルトのコピーコンストラクタやoperator=が例外を投げることはあるのでしょうか?
C++例外は飛ばないと思うけどね。
104 :
デフォルトの名無しさん :2006/08/29(火) 20:03:57
参照とポインタの使い分けがいまいち分かりません 関数内で値をいじるならポインタで、見るだけなら参照だと聞いたんですが 変更する必要がないなら普通に引数として渡せばいいんじゃないですか?
俺の使い分けはnullpoがあるならポインタ、ないなら参照(const参照も)
>>104 その使い方は C 使いの人が好む流儀。見た目で区別がつくという利点があるが、
その流儀に従わない人もいるので信頼性が微妙。結局のところ全部参照でも問題ない。
普通に引数として渡すとコピーが必要になるので、大きなクラス(構造体)の場合に
処理効率が問題になることがある。値渡しは const 付きの参照で置き換えると
コピーを必要とせずにほぼ同じ効果を得ることが出来るので大きなクラスに限らず
よく使われる。
107 :
104 :2006/08/29(火) 20:24:19
>>105-106 ありがとうございました
特に決まった使い分け方があるというわけではないのですね
引数の型としてポインタを要求するケース: ・内部でイテレーションしたいとき。(配列など) ・”無効な値”が渡される可能性があるとき。(所謂ぬるぽ) ・スマートポインタ/生ポインタ互換のインターフェイスを作るとき ・関数ポインタが欲しいとき ・Cとの互換性など 引数の型として値を要求するケース ・そのほうが効率がいいとき ・内部でスワップ技法を利用するとき。 ・破壊的コピーなどを期待するとき。 引数の型として参照・const参照を要求するケース ・上記以外
捕捉: operator= の実装で、swap 技法を使うときなどは値渡しが良い。 T operator=( T const & rhs ) { T(rhs).swap(*this); return *this; } とやるくらいなら、 T operator=( T rhs ) { rhs.swap(*this); return *this; } の方が分かりやすくてGOOD
>>107 "C++ Coding Standard"と言う本の
> 25. 値、スマートポインタ、リファレンスのパラメータを適切に使い分けよう。
を読んで。
111 :
デフォルトの名無しさん :2006/08/29(火) 21:03:43
C++ の標準規格ってどこで入手できますか?
>>108 に追加して、
引数の型としてポインタを要求するケース:
汎用ポインタ(void*)を扱うとき。
>>111 英語版はテンプレに書いてある。日本語版は JIS X3014 で検索。
>>109 どっちでも変わらんし、実装が宣言に漏れてるみたいで嫌だ。
116 :
デフォルトの名無しさん :2006/08/29(火) 22:13:02
119 :
デフォルトの名無しさん :2006/08/29(火) 23:32:21
漏れはポインタのポインタを受け取るとき void foo(char * & p); などとしてしまうんだが、これって同ですか? 個人的には、見た目が好きじゃないけど、めんどくささがないから使っちゃう。
>>119 ポインタのリファレンスを使わないと、プログラム内で呼び出し元の
関数のポインタの値を変えるにはポインタのポインタが必要となり、
しかもその関数内では余計な*が常に必要となる。
ポインタのリファレンスを使えば、呼び出し元の関数と同レベルで
ポインタを扱えるようになり、頭の切り替えが必要なくなる。
> 実装が宣言に漏れてるみたい その表現イイ!後輩いじめにつかわしてもらうわ。
>>121 なるほど。漏れもそういう理屈で吹っ切ることにする。
void foo(const char* p); void bar(char* &p); のときに、どちらも foo(p); bar(p); となるので、俺は使わない。
>>124 それはポインタに限った話じゃないでしょ。
基本的に、ポインタや組み込み型は参照渡しにはしない。
>>126 そうでもない。組み込み型は値渡しがほとんどだろうけど、
ポインタはリファレンス渡しも多用される。
な、なんだってー!(AA略
市外局番でおかけください
実装が宣言に漏れてるみたいなことはしないで!
実装とインターフェースの分離しがいがある。
俺はC++で参照は一切使わない。 かえってややこしくならないか?
俺はC++でポインタは一切使わない。 かえってややこしくならないか? 違うものなんだから、普通に使い分けろよ。
その使い分けもめんどい。個人てやってる分には良いけど、 チームで開発するならルール付けもいるよね。
ポインタの方が強い概念なのだから 参照が使えるところでは常に参照を使うべき constと話は同じだ
でもライブラリやAPIがポインタ使いまくりだから、ごちゃごちゃにならない?
ごちゃごちゃになるような名前の付け方とかしてるの?
ライブラリやAPIがポインタ使いまくりなのはCのため。
ポインタはイテレータ。 参照はエイリアス。
>>138 ごちゃごちゃになるのがいやならラッパクラスを作ればいいだけっしょ。
俺は
>>104 のやり方で書いてる。
foo(a);と書かれた時にaが変更されない保証がされてるほうがいいし
多くのAPIとの親和性にも優れてると思う
"C++ Coding Standard"!"C++ Coding Standard"!"C++ Coding Standard"!
class Hoge { friend class Foo; // <---- }; template<typename T> class Foo {}; Fooをfriendにしたいのですが、これではコンパイルが通りません。 friendにしたい相手がtemplateの場合はどう書けばいいのでしょうか?
template<typename T> friend class Foo;
C++なら全部参照渡しにすべき ・Javaはやってる ・ポインタ印* をなくすこと ・文字列はstd::string。Cの汚点は文字列の参照渡しができないとこ ・動的配列はvectorで作って、頑張ればnew、deleteを使わないコードができる 引数 char* c とかやると、関数内で *c とか書くんしょ、バグのもとだよ
>>147 なるほど。ありがとうございました。
ここでもう一つ疑問なのですが、B<int>のみfriendにしたい場合はどう書くのでしょうか?
class Hoge
{
template<typename T> class B;
friend class B<int>;
};
と書いてみたのですが、この宣言自体は通るけどfriendの効果がありませんでした。
>>148 Java -> C++という勉強順序だったのかな?
>>149 それだと最初の宣言が Hoge::B になる。 ::B にしたければ、
class Hoge の前に、外で宣言すればいい。
>>151 ああなるほど、そういうことだったんですか。
外に出したらコンパイル通りました。
ありがとうございました。
>>148 ケースバイケースだなぁ。
工場メソッドとかならポインタでやったほうが楽だ。
auto_ptr使いの漏れの立場は?
関数に値を渡すとき、 void hoge( int a ) { ... } hoge( int( 10 ) ); とかって渡すのと、普通に hoge( 10 ); って渡すのでは何が違うの?
>>148 全部参照にすべきというのは言い過ぎ。
ポインタの方がいいケースも多々ある。
朝からつまらん事を言うな
Javaのプリミティブ型が常に値渡し、それ以外は常に参照渡し とかよっぽど紛らわしいと思うんだが
それは普通のことだ。
ぬるぽ使えないのはこまるなぁ。
_
ミ ∠_)
/
/ \\
ウイーン Γ/了 | |
ウイーン |.@| | | ガッガッガッ
| / | . 人
|/ | < >_Λ∩
_/ | //. V`Д´)/
>>162 (_フ彡 /
大抵のぬるぽはぬるぽ相当のクラスとかぬるぽ相当の例外を定義すれば済むぬるぽ
∧_∧
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
>>164 (_フ彡
166 :
デフォルトの名無しさん :2006/08/31(木) 23:21:47
例外について質問です。 送出されるクラスオブジェクトの定義(クラスの定義)って 皆さんはどこに書かれてますか? クラス(例外で用いられるものではなくて、ごく普通の目的で作るもの)を作る時は 定義をヘッダに書いて実装をcppファイルに書いたりしますが 例外用のクラスはそのヘッダファイルに一緒に書けばいいのか あるいは単独のヘッダファイルで定義するべきなのか迷っています
>>166 例外オブジェクトって、std::exceptionの派生とかで作るやつ?
あるクラスが固有に投げる独自の例外ならそのクラスのヘッダに書くかも
そうでなきゃ単独かな
>>166 迷うくらいだから一緒でいいんじゃないのか?
要するに他の全く独立したクラスからは利用されない例外ってことでしょ?
>>166 「例外用だから」っていう理由で定義場所の決め方は変えないと思うよ。
template<typename T> class A { typedef std::list<T> List; typedef std::map<int, List::iterator> Map; }; List::iteratorにtypenameを付けないとコンパイルエラーになるのですが List::iteratorと書いてあるところが多数あり、全てにtypenameを付けるのは冗長な気がして できれば避けたいです。 typedef typename List::iterator ほにゃらら; としてしまえばいいんでしょうが、List::iteratorの方がわかりやすいのでこのまま使いたいのです。 何か方法はありませんか?
>>170 typedef typename List::iterator List_iterator; // typename がウザイんで
いっそのことdefineとか
>>173 #define でどうやったら解決できるの?
>>171 typedefは避けたいと書いたのですが…
>>172 書くのが面倒なのではなく、見た目が長ったらしくなるのが嫌なのです。
一箇所でこいつは型だとコンパイラに教える事が出来ればいいのですが…
>>173 それは勘弁
>>175 typename は避けたいとしか書いてないだろ。
List::iterator というのを一字一句変えるつもりが無いなら無理だ。
>>176 ゆとり世代か?
List::iteratorのまま使いたいと書いてあるだろ。
C++以外の言語を考えたほうがいいんじゃない? typenameが必要な理由だって、そのcontext sensitiveな文法から来ているんだし。
171をよーくみよう
>>177 だから、それなら無理だっていってんじゃねーか。
typedef が嫌な理由も「List::iteratorの方がわかりやすい」としか書いてない。
で List_iterator なら大差なかろうという妥協案を出した。これが嫌だというなら
一字一句変えたくないんだろう。でもそれは無理だ。
>>177 はゆとり世代でないようだが
それなら何故こんなに馬鹿なのか
>>171 のやり方が、標準的だと思う。
標準ライブラリでも使われている。
「List::iteratorはわかりやすいけどList_iteratorは嫌」 ってどんな我が儘だよ。後者で十分だろ。
>>180 >typename は避けたいとしか書いてないだろ。
につっこんだんだ。
無理という部分には同意だ。
そうやれば出来るのはわかってると書いてるだろうが。
無理無理無理無理カタツムリ と言う事で落着
>>178 C++ の文法って context sensitive なの?
#include <iostream> struct T1 { T1 operator()(int x) { return T1(x); } int operator=(int x) { return x; } T1(int) {} }; struct T2 { T2(int) {} }; int a, (*(*b)(T2))(int), c, d, e; void f() { T1(a) = 3; T2(4); //std::cout << a << std::endl; e = (*(*b)(T2(c)))(int(d)); } int main() { f(); }
お聞きしたい事があります。
>>190 のソース(規格票の中のプログラムに若干手を加えたものです)で、
T1(a) = 3; が何をしているのかわかりますか?
そして、aを出力する行をコメント記号を外すと、"T1に適用できるoperator<<はない"
というようなエラーが出るのです。aってintなのに、どうしてこんなエラーが
出るのでしょうか?
多分T1(a) = 3; と関係があると思うのですが、一晩考えてもわかりませんでした。
よろしくお願いします。
>>191 >T1(a) = 3;
aはT1型です。グローバルのaと違います。
>>192 レスありがとうございます。どうしてaがT1型になるのやらさっぱり・・・・
T1(a)というのは、aを引数とするコンストラクタを呼び出して一時オブジェクト
を作って、そこに3をコピーコンストラクタで初期化しているのかと思いました
が、試しにT1(3)とやるとコンパイルエラーになります。
T1(a)の意味がわかりません。
T1 (a) = 3; → T1 a = 3; と解釈されてるみたいだね。
(T1(A)) = 3; とすると意図通りになる。
↑ Aは小文字にして
>>194-196 なるほどありがとうございます。という事は 3 には特に意味がないみたいですね。
T1の中には変数もありませんし。<<でT1型のオブジェクトを表示しようにも、
T1が値を持っていませんので表示できませんね。
>>197 > という事は 3 には特に意味がないみたいですね。
まあintじゃないとまずいけどな。
SunのCCコンパイラで switch文の最初のcase以降のcaseが 「エラー: この case は局所変数の初期設定を迂回しています.」 って言われるんだけど何故? switch文って何か特別な制限があるんだっけ?
>>198 そうですね。今まで中にメンバ変数を持たないクラスというのは
関数オブジェクト位しか作った事がなかったので、理解するのに
今回は時間が掛かりました。純粋に文法だけを追っていけば
いいわけですね。
warningだろ? 最初のcaseでだけ局所変数の初期化をしている。 int a; switch (〜) { case X: a = 1; break; case Y: } とか。
>201 なに!そんな制限があったのか・・・。 CCではコンパイルも通らなかったよ。 素直にifる事にしました。どうもありがとうございます。
ちょっと違うだろ。
case A:
int n;
...
case B:
...
みたいなものならまだ良いけど
case A:
std::string str;
...
case B:
だと、Bの時にstrがスコープにあるのに、コンストラクタが呼ばれない
という話のはず。
変数のスコープが、switchの外側にあるとき(
>>201 )は出ないと思う。
一応対処法書いとくか case A: { std::string str; ... } case B: ...
>>193 T1(3) がコンパイルエラーになるのはおかしい。コンパイラは何を使ってるの?
>>205 BCC5.82(BDS2006の付属品)です。これ糞コンパイラでしょうか?
>>206 糞とは言い切れないが、 T1(3) をエラーにしてるのはバグだと思われる。
ちなみにエラーメッセージは?
>>207 ごめんなさい何か勘違いしていたようです。
今やったらエラーが出ません。
209 :
デフォルトの名無しさん :2006/09/02(土) 04:45:07
メモリ256MBのFedora 1なんですが、 ifstreamで3GBくらいのfileがopenできません。 ifstreamで開けるサイズの上限って、どうやって決まってますか? 別にすべてを同時にメモリ上に蓄えるわけではないだろうから、 あんまメモリサイズって必要ない気もするんですが。
streamsizeが符号付だからオーバーフローしちゃってるのかも
生のシステムコールとstdioなら _FILE_OFFSET_BITSを64にすれば良いけどね。 これ以上は環境依存だからスレ違い。
>>211 _FILE_OFFSET_BITS も標準じゃないよ。
だからこれ以上なんじゃないの? ~~~~~
あーそうか
縦書きの文章で「以上」にあたるのは何なんだろうと ふと気になった。
以上
位置じゃなくて時系列だと思えばいいんだよ
会話で以上って言う奴は 横書きの吹き出しを意識しているのか!!!
事項な物を並べ上げて 御覧の通りです。 って意味だろ?
書かないと途中で切れてるかどうかわからんだろ。 2chじゃ(ry
222 :
209 :2006/09/03(日) 10:05:03
メンバー初期化リストで *this を渡すのは危険ですか? 例えば、 class A; class B { A& ref_; B(A& ref) : ref_(ref) {} }; class A { B b; public: A() : b(*this) {} }; みたいに。b に渡される *this は、A 自身の初期化が完了していない状態 で渡されてしまう?
*thisじゃなくて、thisじゃダメなのか? どういうケースなんだろ?
this でも問題は同じ。
横槍ごめんなさい。 つまり、bのコンストラクタでAのstatic以外のメンバ・関数にアクセスしたらヤバイってこと?
>>227 じつは規格では、メンバの初期化順序まで決まっていて、
すでに初期化されているメンバにアクセスする分には問題なさそうだけどね。
クラスのメンバの初期化順序は、そのまんま、並んでいる順。
initializer listの順ではない。
ただ、それだと、メンバの宣言の位置を変えただけで挙動がおかしくなる、、
奇妙なコードが出来上がる。
ヤバイ。宇宙ヤバイ。 純粋仮想関数呼んだりしたら、ヌルポ的ヤバさ。
>>228 へぇ、初期化順って決まってたんだ。
基底クラスが先、というの以外は不定だと思ってた…
ということはメンバ変数同士が依存してても
宣言順に気をつけてれば問題ないんだ。
グローバル変数も同一コンパイル単位内では宣言順?
>>229 純粋仮想関数でも定義部を書けば呼んでもOKなわけだが。
vtblの問題じゃなくて?
>>232 嘘だと思うなら = 0 の関数に定義を外部で書いて呼び出してごらん。
>>230 クラス内は宣言順。クラス外は不定。従って、グローバルオブジェクト同士が依存する場合は工夫が必要。
>>230 いや、問題あるない以前に、そんなコードは書くべきではない。
>>231 ,233
やめたほうがいい。
10.4.6
> Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call
> (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor
> (or destructor) is undefined.
>>235 メンバ変数同士の依存は問題ないだろ。クラス作ったやつの責任。
>>237 メンバを宣言する順序を変えるだけで問題が出るコードってどうよ?
>>239 宣言順に依存しないほうが安全なのは確かだが、それを全面的に禁止すると
依存関係のある2つのオブジェクトをクラスにまとめるというよくあるシナリオが
解決しづらくなってしまう。
理想的には、宣言順と初期化リストの順番が異なっている場合などは
エラーになってくれればいいんだけど、現状はコンパイラの警告だけが頼み。
>>240 確かに、どうしてもやりたいというときも、たまにあるけど。
メンバや継承のときの、初期化の順序が、
規格できっちりきまっているというのも、
そういう理由があることなのかな。
>>236 ああコンストラクタやデストラクタから呼ぶって話だろ?メンバ関数から
呼ぶのは全く問題ないよ。
>>241 コンストラクタが複数書けるんで、コンストラクタ(初期化リスト)の都合に合わせて
初期化順を変えられるということになると、デストラクタで逆順に破棄するために
初期化順をインスタンス内に憶えておく必要があることになる。
245 :
223 :2006/09/03(日) 18:05:10
うわー、ショッピングモールで遊んでる間にこんなにレスが。 皆様どうもありがとうございます。危険なことがわかったので、 他の方法を考えます。
ショッピングモールwww ワロタ
おりしも自分自身への参照が欲しい状況に遭遇したんだけど、やっぱ駄目か。 それはそうと久しぶりにデパ地下行きたくなってきた。
つ ポインタ
249 :
デフォルトの名無しさん :2006/09/03(日) 22:36:47
const int HOGE_SIZE = 10; void Func1(void) { int x = HOGE_SIZE; .... } この代入は、アセンブラ レベルでは、 メモリコピー命令になりますか、それとも、定数ロード命令になりますか? コンパイラ依存になると思いますが、一般にどうなりますか?
>>249 定数ロードになるのが一番多いんじゃないかね。
そんな些細なことが問題になるなら C++ 使うべきじゃない。
ここで聞いた答えなんか当てにするのも間違い。コンパイラにコード吐かせて確かめろ。
xの使い方によっては最適化で痕跡もなくなる可能性が高いが。
>>226 thisの値自体は決定してるぞ。
ポインタをデリファレンスするのは
>>228 の問題があるだけで。
>>252 渡した先でいくらでもデリファレンスされる可能性がある。
でも const_cast<int&>(HOGE_SIZE) = 30; とできるわけだが、こういうコードがあった場合は、最適化しないというようなことを コンパイラはやっているわけ?
>>254 そのコードは鼻から悪魔が出るんじゃないのか?
>>254 それ未定義動作だからコンパイラは面倒見なくていい。
258 :
デフォルトの名無しさん :2006/09/04(月) 00:20:54
bool b[100]; memset(b, 0xFF, sizeof(b)); int x = b[0]; このとき x は未定義でしょうか?
>>258 大抵の実装で 1 が期待できるけど、保証はないだろうねぇ。
261 :
デフォルトの名無しさん :2006/09/04(月) 00:43:58
VC を使っているのですが、&& や || って、shortcut をするから、 ジャンプ命令が生成されるんだよね。たとえば、 if (x==y && y==z && z==w) だと、2つのジャンプ命令が生成される。 そこで、これを bool の整数への昇格を利用して if ((x==y) & (y==z) && (z==w)) のように実装したほうが、高速なコードが生成されるのだが、 こういうテクニックって一般的ですか?
262 :
デフォルトの名無しさん :2006/09/04(月) 00:44:38
if ((x==y) & (y==z) && (z==w)) は if ((x==y) & (y==z) & (z==w)) の間違い。
>>261 一般的じゃないだろうね。使うんならコメントが無いと && に「修正」されちゃうよ。
ところで高速だというのは実験したの?
>>262 マジレスすると、JavaやC#は & にした方が速いが、CやC++では
何とも言えない。
>>263 ごめんなさい。速いと思ったら、3倍ぐらい遅かった。
9個の || を連結した簡単なテストコードで試してみた。
>>264 情報ありがとう。
>>265 速度は実測が基本。
やっぱり基本は大事だな。
コードが生成される、って言い切ってるから実験はしたんだろうけど……。 「&」と「&&」の微妙な挙動の差には注意しないとアカンよ。
268 :
267 :2006/09/04(月) 01:31:10
してへんかったんかい!('д`*)
実測もちゃんと最適化しないとダメだし、 分岐予測の影響も考慮しないといけないし、 何で速くなるのかリスティングファイル見て調べないとな。
C/C++の条件式は最初にfalseが(Cなら0)検出された時に抜けて しまうので、なるべくfalseになる確率が高いと思われる条件式から 先に書くようにすると、速くなりやすい。
件のコードは、条件を整数(1/0)に直すコードが生成されちゃうんだろう。 普通に&&で書く場合、条件を判定するだけで その結果を整数に直して代入したりはしないから。 ただ、&だとあまり使えないけど (x != 0) | (y != 0) を (x|y) != 0 というのは 使い物になる場合があるかもね。 もちろんこれも、コメント必須なトリッキーなやり方だから 本当にそこまでする必要がある箇所なのかは、よーく考えるべきだけど。
ショートサーキットも、結局判断式の内容次第だな。 if(a && b && c) で、a式b式c式の間に依存関係が無いなら if(a&b&c) はパイプラインに上手く乗っかって 判断cのコスト+a&b&cのコスト+アルファ程度で抜けるかもしれない。 だが世の中には分岐予測というものがありましてな。
それはJavaもC#も同じはず。
× (x != 0) || (y != 0) を (x|y) != 0 ○ (x != 0) | (y != 0) を (x|y) != 0 だた。
高速になるのであれば、 ショートサーキットしてもしなくても処理が変わらない状況なら ショートサーキットを無視する可能性もあるのかな? 最適化で。
VC8とかintelコンパイラみたいな最適化に異常な執着を見せる コンパイラなら、やってくれるのかもしれないなー。 試したわけじゃないが。 そうでなくても大体の状況において、どの組み合わせが最速となるかは コンパイラ様が知っているでFAだろう。
まあ、「普通に書く」ことが、 コンパイラの最適化を阻害しないから、 一番いい高速化法なこともあるな。
>>278 参照を保持するだけなら問題ないので *this も this も危険性は同じ。
280 :
デフォルトの名無しさん :2006/09/04(月) 13:44:10
質問させていただきます。 オーバフローをする部分があるのですが、 そのオーバフローは一体どのように検知すればよろしいのでしょうか? たとえば、float型でオーバフローらしきことがおこり、 float f; のとき if(f<0.0000001) {//オーバフロー処理} といった感じにしたいのですが、オーバフローした場合、 やはりfloat型では検知できない?みたいなのですが、 こういう場合の対策法を教えていただけないでしょうか。
とりあえず使っている環境が、 C99 floating point rounding and exception handling をサポートしているかどうか調べたら? FE_OVERFLOWとかfegetexceptflag()とかぐぐってみて。
単純なので良いなら 最大範囲が100 最初から入ってるのが70 次に加算しようとしてるのが50なら if 50 > 100-70 return 警告 とか
wchar_tをcharに変換するにはどうしたらいいでしょうか?
wchar_t wc; char c = (char)wc; これ以外に方法はない
287 :
280 :2006/09/04(月) 18:59:14
ありがとうございます。 結局、numeric_limitsでオーバーフロ-や丸め誤差が生じたときに 強引に戻すやり方にしました。 しかし、結局はどこでオーバーフローが生じているのか分からずじまいでした。 難しいものです。
>>287 このスレの最初の方でもオーバーフローの話し合ったよ
>>287 処理系によっては浮動小数点例外を有効化するだけで
発生箇所でとっ捕まえられるんじゃまいか。
コプロセッサが搭載されてない環境で
floatがソフトウエアエミュレーションされてるとかでないなら、
浮動小数点演算器の設定変えるだけでOK。
大抵の例外は捕まえられるぞ。
double a[30]; int n = 30; for(int i=0; i<n; ++i){ a[i] = i*1.4; if(a[i] != (i*1.4)){ cout<<i<<endl; } } これで出力があるのはどうしてなんでしょうか?
>>292 処理系によっては配列に格納するとき浮動小数点数の丸めが起こって、
i*1.4 の結果と比較した場合に違う値になったりするかも知れない。
ちなみに、VC6 では特に問題なかった。
>>293 そういうことなんでしょうか。
ちなみにgcc3.3.2のg++(VineLinux)を使ってます。
iの値によって出力されたりされなかったりっていう状態で、
危険だなぁと思ったもので。
>>294 #include <cfloat>
の中に入ってる DBL_EPSILON が誤差の最大値だから、
if(abs(a[i] - (i*1.4)) > DBL_EPSILON)
ってすれば回避できるよ
fabs() だったorz
>>294 80bit 浮動小数点数に格上げして比較してるのかもね。
>>295 DBL_EPSILON は 1 に足したとき値の変わる最小値だから、
if(fabs(a[i] - (i*1.4)) > DBL_EPSILON * fabs(a[i]))
みたいにオーダー揃えないとダメだよ。
299 :
295 :2006/09/05(火) 18:03:46
そいつはどーも知らんかった
300 :
292 :2006/09/05(火) 20:36:38
>>294-298 なるほど、そういうやり方があるんですね。
参考になりました。ありがとう
301 :
デフォルトの名無しさん :2006/09/05(火) 22:18:26
struct foo { char c; }; このとき、static_cast で foo* を char* に変換できるようにするには、 どうしたらいいですか?↓こんなことできますか? template<> char* static_cast<char*>(foo* p) { return (char*) p; }
operator char*
303 :
デフォルトの名無しさん :2006/09/05(火) 22:21:33
>>302 それだと foo を char* に変換することになりますよね。
やりたいのは foo* を char* にしたいんです。
>>301 思いつかないなぁ。
なんでそんなことしたいの?
return &p->c って事? reinterpret_castじゃだめなん?
>>304 うーん。理由は聞かないでってのじゃだめ?
>>305 そうそう。reinterpret_cast でもいいけど、
char* に変換可能なことを前提として作られているよ、ということを強調したい。
reinterpret_cast は外道だからね。
reinterpret_cast自体が外道なのではなくて、
reinterpret_castを使わざるを得ない状況が外道
つまり
>>306 、君のやろうとしてることが外道
>char* に変換可能なことを前提として作られているよ、ということを強調したい。
なら、まさにoperator char*が本道
>>306 static_cast で変換できても、そういう意図は伝わらないと思う。
外道とか正道とか考えるんなら、メンバ関数が正道じゃないか?
char*に正しく変換出来るのであれば、reinterpret_castをラップした operatorなりなんなりを作ればいい 使う側は汚いキャストをしなくて済むし
310 :
デフォルトの名無しさん :2006/09/05(火) 23:10:04
>>306 伝わらないことないだろ。
>>307 >>309 だからー、foo を char* に変換したいんじゃなくて、
foo* を char* に変換したいの。
foo* pFoo = new foo[100];
char* pChar = static_cast<char*>(pFoo);
311 :
ららら :2006/09/05(火) 23:11:50
>>307 > reinterpret_cast自体が外道なのではなくて、
> reinterpret_castを使わざるを得ない状況が外道
それは分かるのら。しかし、
> つまり
>>306 、君のやろうとしてることが外道
ここの論理的つながりがないのら。
私は reintrepret_cast を使わないようにしたいのら。
static_cast<foo*>(static_cast<void*>(...))
T*からU*に変換するテンプレート書くとか 中身はreinterpret_castで書いて
foo*もらってchar*出す関数を別に作ればいいじゃん
315 :
ららら :2006/09/05(火) 23:19:50
>>313 これは、普通の関数で書くということですか?
char* ConvFooToChar(foo* p) { return reinterpret_cast<char*>(p); }
うーん、変換するたびにこれを呼ぶのは、ちょっとなー。
できれば static_cast にしたいなー。
>>310 どうして自分の意図が伝わると思うの?
全然別の目的で static_cast や C スタイルキャストを使っている template や
マクロの中でもコンパイルが通ってしまうことが考えられる。やめたほうがいい。
317 :
400 :2006/09/05(火) 23:24:12
foo_cast<char *>(p)とでもかけるようなテンプレ関数をこさえるとか。
香ばしい奴が一人来てるな。
ポインタから char* への static_cast にユーザー定義コードの介入する余地は無い。 あきらめれ。
320 :
ららら :2006/09/05(火) 23:28:30
>>316 > 全然別の目的で static_cast や C スタイルキャストを使っている template や
> マクロの中でもコンパイルが通ってしまうことが考えられる。やめたほうがいい。
意味が分からないのら。何がまずいのか分からないのら。
サンプルコードを示してくれないかなのらー。
>>310 ソースで自分の意図を伝えたいと言い出す前に、
日本語で自分の意図が上手く伝えられそうになってください。
322 :
ららら :2006/09/05(火) 23:29:12
>>319 やぱーりそうかー。無理かー。
じゃー、あきらめるのらー。
らららはアレだな。 そう、えーっと・・・ぬるぽ。
>>310 ちなみにfoo*からchar*への変換演算子を定義することができないのは、foo*もchar*もポインタという組込型だから。
#define static_cast reinterpret_cast
329 :
ららら :2006/09/06(水) 00:41:45
のらーとかキモイ。
めんどくせーこといってんな。
普通は、
>>306 みたいなのは、foo のインターフェイスとして用意しておくべきだろ。
速度面は inline 展開されるから、reinterpret_cast と同等の速度になるはず。
class foo {
template< typename Dest >
friend inline Dest * valid_cast( foo * p ) {
STATIC_ASSERT( boost::is_same< Dest, char >::value );
return reinterpret_cast< Dest * >( p );
}
};
//foo * pSrc;
//char * pDest = valid_cast< char * >( pSrc );
コンパイラにエスパーを求める奴が馬鹿なんだよ
それを言ったらおしめえよ
>>335 未定義な操作を検出すると自動的かつ瞬時に上司に報告するコンパイラですか?
337 :
デフォルトの名無しさん :2006/09/07(木) 14:41:37
時々サンプルコードで、 std::ofstream のインスタンスを作成するときに次のように std::ofstream ofs("aaa", std::ios::out | std::ios::binary); std::ios::out フラグを立てているものを見かけるのですが、 何か意味があるのでしょうか? そもそも std::ios::in フラグとかまで立てられてしまうので、 気持ち悪いです。
339 :
デフォルトの名無しさん :2006/09/07(木) 15:12:48
>>338 あ、あれ?ほんとだ・・・
なんか俺根本的に標準ファイルストリームの
フラグについて間違った認識してるのかも。
fopen のフラグとの対応がわからん。
>>339 fopen()は割りと変態仕様だから、対応で考えない方がいいよ。
>>338 違う。マイクロソフトの勝手な拡張。
>>339 規格のtable 92に対応が書いてある。
>>337 std::ofstreamのデフォルトのフラグはstd::ios::out。
バイナリ出力を行うためにstd::ios::binaryとORをとってるだけ。
std::ios::inは立たない。
343 :
338 :2006/09/07(木) 23:25:45
>>341 まじっすか。
MSってこんなとこまで独自拡張してんのかよ('A`)
企画表実際見てみたら、ios_baseフラグとfopenのモードとの対応表があった。
ios::in | ios::outでは"r+"や"w+"と同じ扱いになるらしい。
>>342 立てられる=受身の意味ではなく可能性があるという意味では。
>>343 しかしなぁ、r+とw+では動作が異なるのだが。
知ったかぶりしてんだよ。
MS独自拡張といえば、fopenに"R"や"S"とか。
>>343 ios::in | ios::out = "r+"
ios::in | ios::out | ios::trunc = "w+"
まで書けっていうんかい。
それぐらい自分で確認してくれ。
>>346 新たにフラグ作るのはいいけど、
既存のフラグに意味を付け足すのはまずいわな。
Javaとの戦いに懲りて、MSの拡張もまともになったかと思ったけど、 C#でのMS色の具合を見ると、まともになっているわけでもでもないなぁ・・
別にC#で何やってもいいじゃね
C#ってjisとかで規格になってるんでしょ? 何やってもいいとかは言いすぎな感じ・・ それも規格になってないjavaは www.jcp.org コミュニティーで慎重に話し合って 合意を取り付けている。 そういうのからすると、だいぶ異色に映る。
ECMAにversion 1だけ規格通して、 後はやりたい放題ってのは、 以前からMSがやっている手法です。 オープンだそうですw
漏れは無駄に時間を食う java のやり方が一義的に優れてるとは思わないけどなぁ・・ 次世代 Cobol という位置づけを考えると、確かにそれで良いのだろうけど。
354 :
デフォルトの名無しさん :2006/09/08(金) 16:48:50
>>353 無駄に時間を食うってどういうこと?
バイトコードでってのを指して言ってるのかな?
で、俺は何に期待しているかというと、
断然 C++/CLI ちゃん!
356 :
デフォルトの名無しさん :2006/09/08(金) 17:11:26
>>355 あ〜そういうことか。
ごめんな、Java の仕様策定のやり方ってのが
全然分かってないや、俺。
jcp.org行けば分かるよ。
一致団結して力を見せつけるのか 独走で唯我独尊を見せつけるか あなたは、どっちがお好みってことよ♪
一致団結すればいいんだけどね。
C#でそれはナンセンス。C++ならなおさら いっちゃだめ!
361 :
デフォルトの名無しさん :2006/09/08(金) 20:06:25
C#はどうせMS独占言語なんだからMSが勝手にさっさと 突っ走ってくれればいいんじゃね
>>361 開発中のデバドラ落ちと混ざって赤紫になっちゃったけどどうしてくれるのよ!
はんたーい! かくめー!かくめー! かいかくー! とういつー! どくそー!
#include<windows.h> class cwindow { int kazu; int x; public: HWND * hWnd; cwindow(int x) :kazu(x){HWND *hWnd = new HWND[kazu];}; void STATIC_screen(HINSTANCE *); ~cwindow(){delete hWnd;}; }; void cwindow::STATIC_screen(HINSTANCE *hInstance) { *hWnd = CreateWindow( TEXT("STATIC") , TEXT("Kitty on your lap") , WS_CAPTION , 100 , 100 , 200 , 200 , NULL , NULL , *hInstance , NULL ); ShowWindow(*hWnd , SW_SHOW); } コンパイルはできますが実行するとCreateWindowのところでエラーを起こしてしまいます。 この部分のどこかが間違っているようですが何処が間違っているのかわかりあmせん Visual C++ 2005 Express Edition
>>365 cwindow のコンストラクタでメンバの hWnd じゃなくて
ローカル変数 hWnd に new の戻り値を入れているので、
メンバ変数 hWnd の値は不定。そのまま STATIC_screen を
呼び出せば *hWnd が不定なポインタを使うことになって
不正な処理となる。
class Test{ static list<Test*> s_list; Test() {
class Test { static list<Test*> s_list; Test() { s_list.insert(this); } } と書いて別のところで グローバルにTest のオブジェクト宣言すると Testのコンストラクタでs_listが出来取らんのでエラーが出ます どうしたらいいですか?
>>369 エラーの内容書けよ。
グローバルオブジェクトの初期化順が問題になっているんだろう。
両方ポインタにして、最初に使うときに new で生成するような関数で
ラップするとか?
>>370 エラーは、ヌルポの予感
順番の問題はわかってるけど
順番って制御できないのかな
Testクラスは、グローバルで気軽に作りたいので
listをshared_ptrとかでやってもいいけどboost入れないといけないし
ぬうう
>>371 いや、普通のポインタでも auto_ptr でもいい。
むしろ private な static ポインタ変数に shared_ptr 使う意味がわからん。
それはまったくもってごもっとも。
>>371 static list<Test*>& Test::global_list()
{
static auto_ptr< list<Test*> > p;
if(!p.get()) p.reset(new list<Test*>);
return *p;
}
Test::Test()
{
global_list().insert(this);
}
普通ポインタだとdeleteタイミングが特定しづらい auto_ptrでやってみたけど auto_ptrが作成される前にアクセスしてしまう auto_ptrは、=で代入できないし(初期のinsert直前でnewで作った物を代入できない)
うお
>>374 でやってみます。
ありがとうございます
377 :
374 :2006/09/09(土) 01:09:01
static 付けた定義はエラーになる。適当に宣言と定義に分けてね。 insert(this) も通らんな。
if( !s_list.get() ) s_list.reset(new ResourceList ); s_list->insert(this); でいけました。 お騒がせしました。 dクス
>374 static list<Test*>& Test::global_list() { static auto_ptr< list<Test*> > p(new list<Test*>); return *p; } もっと言うなら static list<Test*>& Test::global_list() { static list<Test*> l; return l; } じゃ駄目なの?
380 :
374 :2006/09/09(土) 02:56:17
>>379 生ポインタをベースにして考えていったんで、面倒なことになってた。
そっちのがいいな。
381 :
デフォルトの名無しさん :2006/09/09(土) 06:31:46
ところで、コンテナに入れることができるための要件って、 代入演算子とデフォルトコンストラクタが定義されていることだっけ?
>>381 いや。コピーコンストラクタが使えれば要件は満たす。
代入演算子もデフォルトコンストラクタもいちおうオプションだが、
多くの操作で必要とされる。
383 :
デフォルトの名無しさん :2006/09/09(土) 09:34:38
>>382 あれ、コピーコンストラクタだけでよかったのか。
「一応オプションだが多くの操作で必要とされる」
というのは resize() しようと思ったら、とかいうこと?
Containerの要素の要件のCopyConstructibleは、 「コピーコンストラクタを持っている」だけじゃないので注意してね。 t is a value of type T, and u is a value of type const T. Table 4 -- CopyConstructible requirements +----------------------------------------------------+ |T(t) t is equivalent to T(t) | +----------------------------------------------------+ |T(u) u is equivalent to T(u) | +----------------------------------------------------+ |t.~T() | +----------------------------------------------------+ |&t T* denotes the address of t | +----------------------------------------------------+ |&u const T* denotes the address of u | +----------------------------------------------------+ が必要。
>>383 T::value_typeがAssignableでなければいけません。
Associative containerのキーもAssignable。
386 :
デフォルトの名無しさん :2006/09/09(土) 09:50:56
ううむ、ちゃんとSTLの規格を読まなきゃ駄目だな、俺。 今までエラーがでたらエラーはいてるテンプレートの定義を見て 「おお、このテンプレートを特殊化しようとしてエラーか。 じゃ、このメソッド(もしくは演算子)宣言しておかなきゃな」 なんて行き当たりばったりでやってたからなぁ。 「ええい、めんどくさい、無意味に boost::shared_ptr でくるんでやれ」 とか逃げたこともしばしば。
fstreamのファイル名がstd::stringというのはイヤガラセですかねえ
389 :
386 :2006/09/09(土) 12:14:17
すんまそん、よく考えたら STL のスレッドがあったんですよね。 なんかスレ違いっぽいんでそっちいきますは。
全然スレ違いじゃない
C++ は初心者スレとかいろいろあって、 「これはコンパイラ依存の話だから」 「これは初心者っぽいかなぁ」 とかかんがえるのがマンドイ
まんどいだけならともかく、初心者にはそもそも区別がつかないっぽい。
JavaやRUBYなら簡単なのに!!!
キミにはお似合いだよ。
C++書くマになりたいんですが、 どんな仕事でC++使うんですか?
396 :
デフォルトの名無しさん :2006/09/09(土) 15:46:41
比較的パフォーマンスが要求されるシステム
>>395 昔はC=マイコン系、C++=GUIなイメージだけど
C++=工場系(漏れの仕事もそうだが、工場の機械をWinで操る、組み込みC++も増える希ガス)
スクリプト=プログラマ
ブログ、Wiki、サーバ作る=SE
ネットわからない=ITこんさるたんと
てなると思う。初めHTMLは素人用だったが、いまややこしくなってきたね
398 :
365 :2006/09/09(土) 21:22:47
cwindow(int x) :kazu(x){hWnd = new HWND[kazu];}; dクス
399 :
デフォルトの名無しさん :2006/09/10(日) 00:47:23
C++を勉強しようと思うんですけど まずCからちゃんと覚えたほうがいいですかね?
仕事ではPHP+DBとかだけのヘタレプログラマだけど 時々趣味で自作アプリとかC++(VC++&MFC)で作ってるけど 流石に仕事で使うのは大変そうだなーと思うよ。 とても自分には無理そう。というかC++で仕事してる人尊敬するよ。
個人的にはいきなりC++でもいいと思うけど、 構造化手法のことはよく理解しといたほうがいいような気がする
402 :
デフォルトの名無しさん :2006/09/10(日) 01:19:00
C++がある程度分かる様になったら、他の言語を勉強した時、本当にすんなり覚えられる。 Rubyなんか楽しくて仕方ないし、PHPは普通にいきなり使えた。まぁスクリプト言語を引き合いに出してもアレだが。 でも高級言語でC++程難解な言語は無いでしょう?
C++使いだけど、Haskellに苦労してる。
>>402 高級言語と思うから難解なのでは?
オブジェクト指向アセンブラと思えばどうだろうか。
イベントの種類とパラメータと戻り値をひとまとめにしてクラスで 表現しようと思い、以下のようにしてみました。 template <class paramType, class resultType> class Event { int type_; paramType param_; mutable resultType result_; public: // paramType を取るコンストラクタとかもろもろ... const paramType& Param() const { return param_; } const resultType& Result() const { return result_; } void SetResult(const resultType& result) const { result_ = result; } }; イベントを受け取るハンドラー側は、 void Handler(const Event& event) { resultType foo; // ... 処理 ... event.SetResult(foo); } となるのですが、あんまり直感的じゃないですよね。かと言って、 ハンドラーを void Handler(Event& event); とするのは気持ち悪いなぁ というところで悩んでます。妙案はござらぬか。
>>405 そもそも戻り値までまとめるところがダメだと思う。
>>405 なんで無理矢理constにしたいのかが分からん。
Eventは純粋に起きた出来事を記述するだけにとどめるべき、と考えるなら、
template<class eventType, class resultType>
class EventArgs
{
const eventType event_;
resultType result_;
//略
};
void Handler(EventArgs &args)
{
resultType foo;
//処理
args.setResult(foo);
}
くらいじゃダメ?
そこまで無理やりconstにして、結局返り値がmutableなのは典型的な駄目コードだろう。
constの前提が全部ぶっ壊れるんだから、クラス外部に影響の出ない本当に一部の例外以外は
使っちゃ駄目ぽだよ。
非constと同じコードが生成されるから、性能面でもまったくメリットないし。
>>407 程度でいいと思う。
受け取ったイベントに返り値を運ばせるのは賛否が分かれそうだけど、
イベントの種類によっては、それなりに現実的なんじゃないかな。
実は全部intか、もっと言うとboolで十分だったなんてオチは、いかにもありそうだけど。
>>403 パラダイム違いすぎ
それはそうと、 const だけで3杯くらいご飯食えるよな。
const のおかげで不用意な代入のバグを回避できたことも多いし。
BOOST_STRONG_TYPEDEF も不用意な代入によるバグを回避するのに
ずいぶん役だってくれたな。実際にはそれをちょっと自分用に
カスタマイズしたマクロを使ってるけど。
とかくと、boost 厨死ね、このクズが、ってののしられるんだろうな。
快感。
>>407 引数から const を外すなら、そうするしかないですよね、やっぱり。
どうも const に拘りすぎて、const 馬鹿になっていたようです。
>>408 mutable なメンバ変数がインタフェースになってるってのも、確かに
気持ち悪いんですよね。
>>407 の方向でやってみます。
std::auto_ptr<int> func(void){ std::auto_ptr<int> p(new int); return p; } void test(void) { std::auto_ptr<int> p = func(); } こうやったとき、new で確保したオブジェクトの所有権は 戻り値用の一時オブジェクトを介して(実際はRVOが働く?) ちゃんと移動されて test() から抜けた時点で解放されるんですよね?
>>412 よかった。これで心おきなく
auto_ptr<T> を戻り値として使えます。
ポインタを生のまま返すと、
「たのむ〜、このポインタ、ちゃんと解放してくれよ」
って祈るしかないし。
文字列の$と$で囲まれた部分(「あいうえお$かきくけこ$さしすせそ」の「かきくけこ」)を取り出したいのですが 「最初の$以降の文字列」はstrstrで取り出すとして 「後の$以降の文字列」をそれから取り除くにはどうしたらいいでしょうか? mbsnbcpy使うのかな?
416 :
414 :2006/09/10(日) 11:01:02
追記 もとの文字列、切り出し後の文字列ともにchar*型ですが 双方unsigned char*にキャストしてmbsnbcpy使うとなぜか 切り出し後の文字列が空文字列になってしまいます。
>>416 エスパー募集じゃなければソース貼れ。
C++ 関係ないなら別スレに逝け。
>>411 その辺の話はExceptional C++に詳しく載ってるよ。
全く同じことやってる例がある。
419 :
414 :2006/09/10(日) 11:10:05
char[100] motobun; strcpy(motobun,"あいうえお$かきくけこ$さしすせそ") char[100] kiribun; kiribunにmotobunの中の「かきくけこ」を入れるということでお願いします。
>>419 エスパー募集じゃなければソース貼れ。
C++ 関係ないから別スレに逝け。
421 :
デフォルトの名無しさん :2006/09/10(日) 11:24:07
memcpyの質問というより「NULL+6がどうなるか」という質問になるかもしれませんが memcpy(NULL + 6, "abc", 4); これはどうなりますか? memcpy(NULL, "abc", 4); と解釈されますか?
>>421 解釈されない。
何が起きるか分からない。
>>421 ヌルポインタ + 6 なら未定義動作。
NULL + 6 は 0 + 6 で、ただの整数 6 になってコンパイルエラーになる。
いやアドレス0x00000006へコピーしようとする。 いずれにせよ、不正アクセスであぼーん。
>>419 char *p = strchr(s1, '$');
char *q = strchr(p+1, '$);
memcpy(buf, p, q-p);
buf[q-p] = '\0';
427 :
デフォルトの名無しさん :2006/09/10(日) 11:37:35
425の考えをキボン。
428 :
425 :2006/09/10(日) 11:40:09
>>423-425 C++でNULLが0にdefineされているというのは、実際にはほぼ間違いないけど
規格的にはどうなの?
Cでは(void *)0もアリでしょ。
で、もし、(void *)0な処理系が存在するなら
(void *)0 + 6 という値になって、(gcc以外なら)voidへの演算エラーになるよね。
いずれにしろ、(gcc以外では)
>>424 にはならない。
もちろん、ほぼ全ての処理系は
>>423 だろうけど。
430 :
デフォルトの名無しさん :2006/09/10(日) 11:41:07
423は矛盾がある。 NULL + 6 は 0 だと言い張るのにmemcpy(0, "abc", 4);が未定義動作だと言う。 もし NULL + 6 が 0 なら、アドレス0x00000000へコピーしようとするよ。
>>427 425じゃないけど
C++だとNULLは#define NULL 0と定義されているのが普通。
だからNULL + 6 は0 + 6となり、整数畳み込みで6になる。
で、6からポインタへの暗黙の変換は存在しないのでエラー。
ようするに
>>423
>>430 > NULL + 6 は 0 だと言い張るのにmemcpy(0, "abc", 4);が未定義動作だと言う。
だれもそんなこと言ってない。
>NULL + 6 は 0 だと言い張るのに 誰がそんな妄言、言い張ってるんだ?
>>429 C++ では (void*)0 は NULL の中身にはなり得ない。
>>421 がなんでこんな事を聞きたかったのかに話を戻そう
437 :
デフォルトの名無しさん :2006/09/10(日) 11:53:40
出くわした場面は以下です。memcpy()の前にif(buf)が必要ですか? main(){ char *buf = NULL; if(何か){ buf = (char*)malloc(8); } //ここにif(buf)が必要? memcpy((void*)(buf + 6), "\r\n", 2); free(buf);
C は void* から別のポインタへの暗黙のキャストがあるから NULL は (void*)0 の定義も許されてる。 C++ はそれができないから NULL は 0 と定義するしか無いという仕様に変更された。
439 :
デフォルトの名無しさん :2006/09/10(日) 11:57:07
「何か」の部分に0を入れてテストしたら実行時エラーになりました。 アドレス0x00000006へコピーしようとする の説が正しいように思いました。
>>436 18.1.3 が NULL マクロについての記述。
"The macro NULL is an implementation-defined C++ null pointer constant in this International Standard (4.10)."
これに注釈で
"Possible definitions include 0 and 0L, but not (void*)0."
と明記されている。
443 :
デフォルトの名無しさん :2006/09/10(日) 12:02:30
441そうだね。
>>439 「NULL + 6」と
「(char *)NULL + 6」は
全然違うだろ。
皆、おまえが最初に書いた前者を前提に話していたのに。
最初からそう書けよ。
>>438 C では (void*)0 がヌルポインタ定数として( 0 と同等に)機能すると特別扱いされている。
そのおかげで、データポインタからの変換が認められていないはずの
関数ポインタも (void*)0 でヌルが設定できたりする。
> 「(char *)NULL + 6」は なんだか目の悪いやつがいるようだな。
スマンカッタ
まあ初心者がヌルポインタと NULL (ヌルポインタ定数)を混同するのはわからんでもない。
意味があるのかわからん議論だな
どっちでもいーっしょじゃーん
確かにCだとNULLは(void *)0なので ポインタに対する整数加算は ポインタの指す型のサイズ倍のアドレス増加となり sizeof (void)は得られないので NULL+6はエラーだが C++だとNULLは0だからNULL+6は整数6で、ポインタではなくなるな
だから何?
>>452 C でも NULL を 0 と定義するのは可能。
>>452 てか、ちょっと前のレスで既に何度も言われてることなんですけど。
お前のような奴を知識披露厨と言うんだろうな。
職場等でウザがられてない?
456 :
452 :2006/09/10(日) 14:00:52
>>437 以降を見ずに書いてたが
なんだ、質問自体が違ったのか
>>437 以前に、既に何度も同じ事がかかれているわけだが。
458 :
452 :2006/09/10(日) 14:24:27
>>457 だから「確かに」で単にまとめてただけなんだが。必然的に繰り返しになる。
それにこのスレはそもそも殆どの話題が以前出たことがあることばっかりで
繰り返しを楽しむスレなんじゃないの?w
まあどうでもいい
STLつかうと一気に実行ファイルサ(ry
>>458 まとめると言うほどの内容は無いようですが。
がんばって素直にごめんなさいが言える大人になろうね。
463 :
452 :2006/09/10(日) 14:54:10
ごめんなちゃい
ごめんね
無理やり話題のレベル上げようとするの禁止
じゃあ以降レベルは腹ばい気味で。
467 :
デフォルトの名無しさん :2006/09/10(日) 17:45:06
C++ でクラスを書いて、コピーができないようにした。 そんで、本当にコピーできないことを確認するために、 テストコードを書いて、そのテストを自動化したい。 そんなこと C++ だけでできるぅー?
質問したい事があります。 file1.h file2.h file3.h とヘッダを作成し、 --file1-------- #include "file2.h" --file2-------- #include "file3.h" --file3-------- #include "file1.h" --main------- #include "file1.h" #include "file2.h" #include "file3.h" とインクルードさせるとfile1で宣言した型がfile3でintと仮定されてしまいます。 file1,2,3ともお互いに宣言した型をメンバ内で使っている状態です。 多重インクルードは回避してあります。 なんとなく、型を認識する前に別のファイルでの型が書かれている部分を認識しようとしているのかなぁ…と思うのですが、 これを何とか通したいのですが何か方法があれば教えていただきたいです。
>>467 コンパイルエラーを捕らえることになるから C++ だけじゃできなさそうだねぇー。
>>468 C++ では int の仮定なんてしないはず。何を見てそう思ったの?
「宣言した型」ってのもよくわからん。 class か enum か typedef か、とか。
問題が再現するコード貼ってくれると話が早い。
ファイル入出力を<<演算子で行うと、どうにも遅くて困ってます。 結局大きめのファイルを扱うとなると、Cに戻るか、小細工が必要なんでしょうか? <<演算子による操作自体は、読みやすくて好きなのですが
>>471 自分で<<を定義し、その中でCのfprintf()とか使えば速くなるじゃん。
sync_with_stdioとか必要になるが。
ありがとうございます。ちょっと残念ですが、fprintf等、Cの関数を使うことにします。
>>470 VS2005を使ってまして、エラーで
[ 型指定子がありません - intと仮定しました。 メモ: C++は int を既定値としてサポートしていません ]
と、出ています。よくみたら
>>470 さんの言うように仮定してないみたいです。
--file1.h-------
#include "file2.h"
class FILE_1 { void func(FILE_2& _file){ ... } };
--file2.h-------
#include "file3.h"
class FILE_2 { ... };
--file3.h-------
#include "file1.h"
class FILE_3 { ... };
file1でFILE_2が型として認識されていない状態です。
その手のエラーはたいてい 型情報が必要な所でエラーになってる (関数の戻り値の型を書くのを忘れているとか)事が多い Cの規格では省略時はintとみなされる→C++はダメ
>>474 参照を使うだけなら、ヘッダのインクルードを前方宣言で置き換えるといい。
- #include "file2.h"
+ class FILE_2;
>>474 なんだこれ
循環includeで
include guardなし?
どうしてFILE_2を参照してるところに到達できてるんか
いちおう
>>468 で「多重インクルードは回避してあります。」と言っている。
コードに対してコンパイルエラーが出るってことは、循環 include にはなっていないんだろう。
>>474 #include "file2.h"をすると
file2でまず多重インクルード防止のdefineでもされてから
(まだclass FILE_2宣言に到達していない)
#include "file3.h"が実行され
その中で#file include "file1.h"が実行され
file1.hの中の#include "file2.h"は
すでにdefine済みということで通過。
class FILE_1に来たときはFILE_2はまだ宣言されてない。
>>476 方式で。
直接宣言が嫌なら<iosfwd>みたいに参照のみ用ヘッダ書くってのもありか
[ 認識できない型 'name::Class_name ' が使われています。 ] とエラーになってしまいました。 あーもう、こんがらがってきました('д') そもそもこんな設計になる時点で良くない気がします。 全部見直してみます。どうもお騒がせしました。
>>480 それがいいだろうね。
整理し直してヘッダを書き直してみるのが、結果的に一番よさげな希ガス。
namespace を超える前方宣言は、 namespace name { class Class_name; } って感じに しないと駄目だよ。
namespace::Class_nameじゃダメなん?
つーか、 class name::Class_name; でいい
>>480 相互依存の排除には interfaceと派生した実装クラスに分離するって手があるよ
今回の場合に当てはまるか分からんけど
ifile2.h:
class IFILE_2 {};
file1.h:
#include "ifile2.h"
class FILE_1 { ... IFILE_2を参照 };
file2.h:
#include "ifile2.h"
class FILE_2: public IFILE_2 {};
namespace name { class FILE_1; class FILE_2 { ... }; } FILE_1も同じ name でnamespaceしてます。 こんな感じで前方宣言してたのですが、よろしくないでしょうか?
>>486 コンパイルできるんならいいんじゃね?
コンパイルできないならエラーメッセージ貼れ。
>>487 エラーは
>>480 で怒られたものです。
[ 認識できない型 'name::Class_name ' が使われています。 ]
そして以下のようにすると、
class name::FILE_1;
namespace name {
class FILE_2 { ... };
}
[ 'name' : 識別子がクラス名でも名前空間でもありません。 ]
と怒られてしまいます。
VS使っているのですが、:: でインテリセンス出てくるんですが…
そりゃnameがnamespace名であることを知らなきゃ、そういうメッセージになるわな。
つーか、
>>482 がやり方説明してるだろ。
>>482 でやると
>>486 と同じエラーになります。
となると、
>>486 でもコード的には間違いではないと思うのですが。
やっぱり設計しなおしてみます。書き込んでくださったみなさん、お手数おかけしました。
それ絶対別の場所なりでなんか変なことしてるだろ。 そうじゃなきゃ、そんなエラー出るわけないし。 あ、関係ないとは思うけど、 (たぶん今の言語仕様では) typedef名とclass内classは どうやっても先行宣言できないから。
namespace name1{ class FILE_1; } namespace name2{ class FILE_2{ name1::FILE_1* f1; }; } namespace name1{ class FILE1{ }; } 上はVC2005でやったら通るけど、こういうことじゃない?
>>452 > 確かにCだとNULLは(void *)0なので
違う。0です。
(void *)0とすることも可能と併記されている。
>>449 あなたのは見当違いです。
規格では、
null pointer constant
null pointer value
しかインデックスには出てこない。
null pointer constantの話をしているところに
"null pointer"という単独の単語は出てこない。
NULLマクロとの関係は
>>440 にある通り。
>>492 それで問題ない。VC2005以外でも。
>>495 規格上、0です。
(void *)0も可能と併記。
>(void *)0 だーかーらぁー
>>498 C99 の定義は以下のとおり。
"An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant."
たとえば 0L も、 gcc の __null もヌルポインタ定数であり、 NULL の中身になれる。
long に NULL 代入しようとしたら void* は long にキャスト出来ませんというエラーが・・・
それはよかったじゃない。
#define NULL 0 の実装は C++ でしか見た事無い。 C でわざわざ 0 に定義する利点も無いし。
NULL と '\0' の違いについて
>>498 「可能」 って表現に違和感を持たれてるんじゃないか?
たとえば
#undef NULL
#define NULL ((char *)0)
が不能でなければ規格合致処理系ではないということではなかろう
まぁCの話はスレ違いなんだけどね。
508 :
デフォルトの名無しさん :2006/09/11(月) 21:37:56
char型の配列の中身をダンプしようと16進数で表示する様に char buf[20]; cout << hex << buf[0]; とやってみたんですが、文字として表示されてしまいます。 intでキャストすれば正の数なら表示されるんですが、負の数になると 0xFFFFFFF と表示されてしまいます(intにキャストしているので当たり前なんですが) buf[0] = 0xFF; cout << hex << buf[0]; //FFと表示させたい
>>508 signed charにキャストすればいいのでは?
いや、unsigned intの方が良くないか?
cout << static_cast<unsigned>(buf[0]);
512 :
508 :2006/09/11(月) 21:57:19
>>511 char buf=0xFE;
cout << hex << static_cast<unsigned>(buf);
でやってみたんですが、fffffffeと表示されてしまいます
ちなみにVC++2005でやってます
バイナリエディタの様に 00 23 BE FE
みたいな表示はみなさんどうやって出力してます?
printfなら余裕なんですが・・iostream難しい
char c = '\xab'; cout << hex << static_cast<unsigned>(static_cast<unsigned char>(c)); バイナリデータはunsigned charで扱う癖をつけておいたほうがいいと思う。
static_cast<unsigned>(buf) & 0xffu
おめーら、整数格上げの規則ぐらい覚えとけよ。 signed charをunsignedにしたって駄目 unsigned charにしてからintに代入しろ。
>>513 >>514 おぉできますた!
ポイントはunsigned charで扱う事なんですね
ありがとうございました
517 :
デフォルトの名無しさん :2006/09/12(火) 00:48:31
C++というより設計の質問かもしれないんですが、 インターフェースクラスをテンプレートクラスにするのはありですか? template <class T> class Foo { public: virtual voie Hoge(const T&) = 0; }; template <class T> class Bar : public Foo<T> { public: void Hoge(const T&); }; って感じにして使うと、コンパイル時に好きなように インターフェースを決定できるので汎用的に使えると思うのですが、 一方でインターフェースは型も含めて明示しないと他人が使いづらいかとも思うのです。 みなさんはどう思いますでしょうか?
>>517 言語的にはもちろんアリ。
設計の是非については、それだけの情報では検討不能。
何でも入るインターフェイスなんて、結局何にも定まってないようなもんだしなー。
メソッドのシグネチャ固定したいだけだろ? たぶんそのメソッド名を仮定したvisitorとかがあるのでは。
>>517 例えばCOMのIEnumXXXなんていうインタフェイスはそういう感じのが似合ってるような気がする。
template <class T> class IEnumGeneric
{
public:
virtual void Reset(); // 先頭に戻す
virtual bool Next(T* &pNextItem); // 次の1つを取得
};
てな感じか。
あとは C# で多用されてるような ICollection<T> のようなコンテナを抽象化したインタフェイスとか。
「好きなようにインターフェースを決定できる」というよりは、Generic なコンテナが実装/提供
するインタフェイスなので必然的にGenericになってるだけのような気もするけど。
ちなみに手元にあるC++CodingStandardって本には 「静は動を助く:静的ポリモフィズムを使って動的ポリモフィズムのインターフェースを実装しよう。 たとえば抽象基本クラスCommandがあり、様々な実装を template</*...*/> class ConcreteCommand : public Command として定義するとしよう。」 って書いてあるが、いまいち意味がわからん。 複数の型に対して同一のアルゴリズムを提供するつもりでインターフェースをテンプレートクラスにしてるならアリで、 全然違うアルゴリズムに対してインターフェースが似てるからって理由でテンプレートクラスのインターフェースを使うのがナシだと 個人的には思う。
Return-Path: <
[email protected] >
Received: from kiyesrbuetekiotlreitbtiorne571671867716.com
(OFSfa-02p5-5.ppp11.odn.ad.jp [61.209.164.5])
Message-ID: 20060911234553.19067mail@mail.kiyesrbuetekiotlreitbtiorne571671867716.com
From:
[email protected] このメールは指名女性のご希望により※再配信※させていただきました。
20歳になったばっかのまいこ姫でしゅ。。
優しい優しいご主人様がほしくて噂のココに辿り着きましたぁぁ★
まいこ姫は見た目はオコチャマだけどぉ一生懸命、ご主人様を満足させるんでお返事下さいなぁ♪
ご主人様の大好きなコスプレで甘い甘いエッチがしたいなりィ★★
恥かしがりやなまいこ姫をリードしてくれる優しいご主人様からのメッセージ待ってましゅ!!
そんなことより、一駅毎に説教たれる車掌をナントカしてくれ。 ラッシュアワーでぎゅうぎゅう詰めでいらいらしているのに、 一駅ごとに延々としゃべり続ける。同じことを。周りの乗客もうんざり顔。 「毎度ご乗車ありがとうございます。次の停車駅は○○です。車内混み合いまして大変ご迷惑おかけしておりますが、ご了承下さい。 当社では現在、土日祝日もご利用いただける2dayチケットを発売しております。沿線施設の割引入場券としてもご利用いただけますので、 行楽シーズンに、ぜひご利用下さい。なお、各車両にはに優先座席を用意しております。体の不自由な方、体調のお悪い方、妊婦の方、 その他座席を必要とされる方がおられましたら、ぜひお譲り下さい。この列車の前から4両目は女性専用車両となっております。 男性のお客様はご利用いただけませんので、ご了承下さい。あやまってお乗りの男性のお客様がおられましたら、隣の車両にお移り下さい。 また、車内での携帯電話は電源をお切りになるか、マナーモードにしていただき、通話はご遠慮下さい。優先座席付近では、医療機器への 影響のおそれもありますので、必ず電源をお切り下さい。この列車の一番前、および一番後ろの車両は携帯電話終日電源オフ車両です。 座席位置にかかわらず、携帯電話の電源はお切り下さい。なお、車内および駅構内、駅ホームは全線禁煙となっております。 おタバコはご遠慮下さい。当社ではただいまさわやかマナーキャンペーンを実施中です。快適な車内空間作りに皆様のご協力をお願いいたします。 まもなく○○に到着します。お出口は進行方向右側です。ホームとの間が広くあいている場所がございますので、お足下にご注意下さい。 お降りの際は傘などお忘れ物の無いよう、お気をつけ下さい。本日も○○電鉄をご利用いただき、誠にありがとうございました。まもなく○○です。」 これが全駅続く。延々と。もうね、アホかと。うんざり。
本日も桃太郎電鉄をご利用いただき、誠にありがとうございました。
下記コードの実行結果が"ab"ではなく"aa"となってしまうのは何故なのでしょうか? ポインタと同じように、ベースクラスの参照に色んなサブクラスの参照を代入して処理を切り替えられないのでしょうか? #include <iostream> #include <string> class Iface { public: virtual ~Iface() {}; virtual void method() = 0; }; class Impl : public Iface { public: Impl(const std::string& s) { s_ = s; } virtual void method() { std::cout << s_; } private: std::string s_; }; int main() { Impl a("a"); Impl b("b"); Iface& c = a; c.method(); c = b; // ここで何が起きているのかいまいち分かりません。 c.method(); return 0; }
暗黙的にアレ
スライシング
530 :
527 :2006/09/12(火) 21:05:39
>>528 ,529
ありがとうございました!勉強し直して来ます。
>>527 参照はポインタと違って一度設定された参照先を後から変更することはできない。
つまり例文のc = b;はcの参照先aを(cがIface型と宣言されているので)
Ifaceにキャストして、暗黙の代入演算子(operator=(const Iface& rhs))
を呼んでいるのと同じ事をしている。
そしてIfaceにはメンバフィールドが無いので代入演算子は何もしない。
参照先の変更が禁止されているので代入演算子が呼ばれるというのが
>>528 の言う暗黙的にアレ。
cがIface型と宣言されているので何もしない代入演算子が呼ばれるというのが
>>529 の言うスライシング(による弊害)。
スマートポインタ使え
std::ifstream とか std::ofstream って、 ファイルが開けないときに例外出したりします? そもそもストリームって何らかの操作に失敗したとき、 フラグで表現するだけ?例外を出すときもある?
>>533 ストリームライブラリはC++に例外機構が取り入れられる前から広く
使われていた。従ってデフォルトでは例外を送出しない。
しかし、メンバ関数exceptions()を適宜設定する事により、ある状態
フラグが立った時に例外を投げさせる事は出来る。投げる例外は
std::ios::failureである。
後は適当に調べてちょ。
lokiって本当に役立つライブラリーなのでしょうか? 勉強する価値ありますか? skypeのアドオンを作るための ++skypeとかいうライブラリーがlokiを使っていて どうしようかと思ってる
>>537 イディオムとしては面白いライブラリだけれど、
もはや古臭くて、モダンではない実装をしている。
これからはBoostを学ぶべき。
>>537 そりゃ学んだ方がskypeのアドオン作りやすいと思うけど、
lokiがどんな風に実装されているかは学ぶ必要ないでしょ。
そんなこと知らなくても実装できるようになっているはずだから。
<loki/AssocVector.h>
<loki/Functor.h>
<loki/Singleton.h>
<loki/SmartPtr.h>
<loki/TypeTraits.h>
<loki/Typelist.h>
<loki/static_check.h>
使っているのはこれだけだね。
まあコンパイラのエラーメッセージを理解するのに、
ちょっと実装を知る必要もあるけどw
540 :
539 :2006/09/13(水) 16:00:24
ざっと見た感じ、lokiをaddon作成者が利用することはないみたい。
>>409 > それはそうと、 const だけで3杯くらいご飯食えるよな。
昔そんな名前のスレがあったな…
>>537 Lokiというか、Modern C++ Design読んだことないなら読む価値はあると思う。
日本語でC++メタプログラミング系の本って他に出てないよね…。
>>541 typedef enumのためなら死ねるってスレもあった気がする。
その結果立ったのが「わたしとC++とどっちが大事なの!?」スレだったりもするわけだが。
try - catch以外で呼び出し元の特定の位置に移動する方法ってありますか? void test() { while(1){ ... if( flag ) throw 0; } } void main() { try{ test(); }catch( int e ){ ... // 特定の位置 } }
意味分からん
>>544 longjmp とか。
もう10年くらい使ってない気がする。
goto は一年に数回使ってるのに。
戻り値で判断すればいいんじゃね?
C++じゃsetjmp/longjmpは使わないほうがいいよ。(何もかも承知で使うのはかまわないけど) リソースリークが起こりやすい。
引数つきコンストラクタから引数無しコンストラクタを呼ぶと、 引数無しコンストラクタの動作がおかしくなってしまいます。 仕様的にできないようなかすかな記憶もあるんですが、 gcc4.1ではwarningも出さないし、(おかしいけど)一応実行はされているようです。 再帰的にコンストラクタを呼ぶのは規格&GCC拡張的にダメなんでしょうか? それともバグでしょうか?
>>549 引数無しコンストラクタを呼ぶ、とはどう記述するんですか?
CHoge::CHoge(int)
{
this->CHoge();
}
みたいに書いてみたってこと?
単なるCHoge();は一時オブジェクトを作っておしまいだしなあ
>>550 ぐは。思いっきりCHoge();でよびだしてました。。
基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。
classが勝手に呼ぶやつは printfかOutputDebugString使って 挙動調べるなりして自分で勉強した方がいいと思うよ virtualなデストラクタ関連も
>>549 引数無しコンストラクタを呼ぶなら、new 使わないと駄目だ。
CHoae( Arg arg )
{
new (this) CHoge;
this->member = arg;
}
ただ、デフォルトコンストラクタを持つメンバ変数が合った場合、
なんか微妙なことになりそうな気はする。
*this = CHoge(); でもいいらしい。ケースバイケースだけど。
デフォルトコンストラクタをだけを行うpimpl作ればいいんじゃないの。 class CHogeImpl{CHogeImpl(){...}}; class CHoge : private CHogeImpl { CHoge(){} CHoge(int n){} };
>>554 コンストラクタ内では、thisは const T *this ではなく、T *this なの?
557 :
556 :2006/09/14(木) 22:12:40
あ、ごめん、俺の勘違い。 T * const thisだね。 だから文法的には問題ない。
>>556 const属性は付かないよ。やってみ。
どちらにしろコンストラクタからコンストラクタを呼び出すのは、 例外安全などを考えるとあまり好ましくないね。 何も考えないと結果も残らないしw
>>553 そんな絶対に使っちゃダメな糞コードを晒したらダメだろバカか。
>>551 >基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。
基底クラスだってそれでいけねーよ。
C#ならpublic CHoge(int i) : this() {}と簡単なんだが、 C++なら引数なしコンストラクタの実装を privateメンバ関数にするとかが一般的じゃね。
ちょっとまて。 お前らコンストラクタ内からコンストラクタ呼び出すのを 本気で正気なコードだと思ってるのか?? 煽りでなくマジで。 組み込み型しか使ってない単純クラスなら 特に問題になることは無いのかもしれんが、 それでも普通は各コンストラクタで共通の初期化部分を 関数としてくくりだして、使いまわすのが普通だろ? それとも俺の気が狂ってるのか???
仕様を確認してるだけで 是非を話し合ってるわけじゃないっしょ
564 :
デフォルトの名無しさん :2006/09/15(金) 02:25:41
Javaでいえば、
TestClass(int a)
{
this.val=a;
}
TestClass() {
this(32);
}
>>562 ってことじゃないか?
>>562 もちろんまともなプログラミングとは思っていない。作法としても
間違ってる。
ただ、こんな書き方ができるというだけで。お遊び程度。
ネタ的に遊んでただけなんだよね。 いや、よかった。 俺の気がフれたのかと思って激しく動揺しちまったよ。
質問なのですが、以下のようなコードでCharTがcharまたはwchar_tを表すときにCharTタイプのヌル文字を関数内で取得したいのですが何か良い方法はありませんでしょうか? template <typename CharT> void hoge(){ // ここで CharT タイプのヌル文字を取得したい }
CharT c = CharT(0); で、大抵は大丈夫だと思うけど
CharT()
あ....なるほどorz どうもありがとうございましたorz
厳密にやるなら std::char_traits<CharT>::eos() かね
可愛い女子高生の彼女の家に夕食お呼ばれされて彼女と妹さんとお父さんとで話してた 「○○くんは毎日インターネットしすぎだよ」 「うわ、おにいちゃんやらしい!」 「ほほう、なんでネットがやらしいんだ?」 「だってアダルトサイトとか」 「そんなサイトばかりじゃないだろ。というかネットと聞いてすぐそんなサイトを 思い浮かべるおまえのほうが怪しい」 「なっ!……」 「ところでブラウザって閲覧の履歴が残るんだけどさ」 「それがどうしたってわけっ?」 「俺がいない間に勝手に部屋にきてPCいじるのは許すとしても、 ネットの巡回履歴は消しとけよ。特に『あの手』のサイトをみた後くらい」 「ひっ!?ち、違っ、わたしはただその下着の通販サイトを…見てたら…」 「下着……必要なの?おまえの大きさで? ああ補正用とか?ビッグにみせるアレとか?」 「もう!○○くん、女の子にそんな事いっちゃ駄目だよ。でも…まあトップを隠すだけなら ばんそうこうでも…」 「もうおねえちゃん!! おとうさん何かいってやってよ!」 「下着を買うより牛乳を飲みなさい」 酷い家族だ 助けて(;´Д`)
573 :
デフォルトの名無しさん :2006/09/15(金) 23:43:07
調子に乗ってtemplate使いまくってたら、参照の参照をやってしまってエラーを出してしまいました。 C++でもJavaみたいに参照の参照もただの参照のように扱う方法を教えていただけないでしょうか。 またもしC++でそれが実現できないなら、オブジェクトのやり取りはポインタで行うようにしていくべきですか?
>>573 template<typename T>
struct ref{typedef T&type;};
template<typename T>
struct ref<T&>{typedef T&type;};
ゲームのイベントシーンの文章を返す関数で char* text(int eventsyurui){ switch (eventsyurui){ case 0: return "(イベントシーン一つ分のメチャ長い文字列)"; break; … } } なんてのを作ったんですがC2026エラー(文字列が長すぎて後ろが切り捨てられる)の壁にぶち当たりました。 いい解決法あったら教えてください。
プログラムに直接書くのは止めようぜとしか言えない。
全部が1行ってことはないだろうから 改行毎に分けて配列にでもしたら
そんなプログラムを書く奴は氏ねばいい
どうでもいいが具体的にどんなアプリケーションに使うコードなのか
書くのってなんか恥ずかしくない?特に
>>576 とかどうみてもエロゲ
return "(イベントシーン" "一つ分の" "メチャ長い文字列)"; って感じで一応回避可能。 あと、戻り値はconst char *にしる。
>>580 むしろエロゲでこんな作り方はしないだろ。
こういう実装でなんとかなりそうなのは、RPG辺りかと。
……RPGのエロゲ、というのは無しの方向で。
584 :
576 :2006/09/16(土) 01:56:18
あ、いえエロゲではないです…ということで。
>>578 以前それやってたんですが
strcpy(text[0],"今日は");
strcpy(text[1],"いい天気だ");
と書いてから気が変わって行を追加したり逆に行を削ったりとかするの
とっても面倒なんです。(特に追加時は以降の全部の行の配列を+1しないといけない)
585 :
576 :2006/09/16(土) 02:00:11
>>581 さんありがとうございます。
とりあえずそのやり方でやってみます。
>>584 分かっててネタで釣ってるんだろうけど
ここは初心者も見てるだろうし混乱防止のため言って置く。
きみの考え方はかなりVBに影響を受けて毒されている。
char *text[] = {
"今日は",
"いい天気だ",
"イベントシーン",
"一つ分の",
"メチャ長い文字列",
"" /* 終端 */
};
これなら気が変わっても大丈夫だ。
Lつけなくてよかったっけ
そりゃwide charにする場合だろ > L ところでさ、終端ってNULLにしない? なんかC++というよりCっぽいな・・・
>586だと空行作れなくて不便だとかいろいろあるから、普通はNULLだろうなぁ。
つーか、std::vector<std::string>返すようにすれば終端要らないけど。
>>590 激しくコピーが発生しそうだな。
あ、でも string の実装によっては、
ポインタだけのコピーですむのか??
無駄が多いな
>>593 え?なんか間違ってたっけ??
string の実装ってまちまちだとおもうんだけど、
リファレンスカウントとかCOWとか使ってるんじゃないの?
string の値渡しって、文字列丸ごとコピーしてるんだよね?違ったっけ?
>>595 基本的にはそう。
>>594 みたいな実装はマルチスレッドが絡むとパフォーマンスの低下が著しいので近年ではあまりやらない。
あってる
1秒違いで負けたww
std::vector<std::string>ってだけで、 > 激しくコピーが発生しそうだな。 にポカーンですが… 使い方によるでしょ…
>>596 そういうものなのか、実は恥ずかしながらいままで
マルチスレッドというものを意識したことがなかった。
ファイルやDBのロックはマルチプロセスの話だしね。
string 自体がリファレンスカウントの機能を持たず、
言語としてガベコレの機構を持つ場合にはマルチスレッド
性能の低下は招かないの?たとえばC#とか。
C++ では std::auto_ptr とか boost::sahred_ptr
なんかで受け渡すべき?
>>599 std::vector<std::string>返すっていうことなので、
一時オブジェクトが生成されてコピーが発生しそうだな、
と思いました。RVO がうまく働くのかもしれませんが。
たとえ無駄が生じることが予想できようと、 それが実際に問題になるまでは気にすることはない。 こういう考えはだめか?
ま、最終的にはバランス感覚の問題でしょうな。 パフォーマンス周りは実測を基本とする考え方からしたら間違っていないし、 かといって確実に無駄といえる状況を放置するのは感心しない。
> string 自体がリファレンスカウントの機能を持たず、 > 言語としてガベコレの機構を持つ場合にはマルチスレッド > 性能の低下は招かないの?たとえばC#とか。 ちょっとチラシの裏借りますね C#(というか.NET)やJavaの最近の実装は、若いオブジェクトのための ヒープのようなものをスレッドごとに持つ。 ガベコレが動作しない間はこのヒープ状のものはロックされない。 だからstringを作って足してコピーして・・・なんかを繰り返しても、 他スレッドの動作を(同期機構を使わないという点で)妨げることはない。 ただし、live objectが超大量になると、ガベコレ期間が悲惨なことになる。 大規模アプリ、Eclipseなんかが苦労してる。 一方、C/C++は通常はヒープがスレッドごとじゃないから、new/delete/ malloc/freeするたびにヒープのロックが発生する。複数スレッドが new/deleteをガンガンやるとひどいことになりかねない。 std::mapをコピーすると結構起こってそうなんだがどうだろう。 スレッドごとに独立していることが保証されているなら、カスタム アロケータの利用を考えてもよいかもしれない。でも、スレッド間で 安全に受け渡すのが難しくなるという諸刃の剣。素人にはおすすめしない。 オブジェクトのサイズや個数、ライフサイクルなんかに依存しまくる話だから 一般的にこうすべし、というのは言いにくいんだよね。 逆にいうとC#やJavaが取っている手法法は「使いすてオブジェクト多杉」 という一般的な傾向から導かれたものだから、参考にしてもよいと思う。 2年以上前の知識ゆえ間違ってたら指摘夜露死苦 以上、チラシの裏でした。
>>602 最初の相談を見る限りじゃ絶対やらない方がいい希ガスw
606 :
デフォルトの名無しさん :2006/09/16(土) 16:09:50
質問です
class abc
{
public:
virtual void uuu()=0;
}
class def:abc
{
public:
void uuu();
}
abc *po;
def hoge;
po=&hoge;
hoge->uuu();
こんな感じのプログラムなんですが、エラーが出ます
親クラスのポインタが子クラスを示すことはできないんですか?
ttp://d.hatena.ne.jp/kenmo/20050705 このサイトを参考にしたんですが、ここではできてるみたいなんです
>>606 とりあえずエラーメッセージを晒そうな、な?
608 :
デフォルトの名無しさん :2006/09/16(土) 16:14:16
>>607 'type cast' : 'class def *' から 'class abc *' の変換は存在しますが、アクセスできません。
>>606 class では継承関係もデフォルトで private だよ。
public 付けないと、クラス外からは継承関係を利用できない。
>>606 そのサイトは間違っている。
コンパイルしてないんだろう。よくあるこった。
class def : public abc
とすればいい
>>606 class def: public abc {
612 :
デフォルトの名無しさん :2006/09/16(土) 16:35:08
もう話終わってるみたいだけど po=&hoge; hoge->uuu(); これ意味あんの? po=&hoge; po->uuu(); こうじゃないの?
614 :
デフォルトの名無しさん :2006/09/16(土) 16:48:07
>>613 書き間違えてました
その通りです。すみません
615 :
デフォルトの名無しさん :2006/09/16(土) 17:19:02
すみません、また質問です。 class Cdote { public: Cdote(); void run(); }; class Cmain { private: static Cmain singleton; static Cdote *pdote; Cmain(); public: static void cont() { Cdote dotei; pdote=&dotei; pdote->run(); } }; int main(void) { Cmain::cont(); return 0; } さっきのコードの別の部分みたいな感じなんですが、エラーが出ました 外部シンボル ""private: static class Cdote * Cmain::pdote" (?pdote@Cmain@@0PAVCdote@@A)" は未解決です
( ゚д゚) ポカーン
Cmain Cmain::pdote = うんたらかんたら;
間違えた Cmain* Cmain::pdote = つまりstatic変数はクラス外での定義が必要。
619 :
デフォルトの名無しさん :2006/09/16(土) 17:43:47
>>618 'private: static class Cdote * Cmain::pdote' : 再定義されています。異なる基本型です。
またエラーが出たんですが、どうすればいいんでしょうか
Cdote* Cmain::pdote = 0;
class Cdote { public: Cdote() {} void run() {} }; class Cmain { private: static Cmain singleton; static Cdote *pdote; Cmain() {} public: static void cont() { Cdote dotei; pdote = &dotei; pdote->run(); } }; Cdote* Cmain::pdote; int main(void) { Cmain::cont(); return 0; }
622 :
デフォルトの名無しさん :2006/09/16(土) 17:53:16
ザ・思考力0
例外が起こった場所を表示させるのにはどうしたらいいのでしょうか。 例外のクラスはstd::exceptionです。
シングルとかドーテーとか嫌な気分になるな…
>>624 答えになっていない答えだけど、そういう機能を持ったデバッガを使うのが簡単。
>>624 VC++ をはじめとして IDE 付属のデバッガには
ついているんじゃないか?そういう機能.
直接例外が起こった場所を表示してくれなくても,
スタックをワインドバック(っていうのか?)すれば
わかるだろう.
環境を言うべきでした。 gdbの使い方を調べてみます。 ありがとうございまいた。
バックトレースじゃ判らないんだっけ? bt
throw するところで止まってればバックトレースが使える。 catch してからじゃわからない。
catch された時点でそれまでのスタックは破棄されて 当該オブジェクトはデストラクトされるんだっけ?
当該オブジェクトって何よ?
スコープから外れればデストラクトされる
>>632 破棄されたスタックに確保されていたオブジェクト
漏れの頭蓋骨もデストラクトしそうです。
636 :
デフォルトの名無しさん :2006/09/17(日) 02:54:05
>>604 なかなか。きっとブログ作ると自分と似てる人たちがあつまってくるよ。
637 :
600 :2006/09/17(日) 05:52:41
>>604 遅レスだけど、よくわかった。
スレッドローカルなヒープがあるか無いかと言うことか。
>>635 安心しろ。
途中で例外が発生して楽に死ねる
639 :
C++ 入門中 :2006/09/17(日) 15:32:04
現在VS2005にてC++の勉強を始めたのですが、 MFCプログラミングはマスターしなくても実務で堪えうる堅牢な システムを簡単に作れる気がするのですが、 (Windows Application として) C++を勉強する際には、それもマスターしなければダメなのでしょうか?
640 :
デフォルトの名無しさん :2006/09/17(日) 15:53:46
BMP画像(24bit)のRGB値をTextファイル出力するプログラムを 作成してみたのですが、BMP画像が正常に読み込める場合と 読み取りエラー(?)が発生してtextに"-1"が書き込まれてしまう場合 があります。これはBMPファイルが壊れているのか、 それともプログラムが悪いのか分かりません。何か解決方法があれば教えてください
641 :
_ :2006/09/17(日) 16:00:55
>>639 仕事で必要なら勉強すればいいし、そうでなくても好きにすればいい。
>>639 MFCを使わずにMFCと同じだけのことをするプログラムを書く労力より、MFCを覚える労力のほうが大体は少ない。
まあMFCに限った話じゃないが、大抵のライブラリとかツールはそういうもんだ。
644 :
デフォルトの名無しさん :2006/09/17(日) 16:47:19
MoreEffectiveC++第3版の翻訳本ってまだですかね? 第2版のあまりの評判の悪さにスルーして第3版を待っているのですが 待ちきれないです
とっくにでとるがな
646 :
デフォルトの名無しさん :2006/09/17(日) 17:00:39
>>639 簡単に迅速に業務アプリを作るのが目的なだとすると、
今なら.NET覚えたほうが良くね?
647 :
実は 639 :2006/09/17(日) 17:27:19
>>646 実は、C# / VB.net での開発経験は3年程ありまして
.NET環境での一通りの開発は出来ます。
しかしながら、いい加減これらの言語だけをずっと使っておりますので
飽きて参りました。
そういった経緯でC++.netを勉強し始めたのです。
VSを使えばMFCでなくともフォーム回りとかは簡単に
スグ作れるのになぜ参考書等にはなぜかそのMFCを使った
プログラミング手法が解説されている事に疑問を持ったからです。
実務でMFCを使う事ってありますか?
なんていうか、スレ違いじゃね?
どう見てもスレ違いです。
普通にスルーでよいでしょ。
>>644 EffectiveC++ 第3版でしょ?出版社が変わってピアソンになったよ。
俺はとうの昔に買って読んでる。2色刷りだよ。
うちのは改訂2版なんだけど、買いなおす価値あるかい?
Moreじゃなくて無印のEffective C++のことだよな? だったら2版と3版じゃ全然違う本になってるから 買い「直す」なんてならないよ。そして相変わらず必読。
そんなに違うのかー。 旧2版の方は十分償却してるだろうから、検討しようかな。 ちょっと立ち読みしてくるわ。サンクス。
operator< ってのは、メンバー関数ポインタに適用できなくて正解ですか? struct A { void f1() {} void f2() {} }; int main() { typedef void (A::*ptmf)(); ptmf a = &A::f1; ptmf b = &A::f2; return a < b; // ←だとNG、return a != b; なら OK } コンテナに突っ込んでたら怒られました。g++ 4.0.1 です。
メンバポインタの大小比較は定義されてないだろうナァ 比較演算ができること自体も驚きだが
>>647 実務で全角アルファベットを使うことはほとんどないです
メンバー関数でなくても(ry
>>656 >比較演算ができること自体も驚きだが
出来てないんじゃ?
>>655 >コンテナに突っ込んでたら怒られました。
Loki::TypeInfoを使ってmapに入れるとか
#include <loki/LokiTypeInfo.h>
#include <utility>
struct A {
void f1() {}
void f2() {}
};
typedef void (A::*ptmf)();
typedef std::pair <Loki::TypeInfo, ptmf> TypeInfo_ptmf_pair;
TypeInfo_ptmf_pair get (ptmf p) {return TypeInfo_ptmf_pair (Loki::TypeInfo (typeid (p)), p);}
int main() {
TypeInfo_ptmf_pair a (get (&A::f1));
TypeInfo_ptmf_pair b (get (&A::f2));
return a.first < b.first; // ←だとNG、return a != b; なら OK
}
>>660 意味不明。TypeInfoで判定してどうすんだよ。
A::f1とA::f2の型が違うってのか?
>>655 typedef void (A::*ptmf)();
struct Comp{
bool operator()(const ptmf& u, const ptmf& v){
return memcmp(&u, &v, sizeof(u))<0;
}
};
std::set<ptmf, Comp> s;
662 :
660 :2006/09/18(月) 13:19:31
>>661 >A::f1とA::f2の型が違うってのか?
ボケてたスンマセン
663 :
644 :2006/09/18(月) 13:25:59
MoreEffectiveC++第3版の翻訳本って言ってんだろウワァァァァァァヽ(`Д´)ノァァァァァァン! 勝手に脳内でEffectiveC++第3版にすんな EffectiveC++第3版ならもう買ってある。読んでないけど
>>663 addison-wesley本家のサイトでみてみたが
more effective c++は
3rdはおろか2ndもなくて
現行で1st editionみたいなんだけど
質問させてください。 この度PC上で起きるイベント(作業ウィンドウの変更やウェブページの移動等)を記録するプログラムを作る事になりました。 ネット上等を調べてどうやらSetWindowsHookExという関数を使う事は分かったのですが、具体的なコードの書き方(例題等)が分かりません。 どこか詳しく述べているサイト等を知っている方が居ましたら教えてください。 流れ的には、作業ウィンドウ変更→プログラムが感知(フック)→その内容をテキストに書き込み、という感じにしたいです。 よろしくお願いします。
あれ、プラットフォーム依存はすれ違いじゃなかったっけ。
>>659 operator==, operator!=も比較演算じゃろ
670 :
655 :2006/09/18(月) 18:28:42
>>660-661 どうもです。vector 二つ使ってベタな key value にします。
スレイ違いかもしれんけど、STLのalgorithm使ってる?
使える場面なら使ってる
>>672 雑談ならヤメロ。相談なら情報を小出しにするな。
C++0xに提案されている、lambda式が採用されれば、面白いことになりそうなんだけどなぁ>STLのアルゴリズム
俺の場合は、どっちかというと<boost/range_ex/algorithm.hpp>を使うほうが多い。
lamba式って提案されてるの? 採用されればうれしいけど、さすがにされない気がする
boost じゃ駄目なん?
確かこんな感じになるはず。 vector<int> v ; char const * str = "elem : " ; for_each(v.begin(), v.end(), <>(int x) { std::cout << str << x << std::endl ; } ) ; やはり邪悪かな。
導入されたら、ポインタの次にラムダ分かりませんという奴続出な予感。
vector<int> v; auto it = v.begin(); while(it != v.end()) { std::cout << str << it << std::endl; } とかの方でなく?
どうでもいいが std::cout << str << *it << std::endl; じゃないのか?
>>682 返り値型指定なしのlambda式の登場で、
またname lookupが複雑になりそう…
>>686 いや、単に省略できるだけで、
return文を見てコンパイラが決めるだけらしいから。
return文がなければ、voidとみなす。
いやdecltypeで既に複雑になると言われているので…
682の何が邪悪なの? 今やアレ程度のlamda式が無い言語の方が希少なはずだけど。 ひょっとして、<>って部分だけを指していってんのか? だとしたら単なるアホなんだけど、まさかな。
どうでもいいが、lambdaを頭の中ではランバダと読んでしまって困る。
マサルさんを思い出した
boostみたいに必死こくくらいだったらおとなしく言語仕様に入れた方がいいな>lambda というより <>(int x) ... この記述は…<>が名前のない関数名を示すみたいな感じなの?
>>692 そういうことらしい。
tempate <typename T>の<>からの連想だとかだった気がする。
まあ><よりマシか
テンプレートラムダは出来るようにするのかな? 出来ないと嘘だとは思うけど。
ラムダ分かりません><
>>695 提案では、lambda式はジェネリックであってはならないと書いてあるけど。
ジェネリックってのはなんだろ。
こういうのもダメなのかな?
template < typename T >
void f(T x)
{
(<>() extern(x){ std::cout << x << std::endl ; })() ;
}
正直なところ利用価値がよくわからんちん。 誰かお母さんみたいに優しく教えてくれ。
>>693 lambda式はテンプレートにはしないと提案に書いてあるのにか?
言語仕様に入ったら boost::lambda はお払い箱?
あれはあれで使いやすいしなあ。
たしかに見た感じはboostのが分かりやすい でもメンバ関数呼ぼうとしたときは0xの方が分かりやすいかな
lambdaを使うとなにかいいことあるの?
使い捨ての関数をその場限りでかける。 っていうか名前考えなくていいだけでありがたい
706 :
デフォルトの名無しさん :2006/09/21(木) 14:44:18
すいません。以下のようなプログラムで、aa.test(), bb.test(), cc.test() のメソッドポインタを格納できるような配列はどのように書けばよろしいでしょうか? クラスが違うメソッドのポインタを配列に格納するのは無理なのでしょうか? #include <stdio.h> class a{ public: void test(){printf("a");} }; class b{ public: void test(){printf("b");} }; class c{ public: void test(){printf("c");} }; int main(){ a aa; b bb;c cc; }
そのままでは無理。 testという名前が同じであることが大事なら、templateで継承関係を後付けすることができる。
bindしてboost::functionに入れるという手もある。
>>706 struct ITest { virtual void test() = 0; }
class a : public ITest { virtual void test()
途中で送信しちまった。 struct itest { virtual void test() = 0; } class a : public itest { virtual void test() { printf("a"); } } class b : public itest { virtual void test() { printf("b"); } } class c : public itest { virtual void test() { printf("c"); } }
そこまで親切丁寧に書かんでも
基本的には
>>710 なんだろうけれども、
boost の使用に抵抗が無ければboost::functionが良いと思う。
C# の delegate 並みに楽ちん。
boost馬鹿は死んでね
Boostを使えない馬鹿が何か言ってる。
Boostが嫌でも、functionもbindもTR1に入っているから、 将来のC++標準入りの可能性は高い。 まあいつのことだかわからないけどね。
716 :
710 :2006/09/21(木) 17:49:51
(1)template/boostを使う方法
→template/boostの使用は不可(開発環境での制限)
(2)
>>710 の方法
→ class a,b,cは他人が提供するクラスであり、
void型ということとメソッド名以外は任意となる(仕様)
そのままでは無理ということで、
全く別の方法を考えて見ます
レスありがとうございましたm(_ _)m
717 :
706 :2006/09/21(木) 17:51:00
710ではなくて706でしたorz
テンプレートが使えなければマクロでごり押ししてしまえ。 class test_holder { public: virtual void test() = 0; virtual void ~test_holder() {} }; #define TEST_HOLDER(c) test_holder_ ## c #define DEFINE_TEST_HOLDER_IMPL(c, mem) \ class TEST_HOLDER(c) : public aa { \ c& x; \ public: \ TEST_HOLDER(c)(c& obj) : x(obj) {} \ virtual void test() {x.test();} \ } DEFINE_TEST_HOLDER_IMPL(aa); DEFINE_TEST_HOLDER_IMPL(bb); DEFINE_TEST_HOLDER_IMPL(cc); int main() { aa a; bb b; cc c; test_holder* holder[] = { new TEST_HOLDER(aa)(a), new TEST_HOLDER(bb)(b), new TEST_HOLDER(cc)(c), }; for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i) holder[i]->test(); for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i) delete holder[i]; }
boost禁止はわかるが、template禁止かよ。
C++はtemplateが無いとただのアレな言語だからなぁ
禁止じゃなくて、開発環境の制限と書かれてるぞ。 処理系の制限かもよ。俺はそんな処理系知らないけど。
VC6の実装なら十分制限になりえそうだがな。
embleded C++とか言う奴か?
EmbeddedC++とかじゃね。
かぶった('д`)
そもそも、何で異なるシグネチャのメンバ関数ポインタを配列で持ちたいと思ったんだろう。
多分メンバ関数ポインタを普通の関数ポインタと同じように扱えると 考えてたんだろ。
shcppでも使えるようになったのかね。
>>726 漏れの目が悪くなければ、シグネチャは一致していると思うが。
シグネチャは一致してるだろボケ
しぐねちゃってなんですか (>_<)
暗黙のthisポインタって知ってるか? クラスが違うとシグネチャも違うよ。
1.3.11 signature [defns.signature] the information about a function that participates in overload resolution (13.3): its parameter-type-list (8.3.5) and, if the function is a class member, the cv- qualifiers (if any) on the function itself and the class in which the member function is declared. The signature of a function template specialization includes the types of its template arguments (14.5.5.1).
また変な流れになってきた
いや、シグネチャという概念は大切。特にC++では。
シグネチャって関数の多重定義の時にだけ意識していればいいのでわ?
Generic programming全般で重要です。
ふと思いついた紛らわしい関数のシグネチャ Typelist ( A, B, C, D ) // Typelist 型の戻り値を持ち、 // A, B, C, D の4つの型の引数をとる関数定義
ヘルプに 「template は将来の為に予約されています」 と載ってた時代を思い出すなあ。
export templateはもう諦めた方がいいですか?
boost/archive/xml_iarchive.hpp boost/archive/xml_oarchive.hpp のsample programをそのまま使っても runtimeの異常な呼び出しで終了しました とかいうエラーで止まるんですが、なぜ? includeするだけじゃ動かないのかな 環境はVS2003です
sample programというのは boostのホームページにのってるdemoプログラムのことです
745 :
743 :2006/09/22(金) 18:13:01
自己解決しました boost_1_33_1\libs\serialization\vc7ide に入っていたproject fileを使ったらうまく動きました boostのホームページからコピペしただけでは 動かなかったのは謎です
>>743 >includeするだけじゃ動かないのかな
ライブラリをリンクする必要がある
747 :
デフォルトの名無しさん :2006/09/22(金) 23:33:33
double型なデータをstd::string型に変換するにはどうすればよいのでしょうか?
どういう変換を想定してるの? 1.234 => "1.234" みたいなこと?
boost::lexical_cast
750 :
747 :2006/09/23(土) 00:44:56
>>748 そのとおりです。
簡単そうで意外と情報が見つかりませんでしたorz
>>750 charにsprintfしてからstringにすれば良いんじゃね?
(boost::format("%g") % 1.234).str()
標準C++の範疇でやりたければstd::ostringstream使え。 Boostを使ってよければlexical_cast使え。
>>753 の言うとおりだが、補足として、std::ostringstream
使うときには precision に注意すべし。
double f=1.00; string s = f.to_string(); とか出来るクラスがあったら楽でいいのに。 と思ったけど。 string str_thousand = "1000"; int int_ninety = 90; int a = lexical_cast<int>( str_thousand ); string s = lexical_cast<string>( int_ninety ); boostっていいね。 boost落として使いたくなったよ。
使いたいけど、中でやってることがそれなりに大げさで、組み込みの類みたいな 性能要求の厳しいところには、ほんの一部しか持ち込めない場合も… lexical_castとかはガチで便利だけど、同時にソースの大きさ&生成されるコードのデカさには 吹く事請け合い。 いやまあ、ほとんどの環境じゃ問題にならないとは思うんだけどね。
>>756 それ言ったら、標準ストリームも使えんぞ。
いまは組み込みでも標準ストリームは当たり前なのかな。
俺が組み込みにいた頃は C++ とかあり得なかったけど、
今じゃ C++ も結構使われて居るみたいだし。
>>757 まあ、そうなんだけどね。
実際そういう環境だと標準ストリームは禁じ手扱いだなー。
IOデバイスが抽象化されてないのでそもそも出番が無いなんてこともあるけど。
あとは例外とRTTI。蛇蝎のごとく嫌われてる。実際負担はでかいにせよ。
CとC++じゃ、相変わらずC++の方が重い局面も多いのだろうけど、
コンパイラ様の性能がこの数年で格段に跳ね上がった感がある。
テンプレートも味方してくれるし、今更Cじゃ辛いからC++というだけでなく、
純粋に性能面から見てもC++のが有利ってのも、今となっては寝言じゃない。
ただ、言語機能的にはまったく問題なくても、ライブラリ類に大幅な制限食らってまで
使うC++が本当にC++なのかと、ふと考えることはある…かも。
例外はまぁ仕方ないとも思う。 実際その方がロジックはきれいになることも多いし、 エラーを見逃すことも少なくなる。 RTTIは、boost のいくつかのライブラリが要求するから コンパイラオプション的には禁止していないけど、 自分が各プログラムでは使いたくない、と言うか、使わない。 C++ のようなアーリーバインディングな言語では コンパイルが完了した時点で型に関する整合性は 保証されていることが大切だと思っているから。
Javaみたく例外が低コストなら、がんがん使うんだけどね。 構造上仕方が無い。 >C++ のようなアーリーバインディングな言語では >コンパイルが完了した時点で型に関する整合性は >保証されていることが大切だと思っているから。 基本的には同意。 RTTIは、個人的には要らない子に思う。 けど、奴がいないとできない仕事は結構あるしなー。 機構としてのRTTIを言語がサポートしていることには何の不満もないけど 影響範囲をコントロールできないのがムカツク。 素のままだとAll or nothingなんだもんなー。
Boostはエンタープライズなライブラリを がんがんacceptしてるな そろそろC++言語が高級言語らしくなってきたよ
エンタープライズなライブラリって・・・なに?
template <typename List_, typename Parameter_> class MessagePort { public: typedef List_ mes; /* コンストラクタとかメソッドとか */ }; struct PlayerMesList { typedef int type; static const int ESCAPE = -1; static const int MOVE = 0; static const int WARP = 1; static const int FIRE = 2; }; typedef MessagePort< PlayerMesList, Point > PlayerMesPort; 質問です。上のようなクラスがあったとき、私の予想では int a = PlayerMesPort::mes::WARP; はコンパイル時に int a = 1; に置き換わると思うんですが、何故かG++-3.3.2でリンク時に undefined reference to 'PlayerMesList::WARP' と出てリンク出来ません。何故でしょうか…。 BCC(BuilderX)では何の問題も起こらなかったのですが…。
>>763 >undefined reference to 'PlayerMesList::WARP'
この時点では見えないよ。と、いわれてるのだからどこが悪いか検討つくのでは。
リンクの順序orコンパイラ
static constな整数のメンバ変数はclass内で初期化できる。
しかし、それがメモリ上のオブジェクトとしての実体が必要な形で使用する場合、
改めて実体を宣言する必要がある。ってことだよな? もし
>>763 がどっかで
参照とかポインタに突っ込んでる箇所があるならgccの挙動で正しい。
struct T {static const int n = 3;};
void f( int x){ cout << x << endl;}
void g(const int& x){ cout << x << endl;}
int main()
{
f(T::n); //ok
g(T::n); //NG
return 0;
}
独立参照はしてないのですが、const int &な引数になら渡しているっぽいです。 ためしに一箇所だけ、 一度int型に格納してから引数に渡すように変更してみたら、 大量のエラーの内一つだけ消えました。^^; 質問時の 「int a = PlayerMesPort::mes::WARP; はコンパイル時に int a = 1; に置き換わると思うんですが」 というのはかなり不適切な言い方でしたね…。 …でもconst int &に数値リテラルなら直接渡せるのに何故? (クラススコープでのstatic const int定義はコンパイル時解決だったと思うのですが…)
……ってコンパイル時解決というのは私の勘違いっぽい?
772 :
763 :2006/09/23(土) 18:48:56
>>771 むー…そういうことですか。static const 整数って意外と不便なものなのですね…。( ´ ・ω・ ` )
cppファイル上で定義するなりなんなり、とりあえず別の方法を検討してみます。
みんなありがとう。
ちなみにC++3rdでその件について解説してる部分では 「enum使えenum」って結論だったな。ってBCCはenumにバグがあるんだっけ?
775 :
ららら :2006/09/23(土) 20:27:47
助けてなのらー! VC7.1 で以下の Multiply 関数の 2 つめの引数の const を削除してコンパイルすると "function does not take 2 arguments" エラーになるのらー! なんでなのらー?どうしたらいいのらー? template<class T> class Complex { public: typedef T ValueType; }; template<class T> class Vector { public: typedef T ValueType; }; typedef Vector<Complex<float> > MyVector; template<class VectorT> void Multiply(VectorT* vec, const typename VectorT::ValueType::ValueType a) { } void test() { MyVector v; Multiply(&v, 2.0); }
329 名前:ららら[sage] 投稿日:2006/09/06(水) 00:41:45
>>328 ばかはおよびでないのらー
また出たよ……。
七誌ではないことに感謝しろよ
>>775 Multiply(&v, 2.0);の場合、
1つ目の引数より、テンプレート引数VectorTの型は、
Vector<Complex<float> >だと判断される。
するとtypename VectorT::ValueType::ValueTypeはfloat型になる。
しかし2つ目の実引数の2.0はdouble型になっているのがまずいのだと思う。
2.0fだとどうだろうか。
>>778 どうやらそういう理由ではないようだ。
>>775 そのソースをVC8でためしたらコンパイルすらされない。
で、
template<class T>
class Vector {public: typedef T Type;};
このように変更したらMultiplyのconstなしがvc7.1とvc8両方でコンパイルされた。
たぶん、vcのバグかな。
780 :
763 :2006/09/23(土) 21:54:56
774>>見てBOOST_STATIC_CONSTANT使ってみたけどundefined reference…。 それ使えばconst &へ直接渡せるようになるってワケではないのですね…。 とりあえず定数を使う場合に全て単項の+付けるようにして対応しました。 なんだかなぁ…。( ´ ・ω・ ` )
>>780 じゃあ、コンパイラがenumでの参照初期化が駄目なのかも。
boost/config/suffix.hppの
// BOOST_STATIC_CONSTANT workaround --------------------------------------- //
// On compilers which don't allow in-class initialization of static integral
// constant members, we must use enums as a workaround if we want the constants
// to be available at compile-time. This macro gives us a convenient way to
// declare such constants.
# ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
# define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }
# else
# define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
# endif
で切り替えてんだけど。
782 :
デフォルトの名無しさん :2006/09/23(土) 22:14:56
環境 OS WinXP コンパイラ Visual C++ if文を用いたプログラムを作りたいので質問します 最初に[F5]を押し、もしパケットの受信(なんらかの通信)があったなら、5秒後にまた[F5]を押し もし、パケットの受信がなければ、そこでプログラム停止 というプログラムを作りたいのですが、全くわかりません ある程度のコマンドを表記してもらえれば後は自分で独学するので 使うコマンドだけ教えてくれませんか? 2ちゃんねるの実況などのオートリロードに役立てたいのです(Janeですと、制限があるので…)
>>782 すまないが、環境依存の話はスレ違いなんだ。
Visual C++のスレとかあるからそっちへ行ってくれ。
784 :
763 :2006/09/23(土) 22:32:22
BOOST_NO_INCLASS_MEMBER_INITIALIZATIONが定義される(可能性のある)コンパイラは MPW C++、Sun C++、Visual Age (IBM) C++、Microsoft Visual C++の四つだけみたいですね。 (boost/config/compiler/より) あくまでclass内で直接定義できない場合にenum仕様に分岐するってだけで、 const &に渡すとか、そういう用途は想定してなさそう…。
元のお題ならenumになれば問題ないでしょ?
「enumハック」とか「非推奨」とか言われることも多いけど 結局、定数をクラス内enumにするのが 一番トラブルが起きにくいし、読む側も(わかってれば)納得できるんだよね。
>>786 enum は enum で template 関数に使うと妙なことになるぞ。
#include <algorithm>
struct S { enum { N = 1 }; };
int main()
{
return std::max(S::N, 0);
}
:5: error: no matching function for call to `max(S::<anonymous enum>, int)'
788 :
763 :2006/09/23(土) 23:14:31
>>785 よく考えてみればそうですね。頭固い763に乾杯。
…ってtemplate関数に使うと 787>> みたくなっちゃうのか…。
別に質問の件ではtemplate関数に渡したりしないから大丈夫だけど、
もうstatic const 整数で定義して、使用時に単項+付けるんでいい気がしてきた…。
789 :
デフォルトの名無しさん :2006/09/23(土) 23:18:07
よくiteratorのループで以下の形が用いられますが for(iterator i = begin; i != end; ++i) 「i != end」の部分が気になります。 例えば以下の関数があったとして、 引数endにNULLその他、不適切な値が渡された場合 無限ループになってしまいます。皆さんはどう解決されてますか? template< typename iterator > void function(iterator begin, iterator end) { for(iterator i = begin; i != end; ++i){ ...} }
>>788 定義を追加するのはだめなのか?
undefined referrence っていうんだから、一番まっとうな解決方だと思うが。
使用箇所全部に不気味なコード書くぐらいなら、
実装側に不気味なコードひとつのほうがマシだろ。
struct S { static const int N; }; const int S::N = 1;
>>789 渡すやつが悪いという理屈が通用しないなら、
function側で、X.end()と生成するしかないだろ。
確かに、俺なら、 firstとlastを受け取る関数のlastにNULLを渡すなんて 絶対やらないけどな。
そもそも型が違うのではないのか?
795 :
763 :2006/09/23(土) 23:55:14
>>790 うーん。そういう記法で統一すればさほど不気味でもないかな、とも思っていたんですが。
(定数リストをテンプレート化するという目的上)cppファイルも増やしたくなかったし。
でもそう言われると悩んできますね…。
>>795 記法を変える必要は無い。定義を追加すればいいだけ。
797 :
789 :2006/09/24(日) 00:13:56
>>792-794 お答えありがとうございました。
渡す奴が悪いで法にすることにします。
確かC#とかだとテンプレート引数に制限かけれるんでしたよね。
C#触る機会があればまた考えることにします。
std::string::npos なんかの参照とったらどうなるんだろう? と思ってやってみたら普通に通る。ちゃんと定義が置いてあるみたい。 と思って libstdc++ のソース見たらクラス内で -1 で初期化したうえで、 クラス外に初期化子の無い定義が書いてあった。 めんどくさいけど、これが正解なんだろう。
参照取るのを禁止/防止する方向はダメなのか
800 :
763 :2006/09/24(日) 01:02:52
>>796 言葉足らずでしたね…。
記法を統一というのは、使用箇所に単項+を追加するという方の意味です。
ていうかもしかして
>>796 のは
>>798 のことを言っているのかな。
cppファイルが増えるのはいやだけど、
const&に渡せる上にswitch文にも使えて(定数としての性質を失っていない)
一番理想的な動作をしますね。(こういう書き方できたんですね…)
というわけで
>>798 の方法を取ることにします。
>>799 STLのクラスに渡していたりするので無理。
>>800 元が template なら、定義も template になるから cpp は増えないでしょ?
802 :
763 :2006/09/24(日) 02:14:03
>>801 定数リスト用のクラス自体はtemplateじゃないのです。
定数リスト用クラスをテンプレートのパラメタとして与えるというお話。
定数リスト用のクラスもテンプレートにしちゃえ。
804 :
ららら :2006/09/24(日) 03:40:46
で、どうしたら解決するのらー?
template<template <typename > class VEC,typename C> void Multiply(VEC<C>* vec,typename C::ValueType a) {} これでいいんじゃね?
>>804 標準では合法なコードなんだから、このスレで話すことはもう無い。
VCスレにでも逝ってくれ。
807 :
デフォルトの名無しさん :2006/09/24(日) 13:30:15
16の倍数に切り上げるにはどうすればいいですか? たとえば 15 -> 16 16 -> 16 17 -> 32 みたいな感じです。切り捨てるには n = n / 16 * 16でいいのですが…
(n+15)/16
>>807 n = (n + (16 - 1)) / 16 * 16;
810 :
807 :2006/09/24(日) 13:42:49
>>809 できました、ありがとう!!
でもなんかダサいっすね
((i-1)/16+1)*16 これなら0値でも16になるぜ!!
812 :
デフォルトの名無しさん :2006/09/24(日) 14:12:06
参考書に載ってたサンプルプログラムを打ったのですが
↓
http://mitty.jp/up/src/up1962.cpp プログラムの
pwork = pchar = new char[size + 1];
の部分で、pcharとpworkにメモリ割り当てをしているのはなんとなくわかるんですが
Cの時はmallocの戻り値がvoid*型なのでキャストして、一つのポインタ変数に
一つずつメモリをわりあてていたのですけど
C++では、まとめてメモリをわりあてることができるのでしょうか
あと、本では、pcharしか解放してないんですが、pworkの方は解放しなくて良いのでしょうか
それと、蛇足ですが、このような知識が手に入るC++の読むべき本てあるのでしょうか。
最後の本については、スレ違だと思いますので、できれば、前者のnewにかんする部分を
教えていただけないでしょうか
>>810 n = (n + 15) & 0xfffffff0;
>>812 「土地を取得して、その住所をpwork君とpcharさんに教えてあげた」
ということ。
確保されたのは new char[size + 1]; だけ。
pworkとpcharは同じ場所を指している。
>>812 それをmallocを使って書いたらpwork = pchar = malloc(size + 1);になる。
ただ代入演算子を並べているだけ。
816 :
810 :2006/09/24(日) 14:37:59
>>813 かっこいいです!
使わせていただきます。
その他の人も本当にありがとうございました
>>816 さらに2のべき乗以外の丸めができないし
コメントつけても「(本当に大丈夫か?)…ああ、大丈夫だ」と逡巡すると思われ
止めておけ・・・忠告はしたからねっ!
>>813 nが32bit integerじゃないと破綻する。
n = (n + 15) & ~15;
3点だな
822 :
(^-^) ◆MONSOON/qo :2006/09/24(日) 16:49:46
整数、小数を含めて上位5桁で6桁目を四捨五入するにはどうしたらいいですか?
>>822 それ言語に寄らない機能モデルだよね
そしてそれくらいなら小学校で習うことだよね
というわけで
つ たのしい算数
824 :
(^-^) ◆MONSOON/qo :2006/09/24(日) 16:57:01
>>823 桁数が多い場合でもループ使わずに出来ますか?
>>824 なんでループが必要になるのかがわからん。
とりあえず一通り算数を学んでからコードを書いてみろ。
自分で書く前に人に聞くな。
書いた後で相談する時は、スレを適切に選んでソースを貼れよ。
>>824 その機能モデルと、機能の実体を中途半端に混ぜるのはやめておいたほうがいい
そもそもループ使うかどうかなんて決まってないじゃんか
ついでに言えば進数もわからないし
頭にある前提条件を残さず書き下してから、そういうのを考えようね
827 :
(^-^) ◆MONSOON/qo :2006/09/24(日) 17:05:19
101.206なら四捨五入して101.21 0.0350119なら四捨五入して0.035012 とかです 有効桁5桁を残して四捨五入するということです
連投スマソ(*_ _)人 exeが一瞬ってのは実行したら 一瞬Hello World!ってでてプログラムが終了してしまう・・ Developer使って実行したらちゃんと閉じる押すまで閉じることはないんだが なぜなんでしょうか。。。?
>>831 (;゚д゚)ァ.... どうも、スレ汚してすみませんでした。(_ _(--;(_ _(--; ペコペコ
あと、URL d(゚Д゚)☆スペシャルサンクス☆( ゚Д゚)b
833 :
(^-^) ◆MONSOON/qo :2006/09/24(日) 17:24:18
>>829 printf("Hello World!\nキー押してね");
int a=getchar();
に変更してみて
>>833 いい加減に「スレ違い」というものを覚えろカス
カスがそんなこと覚えられるわけないじゃん。 カスに向かって説教するのがどれだけ無駄か理解しろ。
親クラス Oya のポインタ oya** に、それを継承して作ったクラス Child をnewで割り当てるって出来ませんか? 動的に配列を割り当てたいんですけど oya = new Child*[n]; for(int m = 0;m < X;m++) oya[m] = new Child[X]; とやればできるのかな?と思ったらコンパイル出来なかったんです。 oya = new Child*[n]; for(int m = 0;m < X;m++) oya[m] = new Child[X]; ならコンパイルはできたけど、当然エラーでました(当たり前ですよね) 多分、やり方が悪いだけできっと何かしら方法があると思うんです ご教授願えませんでしょうか?お願いします
あ、すいません。下のほう間違えました oya = new Oya*[n]; for(int m = 0;m < X;m++) oya[m] = new Child[X]; とやったらコンパイルは出来たっていうのが正しいです。打ち間違えてすいません
>>837 相談するときはエラーの内容を忘れずに。
841 :
ららら :2006/09/24(日) 18:18:56
>>778 779 804 805 806
お返事ありがとうなのらー。
たしかに VC7.1 のバグっぽいのらー。
仕方ないのらー。。。
842 :
763 :2006/09/24(日) 18:20:14
>>803 なるほど。そういう考え方もアリなのですね。
>>827 有効桁数は数値からは分からないよな、したがって有効桁数と数値の組を扱わなくちゃならない
(10と10.00000000000の違い)
まぁ、ここまでくれば問題ないとおもうので略
>>839 oya = new Oya*[n];
for(int m = 0; m < n; m++)
oya[m] = new Child[X];
でいける。
845 :
(^-^) ◆MONSOON/qo :2006/09/24(日) 18:32:29
>>843 普通の意味のとは違うんです
その数字が、数字として意味を持つ上位5桁ということです
>>840 エラー内容ですが、VC++(環境依存で申し訳ないですが)だと、
メモリ0x00373164でハンドルされていない例外が発生しました。:0xC0000005 場所 0xffffffffを読み込み中にアクセス違反が発生しました
と出ます
このとき、変数の状態を見てみると、oya[0]にはChildクラスのオブジェクトが割り当てられており、本来はoya[0][0]にChildクラスが割り当てられていて欲しいのですが、そうなっていなくて、oya[0][1]へアクセスしようとすると失敗するようです
>>844 そのやり方でできなかったのでご相談しているのですが・・・
ひょっとして、これって一次元配列のやり方として正しいっていうことでしょうか?
さっき配列とだけ書いたので良くなかったですね
僕がしたいのは二次元配列として扱う場合なんです
>837 無駄に解りにくいな。 要するに class Child : public Oya だとしても Oya *oya = new Child[X]; はやっちゃ駄目。 配列をポリモーフィックに扱うな
>>847 まとめてくれてありがとうございます。
配列を扱ってはいけないんですか?
理由がよくわかりませんが・・・
そういうことができるのがオブジェクト指向だと思っているのですが・・・勘違いでしょうか?
>>848 いい加減にしろ
うざいんだよ
入門書読み直せ糞がき
>848 array[i] = *(array + i) ポインタの加算 sizeof(Oya)とsizeof(Child)
>850 なるほど。そういうことだったんですね ん〜・・・ そうなると、こういう風に二次元配列で派生クラスがいろいろ並んでいる状態を作るってC++ではできないんですか? Javaだと普通に出来たので、C++でも出来ると思ったのですが
>851 ポインタの二次元配列を使え。Java だって参照使ってるんだから同じことだろ?
853 :
812 :2006/09/24(日) 19:35:49
>>814 さん
>>815 さん
わかりやすい説明ありがとうございました
いままで、malloc()でpwork = pchar = malloc(size + 1);のような使い方
をしたことがなく、知識不足でした。
解釈がまちがってたらすいませんが、片方をdeleteしたら、両方のポインタ変数君の居場所
は無くなると思っておきます。
>>853 用語はちゃんと理解するようにしたほうがいいよ。
この先、本や他の人の話を聞いて勉強するためにも。
>>853 が「ポインタ変数君の居場所」をどういう意味で使っているかは分からないが、
ポインタとかポインタ変数というのが pworkと pchar。
ポインタのアドレス(ポインタがメモリ上のどこにあるか、つまり居場所)は &pwork, &pcharで得られる。
deleteで削除するのはポインタ変数の居場所(&pwork, &pchar)ではなく、
ポインタ変数に格納していた値が指す領域(= malloc()で確保した領域)。
>>812 の
>pcharとpworkにメモリ割り当てをしているのはなんとなくわかるんですが
これを見ると勘違いしているっぽいが、
mallocするかどうかに関係なく、pcharとpworkはサイズを持った変数としてメモリ上に存在する。
malloc()で確保した領域はこれらとは全く無関係の領域で、その領域の場所を
たまたまpcharとpworkに入れただけ。
絵を描いてみるといいよ。
855 :
854 :2006/09/24(日) 20:09:43
mallocとdeleteが混在してしまって余計な混乱を招いていたらスマンです。 書く必要ないと思うけど念のため。 mallocした領域はfreeで、newした領域はdeleteで解放して。
856 :
デフォルトの名無しさん :2006/09/24(日) 20:11:05
>>854 かまちゃだめだ。この人、おかしい人なんだからさ。
オ、オマエモナー
858 :
812 :2006/09/24(日) 22:58:57
>>854 さん
ご忠告ありがとうございます。
malloc()は、C言語で構造体で線形リストや、双方向リストを作るときに
構造体のメンバのポインタ変数に対してや、構造体ポインタにのみにしか使ってなく
まだまだ、経験知識不足でした。
もう一度C言語で抜けている知識を再確認して勉強し直します。
メモリッ!!アアアロケエタアアアアアアアアアアアアアアアアアアアアアアアアア!!
つ【3byte】
つ【512kB】
862 :
デフォルトの名無しさん :2006/09/25(月) 13:01:56
すいません。おしえてください。 char** pchar = new char*[3]; for (int i=0;i<3;i++) pchar[i]= new char[3]; とかで、ヒープに3×3の配列つくると、 pchar[0][0]〜pchar[0][2]は、連続するアドレスに領域確保されますが、 pchar[0][2]と、pchar[1][0]の間は、かなり空きが生じます。 このような空きは、やっぱり、ヒープ領域で非効率な無駄になっているのでしょうか。 別に9個の連続する配列つくっといて、そのアドレスを1次元配列のポインタに代入して 3×3の配列つくったほうが、効率的なんでしょうか。 普通はあんまり気にしなくていいものなんでしょうか?
よっぽどメモリが苦しい状況で無い限り気にしない。 それよりも分かりやすさ/読みやすさを優先する。 俺は。
空きがどうとかいう以前に、前者はポインタ3つ分(32bit環境でchar12個分)メモリが余計に必要なわけだが。
866 :
862 :2006/09/25(月) 13:16:17
>>865 実際のプログラムでは、配列はcharでなく、ポインタ40byteくらいのオブジェクトになります。
打つのミスりました。 実際のプログラムでは、配列はcharでなく、40byteくらいのオブジェクトで、 40×250くらいの配列になります。
別に9個の……ってこういう事? char** pchar = new char*[3]; pchar[0] = new char[9]; for (int i=0;i<3;i++) pchar[i] = pchar[0] + 3 * i; たいていの場合、無視出来る無駄。好きにしたら。
869 :
862 :2006/09/25(月) 13:31:01
スタック領域が一杯一杯になって、ヒープ領域に持ってったんで、ちょっと神経質になっていました。 ヒープならあんまり無駄を気にすることもないんですね。 みなさんのご意見参考になりました。 ありがとうございました。
そんなに心配ならchar *p = new char[3 * 3];として、 p[0 * 0] ~ p[3 * 3]とアクセスすることにすればいいだろ。
確かにp[3*i+j]でアクセスすればいけるですね。 でもさすがにそれだと読みにくさが勝るですね。
template < typename T > inline T & at(T * p, int len, size_t i, size_t j) { return p[i * len + j] ; }
template<typename T> class array_adapter {
template<typename T> class array_adapter { public: T *operator[](int i) { };
template<typename T,int X> class array_adapter { T *array; public: array_adapter(T *a) : array(a) {} T *operator[](int i) { return array + X * i; } };
876 :
862 :2006/09/25(月) 14:41:00
template って便利そうですね。 勉強してきます。
世にも奇妙な世界へようこそ
お勧めの参考書は
>>8
878 :
デフォルトの名無しさん :2006/09/25(月) 23:39:13
C++でO/Rマッピングを使いたいのですが何かツール知りませんか?
質問。例外仕様ってどうやって使ってる? 今までデストラクタやswapにthrow()と書いていたんだけど、 unexpectedするだけでさほど意味ないんじゃないかと思うようになって。
880 :
デフォルトの名無しさん :2006/09/26(火) 02:06:30
初めまして、インターネットを通じる以外にコンパイラー等を 手に入れる方法はございませんか?? 参考書等についていたりしませんか?? そういった参考書をお知りでしたら、教えてください。どうかお願いします。
881 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 02:11:40
>>880 本屋で探せば見つかるだろうけど
ネットを開通した方が安いし困ったときも便利
882 :
880 :2006/09/26(火) 02:27:37
>>881 お勧めのサイトありますか??
もう一度がんばってみたいです。
ここで、これを諦めたらだめな気がします。
883 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 02:31:57
884 :
880 :2006/09/26(火) 02:34:26
>>883 この中のvisual C++でいいのですか??
885 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 02:38:38
>>884 それでいいけど
書籍を購入する程度の入門レベルだと
BCC Developer(とボーランドc++)がお勧めだよ
aoe
887 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 02:40:51
888 :
880 :2006/09/26(火) 02:55:26
>>883-887 やはりできませんでした・・・。cpadもどこなのかわからないし・・・orz
なんでだろう・・・。本買って始めた方が効率よさそうです・・・。
883にはってある物はどうやってうごかせばいいのですか??
889 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 02:57:34
>>887 の方が簡単だって
ちょっと待ってて直リン貼り付けるから
890 :
880 :2006/09/26(火) 03:00:02
891 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:00:24
おぉぉっばかがふたりになったっ
893 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:04:55
894 :
880 :2006/09/26(火) 03:11:46
>>891 ただいま、デスクトップにすべてインストールいたしました。
この次はどうすればいいですか??
895 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:13:09
>>894 ダウンロードしたって事?
そのあとfreecommandlinetools2.exeなどをクリックして実行
896 :
880 :2006/09/26(火) 03:15:00
freecommandlinetools2.exeのインストール先はそのままでいいのですか??
897 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:16:09
>>896 そのままでいいけど
問題があれば変更も可
898 :
880 :2006/09/26(火) 03:20:26
>>897 解凍?できました。
次は何をすればいいですか??
899 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:21:52
>>896 bccdev1221.lzhは解凍して
c:\Program Filesの中にディレクトリ付きで入れる
そのあとBccDev.exeを実行してツール→環境設定でコンパイラを設定すると完了
900 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:22:29
>>898 setbcc15b.exeまでいきましたか?
901 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:24:40
>>898 setbcc15b.exeを実行するとディレクトリの中にsetbcc.exeがあるはず
これを実行して指示に従ってください
902 :
880 :2006/09/26(火) 03:25:39
すいません、ディレクトリとは??無知すぎてすいませんorz
>>902 C++とかVBとかC#とかいう以前に、
PCのことある程度知らないとPCのプログラム書くのは無理。
904 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:31:42
>>902 ディレクトリ = フォルダ
黄色い書類入れのようなアイコンのやつです
905 :
880 :2006/09/26(火) 03:32:03
>>901 setbcc15bを実行し設定はそのままで実行しましたが
setbccはあったのですが、exeがついてませんがこれでよかったですか??
906 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:35:18
907 :
880 :2006/09/26(火) 03:38:31
>>906 これであとはBccDev.exeとやらを実行すればいいのですか??
あと、こちらのファイルはどこにありますか??
今更BCC薦めんのってどうよ。
909 :
880 :2006/09/26(火) 03:46:43
この流れは何?
911 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:47:18
>>907 最後にbccdev1221.lzh
(WindowsXPならクリックすると中が見られるはず、違うなら解凍ソフトが必要)
を解凍して
>>899 の通りに設定すれば完了
>>908 Visual C++2005はコードも(教科書にあるような)普通のが通らないし色々と難しい
912 :
880 :2006/09/26(火) 03:53:45
>Visual C++2005はコードも(教科書にあるような)普通のが通らないし色々と難しい この前提がそもそも間違ってる気がするんだがどうよ。 具体的にどんなコードが通らないんだ。 どの本のコードが通らないかがわかるだけでもいいぞ。
914 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 03:58:54
>>912 そう、
そしてツール、環境設定、コンパイラの所を
C:\bcc5.5\Bin\bcc32.exe (フォルダが違うかもしれないけど)に設定すればOK
915 :
880 :2006/09/26(火) 04:03:02
>>914 なんとか環境設定まではできたのですが
今まで使っていたものと違うのですが
どこに文字というか、言語をうてばいいのですか??
916 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 04:03:37
>>913 ↓これが通らん
#include <stdio.h>
main(){
printf("Hello World!\n");
}
fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?
917 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 04:07:20
>>915 ファイル→新規作成→プロジェクト名を適当につける→
再び、ファイル→新規作成→
C/C++ファイルのファイル名で****(適当なファイル名).cpp
を入れてOK
>>916 まあ、VSのIDEのデフォルトの設定でやると自動的にプリプロセッサが有効になるので通らんな。
というかそのコードはC++として通らないけど。
いくらCでおkったってそういう暗黙の了解の下に成り立っているコードは嫌いだ。
どうみてもスレ違いっつーか鼬害です。
920 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 04:11:26
921 :
880 :2006/09/26(火) 04:19:50
>>920 ほんとなにからなにまでありがとうございました。
あと、スレ違いでしたら本当にすいませんでした。
しかしいつも通りHello,worldを実行しようとしたらエラーがでてしまいましたorz
チャットとして使うなよ こんなのまでログに残すのか?
そういう時はエラーの出たソース、エラーの内容、使ってる環境、その全てを書くんだ。 情報を小出しにしてはいかん。 大抵の場合、見る人が見れば一発でわかるエラーだったりするもんだ。 そんなんで蹴躓くなんてもったいないだろう? スレ常駐のベテランの手を借りるんだ。 あの変なコテはベテランじゃねーっぽいので放置の方向で。
だからここは初心者向け開発環境構築スレじゃねぇって。
925 :
880 :2006/09/26(火) 04:45:03
#include <stdio.h> int main(void) { printf("Hello, world"); return 0; } エラー F1009 c:\documents and settings\\my documents\0\a\aa.cpp: 入力ファイル 'c:\documents and settings\\my documents\0\a\aa.cpp' をオープンできない *** 1 errors in Compile *** ** error 1 ** deleting Debug\aa.obj Compile End !! (Elapsed time 0:00.078) 環境はBCC Developerです。 えっと・・すいませせん。なんででしょうか??
>>880 今は1から10まで全部教えて貰って、やっとの事で環境構築したわけだが。
たかが環境構築で躓く段階で、何も調べる能力が無いことが明らか。
断言してもいいが、このままじゃおまえさんは何も出来はしないぞ。
インスコしたbccだって無駄になるだけだ。
自分の作りたいものに関して、1から100まで全て他人に質問して済ませるつもりか?
927 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 04:50:54
単にユーザ名入ってたのを手で消したってオチと違うのか。
929 :
880 :2006/09/26(火) 04:55:31
>>926 最初から1〜10まで教えてもらっていたわけではありません。
最初はいろんなホームページを探し回って、きときとさんだったかな??
そのcpadつかっていろいろやってましたが、
途中からエラーがとまらなくなって
また新しくインストールしようと思ったらできなくて
どうしたらいいかわからなくなっていたのでorz
すいません。
930 :
880 :2006/09/26(火) 04:57:05
>>928 そうです。書き込むのにさすがに本名入ってるのはどうかと思いまして・・・
931 :
(^-^) ◆MONSOON/qo :2006/09/26(火) 04:59:40
>>930 日本語が入ってるとBCCがコンパイル失敗する模様
日本語が入ってない場所に保存するとOK
ファイル→新規作成 で日本語でないディレクトリ名に変更する
スレ間違えたかとおもた
なんかwww
BCCスレなり何なりに誘導すればよかったんじゃね。
>>929 >921で過ちに気付きながら何故未だ居座る。いい加減、BCCスレなりに逝け。
>>931 おまえもだ、この馬鹿珍。
コンテナの標準のイテレータと少し挙動の違うイテレータを定義しようと思っています。 イテレータクラスを定義する為のテンプレートって用意されているのでしょうか? また独自のコンテナもどきのライブラリを作ったときにイテレータを用意する為に 使える便利なテンプレートってあるのでしょうか?
>◆MONSOON/qo >◆MONSOON/qo >◆MONSOON/qo >◆MONSOON/qo >◆MONSOON/qo
>>936 boost::iterator_facade, boost::iterator_adaptor
本当に何も頼らず1から作るならstd::iterator。最低限必要なtypedefをしてくれるだけ。
新着レス 60 _, ._ ( ゚ Д゚)? >◆MONSOON/qo >880 >◆MONSOON/qo >880 >◆MONSOON/qo _, ._ ( ゚ Д゚)…
新手の荒らし
いまさら BCC とか言ってる時点で…
一年ぐらい前から◆をNG登録してある俺が賢い
釣り自演だから相手すんな
boost::shared_ptr等のスマートポインタで if( sp ) { … } と書けるように operator bool() や operator unspecified_bool_type() としているようですが このunspecified_bool_typeがメンバ関数のポインタなのはなぜなのでしょうか? あと、VC++ではoperator unspecified_bool_type()の方が使われましたが operator bool()でも同じことが出来るようです。 operator unspecified_bool_type()を採用する理由はなんなのでしょうか?
>>944 (1 + sp) がコンパイルできたら困るだろ。
>>945 あ、なる。そういう理由だったんですか。
ありがとうございました。
>>938 有難うございました。
これで自作コンテナクラスもどきも
一人前にイテレータを持つことができます。
立派になったもんです。
948 :
デフォルトの名無しさん :2006/09/26(火) 20:50:54
class A { public: A(){}; }; A *a = new A(); A *b = new A; この違いってありますか?
ない
A()は関数かと思われちゃう事があるね
ねーよw
953 :
952 :2006/09/26(火) 21:55:07
間違えた。 ×:A A(); ○:A a();
>>950 たしかコンパイラがそんな感じの間違いをすることがあるっけ。
>>948 組込型なんかでは0初期化をするかどうかという違いがあったはず。
コンストラクタで初期化がないクラスのメンバにも同じことが適用された気がする。
958 :
デフォルトの名無しさん :2006/09/26(火) 22:54:22
なんかパソコン初心者から、C++詳しい人まで色々いるな でも、この雰囲気好き。 偉そうな文体で、「それくらいしっとけ」みたいな書き込みばっかりで 肝心な質問に対しての答えをかかない、別スレとは大違い。
どこの誤爆だ
>>955 >>948 の場合は(クラスなので)違いはないが(クラス以外だと
>>957 )
A a; // A型のオブジェクトaの宣言(と定義)
A a(); // Aを返す引数なしの関数aの宣言
のような全く別のものなので、newする時の感覚で常に()をつけていると
(特に他言語から入った人が)たまに間違えたり、
コンパイルエラーが出たりする、ということを言いたいのでしょう。
ぇ?違いあんの?
>>957 が言ってるのは
class A
{
int i;
};
A *a = new A(); or A;
でiが0初期化されるとか?
962 :
957 :2006/09/27(水) 00:28:23
>>961 そのこと。もし勘違いだったらすまんな。
963 :
デフォルトの名無しさん :2006/09/27(水) 00:29:52
VC++6.0 MFC(ダイアログベース) 下記のソースコードを実行しても ファイルがカキコミできません。 どなたか、ファイルが書き込みできない理由を 教えてください。 void CXfile_MotionReaderDlg::OnButton1() { CFileDialog *dlgFile; dlgFile = new CFileDialog( TRUE, // 種類 TRUE : FileOpen _T("jpg"), // デフォルトの拡張子 _T("*.jpg"),// 初期ファイル名 OFN_FILEMUSTEXIST, // ダイアログの設定フラグ:既存のファイル _T("Wave(*.jpg)|*.jpg|全て(*.*)|*.*||")// フィルタ ); if(dlgFile->DoModal() == IDOK) { CStdioFile fout( "file.text", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ); fout.WriteString( dlgFile->GetPathName() ); fout.Close(); } delete dlgFile; }
>>963 多分、カレントディレクトリがCFileDialogのダイアログを操作したことで移動してる。
どっかのディレクトリに"file.text"が出来てると思うよ。
965 :
964 :2006/09/27(水) 00:46:26
966 :
879 :2006/09/27(水) 00:53:48
967 :
デフォルトの名無しさん :2006/09/27(水) 01:10:14
質問です。XP、VC++ 2005 です。 std::string の c_str() に関してです。 --------------------- std::string str = "hogehoge"; WNDCLASSEX wcex; wcex.lpszClassName = str.c_str(); ……(中略) RegisterClassEx(&wcex); 上記のような内容で、RegisterClassEx に失敗しました。 ところが、str の内容を変更するだけで、登録に成功したりしなかったりします。 そこで私は、c_str() で渡されたポインタが RegisterClassEx の段階で有効である保証がなく、 上記のような渡し方は間違っている、とのように考えました。 解決法として、char 型の配列に一旦文字列をコピーしています。 ところが、API に string を渡すときなどは、 HogeHogeAPI(str.c_str()); などのように、c_str() の戻り値を直接渡しているサンプルをよく見かけます。 この場合は、返されるポインタが有効であることは保証されるのでしょうか。 また、最初の例のような場合は、char の配列などにコピーする方法は正しいのでしょうか? よろしくお願いします。
>>967 string インスタンスが生きてて、変更を加えない限りは有効。
有効なうちに API に渡していれば、 API が内部でポインタを
保存するような仕様でない限り、問題無い。 char 配列へのコピーは不要。
RegisterClassEx() が失敗した原因は GetLastError() で調べるように。
>>967 その辺りは、APIの実装に大きく依存することになるので詳細はAPIスレでどうぞ。
要は、そのAPIが必要としているものは何かが微妙に異なるのだろう。
970 :
967 :2006/09/27(水) 01:29:13
>>968-969 GetLastError() を行うことを失念していました。
よく分かりました、ありがとうございます。
971 :
デフォルトの名無しさん :2006/09/27(水) 10:16:42
VisualC++6.0とEasyLinkLibraryでDirectXを使って簡単なプログラムを作っています しかし、プログラムを実行する方法が VisualC++の開発画面上でコンパイルする方法しか解りません Windows上でアイコンをクリックして普通のアプリケーションとして起動させるには どうすればいいのでしょうか?
973 :
デフォルトの名無しさん :2006/09/27(水) 12:21:46
c++とマスキャドってどっちがすぐれてますか?
パッキャラマドの方が優れてます
もしかして:バッキャマラド
Au pas camarades Au パが正解な気がする
それ、何語?
フランス語っぽい。
>>978 もしかしなくてもフランス語、
僕の大好きなクラリネット〜♪
って曲の歌詞の一部
ご幼少のミギリから疑問だった どういう意味?
pas 名詞: 踊り 助動詞: 否定 camarade 名詞: 仲間
直訳すると、「仲間と足並みを揃えて・・・」位の意味になるのか。
Altavistaによる英訳 I like onion fried with oil I like onion when it is good. I like onion fried with oil I like onion when it is good. I like onion fried with oil I like onion when it is good. I like onion fried with oil I like onion when it is good. With the step comrades, the step comrades, the step, the step, the step! With the step comrades, the step comrades, the step, the step, the step! With the step comrades, the step comrades, the step, the step, the step! With the step comrades, the step comrades, the step, the step, the step! One will bore the side to them One will bore the Rantanplan side to them draws lira Rantanplan One will bore the side to them Which we will laugh
つーか980過ぎたじゃん。次スレをそろそろ・・・・
タマネギかよ!!!! タマネギなのかよ!!!!! あれほど大騒ぎしたその結末が、 タマネギなのか!!!! もう、絶望した。
どこかに任意のタイミングでファイルオープンとファイルクローズが出来るデバックツールってないですかね? CreateFileとかCopyFile等の動作チェック用です。 自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので、探しています。 よろしくおねがいします。
ちょw まあいいか、お疲れ様です。
埋め
埋め
埋め
埋め
埋め
埋め
斜視
埋め
埋め
埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。