おぃおぃ、なんか違うんじゃ?
3 :
デフォルトの名無しさん :02/12/31 19:11
Java・・・
┌──────────────────────―─―┐ │ | │ | │ | │ | │ _@◎@ | │ ( ・∀・) | │ ( ) | │ | | | | │ (__)_) | | finalize Cplusplus | │ | │ C++相談室part14 を終了しています… | │ by Gosling | │ | | | | | └───────────────────────――┘
finally { System.exit(-1); }
6 :
デフォルトの名無しさん :02/12/31 20:13
C++ってJAVAのことだったんですね!!
#include <iostream> class base_out { void println(String s) { cout << s << endl; }; } class base_System { base_out base; } base_System System; main(){ System.out.println("abc"); // こんな感じ? }
そうです。
>>7 こうでは?
#include <iostream>
class base_out {
void println(String s) { cout << s << endl; };
}
class base_System {
base_out out;
}
base_System System;
main(){
System.out.println("abc"); // こんな感じ?
}
あけおめことよろ~! shared_ptr, scoped_ptr, weak_ptr のある C++ 最凶! 安部零滋プログラマの糞Javaラーさんは黙っててね♪ 低レベルは C++, 高レベルは C# でこれからの世界は廻って行くのよ!
#include<iostream> struct { struct { template <typename T> void println(const T& t) { std::cout << t << std::endl; } } out; } System; int main() { System.out.println("あけおめ"); }
12 :
デフォルトの名無しさん :03/01/01 11:37
超低レベルな質問をさせてください。 placement newは予め静的に確保したメモリにオブジェクトを構築すると 思うのですが、だとしたらplacement deleteの役割って何ですか? 静的に確保しているのだから、メモリを削れないと思うのですが。
>>12 メモリを解放せずにオブジェクトを解体するんじゃな~い?
配置newは同一のメモリチャンクから何度も領域を確保できないのか。 わからなくなってきた。 class A { int i; public: A(int j) : i(j) {} void func() { std::cout << i << std::endl; } }; int main() { char arena[1024]; A *a[10]; std::cout << std::hex << reinterpret_cast<int*>(arena) << std::endl; for (int i = 0; i < 10; i++) { a[i] = new(arena) A(i); std::cout << std::hex << a[i] << std::endl; } for (int i = 0; i < 10; i++) { a[i]->func(); delete a[i]; } }
15 :
デフォルトの名無しさん :03/01/01 16:22
delete (´∀`);
本当にこれを使うの?
>>14 あけましておめでとう!新年早々、糞コードを目にしちゃって鬱。
嫌なら立てろヴぉけ
( *´Д`) ナニ・・・
何だろう・・・
スマソ、やってみたかったんだ…
何でだろう?
24 :
デフォルトの名無しさん :03/01/01 18:13
厨な質問ですみません。 C++でObjectPascalの try .. finally .. end と同じことをやりたいんですけど、 どのように記述すればいいのかわかりません。 おしえてください。
恥ずかしい質問なんですが、誰か教えて下さい。 extern って、なんで必要なんですか?スコープ越えるだけ? いまいち本を読んでも理解できないので....。
うあっ・・・恥ずかしー
キャッ、ハズカシ(-ノノ)
try .. finally .. end … わからん(・∀・) try {} catch () {}しかないよ
本当に? C++つかえないね。
31 :
デフォルトの名無しさん :03/01/01 18:46
//hoge.c int hoge; //piyo.c extern int hoge; //foobar.c static int forbar;
>>31 これって...
「piyo.cで使用する"int hoge"は、外部(hoge.c)で定義されたものと同一です」
って意味ですか?
じゃ、"foobar.c"の"static int forbar"は何の関係が??
>>32 31 じゃないけど,typo では?
// foobar.c
static int hoge;
この static を外すとリンカが「hoge.c にも int hoge があるやん!」と
ストライキを起こします。ていうか C++ 特有の話じゃないので sage。
>>29 try .. finally .. end は、
メモリ動的確保;
try
いろいろ;
finally
メモリ開放;
end
のように記述することで、「いろいろ」を実行中に例外が発生したり break などで
処理をジャンプさせたりしても、必ずメモリ開放を実行することを保証する、という
用途で使います。
べつにメモリ確保/開放に限らず、後始末が必要な処理では全般的に用いますが。
で、同じようなことをC++でやりたいんですけど、どうすればいいのかな、と思ったのです。
Borlandコンパイラでは __finally という独自の拡張がありますが、一般的にはどうすれば
いいのでしょうか?
ちなみに
>>30 は私ではありませんのであしからず。
mannko
>>34 なんとなくわかりました、ありがとうございました。
って、ここって良く見たら "C/C++相談室"ではなかったですね。
..失礼しました。(重ね重ね、恥
>>35 > 一般的にはどうすればいいのでしょうか?
スマートポインタって知ってる?
少なくとも
>>35 に書かれている動作のためには、try..finallyより(以下略
>>24 クラスを巧く使うのが C++ のやり方。その究極形が
>>38 さんの提案したスマートポインタ。
とりあえず私が確認できた限り VC++5.0 には __try .. __finally があるんだけど,
g++ 3.2 にはそれっぽいのがないっぽいし,やっぱしこのあたりの互換性を
考えたい場合にはオススメできないっすかね。。。
int func() {
Resource *r1=0, *r2=0, *r3=0;
struct Finalizer {
typedef Resource *Resource_ptr;
Resource_ptr &r1_, &r2_, &r3_;
Finalizer(Resource_ptr &r1, Resource_ptr &r2, Resource_ptr &r3):
r1_(r1), r2_(r2), r3_(r3) {}
~Finalizer() {
delete r1_;
delete r2_;
delete r3_;
}
} finalizer(r1, r2, r3);
r1 = new Resource();
if ( some_func() == FAILED ) return 0;
r2 = new Resource();
if ( some_func() == FAILED ) return 0;
r3 = new Resource();
return 0;
}
長文失礼。コンパイラ依存コードが混じってたらすまそ。
変な質問ですみませんが new int[0]ってした場合の挙動ってどうなるんでしょうか 何かがどうにかなってますか?
>クラスを巧く使うのが C++ のやり方。 Javaにもありますよ、finally。 C++つかえませんね。
delphiもjavaもよく知ってるけど、auto_ptrの方がよほどエレガント。 ローカル変数だけじゃなく、デストラクタでの書き忘れも心配ないし。 ま、どうしてもfinally形式を使いたきゃ、「スタックに置いたオブジェクトのデストラクタ」 で代用するのがいいかもね。
うを、auto_ptr理解しました。どうも。ちなみに
>>41 は偽者です。
確かにコード記述はスマートだけど、なんかfinallyの方がバイナリがシンプルで
処理が早そうな気がします。
言語使用としては両方サポートしてた方が望ましいのかな?
× 使用 ○ 仕様 失礼。
>>44 デストラクタで全部やる方法の利点は、再利用性と安全性。
| メモリ確保;
| try { do_something; }
| finally { メモリ解放; }
と決まり事のように毎回書く必要がなくなって、
| auto_ptr<> = メモリ確保;
| do_something;
で済む。メモリ確保の他にも、例えばロック操作もメンバ関数の頭に
| mutex_locker lk( my_mutex );
と一行だけ入れればよい、みたいにできて嬉しいね、とか。
もっと話を進めて、privateを上手く使えば、「↑のようなスタック上でのコンストラクタ/
デストラクタ方式でしかロックをかけられない」ようなライブラリも作れる。こうすると、
「利用者が相当頑張ってもロックを解放し忘れることが出来ない」レベルに安全な
ライブラリが作れたりする。
finally の利点は、そのブロックに特有の(おそらくは再利用なんてしないような)
終了処理を簡単に書けることだろうと思う。その手の機能を現在のC++で実現する、という
ScopeGuard
http://www.cuj.com/experts/1812/alexandr.htm?topic=experts という話もあったりするが、まぁ、その、結構使いにくい。
というわけで、finallyのみというのは論外だが、両方あったら便利かな? と言われれば
賛成できなくもない。が、finallyってfriend とかポインタとかと同じで乱用すると質の低い
コードだらけになるので、それを押さえる意味でfinallyが無い方がベターかも、と個人的には思う。
最終的な実行バイナリは、コンパイラの性能の問題であってあまり変わらんのでは。
>>44 > なんかfinallyの方がバイナリがシンプルで処理が早そうな気がします。
アセンブルコードで確認汁!
一般的には例外処理関連の機構は重くなりがちです。
デストラクタが必ず実行されるのも Java の ファイナライザと違う所で
C++ 使いと Javaラーの文化を大きく分けている部分であります。
49 :
デフォルトの名無しさん :03/01/02 00:29
catch(...) だとちょっと違うの?
>>49 catch(...)は例外が起こらないと到達しない。
finallyは例外が起こらなくても到達する。
漏れ的にはboost::shared_ptrの方がfinallyなんかより(・∀・)イイ!と思うけどね。
catchと__finallyは併用できないのか・・・・初めて知った。
>>12 newに伴って呼び出したコンストラクタが完了しなかった時に、
deleteが呼び出されるのがお約束。
で、operator newの各バージョンごとに、対応するoperator deleteが呼ばれるわけよ。
対応するってのは、引数並びで対応させるらしいんだが、
なんだかそこらへんでも、妙な事情があって妖しい物議をかもしたりするわけで、以下略とす。
sizeof の後に () が必要なのは仕様なんだっけ? VC++6は無くても通っちゃったけど G++ 2.95.3-5 はないとパースエラーだわ。 仕様書持ってる人おしえてくだちい。
sizeof type_nameは不可で sizeof object_nameは可能だったと思う。 仕様書読んだわけじゃないから、違ったらごめん。 俺は必ず()付ける人だし。
>>53 sizeof(型名) は () が必要。
sizeof(式) は演算子の優先順位に従って、要るときと要らないときと。
>>54 ,
>>55 なるほど、VC++ がチョンボしてたのね。
ありがとうございまちた。
57 :
デフォルトの名無しさん :03/01/02 09:39
struct A{ A(X* xa){} }; class X{}; int main(){ A a(new X); } とやったときのAのコンストラクタで引いているxaにXがnewされている と思うのですが、これってほっといてもメモリリークしませんよね?
58 :
デフォルトの名無しさん :03/01/02 09:43
ごめんなさい。当然リークしますね。
ところでこの糞スレいつまで使うつもり? 誰かまともなの立てたら?
60 :
デフォルトの名無しさん :03/01/02 10:54
C++用語としての「代入演算子」は substitution operator でいいのでしょうか? メリケンは意外と operator equals とか呼んでるとか?
assignment operator かな。
>>61 google った所、どうやらそのようですね。
ありがとうございました。
63 :
デフォルトの名無しさん :03/01/02 15:00
自作クラスで iosfwd みたいな事をしようと思ったんですが、 私は省略せずに名前をつける主義なのでちゃんとしようと思ったのです。 しかし、用語がよくわかりませんでした。 Forward-reference でしょうか? Forward-declaration でしょうか?
64 :
デフォルトの名無しさん :03/01/02 15:25
タイプライブラリの作り方ってここで聞いてもいいことですか?
>>64 まずはあなたの考える タイプライブラリ が何なのか小一時間説明してもらおうか。
66 :
デフォルトの名無しさん :03/01/02 15:50
拡張子がtlbの、#importで指定するやつ。 ひょっとしてスレ違い?
68 :
デフォルトの名無しさん :03/01/03 11:56
どこで聞けばいいの?
>>68 多分 .NET 系のスレでいいんだと思うんだけど、
もしかしたら COM 系技術の所かもしれない。
それ以外のタイプライブラリの話なら知らない。
とりあえずそっち系(MS系)行って聞けや。ここは完全なすれ違いだと思うで。
70 :
デフォルトの名無しさん :03/01/03 13:25
cstddef を include したけど size_t が std に入ってこないんですが これって正しいのでしょうか?(VC6)
俺のVC6も入ってないよ まあM$だし。
>>70 size_tはマクロだから、stdには入らないのでは?
>>72 普通の実装ではstd-namespaceにいれるためにtypedefしてます。
VCの標準ライブラリがおかしいのれす。
>>71 ,
>>72 レスありがとうございます。
ちょっと質問が曖昧でした。VC6 の動作として正しいのかどうかではなく
VC6 の振る舞いが標準 C++ として正しいのかどうか。を知りたかったのです。
VC++ の cstddef 内では、わざわざ _STD_USING マクロを #undef までして
無理矢理 std から外しているみたいなので…
(そこでヘッダを書き換えると cstddef との整合性が取れなくなって、
cstddef も書き換えると size_t が曖昧なシンボルになってたくさんエラー…)
<Cの標準ヘッダ.h> ではなく <Cxxxx> の形式を使った時は
size_t は std::size_t になるべきなのでしょうか?
malloc や free は? これらは全部 std::xxx になるべきなのかどうか。
仕様書はもってないし、ストラウストラップ本は
「サンプルの簡素な表記の為」に std:: をつけないという無茶苦茶な事をしてるし(これ聖典としては最悪だと思う)、
さっぱりです…。
>>73 そうですよね。見たところ wchar_t もでした。
(C++ では wchar_t は組込み型になったはず…たぶん)
VC.NET では直っているんでしょうか…あれは C はもう切り捨てたのかな…?
76 :
デフォルトの名無しさん :03/01/03 20:57
STLを使ったクラスを継承したのですが、 そのメンバ関数から親クラス(STL使用)の関数が呼べません。 class Ext : public std::map<CString, SOCKET> { public: virtual ~Ext(); SOCKET insert(CString& str){ SOCKET s = ... ; std::map<CString, SOCKET>::insert(std::pair<CString, SOCKET>(str, s)); <--ここでエラー return s; } } VC++6.0で静的メンバを呼ぶなというコンパイルエラーになるのですが、 記述として間違ってますか?
77 :
デフォルトの名無しさん :03/01/03 21:01
すいません。くだらない質問なんですが・・・。 doubleとかintとかの数値をstringに入れて表現するにはどうしたら? string str; double d = 3.3; int i 3; で str = "数値は" str += d; str += i; てできませんよね? charに変換してしまうんで。
sprintf
>78 C++風でもそんな感じですか?
strstreamというのがあったと思うけど よくわからない
漏れは ostrstream 使うけど。
ostringstreamに一票。
>>76 先生があれほど継承ではなくメンバシップを使いましょうと言ってるのに
まだわからないのですか?
>>76 ・構文的には間違ってない。
・VC6で通すには親をtypedefしといて…とかで、対処すると良い。
・そこで継承しないように。
>>77 stringstream か boost::lexical_cast<> で。
>>83-84 ありが㌧
うかつに継承すると漏れが遭ったようなエラーが出てくるわけか。
データメンバとして持つのが定石?
>>85 実装継承は is-a でなければ「ならない」場合にのみ使う
ライブラリ目的での継承はよろしくないと思う
(private継承なら可かもしれない)
>>74 そうです。mallocもstrcpyもprintfもみんなstd::に入るべきなのです。
そういう訳でVCは糞。
>87 糞というか、M$はそもそも仕様に合わせる気がさらさらないような気がする。
89 :
デフォルトの名無しさん :03/01/04 14:56
main(){ X xa,xb; xa=xb; } としたときの、xbがxaに代入される時のoperatorの書き方でいい方法ありますか? やっぱ、ムリ?
>>89 お前の言う「いい方法」って何?
フツウの代入オペレータとどう違うの?
91 :
デフォルトの名無しさん :03/01/04 15:06
operator=(){....}が普通。 これの逆をやりたいの。
>>91 逆って意味がわからん。
xa=xb;
をするとxbにxaの値がはいるってことか?
そうです!! まさしく「そういうこと」がやりたいんです。
>>91 演算子の結合規則はオーバロードできません。
>>87 前にも書いたんだけど、NULLは?
NULLはstd::に入れなくていいの?
誰か教えて~!!
>>91 X& op= (/*not const*/ X& rhs){
rhs.member = this->member;
}
>>95 ストラウ糞ラップは NULL の代わりに 0 を使えと布教してやがるからな。
おまいの仕事は空ポインタ null キーワードを C++ に入れることだと小一時間…。
>>96 ヴァカかてめえは
標準化してほしいならてめえがやれボケ
>>96 ついでに参照にnull突っ込めるようにしといてね。
>>97 0 == empty だと思ってるヴァカハッケソですか?
数値0 と 無 は別の概念だよ。
>>98 C++ の参照は常に有効なオブジェクトへの参照であることが保証されてるのがいいんじゃん。
それが嫌な時はポインタ使いなよ
>C++ の参照は常に有効なオブジェクトへの参照であることが保証されてるのがいいんじゃん。 たったそれだけの違いでポインタと参照分けるセンスが理解できないよ。 んなもん全部参照にして初期化保証付修飾子でもつけりゃ良かったんだよ。 クラスのインターフェース設計するとき、 コンストラクタで渡せるときは参照で、 着脱可能にしたいときはポインタでなんてかっこ悪すぎ。
>>99 馬鹿すぎて何も言う気がしない。
取り合えず頑張れ。
しつもーん。 namespace Z { class A; class B; } と先行宣言され、続いて class Z::A {・・・}; class Z::B {・・・}; と定義部が書かれているとします。 このとき、Z::BのメンバとしてZ::Aを持ちたいので class Z::B { A a; }; としたら、 bcc5.4では通ったのに、bcc5.6ではエラーになりました。 (もちろん、A a; ではなく、Z::A a; と宣言すれば通ります) どちらが正しいのでしょう? BがZ::にあっても定義部を::に書くようにした場合 Bのメンバ宣言時の名前解決に暗黙にZ::を参照する、これが正しいかどうかです。
>>100 そもそも C++ は C への比較的簡単な拡張として実装され、発展して
きた経緯があるから仕方ないって。いまさら言っても詮無き事。
逆にまっさらの状態から C++ を作ったら、たぶん見向きもされずに消
えたと思うけど。
>>95 std::NULLなんて書きたく無いなぁ。
あきらめて0と書くしか
105 :
デフォルトの名無しさん :03/01/04 19:24
インクルードガードってありますよね。 あれについての質問なんですが。 例えば、 a.h b.h というヘッダファイルがあるとする。 当然それぞれインクルードガードしています。 で、aa.cppでa.hをインクルード、bb.hでa.hとb.hをインクルードする。 オブジェクトファイルはaa.objとbb.objができ、 実行ファイルを作るなら最後に、aa.exeみたいなのができる。 この場合、a.hが一回だけ結合されてるのでしょうか? それとも、インクルードガードの効果ってオブジェクトファイルごとの 効果ですか?
追記ですが、 それぞれコンパイル、リンクていう作業ではなく VC等で、一気にビルドした場合の事です。
>>105 質問の意味がよくわからんけど
最終的にどのように結合されているかはmapファイルを生成させれば
わかるのでは?
C++のリンカはinline等でできる重複するコードを除去する機能がある、
というようなことをLinkers&Loadersで読んだような読まなかったような・・・
>>105 #includeは単に.hをテキストファイルとして.cppに展開するだけで、
オブジェクトの生成や結合とは一切関係ないぞ。
>>101 A「ねぇ、その箱の中には何が入ってるの?」
B「え、入ってるのは 0 だよ。」
A「0 が入ってる?意味わかんないよ、開けるよ?」
A は箱の蓋を開いた、しかし箱の中には何も入っていなかった。
A「何も入ってないじゃん? 0が入ってるってどういう意味?」
B「だから 0 が入ってるって言っただろ。」
>>107 >>108 ありがとうございます。
VC7でコンパイルエラーが出るときなんですが、
同じエラーが何行も続けて出るので、インクルード関係かと
思いました。
例えば、
;がありません
;がありません
;がありません
引数が間違っています
引数が間違っています
引数が間違っています
といった具合に、同じ行のエラーが同じ数ずつでます。
どういうことなんでしょう
>>110 #ifndef Hoge_h_INCLUDED // (1)Hoge_h_INCLUDED が定義されていない場合
#define Hoge_h_INCLUDED // (2)Hoge_h_INCLUDED を定義する
(3) 実装ファイルが「どんな事ができるのか、それはどんなサイズなのか」を定義
#endif // (4)もし(1) の時点で Hoge_h_INCLUDED が定義されているえば (2) と (3) を無視してここまでくる
ちゃんとガードできていれば一回のコンパイルで (2) と (3) には複数回到達しない。
>>112 やってるか、やってないか、ではなくね。
# 一回のコンパイルで (2) と (3) には複数回到達しない。
の意味はわかる?
一回のコンパイルでは到達しないが、
コンパイルを複数回すれば、それぞれのコンパイル時には重複して
到達する可能性があるのさ。
複数の .cpp なり .cc なり .c(←これはスレ違いだが) がある場合は
複数個のオブジェクトファイルを作る為に、複数回のコンパイルが
行われる(だろう。ビルドに使っているツールによるけど、普通はそう)。
結果、ヘッダ中の間違いが何度もエラーとして報告される可能性はある。
>>112 あぁ、なるほど。
てことは、やはり
ビルドしてると、多数のオブジェクトファイルができるから
インクルードガードしていても、何回も参照されて、組み込まれる
ってことでいいんですかね。
>>114 だいたい OK だけど。
> 何回も参照されて、組み込まれる
何回も参照されるけど、(通常は)何も組み込まれない(はず)。
ヘッダファイルには
「こういうものがありますよ。これを前提にオブジェクトコードを作ってね。」
という情報しか含まれるべきではない。
コンパイラ依存だと思うし、今後はうまく処理してくれるコンパイラが増えると思うけど、
ヘッダファイルに実装を書くとリンク時に
「たくさんのオブジェクトファイルに同じものが入ってるんですけど、
どれを使えばいいかわかんないっす。」
というエラーになるのが基本だ。
116 :
デフォルトの名無しさん :03/01/04 21:59
117 :
デフォルトの名無しさん :03/01/04 21:59
すみません、質問です。 1 == 3 とか 1 == 1 の結果って1か0で返ってくるんじゃないんですか? それとも偽は0だけど真のときは0以外ならなにが帰ってきてもいいの?
> それとも偽は0だけど真のときは0以外ならなにが帰ってきてもいいの? Cの仕様ではそうなんじゃないかな。C++も互換性のためにそうだろうよ。
119 :
標準マクロ一覧 :03/01/04 22:07
offsetof( ARG_1, ARG_2 ) CHAR_BIT INT_MAX LONG_MIN SCHAR_MIN UCHAR_MAX USHRT_MAX CHAR_MAX INT_MIN MB_LEN_MAX SHRT_MAX UINT_MAX CHAR_MIN LONG_MAX SCHAR_MAX SHRT_MIN ULONG_MAX DBL_DIG DBL_MIN_EXP FLT_MIN_10_EXP LDBL_MAX_10_EXP DBL_EPSILON FLT_DIG FLT_MIN_EXP LDBL_MAX_EXP DBL_MANT_DIG FLT_EPSILON FLT_RADIX LDBL_MIN DBL_MAX FLT_MANT_DIG FLT_ROUNDS LDBL_MIN_10_EXP DBL_MAX_10_EXP FLT_MAX LDBL_DIG LDBL_MIN_EXP DBL_MAX_EXP FLT_MAX_10_EXP LDBL_EPSILON DBL_MIN FLT_MAX_EXP LDBL_MANT_DIG DBL_MIN_10_EXP FLT_MIN LDBL_MAX EXIT_FAILURE EXIT_SUCCESS va_arg va_end va_start( ARG_1, ARG_2 ) setjmp( ARG ) CLOCKS_PER_SEC SIGABRT SIGILL SIGSEGV SIG_DFL SIG_IGN SIGFPE SIGINT SIGTERM SIG_ERR assert( ARG ) EDOM ERANGE errno WCHAR_MAX WCHAR_MIN MB_CUR_MAX LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME HUGE_VAL RAND_MAX BUFSIZ FOPEN_MAX SEEK_CUR TMP_MAX _IONBF stdout EOF L_tmpnam SEEK_END _IOFBF stderr FILENAME_MAX SEEK_SET _IOLBF stdin
結構知らないのがいっぱいあるもんだな。 うっかりかぶったらハマりそうだ。 BUFSIZとか。
あ、120名前間違えた。
>>117 0が偽で、非0が真、として扱われるのは確かだが、
ユーザー定義でない == とか < とか >= とか ! とかの結果は常に 0 か 1。
>>122 それって仕様ですよね、確か。
マ版の人がそんな仕様はないと断定してるんですが・・・
昔のコンパイラが、真を1以外で返してたとかいう 歴史があるんじゃないかな。 つか == 等の結果が 0 or 1 っていつ頃からの仕様だっけ? 以前はそうじゃなかったような・・・ まさかC99とか言わないよねえ
C++ならC++98の最初から > 5.9 Relational operators > 7 ...(略)... The operators < (less than), > (greater than), <= (less than or equal to), > and >= (greater than or equal to) all yield false or true. The type of the result is bool で、 == とかは略すけど同様で、 > 4.5. Integral promotions > 4 An rvalue of type bool can be converted to an rvalue of type int, with > false becoming zero and true becoming one. となってる。まぁ、0/1じゃなくてfalse/trueが帰ってくるのだー、 と言う意味なら「そんな仕様はない」でもあながち間違いではないが…
>>123 数値を bool に変換すると 0 が false でそれ以外 true 。
これ以外の事はもう忘れろ。
そしてこれからは常に bool 型を使え、それだけの事だ。
C++98の最初って・・・全然最初じゃないやん bool以前はどうだったの?
>>124 ANSI Cの規格は手元にないからわからんが、その翻訳のJISのCなら
> 6.3.8 …の各演算子は、指定された関係が真の場合は 1 を、偽の場合は 0 を
> 返さなければならない。その結果は、型 int をもつ。
>>127 それ以前ってC++の規格なんてないじゃん?ARMでも調べるのか。
BASIC だと 0 が偽 で -1 が真だったりするから、 それとごっちゃになってる事もあるだろうな。 ビットパターンを想像すると BASIC の仕様の方が美しいんだけど、 C/C++ には unsigned があるからな。 だからもう bool を使う事だけ考えようって、 過去の醜い実装の詳細を考えたって鬱になるだけだって。
>>122 Cで0か1で、C++ではtrueとfalseが仕様ということですか。
わかりました、ありがとうございます。
Cで条件演算子が1/0を返すのは、ずーーっと前から。 確かK&R2ndにもそれを確かめる練習問題があったはず。 C++も、boolが導入される前はそれに従ったはずだけど(トランスレータだったし)。
大変盛り上がっているところ、すみません。 別クラスのオブジェクトへのアクセスについて質問があります。 現在トランプゲームを作成していて、下記のクラス&オブジェクトがあります。 ●基底クラスA(シーンを表すクラス) ├派生クラスA1─オブジェクトA1(タイトル画面) ├派生クラスA2─オブジェクトA2(1Pの行動シーン)─∞回繰り返す └派生クラスA3─オブジェクトA3(2Pの行動シーン)─┘ ●クラスB┬オブジェクトB1(1Pの手札) └オブジェクトB2(2Pの手札) ●クラスC─オブジェクトC(共通の山札) 私がやりたいことは、下記のとおりです。 ・A2・A3ではB1・B2の手札がなくなったらゲームが終了するのでB1・B2にアクセスできるようにする。 ・A2・A3ではCの山札がなくなったらゲームが終了するのでCにアクセスできるようにする。 ・B1・B2ではCの山札の情報を取り込むのでCにアクセスできるようにする。 問題になっている点は下記のとおりです。 ・"ClassB ObjectB1;"などの宣言をどこでするか。 ・クラスA・B・Cそれぞれに、cppファイルとhファイルがありまして、 どのファイルからどのファイルのヘッダをincludeしたら良いか。 ・オブジェクト作成時にstaticを付けるのか付けないのかなどがよくわからない。 「私のやりたいこと」で述べたアクセスを実現するには、どうしたら良いのでしょうか。 簡単な骨組みを作っていただけませんでしょうか。おねがいします。
134 :
デフォルトの名無しさん :03/01/04 22:41
このスレはクラスウィザードになりました
>>133 言えることは
・設計からやりなおせ。
・勉強しなおせ。
・自分で考える力をつけよう。
だな。
・"ClassB ObjectB1;"などの宣言をどこでするか。
自分で考えろ、情報が少なすぎて判断できん。
・どのファイルからどのファイルのヘッダをincludeしたら良いか。
基本を勉強した上で自分で考えろ。
・オブジェクト作成時にstaticを付けるのか付けないのかなどがよくわからない
勉強しろ、自分が書いている事の意味を理解しろ。
・簡単な骨組みを作っていただけませんでしょうか。
上記の話のものだと、簡単な骨組みだけで、もう簡単じゃない。
特にひどいのは1Pの行動シーンと2Pの行動シーンを別クラスにしてある事だな。
Strategy とか覚えた方がいい。
>>133 >私がやりたいことは、下記のとおりです。
>・A2・A3…アクセスできるようにする。
>・A2・A3…アクセスできるようにする。
>・B1・B2…アクセスできるようにする。
アクセスできるようにするだけなら、
さほど問題は無いだろうに……
厨は放っておきましょうよ・・・
プレイヤー数が2より多くなったときってのを考えてないな…
>>136 理由を言えない馬鹿を発見しました。
>>133 あとな、基底クラスA のあたりの仕組みには Task を使うといいぞ。
>きみも勉強しようね。www 厨房は放っておくことを勉強しろこのカス。
>>133 全部一つのファイルの中に書いたら?
そうすれば悩まずにすむ。
それがいやなら、なぜ嫌なのか考えてみたら?
自分が本当は何をしたいのかを。
>>141 ごめん、そういう意味か…。
でも誰かが「駄目だ」って言ってあげないと…。
>>115 static リンケージにしとけば、とりあえずリンク時には問題でないよ。
template 関数とか inline 関数の類は、そうだよね。
>>144 テンプレートは本来 export キーワードでエクスポートされるべきなんだけどね。
はやくメジャーなコンパイラが対応しないかな…。
147 :
デフォルトの名無しさん :03/01/05 04:11
Unix C++で下記の2つのキャストってどうやるの? unsigned int abcd; struct test { unsigned char a; unsigned char b; unsigned char c; unsigned char d; } unsigned int⇔struct testは共に4バイトデータ
>>147 struct test {
operator unsigned int()
{return a | (b << 8) | (c << 16) | (d << 24);}
}
ってこと?
unsigned int aaa; unsigned char bbb; aaa = (int)bbb; こんな感じで出来なかったかなと^^;
>>147 環境依存コードはイクナイ!
char に 3 バイトずつパディングが入って struct test が 16バイトになる環境もありうるぞ。
struct test { union { int abcd; struct { unsigned char a; unsigned char b; unsigned char c; unsigned char d; }; } };
152 :
デフォルトの名無しさん :03/01/05 08:51
超初心者な質問ですが、 int a; cout << "aを入力してください。\n"; cin >> a; cout << "8進数:"; cout.setf(ios::oct, ios::basefield); cout << a << '\n'; cout << "10進数:"; cout.setf(ios::dec, ios::basefield); cout << a << '\n'; cout << "16進数:"; cout.setf(ios::hex, ios::basefield); cout << a << " または "; cout.setf(ios::uppercase); cout << a << '\n'; intをdoubleに変えるとうまくいきません。 なんで?
>>152 どう上手くいかないのかを良く観察汁。
そして、それが何故なのかを考える。
そして、型の違いに注目すると...。
もう一度本をよく読んでみると、 「整数の出力は8進、10進、16進の3種類で行えます」 ってあったけど、それが答えかな? とすれば、浮動小数点は10進のみ?
型は型でも、注目すべきはむしろそのサイズ。
156 :
デフォルトの名無しさん :03/01/05 10:05
市販本についてるプログラムをコンパイルすると 次のようなエラーが出てしまって困っています。 LINK : fatal error LNK1104: ファイル "nafxcwd.lib" を開けません。 どうしたらよいのでしょうか?
157 :
デフォルトの名無しさん :03/01/05 10:07
>>156 nafxcwd.libをパスの通っているところに置く
158 :
デフォルトの名無しさん :03/01/05 10:09
>>157 初心者で書いてることが分からないのですが・・・、
nafxcwd.libは何なのでしょうか?
パスの通っているところに置くというのも分からないので
教えてください。
>>158 コマンドラインに何とタイプしてコンパイルしてる?
lib = ライブラリ。 パスの意味がわからなかったら、 とりあえず、コマンドプロンプトから *.exe を実行しようと試みよ。 怒られたら set PATH とタイプして、[Enter]を押せ。そして、そこに表示されるものの意味を調べろ。
161 :
デフォルトの名無しさん :03/01/05 10:16
>>158 見てみたらnafxwd.libってMFCのデバッグのスタティック用のライブラリみたい。
君のコンパイラがVCでかつProfessional以上ならコンパイルできるはず。
スタンダードならコンパイルできない。設定で共有MFCを使用するに変更しないと。
163 :
デフォルトの名無しさん :03/01/05 10:19
>>158 Microsoft Visual C++でビルドしていて
コマンドを打って無いのですが、
そこを直すにはどうすればいいのでしょう?
すみません、
163は
>>159 です。
>>160 すみません。コマンドプロンプトがよく分からなくて・・・。
とりあえず161さんの言うように設定を変えてみたのですが、
次のようなエラーが出てしまいました。
MSVCRTD.lib(crtexe.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/CJpegDecoder.exe : fatal error LNK1120: 外部参照 1 が未解決です。
どうしたら良いのかまた分からず・・・。
すみませんが教えてください。
>>165 161で書かれてあるところを直しただけなのですが、
設定が悪いのでしょうか?
どうすれば良いですか?
>>166 じゃあ、とりあえずプロジェクトの設定のリンクで
/SUBSYSTEM:WINDOWSを消せ
>>166 ちゃう、
/SUBSYSTEM:CONSOLEになってるかも、とりあえずどっちかあったら消せ
169 :
デフォルトの名無しさん :03/01/05 10:42
152ですが、int型でも負の値をいれると8進、16進でうまくいきません。 double型の場合、ios::oct等が対応していないためcout.setfの行を無視していると思ったのですが・・・ これも155さんが言うサイズと関係しているような気がするのですがよくわかりません。 (もしかしたらこの質問自体が意味不明な文になってるかも・・・)
>>168 /SUBSYSTEM:CONSOLEを消したら
LINK : fatal error LNK1561: エントリー ポイントを定義しなければなりません
とエラーが出てしまいました。
まだ何かあるのでしょうか?
>>169 doubleは普通の整数型とは値の表し方(フォーマット)がぜんぜん違うから16進で表示しても無意味だから対応していないんだろうね。
>>170 メイン関数がないんだろ。
その本についていたプログラムはそれだけで動くものじゃないんじゃないのか?
>>169 負の値でうまくいかないってのはなにがうまくいかないんだ?
16進数なら
-1 → ffffffff
だぞ
8進数なら37777777777? なんかプログラム勉強する以前のような気がしてきた・・・
>>172 確かにmainが無いみたいです。
そういう説明が書いてなかったので気づきませんでした。
VC++の設定を初めていじって不安なのですが、
元に戻しておいた方が良いのでしょうか?
VC++ネタは専門スレがあったとおもふ
178 :
デフォルトの名無しさん :03/01/05 11:12
class A{} class B : public virtual A{} というような継承でvirtualを書くとどうなるんですか?
virtual継承になる。
180 :
デフォルトの名無しさん :03/01/05 11:20
>>179 すいません、virtual継承って何ですか?
182 :
デフォルトの名無しさん :03/01/05 11:28
仮想クラスってありましたよね? それの継承版ですか?
>>182 仮想クラスなんて存在しません。あるのは抽象基底クラスでしょ。仮想継承は、
多重継承時に基底クラスのサブオブジェクトを一つだけにする。
…っつかプログラミング言語 C++ 読むと、図付きで解説してると思うぞ。
185 :
デフォルトの名無しさん :03/01/05 14:27
学校で、「男根の機能をC++のクラスで詳細に設計せよ」という課題が出ました。 手淫をすると、長さと太さの変数を上げ精子が飛び出させるというところまでは簡単なのですが、 一回射精をするとしばらく射精ができなくなるのが難しいです。 しかも、射精の直後でもがんばればできますし・・・ 誰か作っていただけませんか?
X* pca=new X; X* pcb; pcb=pca; pcb->func(); delete pcb; pcb=NULL; pcb->func();これが落ちもせずに走るのは、どういうわけでしょう? これはそういうものなんでしょうか?
未定義とか、不定とか?
さー!みんなで考えよう~! X::func() がメンバ変数を一切触っていないか、もしくは delete 後のメモリが他の動作で破壊されていない事。 で NULL の定義が #define NULL pca もしくは #define NULL pcb だったりすると… あら不思議!
ahoka
>>187 X::func() が非仮想メンバ関数で、かつ、直接または間接にそのインスタンスのメンバ変数の参照や
仮想メンバ関数の呼び出しを一切していないならば、そうなる場合もある。
>>189 pcb=NULL とした後では、たとえ delete 後もメモリがそのまま残っていたとしても、
インスタンスを参照しようとした瞬間に落ちると思われ。
>>187 thisポインタに一切アクセスしないならば動くような気もする。
193 :
デフォルトの名無しさん :03/01/05 15:57
Microsoft VC++で構造体のメンバーになっているポインタ の指すデータを見るにはどうすれば良いでしょうか?
195 :
デフォルトの名無しさん :03/01/05 16:05
VCのSystem.out.println的関数情報キボンヌ わかんねーよ
>>194 デバッガでシンボル名を指定するとポインタのアドレスのデータが分かるのですが
その次以降のアドレスに入っているデータが見れないで困っています。
>>195 System.out.println的関数って何を見たらいいのでしょう?
初心者なので良く分からなくて・・・。
funcがstaticメンバ関数なんでしょ。
>>198 非 static でも、呼び出す関数が静的に決定されるなら、関数呼び出しでは
落ちんよ。逆に言えば、関数呼び出しで保護違反を食らう可能性があるのは、
func が仮想関数の場合だけ。
もちろん非仮想関数であっても、中でメンバ変数を触ったらアウトだけど。
201 :
デフォルトの名無しさん :03/01/05 19:20
クラス内で関数の定義を書いてしまうのと、 inlineをつけてクラス定義の外に書くのとでは どういう違いがあるんでしょうか?
>>202 処理系によるけど、外に書くと定義順によっては inline 展開されない場合が
ある。
inline void Foo::func1() { func2(); }
inline void Foo::func2() {}
これだと func1() をコンパイルする時点で func2() の定義が見えないので、
インライン展開されなかったりさ。
コード生成はかなり後のフェーズっしょ そりゃあよほどアホなコンパイラじゃないのかね
205 :
デフォルトの名無しさん :03/01/05 22:02
配列が大きすぎてすぐ強制終了させられるんですけど、 メモリを確保するいい方法がありますでしょうか?
newもmallocも知らないんスか?
207 :
デフォルトの名無しさん :03/01/05 22:22
newやmalloc使ってもダメなんです。 他にいい方法ありますか?
>>207 コンパイラオプションのヘルプをよく見ると、
メモリ量の上限を指定する方法が書いてあると思うよ。
209 :
デフォルトの名無しさん :03/01/05 22:29
>>208 Microsofr VC++ ver6使ってるんですけど、
上限を増やす方法知ってたら教えてください。
いったい何バイト確保したいんだ?
211 :
デフォルトの名無しさん :03/01/05 22:31
>>210 後、2000×1000×3バイトなんですけど、
1000×1000で限界みたいなのです・・・。
213 :
デフォルトの名無しさん :03/01/05 22:41
>>212 設定の変更したことないので、どうすればいいのかよく分からず・・・。
どうしたら良いのでしょう?
>>211 new でも malloc でもその程度楽勝で確保できるぞ。
だいたい「強制終了」させられるんなら、プログラムのバグだと
思うし。
216 :
デフォルトの名無しさん :03/01/05 22:50
>>211 具体的にどんなエラーが発生しているんだ?
エラーメッセージ晒せ
217 :
デフォルトの名無しさん :03/01/05 22:54
>>215 new 使って2次元配列を定義しようとしてもできないのですが、
どうしたらいいのでしょうか?
218 :
デフォルトの名無しさん :03/01/05 22:55
すいません。こうしてました。 int *data1 = new[1000 * 1000]; int i = 0; for(i = 0;i <= 1000 * 1000;i++) data1[i] = 0;
まあ、ネタはおいといて、、、
>>216 強制終了されるってことは、コンパイルエラーなしでコンパイル通って
実行時に落ちるってことでは?
220 :
デフォルトの名無しさん :03/01/05 22:59
friendクラス、関数の宣言はprivateでもpublicでも意味的には全く同じ?
そうです。コンパイルエラーなしです。
>>218 のようにはしていないので
二次元配列のnewでの定義の仕方お願いします。
>>204 > そりゃあよほどアホなコンパイラじゃないのかね
俺が確認したのは gcc 2.95.x
gcc 3 系列は試してないので知らんけど。
223 :
デフォルトの名無しさん :03/01/05 23:11
>>221 int **data = new int[1000][1000];
>>223 コンパイル出来ないのですが・・・。
何かおかしいのでしょうか?
225 :
デフォルトの名無しさん :03/01/05 23:23
>>224 からかわれたんだ。
自分の書いたソースをあげてみそ
>>220 friend クラス、関数はメンバじゃないから、アクセス制御とは当然関係ない。
だからこういうこともできる。
#include <iostream>
class Foo;
class Bar {
public:
void print(const Foo&);
};
class Foo {
int m_;
friend void Bar::print(const Foo& f) { std::cout << f.m_ << std::endl; }
public:
Foo(int n = 0) : m_(n) {}
};
int main()
{
Foo foo;
Bar bar;
bar.print(foo);
}
>>226 ありがとうございます。
教えてもらったところで申し訳ないのですが、
上のコードはg++だと2.95,3.2どちらでも
エラーになります。
228 :
デフォルトの名無しさん :03/01/05 23:33
typedef int* LPINT; int **data = new LPINT[1000]; for(int i = 0;i < 1000;i++) data[i] = new int[1000];
struct { int data[1000][1000]; }
data;
int (*data)[1000] = new int[1000][1000];
232 :
デフォルトの名無しさん :03/01/05 23:38
typedef int* LPINT; int **data = new LPINT[1000]; int *temp = new int[1000 * 1000]; for(int i = 0;i < 1000;i++) data[i] = temp[i * 1000];
233 :
デフォルトの名無しさん :03/01/05 23:40
>>232 ちょっと修正
typedef int* LPINT;
int **data = new LPINT[1000];
int *temp = new int[1000 * 1000];
for(int i = 0;i < 1000;i++)
data[i] = &temp[i * 1000];
さて、正解は?
あらかた出尽くした?
typedef data[1000][1000];
>>227 あ、gcc の挙動の方が正しいみたいだね。
VC7しか手元に無いんで深く考えずに、書いてしまった。
まあ、friend 宣言を定義化したのはただの行数稼ぎで
本筋ではないので……スンマソン、欝氏。
ソースの書き方教えてください。 unsigned int aaa; ← 0xFFDDEECCの4byte Data 下記のように1byte Dataにしたいのですが どのようにやればうまくいきますか? unsigned char a1; ← 0xFF unsigned char a2; ← 0xDD unsigned char a3; ← 0xEE unsigned char a4; ← 0xCC また逆に詰め込みたい場合はどうするのが良いのでしょう。
& >>と | <<
>>240 具体的にどのようにすればよいのでしょう
素人ですまそん
unsigned char *a; a = (unsigned char *) &aaa;
afo
>>245 同意だが #ifdef BIG_ENDIAN とかで括っとけよ。
// int は 32 ビットを想定 void int2charArray(int src, char* dst) { dst[0] = src & 0xFF; dst[1] = (src >> 8) & 0xFF; dst[2] = (src >> 16) & 0xFF; dst[3] = (src >> 24) & 0xFF; } こんなんでどーだ?
>>247 別にunsigned long使えばいいと思うが。
あと、unsigned charの方が良いな。
union を使うのがいいような気も……
250 :
デフォルトの名無しさん :03/01/06 11:13
>>249 むりやりC++にしてみた(藁
配列じゃなく、std::vectorなのは勘弁しれ
#include <iostream>
#include <vector>
#include <algorithm>
template<typename T>
union Foo {
T val;
unsigned char byte[sizeof(T)];
};
template<typename T>
std::vector<unsigned char> toUchar(const T& val)
{
std::vector<unsigned char> result(sizeof(T));
Foo<T> foo;
foo.val = val;
std::copy(foo.byte, foo.byte+sizeof(T), result.begin());
return result;
}
template<typename T>
T toVal(const std::vector<unsigned char>& vec)
{
Foo<T> foo;
std::copy(vec.begin(), vec.end(), foo.byte);
return foo.val;
}
unsigned int aaa = 0xFFDDEECC; unsigned char a1 = (aaa >> 24) & 0xff; unsigned char a2 = (aaa >> 16) & 0xff; unsigned char a3 = (aaa >> 8) & 0xff; unsigned char a4 = (aaa >> 0) & 0xff; unsigned int bbb = (a1 << 24) | (a2 << 16) | (a3 << 8) | (a4 << 0);
& 0xffはいらないだろ。 と思いつついつも書いてしまう小心者の俺...
初心者には勉強になるかと思ってあえて超丁寧に書いただけだよ。 ワーニングが出る処理系もあるし。
> そりゃあよほどアホなコンパイラじゃないのかね あんたほどじゃないだろうけどね(w
255 :
デフォルトの名無しさん :03/01/06 14:09
関数の先頭で変数宣言するのと、途中で宣言するのは なにか違いはありますか?必要になり次第処理の途中で スタックに積む方が効率がいいと思うのですがどうでしょうか?
>>255 それはコンパイラの実装次第。例えばBorland-C++5.5.1では、変数が出てくる
度にスタックに積むのではなく、最初に関数の中身を全部調べて、必要なだけ
のスタックを関数の入り口で確保してしまう。
>>256 つまりそのあたりのスタックの使い方に標準はないということですね。
当たり前かもしれませんが。。。自分のコンパイラをよく調べてみます。
ありがとうございました。
initialize…ハァハァビヨーンタソ
259 :
デフォルトの名無しさん :03/01/06 15:26
二次元配列の動的確保ってどうやってやるんですか?
260 :
bloom :03/01/06 15:27
>>259 列の次元が決まっていてもいいなら
TYPE (*p)[100] = new TYPE[n][100];
行、列とも可変なら
TYPE** p = new TYPE*[m];
for (int i = 0; i < m; i++)
p[i] = new TYPE[n];
262 :
デフォルトの名無しさん :03/01/06 15:48
>261 サンクスです♪ これでrenewが作れます。
main(){ int* pa=new int; pa=(int*)new double; delete pa; } これがメモリリークしてしまうのは、何故ですか?
new * 2 delete * 1
>>263 int* pa = (int*)new double;
delete pa;
こういう事か?
>264 二回deleteしたら当たり前のように落ちるんですが・・・
267 :
デフォルトの名無しさん :03/01/06 20:05
市販本についているVC++のプログラムで、 main関数が無いのに実行できるのですが、どうしてでしょうか? それが分からないと改造できないので、よろしくお願いします。
( ´,_ゝ`)プッ
>>266 同じアドレスに対して二回deleteしたら落ちるのは当然。
delete pa;
pa = 0;
delete pa;
とすれば落ちない。でもメモリリークは治らない。
>>267 君みたいな奴に限って、違法コピーのVisualStudioを使ってるんだよなあ。
>267 WinMainじゃないだろうな?
272 :
デフォルトの名無しさん :03/01/06 20:56
>>271 実行するとWindowsが開くんですけど、WinMainってそれに関係してるんですか?
MFC使ってんだと思われ。
275 :
デフォルトの名無しさん :03/01/06 21:02
MFCって? どうすれば見れるんですか?
・・・君の買った本には書いてないのか? っていうか >WinMainってそれに関係してるんですか? で、MFCは無茶。 で、ここは「C++」のスレ。winもMFCもスレ違い。
>>275 スレ違いなのだが・・・。
まだ
>>275 はその市販本で勉強するには知識が足りない。
(もしくは市販本の説明が悪い)
簡潔に言うとWinMain関数はWindowsのMain関数みたいなもんで
MFC内で定義されている。
この話題はこのスレの趣旨に合っていないので、
初心者にVisual C++を教えるスレ★
を勧める。
以上
278 :
デフォルトの名無しさん :03/01/06 21:16
>>276 買った本にはMFCについて書いておりませんので・・・。
>>277 そちらのスレで聞いてみます。
279 :
デフォルトの名無しさん :03/01/06 23:00
環境依存の話はそちらのスレでどうぞ
> 簡潔に言うとWinMain関数はWindowsのMain関数みたいなもんで > MFC内で定義されている。 ( ´,_ゝ`)プッ
_tWinMainはあるね。
class A {}; void func1(A& a) {...} void func2(const A& a) {...} void caller() { func1(A()); func2(A()); } func1のが怒られる理由って何だっけ
マジ?gcc3.2は怒った
Borland C++ ではお咎めなし、引数つかってねーよって警告は出たが…。 gcc は 2.95.3-5 でも怒られるね…なんで? 呼び出し中に非const の A が作られてるのに、そいつが const A& にはなれて A& にはなれない理由は~~?俺も知りたいー。
>>287 マジっすか?プログラミング言語C++ か仕様書で書いてある所あったら
セクション番号きぼんぬ!
>>289 一時変数はconstではないが、変数のリファレンスに一時変数を与える
事は禁止されているらしい。
プログラミング言語C++第3版、P135、§5.5
多分これと同じ理由だろう。 int main() { A& a = A(); // エラー const A& aa = A(); // OK }
291が何故ダメなのか分からない…(´・ω・`)
>>292 こういう風に書き換えたらわかるかな?
int main() {
int& a = 1; // エラー
const int& aa = 1; // OK
}
294 :
デフォルトの名無しさん :03/01/07 09:03
メンバ変数に触っていない関数をstatic関数のように呼び出すのは いいの?というかそれなら最初からstatic関数にしておけばいいのに と思いません?
しろよ。
>>293 それは理解できたのですが、また疑問が沸き上がりました。
A& a = A();で確保したaはスコープが外れるとデストラクトされるのですか?
>>296 なんで試してみないんだ?
ちなみに、結果はコンパイルエラーのはずだが。
>>291 ありがとうございます。家に帰ったら読んでみます。
>>296 new で作ったものじゃなければスコープ外になったらデストラクトされるでしょう。(多分)
>>297-298 試してみたらちゃんと呼ばれてました。
混乱して済みません。
環境:VC++7.0
#include <iostream>
class A {
public:
A() { std::cout << "constract A()" << std::endl; }
virtual ~A() { std::cout << "deconstract ~A()" << std::endl; }
int m_i;
};
int main() {
A& a = A(); // 通る
const A& aa = A(); // 通る
int& b = 1; // エラー
const int& bb = 1; // 通る
}
>>292 見境なく仮想デストラクタにするのはやめたほうが…
IEEEで取り込んだ画像をC++で入出力する プログラムがあります それをいち早く編集したいのです! なにを学べばいいかわかりません。。。。 助けて
>>301 早くそのプログラムを送って!
助けて!
cout << (char*)NULL << endl; これって何も言わずにexitしちゃうんだけどいいの?
>>303 C++ には NullPointerException なんかねーよ。
文字列の初期化なんだけど、 どっちにしてますか? char* szA = NULL; cout << szA << endl; // 落ちる ... if(szA != NULL){ delete szA; szA = NULL; } char* szB = ""; cout << szB << endl // 改行 ... if(strcmp(szB, "")){ delete szB; strcpy(szB, ""); }
>>302 おくりました!
助けてーくーだーさーい
誰のメアドかも分からんに送っちゃ駄目だろ
>>305 どっちでもいいけど、後始末が両方ダメ。
>>304 実行時エラーだったら何か言って欲しいと思うのです。
>>305 訂正。
delete szB;
szB = new sizeof(char);
strcpy(szB, "");
>>308 どこがダメ?
送ってといわれたので・・・
>> 309 あのな、C++で文字列を扱いたかったら、std::string 使え。 ほかに、文字列変数に sz プレフィクスつけると、ガンガリアンが混乱するからやめれ。 で、文字列初期化の仕方も間違ってるし。 すこし勉強してからまたきなさい。 なにがしたいのかもわからないし。
受け取りますた 本当に送ってくるとは思ってなかったけども
313 :
デフォルトの名無しさん :03/01/07 17:38
X x; x[][]; と、いう風に書きたいのですが、opeator[][]()はエラーになります。 何かいい方法ありませんか?
>>305 文字列には、string を使う。
std::string s;
これで初期化も確保も一発。
つーか
>>303 は何がしたいのさ?
勉強のため文字列クラスを自作してます。
>>311 だからどう間違ってるのかって聞いてるのに・・・
>>313 template<class T, int M, int N>
class X {
T array[M*N];
public:
T* operator[](size_t i) { return array + N*i; }
};
とか?
317 :
デフォルトの名無しさん :03/01/07 18:06
class X{ int a[10][10]; }; X x; x[0][0]; こんな感じです。
a を public にして、 x.a[0][0]; じゃだめなの?
その方法が一番まっとうだと思うんですが、xを配列のように扱って みたいんです。
オイオイオイオイ…
すみません・・・ なんとかならないですかねぇ
>321 アンタ誰だよ・・・
… どっかにうpして晒すとか…
delete [] szA; szA = new char [1]; だった(;´Д`)逝ってきます つか自作文字列クラスの仕様では デフォルトコンスタクタ以外、文字列を空にする必要って無かった
>>325 あなた、一回、そのクラス定義をさらしなさい。みんな、あなたが何をやりたいのか
わからないから何もアドバイスできないのよ。
>>315 std::cout << (char*)NULL << std::endl;
gcc3.2.1(MinGW)では落ちないぞ。何も表示されなかったけど。
std::printf("%s", NULL);
と同じような意味だと思う。但し、printfの%sはアドレスに0を渡すと、"(null)"って
表示してくれる。
328 :
デフォルトの名無しさん :03/01/07 20:38
何故、nullポインタを出力したいのか、その意図がわからん
329 :
デフォルトの名無しさん :03/01/07 20:48
ファイル "nafxcwd.lib" を開けません。 というエラーメッセージが出てしまうのですが どうすればいいのか教えてください。
このようなsample.dsp sample.cpp sample.rc sample.clw sapleDoc.cpp sampleView.cpp Stdafx.cpp ともともとあるファイルで、 どのファイルをいじくれば編集できるのですか?(画像処理で色変換がしたいです) 初心すぎてすみません、教えてください
スレ違いだと何遍言えば(略
>>319 struct X {
int a[10][10];
struct proxy {
int& operator[] ( int j ) { return x->a[i][j]; }
proxy( X*x, int i ) : x(x),i(i) {}
X* const x;
int const i;
};
proxy operator[](int i) { return proxy(this,i); }
};
334 :
デフォルトの名無しさん :03/01/08 10:52
std::max<int>はconst int& を受け渡ししますが、 このおかげで値渡しによる実装に比べて効率が悪くなるのは、 コンパイラの最適化の責任ですか? STL実装の責任ですか? 利用者の責任(代替の実装を使うべし)ですか?
Proxy Pattern come from?
>>303 T* obj = new T; と確保したら、解放は delete obj;
T* obj = new T[size]; と確保したら、解放は delete[] obj;
基本中の基本です。
>>303 は、ポインタを new していないのに、 delete で消そうとしているからだめだめ。
>>305 で、char* szB = ""; と、定数へのポインタを delete で消すなんていうのはもってのほか。
メモリリークで苦しみたくなければ、メモリや変数について、1から勉強したほうがよいと思われ。
それが嫌なら、C/C++ やめて Java か C# でもやってなさい
>>334 inline展開が効けばマクロ並になると思われ。
>>337 そうおもってたんですが、アセンブリ見たら、
値をレジスタからメモリに移してアドレス取ってるんですよ。
もうね、(中略)と。
ちなみに、cygwin gcc3.2 でも同様の結果を確認。
>>338 const int&は必ず一時変数を必要とするので、レジスタ変数が使える場面
でも一度メモリに入れるのかもしれません。
RISC CPUで動くg++の結果も見たいものです。
>>338 ちなみに一時変数を必要としない変数の参照版ではちゃんとレジスタで
比較してくれました。
template <typename T>
inline T mymax(T& a, T& b)
{
return (a > b) ? a : b;
}
但し変数の参照は一時変数をバインドできないので、mymax(1, 2)なんて
やるとエラーが出ます。
ごめそ。そう思ったけど、やってみたら、 template <typename T> inline T& mymax(T& a, T& b) { return (a > b) ? a : b; } ではやっぱりアドレスとるね。それから template <typename T> inline T mymax(const T& a, const T& b) { return (a > b) ? a : b; } ではレジスタで比較してくれた。だから、constがあるかないかではなく、返り値が 参照かそうでないかで最適化が決まるみたい。intのような小さいオブジェクトでは 効率が悪くなるが、class変数に対してはアドレス取った方が効率が良くなるから 痛し痒しですな。
TypeTraits<int>::ParameterType は解決にならんか?
intで特化した関数maxを多重定義しておけば?
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
ほぜむ
346 :
デフォルトの名無しさん :03/01/08 23:03
保守
C++の例外で質問があります 例外クラスを作ったんですが、 例外は実体を投げたほうがいいんでしょうか それともnewしてポインタを投げたほうがいいんでしょうか
>>347 実体というか、コンストラクタを使って作った一時変数を投げてconst & で
受けるとよい。
newするとdeleteしないといけないし面倒くさい。
>>348 即レスありがとうございます。
throw A(); とかですよね。
こいつが削除されるタイミングっていつになるんでしょう。
catch節を抜けたとき、であってますか?
あと、例外クラスを継承したとき、
たとえば class B : public A {}; としたとき
throw B();
したのが
} catch ( const A& a ) {
で捕まえられるもんなのでしょうか。
また、たとえば、この場合に
} catch ( A a ) {
なんてやるとどうなるんでしょう・・・
intとかの型ってどうやって定義されているんだろう? 気になる。いっぺんでいいから定義文を見てみたい
削除されるタイミングは、もちろんcatchを抜けた時。一時変数が削除される。 B()をconst A&で受けると、型が違うので多分ダメ。 Aで受けると、文法的には一時変数のコピーを受けることになるが、最適化 によって大抵一時変数そのものを受けるので効率的には変わらないのでは ないかと思う。これについては確信無し。
352 :
デフォルトの名無しさん :03/01/08 23:32
'あ'はchar型?
あちゃー
>351 > B()をconst A&で受けると、型が違うので多分ダメ。 基底クラスへの参照なら、問題ないぞ。っつーか A& ではなく A で受けると スライシングが起こるから、たいてい不幸な結果になる。
>>354 継承したクラスを基底クラスで受けられるって初めて知った。
目から鱗です∈( ̄o ̄)∋。勉強し直しです。
それから、確かにAで受けると、先に~A()が呼び出されてしまうから
まずいね。
356 :
デフォルトの名無しさん :03/01/09 00:10
ちょっと質問です。 class Except { public: const char* what() const { return "abc"; } Except() { std::cout << "Except()" << std::endl; } ~Except() { std::cout << "~Except()" << std::endl; } }; class Ex2 : public Except { public: Ex2() { std::cout << "Ex2()" << std::endl; } ~Ex2() { std::cout << "~Ex2()" << std::endl; } }; int main() { try { throw Ex2(); } catch (const Except& e) { std::cout << e.what() << std::endl; } }
何を?
上のプログラムを実行すると次のような出力が得られます。 Except() Ex2() ~Ex2() ~Except() abc ~Ex2() ~Except() なんか、デストラクタが1回ずつ余計に実行されているように見えるのですが、 大丈夫なんでしょうか?
359 :
デフォルトの名無しさん :03/01/09 00:11
引数が char*& pStreamData となってる関数があるのですが、 これってどういう意味なんですか? 最初の宣言は char pStreamData としていいのでしょうか?
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
>>358 コピーコンストラクタも cout に表示するようにしてみ。
>>359 ポインタのリファレンス。簡単に言うと、ポインタのポインタみたいな使い方を
する。
最初の宣言はchar* pStreamDataでは?
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>>361 なるほど、すっかり忘れていました!
特にポインタ変数があるような場合はコピーコンストラクタを書いて
おかないといけないんでしたね。
>>361 これで、継承したクラスを基底クラスの参照ではなく変数で受けると
ヤバイ理由がわかりました。基底クラスのコピーコンストラクタと
デストラクタが呼び出されてしまうわけですね。でも基底クラスの
コピーコンストラクタなら大丈夫な気もするのですが・・・気のせいでしょうか?
家族構成と小学校時代の恥ずかしかった思い出も記録されます。
>>155 2ちゃんねるはアングラなの? △ ▽ ▲ ▼
誰もが自由に書き込みが出来る匿名掲示板(←ここ)のシステムには
なんかさっきからトンチンカンな書き込みが多いが・・・・・ 2chビューアのバグ?
370 :
デフォルトの名無しさん :03/01/09 01:01
一回あげてみる。
>>386 IP記録うんぬんのやつに引き続き荒らされてる。
IP記録うんぬん=ダウン厨
373 :
デフォルトの名無しさん :03/01/09 01:09
>>339 わかってます。
でも心の2ちゃんは荒れまくってます。
AAのオンパレードです。
そろそろ1ch.tvの出番か?(藁
IPの記録はまじでやめてほしい
nyの掲示板に来い!
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
スレ違い馬鹿はどっか行ってくれ ↓↓ 次の方、質問をどうぞ ↓↓
>>382 昨晩からどうやらスクリプトが狂っていて、どこか他のスレへの書き込みが
このスレへスルーしてくるみたい。
書き込みしているヤシには見えないらしいので、このスレが埋まるまで
待つか、新しいスレ立てるしかないかもしれん。
trye{ // ... } template <class T> catch(const T& e){ std::cout << e.what() << std::endl; }
if you think C++ is difficult, trye English. by Byo-n.
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
遅くなりましたが、
>>336 さんありがとうございます。
一応動くようになったんですが、晒して見ます。
よろしければ突っ込み入れてください。
class UString
{
protected:
char* m_sz;
int m_len;
public:
UString();
UString(const char* a_sz);
UString(const UString& a_str);
~UString();
UString& operator = (const UString& a_str);
UString& operator = (const char* a_sz);
UString& operator += (const UString& a_str);
int GetLengthSz(const char* a_sz);
const char* GetSz();
int GetLength();
bool CopySz (char* a_dst, const char* a_src);
bool EqualSz (const char* a_szA, const char* a_szB);
friend UString& operator + (const UString& a_strA, const UString& a_strB);
friend bool operator == (const UString& a_strA, const UString& a_strB);
friend bool operator != (const UString& a_strA, const UString& a_strB);
friend ostream& operator << (ostream& a_ostream, const UString& a_str);
};
UString :: UString () { m_len = 0; m_sz = new char [1]; m_sz[0] = '\0'; } UString :: UString (const UString& a_str) { m_len = a_str.m_len; m_sz = new char [m_len + 1]; CopySz(m_sz, a_str.m_sz); } UString :: ~UString () { if(m_sz != NULL) delete [] m_sz; } UString& UString :: operator = (const UString& a_str) { if(m_sz != NULL) delete [] m_sz; m_len = a_str.m_len; m_sz = new char [m_len + 1]; CopySz(m_sz, a_str.m_sz); return *this; }
UString& operator + (const UString& a_strA, const UString& a_strB) { UString* ret_str = new UString(); *ret_str += a_strA; *ret_str += a_strB; return *ret_str; } UString& UString :: operator += (const UString& a_str) { int lennew = m_len + a_str.m_len; char* sznew = new char [lennew + 1]; int i = 0; int k = 0; for(i=0; i<m_len; i++) sznew[i] = m_sz[i]; for(k=0; i<lennew; i++,k++) sznew[i] = a_str.m_sz[k]; sznew[i] = '\0'; delete [] m_sz; m_sz = sznew; m_len = lennew; return *this; } 重なる部分、あまり重要でない部分は端折ってありますが、以上です。 長文失礼しました。
>>389 ・メンバの初期化は初期化リストを使え。
・delete前の分岐は冗長。
・protectedメンバがあるのに、デストラクタがvirtualじゃないのはおかしい。
・operator + の型が、慣用的なものと異なる。
・operator + が、効率が悪い上、メモリーリークする。
・newでbad_allocが飛ぶことが考慮されていない。
記念かきこ
394 :
デフォルトの名無しさん :03/01/09 23:36
void func(int){} main(){ void* vp=func; } とあるとき、vpからfuncの返値、引値の型をとる方法ありますか?
>>386 それほしいんだけど・・・
catchをズラズラ書くのはダサイし・・・
typeidはなしの方向で
>>392 的確なアドバイスありがとうございます。
疑問点がまた幾つか浮かび上がってきまた。
修行してきまつ
398 :
デフォルトの名無しさん :03/01/10 00:02
クラスライブラリを作成してるんですが、拡張性を持たせようと ほとんどのメンバ関数をvirtual指定しました。 そしたら、友人から「virtual指定すると遅くなるから、必要な物だけにしたほうがいい」 と言われたんですが、実際そうなんでしょうか? (なんか仮想関数テーブルがなんたらかんたらで遅くなるといっていました)
399 :
デフォルトの名無しさん :03/01/10 00:06
アセンブリ言語よくわからないんでつ。。
それ以前の問題で 「拡張性を持たせるためにvirtualにする」 が変。 どこをどう拡張するかを決めずに設計しても無駄。
402 :
デフォルトの名無しさん :03/01/10 00:09
>>398 そもそも、拡張性のために何でもvirtualという考え方がどうかと・・・
何でもvirtualじゃないと拡張性が無いのだとすれば、
クラス設計自体に問題があるのかもしれません。
>>402 そうそう。
ポリモーフィズムが必要な場合を判断できなきゃね。
>>401-403 なるほど。。クラス設計考え直して見ます。
ありがとうござますた。
(C++の基本的な考えとして、virtualしたものはしないものより遅くなるんでしょうか?)
398叩かれまくり。かわいそうだからフォローしてやろう。 "拡張性"の定義はしっかりしたほうがいい。 プラグイン的なものを組み込めるような拡張性 多くの用途に対応するための拡張性 環境への依存度を下げるための拡張性 これらは重なる部分もあるけど微妙に違う。 どの拡張性を求めているのか、検討しとけ。 virtualのコストは確かにあるが、最近のCPUではわずかなもんだ。 そこにハマって効率を上げる努力より、 しっかりクラス設計をする努力のほうが何万倍も効果があるぞ。 言語仕様に流されすぎないようにな。
余談だが 同人コミケ板のバナーにC++って書いてあるような気がするのは俺だけか? 一体何の関係が?
>>406 あれは2CHと書いてあるんだと思われ。
ループの内側だと一生懸命になる罠
ひろゆき氏が発行するメールマガジンで明らかにした。 ってあるけど、電波2ch以外にメルマガってあった?
>>398 ここは C++ のスレなので(当然) C++ 文化が濃厚だから、
他(Java厨やC#厨のすくつ)でも聞いてみるといい。
(Java厨の所では「メソッドは final が基本って本当ですか?
C#厨の所では「sealed が基本って本当ですか?
と書けば、C++ でいう非 virtual が基本ですか?と聞いてるのとほぼ同じような意味になる)
色々な文化の人の意見を聞いて、自分で実践してみて、
自分が正しいと思ったものを選べばいいさ。
言語仕様マンセーな連中にバカにされて終わりだろ 言語に強く依存した設計してるうちは仕方ないかもしれんけど
JavaやC#はMethodTableのようなもので全てのメンバ関数を管理してるから、 virtualかどうかはパフォーマンスに関係ない。C++はそういうものとは違う。 非virtual関数はC関数のように直接callする。Cで理由もなく全ての関数に 関数ポインタを作って、それ経由で呼び出してるのと同じぐらい馬鹿げてる。 virtualは必要なところでだけ使うべき。 ただ、、、Cで書くほど最適化されている必要はないけど、VM上では遅すぎる。 こういうニーズってのがやっぱりあって、また設計上の柔軟性(いい加減さ)も 必要となれば、virtual多用も悪くないかもしれないとは思う。
昨日の教訓。 暗黙のコピーコンストラクタでは、各メンバのコピーは やっぱりコピーコンストラクタで行われる。代入(operator=())ではコピーされない。 つまり、「暗黙のコピーコンストラクタは、コピーコンストラクタしか呼ばない。」 「何だ当然じゃん」という意見もあるだろうが、バグって改めて実感。 これが昨日の教訓。 ポインタ型のメンバを持つデータ型をSTLコンテナへ突っ込む場合、 一応コンストラクタを再確認した方がよろしいですね。 「そのポインタの先は生きているか?」(藁 代入演算子は頑張ったんですけど、暗黙のコピーコンストラクタに関しては・・・片手落ちでした。 これが昨日の教訓。
>>412 > JavaやC#はMethodTableのようなもので全てのメンバ関数を管理してるから、
> virtualかどうかはパフォーマンスに関係ない。C++はそういうものとは違う。
本気で言ってるのか?
>>42 ん?おそらく伝わってないと思われ。
まず、普通、企業が内容証明で削除依頼を出すとき、
内容証明で名誉毀損の部分を削除しろって言うわけでしょ。
その時点で、ひろゆきは名誉毀損を知るから、削除義務が生じるって言いたいだけ。
内容証明が来る=名誉毀損でなくても削除する
とは俺は一言もいってないですよ。
>>42 ん?おそらく伝わってないと思われ。
まず、普通、企業が内容証明で削除依頼を出すとき、
内容証明で名誉毀損の部分を削除しろって言うわけでしょ。
その時点で、ひろゆきは名誉毀損を知るから、削除義務が生じるって言いたいだけ。
内容証明が来る=名誉毀損でなくても削除する
とは俺は一言もいってないですよ。
俺が言ってる前提が 内容証明=削除依頼になっていて、削除してほしいリストが書いてあるはず だからおそらくかみ合ってないのだな。 内容証明が来て、名誉毀損箇所を削除してねって書いてあって、 それが名誉毀損だったら削除しなきゃダメよってことかな。
裁判官は西村博之に自分の子供の心臓手術をさせて藪か層でないか確かめろ。 半ケツはそれからだ。
実質的には上告はもう無理らしい。 うれしいなぁ。
420 :
デフォルトの名無しさん :03/01/10 11:51
文字列 "sensor:10.00000, 20, 30, 40, 50.00000 ,60" の各値を 配列 double sensor_data[6] に格納できる関数とかってありますか?
>>420 std::sprintf or std::istringstream
do yo?
どよ?
ここは排他的なボランティアですね。
名前(アルファベット)五人分入力 ↓ 辞書式に並び替える ↓ "meido.doc"ファイルに書き込む というプログラムを教えてください。 まじ困ってます。
426 :
デフォルトの名無しさん :03/01/10 16:09
conservation!
2
マルチは放置しろ、と。
430 :
デフォルトの名無しさん :03/01/10 16:33
これ解析してください。お願いします・・心から if ( pix == NULL ) { pix = new BYTE[dim_x*dim_y]; {BITMAPINFOHEADERinfoHeader; int i; if(pMapBits)delete pMapBits; infoHeader.biSize = sizeof(BITMAPINFOHEADER); infoHeader.biWidth = DIM_X; infoHeader.biHeight = DIM_Y; infoHeader.biBitCount = 8; infoHeader.biPlanes = 1; infoHeader.biXPelsPerMeter = 0; infoHeader.biYPelsPerMeter = 0; infoHeader.biClrUsed = 256; infoHeader.biClrImportant = 0; // nColors; infoHeader.biCompression = BI_RGB; infoHeader.biSizeImage = DIM_X * DIM_Y; int colorAlloc = 256 * sizeof(RGBQUAD); // size of color tables int bitsAlloc = infoHeader.biSize + colorAlloc;//+ infoHeader.biSizeImage; pMapBits = (LPBITMAPINFO)new BYTE[bitsAlloc]; memset(pMapBits,80,bitsAlloc*sizeof(BYTE)); pMapBits->bmiHeader = infoHeader; LPSTR pColor = ((LPSTR)pMapBits + (WORD)(pMapBits->bmiHeader.biSize)); for (i = 0; i < 256; i++) ((WORD*)pColor)[i] = i;
>412 それ以前に、virtual 関数だろうが型が明示的に決まってれば間接ジャンプに ならんでしょ。 struct B { virtual void foo(); }; struct D : B { virtual void foo(); }; D d; d.foo(); // これは直接ジャンプになる virtual で間接ジャンプになるのはポインタや参照を使った場合だが、それって 同等のコードを仮想関数なしで書こうと思ったら、switch - case 使うことになる だけ。どっちにしても必要なコストだよ。
誰かtypeof作ってくれよ。
質の低い書きこみを減らすのが趣旨です。
この板、荒れなくなったね
ZDNetは2chネタ好きだからな
>>434 C++ Template 統合スレで目にしたような気がする。
GCC の typeof のようにはいってないけど
438 :
デフォルトの名無しさん :03/01/11 01:17
>>412 いい加減さの為にvirtual多用したら、
保守が大変で再利用不可のクラスが出来るだけじゃない?
>>432 静的に使うなら、virtualにしなくても良いのでは?
virtualって、動的な使い方しないなら不要かと思うのだが。
ただ、必要なコストってのは同意。
むしろ、virtual使って動的にした方が、
コードがスッキリして保守が楽だと感じる。
ただし、設計がおかしくてvirtualの罠にハマって無い場合ね。
> D d;
> d.foo(); // これは直接ジャンプになる
なにが直接ジャンプだ。頼むからウソ書かないでくれよ。
>>432
440 :
デフォルトの名無しさん :03/01/11 01:37
コンストラクタのイニシャライザで 配列のデータメンバを初期化することはできますか? class A{ bool flags[2]; A() : flags( { FALSE, FALSE }){} }; を試しましたが、ダメでした。
441 :
デフォルトの名無しさん :03/01/11 01:41
>>440 標準ではできない。g++の拡張使えばできるんじゃないかな。
>>440 これじゃダメ?
class A{
bool flags[2];
A(BOOL bA, BOOL bB)
};
A::A(BOOL bA, BOOL bB){
flags[0]=bA;
flags[1]=bB;
}
A myA(FALSE,FALSE);
443 :
デフォルトの名無しさん :03/01/11 01:57
>>439 g++だとテーブル経由にならないよ。
それともジャンプじゃなくてコールだって言いたかった?
>>439 論より証拠やね。
void test() { D d; d.foo(); }
これを gcc でコンパイルした結果。
.globl _test__Fv
.def _test__Fv; .scl 2; .type 32; .endef
_test__Fv:
subl $28,%esp
movl $__vt$1D,(%esp)
addl $-12,%esp
leal 12(%esp),%eax
pushl %eax
call _foo__1D
addl $16,%esp
addl $28,%esp
ret
vptr 介さず、直で D::foo (_foo__1D) 呼んでるでしょ。
それって最適化の範疇に含まれるの?それとも言語仕様的に そうするのがいいっていう暗黙の了解みたいなやつ?
446 :
デフォルトの名無しさん :03/01/11 02:08
>>445 コンパイルされた後のコードの話だから言語仕様とは無関係。
>>446 いや、そういう仕様に含まれるのかどうかの話じゃなくて
他のコンパイラもそうなってるのかっていう話
>>447 少なくともVC++6.0は仮想関数テーブル経由しないみたいだが。
449 :
デフォルトの名無しさん :03/01/11 03:01
>>447 C++にはオブジェクトの仮想テーブルを直接変更する手段は用意されていないので
普通そうなる、でいい?
>449 いや、そういう問題では…。 444 のコード見ても分かるように D d; の時点で vtbl ($__vt$1D) はインスタンス に書き込まれている。 一般には仮想関数は vtbl->vptr 経由で呼ばれるんだが、変数の実際の型が ソースコードを呼んで分かる場合 (D&, D* ではなく D そのものを使ってる時) には vtbl->vptr を介さずに直に D::func() を呼ぶ。 って話でしょ。
>>441-442 ありがとうございます。素直に代入文で書こうと思います。
ちなみにg++でも無理でした。
452 :
デフォルトの名無しさん :03/01/11 03:33
453 :
デフォルトの名無しさん :03/01/11 03:33
454 :
デフォルトの名無しさん :03/01/11 03:41
多胎がやっと理解できますたこうゆーことだったんですね #include <cstdio> class Juukan{public:virtual Juukan& operator=(int nani){return *this;}}; class Usi:Juukan{public:Juukan& operator=(int nani){printf("モッモォォオ~~\n");return *(Juukan*)this;}}; class Uma:Juukan{public:Juukan& operator=(int nani){printf("ヒッヒィィイン\n");return *(Juukan*)this;}}; class Hituji:Juukan{public:Juukan& operator=(int nani){printf("メェェェエエ~~\n");return *(Juukan*)this;}}; int main(){Juukan *p; p=(Juukan*)new Usi;(*p)=1;delete(p); p=(Juukan*)new Uma;(*p)=1;delete(p); p=(Juukan*)new Hituji;(*p)=1;delete(p);}
クソスレは今から立てようと思ってるんだけど
◎●●●●●◎ ◎●ミ.|.|.|.|.|.|.|彡●◎ ◎●ミ 口 彡●◎ ◎●三 口 .| .| 三●◎ ◎●彡 ノ └-.ミ●◎ ◎●彡川.|.|.|.ミミ●◎ ◎●●●●●◎ __◎' ◎' ◎_ | 友 | | 枝 | | 小 | | P | | T | | A | /7 ̄ ̄ ̄ ̄ ̄キヘ /7 キヘ /7 キヘ
半島人に占領されたこの国での最後のフロンティアだったのに・・・ これで、レジスタンスの活動の場が一つ減った・・
>>444 それは同一ソースにすべてを書いたときのgccの最適化の結果。
ソースの書き方や、処理系、最適化などがそのような条件を満たさないと
「これは直接ジャンプになる」なんてこと、断言できないでしょ?
>>432 ではそんなこと、どこにも書いてないじゃん。
ここは特定の処理系がどのような実装をしているかのスレじゃないわけだから、
純粋に C++ の言語仕様などに関して、初心者があらぬ誤解をしないように書かないと...。
...と、いうことが言いたいんだがな。
460 :
デフォルトの名無しさん :03/01/11 11:51
struct A { std::stringstream _Base; typedef std::basic_ostream< char, std::char_traits<char> > _Myt; _Myt& operator<<(wchar_t a){} _Myt& operator<<(unsigned short a){} }; wchar_t と unsigned short て区別できないのかな。 数字と文字で区別したいとき困る気がするのだが...。
>>455 > それって最適化の範疇に含まれるの?
C++のクラスってコンパイル時に静的に決定するから、例の呼び出しは
直接コールにしてもvtbl経由でも結果は同じ。つか同じにならないと変。
直接コールにすることを最適化と呼ぶかどうかは
コンパイラ実装者の気分次第。
>>459 > それは同一ソースにすべてを
すべてって?
この例ではD::foo()の実装しか追い出せないと思うが、
D d; d.foo();
は常に直接コールにすることが可能じゃないか?
> 断言できないでしょ
おそらく皆々皆様方((c)沢村)が知りたいのは、
直接コールにすることが仕様上問題ないか、であって、
必ず直接コールになるかどうか、じゃないと思う。
,,-' _,,-''" "''- ,,_  ̄"''-,,__ ''--,,__ ,,-''" ,, --''"ニ_―- _ ''-,,_ ゞ "- て / ,,-",-''i|  ̄|i''-、 ヾ { (" ./ i {;;;;;;;i| .|i;;;;;;) ,ノ ii ,, ( l, `'-i| |i;;-' ,,-'" _,,-" "'-,, `-,,,,-'--''::: ̄:::::::''ニ;;-==,_____ '" _,,--''"  ̄"''-- _-'':::::" ̄::::::::::::::::;;;;----;;;;;;;;::::`::"''::---,,_ __,,-''" ._,,-'ニ-''ニ--''" ̄.i| ̄ |i-----,, ̄`"''-;;::''-`-,, ,,-''::::二-''" .--i| .|i "- ;;:::`、 ._,-"::::/  ̄"''--- i| |i ヽ::::i .(:::::{:(i(____ i| .|i _,,-':/:::} `''-,_ヽ:::::''- ,,__,,,, _______i| .|i--__,,----..--'''":::::ノ,,-' "--;;;;;;;;;;;;;;;;;""''--;;i| .|i二;;;;;::---;;;;;;;::--''"~  ̄ ̄"..i| .|i .i| |i i| |i .i| .|i キタ━━━━━━━━━ i| (゚∀゚) .|i ━━━━━━━━━━!!! .i| |i .i| ,,-、 、 |i i| ノ::::i:::トiヽ、_.|i _,, i|/"ヽ/:iヽ!::::::::ノ:::::Λ::::ヽ|i__n、ト、 ,,/^ヽ,-''":::i/::::::::/:::::|i/;;;;;;/::::;;;;ノ⌒ヽノ::::::::::::ヽ,_Λ ;;;;;;:::::;;;;;;;;;;:::::;;;;;;;;:::/;;;;;;:::::::::;;;;;;/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::;;:;;;;:::ヽ
463 :
デフォルトの名無しさん :03/01/11 13:03
フレンドは無理な設計変更に対応するための非常用という 認識で間違ってないですか?。今見てるソースは親クラスを フレンドにしてたりしてわけわかめです。
アフォにはその認識でいいのでは。
>>463 非常用というより、必ずフレンドを使う場面はある。
+演算子の実装とか。
フレンドクラスはコンポジションを使って複数のクラスを協調動作
させ、なおかつカプセル化も維持したい場合よく使う。
466 :
デフォルトの名無しさん :03/01/11 13:21
アフォでない人はどのような認識を持ってると??
>>465 なるほど、勉強になりました。ありがとうございます。
468 :
デフォルトの名無しさん :03/01/11 13:44
DMC貧相すぎ iostream使えねえ
469 :
デフォルトの名無しさん :03/01/11 15:25
2げっとさ
半角板がおもしろい
ぼんやりと思ったのだが、文字列をコードとして認識する機能ってC++にないのか? ありゃ便利だと思うのだが。
473 :
デフォルトの名無しさん :03/01/11 17:18
いばーる
>いばーる そりゃなんすか?関数?クラス?
>>472 それは、実行ファイルにコンパイラを埋め込めといってるのか?
スクリプト系の言語だと eval() とかあるけど、コンパイラ言語だと自前で
マクロ言語を組み込むのが普通かと。yacc + lex 使えると幸せになれるぞ。
文字列にマシン語ルーチンを入れてコールしれ。
>476 例を
ひろゆきの腐れチンコめ 氏ね
まぢかよ。
IP記録しても構いませんので、スレッドをもっと立てやすくしてください。 IPが記録されるような掲示板は匿名掲示板とはいえませんが、 スレッドが立てられないような掲示板はもはや掲示板ですらありません。
文字列じゃないが構造体にマシン語ぶちこんでる例が見たければATLのソース。
だいぶ昔とらわざコンピュータで「文字列のマシン語」見たいなやつがあったな。 普通にテキストファイルで開けるんだけど、実は実行形式みたいなやつ。
>直接コールにすることが仕様上問題ないか、であって、
>必ず直接コールになるかどうか、じゃないと思う。
おっと、問題をすり替えないでくださいよ。
直接コールになるとは「断言できない」ってことを、
>>461 は自分から認めてしまいましたね。
>>459 > ソースの書き方や、処理系、最適化などがそのような条件を満たさないと
> 「これは直接ジャンプになる」なんてこと、断言できないでしょ?
まぁ C++ の規格って、そういうもんだからな。
ただ「型が明示的に分かる場面では仮想関数でも直接コールされる」ってのは、
「inline と指定した関数はインライン展開される」のと同程度には、信用して良い
でしょ。
>>483 おちつけ…
> 直接コールになるとは「断言できない」ってことを、
agree.
ただし、ポインタ・参照を介さずに仮想関数を呼び出す場合、呼び出す関数を
コンパイル時に確定できるってのは理論的に正しい。で、実際に最適化を有効
にしたにも関わらず、間接呼び出しにしてるコンパイラの実例が一つも挙がっ
てないのも確か。
後は「読んだ人間が自分で判断してくれ」で、良いんじゃないの?
inline void somefunc(B* pB) { pB->method(); } foo() { D d; somefunc(&d); } これはどうだろう。
487 :
デフォルトの名無しさん :03/01/12 01:33
> 間接呼び出しにしてるコンパイラの実例 マイナーなC++コンパイラが列挙されるだけだと思う
489 :
デフォルトの名無しさん :03/01/12 02:02
マイナーなコンパイラ一覧がみたいぞよ
&マジでやったんかい。 俺もびびったよ。
メルマガ転載きぼん
結局、キラーは何もしなかったんだな、 まぁ、それでいいわけだが。 少し、ほんの少し、祭りを期待していた自分がいる(´・ω・`)
こっちか。 他に、今、裁判中なのは何??
>>483 なんだまだやってんのか、結論のみ言う。
型が静的に確定できる場合、例えば
obj.fun() (obj は参照ではないとする) とか pobj->class_name::fun() の時
仮想関数テーブルは参照されない。
あるいは virtual 非virtual を区別しないと言うべきか。
ただ単に無用であるばかりでなく、有害な場合さえある。
最適化は関係無い。
>>496 > 仮想関数テーブルは参照されない。
されない?してはならない?するべきでない?しなくてもよい?
はっきりさせてくださいよ。
498 :
デフォルトの名無しさん :03/01/12 11:50
>>497 そんなこと言う前に本を嫁よ。
言語仕様には関係ないってんだろ。コンパイラの実装にまかされてるよ。
pobj->class_name::fun() については規格書に Explicit qualification with the scope operator suppresses the virtual call mechanism. と書いてあるんだが、obj.fun() については記述を見つけられなかった。
>>500 自明なことですね。確かにこの場合、直接コールになると「断言」できます。
でなければ、その処理系は"C++"ではありません。
しかしobj.fun()の方は直接コールになるとは「断言できない」ということで、
この件、既に結論は出ていると思います。
ハーブ・サッターまんせー 浜田真理まんせー まっちくたびれたのはSO- 君がランチ忘れテレビきょときょとー カラフルな地球眺めてもっとー 憂鬱なんて忘れてとびだそー ASHITA! マニアーナ
>>501 > しかしobj.fun()の方は直接コールになるとは「断言できない」
それ以前に「直接コール」「間接コール」が使われるということさえ、
規格には書いてないけどな。
IP取得開始前の過去ログが晒されたら、またその時点で侵害行為発生じゃん。 で、書き込み者が特定できないから云々・・となると思うが・・・。
嘘はついていないんだろうけど…。(;^ ^
506 :
デフォルトの名無しさん :03/01/12 21:04
CトランスレーターCfrontって今でもありますか? 勉強としてすごくほしいんですが
質問です PC:A、B、CがあってAがB、Cから二秒おきくらいに4ビットの数字を受け取るように したいのですが LANとUSB、シリアルとパラレルのどれを使ったほうが良いでしょうか? ちなみに送信する側のB、Cは重い処理をやってるので早く通信が終った方がいいです。 またプログラミング初心者なので(デルファイでソケット程度の通信しかやった事が無い) なるべく簡潔なソースで済む方が嬉しいです。 これが分かれば調べるのも捗るのでよろしくお願いします。
UDPかTCPでパケット投げろ。 ソケット使えば簡単だろ。
>>508 レスありがとうございます。やってみます。
>>506 そもそも Cfront ってフリーソフトじゃないし、UNIX System V 向けの
ものしか提供されてないと思ったが。
x86 で動いてかつ C のソースを出力する C++ front-end ってことだと
Comeau C++ Compiler かね。使ったことないけど Web Page 見る限りで
は。
http://www.comeaucomputing.com/
511 :
デフォルトの名無しさん :03/01/13 00:02
#include <windows.h>#include <cstdio> #define DATA_AXIS_NUM 2048 int main(){int x,y,z,t; BYTE **pData; pData=(BYTE**)new BYTE *[DATA_AXIS_NUM]; for(y=0;y<DATA_AXIS_NUM;y++) pData[y]=(BYTE*)new BYTE[DATA_AXIS_NUM]; for(z=y=0;y<DATA_AXIS_NUM;y++) { for(x=0;x<DATA_AXIS_NUM;x++) { if(z==0&&z!=x%256) t=0; if(223<z&&z<230) t=0; pData[y][x]=(BYTE)z++; } z=0; } for(y=0;y<DATA_AXIS_NUM;y++) delete[] pData[y]; delete[] pData; return 0; } (BYTE)223辺りから0を返してきますが、メモリ破壊してる? VC++.NET&WinXP
> (BYTE)223辺りから0を返してきますが、 何を言ってるのかサッパリなのは、俺だけ?
513 :
デフォルトの名無しさん :03/01/13 00:38
>>512 (BYTE)z++がz=223辺りから255位まで0を返してくるのですが
メモリ破壊のせいでつか?それとも実体の取り方がおかしいでつか?
515 :
デフォルトの名無しさん :03/01/13 05:58
g++(3.2)を初めて触ってみてるのですが、 ひょっとして、std::wstringが使えなかったりします? それと、setのconst_iteratorをtypedefすると、implicit typenameという警告が出ますが これはどういう意味でしょうか。(bcc32だと素通りするコード)
>511 tはなんのためにあるん?
>>516 tは条件ブレークポイントの為でつ
宿題擦れに言ってきます
>>515 > ひょっとして、std::wstringが使えなかったりします?
gcc スレに行ったほうがよいかも。おそらく、glibc が古くて wchar_t を扱う
関数 (wprintf とか) が未実装のため、configure 時に _GLIBCPP_USE_WCHAR_T が
undef されているんだと思う。
> setのconst_iteratorをtypedefすると、implicit typenameという警告が出ます
set<T>::const_iterator の前に typename を付ける。
credit card ホスィー
520 :
デフォルトの名無しさん :03/01/13 14:27
>>518 回答ありがとうございます。
typenameは、見事に警告が消えました。
これは、どういう時に必要なのでしょうか。
wstringはよくわからなかったので(該当しそうなのをdefineしても駄目)、
また必要になった時にgccスレで聞いてみます。
>>521 テンプレートクラス内の識別子を、型名から探すようにコンパイラーに指令を出すのです。
↓こんなクサレコードを想像しる。
struct X
{
struct const_iterator {};
struct const_iterator const_iterator;
};
>>521 gcc スレより、その OS のスレで聞いた方が良いかもしれん。
524 :
デフォルトの名無しさん :03/01/13 16:07
仮想関数&純粋仮想関数のメリットとデメリットを教えて~
525 :
デフォルトの名無しさん :03/01/13 16:23
>>524 polymorphism(ポリモーフィズム)と仮想関数でググってみな。
>>522 え?え?え?
最初のが構造体で、次が変数で…
でも同じスコープで同じ名前なので識別子の多重定義エラーでは?
????
>>527 構造体と変数の名前は、別個に管理されてる。重複しても問題ないぞ。
(試せ)
(^^)
530 :
デフォルトの名無しさん :03/01/13 21:17
文字列の中のある文字(たとえばABC)とかを検索して、それが見つかったら何かを返す関数とかってないですか?
531 :
デフォルトの名無しさん :03/01/13 21:20
532 :
デフォルトの名無しさん :03/01/13 21:40
>>531 ありがとです。
strchr strstr
534 :
デフォルトの名無しさん :03/01/13 22:09
ファイルのサイズを返す関数ってありますでしょうか?
>>534 OS依存だが
unix系、MS系どちらもstat()/fstat()が使える
MS系ならio.hの_filelength()というのもある
536 :
デフォルトの名無しさん :03/01/13 22:27
>>535 win98で使えるのは何か無いでしょうか?
win98はMSの製品です
539 :
デフォルトの名無しさん :03/01/13 22:45
>>537 そうでしたか。すみません。
long _filelength( int handle );
handolって何ですか?
ターゲット ファイルのハンドルって書いてありますが、
何なのでしょう?
>>539 OSに近い、ファイルへのローレベルなアクセス用ハンドル。
unixでいう0がstdin, 1がstdout, 2がstderrってのとほぼ同じ。
FILE* fp = fopen("fairu ne-mu", "r");
int handoru = _fileno(fp);
long saizu = _filelength(handoru);
>>541 どうでもいいがハンドルの綴りは handle で頼む。
543 :
デフォルトの名無しさん :03/01/13 23:01
>>541 ありがとうございます。
後、聞きたいことが・・・。
ファイルを読み込んだときのデータへのポインタは
どうしたら得られますか?
546 :
デフォルトの名無しさん :03/01/14 00:26
現在VCで開発しています。 グローバルで CFileControl cfc(); と宣言し、 cfc.FileOpen("ReadMe.txt"); sFRead=(char*)cfc.FileRead(4); cfc.FileClose(); といった形でクラスのメンバ関数を使っているのですが、 error C2228: '.FileOpen' : 左側がクラス、構造体、共用体ではありません。 というエラーが出ます。 この原因はどういったことが考えられるんでしょうか? 御教授お願いします。
>>546 CFileControl cfc(); ←このカッコをつけた事で、cfcの関数プロトタイプ宣言
だとみなされれてるんじゃない?カッコ取ったらどうでしたか?
× CFileControl cfc(); CFileControl クラスのインスタンスを返す cfc という名前の関数 ○ CFileControl cfc(); CFileControl クラスの変数 cfc をデフォルトコンストラクタで初期化
かぶつた。。。
× ○ CFileControl cfc(); ○ ○ CFileControl cfc; しかも間違えてるし、俺。。。
>>547 さん ありがとうございます。
その通りでした。
お騒がせしました。
いっぱいかぶったね、釣り師ならかなりの釣り吉だね。
>>530 string::find(~);
とかは
それはメソッド。
Σ(´∀`lll) そうか… functionを聞いてたのか…
557 :
デフォルトの名無しさん :03/01/14 18:08
c++でgetlineを使っているのですがどうもうまく動作してくれません。 MSDNのヘルプを調べたのですが getline 関数は、次のどれかが起きるまで、 入力ストリームからのすべての文字を含む文字列を作成します。 - EOF (end of file)。 - 区切り記号を検出した。 - is.max_str() 個の要素を抽出した。 と書いてありました。 ここでいう区切り記号というのは何のことでしょうか? 文字列内のタブなども含まれるのでしょうか? ご回答よろしくお願いします。
558 :
デフォルトの名無しさん :03/01/14 19:53
ファイルからデータを指定のバッファに読み込むプログラムを 作ったのですが読み込まれません。 どこがおかしいのでしょうか? よろしくお願いします。 void main() { FILE *fin; int i; fin = fopen("right.jpg","rb"); // ファイルサイズの取得 int dwSize = 0; while (fgetc(fin) != -1) dwSize ++; printf("ファイルサイズ=%d\n", dwSize); // データの格納領域の取得 char *pFileBuf = new char[dwSize]; // ファイル構造体の最初のアドレス pFileBuf = fin->_base; fread(pFileBuf, dwSize, 1, fin); }
559 :
デフォルトの名無しさん :03/01/14 20:19
>>558 fgetc()で全部読んでるからだよ。
560 :
デフォルトの名無しさん :03/01/14 20:21
>>559 dwSize++の前ってことですか?
読み込んだ場所のところからは値が無くなるってことですか?
改良したら読み込めました。 ありがとうございました
#include< iostream.h> main() { int num; do{ while(cin>> num) { } }while(cin >> num); return0; } 繰り返しが行われません、理由を教えていただけませんか、入門者ですレベルが低くてすいません
>>558 void main()と書くは氏ね。int main()と書け
>>563 まったくよー
//が書けるようになって喜んでいる自称C++使いと同レベルだな
色んなスレで馬鹿の一つ覚えを繰り返している能無しこそ早く氏ね
つーかさ、
>>563 はnewを使っている点以外はCの範疇じゃん。
newをmallocに書き直してCスレに逝け。
>>557 区切り記号とは改行コードのこと。引数で指定することもできる。
>>568 do-while文が勝手に値が入力されて終わってしまいます
void foo(void){ int a; } のaに直接アクセスする方法ないですか?
>>570 多分無理だろうな,aは実行環境に存在しないから
ローカル変数に外からアクセスしたいって事だろう。無理だけど。
いや、例えば template<typename T>struct X{ tyoedef T type; }; template<typename T>void foo(T t){ X<T> tx; } となっていれば、変数を渡して型を摂れるかなと思いまして。 やっぱムリですね。
>bind1stのようなことか?
すいません。初心者なのでわからないです。
が、もし
>>574 のようになっていたら、
main(){
int a;
foo(a)A=10;//あるいはtxに直にアクセスできるとしたら、tx::typeとか
}
という実行時に型を生成できるかなと思いまして。
>>576 すると,こんなことか?
struct object
{
virtual object* create() const = 0;
};
template<typename T>struct X : object
{
virtual object* create() const
{
return new X<T>();
}
};
main()
{
X<int> a;
object* p = a.create();
X<int>* px = dynamic_cast<X<int>*>(p);
}
この時間に見てらっしゃる方>> 562を看ていただけませんでしょうか
>>578 「cin >> num」 は num じゃなくて cin を返すわけだ。
あとはわかるだろ?
>>578 std::cin >> num はEOFもしくはエラーを検出したらfalseを返す。
それを念頭においておけば簡単。
template<typename T>void typeof(T t){ typedef T TYPE; } このTYPEにアクセスできたら・・・
>>562 ・コンパイラは何なのかは必ず書けい。
・#include< iostream.h> よりは
#include <iostream>
using namespace std;
にしておこう。
・↑と、return0; を return 0; に直したら VC++7 と bcc5.51 と gcc3.2 では
何回数字を入力しても終わらないようにちゃんとなったが。
>>579 cin はエラーが発生してなければtrue扱いになるように
キャスト演算子が定義されてるわけだが。
>>581 引数とTYPEに結合がなく戻りがvoidじゃ無理だろうな
object* dup(object* org) { if(mona* p = dynamic_cast<mona*>(org)) { return p->create(); } else if(giko* p = dynamic_cast<giko*>(org)) { return p->create(); } else if(zonu* p = dynamic_cast<zonu*>(org)) { return p->create(); } else if(baya* p = dynamic_cast<baya*>(org)) { /* ■■ ■■ ■ ■ ■■ ■■ ■■ ■ ■ ■■■■■■■■ ■■ ■■ ■■■■■■■■ ■■ ■■ ■■■■■■ ■■ ■■ ■■ ■■ ■■■■■■ ■■ ■■ ■■ ■■ ■■ ■■ */ return p->create(); } else { return 0; } }
>>578 マルチがうざいので答えもマルチしてやる。
C++のストリームは一度eofbitが立ってしまうと、明示的にクリアしてやらないと
元に戻らない。下のプログラムのようにしたらどうか。
#include <iostream>
int main()
{
int num;
do {
while (std::cin >> num)
{
}
std::cin.clear();
} while (std::cin >> num);
}
>>582 漏れが何か間違った事書いたかい?
operator>> が bool を返すとか言わないよな?
寝るぞ
>>586 operator>>をcinの文脈で使えばcinが返るが、ブール式中で使うと
operator *() が適用されてtrueかfalseを返す。
ソース:C++標準ライブラリ、P573、§13.4.3
スマソ。operator ()ね。 operator *()なんてのは無い。
>>588 >>operator *()
ヴォケ
>>585 見せて頂きました、おなじかたなのでしょうか、こちらでは見てのとおりの対応を受けております…
返答を頂、うれしかったです
>>589 >operator ()
ヴォケ
double faultぢゃstupid!
>>592 あの・・・・・そしたら、C++標準ライブラリP573、§13.4.3に書いてある事は
デタラメって事でしょうか?真面目に質問します。
>>588 operator void* () ではなかったっけか。
>>593 その本読んだことはないが、 本当に operator() と書いてあるなら
誤植か何か。 if( cin ) ... とは書けても if( cin() ) は無理っしょ?
>>594 あっその通りです!operator void* ()と書いてあります。
勝手に書き換えてしまってすみません。
>>595 え?
operator bool じゃないのか?
>>596 これは多分ストリームの変換演算子なんですね。
C++第3版で言うと、P706、§21.3.3に書いてあります。
operator bool()は整数に変換されてしまうので、 boolの文脈のみを許可したい場合にはoperator void*()を使うことがある。
>>593 これだ. . . 自分で確かめも考えもせずに何を撒き散らしてやがる
while(cin>> num)のどこがどんな根拠でどのようにoperator()の呼び出しになるのか書いてみろや
600 :
デフォルトの名無しさん :03/01/15 00:32
f(char * x)関数を呼び出すときは f(y)の引数yの型は何にすれば良いですか?
>>597 実験したら、そのようだ。
けど、何でそうなってるんだ?
if() の中では operator bool が真っ先に呼ばれるのに、operator bool を実装
してない理由がわからない。
今度こそ寝るぞ
606 :
デフォルトの名無しさん :03/01/15 00:40
>>604 yをchar*型にしても、
xの値がyに反映されないのですが、どうしてでしょう?
"operator void*() reason"でgoogleで検索したら、たくさんヒットした。 何か的確な理由がないかどうか探している。
>>606 引数が参照渡しではなく値渡しだから。
f(int x) に int y を渡して、y を変更できると思うか?
>>610 今そのリンク読んでみました。
なるほど、void*なら、ポインタの演算ができませんから、使われる場所を
限定する効果があるのですね。
ありがとうございました。
612 :
デフォルトの名無しさん :03/01/15 04:03
テンプレートの型引数で int を受け取った時に unsigned int になるような型って取れないですか? template <typename T> class Hoge{ typedef unsigned T UnsignedType; }; ではダメみたい(VC++6)なのですが。
templete の < > が不等号の記号と間違われてコンパイルエラーが出ることがあるんだけど どういう場合に出るんだっけ? <>まわりの空白の有無で回避できるんだけど。
614 :
デフォルトの名無しさん :03/01/15 06:08
>612 template <typename T> class Hoge{ unsigned int UnsignedType; public: Hoge(T x){ if(typeid(T) == typeid(int)){ UnsignedType=static_cast<unsigned int>(x); } } }; こんな感じでいいんじゃない?
615 :
デフォルトの名無しさん :03/01/15 06:34
template <int> class Hoge{ typedef unsigned int UnsignedType; }; 特殊化スレ
616 :
デフォルトの名無しさん :03/01/15 14:15
メモリリークを見つけるツールとかってあるのでしょうか? Visual C++.NETを持っているのですが、そのデバッガの使い方は まったくわかりません。 もしデバッガでできるのでしたら、その方法を教えてください。 よろしくお願いします。
DEBUG_NEW
BoundsChecker とか。
C++Builder買ってCodeGuard使え!最強だぞ。
620 :
デフォルトの名無しさん :03/01/15 16:53
cout.flush()ってたとえば↓のような場合、どういう役に立っているのですか? 例: cout<<"test\n"; cout.flush();
(^^)
>>620 streamのflushれす
MSDNでも見ればわかるよ
>>620 バッファのフラッシュ(書き出しみたいなモン)たとえば
cout<<"test\n";
cout.flush();
BugFunc();
とあって、 BugFunc() の実行でプログラムが落ちても
test
は出力される。
624 :
デフォルトの名無しさん :03/01/15 20:49
>622-623 親切丁寧な解説Thanx㌧ 理解できました。 MSDN読んでも判んなかった物で…
>>623 普通は '\n' がきた時点で flush されるから、
その例だと cout.flush(); あってもなくても変わらなくない?
>>625 > '\n' がきた時点で flush される
そいつぁ初耳
>>626 きっとstdioが下請けになってるとでも思い込んでテストもしてないんだろ
628 :
デフォルトの名無しさん :03/01/15 22:31
ダイアログのピクチャーボックスに描かれた絵をウインドウを閉じたり、縮小しても消えないようにしたいです。BITMAPINFOHEADERやStretchDIBitsを使えばいいのかなとおもうのですけど、やり方がいまいちわかりません・・教えてください。 私が足したプログラムは次のだけです。 void CMy00000View::OnButton1() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください int x, y; CWnd* h = GetDlgItem(IDC_FIGURE); CRect r; h->GetClientRect(r); CDC* pDC=h->GetDC(); x = r.right/2; y = r.bottom/2; CPen p(PS_SOLID, 1, RGB(255, 255, 0)); CPen* oldp=pDC->SelectObject(&p); pDC->MoveTo(0, y); pDC->LineTo(2*x, y); pDC->MoveTo(x,0); pDC->LineTo(x, 2*y); pDC->SelectObject(oldp); h->ReleaseDC(pDC);
マルチ (・A・)イクナイ!
630 :
デフォルトの名無しさん :03/01/15 22:46
Comeau C++ってコンパイラ使ってる人います? C++→Cのトランスレータ機能があるっぽいんですが、実際のところ どんな感じで出力されるんでしょうか? もしくはほかに現在入手できるC++→Cのトランスレータってあります? ・・・ってスレ違い?
例外や継承はどう実装するんだ?
632 :
とけますか? :03/01/16 13:48
下記のコードで、標準出力に Giko の所持金が正しく表示されるように、 クラス Human を修正せよ。 クラス Giko および main() 内部を変更してはいけない。 #include <iostream> class Human { public: int getMoney() { return 10000; } }; class Giko : public Human { public: int getMoney() { return 10; } }; int main() { Human* usual = new Human(); Human* giko = new Giko(); cout << " usual : " << usual->getMoney() << endl; cout << " giko : " << giko->getMoney() << endl; delete usual; delete giko; return 0; }
いきました。 どうもどうも。
635 :
デフォルトの名無しさん :03/01/16 15:32
632ではないが class Human { virtual int getMoney() ; }; class Giko : public Human { int getMoney() ; }; のようなときに派生クラスのgetMoney()はvirtualつけなくていいけど 派生クラスだけ見たときに仮想関数かわかりにくいのとコピペで書くから virtual つけちゃうんだけど、これってよくないの? vtable とか大きく なったりする?
>>635 親クラスのgetMoneyがvirtualなんだから自動的にGikoのもvirtualになる。
vtableのサイズは変わらん。
お作法的にはvirtual付けるべき。
>>636 どーも、
>vtableのサイズは変わらん。
パフォーマンス的には変わらないんですね?
>お作法的にはvirtual付けるべき。
これからもコピペでつけ続けます。アリガトーゴザイスマタ
638 :
デフォルトの名無しさん :03/01/16 19:58
int *d = new int[size]; として delete [] d; とするとエラーが出てしまいます。 何が原因でしょう?
>>638 1. 途中で、d の値が書き換わってる
2. d で確保された領域の前後が書き換えられている
のいずれかだと思われ。
おそらく、2. の方。
640 :
デフォルトの名無しさん :03/01/16 23:02
char m_IdNumber[10][20]; の中に文字列を代入し、 void A(char*)のパラメータに渡すにはどうすればいいんでしょうか? A(m_IdNumber)とするとエラーになります。 よろしくお願いします。
>>640 A((char*)m_IdNumber);
期待した動作になるかどうかはわからんが。
>>640 やりたいことを小一時間考えなおして、もう一度きちんと書け。
643 :
デフォルトの名無しさん :03/01/17 01:46
auto_ptrをlistやmapの要素にすると、 insertでコンパイルエラーになるのですが、そういうもの?
>>643 だからあれほどauto_ptrをコンテナの要素に使うなと……
詳しい理由はそこらじゅうに書きまくられていることなので省略。
>>643 Effective STLの第8項を読むよろし。
>>640 A(m_IdNumber[0]);とかじゃなくて?
647 :
デフォルトの名無しさん :03/01/17 15:18
最近暇になったので久々にC++に触ろうと思います。 が、最後に触ったのが1995~1996あたりなので、 すっかり浦島状態です。 んで、どんな拡張がされてきたか解説してあるサイトがあったらおせーて
とりあえずTCPLの第3版が出てるから、 それを読んでみるのがいいと思う。
649 :
デフォルトの名無しさん :03/01/17 22:55
すみませんただの興味なんですが、 typename* data = new typename[3, 4]; とかすると何が起こってるんでしょうか。
650 :
デフォルトの名無しさん :03/01/17 22:59
new typename[4]; と同じ
予約語?
カンマ演算子やね
653 :
デフォルトの名無しさん :03/01/17 23:03
>>650 サンクス。
じゃあ初めの引数は何のために書けるようにしてるんですか?
654 :
デフォルトの名無しさん :03/01/17 23:06
>>652 理解しました。というか変数宣言とかでも普通に使うモノでしたね。
なんか変わった所に使うと分からなくなってしまう。
655 :
デフォルトの名無しさん :03/01/17 23:09
コンストラクタの初期設定子で配列の要素が初期化できないのは C++構文の仕様のためなんですか?
wara::wara() : morara[0](mona), morara[1](giko), morara[2](zonu) { } とかなってたとして wara::moraraのサイズをどう管理する罠??
657 :
デフォルトの名無しさん :03/01/17 23:36
>>656 ちょっと分からないんですが、安全のためできないようにしているという
ことでしょうか。
int morara[3]のようにサイズ指定していても無理なんですか。
いや初心者で申し訳ないですが。
3を2にしたり10000にしたり お客さんの注文ってのはぐちぐち(板違いすまそ
i = 10 + 20 + 30; は、一般のコンピウタでは、 (イ)、(炉) のどちらになるのでつか? (イ) i = ( 10 + 20 ) + 30; (炉) i = 10 + ( 20 + 30 );
教えてください C++でsnprintfを自作することになりました。 参考になる資料とかありましたら教えてください。 フリーで使えるソースが何処かに落ちていると良いのですが。
ここにもか。
>>659 一般のコンピュウタかどうかじゃなくて、
その文を解釈するルールに依存する。
>>660 glibc
>>655 結論から言うと無い。が、漏れも欲しい。
Hoge::Hoge():m_array({1, 2, 3}){ }
って書けたら便利なのに。
>>659 ここはC++スレであるからその文がC++であると仮定すると、必ず (イ)になる。
>>664 同意。C99には (int[]){1,2,3} みたいに配列リテラルを作れる機能が
ついたのでいずれC++にも流れてくると思うけど、より一層文法が
酷いことになりそうなのが少し怖い。
C99ってあいまいなところを整えた反面、 妙な文法を変に導入されてるのが怖いよ・・・ つかgcc3がc99をデフォにしてるのってどうなのかなあ
例外処理を最近触り始めたのですが、 アセンブラコードを吐かせたらとても悲しいコードになってました。 こういうものなのでしょうか。
669 :
デフォルトの名無しさん :03/01/18 02:36
ものすごく簡単なのかもしれませんが コンソール出力で小数を出力する場合に、 特定の桁で四捨五入して出力させることはできませんか? d = 0.12345 とあったとして、coutで 0.123と表示したいのですが。
670 :
デフォルトの名無しさん :03/01/18 02:52
表示する小数点以下の桁数をしてやればよいです
671 :
デフォルトの名無しさん :03/01/18 02:56
std::cout.precision(3); って感じに。たぶん。
LPCTSTR str[] = {"aaa","bbb"}; この配列の要素の数を返す関数を教えて下さい。 この場合だと、1か2を返す関数です。
>>672 関数でなくても
sizeof(str) / sizeof(str[0]); でいいのでは。
あ、だめかもしれん。スマソ。
LPCTSTRってのがchar*のtypedefなら、 sizeof(str) / sizeof(str[0]); で行けるよ。
できました。 sizeof(str) / sizeof(str[0]); で、要素の数の2が得られました。 しかし、理由が分かりません。 解説キボンヌ。
あ、わかりまそた。ありまん。
>>676 (1).sizeof(str)で、str[]全体のサイズがわかる。
(2).sizeof(str[0])で、str[]の要素一個当たりのサイズがわかる。
(1)を(2)で割れば、str[]の中にある要素の個数が求まる。
#define ELEMOF(array) (sizeof (array) / sizeof *(array)) とかすると便利でつ。 全体のサイズを各要素のサイズで割れば要素数が得られるというわけです。 ELEMOF にポインタを入れると破綻することに注意。
>>674 が気になる。
Unicodeとかでも関係ないよね?
>>680 関係ないというか、ポインタの配列なんで完全に無関係。
でも、もちろん文字列バッファの長さを返すこともできるわけで、
その場合 MBCS でも Unicode でもちゃんと要素数を返してくれる。
だから、TCHAR buf[128]; とか使ってるときに
sizeof buf とかで要素数を得ようとしちゃダメなのね。
>>680 だめな事はあるのだろうか?
例えばchar str[][5] = {"abc", "defg"}; のような場合でも、
sizeof(str) / sizeof(str[0])) で行けるはずだ。
きめうちで良いじゃん。それが嫌ならCなんかやめれ。
>>683 マジックナンバー厨は(・∀・)カエレ!!
しかたないじゃん。Cがヘボいんだから。
#define ARGOF(s) (sizeof(s)/sizeof(*(s))) 俺は↑だけど、 struct { char buf[256] ; int i[5] ; } TEST, test[10] ; ARGOF(test); ARGOF(test[0].buf); /* ARGOF(test->buf) */ ARGOF(test[0].i); / *ARGOF(test->i) */ でも、ちゃんと配列の数を取れるYO!
>>682 ポインタじゃなくてもそうやるんだね。
今コンパイルしてそれで出来ました。ありまん。
688 :
デフォルトの名無しさん :03/01/18 08:44
int sw; scanf("%d\n",&sw); printf("読み込み完了\n"); というコードなのに2回数字を読み込まないと ”読み込み完了”が表示されません。 なぜなんでしょう?
fflush(stdout);をprintfの後にいれてみて
>>639 確保された領域と前後に関係ありますか?
どういうこと?
通常、new/mallocで確保される領域は 返されるポインタの直前に、サイズと次の領域へのポインタを持っている(実装依存)。 ここが壊れるとdelete/freeが異常終了する。
>>690 639じゃないが
メモリ領域を確保するとき、メモリ領域の前後に
管理用のデータを入れている処理系もある
これが壊れると管理もぐちゃぐちゃになってエラーがおきる場合もあるだろう
たとえば
[アロケートサイズ][アロケート領域] を確保して、new が アロケート領域を
返すとき[アロケートサイズ]が狂えばどうなるか…ということ
639じゃないから違うかもしれないが
693 :
デフォルトの名無しさん :03/01/18 09:41
>>688 scanf("%d\n", &sw)の\nは"入力ストリーム中の次の空白でない文字とマッチ
するもの"なのです。従って、"2回数字を読み込まないと"ではなく、"1回
数字を読み込み、空白でない文字と\nをマッチさせる"ということになりま
す。わかりましたか?
>>691 ,692
なるほど。
でも692で言うところのアロケート領域(よく分からないけど・・・)
の破壊を防ぐ方法ってあるんですか?
>>694 アロケート領域のところはアロケートサイズの間違いでした。
>>694 コードをちゃんと書くこと
int *d = new int[size];
d++; // ←こういうの!
delete [] d;
のようなタココードにならないように
>>696 d++はないようで、
何が原因なのか分かりません。
他に可能性としてどういうのがありますか?
>>679 どこで見たか忘れたけど、配列だけに適用される (つまりポインタに
適用するとエラーになる) サイズ取得関数
template<class T, int N>
inline int ARRAY_SIZE( T (&)[N] )
{
return N;
}
ただし、VC++ では使えない。
>>697 dより前(後)にmalloc/newされたメモリ領域へのアクセスでのバッファオーバーラン。
誤ったポインタ演算。
>>697 int *d = new int[size];
int giko[1];
giko[1]=0; // ←こういうのは?
delete [] d;
>>700 それと似たようなことに一度遭遇したことがあるよ
自分書いたコードが原因じゃなかったから死ぬほど焦った
おい、皆さん 例外安全をどう思われますか?
>>670 671 さんありがとうございます。
その応用で出力先をファイルにしたいと思い
ofstream fout
でファイルに書き込もうとしたのですが桁数がどうしてもしていできません。
ソースは
string a;
double d;
string g;
fout << a;
fout.precision(3);
fout << d;
fout << g << endl;
という感じで書いています。
つまり一行にstringと桁数指定したdoubleを書き込みたいのです。
このまま実行すると書き込みはしてくれるのですが桁数が指定できません。
どこがちがうのでしょうか?よろしくお願いします。
705 :
デフォルトの名無しさん :03/01/18 16:27
>>704 <iomanip> ヘッダファイルと setw と setprecision を調べてみれ。
706 :
デフォルトの名無しさん :03/01/18 16:53
int *pp と、ポインタの宣言をしてその後値を代入すると 値が割り当てられていないローカルな変数 'pp' に対して参照が行われました。 とエラーが出てしまうのはなぜ?
template<typename T> struct C1 { void operator = (T) { } }; template<typename T> struct C2: public C1<const T *>{ // wow! // void operator = (const T * a) { // C1<const T *>::operator = (a); // } }; int main(int ac, const char *av[]) { C2<char> c; c = "foo"; // <-!!?? return 0; } C2::operator = () を定義してやらないと "!!??" の部分で コンパイルエラーになるのが悔しくて悔しくてアタシ夜も眠れません。 エラーメッセージはこんな感じ ( g++ 3.2 ) > no match for `C2<char>& = const char[4]' operator g++ も VC++ も同様なのでコンパイラのバグじゃないと思うんだけど これはれっきとした仕様でしょうか?
>>706 int *pp;
*pp = 2;
とかやってませんか? pp は「数値の入れ物のありか」を指すだけで
実際にはどこにも「入れ物」は存在していません。
int i; // <- 数値の入れ物
int *pp; // <- 入れ物のありかを示すもの
pp = &i; // <- ありかを示す
*pp = 2; // <- ok.
>>707 template<typename T> struct C2: public C1<const T *>{
using C1<const T *>::operator =;
};
定義しなくてもusing宣言でいける。
これで眠れるか?
アァ、 using したら、 struct B { void operator = ( int ); }; struct D : B { using B::operator =; }; void f() { D d; B b; d = b; } これが通っちまう。 定義するしかないやも知れぬ。
712 :
デフォルトの名無しさん :03/01/18 17:41
error LNK2001: 外部シンボル ""int __cdecl LeastSquare_GA (double *,unsigned int *,unsigned int *,unsigned int *,unsigned int *,int)" (?LeastSquare_GA@@YAHPANPAI111H@Z)" は未解決です というエラーはどうすればよいですか? 何が未解決なのでしょうか?
>>712 LeastSquare_GA とかいう名前の関数のありかが未解決。
宣言だけ書いて定義を書き忘れてるとか、定義を書いたファイルを
コンパイルし忘れてるとか、定義の入ったライブラリをリンクし忘れてるとか、
だろう。
・コンストラクタ ・デストラクタ ・代入演算子関数 ・friend属性 は継承されません。
716 :
デフォルトの名無しさん :03/01/18 18:24
>>713 コンパイルもしてるし、
extern宣言もしてるのにダメです。
他に何が原因なのでしょう?
>>716 extern C とかかな。
その関数は自分が作ったもの?
>>715 継承の問題じゃなくて、派生クラスで暗黙に定義される operator= が
基底クラスのやつを隠してしまうという話。
スマソ。718 は 709 じゃない。「709じゃないが…」と入力しようとして 手がすべった (w
>>718 なるほどそういう事か。
物の本には、デフォルトの代入演算子が基本クラスの代入演算子を「隠す」
という表現の代わりに、「継承されない」という表現を使っているが、同じ意味
なのだな。
operator=をvirtualにする意味ってありますか?
mem_funの存在理由がマジわからん。 なんでこんなものが必要なんだ?
最初の目的は、メンバ関数の呼び出しをカプセル化して、 リストのforeachに適用するためのもんだと思った。
>>722 仮想関数をアルゴリズムに渡す時にないとマズイ。
>>721 あまりない。どうせ=演算子は継承されないから、再定義が必要だし。
>>722 class Timer {
vector<EventHandler*> handlers;
void on_timer() {
std::for_each( handlers.begin(), handlers.end(), mem_fun(&EventHander::fire) );
}
};
とかなんとか。
>>724 あと関数オブジェクトにしておかないと、not1 みたいな関数アダプタが
使えんし。
728 :
デフォルトの名無しさん :03/01/19 13:40
質問でーす。 テンプレートクラス A があって、 unsigned char と signed char で特殊化している時に A<char> と書いたら unsigned char 版にも signed char 版にもならずに 特殊化していない方で展開されるのは仕様でしょうか?
仕様
>>728 仕様だと思うよ。ちなみに配列にした場合その要素数が異なると
異なる型とみなされます。これは関数オーバーロード(このときは
char*とみなされる)とは違ってくるので注意が必要かも。
って俺だけか。。
理由:char, signed char, unsigned char はそれぞれ別の型だから
signed char と unsigned char と char は別の型ということですかね?
>>722 Effective STLにmem_fun, mem_fun_refの使い方が載ってますよ
# 余談ですがこの本(ESTL)を読んでいる時は日曜洋画劇場でファントムという
# よくわからない映画をやっている時でした。
>>729 , 730
char は別の型なんですね…知らなかった。
てっきり signed char か unsigned char の別名だと思ってました。
(どっちの別名なのかが環境依存なだけだと思ってました。)
別の型ならどっちにもかからないのが正常ですね。I Understood.
ありがとうございました。
mem_fnはもうboostのを標準にしてもいいんじゃないかな
モスバーガーでやってる tea plus plus(お茶にもう一品) はC++のもじりなのではないかと小一時間…(略 ガイシュツだったらスマソ
昔のライブラリを引っ張り出して使おうとしたら新しいコンパイラになってて(borland の5.5) さっぱりわかならい。 basic_ostreamなんちゃらってなんなんだ……例をコピペしてもうまくいかないし。 <<のオーバーロードって、テンプレートつかってるときは駄目なんでつか?
>>734 > てっきり signed char か unsigned char の別名だと思ってました。
C++ でなくて C ならば、その認識で合ってるよ。
え?
740 :
デフォルトの名無しさん :03/01/20 14:29
憂鬱本のC++コードってかなり糞だよな?
741 :
デフォルトの名無しさん :03/01/20 18:30
デバッグ用にcout使ってDOS窓に文字列出力してるんだけど、 文字の色を変えることって出来ないの? 環境によって違う?? VC6です。
#include <conio.h> textcolor(YELLOW); cprintf("まんこ\r\n"); 前bccで遊んだときはこうですた
>>740 あれはC++の本ではないので深く考えてはいけません。
744 :
デフォルトの名無しさん :03/01/20 20:31
//--------------------------------------------------------------------------- #include <conio.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { textcolor(YELLOW); cprintf("YELLOW\r\n"); return 0; } //---------------------------------------------------------------------------
それはネットで検索してすぐみつかったからやったんだけど
textcolorが宣言されてないって言われるよ。
conio.hの中もみたけど無かった。
コンパイラは何ですか?
>>744
746 :
デフォルトの名無しさん :03/01/21 10:54
ifstream input(INPUTFILE); input >> fftData.in[i]; みたいな感じで、標準入出力してるソースがあるんですけど、 inてのはメソッドでしょうか演算子でしょうか。 受けてるメソッドが見あたらないんですが、 クラスに対して標準入力されたときの動作を教えて下さい。
fftData オブジェクトのクラスの定義を見なさい。
748 :
デフォルトの名無しさん :03/01/21 11:29
in[] ならともかく、in がメソッドではないのは明らかだろう。
>>746 fftDataの中身は知らんが、
in[]はfftDataのクラスなり構造体なりのメンバ変数。
メソッドなら()とかつくし、少なくともそんな名前の演算子は俺は知らん。
あと、標準入力じゃなくて入力ファイルストリームからの入力。
inがなにがしかのコンパイラ拡張のプロパティという可能性はありうるな。 この場合のinの実体はメソッドだ。
struct { class { int data[10]; public: int& operator [](int n) { if (n < 0 || (sizeof(data)/sizeof(data[0])) <= n) { throw なんちゃら_error(); } return data[n]; } } in; } fftData;
fftDataは、inていう実数の配列を持っとるわけだが。
>>754 あ、本当ですね。有難うございました。
なんか、inという名前と標準入力で混乱してました。
756 :
デフォルトの名無しさん :03/01/21 20:27
今さ、ふっと 「テンプレート使えば Power(べき乗)をコンパイル時に計算できるなぁ」と 思ったんだけど、なんかうまくいかない。 考えがうまくまとまってないんだけど、だれかアドバイスくんない? 以下、書きかけのコードね。 template <typename T, int X, int Y> struct Power { public: enum { Value = Power<T, X, Y - 1>::Value * X; }; }; template <typename T, int X> struct Power<1> { public: enum { Value = X; }; }; よろしくおながいします。
>>756 template <int N>
struct Power {
enum { Value = Power<N - 1>::Value * N };
};
template <>
struct Power<1> {
enum { Value = 1 };
};
int main()
{
Power<10> p;
std::cout << p.Value << std::endl;
}
前VCで再帰テンプレートやったら あきまへんでー言うエラー吐かれた気が。 C++の規格ではどうなってるんでしょ?
>あきまへんで (*゚∀゚)=3 大阪まだ~?
>>756 ちょっと前にいろいろ作ったなぁ・・・。
最大公約数、最小公倍数、フィボナッチ数、log、順列、組合せ、etc. ...
もっと応用範囲はありそうだけど、ここよりはtemplate統合スレ向きの話題かも。
>>757 インスタンスつくらなくても、
std::cout << Power<10>::Value << std::endl;
でいける。
>>757 引数減ってるじゃん?っていうか、それは何を求めてるんですか?
>>757 はべき乗ではなくて階乗を求めていると思われ。
ワロタ
べき乗ならこうでは? template <int A, int N> struct Power { enum { Value = Power<A, N - 1>::Value * A }; }; template <int A> struct Power <A, 1>{ enum { Value = A }; }; int main() { std::cout << Power<5, 3>::Value << std::endl; }
ちなみにこういうのはコンパイルが通らない。 template <typename T, T A, int N> struct Power { enum T { Value = Power<T, A, N - 1>::Value * A }; }; template <typename T, T A> struct Power <T, A, 1>{ enum T { Value = A }; }; int main() { std::cout << Power<double, 5, 3>::Value << std::endl; }
>>765 enum T ってのは何か意味あんの?タグ名?
どちらにしてもenumはdouble型にはならんわな。
768 :
デフォルトの名無しさん :03/01/22 03:51
情報系の人間ではないんですが、ソフトの改良をすることになり困っております。 処理した画像を連番で指定したフォルダに保存するようにしたいのです。 どのように考えればいいかだけでもご指導お願いします。
>>769 画像を処理する→連番で指定したフォルダに保存
ってかんじでOKかい?
for (uint i = 1; i < 10; ++i) { &nsp;ostringstream os; &nsp;os<<"hikky"<<i<<".jpg"; &nsp;ofstream fo(os.str().c_str(), std::ios::binary | std::ios::out); &nsp;//君のofstreamに入りたいハァハァ... } みたいなのはどうでしょうか?
ナンカチガウ(-_-)
>>768 >
>>760 > うぷキボソヌ
家帰らんとコヲド持ってこれん。
明日まで待ってくれ。
例えば最大公約数なら #include <iostream> template <int M, int N> struct GCD { enum { Value = GCD<N, M % N>::Value }; }; template <int M> struct GCD<M, 0> { enum { Value = M }; }; int main() { std::cout << GCD<121, 77>::Value << std::endl; }
最大公約数を利用して最小公倍数を求める: template <int M, int N> struct LCM { enum { Value = M * N / GCD<M, N>::Value }; }
フィボナッチ数を求める: #include <iostream> template <int M> struct Fibonacci { enum { Value = Fibonacci<M - 2>::Value + Fibonacci<M - 1>::Value }; }; template <> struct Fibonacci<0> { enum { Value = 1 }; }; template <> struct Fibonacci<1> { enum { Value = 1 }; }; int main() { std::cout << Fibonacci<8>::Value << std::endl; }
順列とか組み合わせはどういう考え方で行くのかな・・・・・
スマソ。フィボナッチ数を若干修正。 template <> struct Fibonacci<1> { enum { Value = 1 }; }; template <> struct Fibonacci<2> { enum { Value = 1 }; };
アッカーマン関数 #include <iostream> template <int M, int N> struct Ackermann { enum { Value = Ackermann<M - 1, Ackermann<M, N - 1>::Value>::Value }; }; template <int N> struct Ackermann <0, N> { enum { Value = N + 1 }; }; template <int M> struct Ackermann <M, 0> { enum { Value = Ackermann<M - 1, 1>::Value }; }; int main() { std::cout << Ackermann<3, 4>::Value << std::endl; }
こういうテンプレートプログラムを書いていると、感覚的にはPrologで 書くのとよく似ていると思うのは俺だけか?
>>781 漏れは関数型言語(Haskellとか)で書いてるような気がしてくる。
・・・と思ったら他の方がいろいろ書いてくれてますね。
>>778 残るは順列と組合せだけ。記憶を頼りに書いてみます。
#include <iostream>
// 順列
template<int M, int N> struct P {
enum{ value = M * P<M - 1, N - 1>::value };
};
template<int M> struct P<M, 0> {
enum{ value = 1 };
};
// 組合せ
template<int M, int N> struct C {
enum{ value = C<M - 1, N>::value + C<M - 1, N - 1>::value };
};
template<int M> struct C<M, 0> {
enum{ value = 1 };
};
template<int M> struct C<M, M> {
enum{ value = 1 };
};
int main() {
std::cout << P<5, 3>::value << ", " << C<5, 3>::value << std::endl;
}
>>783 >>784 ああなるほど、順列と組み合わせは、順列の数とnPr組み合わせの数nCrを
求めるだけなのか。
どうやって(1,2,3)のような表現をするのかと悩んでいますた。
786 :
デフォルトの名無しさん :03/01/22 19:31
標準入出力が無いOSで、コンパイル通すためにダミークラス作ろうと思います。 std::cerr みたいなのはネームスペースstdにcerrという変数かメソッド(どっち?)用意するとして、 std::cerr<<"realFF みたいな標準入力受けたり出来ますか?
実行と終了を繰り返すと、OSがフリーズします。怪しい部分を書きます。 このソースでのブラシの使い方で問題点があったら指摘してください。 case WM_RBUTTONDOWN: hDC = GetDC(hWnd); hBrush = CreateSolidBrush(255); rect.left = 10; rect.top = 10; FillRect(hDC, &rect, hBrush); DeleteObject(hBrush); hBrush = CreateSolidBrush(128); rect.left = 20; rect.top = 20; FillRect(hDC, &rect, hBrush); DeleteObject(hBrush); ReleaseDC(hWnd, hDC); break;
>>787 rect.right と rect.bottom は初期化してますか?
790 :
デフォルトの名無しさん :03/01/22 21:03
loki の SmallObject を試してみたら 標準のアロケータより遅い。圧倒的に遅い。 みんなのところは本当に早くなってる? ちなみに VC6Std と BCC5.5 と gcc-2.91.57 で試したが 全部標準のアロケータの倍近く時間がかかってるみたい。
ちなみに ThreadingModell は外した状態ね。 シングルスレッド同士のガチンコ対決だけど遅いのです。
そりゃシングルスレッドだったら標準のが一番はやかろーもん
>>792 malloc(), free() と比較すると、そうとも言えんよ。STL のアロケータだと、最初から
かなりキッチリ最適化されてるヤツが多いけど。
>>791 比較環境が良く分からん…
794 :
デフォルトの名無しさん :03/01/22 22:21
C++始めたばかりなんですがクラスがいまいち理解できません。 クラスを詳しく説明してるサイトはありますでしょうか?
ここにあるような、高度なテンプレートの使い方を解説しているサイトはありますか?
>>796 RPG系はあまり好きじゃないんで、すいません
>>795 金を払って書籍「Generic Programming」と「Modern C++ Design」でも読むのが近道。
>>788 ,789
書いてなかった rect.right と rect.bottom はまともな数字が入っています。
別の部分でのバグのようなので、他を探してみます。
ありがとうございました。
SelectObjectが必要と言われるかもしれないと思っていました。
>770 現在のプログラムでは、撮影して画像処理した後に自分で名前を付けてBMP形式で保存するようになっています。 それを何とか連番で自動保存したいのです。
804 :
デフォルトの名無しさん :03/01/23 00:57
throwがある関数は必ずtry{}でくくらないと駄目なんでしょうか? 例外を捕捉しなくても良いときもあるのですが、 今はそんなときにもtry,catchをしてます。 これは無駄なような気がしているのですが…
>>804 補足しなくても良いときがあるならくくらなくて良いでしょ
みんなありがとん。 <ストライク>パクらせて</ストライク>参考にさせてもらいました。
オーバーフローの問題。 型を超える数字計算は、計算の途中で型を超えても、 型に納まる範囲内の結果は正常に得ることができるのか 例えば、クリックするたびに、3の累乗の1の位の値を 表示するというプログラム。 3, 9, 7, 1 ............ static BYTE byte = 3; char buf[10]; case WM_LBUTTONDOWN: wsprintf(buf, "%u", byte); MessageBox(NULL, buf, "", MB_OK); byte*=7; break; これは byte が255を越えてからも正しい結果を得られるんでしょうか?
>>805 そうすると、プログラムは終了してしまいますよね?
…私のthrowの使い方間違ってるのかな…?
例えば、
mallocでメモリ確保失敗してもNULLが返るだけですが、
newだと例外が発生するのでtry,catchしないと終了してしまうのではないかなあ、と。
>>808 その通りです。
例外が発生してcatchしないとunexpected()が呼び出されて
異常終了します。
>>808 間違ってない。
ってゆーかどういう動作を期待してるわけ?
newの失敗を無視してどうやってプログラムを続けることができるだろうか?
アクセス違反で即アボンじゃん
>>760 をぉ、色々サンクスコ。家帰ってまた何かあったらヨロシコ。
>>809-810 返答ありがとうございます。
Cから移ってきたばかりなので、C++の作法がまだよくわかってないみたいです…
>>808 では、例えでnewを出しただけでして、
実際は自作の関数にthrowを導入することを考えてました。
少し調べてみたのですが、BCBやVC++にはnew(nothrow)という
例外出さないnewもあるみたいですね。
こういうことをやりたかったのですが、ヘッダファイルを見る限り
今の私には手に負えそうに無いです…
もう少しC++の勉強してからまたチャレンジしたいと思います。
ありがとうございました。
>>807 オーバーフローすると正確な値は得られんよ。
例えば4ビットのコンピュータで8があるとする。
1000
4倍すると
100000
しかし、4ビットだから右の0000しか得られない。
8の4倍と0の区別ができないから。
オーバーフローは例外でトラップできないからチェックするには計算のたびに いちいちキャリーフラグ調べないといけないんだよな。 めんどくさ。
>>813 > 型に納まる範囲内の結果は正常に得ることができるのか
ということだから、
>>813 の形だと「できる」ってことになるね。
でも、これってどんな CPU 、どんなコンパイラを使っても
そうなるって保証されてることなのかな?
足し算引き算は大抵大丈夫だと思うけど、掛け算はどうなの?
あちらの方から飛んで来ました。 実行結果をファイルに出力するやり方を教えて欲しいです。 自分でずっとやってるんですが、中々うまくいきません。
計算の途中ではいったんintに拡張されてその後元の型に押し込められる・・・はず
#include <iostream.h> #include<stdio.h> void main() { FILE *fp,*fc; fp=fopen("素数-実行結果.txt","w"); int i, j ,f,n=1000,c=0; // 1から1000までの数の素数を求める // i, jはループ変数 // fは一回でも割り切れたら1。 // 一度も割り切れなかったら0。 for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。 { f = 0; for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。 { if(i % j == 0) // あるjで割り切れたらfは1。 f = 1; } if(f == 0){// iを割り切るjがなかった場合 cout << i << "は素数です。" << endl; c++; } } printf("%d個です。",c); fc=fclose("素数-実行結果.txt","w"); } ここから、どう直していけば良いのか分からないんです。
>>818 宿題スレ行け。つーか、どう直すも一から書き直せって感じだが。
817>> はい。何か、エラーが出ました。 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。って・・・
>>818 予想以上だな・・・
とりあえずこっち来たってことはC++風の書き方がしたいわけだな?
でも、一応 #include <iostream.h> #include<stdio.h> void main() { int i, j ,f,n=1000,c=0; // 1から1000までの数の素数を求める // i, jはループ変数 // fは一回でも割り切れたら1。 // 一度も割り切れなかったら0。 for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。 { f = 0; for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。 { if(i % j == 0) // あるjで割り切れたらfは1。 f = 1; } if(f == 0){// iを割り切るjがなかった場合 cout << i << "は素数です。" << endl; c++; } } printf("%d個です。",c); } だけなら、普通に動くんですよ☆
プロ㌘なんてしらんが、まずC言語というのでやってみたらどうだ?
ファイル名がcppなだけで、 殆ど、C言語で書いてるんだと思います。 あんまし理解してないので、今死でやってたんですけど。
今あるプログラムを出来るだけ形を残しつつ、 テキストファイルに出力出来るようにしたいんです。
とりあえず 822の1行目を #include <iostream.h> ↓ #include <fstream.h> に直し、 void main() { の次の行に ofstream cout( "素数-実行結果.txt" ); を挿入するだけで君の期待する物は得られる
>>826 えーそうなのー?簡単だね。
>>825 多分だけど時間がありそうだから、「C言語 fopen」とかで検索して
関数の使い方を調べてみたらどう?
そこまで組めたならチョコっと調べたら出来ると思うんだけどなー
凄いです! coutの部分が全てファイルに出力されてました。 どうしてそんなに分かるんですかぁ~?凄いですねぇ~。 後、最後の printf("%d個です。",c); という部分も結果としてテキストへ出したいのですが、 ofstream printf( "素数-実行結果.txt"); って書けば良いんですかね?
>>828 ちゃうちゃう
cout に出力してるところと同じ方法で出力すれば良い
上の方で
cout << i << "は素数です。" << endl;
とやっているのだから、
同じように
cout <<*************(宿題)****************
しかしその分だとC++どころかCの文法もあいまいなようだし、
なぜcout << で文章が出力されるのかもわかってないっしょ?
そのままだと今後厳しいだろうからちゃんと入門書読んどいたほうが良いよ
はぅ~ 頑張ります☆
出来ましたぁ~! めっちゃ感動です!!!
壮大なネタだったな
#include <fstream.h> #include<stdio.h> void main() { ofstream cout( "素数-実行結果.txt" ); int i, j ,f,n=1000,c=0; // 1から1000までの数の素数を求める // i, jはループ変数 // fは一回でも割り切れたら1。 // 一度も割り切れなかったら0。 for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。 { f = 0; for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。 { if(i % j == 0) // あるjで割り切れたらfは1。 f = 1; } if(f == 0){// iを割り切るjがなかった場合 cout << i << "は素数です。" << endl; c++; } } cout << "素数は、" << c << "個です。" << endl; } こんな感じです。 本当にありがとう御座いました。 本当に感謝してます☆ありがとう御座いました。
ネタって・・・、 こっちは、訳分かんなくて、必死だったんですよぉ。 色々、ありがとう御座いました。助かりました。
結局coutのままか…
そういえば前sendmail?が判らないって駄々こねてた人がいたんね。
今から、爆睡したいトコなんですが、 他の課題が在るので、そっち頑張ります。 また来た時は、宜しく御願いします。 御休み為さいです☆☆
もう来なくていいよ(・ε・)
そういえばC++を勉強し始めた頃はcoutが出力を行っているんだと思っていた。 coutはCのstdoutみたいなもので、出力を行っているのは<<なんだよな。
>>813 ,814
ありがとうございます。キャリーフラグはアセンブラでないと無理みたいですね。
848 :
ageMAN :03/01/23 10:00
ファイルをドロップした時、ドロップされたウインドウを一番手前に 持ってくるには特殊な処理が必要だと思うけど、そういうすごいテクニックを やってるソースはどこかにないかな?
>>レゴ ちゃんと勉強しろ…っていいたくなる人だね
>>790 亀レスだが、
Loki のスモールオブジェクトは
VC++.NET でリリースビルドすると、標準 new よりやや速くなる。
856 :
デフォルトの名無しさん :03/01/23 15:59
fstreamでテキストファイルを開いてstring型変数に 行を読み込む処理はどうやればいいですか? f>>s;とやっても行の途中までしか読み込めません。
>>856 std::getline(f, s, '\n');
std::getline(f, s); とかで、どうよ。
>>856 やっぱり
std::getline(f, s); でいいや。
( ゚∀゚ )ぱぱぱぱ~ん
ぱぱぱぱ~ん
ぱぱぱぱ、ぱぱぱ~
ぱぱぱぱ、ぱぱぱ~
I love you forever
I'll want you to fuck me
ついに俺もケコーンの時期が北か(*゚∀゚)
>>857-858 ハァハアx
>>860 C++の標準ライブラリを理解している人が増えてきてうれしいよ。
>>857-858 ありがとうございます。見落としていました。
ifstream::open/getにstringが渡せないのは不便ですが
char*/string両方サポートするのは面倒ということなんでしょうか。
>>862 面倒というより、開発してきた経緯があって、多分別々のスタッフが
担当していたので整合が取れてないだけの話では?C++のライブラリ
にはそういう面がいっぱいある。
basic_stringはSTLだがiostreamはSTLじゃない 元々別のライブラリだったものを同じstdネームスペースに突っ込んでるだけ
basic_stringもSTL由来じゃないだろ。
(^^)
iostream, ... : C++ 標準ヘッダ ↓ vector, list, ... : STL → std ← char_trait : basic_string, ...
868 :
デフォルトの名無しさん :03/01/23 20:32
おまいら using namespace std; はもちろんデフォだよな?
>>868 まさか。*.cpp 内で
using std::vector;
とか並べることはあるが。
何で付けないんだよ。ブルッてんのか? なんも実害ないだろ。
名前空間の外はできるだけ綺麗にしておきたい。
使わないなら using namespace って何のためにあるんだ?
宗教戦争
>>876 ライブラリのサンプルコードをすっきりさせるため。
>>874 > なんも実害ないだろ。
いや using namespace std; するとコンパイルが通らなくなるソースは、すぐに
書けるだろ。
> 使わないなら using namespace って何のためにあるんだ?
歴史的事情
using~ を ヘッダに書く奴は馬鹿。 ソースでグローバルに書くのは好きずき。 関数の中で書くのはデフォ。
>>880 書こうと思えば書けるが、標準で使われてしまっている名前はなるべく避けるのが
常識じゃないか?
とすれば、名前の衝突はそうそう発生しない。
うちの会社はstd::を付ける事にきまってるので、using使ったソースを 納入した場合全部書き直しとなります。
それはマ板のネタ
887 :
デフォルトの名無しさん :03/01/24 01:16
ある保守を任されたソースに書かれてることについて疑問があるのですが、 クラス内においてメンバ関数の処理を記述してあるようなもの。 これの宣言にinlineがついているのですが、これってなにか意味があるんでしょうか? クラス内のメンバ関数宣言にinlineがつくというのは、クラス定義の 外側で関数定義するときにinlineを省略できる。このためだけに使うものだと 思っていたのですが、他になにか理由があるのでしょうか?
しばらくするとstd::を書くのが快感になってくるんです
>>887 > 外側で関数定義するときにinlineを省略できる
省略できたっけ?
>>889 中で関数定義する時にinlineを省略できると間違えたと思われ。
>>888 同じく。時々手が震えて::が;;になったり:::になったりするのがまたイイ。
893 :
デフォルトの名無しさん :03/01/24 01:29
class CLS{ inline char get(); }; char CLS::get(){ こういう書き方ができるとC++Primerには書いてあるんだけど・・・
>>893 それはインラインにならないんじゃ・・・・
>>893 げっ、こういう書き方も有効みたいだ。初めて知ったよ。
規格書ではどの辺を読めばいいのだろうか。
896 :
デフォルトの名無しさん :03/01/24 01:42
で、、、なにか理由があるんでしょうか?
>>896 普通外部で関数を定義するとinlineにならないが、クラス宣言の所で
inlineと書いておくと、外で関数を定義してもちゃんとinlineになるみたいだ。
規格書読んだけど目がちかちかしてどこに書いてあるのかわからなかった。
識者のレスをきぼん。
898 :
デフォルトの名無しさん :03/01/24 01:50
>>897 クラス定義の中でメンバ関数の処理が書いてあるということは
inlineキーワードは付いても付いてなくても無条件でinlineに
なるから、意味ないですよね?ネームスペーススコープで
メンバ関数を定義するときは上の例みたいにいろいろと
あるみたいですが。。。
それともinline関数にはちゃんとキーワードを付けた方が コードが見やすいから、これをコーディング規約にしてしまおう なんてのがあったのかな。その辺のドキュメントが残ってないから ちょっと分からないのでなんともいえないですけどね。
>>898 class内部でメンバ関数の定義を書いてしまった場合は、そのメンバ関数
はinlineになりますが、class外部でメンバ関数の定義を書いた場合、その
関数がinlineになるかどうかは、メンバ関数の宣言の所にinlineと書いて
あるかどうかで決まるようです。
>>900 thanks.
>>898 そのため、クラスの内部に定義を書こうと、外部に書こうと常にinlineに
なるように、クラス内部でメンバ関数全部にinlineと書くことに決めてある
んじゃないでしょうか。
>>902 やっぱりコーディング規約的な話ですかね。
関数の処理実体があるかどうかなんて一目瞭然だと
思うのだけど、C屋さんには紛らわしかったりしたのかな。
とりあえず、このことは忘れて作業に戻ります。
みなさんどうもでした。
903です902さんのよく読んでませんでした。 クラス定義においてinline関数にはinlineキーワードを 付けることを必須と決めておけば、メンバ関数を外に 出したときにinlineキーワードを付け忘れてもinline化 されるという意味ですね。この規則ってC++的常識から見て どうなんでしょうかね。
>>904 どうなんだろ
俺はコンパイラの最適化を盲信してinlineはどこにも使わないけどな
>>904 >>900 さんの規格書の項目を読んでみられるといいよ(英文だけど)。
拙い和訳をすれば、「メンバ関数をinline化するにははクラスの宣言部に
inlineと書いても、定義部でinlineと書いてもよい。」のような意味になると
思います。
規格書にちゃんと書いてあるので、文法的にも正しいはずです。
というか俺もこれから使わせてもらいますね。
次スレのテンプレ、いいの作ったからスレ立ては
>>907 に任しとき
909 :
デフォルトの名無しさん :03/01/24 12:58
コンストラクタの暗黙の変換は役に立たないのか? #include<iostream> using namespace std; struct A { A(int){} }; void F(double i) { std::cout << "F(double)"; } void F(A a) { std::cout << "F(A)"; } int main() { F((int)123);//F(double) }
それは無理なんじゃ。。 Fのパラメータを評価する段階でint型の値をAにマッチさせる 理由はないわな。
オーバーロードの解決では、標準変換 (int => double) のほうが ユーザ定義変換 (A(int) {}) より優先するからね。C++3rd 7.4 参照。
912 :
デフォルトの名無しさん :03/01/24 19:45
すみません。質問させてください。 プログラムからファイルの名前を変えたり、ファイルを削除する必要がでてきました。 環境はWindowsですが、なるべく「標準」でやりたいと思います。 ところが、調べてみると、C++でどうするか書いてある本が見当たりません。 Cでは、removeやrenameが使えるようなのですが、他にC++らしい方法はないのでしょうか。 ご存知の方、お願いします。
>>912 std::remove
std::rename
914 :
デフォルトの名無しさん :03/01/24 21:41
#pragma comment(linker, "/nodefaultlib:\"libc.lib\"") #pragma comment(linker, "/entry:\"DllMain\"") ↑を使ってビルドすると、 すごく小さいサイズのファイルが出来上がって、 普通に動作してる気がするけど、 他の環境で使ったときに不具合がでるとか 何か問題ってあるのでしょうか?
>>914 pragmaつかっといて、他の環境ってどういうこと?
まぁまずはスレ違いダナ。VCスレいけば?
916 :
デフォルトの名無しさん :03/01/25 01:06
#include <unistd.h> main() { int i,j; printf("program start"); j=fork(); if(j>0) { printf("parent-1"); sleep(5); printf("parent-2"); sleep(5); printf("parent-3"); } if(i==0){ printf("child-1"); sleep(8); printf("child-2") } return(0); } すみませんがエラー1になるのですが、実行の仕方を教えてください
#include <cstdio> #include <unistd.h> int main(){ int i,j; printf("program start\n"); j=fork(); if (j>0) { printf("parent-1\n"); sleep(5); printf("parent-2\n"); sleep(5); printf("parent-3\n"); } if (i==0) { printf("child-1\n"); sleep(8); printf("child-2\n"); } return(0); }
#include <cstdio> #include <unistd.h> int main(){ int i,j; std::printf("program start\n"); j = ::fork(); if (j > 0) { std::printf("parent-1\n"); ::sleep(5); std::printf("parent-2\n"); ::sleep(5); std::printf("parent-3\n"); } if (i == 0) { std::printf("child-1\n"); ::sleep(8); std::printf("child-2\n"); } return(0); } 本当はこうしないとダメかな??
はわわ~
921 :
デフォルトの名無しさん :03/01/25 04:15
ファイルサイズを取得するには、C言語ならファイルをバイナリモードで 開いておき、 fseek(fi, 0, SEEK_END); size = ftell(fi); のような感じで簡単にできましたが、C++ではtellg()の返す値の型が std::ios::pos_typeのためにそれができません。 もちろん大概のコンパイラのstd::ios::pos_typeはunsignedもしくは unsigned longのtypedefなのですが、それに依存せずファイルサイズ を簡単に取得する方法はありますでしょうか?
ない。 何故なら、「ファイルサイズ」 が環境依存の概念だから。 環境依存でないのなら、それを取得する標準関数が用意されるはずだ。
923 :
デフォルトの名無しさん :03/01/25 04:59
>>922 そうですか・・・・ありがとうございました。
どうしても必要な時はstd::fseek()などを使ってやる事にします。
>>919 いいかげん荒らすのはやめてくれんかね。
925 :
デフォルトの名無しさん :03/01/25 11:03
string型は積極的に使うべき?
やってはいけないことが分かっているなら使うべき
やってはいけないこととは何?
>>927 タイトなループ中で const string& をとる関数 foo() に
foo("string");
と書くとか。毎回 string オブジェクトのコンストラクト・デストラクトが行われて
泣ける。
なるほど
最適化されるだろ。
コンストラクタ・デストラクタの最適化はうまく逝くのだろうか?
されないだろ。つかされたら困る。
ベンチマークテストでもやってみるべ。 風呂入ってくるから後で。
>>933 ハァァ?ベンチマークとるまでもないだろ。
理性的に考えれば結果は明白。これだからベンチマーク厨は・・・
とかいう芳しいのが別のスレに居た。
>>934 まあそう言わずに、どれだけ実際に違うのか見てみましょうよ。
g++3.2.1(MinGW)で以下の関数を QueryPerformanceCounterで測定。
void dummy(const std::string& s)
{
}
void func1()
{
for (int i = 0; i < LOOP; i++)
dummy("test");
}
void func2()
{
std::string s("test");
for (int i = 0; i < LOOP; i++)
dummy(s);
}
コンパイルオプションは -O3。 LOOP = 500000 で実験。 func1 = 365125 func2 = 1944 ご覧のように、std::stringのコンストラクタを呼んだ方は100倍以上も 遅くなってしまいますた。 -O2だと func1 = 371604 func2 = 7711 これでも全然遅いです。
933じゃないけど試してみたよ。 VC7, gcc3ともに毎回コンストラクト/デストラクトしてた。 最適化オプションつけたらvc7は5倍ぐらい速くなったけど、 gcc3は1.2倍程度だった。 stringの生成をループの外に持ってったら、 最適化オプションなしで20倍ぐらい速くなった。 ところで、foo()の中身を、引数のstringの長さをグローバル変数に足しこむ のにしてたんだけど、 ループ外にもってったのをvc7で最適化したら、ループが無くなってました。 gcc3は残ってた。
書いてるうちに別の方が書き込みを・・・ やってることはほぼ同じです。
>>937 VC7の方もなかなか速いね。gccは-O3にしたらループは
残るものの、callが無くなっていました。
int len;
void dummy(const std::string& s)
{
len += s.length();
}
でやったら、-O3で
func1 = 379483
func2 = 9185
という結果。これがまあ実際の使用上の差かもしれません。
940 :
デフォルトの名無しさん :03/01/26 02:58
enumって何ナノ?定数のtypedef? 継承できないよね? 勝手にできないと思って、拡張するとき #defineでごまかしてるんだけど。 classにstatic constならべたclassを継承すれば 継承っぽいなぁ。めんどいけど。 詳しい方ご教授ください。
enumに整数以外の型も使えたらなあ・・・
>>940 enum は列挙型で、それ自身独立した型。enum から整数には暗黙の変換が
利くけど、整数から enum や異なる enum 間の変換にはキャストが必要。
おそらく
class Foo {
public:
enum TYPE1 { A, B, C, ... };
virtual func(TYPE1 t);
};
なんてのがあって enum を拡張したいのだと思うけど、それは設計が腐ってる。
func() の中で t の値で処理を場合分けしていて、かつ t に対して将来の追加が
考えられるなら、処理自体をカプセル化して別のクラスに括り出すことを考えた
方が良い。
class Cmd {
public:
virtual func(Cmd& foo) = 0;
};
// enum に対応して Cmd の派生クラスを作っておく
// Cmd 派生クラスのインスタンス生成は Factory パターンでも使って下さい
class Foo {
public:
virtual func(Cmd* cmd);
};
enumeration 【名】《【複】enumerations》 (1)数え上げること; 列挙. (2)目録, 表 (=list). by Roboword
944 :
デフォルトの名無しさん :03/01/26 16:16
cygwin 上の g++ で $ g++ hoge.cpp -I /hogeinc と書いてコンパイルしてるんですが、この -I /hogeinc を書かなくても 自動的に対象ディレクトリを見てくれるようにするにはどうしたらいいですか?
知らん。 makefile工夫すれば書くのはめんどくさくないと思うが。
>>944 specs に書いておく。gcc -v すると specs ファイルのパス名分かるから、あとは
それをエディタで開いて書き換えましょう。
>>945 make 使うまでもないちいさなプログラムのテストとかで面倒くさいんです。
>>946 できましたー!ありがとうございます!!
これは gcc ならどんな環境でも有効な方法なんでしょうか?
質問があります。 非常に日本語で表しにくいのですが… ある範囲内の数値でIDを自動的に生成するようなクラスは どのように実装したらよいでしょうか? 例えば、Get()で新しいIDを、Release(ID)でIDの解放を行うような ID管理のクラスを作りたいのですが。 最初はstd::vector<bool>を使って使用中か否か管理しようかと 思ったのですが、intの全範囲で使用可能などとなると管理が できなくなってしまうので… 皆様のご意見をお聞かせください。
>>948 それしか方法が無いと思うが。
できるのは、容量を縮めるのに bitset を応用できるくらい?
>>949 Get, Release に特定のパターンがあるなら、最適化する余地はある。たとえば
多くの場合、
まとめて Get
まとめて Release
するなら、
ここから、ここまで確保されている (最小 ID と最大 ID のタプル)
っつーのを持たせた方が良い。
何の前提もつけられないとなると、完全に全範囲持たせるしかないよな…
>>948 std::set<int>、で、どう?
953 :
デフォルトの名無しさん :03/01/27 00:33
class A { A(); } class B : public A { B(); } この場合手持ちのコンパイラでは A::A()が先に実行されるのですが これは規格で保証されてる事なのでしょうか?
>>953 保証されてる。デストラクタがその逆であることも。
>>928-
>>939 の書き込みに感動しました。
実行時間の測定は、gccというかUNIXの場合timeを使うのですよね。
VCの場合、どうやって測定するのでしょうか。
>>956 トリッキーなコード2より転載。windows.hをインクルードして呼ぶ。
int prof(void (*func)())
{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;
hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);
Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);
func();
QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);
return (int)(end - start);
}
958 :
デフォルトの名無しさん :03/01/27 02:35
>>949 VC++6では既に, std::vector<bool>は1要素1bitで保持してる(はず)。
激しく環境依存だけど。
足りないと思われるものがあるなら今のうちに次スレの 方に貼り付けておいてください。今日はもう寝ます、お休みなさい。
漏れの脳みそは足りないと思うのですが、何を貼り付ければいいですか?
汝には、当家に伝わる秘伝中の秘伝である ありがた~い、塗り薬を授けるので 今すぐ、頭をかちわって、脳みそを送るが良いぞ
これから頭をかち割ってみます
v(^・^)v
963 は絶息しますた。
DeveloperStudioってVisualC++.NETについてるの? いまVisualStudio.NETアカデミックを持ってるけど・・・
解決しました。ありがとうございました。
age
ちょっと前に、ベンチマークに時間を計る話がありましたよね。 俺の環境では、Cygwinでtimeとするといいと思うんですが、そこで出てくる real、user、sysの意味がよくわかりません。 実時間、ユーザー時間、システム時間って言葉ではさっぱりです。 ベンチマークになるのは、どれなんでしょう?
boost::timer
> 安く作成 (・∀・)カエレ!
>>970 real … プログラムの起動から終了までの時間
user … ユーザー側の実行に CPU が費やした時間
sys … OS側の実行に CPU が費やした時間
全体の処理時間を評価したいなら real 時間
アルゴリズムを評価したいなら user 時間
OS の機能を評価したいなら sys 時間
sage
975 :
デフォルトの名無しさん :03/03/13 20:30
age
976 :
デフォルトの名無しさん :03/03/14 18:36
ぬるぽ
978 :
デフォルトの名無しさん :03/03/14 19:10
| ̄ ̄ ̄|___ | ヌノ| |______| ∧∧ || ( ゚д゚)|| / づΦ
980 :
デフォルトの名無しさん :03/03/15 01:59
______ |__ | |レポ | |___| ∧∧ || ( ゚д゚)|| / づΦ
981 :
デフォルトの名無しさん :
03/03/15 02:29