1 :
デフォルトの名無しさん :
2006/12/01(金) 14:31:34
2 :
デフォルトの名無しさん :2006/12/01(金) 14:33:01
3 :
デフォルトの名無しさん :2006/12/01(金) 14:33:35
4 :
デフォルトの名無しさん :2006/12/01(金) 14:34:39
5 :
デフォルトの名無しさん :2006/12/01(金) 14:35:17
6 :
デフォルトの名無しさん :2006/12/01(金) 14:44:49
7 :
デフォルトの名無しさん :2006/12/01(金) 14:45:23
8 :
デフォルトの名無しさん :2006/12/01(金) 14:47:20
9 :
デフォルトの名無しさん :2006/12/01(金) 14:49:36
C++学ぶと、一気に頭髪が後退に?
以下、啓蒙文Ver3.0 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
>>10 人によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10cmほどしか後退してない。
すげえ。ボーランドのコンパイラ使っといてC++とかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない HAGE を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
キチガイ啓蒙文は無視な。 好きなようにやれ。
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
11 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん 16 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
#include <stdaderance.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁ付け毛ぐらいにはなったな。 うむごくろう。
Boostつかうと一気に実行ファイルサイズが100倍に?! 環境によるだろ。 俺はVC++に /Yc オプションを指定して、極力 プリコンパイルヘッダを使用するようにして使っているが、例えばboost::lambdaを 使っても使わない時と比べ10秒ほどしか増えない。
任意のタイミングでファイルオープンとファイルクローズが出来るデバックツール探してます。 CreateFileとかCopyFile等の動作チェック用です。 自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので探しています。 VisualStudioパッケージあるかもしれんがようわからん。 誰か知らないか?
>>20 これって前スレの頭の方にあった質問だね。
テンプレに入れる事にしたのか。
もうテンプレ増やさなくてもいいじゃないかと思うんだけどなぁ。 前スレ後半から新スレへくるようなお客さんが引いちゃうし、なにより飽きた。
26 :
デフォルトの名無しさん :2006/12/01(金) 17:02:08
テンプレートを使ったコードを、ヘッダとソースに分離したいと考え、
http://docs.sun.com/source/806-4838/Ch2.src.html の最後にある、「テンプレート定義分離型の構成」のサンプルを
VC7.1にてビルドしてみたのですが、以下のようなエラーが出てしまいます。
error LNK2019: 未解決の外部シンボル "int __cdecl twice<int>(int)"
(??$twice@H@@YAHH@Z) が関数 _main で参照されました。
これは何が問題なのでしょうか?
もしや、VCの仕様でしょうか?
>>26 exportキーワードがサポートされてないなら全部ヘッダに書くしかない
どこまでがテンプレなのか もうわからん
Q NGにしてるヤツが「番号が飛び飛び」「〜が見えない」とやたらNGにしてることを強調したがるのはどうしてか A 統合失調症の恐れがあります。 何をされるかわかったもんじゃないので関わらないほうがいいです。
「番号が飛び飛び」というのは一種の揶揄でもある。 書き込んだやつからの反応がほしいんじゃなくて、 自分と同様にあぼ〜んしたやつからの反応がほしいんだろう。 「〜が見えない」の意味が理解できないのは2ちゃん初心者。 SGにでも登録してください。
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
__(●)(●)((●)((●))(●)(●)(●)ii● l(●)(●)(●)__ / (●)(●)(●)(●)(●))(●)(●)(●゙'‐='"(●)(●)(●) \ _ (●)(●)(●)(●)(●)(●)(●)(●)))(●)(●)(●)(●)_ / (●)(●)(●)(●)(●))(●)(◎)(●))(●)(●)(●)(●) \ _(●)(●,,r==、(●))(●)(◎)(●))(●)(●)(●)(●)_ (●)((ii ,●l)(●))(●)(●)(●)(●)(●)(●)(●) __(●)(●゙'‐='"((●))(●)(●)(●))(●)(●)(●)(●)__ / (●)(●)(●)(●)(●))(●)(●,,r==、(●)(●)(●)(●) \ _ (●)(●)(●)(●)(●)(●)(●)ii ● ))(●)(●)(●)(●)_ / (●)(●)(丿"~"i i(●)(●)(●)゙'‐='"(●)(●)(●)(●) \ _(●)(●)(",, )(X)ヽヽ(●))(●)(●))(●)(●)(●)(●)_ (●)(●)\ ヽXヽヽ(●))(●)(●)(≡)(≡)(●)(●) __(●)(●)((●\ヽ Xヽヽ(●)((●))(●)(●)(ミ)(●)__ / (●)(●),,r==、)( \,",",ソ●(●))(●),,r==、●)(●) \ _ (●)(●)ii ,●l)(●)(●)(●)(●)))(●ii● ;)(●)(●)_ / (●)(●)゙'‐='"(●)(●))(●)(●)(●))((゙'‐='"(●)(●) \ _(●)(●)●)(●)(●))(●)(●)(●))(●)(●)(●)(●)_ / (l●)(●)(●),,r==、)(●)(●)(●)(,,r==、)(●)(●l;) \ | . (l;●)(●)(● ,● ))(●))(●)(●)ii ● l)(●)(●) | | . (0●)(●)(●゙'‐='"●))(●)(●)(゙'‐='"(●))(●)O) | ,;; (:●)●)(●)(●)(●)(●)(●)(●))(●))(●;) 。 (о●)(●))(●)(●))(●)(●)(●)(●)●》) ( ;●ξ巛:)( ;●ξ(●)(●,--'""ヽ●:( ;) 巛巛ミ巛ミミミ//二二ノ""^ソ彡 巛((ミミ((巛ヘ`\┼┼┼ ,!ヽ 巛王 \"ヽ-;:,,,,,,ノ /' \,,,,,__,,,ノ
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
31 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん 33 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
皆さん単体テストは何を使っているのですか?
頭
え、俺は体だけど?
単体テストなど頭も手も使わずベロだけでこなしてみせよう
boost::test
::test tobj(/*今日の日付*/20060212);
テンプレートクラスでtemplate<class T>のT型の返り血(値)を返す関数を、インターフェイスを書いたファイルとは別のファイルに記述したいんですが、 どうすれば良いんでしょうか。
//MyFunc.h template < typename T> T func() ; #include "MyFunc.cpp" export? 何それ食えるの?
テンプレートクラスのフレンド関数も扱い難しいよなあ。 まあフレンドなんて使うなってことだろうが
44 :
デフォルトの名無しさん :2006/12/02(土) 19:23:42
C++のテンプレートで質問があります。下記のコードをGCC3.4でコンパイルする とa = 1;、y(); のところでエラーとなってしまいます。this->a = 1;、 this->y();のようにすれば問題ないのです。出来ればthisをつけないようにし たいのですが、どうすれば良いでしょうか? template<class T1, class T2> class A { int a; void y(); }; template<class T1, class T2> class B { void x(); }; template<class T1, class T2> void B<T1, T2>::x() { a = 1; y(); }
>>44 のコードはよくわからないけど
privateメンバはサブクラスからはいじれないとかそのへんのことじゃね?
サブクラスに公開するにはprotectedにするあたりはJavaと一緒?
48 :
44 :2006/12/02(土) 19:33:59
すみません、いろいろと書き忘れていました。BはAを継承していて、Aのメンバは全てpublicです。 template<class T1, class T2> class A { public: int a; void y(); }; template<class T1, class T2> class B: public A<T1, T2> { void x(); }; template<class T1, class T2> void B<T1, T2>::x() { a = 1; }
いろいろいらない物をつけたけど、基本的にデフォルトテンプレートパラメータ がない時は明示しなければならない template <class T1, class T2> class A { protected: int a; void y() { std::cout << a << std::endl; } }; template <class T1, class T2> class B : public A<T1, T2> { public: void x(); }; template <class T1, class T2> void B<T1, T2>::x() { A<T1, T2>::a = 1; A<T1, T2>::y(); }
50 :
44 :2006/12/02(土) 19:36:56
51 :
44 :2006/12/02(土) 19:41:51
ちょっと興味があるんですが、多重継承でもないのに明示的にA<T1, T2>::のよ うなものをつける必要があるのはどういった理由からでしょうか?ポインタだ けでも教えていただけるとうれしいです。
VCならスーパークラスのメソッドはA<T1,T2>::つけなくても呼べたような気がする。 気のせいかな
VS.NET2003だと明示的に書かなくても通った。
>>43 扱いを難しくしてるのは、gccだけだけどなw
残念。それはgccのせいではなく規格のせいであり、つまるところ禿とかのせいなわけで。
VCだと本来typenameがあるべき所に無くても通ったりするな。 プログラマをへたらせるだけだと思うんだが
VC++ 8でtypenameを付けないとコンパイルできなくなったように思う。
直されたんか。それはよかった
規格の不可解な点には必ず理由があると思ってた。
>>49 のように書かなければいけないのも(typedefすればすっきりするが)
何か理由があるのだろう。基底クラスが一意に決定できるのにわざわざ
修飾しなければならないのは。
プログラマがへたるっていうより一個一個typenameついてたら美しくない希ガス。 もちっとましな規格にならんもんかしら
>>61 そこで書かれているのは typename が要らなくなる,ではなくて
現在の仕様だと typename を書くことが禁止されていた場所に
typename を書いても許されるようになる,ということだけだと思います.
この規格の変更で 60 さんの不満が解消することは恐らくないかと.
>>51 two stage lookup ってやつだろ。
B<T1, T2>::x() の定義の前にグローバルな int a; なんて宣言があった場合、
>>48 だとテンプレートのインスタンス化前に行われる名前解決で ::a = 1 と
決定されてしまう。
ここでは a がテンプレートのインスタンス化を行うまで確定しないことを
コンパイラに伝える必要がある。
>>49 はその方法のうちの一つ。
this->a のほうがお勧めだけど。
初心者ですみません メンバ関数の中でstatic変数使ってるんですけど、これは他のオブジェクトとも共有されるんですかね
class foo{ void func() { static int a = 0; printf("a = %d\n", ++a); } } int main(int argc, char*argv[]) { foo f1, f2; f1.func(); f2.func(); return 0; }
スマソ メンバ変数にすることにします 静的変数ってグローバル変数とほとんど変わらないんですね
C++というより、Cの質問になるのかもしれませんが、 C++組込型において、格上げの規格について教えてください。 signed short s = 0xFFFF; unsigned long ul = static_cast<unsigned long>(s); cout << hex << ul << endl; とした場合、結果は ffffffff となりました。 符号有り型から、符号無し型へ格上げした場合、変換後の値は変換先の型に入るだけのビット数を変換前から抜き出したものになる。とプログラミング言語C++第3版 p945には書いてあるのですが、これは違った結果になりました。 最上位bitが1なら、上位ビットは1で埋まるというのは、規格で決まっているのでしょうか? コンパイラは、Visual C++ 2005 Express edition です。
まあ、あれだな。 cout << (ul==s) << endl; とやってみてから考えれば?
ああしまった。これじゃ暗黙の型変換で意味がない。 cout << ul << endl; cout << s << endl;
70 :
67 :2006/12/03(日) 20:58:25
>>69 4294967295
-1
となりました。うーん、ちょっとまだよく分からないのですが。
何かプログラミング言語C++を読み違えてるんでしょうね・・もう少しジックリ読んでみます。
ありがとう。
符合拡張でぐぐれ。 それからビット数が多い整数から少ない整数に変換する話であって本は間違ってない。
>>67 > signed short s = 0xFFFF;
signed short の最大値が 0xFFFF 以上じゃないと、この時点で値は実装依存だよ。
73 :
67 :2006/12/03(日) 21:22:56
>>71 符号拡張というんですね。
さっそくググってみます。
>>72 あ、すいません。-1とするべきでしたね。
ご丁寧に、ありがとうございました。
>>71 それを書くなら符号拡張だろ。
だが、ここで関係するのは汎整数拡張だ。int/unsigned intより小さい型の値は、
演算前にintか、intで表すことができなければunsigned intへ拡張されることになっている。
モンテカルロ法でいろいろ計算するプログラムを作っています。 モンテカルロクラスのコンストラクタに、計算対象の純粋仮想クラスへの参照を渡して 計算させたいのですが、下記のようにするとコンパイルエラーとなってしまいます。 class MonteCalro { public: explicit MonteCalro(Calculatable& c){cp=c;}; double calc(const int count); private: MonteCalro(); Calculatable& cp; double getRandomValue(const double range) const; }; 上記の&を*にするとうまくいきますが、 オブジェクトの内容を書き換えられるのがいやなので なるべくでしたら参照型で渡したいのですが。。 どうしたらよいのでしょうか?
別に参照にしたからといって内容を書き換えられなくなりはしないけど。 -?explicit?MonteCalro(Calculatable&?c){cp=c;}; +?explicit?MonteCalro(Calculatable&?c):cp(c){};
explicitに引っかかってるとか?とりあえず書き換えられたくなかったらconstつけとけ
>>76 うまくいきました。ありがとうございました。正直びびりました
>>77 「参照メンバー 'MonteCalro::cp' は初期化されていない」とエラーになっていました・・
それと、どこにconstをつけたらいいか良く分かりません。
const Calculatable& cp;
とすると、警告 W8037 montecarlo.cpp 9: const オブジェクトに対して 非 const 関数 'Calculata
ble::getYrange()' が呼ばれた(関数 MonteCalro::calc(const int) ) とでます。。
C++ むずかしい・・・
>>78 Calculatable::getYrange()っていう関数でメンバ変数を書き換えるコードがかかれてない?
constつけるとそういうのはコンパイルエラーになる
>>79 レスありがとうございます
Caluculatableクラスに下記のようにconstつけてみたのですが、
まだ、警告 W8037 montecarlo.cpp 13: const オブジェクトに対して 非 const 関数 'Calculat
able::isInside(const double,const double)' が呼ばれた(関数 MonteCalro::calc(cons
t int) )
とエラーが出ます。isInsideにconstをつけると、継承したクラスで
エラー E2353 main.cpp 17: クラス 'Circle' は抽象クラス('Calculatable::isInside(
const double,const double) = 0' のため)(関数 main(int,char * *) )
とエラーが出ます。がびーん
class Calculatable
{
public:
virtual bool isInside (const double x,const double y)=0;
double getXrange() const{return xrange;}
double getYrange() const{return yrange;}
protected:
double xrange;
double yrange;
};
>>78 getYrange() に const 付け忘れてんだろ。
>>80 isInside() と、それをオーバーライドするクラスでの宣言全部に const が必要。
片方だけ付けるとオーバーライドとみなされない。
>>82 ありがとうございます。うまくいきました。
各クラス1個1個const付けつつコンパイルしてたので失敗していました。。。
いかにも学校の宿題っぽいソース見せられるとなんか和むな
旦~
すまぬ、誤爆したorz
1つのクラスで10Kラインてのは、 やっぱ詰め込みすぎですかね? ソース整理してくれって言われてて とりあえずライン数集計したんだけど。
よっぽど低レベルな処理でもしてるんでなければ多すぎだろ、それは。
マ板の「この会社やめようと思ったソースコード」に出てくる領域じゃないかな・・・。
90 :
87 :2006/12/04(月) 21:32:55
>>88 、89
うーん、詳しくはいえないんだけど、
数値計算系の業務用プログラムなんだ。
入ったばっかで何やってるかわからないから、
10Kが妥当かどうかも判断つかないよ。
数値計算系ならあり得るかも・・・
まぁソース分割だけじゃなく色んな方面から考えないとなぁ
メンバ変数とか1つのクラスに数十個あるよ クラス同士の結合も相当強いし。。 しかし、数値計算に必要といわれればそれまでwww
そればっかりはアルゴリズム勉強するとかしないと判断不能だからなぁ……。 困るねそういうの。
あと、時々メモリリークを起こすって言うから調べてるんだけど (どうもconst変数の値がいつのまにか変わっちゃうらしい) 全クラスでコピーコンストラクタとコピー代入演算子が書かれてないんだ。 (デストラクタも宣言しただけ) このあたりって、関係あるかな???
単にconst_castしちゃってるとかじゃないよね?
>>96 あ、それもありうるかも
なんせソースが長いからどっかでやってるかな。。
明日調べてみます。ありがd!!!
98 :
デフォルトの名無しさん :2006/12/05(火) 00:39:58
getter/setterについての質問です。 多くのgetter/setterはmember変数に対しての操作になると思います。 例えば、int GetX() constとvoid SetX(int)です。 で、逆に、member変数に対して操作しないような関数は、 GetやSetっていう名前をつけるのは避けたほうがいいんでしょうか。 今制御のprogram書いてるんですけど、 制御する機器の状態(シリアル接続)を問い合わせるのに、 GetMode()とかやってどういうモードで稼働しているかとか、 そういう関数にGetを使うのは慣習違反ではないですか?
俺はなんかの状態を取り出すものは全部getってつけてる。 むしろメンバ変数かそうでないかでgetってつけるかつけないか 決めちゃったらカプセル化という意味でも変だと思う
>>98 そのクラスが
外からみてどう振舞って欲しいか、どんな操作があればよいか
というのと、
メンバ変数としてどう持つか
というのは分けて考える。
そうすれば疑問は沸かない。
広い意味でのインターフェースと実装の分離、だよ。
class A{ public: A(){}; void F(){ ... }; }; というクラスを作り、 A a1; A a2(); とインスタンス化したのですが、 a2の方は「プロトタイプされている関数が呼び出されませんでした」と警告が出ました 続けて、 A a2(); a2.F(); とやると、Fが定義されてないとなってコンパイルエラーがでました。 以前、コンストラクタで()をつけても、つけなくても同じと聞いたのですが、やはり違うんですか? VisualStudio.2003を使ってます
>>101 それだと「引数を受け取らず、Aを返す関数の宣言」と解釈されてしまってる。
>>98 標準ライブラリに習って、メンバの状態取得には何もつけない。
[オブジェクト].名詞(); // げった
[オブジェクト].動詞(値) // せった。 若しくは [オブジェクト].set_名詞(値)
でアクセス。たとえば mode なら
int md = object.mode();
object.change_mode(md);
サイズなら、
size_t sz = object.size();
object.resize(sz);
みたいな。
type member() const; void member(type value); でいいじゃん。
>>104 bind に渡すときとか面倒なうえに可読性もガタ落ちするんで、やめてください。
106 :
98 :2006/12/05(火) 14:47:40
レスありがとうございます。
特にこれといった流儀はなさそうですが、
>>99-100 そのclassを使う側からしてみれば、
member変数なのかも分からないですもんね。
そうすると、member変数が持つ状態のか、
制御する装置自身が持っている状態なのか、
気にする必要はないような気がします。
>>103 こっちでも確かにそうだなーと思ってしまう。
どっちにするか未定ですが、参考になりました。
>>104 きもす。
new/deleteに関する質問です。 newで動的に領域を確保しているのですが、 この領域をいくつものクラス間で利用しているため、 どのクラスでdeleteすればいいかが分かりません。 最後に使用しているクラスを判断するみたいな関数とか ありませんでしょうか?
>>107 その領域を使用しているクラスを表すカウンタを作る
クラスとインスタンスの区別はつけよーぜ。 ってのはともかく、スマートポインタとかリファレンスカウントとかって言葉で調べろ。
>>109 すみません、まだC++始めたばっかりで
理解できていない部分が多くて(´Д⊂グスン
精進しますm(_ _)m
そのネタもう秋田
毎年いるなー 「このネタ面白いでしょでしょ?」なバカが。 氏ねばいいのに
細かくあちこち覗いてると、毎月ペースで出会うw
116 :
デフォルトの名無しさん :2006/12/05(火) 19:45:17
io.h, stdio.h, fstream とありますが、ファイル入出力で一番処理効率がいいのって fopen系ですよね? fstream系のオブジェクトで数メガのファイルを開くとどうもモッサリします… 普通にこんな感じなんですが。 ifstream in("file", ios::binary); in.seekg(ios::end); int size = in.tellg(); in.seekg(ios::beg); char pbuf = new char[size]; in.read(pbuf, size); in.close(); delete []pbuf;
>>117 そうですよねぇ…
VC++6.0なんですけど、
>>116 コードがかなりモッサリしてたんで…
1MB以上1GBぐらいまでのファイルの読み込みなら素直にAPI使ってメモリマップトファイルで。
昔Cの読んだ本で、
「プログラミング言語C」 難しい、分からない
「初めてのC」 全然分からない
「新・詳説C言語」 分かりやすくてサイコー
こんな感じだったんだけど。
「新・詳説C言語」のようなC++の解説サイト(日本語限定)、なかなか見つからない。
色々ぐぐってみて、javaでは今のところ、
Javaの道(Java入門・リファレンス)
ttp://www.javaroad.jp/ が一番イメージに近いんだけど。
>>121 〜だけど。〜だけど。
何が言いたいのか分からない。
とりあえず英語勉強しろと言っとこう。 絶対必要になるし。
124 :
デフォルトの名無しさん :2006/12/06(水) 04:13:20
2次元配列を使った3×3行列の転置行列って、どうやったらいいですかねぇ?
行と列を入れ替えればいいと思うよ
関数の引数として一時オブジェクトを渡すとなぜコピーが発生しないのでしょうか? 例えば、これ。 class A; void Func(A obj); int main() { Func( A() ); //コンストラクタを直接呼んで一時オブジェクトを生成 return 0; } 後、一時オブジェクトはスタックに作られるんでしょうか?
>>126 必ずコピーが発生しないわけではない。
詳細は覚えてないけど、ダイレクトで渡してもいいよっていうルールがあるだけ。
場合によってはレジスタ上にしか存在しないなんて例外もあるかもしれんが、
基本的に一時オブジェクトはスタック上に作られる。
最適化とかが進むと、クラスの実体自体が機械語レベルでは消えてたりとかな。
129 :
126 :2006/12/06(水) 14:18:24
一時オブジェクトは、スタックに作られるというのは分かりました。 >必ずコピーが発生しないわけではない。 ということは、一時オブジェクトからさらに引数のために スタックにコピーされることもあるってことですよね。 そうなると、引数にするものが存在するのにコピーして無駄 な作業してるじゃないですか。
131 :
126 :2006/12/06(水) 16:32:33
なんかもやもや感がありますが、そういう規則が適用される場合があると考えることにします。 回答ありがとうございました。
一時オブジェクトの省略はしても良いし、しなくても良い。 どちらにするかの判断はコンパイラに任されている。
引数も戻り値も一時変数もローカル変数も全部スタックの上の話ってことさ
134 :
126 :2006/12/06(水) 22:30:35
なるほど、コンパイラによるんですね。結構すっきりしてきました。 でも、テストコードを作るために直接コンストラクタを呼んで一時オブジェクト使えばコードを書く量が減るから いいなぁ〜って思ったけど、あまりやらない方がいいですね。
コードの量は減らせるなら減らしたほうがいい わかりやすさを損ねない限り
そもそもクラスを引数にするなら普通const参照にするだろ。
>>134 その辺は次の標準ではやり方が変わる可能性が高い。
rvalue reference, move semantics辺りで。
聞いてない
139 :
デフォルトの名無しさん :2006/12/10(日) 13:37:08
>>139 それでなくても C PreProcessor との曖昧さが問題だろ。
namespace A { int a() { retrun 0; } } using A::a(); int main() { a(); retrun 0; } こう書いてるノートがあるんですが、 これって間違いですよね。 正しくは using A::a; じゃないんですか?
>>142 using A::a();
でコンパイルできなくて
A::a;
だとできたので聞いたんです。
そこまでやって自分で結論出せないなら首吊って氏ね
>>143 オマエのコンパイラは retrun がコンパイルできるんだな。それ C++ じゃないよ。
>>145 return の間違いだろ。スルーしとけばよくね?
149 :
デフォルトの名無しさん :2006/12/10(日) 18:34:12
すみません、C++がほとんど分からないバカですが、 分からないにも関わらず、C++の仕事やんなきゃいけなくって、 困ってます。助けてください。(ほんとにわけわかってません) [質問] MFCでつくったDLLって、MFCでつくったEXEからしか 呼べないんでしょうか? MFC以外のC++のEXEから呼ぶ 方法があれば、教えて下さい。
>>149 スレ違い。
バカはプログラムするな。分からないと自覚してるんなら仕事は断れ。
質問です。 #include <iostream> using namespace std; namespace x { a(int,int); int i; int j; int k; } int x::a(int k, int j) { cout << k+j << endl; return 0; } int main() { return 0; } これがコンパイルできるのですが、 関数宣言したとき、戻り値書かなかった場合、自動的にintになるんですか。
>>152 暗黙の宣言でググれ。
Cやその前身のBの頃の名残り。
154 :
デフォルトの名無しさん :2006/12/10(日) 18:56:50
質問です シーはネトゲに向いてますか? どんなネトゲに使われてますか? 将来ネトゲ作るために、少しふれておきたいです どれがいいのか悩んでます
>>149 もしお客だったとして、こんな奴の作ったもの使いたくない
C言語の構造体 typedef struct tree{ int value; ..any struct tree *next; struct tree *child; struct tree *parent; struct tree *prev; }Tree; このようなデータ構造をC++側でラップする場合みんなどうやってラップしますか?
>>152 コンパイラ何使ってる? C++ では暗黙の型指定は無くなってるはず。
>>157 ラップする目的がわからないと、何も決まらない。
>>159 AIXとHPでほぼ同じ構造体を持つライブラリがあります。
わざわざ呼び出すのに、ライブラリに依存して呼び出したくないので
ラップして、隠蔽したいなぁと考えています。
>>160 共通のインターフェースを純粋仮想関数としたクラスを書いて、
それぞれの実装(派生クラス)にラップする構造体を持たせる
って感じが基本かなぁ。
>>158 Borland C++ 5.5.1
拡張子で判断してくれてるんだと思ってたけど、
なんかオプション必要?
>>162 namespace でエラーが出ないなら、 C++ としてコンパイルしてるはず。
どうせ C の実装をそのまま使いまわしちゃってるんだろう。
ここはソースを直すべき。
Exceptional C++ Style で、コピーの生成を省略できる(RVO)理由として 「標準準拠のプログラムと区別がつかない限り、コンパイラは標準の 技術的要求と異なることをしても良い」 とあるのですが、意味がよく分かりません。 例えばコンストラクタで画面に文字を出力しているときなどでは、 コピーが省略されると結果が変わってくると思うのですが
RVOは規格にやってよいと書かれているはず。
>165 第何項の話?
>>167 12.8.15じゃん。
12.8 Copying Class Objects
>>168 要するにいい加減になってるということですか?
(rvalue referenceは是非とも入ってほしいですね)
172 :
170 :2006/12/10(日) 22:07:44
>>171 まああなたの
>>165 の疑問は正しい感覚であるということになると思います。
良く考えて読んでいる証拠かと。
12.8.15も読んどいてください。JIS規格はただで読めるので。
>169 ごめんなさい.英語版しか持ってないんです……. >172 曖昧な質問ですいません.書籍の項目番号を聞いてるつもりでした. >165 上のレスで挙げられた規格の項目 12.8/15 にありますけれど "even if the copy constructor and/or destructor for the object have side effects." でも [N]RVO は許されていて >例えばコンストラクタで画面に文字を出力しているとき では RVO が機能しているかどうかで画面出力が変化します. 逆に,画面出力の回数で RVO が効いているかどうかを確認することができます. ただし constructor/destructor に副作用があるかどうかで,コンパイラの RVO に関する判断が変わる可能性も否定できませんけれど.
>>174 私も書いた後でそんな気がしてましたw
「最適化と効率」の「24.constによる最適化」という項の、
Guru質問3の解説にあります
>175 今,該当の項目読みましたけれど,ここは RVO とは直接の関係が無いと思います. なので書いてあるとおり, z のコピーコンストラクタで副作用が発生するなら copy を省略することはできないです (ここが RVO との差異).
177 :
デフォルトの名無しさん :2006/12/11(月) 12:41:05
質問です。 関数の引数に渡されたインスタンスが、 ある複数のクラスを継承しているかをRTTIも用いずに判別する方法はあるでしょうか? その判別が可能であれば、その後に各クラスのインタフェースでメソッドを呼びたいのです。 今のところ、苦肉の策として class Hoge : public A , B;というクラスの場合、 void Func(A a,B b) のように含まれる型分の引数を増やした関数を作り、 全てに同じインスタンスオブジェクトを指定してもらうようにしています。
コンパイル時ならtemplateでどうにでもなるんだけどなぁ。 MFCだとRUNTIME_CLASSなんてのがあったね。
>>177 「複数のクラス」が全部空のインターフェースクラスなら、
単純にまとめたインターフェースクラスを取ればいいんだろうなぁ。
現状で実装が混ざってるんなら、そいつら切り離したら良いんじゃない?
あるいは、
class AB
{
virtual A& A() = 0;
virtual B& B() = 0;
};
で
class Hoge : public A, B, AB
にして
void Func(AB&);
とか。
class A{ B b; }; class B{ A a; }; としたいんですが、やはりコンパイルエラーです。 どうすれば良いんでしょうか。
class A{ B*b; }; class B{ A*a; }; 実はこれがしたいのを適当に省略してしまいました。 voidで我慢しないといけないんでしょうか。
class B; class A{ B*b; }; class B{ A*a; };
arigatougozaimasita;
>>177 class Q { public: virtual bool QueryClass( uintptr_t cid, void * & pSelf ) = 0; }
template<typename T> uintptr_t CLSID()
{
static T * dummy = 0;
return reinterpret_cast<uintptr_t>(&dummy);
}
class A { public: static uintptr_t CID() { return CLSID<A>() } ... };
class B { public: static uintptr_t CID() { return CLSID<B>(); } ... };
class AB : public A, public B, public Q {
public:
static int CID() { return CLSID<AB>(); }
bool QueryClass( uintptr_t cid, void * & pSelf ){
pSelf = 0;
if( cid == A::CID() || cid == B::CID() || cid == AB::CID() )
pSelf = this;
return pSelf != 0;
}
};
感動した 流石template
プログラムの事じゃないからここで聞いちゃいけないかもしれないけど・・・ 小さい頃からプログラマーになりたくて中学校のときに中学生なりに勉強はしてたけど 普通の勉強が嫌いでプログラムの勉強ばっかりしてたら工業高校にいけなくて結局普通高に行った 学校は普通の授業ばかりでやる気も出ずに中退 プログラマーの夢も諦めてしばらくNEETやってたけどやっぱり親に頼りっきりってのも問題だと思って もう一度プログラムの勉強始めてみた でも中卒でプログラマーやPC関連の職に就けるとは思えない・・・ もし望みがまったく無いなら今のうちに諦めて別の職業を探そうかなと・・・ 今から勉強をがんばったとして望みはありますか? 大検も一応受けようと思ってます
プログラムの勉強ばっかりしてたら 数学も英語も必要になるのでどうにかなっただろう 君はバカなのだ 逆説的だが君はプログラマに向いている 望みはある
>>188 数学も英語も一応使う部分は勉強して理解してたけど
その時の授業で使われないから意味が無かった・・・
好きなことに関しては勉強意欲もあるし長時間できるけど
国語や社会などの勉強は10分も出来ない・・・やる気が出ない・・・極端すぎた
就職する望みがあるならこのまま勉強続けたいと思います
とりあえずCとJavaかな・・・
ありがとうございましたw
一気にスレのレベルが上がったなw
大学入試でも私立なら国社はいらないし気にすることないんじゃないの
>>187 正攻法で行っても、実力を評価される前に「足切り」されるのがオチ。
就職希望なら自分の実力を相手にはっきり示せる武器をまずは用意しろ、話はそれからだ。
あと、なにも就職することだけが職業プログラマへの道ではない。
>>185 QueryClass の結果は戻り値使えばいいんじゃないの?
CLSID にある dummy の型は char const で十分だね。
uintptr_t を使ってる意味が分からない。 void const* を typedef すれば十分じゃないの?
とか、いろいろ突っ込みどころがあって気になったけど、面倒になったからあとはいいや。
>>186 これ、たぶん無駄な記述が多いから真似しないほうがいいよ。
auto_ptr<>についての質問です。 動的に3次元配列のメモリをauto_ptr<>を使って確保したんですけど、 どうしたらいいのか、わかりません。 どうしたらいいんでしょうか?
>>194 確保したんだったら、利用すれば?
利用するために確保したんでしょ?
そもそも配列の保持にauto_ptrを使ってはいけない。
>>194 boostにmulti_arrayというのがある
boost::multi_array<int, 3> ary(boost::extents[10][20][30]);
ary[0][1][2] = 123;
こんな感じで使える
クラスのメンバに参照を持ちたいんですけど、ポインタで我慢しないといけないんでしょうか。
template<typename _Ty>みたいな使い方の利点はわかるんだけど template<int _I>とかって存在理由がよくわからない。 テンプレートクラスなんかでもメンバ変数かなんかに保持してちゃだめなのかな。
存在理由というか、そもそも使い方が分かってないので、 boost::lambdaでも読んで勉強してはどうか?
>>200 配列の要素数のような定数式が要求される部分でもパラメータ化できる。
>>200 引数に渡された配列の要素数がゲットできる。
フィボナッチ数を計算できるw
205 :
デフォルトの名無しさん :2006/12/12(火) 18:15:24
>>193 めんどくさがらずに書いていただきたい。
上げてすまん。
>>200 コンパイラに無茶な仕事をさせ、コンパイル時間を大幅に引き伸ばすことができる。
>>200 C++学習者に意味のわからない奇妙な構文を浴びせ、
混乱に陥れる事が出来る。
>>205 (
>>185 )
じゃ、書いてみる。
定型になっている CID() の定義を繰り返すのは無駄だろ。
QueryClass() の実装と継承関係に関連が無いのでまったく信用できない。
というわけで、そもそも
>>177 への回答になっていなかったわけだ。
どうでもいいぜ。
ここで質問に答えてる人に聞きたいんだけど、 何か問題解くためのソースをゼロから書きたいって思ったとき 完成するまでどのくらいの時間かかってんの? たとえば、どんな問題でもいいけど、ソートとか。 やっぱり頭の中で簡単にアルゴリズムからソース生成できるのかな。
211 :
194 :2006/12/13(水) 02:59:06
保持するのにuato_ptr<>を使うのは間違いなんですか。 わかりました! ありがとうございました! boostですか。初めて見ましたw これからそれについて勉強してみます。 ありがとうございました!
212 :
デフォルトの名無しさん :2006/12/13(水) 10:50:10
テンプレートによるスマートポインタを作っているのですが、 void型をサポート可能にしてしまうと、operator*()が実装出来ずに困っています。 error C2182: '*' : 'void' 型が不適切に使用されています。 どのように解決すればよいでしょうか?ご教授下さい。
特殊化
>>213 なるほと、こんなときの特殊化でしたね。
ありがとうございました。
>>210 ソートだと、STLとかのライブラリに頼り切ってるから
全部自分で書こうとすると悩むかも。クイックソートってどうやるんだっけ?とか。
簡単な問題なら、大まかなアルゴリズムがパッと思い浮かぶ。
で、もっとスマートにできないかとか、これで合ってるのかとかちょっと考える。
アルゴリズムが固まればコードに落とすのは簡単。その通りに書けばいいだけだし。
すみません。テンプレートで分からないことがあるのですが、 template<typename T> int function(vector<T> vec) { ・・・ return 0; } int main(){ vector<int> vec; function<int>(vec); return 0; } このような感じだと 「function(class vector<int,alloc<int>>)が定義されていない」 といった感じのエラーが出てしまいます。 型がまだわからないvectorを引数に取る関数を定義するには どうすればいいのでしょうか?
>>217 コンパイルできたけど?
includeかnamespace忘れてない?
あれ、、。 ちなみにコンパイラは何でしょう? #include <vector> using namespace std; と冒頭で打ってるので大丈夫だと思うのですが。
質問です LinuxでC++を使う場合、開発環境はEcrips一択でしょうか? 他に便利なものがあれば教えてください
>>219 gcc,vc,bcc
エラーがでる最小限のソース晒してくれ
222 :
219 :2006/12/13(水) 19:19:58
>>221 ちょっと時間ください。
大学が閉まりそうなので時間かかってしまうかもしれませぬ。
223 :
219 :2006/12/13(水) 20:11:00
思っていたソースとだいぶ違っていました。。 #include <vector> using namespace std; // default template<typename T> int func(T data); // int template<> int func<int*>(int* data); // vector template<typename A> int func<vector<A>*>(vector<A>* data); // int int func<int*>(int* data){ return 0; } // vector template<typename A> int func(vector<A>* data){ return 0; } int main(){ vector<int> ivec; func(&ivec); vector<float> fvec; func(&fvec); int i; func(&i); return 0; }
224 :
219 :2006/12/13(水) 20:12:01
これだと、 test.cpp(12) : error C2768: 'func' : 明示的なテンプレート引数を使用することはできません。 となってしまいます。 型未定ベクタの特殊化をしたいのでが、うまい方法が分からないです。 何かいい方法はありませんでしょうか?
関数の特殊化は無理
>>224 templateの特殊化はよく知らないのだけど、コンパイルできるように変えてみた
ただコンパイル通るようにしただけで、たぶん求めてるものと違うと思う
#include <vector>
using namespace std;
// default
template<typename T>
int func(T data);
// int
template<>
int func<int*>(int* data){
return 0;
}
// vector
template<typename A>
int func(vector<A>* data){
return 0;
}
int main(){
vector<int> ivec;
func(&ivec);
vector<float> fvec;
func(&fvec);
int i;
func(&i);
return 0;
}
228 :
219 :2006/12/13(水) 20:57:12
特殊化できないのですか…むしろする必要がない?きがしてきました。 それでコンパイル通りました。そんな感じで色々試してみます。 携帯からなのでアンカー省略しますが、みなさんありがとうございました。
229 :
デフォルトの名無しさん :2006/12/13(水) 21:08:56
人格プログラムって作れるんですか?
C++で?
231 :
デフォルトの名無しさん :2006/12/13(水) 21:14:51
難しいことはよくわかんないです。プログラム自体どんなものかよく分からないし・・・・ ここの話題とは外れているんですけど・・・
233 :
デフォルトの名無しさん :2006/12/13(水) 21:23:57
教えていただいてありがとうございます
1GBくらいのメモリを一気に必要とするプログラムを作ってるんですが。。。 物理メモリ1GBのマシンで走らせると、 スワップで死ぬほど遅くなります。。 スワップ走らせないで、物理メモリのみを確保するにはどうしたらいいんですか? WinXPです
>>234 XPは、カーネルが、100MB以上のメモリを必要とするが、どこから1GBのメモリは湧き出てくるのかね?
>>234 仮想メモリを切っておく
ってのは冗談としてWin32API使わないと出来ないかも
>>235 会社の共有スペースにメモリが落ちてます
>>236 そうですか。。。すれ違いですみません
絶対にスワップしないと保障できるメモリはAWEで確保できるが、 AWEはあまり使いやすいとは思えない。 大抵の用途ではオーバースペックだし。 そもそもAWEを有効にするには、BOOT.INIを変更する必要があるし。
スレ違いも程ほどに
>>234 みたいな糞はともかくとして
PCの知識が不足気味な奴って結構いるよな
むっかーーーーー!!!!!!!!!!!!!!! ぷりぷり
>>238 さん
ありがとうございます。
AWE調べてみます。
>>240 さん
糞に糞と言われたくありません。
>>243 ( ・∀・)つ三三三三三● ウンコクラエ!!
急速にスレの質が低下してまいりました
ム板ではよくあること
>>217 > といった感じのエラーが出てしまいます。
ずばりエラーメッセージそのものを張りなよ。
257 :
220 :2006/12/14(木) 01:21:30
拡張子の問題なんだけど *.hpp, *.cpp のファイルはboostと同じ命名方法でclassを書いた .hxx, cxx 適当な命名規則でむちゃくちゃ が混在していて A.hxx A.hpp A.cpp で2つのヘッダーに分けるか2重に名前定義するか迷ってるんだけど なにかいい解決方法ない?
>>258 よくわからんが、「適当な命名規則でむちゃくちゃ」を捨てればいいんじゃね?
260 :
sage :2006/12/14(木) 22:46:09
すみません、低レベルで申し訳ないのですが、 int* num; はポインタですよね、 int& num; の意味は何でしょうか?
リファレンス
参照
ありがとうございます。 あと、クラスのconstメンバや参照メンバ の初期化ってどうすればいいのでしょうか?
きりがないから、まず本なりで一通り勉強しろ。
すみません。質問禁止とは知りませんでした。 申し訳ないです。 明日図書館に行ってみます。
禁止ではないが、入門レベルの本を見ればずばりの方法が書いてあることは、本を見ろよと思う。 お前以外にも山ほど同じような疑問を抱くやつは出てくるから答えるほうだって飽きてくる。
>>263 コンストラクタの初期化リストで行う
というか行わないとエラーになるだろ
参照はともかくconstなメンバはコンストラクタで代入しても、実は平気。 コンストラクタ・デストラクタの中ではconstがないものとして扱われるはず。 勿論なるべく初期化リスト使うべきだろうが。
気持ち悪い仕様だな
270 :
263 :2006/12/14(木) 23:55:24
みなさん本当に申し訳ありません。 明日図書館で調べてみます。 迷惑かけてしまって本当にすみませんでした。
>>268 おい、嘘付くな。
コンストラクタ内でconstに代入しようとしたら当然のごとく
コンパイルエラーになったぞ。
staticでないconstは初期化リスト、staticの場合は外部で
定義するか、static const intだけは直接書いてもいいけど、
コンストラクタ内ではだめだろ。
272 :
268 :2006/12/15(金) 00:21:48
本当だ、すまん。 オブジェクト自身にconstが付いている場合とごっちゃにしていた。○| ̄|_
>>272 >オブジェクト自身にconstが付いている場合とごっちゃにしていた。○| ̄|_
どういうこと?
1418544個のデータをint型の配列に格納しようとしたんですけど、 異常終了っていうんでしょうか?強制的に終了しました。 int data[1418544]も一気に確保する事ってできないようになってるんでしょうか?
>>274 お前がMS-Windowsを使っているなら、デフォルトのスタックは1MBだ。
後は分かるな?
>>275 ?! そうだったんですか!
分けなくてはならないって事でしょうか?
どうしたらいいんでしょうか?
つnew
あっ! ありがとうございました!
Cの基礎勉強しなおしたいんですけど、 基礎とその基礎を使った問題が載ってる本てあるんでしょうか? 何かお勧めの本あったら教えてください
独習C
独習シリーズは簡単すぎると思うのはオレだけ?
というより独習C++から初めても簡単だからね。
boostのシリアライズって、 ポインタを渡しても自動的にポインタが指すインスタンスが シリアライズされますよね? あれってどうやって、ポインタか否か判別してるんですか?
284 :
デフォルトの名無しさん :2006/12/15(金) 16:43:37
んー、俺のスキルでは簡単にまとめられん。 ソース嫁。
type_traints
ポインタで特殊化してるとか?
>>284 読んでみました。
extended_type_infoとかあやしいんですが、
ややこしいですね…
>>285 ブースト内検索してみましたが
出てこなかったです。
>>286 う〜ん。見た感じserialize関数はテンプレート使ってないです。
最初それでやってたんですが、記述量が無駄に増えてスマートにならなかったので、
boostはどうしてるのか気になったんです。
あ、type_traitsですね。 ありがとです。 調べてみます。
↓のソースコードみたいにyやnを入力してループを終了するのではなく、 画面に continue finish のようなのを用意しておき、方向キーの「←」「→」で、 選択した方されたほうを、括弧([ ])で continue [finish] のように表示させて、enterキーを押すと 決定される(上の場合はループを抜ける)ようにしたいのですが、 どうしたらいいのでしょうか? #include <iostream> using namespace std; void main() { char cInput = 'n'; do { cout << "終了する場合は y を入力\n"; cin >> cInput; } while ( cInput != 'y' ); return 0; }
環境依存。他所でどうぞ。
ブロッキングせずに入力状態にするのってスレッド使わなきゃ無理?
環境依存。
gcc 3.4.5使ってます template< class T, class T2 > class Hoge { public: map< T, T2 > _map; map< T, T2 >::iterator GetBegin(){ return _map.begin(); } }; と書くと、"expected ';' before GetBeginとエラーになります。 map< T, T2 >::iteratorって文法違反なのでしょうか?
typename map<T, T2>::iterator
ありがとうございます。 出来ました。typename必要だったのですね・・ VSだとiterator前にtypename無くてもOKだったので気づきませんでした
VC++じゃない方のC++で 分かりやすくMakefileの書き方が載ってるサイトがあれば教えてください
>>298 スレ違い……いや、鼬害だ。
Makefileは言語に関係なく書式が決まっている。先ずはmakeのマニュアルページでも見たまえ。
>>298 UNIXプログラミングスレで答えておきました。
303 :
マリー :2006/12/17(日) 12:08:55
antにすればいいじゃない
C++だったらboost jamだろ
#define max が使ってるライブラリのどこかにあるみたいなんだけど (max)って書くと避けられるとも聞いたのだが (max) = #define max のこと?
環境依存スレへ
言語仕様の話だろ #undef max でいいんじゃないか?
>>305 ()をつけるとマクロ展開が抑制される。
maxを定義しているのが<windows.h>の中からなら#define NOMINMAX
311 :
デフォルトの名無しさん :2006/12/19(火) 09:02:06
stringstreamの内部バッファをクリアするには どうすればいいのでしょうか?
313 :
311 :2006/12/19(火) 09:27:19
>>312 本当にありがとうございました。
pubsetbuf、clearとかそれらしいものみてたけど
str()で取得できるのは知ってたんで
まさかstrで設定もできるとは...orz
io関係の命名則、意地悪すぎ...
stringstreamの内部バッファのサイズを変更する方法を教えてください。
数値計算系のプログラムつくってると デバックのために、計算の途中結果を図でみたくなることがよくある 例えば std::vector<double> a(100) のヒストグラムを図でみたくなったりする こういう場合に図示するのに使えるライブラリーとかないのでしょうか? 例えばこんな感じです std::vector<double> a(100) .... plot_hist(a); wait_key(0);
317 :
デフォルトの名無しさん :2006/12/19(火) 20:04:25
静的なstd::mapを作成する方法ってないですかね enum{id_0,id_1,id_2}; static const std::map<int,char*> m ={ {id_0,"val0"},{id_1,"val1"},{id_2,"val2"} }; キーと値のマッピング情報はコンパイル時に確定しているので、 わざわざ動的にmapを生成するのは無駄の様な 気がします・・
普通にchar*の配列じゃだめなのか・・・?
>>318 vectorじゃなくてmapなんだから、きっとこんなenumなんだよ。たぶん。
enum ID {id_1= 10001, id_2 = 10001} ;
320 :
317 :2006/12/19(火) 21:21:58
>>318 まさに
>>319 の通りです。keyが0オリジンとは限らないし、stringの場合もあります
今までは
struct foo{ int key,char* val };
foo[]={ {1,"one"},{3,"tree"},{5,"five"}};
してループでサーチしたりしてたんですが
せっかく標準で用意されてるんだからmap(set)を使えばサーチが楽じゃね?
と思ったわけです
binary_searchでも使っとけ
1つのクラスにメンバが100個(含むポインタ)くらいあるんですが、 コピーコンストラクタとコピー代入演算子はどう書けばいいんでしょう。。。
ソース書き直しとか 設計やり直しって、 本当に効果あったことあります?
重量級だなオイ
>>322 先ずそのクラスの100個のメンバを4個に分けてそれぞれクラスとする。
次にその4個のクラスの平均25個のメンバを5個に分けてそれぞれクラスとする。
更に、20個+4個+1個のクラスについてコピーコンストラクタを用意すればいい。
>>327 えーまじーー???
100個書くのは変わんないじゃんwww
いっそのことコピー不可にしちゃえ
331 :
デフォルトの名無しさん :2006/12/20(水) 00:06:28
クラスの「仕様の継承」について質問なのですが メソッドは virtual void func() = 0; の様に宣言するとしても コンストラクタはどうすればいいのでしょうか? 特定の型を引き受けるコンストラクタ、というのを用意しようとしたとき その実装をサブクラスに要求するにはどうすればいいか、という事なんですが・・・
>>331 コンストラクタは継承されないから、
変わりにgetInstanceとかを用意するとかかね
>>325 全く同じ知識経験の人間がもう一度設計しても同じものになるのは当たり前。
問題点を把握してればそれなりに意味はある。
>>332 C++の機能とか予約語の事じゃなくて
「欲しい型のデータを取るメソッドを用意しろ」ってことですよね、
要するにコンストラクタは使わないと
やっぱりそれしかないですか・・・
class Hoge {
public:
Hoge(int foo) {}
private:
Hoge(); //no implement
};
じゃダメ?
>>334
>>331 どうせ template で使うんだろ?なら concept を定義するんだ。
今のところ言語は何も助けちゃくれないけどな。
337 :
デフォルトの名無しさん :2006/12/20(水) 01:54:16
VC++6.0でこうやっても大丈夫なんですけど。 これって規格ではどうなんですか?安全が保障されてます? void *p = NULL; delete p; free(p);
>>338 じゃあNULL判定しなくてもいいな。どうも。
free(NULL)はどうだっけ?
free(NULL); は問題ナシ。 delete NULL; はコンパイルエラーになりましたよ。 (VC++6.0 Pro SP6)
>341 よーくかんがえろ。C++では #define NULL 0 なので、文脈によってはポインタとして扱われない。キャストが要る。
そこでnullptrですよ
そこでnullpoですよ
ゲッ
346 :
デフォルトの名無しさん :2006/12/20(水) 18:02:50
STLのsetを使っていて、だいたい set<X> a; a.insert(b); のようなことをやると、 Core was generated by `XYZXYZ'. Program terminated with signal 11, Segmentation fault. #0 0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique () (gdb) backtrace #0 0x400000000002f320 in std::_Rb_tree<X, X, std::_Identity<X>, std::less<X>, std::allocator<X> >::insert_unique () #1 0x4000000000002aa0 in main??unw () のような感じでエラーになってしまうようです。 (完全に再現性のある小さいコードを用意することが 出来ませんでした。すみません。) コンパイラはicc9.0で、gccだと問題なく動作します。 個人的にはsetのinsertでcoreを吐くというのは、 あまりないような気がするのですが、どういうことを 念頭におきながらデバッグすればよいでしょうか?
347 :
デフォルトの名無しさん :2006/12/20(水) 18:26:22
すごく初歩的な質問なんですけど、 CMyClassというクラスのcppファイル内で #define FILEPATH L"C:\Test\File" (中略) void CMyClass::test { CString ss = FILEPATH; } というコードを記述してコンパイルすると error C2065: 'INIFILEPATH' : 定義されていない識別子です。 というエラーが出てきてしまいます。#defineの使い方を 間違っているのでしょうか?であるならば正しい使い方を教えてください。 よろしくお願いします。
エラー嫁。
350 :
348 :2006/12/20(水) 20:07:40
>>349 すみません、名前間違っていたのを直しました。
ですがそれでも同じエラーが出てきてしまったんですけど
根本的になにか間違っているんでしょうか?
ソース晴れ
バックスラッシュ絡み?
353 :
348 :2006/12/20(水) 20:42:47
みなさんすみません ソースではなくヘッダーに記述したところ コンパイル通りました。 お騒がせいたしましたm(_ _)m
しかし\は\\にしないといかんと思うが
355 :
デフォルトの名無しさん :2006/12/21(木) 01:16:59
>>348 C++で定数つかうならconstで
あとVC++みたいなので
const WCHAR *const FILEPATH = L"C:\Test\File";
>>355 const WCHAR *const FILEPATH = L"C:\\Test\\File";
だろう
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
257 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
257?
>>356 const WCHAR FILEPATH[] = L"C:\\Test\\File";
だろう
注.:.私.の.有.意.義.な.発.言.に.対.し.、.自.分.の.理.解.不.足.を.棚.に.上.げ.煽.り.、.1.行.レ.ス で.返.す.方.が.多.い.よ.う.で.す.が.、.そ.の.よ.う.な.方.は.ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い.の.で.お.黙.り.下.さ.い.。 ま.た.質.問.者.は.回.答.者.に.知.識.を.披.露.す.る.場.を.与.え.る.貴.重.な.存.在.な.の.で.、 質.問.者.を.見.下.し.た.回.答.、.あ.ま.り.に.も.儀.礼.を.欠.い.た.回.答.も.厳.重.に.禁.止.い.た.し.ま.す.。 忙.し.い.中.、.少.な.い.時.間.の.合.間.を.縫.っ.て.質.問.し.に.来.て.る.わ.け.で.す.の.で.、 そ.の.辺.ご.承.知.下.さ.い.。.な.お.、.当.方.が.質.問.に.対.し.て.有.意.義.な.答.え.で.あ.る.と 判.断.し.た.方.に.は.評.価.い.た.し.ま.す.の.で.各.自.よ.く.調.べ.、.よ.く.考.え.正.確.な.回.答.を.す.る.よ.う.に.。
テンプレートの部分的特殊化で template<class T> class Hoge{ /* ... */ }; template<class T, class U> class Hoge<T(U)>{ /* ... */ }; というコードを見たんですが、 T(U)という書き方はC++標準に適合しているのですか?
クラスへのポインタがNULLでも とりあえずメソッド呼べるんだねー (もちろんメンバにアクセスしないメソッドだけだけど)
>>362 T(U)は、U型を引数に取りT型を返す関数型。
>>363 静的メンバがなかった頃には、それで代用していたらしい。
今の規格では、たぶんそれをやるとどうなるかは未定義にしていると思う。
366 :
362 :2006/12/21(木) 20:33:23
>>365 ありがとうございます
ところで規格書のどのセクションにあるかわかりますか?
質問です newで確保したメモリに対して、 2回delete走らせると死ぬのはなぜですか?
平気と思うその感覚がわからん。
369 :
デフォルトの名無しさん :2006/12/21(木) 20:42:03
Linux上でg++を使ってプログラムを書きたいと思っています。 標準ライブラリのオンラインマニュアルはどのようにしたらみれるのでしょうか? (日本語でも英語でも構いません)
>>366 強いて言えば8.3.5@JIS X 3014:2003
>>365 deleteされても、deleteしたポインタを指す変数は、そこを指していると言う状態のままである。
そこで、2度目のdeleteを行うと、deleteされたはずの場所をdeleteしようとして、あらぬことになる。
原理的には1度目のdeleteの後で、そこを指す変数に0を代入しておけば2度目のdeleteでは、
ヌルポインタをdeleteすることになって落ちない(ヌルポインタのdeleteは何も起きないと定められている)。
勿論実際には、2度もdeleteするなと言う話になるが。
>>370 丁寧なご説明
ありがとうございました。
const変数の値が書き換わってしまうのってどんな場合がありますか? (メモリ直接上書きとconst_cast以外で)
放射線
const変数の値が書き換わるかどうかは未定義では? const_castは実際にはconstでないオブジェクトへのconstポインタのconstを外すのに使われるだけ つまり、 int a = 0; void f(const int* a){ *const_cast<int*>(a) = 1; } これはおk const int a = 0; void f(const int* a){ *const_cast<int*>(a) = 1; } 未定義
質問です。 WinXP Pro VC2005 SP1 RaiseException にて発生させたエラーを、ただの try でキャッチしたいのですが、 try {
378 :
377 :2006/12/21(木) 23:59:20
質問です。 RaiseException にて発生させたエラーを、ただの try でキャッチしたいのですが、 catch (...) だとキャッチ出来ます。さらに詳しい情報が欲しいため、catch の () の中に書くべき コードがわかりません。そもそも、仕様上無理なものなのでしょうか? ちなみに、__except では成功しました。 WinXP Pro VC2005 SP1 コンパイルオプションで、「SEH の例外あり (/EHa)」を指定しています。
そもそも標準にRaiseExceptionなんてものは無いわけで
380 :
369 :2006/12/22(金) 00:37:13
>377 Windowsの構造化例外をC++例外に変換する方法があるが 環境依存なのでスレ違い
382 :
377 :2006/12/22(金) 04:49:07
>>381 ありがとうございます。
381さんの書き込みで解決しました。
MFCスレで聞いたら、スレ違いといわれたので、こちらに来ました。 VC++6.0 WinXPProで開発を行っております。 ダイアログアプリの開発を行っており、そのアプリ上で、XPログオン用のユーザ名とパスワード を利用者に打ち込ませています。このパスワードが正しいかどうかを、開発したプログラム上で 確認したいと思っているのですが、どのようにすればよろしいでしょうか。
>>383 strcmp() でいいんじゃね?
っていうか、まずは自分で書け。
それで困ったことがあったら相談してもいいから。
いや、
>>383 は、そのユーザ名とパスワードが、
正しいアカウントとパスワードであるかどうかを確認したいんじゃないのか。
しかし、そんなAPIはエクスポートされているのかね。
>>384 strcmpだと、Windowsパスワードとの比較ができません。
そもそも、Windowsパスワード自体知らないわけで、知らない文字列との比較は……
APIスレのが適切だと思うけどな APIで、パスワードが「必ずある」ならLogonUserあたりかもしらん 自PCパスワードつきのアカウント1個もないからわからんけど
389 :
383 :2006/12/23(土) 15:52:22
ありがとうございます。
イブだけど、とりあえずtemplateがキモすぎて俺は失禁しそうです><
fstreamのバイナリモードで数メガのファイルを数バイトずつシークし読み取って変数に格納してるんですが、 なんだかHDに優しくないような気がしてきました。 もっと外道でないやり方はありますか?
>>392 シークする必要はどうしてあるの?どういう格納方法になってるんだ?
環境依存だがデカいファイルの読み書きにはmemory mapped fileを使うべし。
>>392 std::getline()でstd::stringにファイルを一括して読み込み、それを元に
std::stringstreamを作成し、そこから変数を読み取る。
シークの部分はstd::stringstreamではseekpとseekgの意味が異なるので
移植に注意。
うわっやべえ ベンチマーク取って遊びたくなってきた。 どちらが速いのか?あーでもファイルはディスクキャッシュを無効に したりいろいろしないといけないので面倒だな。
398 :
デフォルトの名無しさん :2006/12/25(月) 02:59:35
extern "C" void register_callback(void* object, void (*callback)(void* object)); C で作ったライブラリにこんな関数あるんだけど、こいつにクラスの インスタンスを食わせたいとき、 class C { public: void foo() { register_callback(this, callback); } private: static void callback(void* this_); }; こんなふうに書いてたんだ。コンパイルも通るし、動作にも問題ない。 でも実は extern "C" の中にある関数の型と C++ で普通に宣言した 関数じゃ型が違うらしいんだ。つまり register_callback() に渡す 関数は extern "C" で宣言しないとダメってことね。 それじゃぁってことで、 extern "C" void callback(void* this_); class C { public: void foo() { register_callback(this, callback); } private: friend void callback(void* this_); }; としたんだけど、これだと callback() が外部シンボルになってしまう。 じゃぁ static つければ内部リンケージになるだろうと思ったけど、 static extern "C" void callback(void* this_); はコンパイル通らなかった。 どうすればいいと思う?
>
>>398 extern "C" の関数にthisポインタを渡さないようにする。これで解決。
コンパイルもとおって動作に問題もなくて 何がダメだったのかが分からない
extern "C"の意味を理解してないのがダメ。 C++側で、Cの流儀に合わせる願望がダメ。
extern "C" の関数を別につくり、クラスへのアクセスはそこ経由のみ、とか
>>400 規格の 7.5p1 より
"Two function types with different language linkages are distinct types even if they are otherwise identical."
ということで C++ language linkage を持つ C のメンバ関数 callback() は
C language linkage を持つ register_callback() の引数 callback とは型が違うことになる。
型が違えばエラーになるはずなんだが、コンパイルが通る。ってことは
暗黙の変換か何か行われるのかと思うけど、規格にそんな記述は無い。
型を合わせるために extern "C" をつければいい(
>>402 の方法ね)んだけど、
そうすると外部リンケージを持つことになるんで名前付けが面倒。そもそも
別のソースから呼び出したいわけじゃない。
Linkage from C++ to objects defined in other languages and to objects defined in C++ from other languages is implementation-defined and language-dependent. Only where the object layout strategies of two language implementations are similar enough can such linkage be archived.
>>405 それとは違うでしょ。
同じ名前使ってるんじゃなくて、
リンケージの違うものを渡して型は大丈夫なのかって話だから。
大丈夫でしょ。
callbackにstatic修飾は必要なの?
>>406 extern "C" と extern "C++" で関数の型を区別するかどうかってことで、
関連はあるだろう。
static つけないとプログラム全体で完全にユニークな名前をつける必要が
あるんで、面倒になる。
static付けると void (C::*)(void*) ではなくて、 void (*)(void*) と見做されているみたいだが。> g++
>>408 当たり前だろwwwwボケはすっこんでろwwwwwwww
410は初めて知ったようだ
どうみてもC++の基礎知識の欠如です 本当にメリークリスマスでした
初歩的な質問で恐縮ですが教えてください。 int n=10; int & nRef = n; 上記のような宣言が行われているとして、あるタイミングで 変数nRefに別の参照を設定したいのですが、 int i=8; nRef = i; としてみても変わらず変数nを参照してしまいます。 どうしたらよいのでしょうか?
ポインタにする。
ポインタを使えばいいという理由で、参照先は後から変えられない。
417 :
413 :2006/12/25(月) 18:17:13
>>415-416 レスどうもです。
ポインタですか・・・。まだあまりポインタ理解できていないので
使いたくはなかったのですが、これもいい機会だと思って勉強します。
ありがとうございました。
ポインタが理解できないうちは参照使わない方が良いよ
419 :
414 :2006/12/25(月) 18:18:34
間違えました。>417は私です。
つーか、参照先を変えたい理由如何によってはポインタ云々以前かも試練。
こういうのってOKなの? #define WORKPATH "c:\\temp\\aaa" const string g_WORKPATH = WORKPATH;
何か懸念でも?
>>421 なぜそんなことをしたいのかわからないが、問題ないと思う。
もしかしたらCからの移行かもな・・・
クラスのprivateメンバが例え一つしかなくても Pimplイディオムを使う意義はありますか?
427 :
デフォルトの名無しさん :2006/12/26(火) 08:37:42
変数名が置き換わらないのかなと思って
429 :
426 :2006/12/26(火) 09:17:09
レスdです 気にせず常にPimpl使おうと思います
常に…?
いや、使えそうな場面では常に、ですorz 今まではprivateなメンバが一つの時とかはどうしようか迷ってたんで
二つに増えるかも知れないから、Pimplを使うと考えろ ゼロになるかも(ry
いろんなスレッドから参照されるクラス(インスタンス) に適用できるデザインパターンて何かな まあ、普通に全メソッドにクリティカルセクションかけりゃいいけど なんかいいの無いかな
Immutable, Read write lockとか? つかそんなんじゃワカラン
>>434 ありがトンございます
ともあれデザパタ本買います
C++ マルチスレッド関連のデザパタ本無いですか? アマゾンで検索したのですがJAVAしか出てきません
Javaは言語規格にスレッドがあるからな 素直にJava勉強してその本読んだ方が良いかと
ACE本はフレームワークの存在が前提だし デザパタを前面に押し出しているわけじゃないし POSAの第2巻とか?あれはC++に限ってないけれど あとはJavaな本をC++の言葉に噛み砕いて読むくらいかな 437に書かれているような言語機能の違いからC++特有の苦労が必要になるけれど
>>437 ,438
そうですね。とりあえず基本的なクラスの設計は
Javaと共通の部分があると思うのでJava本買おうと思います。
レスありがとうございました。
質問です #defineにとっての#undefに相当することを usingに対してやりたいんだけど、 namespaceを一個作成してその中でusingするしかないんでしょうか
{ using ...; }
サブルーチンの中にサブルーチンを書くのはどうでしょうか? というのも指導教官に「それはよくない。美しくない」と指摘されたのですが、 実用性を重視するなら、ありといえばありですよね? みなさんが直面された重要な困難があれば教えて欲しいです。
すいませんでした。初心者スレで聞いてきます。
>>444 案外C++な話題かも?
void foo(void)
{
struct local {
static void func(void) {
// do something
};
};
local::func();
local::func();
}
ある関数内でのみ可視な関数を使いたいときに便利。
>>444 別に美しくないとは思わない
その教官のセンスがおかしいだけ
lambdaを否定された気がする
453 :
デフォルトの名無しさん :2006/12/29(金) 17:19:04
質問です。 C++で、ファイルの内容を一度にstd::stringに読み込む方法は ないでしょうか? いろいろ調べてみたのですが、std::getline()では改行文字まで しか読み取らないし、他にはread()で何バイトかずつ読み込んで stringに足すか、get()で一文字ずつ読み込んで足す、位の方法 しか思いつきません。 rdbuf()を使ってstd::stringstreamに読み込もうとしたら、fstreamとは 違ってコンストラクタがないんですね。
std::string str; std::ifstream fin; std::copy(std::istreambuf_iterator<char>(fin),std::istreambuf_iterator<char>(),std::inserter(str,str.begin()));
>>454 ありがとうございます。これならスマートになりますね。
速度的には1文字ずつ読んでいるのであまり変化ないかもしれませんが、
一行で書けるという点が魅力です。
istreambuf_iteratorを使うという所が私には盲点でした。
さっそく使わせていただきます!
std::ifstream file; std::istreambuf_iterator<char> first(file); std::istreambuf_iterator<char> last; std::string fileData(first, last);
1行で書きたいのなら
std::string fileData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
しかし分かりにくいので
>>456 のように書いた方がよい
>>455-456 のやり方は
>>454 のように1文字ずつの代入ではなく初期化なので効率は少しはマシになるはず
>>455-457 度々ありがとうございます。
私も書いてみました。これでも行けるようです。
s.insert(s.begin(), std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
>>457 あと、stringのコンストラクタにistreambuf_iteratorを取る形式ですと、
遅延評価を行っているのかよくわかりませんが、私の環境では直後の
std::istringstream strstr(s);
で "istreambuf_iterator *を取るコンストラクタが見つからない"という
エラーが出てしまいます。ちょっと謎です。
環境はBCC5.8.2、Dinkumwareです。
コンストラクタやinsertを使わずにinserter使う奴大杉
世間に?職場に?
>458 文字列が空の場合この方がよいと思う。 (空で無い場合意味が異なる) s.assign(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
>>462 それはコンパイルエラーになりました。
C++標準ライブラリという本にも、assignメンバ関数にはイテレータを
取る形式は書いてありませんでした。
空なんだったらassignなどせずに初期化した方が良かろう
>>464 >>459 でも書いたように、コンストラクタにイテレータを使う形式ですと、
そのstringでistringstreamを構築するとエラーが出てしまうので、
今回は使えないのです。
>463 そんな本とコンパイラなんて窓から投げ捨ててしまえ。
>>459 なんかそれ変だな
以下のソースでどんなコンパイルエラーが出る?
#include <fstream>
#include <iterator>
#include <string>
#include <sstream>
using namespace std;
int main () {
ifstream ifs ("hoge");
string s ((istreambuf_iterator <char> (ifs)), istreambuf_iterator <char> ());
istringstream strstr (s);
return 0;
}
Effective STLでいうところの「C++で最も奇妙な解析」が絡んでるな、この会話。 なんか一言あったほうがいいかもしれないけど、説明が面倒だな。
>>468 いえ、これは通りました。
どうもstringを定義している位置で出たり出なかったりするようです。
間違いなくコンパイラのバグだと思います。
>>469 その本持ってます。確か「関数と見なせるものは関数とみなす」
という意味で、防止法は、括弧で囲む事でしたね。それでちょっと
試してみます。
>>469 済みません、本当にありがとうございました。
Effective STLの第6項、P32そのままの問題でした。
コンパイラのバグではありませんでした。
本は読んでいましたが、実際に遭遇したのは初めてです。
覚えておきます。
だから
>>456 のように書いた方が良いわけだ・・・・
474 :
469 :2006/12/29(金) 20:28:40
>>474 実は
>>457 の第一パラメータに括弧が付いているのを見落として
いたんです。申し訳ありません。
実際にこれに引っ掛かってるのを初めて見た
真の通過儀礼か。
ここでC++糞と思うかC++面白いと思うかが今後を分ける かも。
Effective STL持ってないんだけど、どういう問題なのかサラっとでいいから教えてくれないかな。
>>479 string s(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>());
が s という名前の関数宣言と見なされてしまうという問題で、これを
回避するために
string s((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
これで ifs のファイル内容で初期化された string型の変数 s が出来る。
string s(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>()); が何で関数宣言にみなされるの?
>>481 string s(istreambuf_iterator<char> ifs, istreambuf_iterator<char>);
とみなされるから。これで分からなければ是非本を読んでね。
なんとなく予想してたので合ってたわ
sはstring型を返す関数で、引数を2つとる。 最初の引数はistreambuf_iterator<char>型で、名前はifs。 2番目の引数は、「引数をとらずistreambuf_iterator<char>型を返す関数」へのポインタ。 ・・・とコンパイラは解釈する。
>>484 あ、そうだった。
string s(istreambuf_iterator<char> ifs, istreambuf_iterator<char>());
こうですね。本を持っててもちゃんと読んでいないとこんなもんです。
あーくそ。C++ Primer Plus fifthを書店で見かけたと思ったら、 何と"C Primer Plus fifth"だった。まあ内容的にはC99の事も 取り上げられていていいのだが。 注文せんと入れてくれんかなぁ。
487 :
デフォルトの名無しさん :2007/01/01(月) 02:25:28
これって邪道すぎ? class mystrfnc{ std::string str; mystrfnc(const std::string &str):str(str){} public: friend mystrfnc operator--(const std::string &str,int i){return mystrfnc(str);} mystrfnc *operator--(int i){return this;} std::string func(){return "["+str+"]";} }; int main(){ std::string str="STRING"; std::cout<<str----->func()<<std::endl; return 0; } もちろん、個人で組んでる趣味のコードですが
>>487 何がしたいのかわからん。
邪道だと思うんならやめればいい。
個人だ趣味だと予防線を張るくらいなら好きにすればいい。
489 :
487 :2007/01/01(月) 03:10:54
>>488 本当にしたいこと:stringにsubstr系のメソッドを追加したい
std::stringを継承するのは大変そうなのでやりたくない
関数にするよりメソッドっぽくしたい(元のstringの部分が長いのでを()で囲みたくない)
こうゆう状況で、
「んなことするよりこうする方が見やすくてええやん」
「それはこうゆうときにこんなことがおこるから素直にこうしとけ!」
の様な意見あるかを聞きたいわけです
演算子を本来の意味意外に使うのはなんちゃってプログラミング専用。
>>487 何じゃこりゃ!新年早々気持ち悪いプログラムを見てしもた。
後置演算子として解釈されているのか。
((str.operator--(str, int)).operator--(int))->func() と読めばいいのか。
修行が足らんな。iocccの美しいコードたちを眺めて目を養うことだ
>>492 鍛えられるが養えない。
昔VAX11用のコードでスゲェ、キタコレーなのがあったなぁ(遠い目
int main() { return E--++----++----++------++------->result; } なぜか無限の可能性を感じずにはいられない。
brainf*ckかとオモタ
496 :
487 :2007/01/01(月) 05:15:09
追伸 mystrfnc *operator->(){return this;} で str--->func() に減らせたーー!
operator ->*のほうがスマートでは、と思ったが、いざやってみたらBoostが要るわ(TR1でもいいが)。 まあ趣味ならBoostも気兼ねなく使えるだろう。 #include <iostream> #include <string> #include <cassert> #include <boost/function.hpp> #include <boost/bind.hpp> std::string do_func(const std::string& str) {return "[" + str + "]";} enum func_type { func }; boost::function<std::string ()> operator->*(const std::string& str, func_type fn) { switch (fn) { case func: return boost::bind(do_func, str); default: assert(0); return boost::function<std::string ()>(); } } int main() { std::string str = "STRING"; std::cout << (str->*func)() << std::endl; }
どちらにしても呼び出し部分から意図が汲み取れない酷いコードにはちがいないね
>>489 > 本当にしたいこと:stringにsubstr系のメソッドを追加したい
std::string::substr() は既にあるわけだが。
500 :
487 :2007/01/01(月) 16:01:39
>>497 すごく面白そうですが、最終的に()で括ってるのが悲しいです。
boostよく知らないんでちょっとした修正で()外せたりするのかもしれませんが
>>499 本当にしたいこと:stringに元の文字列の部分文字列を返すメソッドを何種類か追加したい
こう言えば解ってもらえますかね
外部関数じゃ何か不満?
502 :
487 :2007/01/01(月) 16:31:54
>>501 関数だと
=func1(func2(func1(func1(str1))+func1(str2)));
こんな使い方をされる物を想定しているわけですよ
これを単純に左から右へ処理される順番に並べて読みやすくできないかという思惑です
>>502 もっと具体的な最終目的をちゃんと書いてくれると
それが最適なやり方かどうかも含めて議論できるんだが
Win32APIのプログラムを練習していますCで書かれたプログラムで_stprintfというのが あるのですが、C++でコンパイルすると未定義の関数と表示されてしまいます(CならOK) C++で_stprintfに対応する関数は何になるのでしょうか教えてください。 コンパイラはbcc32です。
505 :
487 :2007/01/01(月) 20:06:50
>>503 ファイルのパスを管理したい。
↓
フルパスからファイルの親の親ディレクトリ部分のみを取り出したり
パスなしのファイル名から拡張子部分のみを取り替えたりとかしたい
↓
下手にパスを分解してクラスのメンバに入れたりとかするより、
stringそのままを切り貼りした方が扱いやすいんじゃないか
↓
切り貼りの貼りは+でいいとして
切りの部分はstringにメソッドを追加したいなー
↓
せめてメソッドっぽく見えればなー
こんな感じです
boost::filesystem
>>504 _stprintfはsprintfのtchar版
これでわからないなら最初にsprintfについて調べて動作を理解してから自分のコード読み直してみるといい。
508 :
!dama !omikuji 株価【35】 :2007/01/02(火) 10:15:15
>>500 ->*演算子は関数呼出の()演算子よりも優先順位が低いからどうしようもない。
>>501 そういうことなら、Oven Range Libraryなんてどうだろう。
ttp://p-stade.sourceforge.net/oven/ こいつは|演算子でパイプ処理のように書くことができるライブラリ。そしてstd::stringに限らず幅広いオブジェクトを対象にしている。
これを使わないとしても、|演算子で並べていくというアイデアは参考になると思う。
と、思ったんだけど、505なら506の言うとおりBoost.Filesystemを推すなあ。
>>504 <tchar.h>をインクルードしているか。
>>487 ライブラリとして使うつもりなら、
メンバ関数でなければいけない特別な理由がない限り、
メンバ関数にするのはやめたほうがいい。
(C++ Coding Standards 項目44)
名前が長いなら、参照を使えばいいわけで、メンバにする理由もないし。
template< typename StrT > inline StrT & remove_filespec( StrT & in ) {
in.substr( ... ).swap(in);
return in;
}
string & ref = remove_filespec( my_application_filepath );
C++のコードでstdio.hを使うと何か問題発生する?
NULLの代わりに0を使わないと、代入でエラーが出る事が あるんじゃなかったっけ。
515 :
487 :2007/01/04(木) 23:51:25
>>510 まぁ、邪道なのは百も承知しているのですが、
それでも
「本当のスパゲティコードを書いたことがなければ構造化のありがたみは解らない」
という自説の延長線上で
「意外に便利なものが見つかったらめっけもの」
という勢いですので、生暖かい目で見守ってやってください。
>>514 そうならないようC++のNULLは0と定義されている。
ぬるぽ
ガッ
throw;
でもNULLの代わりに0使っちゃダメだぜーフハハハ。
521 :
デフォルトの名無しさん :2007/01/09(火) 22:47:29
ADLには弊害があるそうなんですが、 どういう時によろしくない挙動を示すんでしょうか
ISDNと干渉する
ADSLかよwwww
Yahoo!BBはピンポン方式を一切考慮してなかったからISDNの干渉がひどかった。
C++は奥が深いな
527 :
デフォルトの名無しさん :2007/01/10(水) 23:20:31
【ネガティブ派遣根性チェック】 3つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。 □派遣先の社員の意見にはたとえ間違っていても反対しない □派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい □自社に仕事を持ち帰れるように言われるとムカつく □自社で仕事なんてできるわけがない □派遣/受託の差異を指摘する人間はムカつく □派遣先には仕事だけでなく自分のプライベートについても指示して欲しい □自分の月額金額を知らない □派遣先社員より自分の生涯収入が低いのは当然だ □派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ □今のプロジェクトが終わっても同じ派遣先に常駐したい
C++用のライブラリで、perlにおけるbioPerlのような分子生物学用ライブラリは ないでしょうか?コドンからアミノ酸変換、疎水性インデックスのような簡単な ものでいいのですが。
開発環境が整わない。 もうマジうぜー、javaの100倍うぜえわ コンパイルの仕方がわからん。リンクくらい貼っとけ
低脳
>>453 遅レスだが.
> rdbuf()を使ってstd::stringstreamに読み込もうとしたら、fstreamとは
> 違ってコンストラクタがないんですね。
ふつーに
std::stringstream ss;
ss << std::cin.rdbuf();
とかできんか?
>>528 boost ML にbio infomatics のやつは投稿されてたけど
>>532 std::istringstreamではなくてstd::stringstreamを使って
入出力両用にすればそれはできますね。
g++ 4.0.1 で↓がスルっと動くのは、仕様どおりで安全ってことですか? std::string s("abc"); s = s.substr(3); assert(s == "");
substr(size_type pos = 0, size_type n = npos) const; は、もしpos > size()ならout_of_rangeを投げるはず・・・。
endからendまでをコピーできるからいいんじゃないの
>もしpos > size()ならout_of_rangeを投げるはず・・・。 pos == sizeだから問題ないね。
お pos >= size()のときじゃないのか... > out_of_range
21.3.6.7 2 Throws: out_of_range if pos > size(). って書いてあるな。
541 :
535 :2007/01/13(土) 16:19:14
542 :
デフォルトの名無しさん :2007/01/14(日) 02:06:46
クラスの、privateな変数でも、外から読み書きができちゃうことはあるんですか? 例えばこんな感じで class Hoge { private: int num; } hoge; main() { int *i = reinterpret_cast<int *>(&hoge); *i = 123; }
そりゃー無理やりやれば、書き換えられるだろ。
鼻から悪魔が出てくる〜
#define private public
>543 そこまでして自分の足を撃たなくても…… reinterpret_castは実装依存だよ。
#define class struct
>>548 こうすれば確かにいちいち
#define private public
とかしなくてもOKだよな。目からウロコだぜ
デフォルトのアクセス指定が変わるだけで、
>>543 には無意味。
もっとも、キーワードを置き換えてる時点で鼻からスパゲッティだが
551 :
デフォルトの名無しさん :2007/01/15(月) 10:33:15
VC上で、他のプロジェクトでも使いまわせるような API的関数(それぞれが無関係な関数)を何個か作ってるんですけど、 こういうのって、やはり「API的関数群」のような名前のクラスを作って、 すべてをstaticなメンバ関数にするべきなのでしょうか? それとも、Cのようなグローバル関数群にしてしまうべきなのでしょうか?
>>551 まずAPIの意味調べような?
漏れは便利系メソッドは全部namespace utilityに突っ込んでる。
しかしほとんどの便利系メソッドはよく探せばWin32APIとか
使えるならboostとかにほとんど揃ってるんで
utility名前空間が膨れ上がる事はまずない。
554 :
デフォルトの名無しさん :2007/01/15(月) 11:07:33
>>552-553 即レスありがとうございます。
namespaceを使うということは、基本的には
「staticメンバ関数クラス」ではなく「グローバル関数群」のほうになるのですよね。
555 :
デフォルトの名無しさん :2007/01/15(月) 11:20:04
GNUリンカが「Undefined Symbols」になっているもので __Z11とか__M11とかが頭にあるものが出てくるのですが、 これはどんな種類のシンボルなのですか。
556 :
デフォルトの名無しさん :2007/01/15(月) 11:23:01
デバッグのやり方教えてクレー ソースを一行ずつ動くようなやつ visual c++ とかボーランドで出来る?
558 :
デフォルトの名無しさん :2007/01/15(月) 11:46:08
スレ違い
よく鼻からうんことか言ってる人がいますが、 なんか意味があるのでしょうか?
ウンコの力
>>554 まず名前空間の意味調べような?
>基本的には「staticメンバ関数クラス」ではなく「グローバル関数群」のほう
意味わからん。基本的って何や。基本でない場合どうなるんや。
しいて言うなら「utility関数群」。グローバル名前空間は汚染されない。
>554 ・classは閉じていてnamespaceは開いている ・classはアクセス制御できる という違いがあるから、そこを良く考えて選ぶと良いよ。
ちょっと教えてほしいのですが、数値計算の結果をfor構文の中でファイルに記述するようにしているのですが なんとなく実行速度が遅いような気がして、小耳に挟んだ話だと逐一HDDにアクセスしていることが起因しているそうなのですが、 計算結果を貯めておいて、最後に一度に書き出すにはどうすればいいのでしょうか? C++暦は1ヶ月程度ですが、参考サイト等教えていただければ幸いです。 どうかよろしくお願いいたします。
>>566 とりあえずファイルにどう出力しているか書いて。
最近はOSのライトバックキャッシュに埋まるんでないの?
>>566 std::ostreamやらstdioやらを使ってるんならライブラリでバッファリングされるし
それでなくとも今時のOSならOSレベルでバッファリングされる
実際に逐一ディスクI/Oが発生することは無いはずよ
>567 int _tmain(){ ofstream fout("data1.txt"); for(int c=0 ; c<100 ; c++){ fout<<c<<"回目です。"<<endl;} fout.close();} のような感じです。見やすさを考慮して実際の数値計算式は省いています。 >568 OSはXPProです。申し訳ありません、私にはわかりません。 >569 なるほど。だとすると私程度のレベルでは特に意識する必要はなさそうですね。 レスありがとうございます。
#include "stdafx.h" #include <math.h> #include <stdio.h> #include <fstream> #include <iostream> #include <complex> #using <mscorlib.dll> using namespace System; using namespace std; 書き忘れました。すいません。
endlは'\n'とかにすると多少変わるかもね
>>570 必要がなければcloseなんて自分で呼ぶ必要はないぞ。
デストラクタで勝手にcloseされる。
>572 早速試してみます。 >573 それは初耳でした。以降そのように記述します。 アドバイスありがとう。
endlってファイルストリームでもフラッシュするんだっけか だとしたら'\n'に変えて動作速くなる可能性は高そう
>>571 どーでもいいがなんだってmscorlib.dllなんて使ってるんだ
managed C++か?
そのコードなら別に.NET非依存で完全にnativeだから、そんなものは要らないぞ
endlを'\n'に変更してみましたが私の環境において短時間の計算では優位な差は確認できませんでした。 次は長時間の計算で比較してみたいと思います。 >576 C++の基本事項を参考にしたサイトが使用していたため、そのままコピペで使っていました。 省略しても問題なく動き、コンパイル時間が短縮できました。ありがとうございます。
逐次出力の処理速度とか細かいことはあまり気にしないほうがええで。 始めたばかりならC++の言語仕様やその他にも学ぶべき有意義なことが沢山あるはず。
>>566 そもそもファイルに書き込まないと速くなるのかね?
君のへちょい数値計算が遅い可能性は皆無?
>578 そうですね。仰るとおりです。一通り扱えるよう勉強します。 >579 すいませんが、わかりません。 もちろん私の書いたものが遅い可能性もあります。 みなさんありがとうございました。これほど親身になってアドバイスいただけるとは思っても見ませんでした。 私の知識不足もあり、質問には答えられないところもありましたがどうか容赦下さい。 当面は幅広くC++を学んでいきたいと思います。また機会がありましたらよろしくお願いいたします。
そもそもiostreamが重いという話がある。
まぁ、性能を云々するんなら、脳内だけで想像せずに プロファイルを取るべきだな
初めて1ヶ月ぐらいならば、 まだ他に学ぶべきことがいっぱいあるだろうから気にすることも無いと思うけどね。
なにこのループするバッファ
>>580 >すいませんが、わかりません。
えええ… ファイルの書き込みしてる部分コメントアウトすればいいじゃない…
std::stringstream ss にまとめて出力しておき、最後に fout << ss.rdbuf(); すると少しは速くなるかもしれない。 実験してないけど。
あ、foutはバイナリで開いておいてね。
>585 あぁそういう意味でしたか。よくわかっていませんでした。確かにそれで差を見るのが一番根本的だなと 気がつきました。夜は電力来ないのでまた明日詳しく試してみます。ありがとう。 ファイルに記述するにしてもいろいろな方法があるのだなとただただ驚くばかりです。 ただ、折角英知を頂いても私があまり理解できないのが残念です。 頂いたコメントは全て保存しておき後日理解が深まってから再度確認させていただきます。 皆様ありがとうございました。
>>588 やってみな。
#include <iostream>
#include <fstream>
#include <sstream>
#include <windows.h>
int main()
{
std::stringstream ss;
const int N = 100000;
DWORD d;
std::ofstream ofs("1.txt");
d = timeGetTime();
for (int i = 0; i < N; i++)
ofs << i << "回目です。" << std::endl;
std::cout << (timeGetTime() - d) << "ms." << std::endl;
ofs.close();
ofs.open("2.txt", std::ios::out | std::ios::binary);
d = timeGetTime();
for (int i = 0; i < N; i++)
ss << i << "回目です。" << std::endl;
ofs << ss.rdbuf();
std::cout << (timeGetTime() - d) << "ms." << std::endl;
}
>>588 おっとっと。バイナリモードで開くと、0x0d0aにならずに0x0aにしか
ならないのでテキストモードで開く必要があるな。
#include <iostream>
#include <fstream>
#include <sstream>
#include <windows.h>
int main()
{
std::stringstream ss;
const int N = 100000;
DWORD d;
std::ofstream ofs("1.txt");
d = timeGetTime();
for (int i = 0; i < N; i++)
ofs << i << "回目です。" << std::endl;
std::cout << (timeGetTime() - d) << "ms." << std::endl;
ofs.close();
ofs.open("2.txt");
d = timeGetTime();
for (int i = 0; i < N; i++)
ss << i << "回目です。" << std::endl;
ofs << ss.rdbuf();
std::cout << (timeGetTime() - d) << "ms." << std::endl;
}
592 :
デフォルトの名無しさん :2007/01/18(木) 07:02:21
namespace impl namespace detail ってどう使い分けるのが普通なのでしょうか?
Koenig Lookupに気を付ければどのように使ってもよい。
有名な joke だね。本人もいたくお気に入りらしいぜ。
ほげ ふが もげ ぱも むも ぴよよ こんな感じでインデントされたテキストを インデントごとに構造体に読み込みたいんですが さっぱりわかりません struct text{ char* str;//行のデータ text* childs;//自分よりも一つだけインデントされているデータ }; 読み込みは while(ifs.getline(buf,_MAX_PATH)){} みたいなループなのに、データ構造は再帰的なので もしかしてスタックとか使わないといけないんでしょうか 何か方針でもいいので教えていただけませんか お願いします
自分と同じ深さのやつは?
>>599 どう見てもツリーになるんだから、その構造ではダメだろ、考え直せ
.注.:.私.の.有.意.義.な.発.言.に.対.し.、.自.分.の.理.解.不.足.を.棚.に.上.げ.煽.り.、.1.行.レ.ス .で.返.す.方.が.多.い.よ.う.で.す.が.、.そ.の.よ.う.な.方.は.ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く .ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い.の.で.お.黙.り.下.さ.い.。 .ま.た.質.問.者.は.回.答.者.に.知.識.を.披.露.す.る.場.を.与.え.る.貴.重.な.存.在.な.の.で.、 .質.問.者.を.見.下.し.た.回.答.、.あ.ま.り.に.も.儀.礼.を.欠.い.た.回.答.も.厳.重.に.禁.止.い.た.し.ま.す.。 .忙.し.い.中.、.少.な.い.時.間.の.合.間.を.縫.っ.て.質.問.し.に.来.て.る.わ.け.で.す.の.で.、 .そ.の.辺.ご.承.知.下.さ.い.。.な.お.、.当.方.が.質.問.に.対.し.て.有.意.義.な.答.え.で.あ.る.と .判.断.し.た.方.に.は.評.価.い.た.し.ま.す.の.で.各.自.よ.く.調.べ.、.よ.く.考.え.正.確.な.回.答.を.す.る.よ.う.に.。
>ス.レ.の.皆.様.を.混.乱.さ.せ.る.だ.け.で.な.く
>.ス.レ.の.雰.囲.気.を.崩.し.か.ね.な.い
>>603 まさにお前のことだなw
どう見てもツリ
606 :
デフォルトの名無しさん :2007/01/21(日) 16:28:10
どうみてもツリー
603 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
C++ 5.5.1なんですが ファイルの途中の行を編集する関数ってありますか? 例えば10行あるうちの3行目だけを置換できるもの やっぱり入力ファイルを読みながら出力ファイルに書き込むしか 方法はないんですか? 教えて下さい
>>609 C++ 5.5.1 ってなんだ?
とりあえず答えは、全部書くしかない。10行のテキストぐらいならまったく問題ないだろう。
>>609 1行ずつリストに突っ込んで3行目のを消して別の突っ込めば
>>609 です
レスどうもです
残念ですが頭からやります
環境依存だけどメモリマップトファイル使えば出来るんじゃないかな。
グローバルなinline関数を作りました。 (.hに定義して、.cppで処理を書いてます). この関数が定義された、同じソースファイル内では使えますが、 他のファイルで使うと、コンパイルは成功しますが、リンクに失敗します(外部参照が未解決 inlineを使わないと成功します。 inlineを使った場合、同じソース内のみで使用可能ということですか? それとも、定義等の仕方が悪いのでしょうか。
.h de teigi
>>615 ヘッダに関数の処理がないとだめですお。
ヘッダに関数定義するのってなんか嫌くね?
>>618 そう思うんなら inline にしなければいい。
別に
>>615 ファイル間最適化能力のあるコンパイラを使え。
#詳細は該当スレにて。
例外処理のコーディングしてるんだけど、 C++だと例外クラスとか作ったりするのが一般的なのかな?
>>622 はい。 std::exception を継承して作ってください。
よくある例外は標準ヘッダ stdexcept で定義されていますので、
そちらを使われるのがよいかもしれません。
stlのを継承するってのは、 stlからの例外も一緒に取得で便利ってことですか?
>>624 大本のところで全ての例外をcatchしたようなとき、
どんな例外が投げられるかわかっていないと、
例外が投げられたかとしか情報が得られないけど、
std::exceptionから派生していれば何がしかのメッセージは得られるから。
つまり、
>>622 の作ったライブラリを使う人にとって都合がいいから。
ふぅん。ありがトン!
std::exceptionの派生にすると、what()の実装に困るのがよくあるパターン。
せめてwchar_t*を返したくなる
629 :
デフォルトの名無しさん :2007/01/24(水) 21:59:18
std::exceptionを継承して、引数付きコンストラクタを作るのはOKですか?
可能ならstd::runtime_errorかstd::logic_errorから継承したほうが
柔軟性が増して良いと思う。
>>629 例外発生時に別の例外を発生させ得ない操作だけを行うなら問題ない。
すごく勉強になりましたありがとうーー
マルチスレッドプログラムで、 どっかのスレッドで起きた例外を 別のスレッドで取得することってできるの? 例外が発生したスレッドを殺したいのだが。。。
>>632 できない。
スレッド関数の根っこで catch(...) して終了させとけばいいだけじゃないの?
>>633 やっぱりできないですか。
既にあるシステムで、スレッド関数たくさんあるから
そいつら全部に例外処理いれんの面倒だなーーーーとか
思ってたんで的外れとは思いましたけど質問させていただきました。
>>634 スレッドの起動に使ってる関数を、最悪マクロで置き換えて、
実際に起動する関数は引数で渡された関数をラップするようにすれば
いいんじゃないか?
>>632 なんか今、えらい人たちがそれについて
いろいろ考えてるみたいだ。俺には分からんがな
>>635 それは頭良いですね。
ちょっとトリッキーだけど。。検討してみます
マクロって……やめとけよ 王道はスレッドをラップするクラスを作ることだろ ThreadとかRunnableとかさ
>>638 Windowsだと
thisポインタが問題にならない?
_beginthreadでクラスのメンバ関数呼べるんだっけ?
ってスレ違いかな
>>639 staticメンバ関数も知らないのか
C++を一から勉強しなおせよ
>>640 いや、staticメンバ関数は知ってるけど。
>>638 のいうThreadクラスを継承すんのかなと思ったから
Javaみたいに。
static thunk(void*ptr){ static_cast<Thread*>(ptr)->run(); } _beginthreadex( ...,thunk, static_cast<void*>(this),... ); 定石だぜ?
>>642 おおーーーすげーーーー
定石なのかー
何の本に載ってんの?
恥ずかしながら初めて見ました
今時スレッドラップしてるC++のライブラリなんて腐るほどあるんだから コード嫁よ
スレッドに限らずウィンドウプロシージャをラップするときにも使ったりするね
すげーー勉強になるなー ライブラリはあんま読んだことないけど 自分よりスキルある人が作ってんだから勉強になるだろうな 今度読んでみます
何のライブラリが参考になるかお母さんみたいに教えてくれ
それって、run()の中からメンバ変数にもアクセスできるのですか? ちょー便利そうなんだけど
不確かな知識でスレッド使ってどつぼにはまれ
>>648 C++ でスレッドやるときは大抵皆そういうことしてると思うんだけど。
Windows だったら各種のコールバック(lpParamとかとる奴)でも同じ
技法を使うことが多いと思う。
なるほど目から鱗です
僕は鱗がはがれました
必然的に思いつくようなパターンだと思うが
いいえ、ドライスキンです
わたしは鮫肌です
クラス内のスタティック関数を ポリモルフィズムしたいのですが どうすればいいですか?
static のかわりに virtual つけれ。
いえ、スタティック関数がいいのです
ポリモルするクラスAを作って、仮想関数内でstatic関数を呼ぶ
ええーー
CRTPとかシングルトンパターンの応用とかどうだろう。
自分のクラスのスタティックメソッドへのポインタを返す仮想関数を作るとか?
ポリモルって何かかわいい
魔法少女ポリモル
ポリモルフィズム ポ ピ パ
マジカルクラス インヘリット!
使い魔「スタチック=キャスト」
猫でもわかるCを読み終わり、 C++についてや、中級者向けの踏み込んだ知識が欲しいと思ってます。 レビューなどを調べまわった結果、EffectiveC++がいいかなと思っているのですが よろしければ助言を頂けないでしょうか
>>670 とりあえず「憂鬱なプログラマのためのオブジェクト指向開発講座」でも読んどけ。
つか、Effective C++はある程度C++知ってる人間が読まんと意味ない本だぞ。
>>671 遅レスすみません
先にオブジェクト指向勉強しないと駄目なんですね
それを読んだ後に独習C++を読んでみることにします
ありがとうございます<(_ _)>
あと書けよ。ひたすら書け。絵と同じだ。 デッサンした数が実力にモロに影響する。
ありがとうございます。 ではさっそく裸体をデッサンしてみます。
うはwテラマングりんぐww ごめん言ってみたかっただけ
魔法少女C++ ポリモル 横山智佐 インヘリット 丹下桜 コンスト 折笠愛 ハゲ 若本規夫
声優の選び方が渋いってか、一世代古いな。 双子キャラのバインド・ファースト、バインド・セカンドは田中理恵で。
キャラクター紹介 ポリモル OOの国から偽装派遣されてきた魔法少女。 OO厨を増やそうと悪事に励むが失敗ばかり。 インヘリット 真のOOの継承者。 OOの国とは敵対関係にありながら ポリモルを改心させようとOOの真実を説く。 コンスト OOの国の創造主。 崩壊の進むOOの国を救うため 指揮命令系統を無視してOO厨の獲得をポリモルに命じる。
お騒がせロリキャラのミュータブル(愛称は"みゅー")もな
この番組は 株式会社すとらうすとらっぷ の提供でお送りします。
第1話 ポリモル大地に立つ
おまえら二次裏あたりでやれ。
同意。
使い魔 スタチック=キャスト 厳格でお節介な禿キャラ リ・インタープリット=キャスト 乱暴者でトラブルメイカーな禿キャラ コンスト=キャスト 殺意の波動に目覚めた禿キャラ ダイナミック=キャスト 物知りな禿キャラ
ポリモルするポインタをvectorに格納すると不具合が起きますか? shared_ptrを使うか迷っているのですが。
お前が心配しているようなことはデストラクタが仮想関数になっていれば問題ない。 でも、例外安全を考えるとstd::vector<boost::shared_ptr<> >か、boost::ptr_vector<>がお勧め。
>>687 C++ Coding Standardsという本にshared_ptrが良いと書いてあったものでお聞きしました。
何の不具合がおきるかは書いていなかったのですが。
boostにしてみます
protected 非仮想ってどういうこと? 継承したクラスから呼べないんじゃリークするじゃん?? ポリモルタン教えて?
すみません。基本クラスのデストラクタの話です。
継承したクラスから呼べないってのは、どういうことだ?
アップキャストして使うな、ってことだろ。
デストラクタを仮想関数にする理由は、主に派生クラスのオブジェクトを基底クラスのポインタを通じてdeleteされる場合のため。 protected/private継承にしておけば、基底クラスへの変換は封じられるので問題ない。
デストラクタをprivate仮想にするのは分かりますが、 どんなときにprotected非仮想にするのか分かりません。 使い方も分からない。
たとえば、unary_functionそのものとか?
忘れてください
>695 protected: 継承することが前提 非仮想: 多態して使わない。仮想テーブルを使用しない。 と言う事で、protected非仮想destructorは そのクラスから派生して使用する(基本クラスにする)けれども、 そのクラスのポインタとしては(多態的には)deleteしない つうことですな。 さらに言うと、仮想関数を使用しない場合は仮想関数テーブルをまったく使用しないため インスタンスのサイズがコンパクト&メソッドが高速というメリットもありんす
別に言語仕様上そんなこともできるとだけ思っておいてもいいと思うよ。 俺もprotected非仮想なデストラクタを持つクラスなんて、 作ったこともないし見たこともない(と思っているだけで気付いていないだけかもしれないが)。
>699 確かにポリシー的な使い方がほとんどですな。 使う時はprotected非仮想コンストラクタとセットかな。
スマートポインタとペアで使えばいいんじゃないの? protected非仮想デストラクタなインスタンス。
>>698 基本クラスから継承させるけど、
Base* b=new Derived();
じゃなくて、
Derived* d=new Derived();
って使えということですか。なるほど。ややこしいですね
>>701 意味がよく分かりません....
>702 いや、それはOK……というよりもそうしなきゃ基本クラス使う意味無いじゃない。 Base* b=new Derived(); delete b; がNGなだけ。
>>703 レスありがとうございます
となると、bはどうやって解放したらよいのですか?
単純にいけるのかなーと思ってstatic_cast<Derived*>してみたけど規格としてもOK? まあ俺はそういうクラスに触る機会ないからわかんないけど
>>706 =707さん
ありがとうございました。よく分かりました。
shared_ptr deleterのテンプレートの使い方にびびりました
すごい
int **a[100][100]; この宣言があってるのか、疑問なんですが、 4次元配列を動的に確保したのですが、どうしたらいいのかわかりません。 どうしたらいいのでしょうか? 言語はC++です。
(int**)つまりint型のポインタのポインタが10000個。 ・a[num]もしくはa[num][num]が指すのは(int**)型。 ・*a[num]が指すのは(int*)型。 ・**a[num]はint型。
偉そうな事書いてみたけど実はそんなに詳しくなかったり。 int ****a,i; const static int _0=20, _1=50, _2=90, _3=12; a=new int***[_0]; for(i=0;i<_0;++i){ *a=new int**[_1]; } for(i=0;i<_1;++i){ **a=new int*[_2]; } for(i=0;i<_2;++i){ ***a=new int[_3]; }
>>710 >> 711
ありがとうございます!わかりました〜
もはやCじゃん
?
もはやCoremadekaじゃん
そして712はメモリリークに悩まされるのであった...
普通にvector使えばいいんじゃない? >709 vector<vector<vector<vector<int> > > > サイズはresizeで確保するのが簡単ですな。
Cをちゃんとやれと勧めるべきか、 Cは忘れてC++やれと勧めるべきか…。
722 :
デフォルトの名無しさん :2007/01/27(土) 15:03:28
こんな感じ? 再帰を使えばもっときれいになるのか? #include <iostream> using namespace std; int main() { int n1=5,n2=10,n3=15,n4=20; int v=0; int**** a; a=new int***[n1]; for(int i=0;i<n1;i++){ a[i]=new int**[n2]; for(int j=0;j<n2;j++){ a[i][j]=new int*[n3]; for(int k=0;k<n3;k++){ a[i][j][k]=new int[n4]; for(int l=0;l<n4;l++){ a[i][j][k][l]=v++; } } } } return 0; }
PHPの超便利配列(?)をするにはどうしたらよいですか? こんなの a['takahashi'][id]=n a['takahashi'][age]=50
C++からphp.exeを呼ぶことにしました
あ、ありえん
728 :
wankuma :2007/01/27(土) 15:35:58
729 :
ららら :2007/01/27(土) 17:28:50
メンバ関数ポインタのオーバーロードを解決するには、 どうしたらいいでしょうねぇ。 SomeClass some; MethodCaller<SomeClass>::Class(some, &SomeClass::Func); SomeClass::Func がオーバーロードされている場合、 コンパイルエラーになってしまうんです。
730 :
ららら :2007/01/27(土) 17:30:19
>>729 ごめんなさい。関数名が分かりにくいので訂正。
× MethodCaller<SomeClass>::Class(some, &SomeClass::Func);
○ MethodCaller<SomeClass>::Call(some, &SomeClass::Func);
これって何するものですか?
明示的にキャストするとか
733 :
ららら :2007/01/27(土) 18:11:07
>>731 た・と・え・ば、の話。
役に立つコードかどうかは別の話ということで。
オーバーライドした子クラスの関数から、同名の親クラスの関数を呼ぶには、 void ChildClass::Method() { this->ParentClass::Method(); } ですか?
>>734 ParentClass::Method()
inherited::Method()とか書けたら良かったのに
736 :
デフォルトの名無しさん :2007/01/27(土) 18:24:44
737 :
ららら、むじんくん♪ :2007/01/27(土) 18:25:57
偉そうな奴だな
会話が飛んでる? とおもったらコテかよ
740 :
デフォルトの名無しさん :2007/01/27(土) 20:22:32
コーディングの暗黙の了解的な事に関して質問です。 単なるデータ構造を定義する場合は構造体を用いると思いますが、 構造体内に簡単なデータチェックやユーティリティー関数を定義する場合、クラスとするべきなのでしょうか? 例えば、 struct Date { int nMonth; SetMonth( int nParamMonth ) { if ( nParamMonth < 0 || nParamMonth > 12 ) { nMonth = DEFAULT_MONTH; } else { nMonth = nParamMonth; } }; int nDay; //以下略。。。 }; みたいな場合は、クラスと「すべき」なんでしょうか。
会社なりプロジェクトなりでコーディングスタンダードがあれば別だが、 基本的には好きにしろボケの一言。 メンバ変数が0でoperator()しかないファンクタの類をstructにするとか普通だし。
あくまでもデータ構造に主眼がおかれているのであれば 構造体で良いのではないだろうか。
>>741 それはいちいちpublic書きたく無いからじゃないかね>ファンクタ
ありがとうございます。 好きにさせて頂きます。
結論が出ちゃった後だが 俺もclass+publicとstructが同じって概念があれば構わないと思う。 だからインタフェースをstructで定義するもありだと思ってる。
漏れは、内部を隠蔽するものをclassに、全部公開するものをstructにしている。
template<class T, class U = typename remove_const<T>::type> struct hoge { }; つまり one keyword, one functionalityということだ まあ正直どうでもいいと思う
748 :
デフォルトの名無しさん :2007/01/27(土) 21:56:40
新これならわかるC++挫折しないプログラミング入門というのを見ながら #include <iostream> int main() { std::cout << "Hello!" << std::endl; } ていうのを書いてあるとおりにしたらエラーなんですけど何が違うのでしょうか? いきなり挫折しそうです(汗)
エラーの中身を書かない人には(掲示板を使うのは)難しい
750 :
デフォルトの名無しさん :2007/01/27(土) 22:21:23
エラー E2209 hello.cpp 1:インクルードファイル'iostream'をオープンできない エラー E2290 hello.cpp 7:型限定子'std'がクラス名または名前空間ではない(関数 main()) エラー E2379 hello.cpp 7:ステートメントにセミコロン(;)がない(関数 main()) これが中身なんですけど・・・
>インクルードファイル'iostream'をオープンできない が全ての原因。 開発環境が絡んでくるので環境依存スレへ
753 :
デフォルトの名無しさん :2007/01/27(土) 22:33:10
環境依存スレとは何ですか?
#include <ostream> がないな。 いや、出ているエラーの原因とは関係ないが。
756 :
デフォルトの名無しさん :2007/01/27(土) 23:04:29
754>紹介ありがとうございます。 755> 'bcc32hello.cpp'は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されてません。 ・・・というのがきました
bcc 使ってるんであれば それ用の入門者用ページを最初から100回ぐらい見直した方がいいよ。
まさかとは思うが、 bcc32 と hello.cpp の間にスペースを入れてないとか?
>>735 多重継承したときどうするかということ、そして何より自分でtypedefすればすむ(言語仕様に手を加えずにすむ)ということで、
そのような機能は入れなかったとD&Eには書いてある。
>>759 VC++には、__superなる独自仕様があるんだよな。
しかし、個人的にはいらない。明示的にベースクラスを修飾するほうが分かりやすい。
曖昧にもならないし。
MSのVC開発チームもなぜこんな仕様を盛り込んだのか。
__int64って普通に使ってもおk?
>>762 適当な名前にtypedefしてからならOK
>>762 VC++ 7.1 (.NET 2003)以降ならlong longが使える。
その他のコンパイラで、Boostが嫌なら、<windows.h>のLONGLONGもしくはINT64がある。
クラスにoperator()(operator+()などではない)定義って具体的にどういうことができるの?
C++ってあそこまで難しくややこしくある必要性ってなんですか?
>>768 実行時コストを最小にして高レベルプログラミングを実現する目的があったからです。
>>766 関数と同じことが出来る。
ただコールバックとして呼び出すような場合
関数ポインタを渡すのと違いインライン化できるので
関数呼び出しのオーバーヘッドが無くて高速化できる。
典型的な例がqsortとstd::sortの違い。
あとは関数内にインナー関数のように定義できるとかそんなところか。
>>768 Cとの互換性をできるだけ確保する必要があったということも多分あると思う。
wchar_t の_tってどんな意味ですか?
>>772 禿に聞いてくれ。
といっても、ワイド文字あたりの仕様を考えたのは、禿じゃないだろうけど。
たしか禿も、7bit文字圏の人だし。
Wide Character Typeってところじゃないの。せいぜい。
禿って誰ジャーーー??
_を入力するのがめんどい
確かにめんどい
#typedef wchar_t wt
Cの伝統的な習慣に typedef された型に _t と付けるというものがあり Cで wchar_t は確かにtypedefed typeだったが C++では予約語になった という歴史的経緯
いらねーよw
いるのに(´・ω・`)
いれるぞ、うっ
30分も経たないうちに死んでしまったのか...。
↓こういう関数は定義できませんよね。 foo( const Bar & object, int arg = object.Something() ); できたらいいなあと思うんですが。
>>789 T foo( const Bar & object, int arg );
inline T foo( const Bar & object ) { return foo(object, object.Something()); }
オーバーロードしたら終わりですやん。
>>790 すみません。忘れていました。
>>791 ありがとうございます。
でもデフォルト引数が増えていくと定義も増えるので
それで少し面倒かなと思いまして。
T foo( const Bar & object, int arg1 = object.get1(), int arg2 = object.get2(), int arg3 = (以下略
面倒がらずに書いていきたいと思っております…。
794 :
デフォルトの名無しさん :2007/01/28(日) 17:07:14
クラスの継承について質問させていただきます。 [問題] class A { a; aa; }; class B { b; bb; }; class B1 : public B{}; class B2 : public B{}; class B3 : public B{}; ... ここで、A, B, B1, B2, B3,...のメンバ a, aa, B1.b, B1.bb, B2.b, B2.bb,... を全て継承しているクラスSumを定義したい。 このとき、Sumはどのように書けばよいのでしょうか? 非常に低次元な内容で申し訳ありません。
設計見直して振る舞い分けた方がよくないか?
すまん795は793宛
>>794 class Sum : public A, B1, B2, B3 {}; でいいかな?
>>795 そうですね、一つにまとめる振る舞いは良くないかもしれません…。
設計も見直してみたいと思います。
>>797 仮想継承しないと曖昧エラーが出るような希ガス
>>797 その場合、Sumのインスタンスに対して、例えばB1.bとB2.bを区別するにはどうすればいいですか?
Sum obj;
Sum.B1.b
などではうまくいかないようですが
>>799 詳しく教えてくれませんか?
Sumで b と bb を使おうとすると曖昧ですって言われるね。
書き忘れましたが、794=800です。
あと、細かいことですが
>>800 は
Sum obj;
obj.B1.b;
でした。どっちにせよあてずっぽうで書いたものなのでどうでもよいですが。
>>800 class B1 : virtual public B {}
........
のように書けば、Bの実体は一つに絞られ曖昧エラーは出ない。
また、仮想継承を使いたくない時は
Sum::B1::b のように限定すれば、B1、B2、B3毎にBの実体が
作られているので、曖昧を回避する事ができる。
sum.B1::b
菱形継承コワイコワイ
あと当然だが、class Sum ではデフォルトがprivateになって いるため、 public: using B::b; などとしてpublicに引っ張り出さないと、クラス外からアクセス できない。
おっとっとごめん class Sum : public A, public B1, public B2, public B3 とやれば using は不要だわな それにしてもこの多重継承のパズルはいつ見ても嫌だ
class B { int b; }; class C : public B {}; class D : public B, public C {}; とやってしまうと、Dの基底クラスBに曖昧さなしでアクセスする 事は不可能になってしまうね。大抵のコンパイラでは警告が 出るようだけど。
809 :
794 :2007/01/28(日) 18:24:39
お教えいただいたことを自分なりに解釈して、次のようなコードを書くことで B1.bをメンバとして持つクラスSumを定義し、かつB1.bにSumのメンバ関数からアクセスできるようになりました。 (get、set関数はソース省略、コンパイルして動作確認済み) これを基本形としてコードを書いてゆくことに、特に問題はなさそうでしょうか? class A { a; public: get_a(); set_a(); }; class B { b; public: get_b(); set_b(); }; class B1 : public B{}; class B2 : public B{}; ... class Sum : public A, public B1, public B2,...{}; obj.B1::set_b(); obj.B1::get_b();
810 :
794 :2007/01/28(日) 18:26:39
>>806 obj.B1::set_b();
のところで、
error C2247: 'B::b' はアクセスできません。'Sum' は 'private' で 'B1' からの継承で使われています。
とのエラーが出ます。
>>807 >それにしてもこの多重継承のパズルはいつ見ても嫌だ
多重継承の方法はあまりよいやり方ではないということでしょうか?
>>810 class Sum : public B1
のようにpublic継承したら問題はないはず。
多重継承はJavaのような言語にはないのは設計ミスを生じやすい
から取り消されたと聞いているけど、多重継承を使わないと解決
できない問題も存在するのは事実。
ただ他の方法でもできるのに無理に多重継承を使うのはお勧めしない。
訳のわからないエラーに悩まされる事になる。
Bがクラスの場合、 class A : B{ はprivate継承でしたっけ?
まあ、多重継承が面倒な問題を抱えることになるのも事実だが、かといって多重継承がなければ スマートに解決できない問題というのも確実に存在する。 だからjava系にはinterfaceに限って多重継承を認めてるし、Rubyには限定されたMix-inがあるわけだ。
javaのインターフェース多重継承できないと、 threadを継承した時点で終わるw
下記のコードVC2003ならコンパイルできるけど、 2005はできない。i のスコープの解釈の違いによるものだけど、 どっちが正しいんですか? for(int i=0; i<100;i++) { //do something } cout << i ;
>>816 2003でコンパイル出来るとは初耳だ。
VC6でしょ?
2003は何かオプションを付けないとエラーになるだろ。
規格ではコンパイル出来ないのが正しい。 VCは伝統的にそれを破ってたのだが、 VC2005からはデフォルトで規格通りに 振る舞うようになった
>>817 VC6で作ったものをVC2003でそのままコンパイルしたら通りました
で、VC2003でコンパイルしたものを2005でコンパイルしたら×でした。
>817 VC6:コンパイルできる。/Zcでエラーにできるが、Windows.hとかがエラーだしまくるので使えない VC7:コンパイルできる(規定)。エラーにするオプションもある。 VC8:コンパイルできない(規定)。/Zc:forScope-でコンパイルできる だったかなたしか。
822 :
デフォルトの名無しさん :2007/01/28(日) 21:59:05
>>821 なるほど、歴史的な経緯がかいまみれますね。
ありがとうございました。
そうなのか。2003はアンインストールしてるから関係ないけど。 気持ち悪いな。標準C++以前の文法じゃん。
環境依存ネタを続けるのは良くないと思うが一言だけ VC6でコンパイルするときは #define for if(0);else for を宣言しておけ。
いまだVC6使ってる俺
>>825 string使ってるなら気をつけなよ
マルチプロセッサマシンで死ぬから
828 :
デフォルトの名無しさん :2007/01/28(日) 23:45:03
別に変じゃないだろ。
変。標準C++ではできないはずなんだもん。
831 :
デフォルトの名無しさん :2007/01/29(月) 01:11:55
>>763 何でtypedefするひつようがありますか?
よくわかりませんが、VC6だと { MyClass c; c.DoSomething(); } のように、敢えてブロックで囲って、デストラクタを呼び出させることはできないということですか?
馬鹿です
>>831 環境依存依存の型名なので、他の環境に移植した場合最小限の修正で済むように。
>>832 VC6,2003だと
for(int i=0 ....)
{ }
のiがforループのブロックの外にもスコープを持つ
2005だと持たない。
あくまでfor文の話
>>830 変じゃない。VC6の頃は標準C++自体が策定段階で、仕様が過渡期だった。
>>837 その頃の話をしてるんじゃない。今の話をしている。
元質は、VC6は変か? じゃないの? まぁいいや。 ・VC6は当時の事情によりそうなっていたが、今となっては変。 ・VC6を使うなら、>824のような対策をとることお勧め。 ってことで。
VC6が変なのではなく、VC6を使い続けているのにその仕様に文句を言うやつの方が変なんだろ。
つまりVC2005買えと言ってんの?
つ Express
最近はMFCがないとGUIのアプリ作れないと思ってる人がいるんだね
VC6を持っているなら、2005で6のMFCを使えばいいんでないの? つーか、スレ違いだがね。
ライセンス的にどーなのよ、それ。
質問者に質問者と同じ質問をぶつけるなよ
>>848 いや、スマン、疑問に思う根底の部分に何か思い当たる部分があるのか聞きたかっただけ。
adobeが汎用のGUIライブラリー作ってなかった?
kwsk
wxWidgetsのことも思い出してやって下さい
Qtもあるでよ
GUIリソースをマウスでチョイチョイっと作れるのはVCじゃないと無理じゃね?
あのお、低レベルな質問ですいません。 クラスXの入力イテレータを受け取りたいんですが どう書いたらよいでしょうか。 int Uketorimasu(InputIterator<X> kokokara,InputIterator<X> kokomade) コンパイラがエラーになってます??
intとかの数値をstringに変換してそのまま関数の引数に渡してやりたいのですが、 一番簡単なやりかたってなんですか? stringstreamも_ltoa_sも2,3行必要なので、なんかやりづらい 自分で変換関数を作るのが良いですか?
boost::lexical_cast
boostおいらも使いたいんだけど、 メンバーで知ってる人いないから使いづらい。。 共有のソースだし
と思ったけど、ちょっと提案してみますboost
おいらはstd::stringを返すstrprintfとか作った。 FILE *fp=fopen( stdprintf("%d.txt",i).c_str(), "rb"); とか書けて幸せだが、実装に要したコストを考えると微妙。
>>859 その2,3行の関数をinlineでヘッダに書いてやれば
マクロみたいに使えるが
>864 確かに...を使うなら、vsnprintfを呼ぶだけだからたいしたことはない。 %sに10とかstd::stringオブジェクトを突っ込んだりすると即死なのが 我慢できればそれでも良かったかもね。
メンバ関数に__stdcall等の規約が指定されている関数とかがあるとして、 それを継承して再定義した関数も、implicitな感じで__stdcallになるんですか?
>>868 それはわからないが、Platform SDKのCOM関係のヘッダでは
全てにいちいちSTDMETHODCALLTYPE(__stdcallと定義されている)を付けている。
少なくともベースクラスでvirtualなメソッドがSTDCALLなら、 その派生もSTDCALLにならざるを得ない。
>>871 いやだから、C++の設計思想的にそれはないだろ。
継承階層が深くなったりしてるときに深い階層にある継承元クラスの定義で
継承先のクラスが影響を受ける訳にはいかない。
仮想関数としてオーバーライドさせたい場合は自分でSTDCALLを
定義せにゃならんハズ。
そのばあい、STDCALLを指定しなければコンパイルエラーとなると思うがどうか。 そうでなければ、その仮想メソッドをどうやって呼び出すというのか。
>>873 継承元クラスのポインタにキャストすりゃ一発だろ。
ほー。へー。で、キャストしてからSTDCALL形式で叩くの?ふーん。
得意気な奴が反論できなくなって敗れ去る瞬間はいつ見てもおかしいが、 その段階で尚、涙目で「何かあるフリ」だけしておこうっていう間違った根性はさらに笑えるかも。
そういう言葉は class b{ virtual int __stdcall f(){ return 0;} }; class c : b{ virtual int f(){ return 0;} } をコンパイルしてから云ってもらおうか(w
878 :
デフォルトの名無しさん :2007/01/29(月) 23:22:56
これだとエラーになったけど、こういうことじゃなくて??? エラー E2113 test.cpp 17: 仮想関数 'derived::whoami()' は基本クラス 'base' と矛盾する #include <iostream> using namespace std; class base { public: virtual void __stdcall whoami() { cout << "I am base" << endl; } }; class derived : public base { public: virtual void whoami() { cout << "I am derived" << endl; } }; int main() { base* b= new derived(); b->whoami(); delete b; return 0; }
と、さもまっとうに言い返してるかのような顔で 話とまったく違うコードを出してくる奴w
は???意味が分からん
まさに↓だな >得意気な奴が反論できなくなって敗れ去る瞬間はいつ見てもおかしいが、 >その段階で尚、涙目で「何かあるフリ」だけしておこうっていう間違った根性はさらに笑えるかも。
どうでもいいけどクラスを宣言したとき 必ず最後の ; を忘れてしまうのは私だけ?
とりあえず、871, 873, 875の勝利。 872,874はいわば負け犬(ルーザー)。 876からの展開は向きが曖昧なので不明
>>872 も最後の2行はあってると思うけど
最初の3行は意味が分からんが
>>874 は変だと思うけど
何か珍しく変な人が多いな いつもはビシッと正解が出るのに
>>負け犬(ルーザー)。 わざわざ括弧書きで書くとこがかわいい
元は
>>871 の書き方に問題があるんじゃないかね。
STDCALLにならざるを得ないって、STDCALLを宣言しなくて良いのか
しないといけないのか、どっちにもとれる
>>884 >
>>872 >も最後の2行はあってると思うけど
>最初の3行は意味が分からんが
お前、まさか、class 定義内で使う using の理由(←これが
まさにその「最初の3行」)を知らんのか?
どっちかというと、
>>871 は
__stdcallを宣言しなくてもいいって言ってるように見えるけど
892 :
889 :2007/01/29(月) 23:40:40
>>891 読み返してみて、俺もそう思った。ゴミレスすまん。
素直な奴!!!!ワロタ
>>885 正解もなにも、喧嘩してる両者の主張が同じなんですが。
あいまいすぎ
871だけど、
>>868 からの話(implicitがどうこう)の流れとしては言葉が
足りてなかったかもね。
言いたかったのは要するに
>>873 で、「STDCALLにせずに呼べるなら
呼んだ時死ぬ」というだけで、explicit/implicitについては言及してない。
>継承階層が深くなったりしてるときに深い階層にある継承元クラスの定義で
>継承先のクラスが影響を受ける訳にはいかない。
について「影響」の範囲にも拠るんだろうけど、virtualな以上影響なしなわけ
ねーということが言いたかった。ついカッとなって書いた。反省している。
うむ。わかればよいのじゃ、わかれば。ハッ、ハッ、ハッ。(何故か偉そう
ついカッとなるようなぼけは 回線切って一酸化炭素を胸一杯吸い込んでこい
>>857 QtにVC用ポトペタプラグインあるでよ
typedefしてintを別名で利用しているのですが、 大量の型名を宣言しているものの、全てintの別名でしかないので、 コンパイラで型チェックされなくてバグの温床になりそうです。 どのように対応するのが一般的なのでしょうか?
>>900 その型をclassにする。enumにするだけでも違うかもしらん。
VC8だとtypedefしたものでも型が違うもの同士と代入したりすると警告が出るyo
>>867 僕は更にトチ狂って、文字列版 boost.bind をコンセプトに
http://naiv.info/werk/kalas_alpha.zip とか作ってたぜ!
FILE * fp = wfopen( sprint(wstring(),_d%L".txt",10).c_str(), "rb" );
spirit 見たいに式を保存できるようにする予定が途中で飽きて、そのままだけど…
しかも、stream のラッパーだから遅いし。
>>900 boostに強いtypedefというか、別の型にしてくれるやつがあった気がするんだが思い出せん。
まんまでワロタ
907 :
901 :2007/01/30(火) 10:56:24
おお、こんな方法が! .net2003の環境でint以外の変数もtypedefしているので、 boostを使ってみます、ありがとうございました。
>strong_typedef RTTIの関係でサイズが肥大化したりしないのかな 最適化の段階で消える?
C++の場合、vtblのないクラスにはRTTIをつける必要はなかったと思うんだが。
910 :
デフォルトの名無しさん :2007/01/30(火) 14:13:42
auto_ptr を list に入れるとまずいですか?
まずい。
912 :
910 :2007/01/30(火) 14:36:30
気をつけて使えばまずくないのでは?
もう一杯。
>>912 普通の人が思うようには動作しない、と思って使う分にはいいんじゃないの。
なんの役に立つかは知らないけど。
もうちょいまともに動作する別のクラスを作って使った方がいいと思う。
916 :
910 :2007/01/30(火) 15:18:06
COAPはコンパイルできない。
コンテナの挿入操作はconstオブジェクトを受け入れる。 auto_ptrのコピーコンストラクタは非constオブジェクトを要求。
wgではauto_ptrを廃止せよという提案もあるそうですね。
auto_ptr は低コストだから、あったほうがいいなぁ。
release()出来るのも地味にありがたい
template <template <class> class T> すみませんこれの意味が分からないのですが、 誰か教えてください
>>922 規格書の14.3.3 Template template arguments
テンプレートテンプレートパラメータに便乗した、前からの疑問なんだけど。 template < class T > struct Foo ; //OK template < typename T > struct Bar ; //OK template < template<typename> class T> struct Hoge ; //OK template < template<typename> typename T>struct Moke ; //Error なんでテンプレートテンプレートパラメータの、この部分は、 classじゃ無ければならないんだろう。なぜここはtypenameにできないのだろう。
組み込み型ってことがありえないからだろ
そういうものなのかな。 個人的には、typenameの方がすきなのだけれど。 でも、C++ template Metaprogrammingに書いてあるように、 これはちょっと分かりにくい。 template < typename T, typename T::type N> class Foo ;
typenameとclassに違いがあったなんて!!!
ってかな::typeとか::valueみたいなのが絡んでくるのは不慣れな場合総じて意味不明 おもしろいんだけどな
今更だけど、more effective c++が品切れ(絶版?) だったんで原著を買うことにした。amazonで20000円とかで売ってるヤシいたけど さすがにそんな値段では買いたくない
using namespace std; wcout.imbue(locale("japanese")); wcout << 12345 << std::endl; cout << 12345 << std::endl; このプログラムを実行すると、実行結果は 12,345 12345 となります カンマはいらないんだけど、これを消すにはどうしたらいいんでしょうか
locale(locale("japanese"), "C", locale::numeric)
1〜4999までの整数をローマ記法に変換するプログラムを作成して 1,2,4,8,32,64,128,4096を変換したいのですが #include<stdio.h> int main (void) { iny i,j,n; char roman[7]={'M','D','C','L','X','V','I'}; int num[7]={1000,500,100,50,10,5,1}; scanf("%d"<&n); for(i=0;n;i++); { for(j=0;j<n/num[i];j++) putchar(roman[i]); n%=num[i] } return 0; } でやってみると1回しか変換できないのですが、 いくつもの値を一度に変換するにはどうすればいいのでしょうか
934 :
931 :2007/01/31(水) 20:24:50
>>932 ありがとうございます
出力は出来たのですが、ロケールを元に戻すにはどうすればいいんでしょうか
locale(locale("japanese"), "C", locale::numeric);
wcout << 12345 << std::endl;//12345と出力。期待の動作
wcout.imbue(locale("japanese"));
wcout << 12345 << L"あいうえお" << std::endl;//12,345あいうえおと出力。期待の動作
locale(locale("japanese"), "C", locale::numeric);
wcout << 12345 << std::endl;//12,345と出力。ここも12345と出力したい
cout << 12345 << std::endl;//12345と出力。期待の動作
すいませんでした
>>933 iny という型をどこかで宣言する必要がある。
>>930 日本語版は訳がみょうちきりんだから原著読んだほうが多分いい。
がんばって買いなされ
みょうちきりんでも、たぶん日本語読んだほうが速い〜
941 :
デフォルトの名無しさん :2007/01/31(水) 23:17:30
配列の最大サイズが規定されているのか、教えて頂けますか。 newする場合と通常の固定長で宣言する場合に違いはありますか。 コンパイラの実装による、が答えなのかもしれませんがよろしくお願いします。
>>941 最大サイズは規定されていませんが、処理系が保証すべき最小サイズは
規定されているので、移植性を考えるとそれが最大サイズと言えます。
>>934 imbue() すればいいんじゃないの?
Effective C++ 3版の日本語訳はよかったな。moreの方も誰か訳しなおしてくれないだろうか…
>>943 C++は知らないけど、Cだと32Kくらいだよな。
小さすぎ。
静的なメモリ確保の限界が小さいのはしかたないだろ
948 :
デフォルトの名無しさん :2007/02/01(木) 00:08:10
ifstream infile("hoge.c"); string word; while (infile >> word) { cout << word << endl; } 以上のプログラムを改良してコメント行を表示させない仕様にしたい。 コメントの種類は下記の2種とする。 1) //から文末or 2) /*から*/ なにかスマートな方法はないでしょうか?
>>948 改良って言うか、一からつくるのとかわらんじゃん。。。
boost::spirit::comment_p
//の方は簡単だが/* */の方はセルオートマトンを使わないと 頭がゴチャゴチャするぞ。
構造体とクラスって何が違うんでしょうか。 デフォルトでprivateがクラス、publicが構造体くらいしか思いつきません...
現状ではそれぐらいの違いしかなかったはず
構造体への値の代入をコンパイルタイムで行いたいのだけど こんなかんじのことをすることはできないでしょうか? struct a{ float v;} mpl::map< pair <char, a.v=8>, pair <unsigned char, a.v=9>, pair <int char, a.v=10>, > type2valuedStr; at<char,type2valuedStr>::type a_char;
c++のコードを貼り付けたホームページを作るのに いいツールがないでしょうか?
<pre></pre>
<code> </code>
Global…はやりすぎか。
>>955 bison と flex を使って、文字への色付けツール作るといいよ。
いい練習になる。
それはいったい何の練習だ?
すいません、初心者なのですが、 可変長のバイト列のバッファを作りたくて、とりあえず vector<unsigned char> buffer; としました。 で、ここに unsigned int の変数のデータや unsigned char の配列のデータを 追加したい場合、どうすべきでしょうか? 今はデータを1バイトずつ push_back() とかしてるんですが、あまりにベタだと思うんで、 もしかして STL の範囲でもっと楽にできたりしますか? buffer をメンバに持つ、複数の型を push_back できるようなクラスを作るというのは おおげさですかね?
とりあえずキャストしてback_inserterにcopyすれば通らない?
memcopyしちゃえよYOU!
vector<T>::insertはvector<T>::iteratorあるいはconstT&しか引数に取らないと思っていたが。
アレッ? insertでどうやって入れるの?
テキストファイル全行を、std::vector<std::string>またはstd::vector<char *>またはchar **等に1行ずつ格納したいのですが、 どうするのがいいのでしょう。 改行コードが現れるまで1文字ずつfgetcで読んでいって長さを測り、 メモリに格納していくという感じになるのでしょうか。 istream等を使うと楽に書けますか? BCBのVCLでいう、TStringListと、そのLoadFromFileみたいなのを書きたいのですが。
>>967 unsigned int uint;
unsigned char uchar[N];
vec.insert(vec.end(), reinterpret_cast<unsigned char*>(&uint), reinterpret_cast<unsigned char*>(&uint) + sizeof(uint));
vec.insert(vec.end(), uchar, uchar + LEN);
vectorの要素への参照(ポインタ、イテレータ)を取得した後にpush_backなどが起こりうるので悩んでいるんですが、 思いつく対処法は以下しかなく、どれも困難です。定石などがありましたら是非ご教授下さい。 ・要素への参照を取得する前にresave()、 push_backされる要素が幾つあるかが分からないので困難。 ・思い切って参照ではなく添え字を記録しちゃう、 でも何か違うような気がする。
972 :
961 :2007/02/01(木) 10:04:44
なるほど、insert でできるんですね。
>>970 ついでにお聞きしてしまうんですが、このように vector の insert やコンストラクタの
引数に2つのポインタを渡して動くのが、ちょっと理解できてないんですが...
vector のメンバにには、普通のポインタの引数を取る型のものってないですよね?
で、デバッガで追うとどうも2つのイテレータの値をもつタイプの関数が呼ばれている
ようなんですが、テンプレートに渡した型のポインタはイテレータと同一視できる
という事なんでしょうか?
かなりアホなことを聞いているかもしれませんが...
>>972 ポインタはイテレータとしての要件をすべて満たす。
イテレータというコンセプトのモデルであるとも言う。
ポインタを模倣するようにイテレータが設計された ってこれ歴史常識じゃないのか…
977 :
デフォルトの名無しさん :2007/02/01(木) 20:01:55
継承関係にある2つのクラスがあるとして class base {}; class derived : public base {}; 派生クラスのコンテナのイテレータを vector<derived*> v; vector<base*>::iterator i = v.begin(); のように基底クラスのコンテナのイテレータに自動的に変換して欲しいと 感覚的には思うんですが、なぜそうなっていないのでしょうか???
思わねーよそんな行為
>>977 それができたら、コンテナにいろんな型を混在
させることが出来ちゃうからじゃないか?
>>977 それは駄目だろう。
例えば、こういうのもあったときに
class derived2 : public base{};
vector<derived*>v;
vector<base*>::iterator i = v.begin();
が出来たら
*i = new derived2;
と書けてvector内の型安全性が損なわれる。
981 :
977 :2007/02/01(木) 20:51:53
*i = new derived2; で型安全性が損なわれるという理由がよく分からないです。 base* p = new derived1; p->func(); delete p; p = new derived2; p->func(); delete p; ↑これは普通ですよね。 ↓これも void func(base* p) {} derived1* p = new derived1; func(p); 駄目な例があると分かり易いんですが…。
982 :
977 :2007/02/01(木) 20:54:55
>>980 すみません。示していただいた例を誤解していました。
>>981 はなしで。もう少し考えます。
983 :
977 :2007/02/01(木) 21:04:00
>>979-980 理解しました。
derived* array[10];
base* p = array[0];
p = new derived2;
こういうことをしようとしていたんですね(でもこれはコンパイル通るんですね…)
どうもでした〜。
結局、ポインタのポインタには、「ポインタの自動変換規則」は適用されない、ってはなしでそ。
いわば、イテレータはショボイポインタ ポインタならDerivedT*にはBaseT*が代入できるが イテレータはショボイからできない 例:--相当のことがができるイテレータは 5種類のSTLイテレータのうち2種類しかない
>983 間違ってる。 derived* array[10]; base** p = &array[0]; *p = new derived2; まだこっちの方が正確。
987 :
977 :2007/02/01(木) 21:52:06
>>986 あ!そうですね。
その場合はコンパイル通らないのですね(
>>984 に書かれているように)。
整合性あるんですね。
988 :
985 :2007/02/01(木) 21:52:38
勘違い。977の言っていることが実行できるとすると derived1,derived2がbaseを継承しているとして vec<derived1*> v1; vec<derived2*> v2; for(vector<derived1*>::iterator it = v2.begin();it!=v2.end();++it){ //v2のイテレータでv1を処理。これはおかしい }
vc2005EEを使っているのですが、質問があります。 デバッグモードではCPU使用率が20〜35%に押さえられているのですが、 リリースモードにすると使用率が常時100%に跳ね上がってしまいます。 これの原因分かる方いませんか? もしくは原因究明の方法が分かる方いませんか? (プロファイラは使えません^^)
C++のマクロで引数を省略することはできますか? 下記のマクロをLOG(msg)のように使いたいのですが。。。 #define LOG(msg,level) writeLog(__FILE__,__LINE__,msg,level) void writeLog(char* f,int line,char* msg,int level=0)
__VA_ARGS__ でググレ ば多少は使える情報があるかもしんない ところで次スレは
993 :
デフォルトの名無しさん :2007/02/02(金) 00:22:25
次スレのタイトルはアカデミックなものにして欲しい
【アカデミックな】C++相談室 part56++
↑ これはひどい
tempalte<template<class> class T>C++相談室<part56>
#define C++相談室 part56
998!!!!
999!
5年間2chにいるけど、今まで一度も1000をとったことがないんだよな。 初めての1000、取れますように。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。