[表示 : 全て 最新50 1-99 101- 2chのread.cgiへ]
Update time : 05/28 05:52 / Filesize : 51 KB / Number-of Response : 172
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part58



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は単にファイルをくっつけてるものと考えれば理解しやすいかも






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<51KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef