1 名前:デフォルトの名無しさん [2008/05/14(水) 01:00:02 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.53【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1208989385/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
72 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:46:56 ] 直書きの数値にも型はあるんだぞ
73 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:58:44 ] リテラルと言いましょう
74 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 13:09:38 ] すまん、用語には疎いもんで・・・
75 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 20:39:22 ] >>20 >・templateクラスにして継承関係を逆にする > ※ template<class T> class base : T {}; これ、よく分からないので具体例あげてくれるとありがたい。
76 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 03:21:50 ] struct A { A() { f(); } virtual void f() = 0; }; struct B { virtual void f(){} }; を template<class T> struct X : T { X() { f(); } }; struct Y { void f() {} }; typedef X<Y> Z;
77 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 03:22:49 ] 修正 > X() { f(); } X() { T::f(); }
78 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:58:03 ] 質問です 先日基底クラスのデストラクタを仮想にし忘れ、メモリーリークというお約束のミスをやってしまいました。 この手のミスを無くしたいのですが、warningを出させる方法や、チェックツールなどはないでしょうか? 環境はVS6.0です。 仮想関数テーブルへのアクセスによるオーバーヘッドは現状気にしていないので、全てのクラス関数を仮想にしたいのですが、たまにつけわすれてしまうのです。
79 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:04:15 ] 初心者です。 C++を学ぼうと思ってるんですが良い参考書orWebページはありますか?
80 名前:75 mailto:sage [2008/05/17(土) 10:09:49 ] >>76-77 ありがとう。 ただこの方法だと元々の継承関係が失われないかい? (76はミスタイプと思うが、元々はstruct A : B) 質問者は継承関係は維持したいと思うけど。
81 名前:75 mailto:sage [2008/05/17(土) 10:13:13 ] >>80 というか継承と同じことをテンプレートで実現するってことかな。あってる?
82 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:28:04 ] >>78 「メモリリーク 検出」とかでググれば解説してるサイトがいっぱいでてくる
83 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:55:08 ] >>78 デストラクタを仮想にした基底クラスを作って、クラスを作るときに必ずそれを派生して使うようにすれば忘れることはない。
84 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:57:15 ] >>83 それを忘れないようにするためって話じゃないのか?w
85 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:58:33 ] >>83 デストラクタの話ね。
86 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 14:43:18 ] >>83 はルート基底クラス(C#とかのObject)を用意することで、 個別にvirtualを書かなくて済むようにした方が良い、って意味なのでは? でもそしたら今度は、それ継承するのを忘れない方法は? って話になりそうだけど。
87 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 14:46:51 ] クラスを定義するときに専用のマクロを使うことにするとか
88 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 14:57:06 ] >>87 それを忘れないようにするためって話じゃないのか?w
89 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 15:02:42 ] >>88 忘れにくさという点で、 >>78 より>83 それより>>87 と良くなっているように見えるけど。
90 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 15:10:27 ] コピペ煽りに律儀に答えなくても
91 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 15:42:28 ] class NewClass : public Object の : public Objectを書かなかったらやっぱりバグるわけだしなー それじゃ意味ないだろう 継承しなければコンパイルエラーになるようにできるなら、別だが。
92 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:13:22 ] なんでループしてんの?
93 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:19:14 ] struct Object{virtual ~Object(){};}; #define STD_STRUCT(NAME) struct NAME : public virtual Object #define STD_CLASS(NAME) class NAME : public virtual Object STD_CLASS(ClassA) { public: ~ClassA(){std::cout << "~ClassA" << std::endl;} }; STD_CLASS(ClassB), public ClassA { public: ~ClassB(){std::cout << "~ClassB" << std::endl;} }; void f() { ClassA* p = new ClassB(); delete p; }
94 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:27:10 ] そしてそのマクロを使うのをつい忘れるわけですね、わかります
95 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:30:03 ] >>94 >>89 5レス前すら読めない人はこのスレに必要ありませんよ
96 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:31:46 ] いや、お前ら質問者の意図無視しすぎだろw
97 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:33:46 ] ツールでなんとかしたいと言ってる人間に、忘れないようにマクロを使いましょうってどんな返事なんだ 俺は必要としたことないから知らんが、書式チェックツールくらいないのか?
98 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:36:19 ] virtual忘れをチェックしてくれるツールくらい自分作ればいいんじゃね デストラクタは先頭に ~ が付いててわかりやすいから、 その前にvirtualが付いてるかどうかくらい簡単に判定できそう そもそもデストラクタを書いてない場合は役に立たないが・・・
99 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:38:42 ] >>96 >>78 を読む限り、まずミスを無くしたい、という目的があって、 その方法として警告、チェックツール「など」、 と手段の例を挙げているので、 同じく、ミスを無くす/減らす方法を書いてるレスが 意図を無視してるようには見えないけど?
100 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 17:06:19 ] とりあえず、抽象型へのアップキャストは極力控えて、 総称型プログラミングを覚えた方がいいと思った。
101 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 17:08:30 ] >>100 実行時ポリモーフィズムが必要な場合はどうするの。
102 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 17:10:55 ] だから極力控えて、って・・・。
103 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 17:31:36 ] 静的な方が安全というのは分かるが、 export のない C++ でジェネリックばっかやってると コンパイルが重くて現実的じゃない事も。
104 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:16:08 ] >>98 そしてそのツールでチェックするのをつい忘れるわけですね、わかります。
105 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:34:11 ] >>104 make使うならMakefileに組み込めばおk。 総合環境なら・・・ カスタムビルドステップ?
106 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:42:35 ] >>104 最悪、考え方としてはおかしくなったときにチェックすればいいわけだし。
107 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:08:54 ] あれ?ちょっとずれるが なんかの統合環境で、virtualな関数をオーバーライドする時にvirtualつけておかないとワーニング出すって設定できたよな? これはvirtualですよー、わかってますかー?って意味合いで
108 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:36:52 ] 微妙に宣言間違えて、いつの間にか別の仮想関数が作られちゃうのを防ぐ方法ってないかな。 delphiならviryualで新しく作って、overrideでオーバーライドするから間違えたらエラーになるんだがなぁ
109 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:37:37 ] virtualだな
110 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:41:27 ] override は最近の言語によく取り入れられているね。 あれはいい仕様だと思う。
111 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:18:54 ] >>107 それは余計なお世話な気もするな。コーディング規約レベルだと思う。
112 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:25:16 ] いんや。 仮想関数じゃないつもりで関数追加して泣きを見るのを防止できる。
113 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 09:07:18 ] なんにしろON/OFFできりゃいいんだよな overrideはいい仕様だ
114 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 11:38:49 ] Java みたいに問答無用で仮想関数にする言語は typo で泣くことになる。
115 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 11:52:39 ] そうした事もあって、C#では明示的にoverrideする必要になりましたとさ
116 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:19:28 ] それにならって、javaもoverrideをチェックする アノテーションが用意されました。
117 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:19:39 ] そしてC++はほったらかしと。
118 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:30:36 ] C++ は互換性を異常に気にするからな。
119 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:40:20 ] override付きのときだけチェックしてくれれば良いんだけどなぁ。その他(virtual付き/何もなし)の時は今まで通りで。
120 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:42:08 ] それはあんまり override の価値がない気が
121 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:42:41 ] override が無い時に警告出してくれるならいいけど