1 名前:v(^・^)v [2007/09/26(水) 03:41:13 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 テンプレその他 >>2-15 付近参照 前スレ(実質 part57) C++相談室 part56 pc11.2ch.net/test/read.cgi/tech/1185377587/
136 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:10:53 ] #define NUM2TEXT_(n) #n #define NUM2TEXT(n) NUM2TEXT_(n) #define macro(name) \ const char *x = name ## NUM2TEXT(__LINE__)
137 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:43:41 ] 演算子オーバーロードって副作用完了点のことも考慮しないといけないんですか? std::cout << "test" << std::endl; で (a) "test" << std::endl; が先に評価されて、次に std::cout << (a) が評価される、という事態にはならないんですか?
138 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 03:26:56 ] 優先順位の同じ演算子の並びは左から評価じゃなかったのか
139 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 04:07:20 ] 左結合と右結合があってね・・・
140 名前:133 mailto:sage [2007/10/03(水) 05:13:05 ] ありがとうございます。 >>136 さんのは どういう原理なんでしょうか?
141 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 08:46:05 ] 7**7**7 の下一桁の数字は?
142 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 09:44:47 ] >>137 多重定義されている場合、通常の関数と同様、 呼出の直前に副作用完了点が現れるので心配は要らない。 <<は左結合だから、まずstd::cout << "test"から取り掛かる。 これは多重定義されているので、std::cout.operator <<("test")という関数呼出に相当。 関数呼出の直前には副作用完了点が来るので、ここまでにstd::coutと"test"が評価される。 と言っても、共に副作用を持たないので何も起きないが。 仮に副作用を持つ式だった場合、通常の関数呼出同様に <<の左側と右側のどっちのオペランドが先に評価されるかは決まっていない。 std::cout.operator <<("test")の戻り値をrとすると、 次にr << std::endlの評価に掛かる。以下同じ。
143 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:51:51 ] >>140 > 16.3.2 The # operator > 16.3.3 The ## operator
144 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 13:50:35 ] >>133 #define XY(X,Y) X##Y #define MAKENAMEXY(FX,LINE) XY(FX,LINE) #define MAKENAME(FX) MAKENAMEXY(FX,__LINE__) というマクロで連結させている例がある。 評価順その他の関係で、間に一段置かないとならないらしい。
145 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:31:45 ] VS2008EEで>>136 が正常に動作しないんだけど・・・ コンパイラの仕様かな?
146 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:36:58 ] プリプロセッサの仕様じゃね?とかつまんない事言うね。義務として。
147 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:45:12 ] すみません。継承について質問です。 クラスBaseを基底とするクラスDerivAやクラスDerivBがあるとして、 そこからインスタンスを作成するとすると、 Base* pA = new DerivA; Base* pB = new DerivB; となると思います。 そこから、pAもしくはpBから新たなインスタンスpCを作りたいと思っているのですが、 どうしたらいいでしょうか? 単にpA(DerivA)だけであれば、DerivA *pC=*pAだけでいけるのですが、 pAとpB(最終的にはBaseを基底とするクラス全部)にも対応できるものを作りたいので、 どうか力をお貸しください。
148 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:53:05 ] class Base { public: virtual Base *NewInstance() = 0; }; class DerivA : public Base { public: virtual Base *NewInstance(){ return new DerivA; } }; class DerivB : public Base { public: virtual Base *NewInstance(){ return new DerivB; } }; Base *pA = new DerivA; Base *pB = new DerivB; Base *pC = pA->NewInstance(); Base *pD = pB->NewInstance();
149 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:53:41 ] Base* pA = new DerivA(); Base* pB = new DerivB();
150 名前:147 mailto:sage [2007/10/04(木) 01:02:02 ] >>148 、149 目からウロコが落ちました。 インスタンスを作成する関数を別途で作ればいいわけですね。 ありがとうございます。
151 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 01:04:17 ] >>148 DerivA::NewInstanceはDerivA*を返し、 DerivB::NewInstanceはDerivB*を返し、 という具合に、そこは共変にしてほしいな。
152 名前:デフォルトの名無しさん [2007/10/04(木) 01:06:08 ] 凶変を許したことでできるようになったことってなんだっけ? なんかの本にかいてあったが忘れた
153 名前:デフォルトの名無しさん [2007/10/04(木) 01:15:57 ] >>136 boostにはなんて名前で入ってたっけ
154 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 01:18:23 ] >>152 pAはDerivA*と分かっているとき、 DerivA* pA2 = static_cast<DerivA*>(pA->NewInstance()); のようなキャストを型安全性を損なうことなく排除できる。
155 名前:デフォルトの名無しさん [2007/10/04(木) 02:07:15 ] dynamic_castすれば共変なしでも安全じゃね?
156 名前:デフォルトの名無しさん mailto:age [2007/10/04(木) 02:08:25 ] videointroplayer.web.fc2.com/?ii9YN1kO-TK36%+WhqyiIrhz0F110%+Kjtps4byn7a119%+esA5NHPWRF1115%+026mGIi9Z4824%+@1@_KeyboardCrusher
157 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 02:29:39 ] >153 BOOST_PP_STRINGIZE
158 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 08:19:17 ] これじゃだめなん? Base *pC = new DerivC;
159 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 08:20:10 ] Base *pC = new DerivC(pA); Base *pC = new DerivC(pB);
160 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 21:28:42 ] >>155 それだと余計な負荷がかかる。
161 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 01:29:04 ] 俺的c++開発環境構築メモ 目的:最終的にlinuxで動かせるようにしないといけないけどVisual Studio捨てれない winxpにvmwareいれてゲストOSとしてubuntu7を入れる ubuntuの/home/srcをsambaで共有できるようにしてホストOSのwinxpからみれるようにする /home/src = \\ubuntu\src の下にVisual Studioのプロジェクト作成 makefileはeclipse/CDTで自動生成 あとはemacsでメインのコードの編集するけど、flymakeとか使いつつ インテリセンスも使えてeclipse/cdtのリファクタリング機能も使える環境のできあがり
162 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 04:20:16 ] 俺がいる
163 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 08:18:16 ] もう遅いだろうがcoLinuxを薦めてみる
164 名前:デフォルトの名無しさん [2007/10/05(金) 12:27:41 ] coMomongaを勧めてみる
165 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 12:59:49 ] coLinuxの方が便利なの? 速度が速い以外のメリットがないなら、もう乗り換えれない
166 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 15:23:45 ] coLinuxってkernelのバージョンあがるたびに中身を全消ししないといけないって聞いたのだけど 違うの?
167 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:36:55 ] ヘッダファイルなどで記述したグローバルなstatic変数は, includeしたソースが複数ある(各ソースではincludeガードが起きずに展開される) 場合も単一の存在となるんでしょうか? それとも別々の独立した変数となるんでしょうか?
168 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:41:00 ] それをインクルードしたソースファイルごとに別々に作られることになる
169 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:02:52 ] ありがとうございます. あれ,でもクラス変数などは単一なんですよね? うーむ,基本の理解が全然出来ていない.
170 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:26:17 ] クラスの static 変数はどこかで1個だけ実体を定義する必要がある。 class A{ static int x; }; int A::x; // <-- これ 2個以上のソースファイルで定義したら、定義が重複してるってリンクエラーになる。 static でない普通のグローバル変数と同じあつかい。
171 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 20:36:51 ] #includeは単にファイルをくっつけてるものと考えれば理解しやすいかも