1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part70 pc12.2ch.net/test/read.cgi/tech/1244942050/l50
321 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 07:05:25 ] 無名namespace内でのtypedefについてなんですが、以下のコードは正しいでしょうか? #include <iostream> namespace{ typedef unsigned long ulong; typedef unsigned int uint; typedef unsigned short ushort; typedef unsigned char uchar; } ulong a() { return 1; } uint b() { return 2; } ushort c() { return 3; } uchar d() { return 4; } int main(int argc, char** argv) { a(); b(); c(); d(); return 0; } これをCygwinのg++ 3.4.4でコンパイルすると error: `uint' does not name a type error: `ushort' does not name a type というエラーが出ます(ulong, ucharについては何もエラーが出ません)。 ただし、#include <iostream> の行をコメントアウトするか、関数 a(), b(), c(), d() を無名namespace内に入れると コンパイルが通ります。 これはCygwinのg++がおかしいのか、それともコードに問題があるのか、どっちなんでしょうか?
322 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:11:30 ] 無名namespaceって ::ulong で参照しなかったっけ。
323 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:19:57 ] 今の時代Cygwinでファーストコード通してる人が居るんだなぁと ちょっと意外に感じた。
324 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:23:24 ] >>322 それはグローバルnamespaceじゃないですか?
325 名前:phenix mailto:sage [2009/08/08(土) 09:45:36 ] >>301 boost::spiritを使うと簡単
326 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 10:03:46 ] >>322 それはグローバルだな。 無名は特に外部から参照は出来ない。 その翻訳単位内でのみ参照可能。
327 名前:314 mailto:sage [2009/08/08(土) 10:12:26 ] >>315 日立SR8000の最適化コンパイラ って言っても縁ないでしょ。
328 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 10:26:48 ] >>327 確かに縁がなさ過ぎるw
329 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 13:46:31 ] >>327 縁がないから言ってもしょうがないでしょって思ってんのかな
330 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 17:58:04 ] return で返される値は 返り値 戻り値 など色々呼び名があると思いますが、 C++用語としてはどれが正しいでしょうか?
331 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:28:25 ] >>321 gcc -E してみたら、 /usr/include/sys/types.h でグローバルに uint と ushort の typedef が あった。どうもこいつらが影響してるみたい。 ちなみに、ソース先頭で #define _POSIX_SOURCE しとくとこれらの typedef が無くなるんで、 ふつうに通るようになる。 というわけで、問題を縮小していくと以下の3行で同じ問題が発生する。 typedef int I; namespace{ typedef int I; } I i; > :3: error: `I' does not name a type > :3: error: extra `;' typedef に限らず、グローバルスコープと無名名前空間の中に同じ名前の宣言があると、 宣言自体は通るのに、その後で実際には宣言された名前が使えなくなるみたい。 gcc のバグっぽいけど、標準ではどうなるべきなんだろうか? 2つの宣言のどっちを使うのか曖昧だからエラーになってほしいところ。
332 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:31:18 ] >>330 いちおう、 JIS 規格では「返却値」。 ほとんどの場合はどれでも通じるから、どれが正しいとも正しくないとも思わないけどね。
333 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:33:05 ] >>332 返却値ですか。 ありがとうございました。
334 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:46:09 ] >>331 検証サンクスです。グローバルnamespaceと無名namespaceで重複するとおかしくなるんですね。 どっちが優先されるべきなのか少し調べてみましたが、よくわかりませんでした。 というか、宣言の時点でエラーなり警告なり出して欲しいですね。 とりあえずtypedefについては無名namespace外でも使う場合はグローバルスコープに置くことにしようと思います。
335 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 18:51:42 ] でも、仮にグローバルnamespaceが無名namespaceより優先されるとしたら 名前の重複が起こった場合、無名namespaceの方には外側からアクセスできなくなっちゃいますね。 とすると本来は無名namespaceが優先されるべきなのかな??
336 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 00:39:45 ] An unnamed-namespace-definition behaves as if it were replaced by namespace unique { /* empty body */ } using namespace unique ; namespace unique { namespace-body } つまり typedef int Integer; namespace{ typedef long Integer; Integer l; //OK:long } Integer i; //NG ::Integer i; //OK:int グローバルと重複したとき無名名前空間外から参照する方法はない 無名名前空間内では無名名前空間側が優先
337 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:27:03 ] MyClassは自作のクラスで、そのコピーコンストラクタは重いとします。 MyClass foo() { //とても重い処理 return 〇〇; } この関数を呼び出した側で返り値を長く使いたい(ただし変更はしない)場合、 const MyClass retval =foo(); とするべきか、 const MyClass& retval =foo(); とするべきか どちらが望ましいでしょうか? コンパイラによる「戻り値最適化」が行われないとすれば前者は後者より重いと推測されますが、 コンパイラによる「戻り値最適化」が行われるとすれば前者は後者より参照の解決が不要な分 速いのではと思っているのですが、この理解で正しいでしょうか?
338 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 01:38:44 ] >>337 戻り値最適化を行うような、処理速度について配慮されたコンパイラであれば、 テンポラリを束縛した参照について「参照の解決」などという処理に時間をかけることは 無いだろう。
339 名前:314 mailto:sage [2009/08/09(日) 02:42:42 ] >>329 ひねくれたやっちゃな。 コンパイラ個別の特徴じゃないしな。 if文があったらループの最適化をサボるってのは。 それを3項演算子で抜けられる可能性があるってのは一般論として知っておいて損はないだろ。 具体的なコンパイラの名前が必要な話か?
340 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 02:53:37 ] 縁がないだろって思ってるコンパイラでしか有効じゃない機能をわざわざ紹介する理由は確かに分からん
341 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 03:59:56 ] 一般論に対して例外の存在を補足しただけじゃねーの。
342 名前:337 mailto:sage [2009/08/09(日) 10:12:42 ] >>338 ということは、最適化が出来るコンパイラなら どちらも同じだろうと言うことですね。 ありがとうございました。
343 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:39:44 ] struct B を継承するときに、 class cD : B struct sD : B これら二つの違いは何でしょうか? cDはBをprivate継承していて、sDはBをpublic継承しているだけだと いう理解でよろしいでしょうか?
344 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:40:38 ] はい
345 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:40:57 ] >>343 はい。
346 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:41:38 ] ごめん
347 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:48:53 ] えっ?
348 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:49:51 ] えっ?
349 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:50:17 ] えっ?
350 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:51:36 ] えっ?
351 名前:343 mailto:sage [2009/08/09(日) 15:53:36 ] ありがとうございました。
352 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 15:54:23 ] いえいえ、どういたしまして。
353 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:10:44 ] numeric_limits - C++ Reference ttp://www.cplusplus.com/reference/std/limits/numeric_limits/ ここを読んでみましたが、 staticメンバ関数の min() epsilon() この二つの違いが分かりません。 std::numeric_limits<double>::min() std::numeric_limits<double>::epsilon() の例で違いを教えていただけませんでしょうか? なお、私の環境 Windows XP SP2 g++ (TDM-1 mingw32) 4.4.0 では std::numeric_limits<double>::min() = 2.22507e-308 std::numeric_limits<double>::epsilon() = 2.22045e-016 となりました。
354 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:20:14 ] >>353 min() は浮動小数点で表現できる最小の数 epsilon() は「機械イプシロン」を調べていただければわかるが、数値 1.0 とそのとなりにある実数との差 この二つは異なる概念なんですね。
355 名前:353 mailto:sage [2009/08/09(日) 16:21:31 ] >>354 理解出来ました。 ありがとうございます。
356 名前:デフォルトの名無しさん [2009/08/09(日) 16:26:04 ] >>353 minというのは、その名の通り、double型で表現できる(絶対値が)最小の値。 epsilonというのは、double型で表現できる、「1の次の」値から1を引いた値。 詳しくはIEEE754をよく読んで欲しいんだけど、要するにdouble型で表現できる値っていうのは 0付近では密で、絶対値が大きくなればなるほど疎になる性質がある。 例えばdouble型は0〜1の間には10億個ぐらいの表現できる値があるけど、 1〜2の間には800万個ぐらいしかない。
357 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:42:12 ] みなさんありがとうございます。 申し訳ないのですが、 quiet_NaN() Representation of quiet (non-signaling) "Not-a-Number", if available. signaling_NaN() Representation of signaling "Not-a-Number", if available. この二つの違いも教えていただけますでしょうか。 前者が「静かな」というのが今ひとつ分かりません。
358 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:06:50 ] >>357 一般的に、NaNというのはなんかエラーな感じの数のこと。 NaN+普通の数とか、普通の数÷NaNとか、とにかくNaNがどっかに含まれる演算を行なったとき、 ・Quiet NaNを使ったときは、演算結果としてNaNを返す ・Signaling NaNを使ったときは、浮動小数点例外が発生する(0除算を行った時みたいに、プログラムの実行が停止する)
359 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:11:27 ] 多分だけど計算中にNaNが現れたときsignalを発生するかしないかじゃないかな?
360 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:46:22 ] プログラム技術2ch掲示板のC++のスレ見ても、dynamic_cast演算子を使ったソース がほとんど見掛けないな。皆そんなに使わないのかいな。大変な努力をして、 C++を学習したのに、それを使う機会が無いって、物足りないな、困ったもんだ。
361 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:49:16 ] ダウンキャストかクロスキャストの時しか使わないじゃん 普通は仮想関数だけで十分
362 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:27:55 ] >>360 goto と似たようなもんだ。使わないで済むならそれでいい。
363 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:31:35 ] C++には多用しちゃいけない機能もあるからな dynamic_castやtypeidもそうだし、あと例外指定とか
364 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:39:06 ] >>363 mutable もだな。 reinterpret_cast 級の危険機能だと思う。
365 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:53:38 ] 使い方を間違えなければmutableは非常に役立つよ。
366 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:54:10 ] いざという時に、せめて可能な限り安全にわかりやすく ダーティーなやり口に手を染めるためのもの、という感じかな。 漫画によくある場面で喩えるなら、主人公が出発前に 「できればこれを使わずに済ませたいものだが・・・」 とか言いながら見つめてる武器みたいな。
367 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:55:31 ] それ絶対使うじゃんw
368 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:55:41 ] もうCでいいじゃん。
369 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:58:44 ] >>367 この手の場面に相当するような「デカい仕事」では、実際結構な確率で いま出ているような物を使うことになると思う。
370 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:02:12 ] 危険な機能を使わないためと言って変な黒魔術で無理矢理回避する方がよっぽど危険だしな
371 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:25:27 ] Windowsでプログラムしていると reinterpret_cast と dynamic_cast のオンパレードですよ^^
372 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:30:33 ] >>371 キャストが必要になるのはわかるが、オンパレードはおかしいだろ。 同じ意味のキャストはてきとうにラップしろよ。
373 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:39:44 ] ダウンキャストの意味わかってるのか? 存在しないメンバにアクセスして鼻から悪魔が出るのを承知で 使わないといけないんだぞ
374 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:43:35 ] HWND(構造体へのポインタ)をCWndクラスにキャストさせたり、Windowsプログラミングは楽しいなぁ^^
375 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:12:24 ] C++やりたての頃はこういう鼻から悪魔の意味もわからなかった #include <iostream> class Base { int i; public: virtual void print() const { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() const { std::cout << "Derived" << std::endl; } }; int main() { Base *p; p = dynamic_cast<Derived*>(new Base); p->print(); // ouch! }
376 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:17:31 ] >>375 これはどの辺が鼻から悪魔?
377 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:18:56 ] >>376 BaseにはDerived::print()がない 実行してみればわかるが正しく動かない
378 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:20:46 ] >>376 dynamic_cast<Derived*>(new Base) この結果がヌルポインタになる。 その後の p-> でヌルポインタをデリファレンスして未定義動作。
379 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:21:39 ] >>377 えっ?
380 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:25:38 ] ごめんこういう場合に使うんだったね #include <iostream> class Base { int i; public: virtual void print() const { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() const { std::cout << "Derived" << std::endl; } }; int main() { Base* p; p = dynamic_cast<Base*>(new Derived); if (!p) std::cout << "dynamic_cast failed." << std::endl; p->print(); // ouch! }
381 名前:376 mailto:sage [2009/08/09(日) 23:27:43 ] すみません >>377 と >>378 はどちらが正しいですか?
382 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:29:07 ] >>381 >>378 が正しい ダウンキャストはポインタが正しい本体を指している時にのみ成功する
383 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:37:32 ] >>380 これは何でouch!なの?
384 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:38:21 ] >>380 いや、 Derived* → Base* は暗黙変換で通るから、 dynamic_cast の出番じゃない。 しかも、せっかく dynamic_cast の結果にチェックを入れたのにメッセージ表示の後に 結局 p-> してたらダメじゃん。
385 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:40:07 ] わかんね dynamic_castの正しい使い方知ってる人教えて
386 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:48:07 ] DerivedがBaseとBase2を継承してるとして ・Derived* → Base* (アップキャスト) 常に成功し、Baseのポインタが得られる ・Base* → Derived* (ダウンキャスト) DerivedのBase部分を指してるポインタだったら正しいDerivedのポインタが得られる そうでなければヌルポインタが返ってくる ・Base* → Base2* (クロスキャスト) DerivedのBase部分を指してるポインタだったら正しいBase2のポインタが得られる そうでなければヌルポインタが返ってくる ・Base* → int* (無関係) 常にヌルポインタが返ってくる 参照の場合は、以上の「ポインタ」を「参照」、「*」を「&」、 「ヌルポインタが返ってくる」を「std::bad_cast例外が投げられる」に読み替えればいい
387 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:01:23 ] よく見ろよw >>375 のは p = dynamic_cast<Derived*>(new Base); どこにもDerivedのインスタンスは生成されない そりゃNULLが帰ってくるだろうって
388 名前:357 mailto:sage [2009/08/10(月) 00:18:37 ] >>358-359 ありがとうございます。 NaNについてはもっと勉強してきます。
389 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:45:20 ] >>369 そういう話ではなく > 「できればこれを使わずに済ませたいものだが・・・」 といったらそれは使うフラグ
390 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:35:06 ] >>389 まさにそういう話だと思うが。
391 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 02:23:56 ] 仕事のデカさは関係ないってことじゃないの?
392 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 12:33:39 ] dynamic_castの意味を今まで勘違いしてたわ ダウン・キャストしても安全に使用できるかどうかの判定なのね
393 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:40:20 ] VS2008のVC++MFCで ボタンクリックでピクチャーコントロールにjpgファイルの画像をサイズを変えて表示しています。 以下ソース CImage img; CImage img2; HDC hdc; img2.Create(80,60,24); img.Load("jpgファイルのフルパス"); hdc = img2.GetDC(); SetStretchBltMode(hdc, HALFTONE); img.Draw(hdc, 0, 0, 80, 60); img2.ReleaseDC(); m_xcPic01.SetBitmap( (HBITMAP)img2 ); img.Destroy(); img2.Detach(); img2.Destroy(); jpgファイルが変わる毎に、画面上の画像も切り替えたいので 上の処理を呼び出して、画面を切り替えてます。 しばらく動かしていたところで気付いたのですが、 メモリの使用量がかなり多くなっていました・・・ ファイルロード側のDestroyやリサイズ後側のDetach、Destroyだけでは解放してくれないのでしょうか? わかる方、または参考になるサイトやスレをご存知の方、よろしくお願いします。
394 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:45:28 ] Detachしてしまったビットマップは削除されないのでは
395 名前:デフォルトの名無しさん [2009/08/10(月) 15:48:42 ] ヘッダーに変数を定義することって出来たんでしたっけ? いや、さっき書いてみたら出来たんで、ちょっとびっくりしたんですが。 インクルードガードしてないとエラーが出るってだけなのかな。Cではどうなんでしょう。 まあ、作法としてはインクルードガードしててもやっちゃダメなのかもしれないですけど。ですよね?
396 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:54:56 ] 本当ならリンカが多重定義のエラーを吐くはずだが、デフォルトでは吐かない奴もいる
397 名前:393 mailto:sage [2009/08/10(月) 15:58:12 ] >>394 レスありがとうございます Detach後にDestroyすると、メモリ上に残る・・・ つまり、リサイズ後用のimg2がどんどん溜まっている状態 ってことでしょうか? ためしにimg2.Detach();をコメントアウトして動作させると、 別ウィンドウの後ろに隠れると画像が消えると言う症状がでました。 私、根本的に作り方を間違えているのかも・・・
398 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 16:18:59 ] >>397 MFCスレでやってくれ
399 名前:393 mailto:sage [2009/08/10(月) 16:28:29 ] >>398 MFC相談室の方に移動させていただきます。 スレ汚しすみませんでした。
400 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 16:45:42 ] >>395 ヘッダだからできない事というのはないよ やるべきじゃないことは、ある。
401 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 17:42:52 ] >>400 >ヘッダだからできない事というのはないよ へー、そうなんですか。 逆に、ソースだとできないことってのはありますよね? テンプレートの定義とか。
402 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:00:51 ] >>401 .hも.cppもC++の上では本質的には変わりないんだよ。 テンプレートの定義だって、別に.cppの上でやったっていい。 その定義が他の.cppから見えるかどうかは別問題だがな。
403 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:06:33 ] >>401 だからできないことはないって。 逆に聞くが、ヘッダとソースってどうやって区別してんの?
404 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:08:23 ] 定義そのまま他の.cppに丸ごとコピペすればいいわけだが、 後々修正する際に全部直して回るのが面倒だからそういうことはやらないだけだ
405 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:09:46 ] #include "header.cpp" この場合、header.cpp はヘッダなのかソースなのか
406 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:38:26 ] >>405 いわゆるクソコードってやつだよ。
407 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:46:46 ] オブジェクト指向について質問なんだけど。 クラスAのインスタンスをクラスBで作り クラスBのメソッドからクラスAのprivateにあるメンバ変数をゲッターセッターを使って弄る(クラスBのメンバ変数にも同期させる)。 そして、又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。 そういう風に包含を重ねて行くのがオブジェクト指向なの? C++をやって間もないんだけど、俺のプログラムはこんな感じなんだ。 良いのか悪いのか分からない、アドバイスお願い
408 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:48:16 ] >>405 学生の時にバイトしていた会社のコードにそういうのがあった 日本のロケットがクソ高くて落ちるわけだ、と思った
409 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:54:57 ] クソコードでバグを入れて、 そのバグを取るのが仕事ですから それでいいんです。
410 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:56:03 ] >>407 俺はメソッドとかC++標準にない用語を使われても起こらない。 しかし >>クラスAのインスタンスをクラスBで作り これはどういう意味だい?
411 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 18:58:28 ] >>410 えっと クラスBのprivate領域に、クラスAの実体を包含するって意味で書いたつもりだった
412 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:03:01 ] >>406 クソかどうかは関係ない。 できないことがあるのかどうかが論点であり、やるべきではないことはまた別の話
413 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 19:44:54 ] >>407 >又クラスCのメソッドからクラスBにあるメンバ変数を参照して、判定なりをする。 クラスBでクラスBのメンバ変数を参照して判定するようにして、外からメンバ変数を 見せないように隠蔽するのが、オブジェクト指向のカプセル化の基本かな。 セッタ/ゲッタはそれを破ってしまうから避ける様に設計するのがお勧め。
414 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:12:31 ] 雪駄とか下駄はオブジェクト指向じゃないと個人的には思う。 単一責任原則をはたすためにも、 メソッドは単に状態を書き換えるだけでは十分でないと思うから。
415 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:15:25 ] セッタ/ゲッタは最終手段であり、 それに突入した瞬間からクソコードが始まると考えて 「一般には」さしつかえないくらい。
416 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:33:13 ] C++ code - 95 lines - codepad ttp://codepad.org/xR4PHa3G この std::numeric_limits の明示的特殊化のコードは、 g++ 4.4.0では問題無くコンパイル・実行できました。 しかし Microsoft Visual Studio 2008 Version 9.0.30729.1 SP では error C2910: 'std::numeric_limits<MyTempl<MyInt>>' : 明示的な特殊化にすることはできません。 となり、コンパイルエラーとなってしまいます。 VCでも通す方法はありませんでしょうか? Compiler Error C2910 ttp://msdn.microsoft.com/en-us/library/cx7k7hcf(VS.71).aspx このあたりを読んでみましたが、よく分かりませんでした。 よろしくお願いします。
417 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:52:34 ] stdの中を無理矢理いじくってるからかなあ 多分ヘッダーlimitsのどこかとぶつかってるよ
418 名前:416 mailto:sage [2009/08/10(月) 20:56:41 ] std名前空間は 新しい物を追加したりすれば未定義の動作となる。 しかし関数・クラステンプレートの特殊化のみ 認められる。 ということは知っているのですが、 私のやり方がまずいのでしょうか。。。
419 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 20:57:14 ] template <typename MyInt> この行いらない
420 名前:416 mailto:sage [2009/08/10(月) 21:04:44 ] すみません。 その辺確かにまずかったです。 C++ code - 95 lines - codepad ttp://codepad.org/yovzUoIJ これはどうでしょうか? やりたいことは template <typename hoge_t> struct numeric_limits< MyTempl<hoge_t> > : numeric_limits< hoge_t > の部分で現れていると思います。
421 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 21:07:00 ] template <typename hoge_t> の前の template <> が要らないんじゃ