<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-703651151091208479</id><updated>2024-11-01T21:33:09.829+09:00</updated><title type='text'>C/C++ Programming Body of Knowledge</title><subtitle type='html'>C/C++初心者向けにプログラミングに関する技術を紹介します。&#xa;たまに、自己啓発系のネタとか...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-898968419753901752</id><published>2014-06-22T01:00:00.000+09:00</published><updated>2014-06-22T01:00:02.275+09:00</updated><title type='text'>デバッガの利用</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJedSXfwZvTlJBUM8GuDcbVO7AMuW75oAJtmE_JSkwGhndWlsbwKZ8BJElpxj6Fw6gS7adgUzTCnWWealrqbwPTIgpT-rQBAxYvi1Tro3z_Z9nnndXL-bQ9kCIkRUP7YgMgq3qc_sWKbyc/s1600/csdemo15.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJedSXfwZvTlJBUM8GuDcbVO7AMuW75oAJtmE_JSkwGhndWlsbwKZ8BJElpxj6Fw6gS7adgUzTCnWWealrqbwPTIgpT-rQBAxYvi1Tro3z_Z9nnndXL-bQ9kCIkRUP7YgMgq3qc_sWKbyc/s1600/csdemo15.png&quot; height=&quot;179&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ちょうどC#のサンプル&lt;br /&gt;
&lt;br /&gt;
プログラムで&lt;br /&gt;
&lt;br /&gt;
デバッガを使う部分が&lt;br /&gt;
&lt;br /&gt;
あったので、ご紹介。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
画像の左端の赤丸がブレイクをはっている部分です（4箇所）&lt;br /&gt;
&lt;br /&gt;
今は2番目で停止しています。（黄色矢印部分が該当）&lt;br /&gt;
&lt;br /&gt;
また、クイックウォッチという変数の値をチェックする機能もあります。&lt;br /&gt;
&lt;br /&gt;
デバッグも簡単なので、IDEはやはり便利さを感じずにはいられません。&lt;br /&gt;
&lt;br /&gt;
さて前回は、ソースプログラムを変更してデバッグする方法を紹介しました。&lt;br /&gt;
&lt;br /&gt;
これは、自力でバグを見つけ出すための方法ですが、自分で学習するための&lt;br /&gt;
&lt;br /&gt;
プログラムではいいかもしれませんが、実務でのプログラムになると&lt;br /&gt;
&lt;br /&gt;
バグの発見やソースコードの変更が非常に大変になってきます。&lt;br /&gt;
&lt;br /&gt;
そこで、ぜひ覚えておきたいのが、ツールの力を借りるということです。&lt;br /&gt;
&lt;br /&gt;
デバッグを支援するツールのことを「デバッガ」といい、コンパイラと共に&lt;br /&gt;
&lt;br /&gt;
プログラムの開発には欠かせないものです。&lt;br /&gt;
&lt;br /&gt;
ここでは、代表的なデバッガの機能を紹介します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ブレイクポイントの設定&lt;/b&gt;&lt;br /&gt;
デバッガを使えば、ソースプログラムの指定した位置でプログラムの動作を&lt;br /&gt;
&lt;br /&gt;
停止させることができます。ブレイクポイントとは、その停止位置のことです。&lt;br /&gt;
&lt;br /&gt;
ブレイクポイントを設定してプログラムを実行すると、その場所にきたときに&lt;br /&gt;
&lt;br /&gt;
プログラムが停止します。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;変数の表示と変更&lt;/b&gt;&lt;br /&gt;
ブレイクポイントでプログラムを一時停止した時に、そのときの変数の値を&lt;br /&gt;
&lt;br /&gt;
参照することができます。要は、print文で出力するのと同じですが、&lt;br /&gt;
&lt;br /&gt;
こちらの場合は、ソースプログラムを変更することなく、好きな変数の値を&lt;br /&gt;
&lt;br /&gt;
表示させることができます。また、多くのデバッガでは変数の値を直接書き換え&lt;br /&gt;
&lt;br /&gt;
その値でプログラムの実行を継続させることができます。&lt;br /&gt;
&lt;br /&gt;
ただし、演算子をオーバーロードしているような場合は、見た目の記述どおりに&lt;br /&gt;
&lt;br /&gt;
デバッガで表示できるとは限らないので注意が必要です。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ステップ実行&lt;/b&gt;&lt;br /&gt;
ソースプログラムの1行ごとに、プログラムを実行する機能です。&lt;br /&gt;
&lt;br /&gt;
この機能は、プログラムが実際にどのように動作しており、どの時点で止まって&lt;br /&gt;
&lt;br /&gt;
いるかを捉えることができるので、非常に役立ちます。&lt;br /&gt;
&lt;br /&gt;
このとき変数の値を表示させておけば、値の移り変わりを調べることができます。&lt;br /&gt;
&lt;br /&gt;
条件分岐が多いプログラムなどでは特に重宝するでしょう。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
このようにデバッガを使うと、ソースプログラムを変更するよりはるかに&lt;br /&gt;
&lt;br /&gt;
簡単で効率的にデバッグできるようになります。&lt;br /&gt;
&lt;br /&gt;
デバッガが使える環境では、積極的にデバッガを利用して&lt;br /&gt;
&lt;br /&gt;
時間と労力を節約したいものです。&lt;br /&gt;
&lt;br /&gt;
もし、IDEの開発環境が整っていれば、たいていコンパイラとデバッガの&lt;br /&gt;
&lt;br /&gt;
両方を備えているので、デバッグしやすいかもしれません。&lt;br /&gt;
&lt;br /&gt;
しかし、Linuxでコマンドラインで開発してるような場合だと、デバッガが&lt;br /&gt;
&lt;br /&gt;
用意されてなかったりとか、デバッグ版のバイナリを作成するのが&lt;br /&gt;
&lt;br /&gt;
手間がかかりすぎるという場合もあって、ログを仕込んで実機検証の&lt;br /&gt;
&lt;br /&gt;
方が早く解決できるということもあるでしょう。&lt;br /&gt;
&lt;br /&gt;
既にある環境で開発する場合が圧倒的に多いので、&lt;br /&gt;
&lt;br /&gt;
それに合わせてデバッグ手法も柔軟に変えるというのがおススメです(^^;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
人生をあるがままに受け入れない者は、悪魔に魂を売り渡す。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;シャルル・ボードレール&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
幸福になる秘訣はできるだけ多方面に関心を持つこと。そして自分が関心を&lt;br /&gt;
持つ人物や事柄に対しては、なるべく腹立たしい気持ちを示さずに、できるだけ&lt;br /&gt;
親しい気持ちで接することだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;バートランド・ラッセル&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
心は天国をつくり出すことも、地獄をつくり出すこともできる。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョン・ミルトン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
人間は、起こることよりも、起こることに対する見解によってひどく傷ついてしまう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ミシェル・エケム・ド・モンテーニュ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私たちが取り組むべき唯一最大の問題は、正しい考え方を選ぶことにある。&lt;br /&gt;
もしこれができたら、私たちの問題にはことごとく解決の道が開けていくであろう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/898968419753901752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/898968419753901752'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/06/blog-post_22.html' title='デバッガの利用'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJedSXfwZvTlJBUM8GuDcbVO7AMuW75oAJtmE_JSkwGhndWlsbwKZ8BJElpxj6Fw6gS7adgUzTCnWWealrqbwPTIgpT-rQBAxYvi1Tro3z_Z9nnndXL-bQ9kCIkRUP7YgMgq3qc_sWKbyc/s72-c/csdemo15.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-8575450831131572490</id><published>2014-06-10T03:14:00.000+09:00</published><updated>2014-06-10T03:14:23.327+09:00</updated><title type='text'>デバッグ手法について</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2S48wQmIW5m7tAisZ6qqDAoEAsZEBbFoH1A_a7zl_3rp5DPvQEoDu8j-GArAucC5FDs1qqHJNT5ziNLsKL3KVj7Yf9pJ1fOAMwpR97klhCJWk3NsL-Ndww56L3C0aTJyfsLglR9Bdr8mO/s1600/assert.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2S48wQmIW5m7tAisZ6qqDAoEAsZEBbFoH1A_a7zl_3rp5DPvQEoDu8j-GArAucC5FDs1qqHJNT5ziNLsKL3KVj7Yf9pJ1fOAMwpR97klhCJWk3NsL-Ndww56L3C0aTJyfsLglR9Bdr8mO/s1600/assert.png&quot; height=&quot;199&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
プログラムが意図したとおりに動かない時は、&lt;br /&gt;
&lt;br /&gt;
バグ（誤り）を発見し修正する「デバッグ」という&lt;br /&gt;
&lt;br /&gt;
作業を行わなければなりません。&lt;br /&gt;
&lt;br /&gt;
ちなみに、サンプルプログラムは&lt;br /&gt;
&lt;br /&gt;
全く意味のないものです(^^;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;エラーの種類&lt;/b&gt;&lt;br /&gt;
言語を問わず、プログラミングをしていてまず最初に突き当たる壁が&lt;br /&gt;
&lt;br /&gt;
コンパイルエラーです。プログラムがコンパイルできない原因は、&lt;br /&gt;
&lt;br /&gt;
文法が間違っている、コンパイル方法が正しくない、などがありますが、&lt;br /&gt;
&lt;br /&gt;
どの部分が間違っているのかはたいていコンパイラが指摘してくれます。&lt;br /&gt;
&lt;br /&gt;
ただし、コンパイラが出力するエラーメッセージは、良くも悪くも&lt;br /&gt;
&lt;br /&gt;
「流れ作業的」なので、ほんの一箇所間違いがあるだけでも、それ以降で&lt;br /&gt;
&lt;br /&gt;
整合性が取れず、エラーメッセージが多数出力されることがあります。&lt;br /&gt;
&lt;br /&gt;
エラーメッセージがたくさん表示されたとしても、間違いと関係ないものも&lt;br /&gt;
&lt;br /&gt;
ありますので、どのメッセージが本質的なものなのかを見極めることも&lt;br /&gt;
&lt;br /&gt;
必要となります。&lt;br /&gt;
&lt;br /&gt;
また、コンパイルでエラーになっていないからといって、それが正しく&lt;br /&gt;
&lt;br /&gt;
動作するかは別の話です。&lt;br /&gt;
&lt;br /&gt;
一番厄介なのは、プログラム実行中の不具合です。&lt;br /&gt;
&lt;br /&gt;
例えば、プログラムが途中で止まる、あるいは異常終了するとか&lt;br /&gt;
&lt;br /&gt;
動作は期待通りであるが、出力結果がおかしいなど、バグの種類も&lt;br /&gt;
&lt;br /&gt;
様々です。&lt;br /&gt;
&lt;br /&gt;
変数 a に5を代入は 「a = 5;」 と書きます。これを間違って「a == 5;」 と&lt;br /&gt;
&lt;br /&gt;
イコールを二つ書いたとしても、a と 5 が等しいかどうかを比較する式&lt;br /&gt;
&lt;br /&gt;
なので、文法的には正しく、コンパイルエラーにはなりません。&lt;br /&gt;
&lt;br /&gt;
しかし、a に 5 は代入されず不定値のままなので、意図した動作に&lt;br /&gt;
&lt;br /&gt;
ならないプログラムの出来上がりです(-_-;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;バグの発見&lt;/b&gt;&lt;br /&gt;
プログラムのバグを発見するには、まずソースコードをトレースするのが&lt;br /&gt;
&lt;br /&gt;
基本です。そのロジックが正しいのかを再度確認する必要があります。&lt;br /&gt;
&lt;br /&gt;
しかし、何度も見直したけどおかしいところはない、なぜ期待した結果と&lt;br /&gt;
&lt;br /&gt;
異なるのか、と意外と誤りに気付かないケースもあります。&lt;br /&gt;
&lt;br /&gt;
すぐに誰かに聞くのも一つの手ですが、まずは自分で解決するための&lt;br /&gt;
&lt;br /&gt;
方法を押さえておきたいところです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: lime;&quot;&gt;・ 処理を分割する&lt;/span&gt;&lt;br /&gt;
C++では、式や文の記述が非常に柔軟なので、かなり凝ったプログラムも&lt;br /&gt;
&lt;br /&gt;
作ることができます。ただ、そういったものは他人には分かりにくく保守性&lt;br /&gt;
&lt;br /&gt;
が悪い、いわゆる自己満足にしかならないプログラムとなる場合が多いです。&lt;br /&gt;
&lt;br /&gt;
バグの温床にもなりますので、処理や意味の単位で分割することを&lt;br /&gt;
&lt;br /&gt;
考えた方がよいでしょう。短く書こうとして、あまり一行にまとめすぎると&lt;br /&gt;
&lt;br /&gt;
どこでエラーが起きているかも分かりにくくなります。&lt;br /&gt;
&lt;br /&gt;
演算子の優先順位も間違いやすいところです。式の意味が分かりにくいとか&lt;br /&gt;
&lt;br /&gt;
優先順位がはっきりしない、などの場合は、カッコをつけたり、一度変数に&lt;br /&gt;
&lt;br /&gt;
代入すると読みやすくなるものです。&lt;br /&gt;
&lt;br /&gt;
ポインタや配列の演算、インクリメント演算子などを多用すると&lt;br /&gt;
&lt;br /&gt;
複雑になりますので、特に注意してください。&lt;br /&gt;
&lt;br /&gt;
「困難は分割せよ」です(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: lime;&quot;&gt;・ print文を挿入する&lt;/span&gt;&lt;br /&gt;
コンパイルしたプログラムを実行しただけでは、バグがあることは分かっても&lt;br /&gt;
&lt;br /&gt;
原因の特定は難しいでしょう。このような時は、トレーサとして cout あるいは&lt;br /&gt;
&lt;br /&gt;
printf を挿入して手がかりを掴めるようにします。例えば、プログラム中で&lt;br /&gt;
&lt;br /&gt;
処理を分岐しているところに、cout &amp;lt;&amp;lt; &quot;実行1&quot; &amp;lt;&amp;lt; endl; 、cout &amp;lt;&amp;lt; &quot;実行2&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
などと仕込んでおけば、そこに到達した時にメッセージが出力されますので&lt;br /&gt;
&lt;br /&gt;
どの条件でこちらの処理が行われたのかがわかるというわけです。&lt;br /&gt;
&lt;br /&gt;
また、そこで変数の値を表示するようにしておくのも非常に有効です。&lt;br /&gt;
&lt;br /&gt;
ログは本当に重要なのです(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: lime;&quot;&gt;・ 関数ごとに実行する&lt;/span&gt;&lt;br /&gt;
C++の処理の単位は関数です。関数に様々な引数を与えて、戻り値を調べれば&lt;br /&gt;
&lt;br /&gt;
その関数が正常に動作しているかが分かります。関数は様々な状況で&lt;br /&gt;
&lt;br /&gt;
呼び出されますが、デバッグしたい部分を切り出して main関数からすぐに&lt;br /&gt;
&lt;br /&gt;
実行するようなテストプログラムを作成すれば効率的です。&lt;br /&gt;
&lt;br /&gt;
ここでも「困難は分割せよ」ですね(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: lime;&quot;&gt;・ throw文を記述する&lt;/span&gt;&lt;br /&gt;
ある条件の時に意図的に例外を発生させることで、エラー箇所とエラー内容を&lt;br /&gt;
&lt;br /&gt;
特定できるかもしれません。 例外処理であるtry, catch文でエラー内容を&lt;br /&gt;
&lt;br /&gt;
取得します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: lime;&quot;&gt;・ assertマクロを記述する&lt;/span&gt;&lt;br /&gt;
assertマクロを使用すると、特定の条件が当てはまらない時に、メッセージを&lt;br /&gt;
&lt;br /&gt;
出力してプログラムを強制終了することができます。値をあらかじめ評価して&lt;br /&gt;
&lt;br /&gt;
おくことで、バグの早期発見につながります。 例えば、「assert(a == 5);」と&lt;br /&gt;
&lt;br /&gt;
書いておくと、a の値が 5 でなくなった時に 「assertion failed」というメッセージを&lt;br /&gt;
&lt;br /&gt;
出力して強制終了します。&lt;br /&gt;
&lt;br /&gt;
assertマクロを使う時は、&amp;lt;assert.h&amp;gt; のインクルードが必要です。&lt;br /&gt;
&lt;br /&gt;
上記の画像のプログラムを実行すると以下の結果になります。&lt;br /&gt;
&lt;br /&gt;
# ./test&lt;br /&gt;
&amp;nbsp;start&lt;br /&gt;
as: as.cpp:18: int main(): Assertion `a == 5&#39; failed.&lt;br /&gt;
中止&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: lime;&quot;&gt;・ 処理の流れを限定する&lt;/span&gt;&lt;br /&gt;
バグが潜んでいる箇所を特定するには、条件分岐が邪魔になることが&lt;br /&gt;
&lt;br /&gt;
あります。条件分岐は状況に応じて動作が変わるのでバグの位置が&lt;br /&gt;
&lt;br /&gt;
分かりにくくなってしまいます。このような場合は、条件分岐の条件を&lt;br /&gt;
&lt;br /&gt;
書き換えたり、どちらか片方だけを行うようにするのも一つの方法です。&lt;br /&gt;
&lt;br /&gt;
この方法は、論理的にありえないエラーケースのテストなどにも有効です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;background-color: lime;&quot;&gt;・ データ構造を推測する&lt;/span&gt;&lt;br /&gt;
時にはこれまで紹介したような方法だけでなく、推理力が&lt;br /&gt;
&lt;br /&gt;
必要になることがあります。複雑なアルゴリズムやデータ構造の&lt;br /&gt;
&lt;br /&gt;
プログラムでは、バグの箇所とは全く関係ない部分で異常な動作を&lt;br /&gt;
&lt;br /&gt;
示すこともあります。そのような場合、いくらコードを見返しても&lt;br /&gt;
&lt;br /&gt;
「ありえない」という結論にしか辿り着けません(-_-;)&lt;br /&gt;
&lt;br /&gt;
ここはひとつ、メモリがどのように使われているのかを考えてみましょう。&lt;br /&gt;
&lt;br /&gt;
また、データ構造を紙に書き出してみるというのもいいでしょう。&lt;br /&gt;
&lt;br /&gt;
配列の範囲外にアクセスしたり、ポインタが間違ったところを参照して&lt;br /&gt;
&lt;br /&gt;
いるため、突然異常終了するというのは非常によくあることです(^^;)&lt;br /&gt;
&lt;br /&gt;
ありがちだけど、発見するのが難しい厄介な問題です...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
さて、ここまでは自力で解決する方法を見てきました。&lt;br /&gt;
&lt;br /&gt;
次回は、ツールに頼るというデバッガ利用についてです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
人間は幸福を求めてこそ意味ある存在である。そしてこの幸福は、人間自身の&lt;br /&gt;
中にある。つまり自分が生存するために、毎日必要なものを満足させるところに&lt;br /&gt;
あるのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;レフト・トルストイ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
多くの人々は、どこかほかの土地へ行きさえすれば、何か他の仕事につきさえ&lt;br /&gt;
すれば、それですぐ幸福になれると考えているが、ちょっと考えものだ。だから&lt;br /&gt;
自分の今手がけていることから、出来るだけ多くの幸福を得ることだ。そして&lt;br /&gt;
幸福になる努力を、またの日まで延ばさないことだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
人間は、自分で努力して得た結果の分だけ幸福になる。ただしそのためには、&lt;br /&gt;
何が幸福な生活に必要であるか知ることだ。すなわち簡素な好み、ある程度の&lt;br /&gt;
勇気、ある程度までの自己否定、仕事に対する愛情、そして何よりも、清らかな&lt;br /&gt;
良心である。今や私は、幸福は漠然とした夢ではないと確信している。経験と&lt;br /&gt;
思考を正しく用いることにより、人間は自分自身から多くのものを引き出すことが&lt;br /&gt;
できる。決断と忍耐により、人間は自分の健康を取り戻すことすらできる。&lt;br /&gt;
だから人生をそのあるがままに生きよう。そして感謝を忘れないようにしよう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョルジュ・サンド&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8575450831131572490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8575450831131572490'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/06/blog-post.html' title='デバッグ手法について'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2S48wQmIW5m7tAisZ6qqDAoEAsZEBbFoH1A_a7zl_3rp5DPvQEoDu8j-GArAucC5FDs1qqHJNT5ziNLsKL3KVj7Yf9pJ1fOAMwpR97klhCJWk3NsL-Ndww56L3C0aTJyfsLglR9Bdr8mO/s72-c/assert.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-5824191442445124118</id><published>2014-05-31T09:50:00.001+09:00</published><updated>2014-05-31T09:50:33.005+09:00</updated><title type='text'>C++　例外</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbJ4227FqKQhj4rJZ0j_R5J46pA1y2V6yJ5NPHhJoYqkMHCygDExWR0tmf08mLZU2BhsBcCQGPp0NtIaZLbrLeUXBOXSLOkBQaMzkT42-eP0zH7vpzwB2byyF-7tRIX0HzBBowGOTnCktQ/s1600/test6.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbJ4227FqKQhj4rJZ0j_R5J46pA1y2V6yJ5NPHhJoYqkMHCygDExWR0tmf08mLZU2BhsBcCQGPp0NtIaZLbrLeUXBOXSLOkBQaMzkT42-eP0zH7vpzwB2byyF-7tRIX0HzBBowGOTnCktQ/s1600/test6.png&quot; height=&quot;199&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
コンパイル時のエラーなら、実行できないので&lt;br /&gt;
&lt;br /&gt;
修正箇所も明確です。&lt;br /&gt;
&lt;br /&gt;
しかし、コンパイルしたファイルを実行すると&lt;br /&gt;
&lt;br /&gt;
エラーになることもあります。&lt;br /&gt;
&lt;br /&gt;
この実行時エラーが、例外(Exception)です。&lt;br /&gt;
&lt;br /&gt;
例外は、ゼロ除算やメモリの2重解放、配列の範囲外アクセスなどによって&lt;br /&gt;
&lt;br /&gt;
起こります。実務では、どこで起こったのかすぐにわからないこともよくあります。&lt;br /&gt;
&lt;br /&gt;
このような例外に対応することを例外処理といいます。(^^;)&lt;br /&gt;
&lt;br /&gt;
C++には、例外処理のための仕組みが用意されています。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;try, catch文&lt;/b&gt;&lt;br /&gt;
例外が起こりそうな箇所にtry、例外処理を行う箇所にcatch文を記述します。&lt;br /&gt;
&lt;br /&gt;
構文はこのような形式になります。&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 例外が起こりそうな、ちょっと自信がないプログラム&lt;br /&gt;
}&lt;br /&gt;
catch (int &amp;amp;e) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 例外処理&lt;br /&gt;
　　// 例えば、エラーが起きたというメッセージの表示&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
実行時は、まずtry { } の中を処理し、例外が起こらなかった場合は、&lt;br /&gt;
&lt;br /&gt;
catch { } の中は実行せずに処理を継続します。&lt;br /&gt;
&lt;br /&gt;
もし、try { } の中で例外が起こった場合は、catch { } の中を&lt;br /&gt;
&lt;br /&gt;
実行して、処理継続となります。&lt;br /&gt;
&lt;br /&gt;
ここで、catchの部分に着目すると、catch (int &amp;amp;e) となっています。&lt;br /&gt;
&lt;br /&gt;
カッコの中で、例外の型（クラス名）、変数名（オブジェクト）を指定して&lt;br /&gt;
&lt;br /&gt;
どのような例外を捕捉するのかを決めることができるのです。&lt;br /&gt;
&lt;br /&gt;
それはつまり、指定を間違うと例外が発生しても catch 文を実行せず&lt;br /&gt;
&lt;br /&gt;
そのままスルーなんて事にもなる、ということです...(^^;)&lt;br /&gt;
&lt;br /&gt;
ちなみにすべての例外を受け取るには&lt;br /&gt;
&lt;br /&gt;
catch ( ... ) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 何かの例外処理&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
このように、「...」 ピリオドを3つ記述します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;throw文&lt;/b&gt;&lt;br /&gt;
処理に応じて、意図的に例外を通知させたいこともあると思います。&lt;br /&gt;
&lt;br /&gt;
その場合は、次のようにthrow文を使って例外の内容を通知できます。&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int Number;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Please Input Number : &quot;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cin &amp;gt;&amp;gt; Number;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; if (Number &amp;lt; 0) { throw -1; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Input Number : &quot; &amp;lt;&amp;lt; Number &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
catch (int error) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;負の数はエラーです。エラーコード： &quot; &amp;lt;&amp;lt; error &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
では、今回はメモリをひたすら確保し続けるサンプルコードを使い&lt;br /&gt;
&lt;br /&gt;
try, catch してみるという実験を以下に示します。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;100MBメモリ確保して、文字 &#39;a&#39; で初期化を繰り返すプログラム&lt;/b&gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;new&amp;gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// bad_allocのcatchに必要です&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; try {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 100MB確保を繰り返す&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int i = 1; ; i++) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char *pStr = new char[104857600];&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; i * 100 &amp;lt;&amp;lt; &quot;MB&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; memset(pStr, &#39;a&#39;, 104857600);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; catch (bad_alloc &amp;amp;) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;&#39;new&#39; threw an exception...&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -1;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
100MB&lt;br /&gt;
200MB&lt;br /&gt;
&#39;new&#39; threw an exception...&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
ただメモリを確保しただけだと、OSには実際は使っていない&lt;br /&gt;
&lt;br /&gt;
ということが分かっているので仮想メモリを駆使して実メモリ以上を&lt;br /&gt;
&lt;br /&gt;
確保しているように見えます。手元の環境では、3000MBまで到達(^^;)&lt;br /&gt;
&lt;br /&gt;
そのため、memsetで初期化することで、使用していることをアピールします。&lt;br /&gt;
&lt;br /&gt;
非力なマシンなので、すぐに力尽きてしまいました...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
結局、何が言いたいのかというと、例外処理はバグの早期発見に役立つ、&lt;br /&gt;
&lt;br /&gt;
品質の良いプログラムを作るための一機能であるということです。(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
時の与えるあらゆる利益を迅速に利用せよ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ウィリアム・シェイクスピア&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
過去の過ちから役に立つ教訓を引き出すためと、高価な代償を払って得た利益を&lt;br /&gt;
得るためでない限り、決して過去を顧みるな。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョージ・ワシントン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
憎しみは、他のどんなものよりもエネルギーを消耗する。その消耗のひどさは、&lt;br /&gt;
重労働よりも病気よりも、ちゃんと理由があって心配する場合よりも、はるかに&lt;br /&gt;
はなはだしい。だから憎しみの炎が自分の体の中へ入ってきたら、すぐさま&lt;br /&gt;
消すことだ。その代わりに美しい考えを入れてやろう。我々の精力は神から&lt;br /&gt;
授かった貴重なものだから、価値のある者だけに費やさねばならぬ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5824191442445124118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5824191442445124118'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/05/c_31.html' title='C++　例外'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbJ4227FqKQhj4rJZ0j_R5J46pA1y2V6yJ5NPHhJoYqkMHCygDExWR0tmf08mLZU2BhsBcCQGPp0NtIaZLbrLeUXBOXSLOkBQaMzkT42-eP0zH7vpzwB2byyF-7tRIX0HzBBowGOTnCktQ/s72-c/test6.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-5513511012907220152</id><published>2014-05-17T13:16:00.002+09:00</published><updated>2014-05-17T13:16:39.883+09:00</updated><title type='text'>C++　ヘッダファイルの記述方法</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjujNpJSXh_7y_SHIwEuCPtgXsRQtSPCtKFBjPfz3FgGkvtGQ8i-9ST4zPTBQaETyHcywx-00IS3wKUdMDfbl3d7ZU8kcvFKRRp4GriT1NELw_acIL3XRQfAMoGehHnmQ9lKVMo_ewTGlR-/s1600/test5.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjujNpJSXh_7y_SHIwEuCPtgXsRQtSPCtKFBjPfz3FgGkvtGQ8i-9ST4zPTBQaETyHcywx-00IS3wKUdMDfbl3d7ZU8kcvFKRRp4GriT1NELw_acIL3XRQfAMoGehHnmQ9lKVMo_ewTGlR-/s1600/test5.png&quot; height=&quot;200&quot; width=&quot;199&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今日は、ヘッダファイルの書き方について&lt;br /&gt;
&lt;br /&gt;
の話になります。&lt;br /&gt;
&lt;br /&gt;
今までは、短いサンプルということもあり、&lt;br /&gt;
&lt;br /&gt;
一つのソースファイル(.cpp)の中に&lt;br /&gt;
&lt;br /&gt;
クラスの定義を記述していました。&lt;br /&gt;
&lt;br /&gt;
しかし、普通はクラスの定義はヘッダファイル(.h)に&lt;br /&gt;
&lt;br /&gt;
記述し、メンバ関数の定義をソースファイル(.cpp)に記述します。&lt;br /&gt;
&lt;br /&gt;
つまり、画像の例でいうと、Peach.h にこれを書いて、&lt;br /&gt;
&lt;br /&gt;
class PeachBox {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; PeachBox();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ~PeachBox();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetTotal();&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_total;&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Peach.cpp にはこれを書きます。&lt;br /&gt;
&lt;br /&gt;
PeachBox::PeachBox():&lt;br /&gt;
m_total(0)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PeachBox::~PeachBox()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std::cout &amp;lt;&amp;lt; &quot;桃の化粧箱オブジェクトが終了します。&quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int PeachBox::GetTotal()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; PeachBox myPeachBox;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; std::cout &amp;lt;&amp;lt; &quot;化粧箱の中の桃の数は&quot; &amp;lt;&amp;lt; myPeachBox.GetTotal() &amp;lt;&amp;lt; &quot;個です。&quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
さて、このようにヘッダファイルとソースファイルを分割したことによって、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
例えばFood.hといった他のヘッダファイルでPeach.hをインクルードする、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
あるいは Peach.cpp から&amp;nbsp;Food.h&amp;nbsp;をインクルードするといった、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
少し規模が大きいプログラムでも便利に使えるようになります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
しかし、色々なファイルで #include を使っていると、結果的には同じヘッダファイルを&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
2度インクルードしてしまうこともあります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
この場合は、クラスを2度定義することになり、コンパイルエラーになります(-_-;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
試しにPeach.h では　Food.h をインクルードしてみます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
#include &quot;Food.h&quot;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
class PeachBox {&lt;/div&gt;
&lt;div&gt;
public:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; PeachBox();&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; ~PeachBox();&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int GetTotal();&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
：&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
そして、Peach.cppを、こんな感じに変更します。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
#include &amp;lt;iostream&amp;gt;&lt;/div&gt;
&lt;div&gt;
#include &quot;Food.h&quot;&lt;/div&gt;
&lt;div&gt;
#include &quot;Peach.h&quot;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
PeachBox::PeachBox():&lt;/div&gt;
&lt;div&gt;
m_total(0)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
：&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
実際やってみると、Food.hを2回インクルードしているので、もちろんエラーです(^^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ちなみに、Peach.h Peach.cpp は同じディレクトリにあるので&lt;br /&gt;
&lt;br /&gt;
これでコンパイルできています。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
# g++ -g -Wall -o Peach Peach.cpp&lt;/div&gt;
&lt;div&gt;
In file included from Peach.h:1:0,&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;from Peach.cpp:3:&lt;/div&gt;
&lt;div&gt;
Food.h:4:7: error: redefinition of ‘class Food’&lt;/div&gt;
&lt;div&gt;
Food.h:4:7: error: previous definition of ‘class Food’&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
こういう時のために、重複インクルードを防ぐための&lt;br /&gt;
&lt;br /&gt;
#ifndef マクロ というプリプロセッサ命令があります(^^)&lt;br /&gt;
&lt;br /&gt;
プリプロセッサとは、コンパイラに対してコンパイルする前に、&lt;br /&gt;
&lt;br /&gt;
事前処理を行わせるためのプログラムのことです。&lt;br /&gt;
&lt;br /&gt;
言葉だけでは、伝わらないので実際に使ってみます。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Food.h&lt;/b&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;ifndef __FOOD_H　　// もし、__FOOD_Hが未定義なら&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;#define __FOOD_H &amp;nbsp;//&amp;nbsp;最初のインクルードで__FOOD_Hを定義します&lt;/span&gt;&lt;br /&gt;
　　　　　　　　　　　 &amp;nbsp;// こうすることで、2回目以降は既に__FOOD_Hが&lt;br /&gt;
　　　　　　　　　　　　// 定義されているので、この内容は&lt;br /&gt;
　　　　　　　　　　　　// インクルードされなくなります(*^^)v&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; static double sm_tax;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;#endif // __FOOD_H &amp;nbsp;←通常、目印としてコメントを記述しておきます&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Peach.h&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;color: blue;&quot;&gt;#ifndef __PEACH_H&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: blue;&quot;&gt;#define __PEACH_H&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
#include &quot;Food.h&quot;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
class PeachBox {&lt;/div&gt;
&lt;div&gt;
public:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; PeachBox();&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; ~PeachBox();&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int GetTotal();&lt;/div&gt;
&lt;div&gt;
private:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int m_total;&lt;/div&gt;
&lt;div&gt;
};&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: blue;&quot;&gt;#endif // __PEACH_H&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;Peach.cpp&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
#include &amp;lt;iostream&amp;gt;&lt;/div&gt;
&lt;div&gt;
#include &quot;Food.h&quot;&lt;/div&gt;
&lt;div&gt;
#include &quot;Peach.h&quot;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
PeachBox::PeachBox():&lt;/div&gt;
&lt;div&gt;
m_total(12)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
PeachBox::~PeachBox()&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; std::cout &amp;lt;&amp;lt; &quot;桃の化粧箱オブジェクトが終了します。&quot; &amp;lt;&amp;lt; std::endl;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int PeachBox::GetTotal()&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return m_total;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; PeachBox myPeachBox;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; std::cout &amp;lt;&amp;lt; &quot;化粧箱の中の桃の数は&quot; &amp;lt;&amp;lt; myPeachBox.GetTotal() &amp;lt;&amp;lt; &quot;個です。&quot; &amp;lt;&amp;lt; std::endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;コンパイルと実行結果&lt;/b&gt;&lt;br /&gt;
# g++ -g -Wall -o Peach Peach.cpp&lt;br /&gt;
# ./Peach&lt;br /&gt;
化粧箱の中の桃の数は12個です。&lt;br /&gt;
桃の化粧箱オブジェクトが終了します。&lt;br /&gt;
&lt;br /&gt;
2重インクルードしているにもかかわらず、エラーにならず実行できました。&lt;br /&gt;
&lt;br /&gt;
ただ Food.cpp を作成してメンバ関数を定義していないし、&lt;br /&gt;
&lt;br /&gt;
Peach.cpp 内で使ってもいないので、&lt;br /&gt;
&lt;br /&gt;
Food.h をインクルードする必要のない、&lt;br /&gt;
&lt;br /&gt;
例によって全くおもしろみもないプログラムです...(^^;)&lt;br /&gt;
&lt;br /&gt;
ここでは、重複インクルード防止のための方法として、&lt;br /&gt;
&lt;br /&gt;
#ifndef, #define, #endif という構文を見てきました。&lt;br /&gt;
&lt;br /&gt;
プリプロセッサを使いこなして、品質の良いプログラムを造っていきたいものです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
子供には過去も未来もない、だから現在を楽しむ - 大人はとてもそうはいかない。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジャン・ド・ラ・ブリュイエール&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
明日をはじめる前に今日をすっかり終える。今日と明日との間に眠りの壁を置く。&lt;br /&gt;
これをやり遂げるには、節制の心がけが必要だ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ラルフ・ワルド・エマーソン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ある者は過去の記憶を蒸し返して、我と我が身を苛み続ける。&lt;br /&gt;
ある者はまだ見ぬ罪におびえて、我と我が身を傷つける。&lt;br /&gt;
どちらも愚かきわまることだ。 - 過去はもはや関係がなく、未来はまだ来ぬ・・・。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;セネカ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
時の真の価値を知れ。引っ掴め。押さえつけろ。そしてその瞬間瞬間を楽しめ。&lt;br /&gt;
怠けず、だらけず、ぐずぐずするな。今日できることを明日まで伸ばすな。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;チェスターフィールド卿&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5513511012907220152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5513511012907220152'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/05/c.html' title='C++　ヘッダファイルの記述方法'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjujNpJSXh_7y_SHIwEuCPtgXsRQtSPCtKFBjPfz3FgGkvtGQ8i-9ST4zPTBQaETyHcywx-00IS3wKUdMDfbl3d7ZU8kcvFKRRp4GriT1NELw_acIL3XRQfAMoGehHnmQ9lKVMo_ewTGlR-/s72-c/test5.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-8701335881029480811</id><published>2014-04-26T04:55:00.000+09:00</published><updated>2014-04-26T04:55:51.704+09:00</updated><title type='text'>C++  キャスト演算子</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbznmEEuforxHerY1ZNa6-m7_SSELOQSoEJrxal_hm1iOXBv9gFs-lWA9K5rZaGGJNV9yHnmUh0aifH7Fn2VtSlHmmQRs1WenRnEVV0tGzGfUrXv0IOgn3UDduiyx89GUgbykI5voozoOS/s1600/test5.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbznmEEuforxHerY1ZNa6-m7_SSELOQSoEJrxal_hm1iOXBv9gFs-lWA9K5rZaGGJNV9yHnmUh0aifH7Fn2VtSlHmmQRs1WenRnEVV0tGzGfUrXv0IOgn3UDduiyx89GUgbykI5voozoOS/s1600/test5.png&quot; height=&quot;200&quot; width=&quot;172&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
もはやメモリが少なくとも８Gは&lt;br /&gt;
&lt;br /&gt;
必要な時代が来ているのかもしれません。&lt;br /&gt;
&lt;br /&gt;
起動しただけで２G以上使っており、&lt;br /&gt;
&lt;br /&gt;
何か作業をしようとプログラムを起動するにも&lt;br /&gt;
&lt;br /&gt;
あまりにモッサリした動きになるので&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
システムのパフォーマンスオプションをパフォーマンスを優先するにしてみました。&lt;br /&gt;
&lt;br /&gt;
ただ４G程度では、まだ足りないというのか...&lt;br /&gt;
&lt;br /&gt;
こういうのは、思い至った時は大抵高いのが嫌なところ。&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;a href=&quot;http://px.moba8.net/svt/ejp?a8mat=25TIJM+8ZVTV6+IXO+BWGDT&amp;amp;a8ejpredirect=http%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB00I5MZYM4%2F%3Ftag%3Dmoba8-affi-13211-22&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://ecx.images-amazon.com/images/I/61s0pIizriL._SS80_.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://www12.moba8.net/0.jpg?a8mat=25TIJM+8ZVTV6+IXO+BWGDT&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;a href=&quot;http://px.moba8.net/svt/ejp?a8mat=25TIJM+8ZVTV6+IXO+BWGDT&amp;amp;a8ejpredirect=http%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB00I5MZYM4%2F%3Ftag%3Dmoba8-affi-13211-22&quot; target=&quot;_blank&quot;&gt;Komputerbay 8GB (2x 4GB) DDR3 SODIMM (204 pin) 1333Mhz PC3 10600 8 GB (9-9-9-24)&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
今時期は安くてもこの程度か...&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
6K位まで落ちれば、買ってもいいと思うかもしれない。&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
さて、今回はキャストの話です。(^_^;)&lt;/div&gt;
&lt;div style=&quot;margin: 0; padding: 0;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://www11.moba8.net/0.jpg?a8mat=25TIJM+8ZVTV6+IXO+BWGDT&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;C では、値や変数を特定の型に変換したい時は、次のようにしていました。&lt;br /&gt;
&lt;br /&gt;
// とあるスレッド関数&lt;br /&gt;
void *something_thread_func( void *arg ) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 引数をとある構造体にキャスト&lt;br /&gt;
&amp;nbsp; &amp;nbsp; something_struct_t *pSomeStruct = (something_struct_t *)arg;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
C++ では、このようなキャストを行ってもエラーにはなりませんが、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
できるだけ C++ で追加したキャスト演算子を使うようにしたいものです。(^_^)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
これらのキャスト演算子は、ポインタ型や参照型を、別の型に変換します。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
※ここでは、 V という型を T型に変換することを意味しています。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
const_cast&amp;lt;T&amp;gt;(V) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const を取り除くのに使います。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
dynamic_cast&amp;lt;T&amp;gt;(V) &amp;nbsp; &amp;nbsp; &amp;nbsp;基底クラスのポインタ(あるいは参照）を派生クラスの&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ポインタ（あるいは参照）に変換するのに使います。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
static_cast&amp;lt;T&amp;gt;(V) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;C のキャストに近い使い方ができます。&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　 &amp;nbsp; &amp;nbsp; const は取り除くことはできません。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
reinterpret_cast&amp;lt;T&amp;gt;(V)　 関数ポインタを別の関数のポインタへ変換したり&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　ポインタをint型などへ変換するときに使います。&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　全く違う型へキャストした場合は不正アクセスを&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　引き起こしやすいため、注意が必要です。&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　どうしても必要なときだけ使うようにした方が良いでしょう。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
そして、先程の例をキャストすると、こうなります。(^_^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
// とあるスレッド関数2回目&lt;br /&gt;
void *something_thread_func( void *arg ) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 引数をとある構造体にキャストした2回目&lt;br /&gt;
&amp;nbsp; &amp;nbsp; something_struct_t *pSomeStruct = static_cast&amp;lt;something_struct_t&amp;gt;(arg);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
このように、C++ のキャスト演算子を使うと、間違ったキャストをした場合に&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
コンパイルエラーになります(´・ω・｀)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
そのため、C の書き方よりも安全なキャストとなります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
また、_cast が付いているので、キャストした場所がわかりやすくなります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
grep で探すときも便利ですね(^_^)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
もし「時」がこの世で最も貴重なものだとすれば、時の浪費ほど大きな浪費は&lt;/div&gt;
&lt;div&gt;
あるまい。失われた時は二度と帰らないからだ。時はいくらあっても十分では&lt;/div&gt;
&lt;div&gt;
ないのが常だから、やるべきことはさっさと行おう。価値あることを行おう。&lt;/div&gt;
&lt;div&gt;
精を出してことに当たれば、これまでよりてきぱきとやれるはずだ。&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ベンジャミン・フランクリン&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
私は明日を恐れない。なぜなら私は、昨日を知ったし今日を愛しているからだ。&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ウィリアム・アレン・ホワイト&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
君の毎分毎分を大切にすることをおすすめする。時間のほうは時間が自分で&lt;/div&gt;
&lt;div&gt;
世話をするだろうから。&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;チェスターフィールド卿&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
一度に一歩ずつ登れば、高い山でも踏破できる。&lt;/div&gt;
&lt;div&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョン・ワナメーカー&lt;/b&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8701335881029480811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8701335881029480811'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/04/c_26.html' title='C++  キャスト演算子'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbznmEEuforxHerY1ZNa6-m7_SSELOQSoEJrxal_hm1iOXBv9gFs-lWA9K5rZaGGJNV9yHnmUh0aifH7Fn2VtSlHmmQRs1WenRnEVV0tGzGfUrXv0IOgn3UDduiyx89GUgbykI5voozoOS/s72-c/test5.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-2154852365808763036</id><published>2014-04-10T23:24:00.001+09:00</published><updated>2014-04-10T23:24:42.096+09:00</updated><title type='text'>C++　代入演算子のオーバーロード</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDdd65QcHBYWrD9D7imUmI7kqUnOpJkGi8vZ4K9nBvhGHeUJJ9GjmYw2fSqvVvZPdAYngg7-uMFFZf3vFnGZpcCk5W5CTd2_7XQgCGIjo1SQSHfPgYLwYkGkx9hlmtlvBkvt8rkho-GwEm/s1600/test.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDdd65QcHBYWrD9D7imUmI7kqUnOpJkGi8vZ4K9nBvhGHeUJJ9GjmYw2fSqvVvZPdAYngg7-uMFFZf3vFnGZpcCk5W5CTd2_7XQgCGIjo1SQSHfPgYLwYkGkx9hlmtlvBkvt8rkho-GwEm/s1600/test.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
前回の演算子のオーバーロードに続いて、&lt;br /&gt;
&lt;br /&gt;
今度は代入演算子をオーバーロードします。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
operator= ()関数は、オブジェクト同士の代入が行われたときに呼び出されますが、&lt;br /&gt;
&lt;br /&gt;
演算子のオーバーロードと同様に、operator= ()関数をオーバーロードして&lt;br /&gt;
&lt;br /&gt;
クラスを代入する新しい　= (代入演算子)を定義してみます。&lt;br /&gt;
&lt;br /&gt;
では、さっそくサンプルプログラムです。&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Person {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Person() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_StrName = NULL;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Person(char *StrName) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 勝手に128文字までに制限&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int nLen = strnlen(StrName, 128);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_StrName = new char[nLen + 1];&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; strncpy(m_StrName, StrName, nLen + 1);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ~Person() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (m_StrName != NULL) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete [] m_StrName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_StrName = NULL;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Person &amp;amp; operator=(const Person &amp;amp; Psn);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char *GetPersonName() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return m_StrName;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char *m_StrName;&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
// 代入演算子のオーバーロード&lt;/div&gt;
&lt;div&gt;
Person &amp;amp; Person::operator=(const Person &amp;amp;Psn)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; // 自分自身の代入では、何もしない&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; if (this == &amp;amp;Psn) return *this;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; // それまでのメモリを解放&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; if (m_StrName != NULL) {&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; delete [] m_StrName;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_StrName = NULL;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; // 新しくメモリを確保して、文字列をコピーする&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; // やはりここでも128文字制限&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int nLen = strnlen(Psn.m_StrName, 128);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; m_StrName = new char[nLen + 1];&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; strncpy(m_StrName, Psn.m_StrName, nLen + 1);&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return *this;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Person Psn1((char *)&quot;ABCDEFG&quot;);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Person Psn2((char *)&quot;TUVWXYZ&quot;);&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; Psn1.GetPersonName() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; Psn2.GetPersonName() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; // 代入する　&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Psn1 = Psn2;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;---&quot; &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; Psn1.GetPersonName() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; Psn2.GetPersonName() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
# ./test&lt;/div&gt;
&lt;div&gt;
ABCDEFG&lt;/div&gt;
&lt;div&gt;
TUVWXYZ&lt;/div&gt;
&lt;div&gt;
---&lt;/div&gt;
&lt;div&gt;
TUVWXYZ&lt;/div&gt;
&lt;div&gt;
TUVWXYZ&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
ABCDEFGという名前が代入によってTUVWXYZに変わったという&lt;br /&gt;
例によって、あまりおもしろくないプログラムです。(^_^;)&lt;br /&gt;
&lt;br /&gt;
ただ、デフォルトのoperator= ()ではメモリ確保などは行われないため&lt;br /&gt;
一応独自の動作が定義できています。&lt;br /&gt;
&lt;br /&gt;
代入のところでは、Psn1オブジェクトのoperator= () が呼ばれ、&lt;br /&gt;
Psn2オブジェクトが引数に入るという動きになっています。&lt;br /&gt;
&lt;br /&gt;
そしてoperator= ()が自分自身を返すのは、Psn1 = Psn2 という式が&lt;br /&gt;
さらに代入される場合があることを考慮しているからです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ところで、Person Psn3 = Psn2; のようなオブジェクト生成時の&lt;br /&gt;
初期化の場合は、コピーコンストラクタが呼ばれます。&lt;br /&gt;
似ているので注意しておきたいところです。(^_^;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
常に現在の時間にしっかりしがみつけ。刻一刻すぎていく時間には、無限の価値がある。&lt;br /&gt;
私は現在に自己の全てを賭けている。一枚のトランプに人が大金をかけるように。&lt;br /&gt;
私は現在をそっくりそのままで、できるだけ高価なものにしようと努力しているのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヨハン・ウォルフガング・フォン・ゲーテ&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
今ここで征服できない時間は、永久に征服できない。今ここで楽しめない人生は、&lt;br /&gt;
永久に楽しめない。今ここで賢明な生活を送らなければ、永久に賢明な生活は&lt;br /&gt;
できない。過去はもはや存在せず、未来は誰にも分からないのだから。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デイヴィッド・グレイソン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
もし、悩みに関して古今の大哲学者が書いた言葉の全てを要約すれば、次の&lt;br /&gt;
二句に尽きる。&lt;br /&gt;
「橋のたもとに行き着くまでは橋を渡るな」、「覆水盆に返らず」&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ありていに言えば、現在に生きる者はごく少ない。誰も彼も、現在以外の時に&lt;br /&gt;
生きるつもりなのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョナサン・スウィフト&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2154852365808763036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2154852365808763036'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/04/c_10.html' title='C++　代入演算子のオーバーロード'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDdd65QcHBYWrD9D7imUmI7kqUnOpJkGi8vZ4K9nBvhGHeUJJ9GjmYw2fSqvVvZPdAYngg7-uMFFZf3vFnGZpcCk5W5CTd2_7XQgCGIjo1SQSHfPgYLwYkGkx9hlmtlvBkvt8rkho-GwEm/s72-c/test.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-848732896271466427</id><published>2014-04-01T23:43:00.000+09:00</published><updated>2014-04-01T23:43:00.742+09:00</updated><title type='text'>C++　演算子のオーバーロード</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXDTeaVE4GOjY1xRwxhNQrIIUJgJjIGMQHEgDyjV12qxKrdD5X3I_Ij_ZZazYTUOjvEUQJ3lWtcD6aCBoByUDHnWWVfzS6OlXCJU8ZjTUMQ1etS_sReb48DWcSB7DAnnEKYa4iBjO5tJGG/s1600/cpptest.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXDTeaVE4GOjY1xRwxhNQrIIUJgJjIGMQHEgDyjV12qxKrdD5X3I_Ij_ZZazYTUOjvEUQJ3lWtcD6aCBoByUDHnWWVfzS6OlXCJU8ZjTUMQ1etS_sReb48DWcSB7DAnnEKYa4iBjO5tJGG/s1600/cpptest.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
演算子をオーバーロードすると、クラスごとに&lt;br /&gt;
&lt;br /&gt;
演算子の機能を定義できるようになります(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
因みにオーバーロードは、日本語で書くと&lt;br /&gt;
&lt;br /&gt;
多重定義です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一方、言葉が似ているため、とても間違いやすく混同しがちなオーバーライドは&lt;br /&gt;
&lt;br /&gt;
機能の上書き、あるいは再定義となります。(^^;)&lt;br /&gt;
&lt;br /&gt;
何度も繰り返し唱えて、覚えてしまいたいものです...(^^ゞ&lt;br /&gt;
&lt;br /&gt;
さて、演算子のオーバーロードですがC++では、&amp;nbsp;+ や - といった既にある&lt;br /&gt;
&lt;br /&gt;
演算子に対して、独自の機能を定義することができます。&lt;br /&gt;
&lt;br /&gt;
使いどころとしては、単純に四則演算しただけでは期待する結果に&lt;br /&gt;
&lt;br /&gt;
ならないだとか、２つ以上のあるデータの組に対して演算を行いたい場合&lt;br /&gt;
&lt;br /&gt;
などが当てはまるでしょう(^^)&lt;br /&gt;
&lt;br /&gt;
ここでは、+演算子をオーバーロードして、オブジェクト同士の加算を&lt;br /&gt;
&lt;br /&gt;
行ってみたいと思います。　&lt;br /&gt;
&lt;br /&gt;
時刻の加算結果を求めるサンプルです。&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class ClockTime {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ClockTime() {};&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ClockTime(int nHour, int nMinute) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_nHour = nHour;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_nMinute = nMinute;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ClockTime operator+ (const ClockTime &amp;amp;Ct2);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_nHour;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_nMinute;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// +演算子のオーバーロード&lt;br /&gt;
ClockTime ClockTime::operator+ (const ClockTime &amp;amp;Ct)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int nHourBuf = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int nMinuteBuf = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int nTotal = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nTotal = (m_nHour * 60 + m_nMinute) + (Ct.m_nHour * 60 + Ct.m_nMinute);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nHourBuf = nTotal / 60;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nMinuteBuf = nTotal % 60;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 自分自身と同じクラスのオブジェクトを戻す&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return ClockTime(nHourBuf, nMinuteBuf);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ClockTime Ct1(1, 23); &amp;nbsp;// 1時間23分&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ClockTime Ct2(4, 56); &amp;nbsp;// 4時間56分&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ClockTime Ct3;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // オブジェクト同士を加算&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Ct3 = Ct1 + Ct2;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // この例で期待通りとなる値は 6時間19分&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; Ct3.m_nHour &amp;lt;&amp;lt; &quot;時間 &quot; &amp;lt;&amp;lt; Ct3.m_nMinute &amp;lt;&amp;lt; &quot;分&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
6時間 19分&lt;br /&gt;
&lt;br /&gt;
いつものようにたいしておもしろくないプログラムですが、&lt;br /&gt;
&lt;br /&gt;
期待通りの結果となりました。(^_^;)&lt;br /&gt;
&lt;br /&gt;
ClockTimeクラスの中で、 operator+() 関数を定義しているため&lt;br /&gt;
&lt;br /&gt;
Ct3 = Ct1&amp;nbsp;+ Ct2; の式での&amp;nbsp;+ は、Ct1オブジェクトの operator+()が&lt;br /&gt;
&lt;br /&gt;
呼ばれるようになります。&lt;br /&gt;
&lt;br /&gt;
また、ClockTime ClockTime::operator+ (const ClockTime &amp;amp;Ct) の&lt;br /&gt;
&lt;br /&gt;
引数として渡されるているのが、Ct2オブジェクトとなっています。&lt;br /&gt;
&lt;br /&gt;
結果、時刻を加算するという +演算子のオーバーロードができました(^_^;)&lt;br /&gt;
&lt;br /&gt;
ちなみに、 -演算子では operator-()関数をオーバーロードします。&lt;br /&gt;
&lt;br /&gt;
*, / といった他も同様です。&lt;br /&gt;
&lt;br /&gt;
オブジェクト指向の素晴らしさを垣間見ることができますね。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;今日の名言&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
現在の一瞬はこのうえなく素晴らしい一瞬である。今、夕食に５分遅れることは、&lt;br /&gt;
十年間の大きな悲しみより重要である。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;サミュエル・バトラー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
いくら苦しくても現実をしっかり見つめることだ。目標をしっかり定める。&lt;br /&gt;
いったん目標が定まったら、ありとあらゆる時間をその実現のために&lt;br /&gt;
注ぎ込む。自分の決心が正しいかどうか心配して、貴重な時間を浪費&lt;br /&gt;
するな。あくまでやり通せ！&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
過ぎ去りし麗しき一日は、再び我がもとに帰り来たらず。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;アルフレッド・テニソン卿&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
我々はここにいる。そしてそれは今だ。それより先のことについての人間の&lt;br /&gt;
知識は、すべて月光のごとくとりとめがない。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヘンリー・L・メンケン&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/848732896271466427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/848732896271466427'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/04/c.html' title='C++　演算子のオーバーロード'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXDTeaVE4GOjY1xRwxhNQrIIUJgJjIGMQHEgDyjV12qxKrdD5X3I_Ij_ZZazYTUOjvEUQJ3lWtcD6aCBoByUDHnWWVfzS6OlXCJU8ZjTUMQ1etS_sReb48DWcSB7DAnnEKYa4iBjO5tJGG/s72-c/cpptest.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-3235408557917873851</id><published>2014-03-21T00:46:00.000+09:00</published><updated>2014-03-21T00:46:15.151+09:00</updated><title type='text'>C++　標準テンプレートライブラリ  其の弐(2/2)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAtzU1HJrtQ0GazlLDz0MKAMfnoi8YFE3TIFqB7utsRrTEahAdNFRdeazfk9XRUSxm4gVrFZcImI1oac9T-wnjJDsepniRBHTxiLNTbUL2rmvOV25B9I8-xN7P2dmsrA9fF0TuL0xqmXA2/s1600/test4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAtzU1HJrtQ0GazlLDz0MKAMfnoi8YFE3TIFqB7utsRrTEahAdNFRdeazfk9XRUSxm4gVrFZcImI1oac9T-wnjJDsepniRBHTxiLNTbUL2rmvOV25B9I8-xN7P2dmsrA9fF0TuL0xqmXA2/s1600/test4.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
第二弾は、イテレータ(反復子)の話です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
イテレータとは、コンテナオブジェクトにある&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;iterator クラスのオブジェクトで&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
これを使うと、コンテナオブジェクトの中のデータに同じように&lt;br /&gt;
&lt;br /&gt;
アクセスできるようになります(^^;)&lt;br /&gt;
&lt;br /&gt;
つまり、配列でもリストでも同じアクセス方法になる、ということです。&lt;br /&gt;
&lt;br /&gt;
iterator オブジェクトは、各コンテナオブジェクト用のものがあり、&lt;br /&gt;
&lt;br /&gt;
その中の１つの要素を指します。&lt;br /&gt;
&lt;br /&gt;
では、いつものようにサンプルプログラムです。&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; vector&amp;lt;int&amp;gt; nVec;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nVec.push_back(5);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nVec.push_back(10);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nVec.push_back(15);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nVec.push_back(20);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // vectorクラスでイテレータを使う場合の宣言方法に注目&lt;br /&gt;
&amp;nbsp; &amp;nbsp; vector&amp;lt;int&amp;gt;::iterator itr_first, itr_last, i;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; itr_first = nVec.begin(); &amp;nbsp;// 最初の要素をイテレータに代入&lt;br /&gt;
&amp;nbsp; &amp;nbsp; itr_last = nVec.end(); &amp;nbsp; &amp;nbsp; // 最後の要素をイテレータに代入&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;要素数は &quot; &amp;lt;&amp;lt; (int)nVec.size() &amp;lt;&amp;lt; &quot; です。&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;すべて出力してみます。&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 要素を取り出すのにイテレータでカウンタを操作&lt;br /&gt;
&amp;nbsp; &amp;nbsp; for (i = itr_first; i != itr_last; i++) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; *i &amp;lt;&amp;lt; endl; &amp;nbsp; &amp;nbsp;// イテレータから値を参照しています。&lt;br /&gt;
&amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ポインタのようですね(^^;)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
要素数は 4 です。&lt;br /&gt;
すべて出力してみます。&lt;br /&gt;
5&lt;br /&gt;
10&lt;br /&gt;
15&lt;br /&gt;
20&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
このように、ちょっと使うだけでもSTLの素晴らしさが分かります(^^)&lt;br /&gt;
&lt;br /&gt;
開発を効率化する便利なものはどんどん使ってものです...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
一年前にあなたが悩んでいた事柄を思い出していただきたい。どうやってそれを&lt;br /&gt;
切り抜けただろうか。そうした悩み事ばかり気にかけて、エネルギーを&lt;br /&gt;
浪費しなかっただろうか。結局そうした悩みは、ほとんどが取り越し苦労だった&lt;br /&gt;
のではないか？&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
今日行いたい善行があれば、すぐに実行せよ。決して明日まで延ばすな。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジェフリー・チョーサー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
現在我々が経験している時間と状況は、それまでの時間と状況が積もり積もって&lt;br /&gt;
出来た結果である。これは大自然がこれまでに振り出した、あるいは&lt;br /&gt;
振り出すことのできる、最上の賽の目である。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ラルフ・ワルド・エマーソン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
何より大事なことだが、我々は現在にしか生きられないのだ。過去を顧み、&lt;br /&gt;
人生の一瞬たりとも無為に過ごしたことはなかったと言いきれる者は、&lt;br /&gt;
最も幸福な人間である。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヘンリー・デイヴィッド・ソロー&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/3235408557917873851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/3235408557917873851'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/03/c-22.html' title='C++　標準テンプレートライブラリ  其の弐(2/2)'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAtzU1HJrtQ0GazlLDz0MKAMfnoi8YFE3TIFqB7utsRrTEahAdNFRdeazfk9XRUSxm4gVrFZcImI1oac9T-wnjJDsepniRBHTxiLNTbUL2rmvOV25B9I8-xN7P2dmsrA9fF0TuL0xqmXA2/s72-c/test4.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-5995288577220343954</id><published>2014-03-14T01:38:00.000+09:00</published><updated>2014-03-14T01:38:40.428+09:00</updated><title type='text'>C++　標準テンプレートライブラリ　其の壱(1/2)</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKCc_jNpFZJQM0DPN04lKub5M2YwpyUEJdS-LQzrOsV9xNJJ3y_mM9xbGytrRZzk6Ji4QJKar_ZqeM2M84E7jWX5ptqbeOHf-liwCDrrxy2xOfscG7H1ZnBfh8JAIVobRMNoBATukM3Kax/s1600/test3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKCc_jNpFZJQM0DPN04lKub5M2YwpyUEJdS-LQzrOsV9xNJJ3y_mM9xbGytrRZzk6Ji4QJKar_ZqeM2M84E7jWX5ptqbeOHf-liwCDrrxy2xOfscG7H1ZnBfh8JAIVobRMNoBATukM3Kax/s1600/test3.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回はC++の標準テンプレートライブラリ&lt;br /&gt;
&lt;br /&gt;
Standard Template Library についての話です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
標準テンプレートライブラリとは、配列、リスト、キューのような複数のデータを&lt;br /&gt;
&lt;br /&gt;
管理したい場合に、その実装に頭を悩ませることなしに利用できる&lt;br /&gt;
&lt;br /&gt;
大変便利なクラスやアルゴリズムの集合です。(^^)&lt;br /&gt;
&lt;br /&gt;
また、複数のデータを格納して管理するオブジェクトのことを&lt;br /&gt;
&lt;br /&gt;
コンテナオブジェクトといいます。&lt;br /&gt;
&lt;br /&gt;
一例として次のようなものがあります。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;配列 &amp;nbsp; &amp;nbsp; &amp;nbsp;vector&lt;/li&gt;
&lt;li&gt;リスト &amp;nbsp; &amp;nbsp; list&lt;/li&gt;
&lt;li&gt;キュー &amp;nbsp; &amp;nbsp;queue&lt;/li&gt;
&lt;li&gt;スタック &amp;nbsp;stack&lt;/li&gt;
&lt;li&gt;集合 &amp;nbsp; &amp;nbsp; &amp;nbsp;set&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
まだ、他にも色々ありますが、ここで全て扱うには難しい内容ですし&lt;br /&gt;
&lt;br /&gt;
割愛させていただきます...(^^;)&lt;br /&gt;
&lt;br /&gt;
あれこれ難しいことを考える必要がないし、汎用的で高機能という&lt;br /&gt;
&lt;br /&gt;
素晴らしさを兼ね備えているのですが、メモリ制約がある組み込み&lt;br /&gt;
&lt;br /&gt;
ソフトウェア開発においては、当然使えません...(-_-;)残念&lt;br /&gt;
&lt;br /&gt;
そんなわけですが、例によって簡単なプログラムを用意しました。&lt;br /&gt;
&lt;br /&gt;
今回は、vectorクラスを使ってみます。(^^)&lt;br /&gt;
&lt;br /&gt;
これのスゴいところは、メモリが足りない時に自動的にメモリを&lt;br /&gt;
&lt;br /&gt;
確保することです。&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt; &amp;nbsp; &amp;nbsp;// vectorクラスを使います&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; vector&amp;lt;int&amp;gt; nVec; &amp;nbsp; &amp;nbsp;// int型のvectorオブジェクトを生成&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nVec.push_back(5); &amp;nbsp; &amp;nbsp;// データを格納しています...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nVec.push_back(10);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; nVec.push_back(15);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // これで要素のサイズが分かります&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;要素数は &quot; &amp;lt;&amp;lt; (int)nVec.size() &amp;lt;&amp;lt; &quot; です。&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; // 中身を確認してみましょう&lt;br /&gt;
&amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; (int)nVec.size(); i++) {&lt;br /&gt;
　 &amp;nbsp; &amp;nbsp; &amp;nbsp;// 通常の配列と同じようにアクセスできます:-)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;vectoro[&quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot;] = &quot; &amp;lt;&amp;lt; nVec[i] &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
要素数は 3 です。&lt;br /&gt;
vectoro[0] = 5&lt;br /&gt;
vectoro[1] = 10&lt;br /&gt;
vectoro[2] = 15&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
最初に配列の要素を決めなくてよいとは、何と便利...&lt;br /&gt;
&lt;br /&gt;
しかも、動的にメモリ確保してることを全く意識させませんね。&lt;br /&gt;
&lt;br /&gt;
いやぁ、STLを使えるってホントに素晴らしいですね(^-^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
結局のところ、最悪の不幸は決して起こらない。たいていの場合、&lt;br /&gt;
不幸を予期するから悲惨な目に合うのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;オノレ・ド・バルザック&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
一日を顧みて、どこかおもしろかった、楽しかった、本当に満足だったという&lt;br /&gt;
ところがなければ、その一日は無駄に過ごしたことになる。私にとって、&lt;br /&gt;
それは神に背くことであり、よこしまなことなのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ドワイト・D・アイゼンハワー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
最悪の事柄を受け入れてしまえば、もはや失うものはなくなる。&lt;br /&gt;
裏を返して言えば、どう転んでも儲けものなのだ！&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
時間を浪費するな、人生は時間の積み重ねなのだから。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ベンジャミン・フランクリン&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5995288577220343954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5995288577220343954'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/03/c12.html' title='C++　標準テンプレートライブラリ　其の壱(1/2)'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKCc_jNpFZJQM0DPN04lKub5M2YwpyUEJdS-LQzrOsV9xNJJ3y_mM9xbGytrRZzk6Ji4QJKar_ZqeM2M84E7jWX5ptqbeOHf-liwCDrrxy2xOfscG7H1ZnBfh8JAIVobRMNoBATukM3Kax/s72-c/test3.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-1984987695743921780</id><published>2014-03-05T21:45:00.000+09:00</published><updated>2014-03-05T21:45:38.618+09:00</updated><title type='text'>C++　テンプレートクラス</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnSWbRwXPYJSLZ7T5NqvCQbPitVfu4mmIyOAUL1AsodNLE8HolyT76IjLQGsp08FhD6estOVrlTf7cvlm75P2Uf6FoY-cWEivqHwWU1Vvmin7wa2ALH2AXJqVZiIWfBLNZjp29d6qltNYA/s1600/test2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnSWbRwXPYJSLZ7T5NqvCQbPitVfu4mmIyOAUL1AsodNLE8HolyT76IjLQGsp08FhD6estOVrlTf7cvlm75P2Uf6FoY-cWEivqHwWU1Vvmin7wa2ALH2AXJqVZiIWfBLNZjp29d6qltNYA/s1600/test2.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
テンプレートクラスとは、使用する型を&lt;br /&gt;
曖昧な状態で定義しておくクラスです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
テンプレートクラスの機能を使うことで、&lt;br /&gt;
複数の型に対応することができます。(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// 三辺の長さから、三角形の面積を求めるクラス&lt;br /&gt;
template&amp;lt;class T&amp;gt; &amp;nbsp;// T はテンプレート引数です(^^;)&lt;br /&gt;
class Triangle {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Triangle(T a, T b, T c) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_a = a;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_base = b;　　// 辺b を底辺としよう(^^;)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_c = c;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T GetHeight() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return ((m_a&amp;nbsp;+ m_base + m_c) / 2) * 2 / m_base;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T GetSummation() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (m_a&amp;nbsp;+ m_base + m_c) / 2; &amp;nbsp;// ヘロンの公式&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T m_a, m_base, m_c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
テンプレートクラスのオブジェクトを生成する場合は、次のように&lt;br /&gt;
使用する型を指定します。&lt;br /&gt;
&lt;br /&gt;
Triangle&amp;lt;int&amp;gt; IntTriangle; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // int型を指定します&lt;br /&gt;
Triangle&amp;lt;double&amp;gt; DoubleTriangle; &amp;nbsp;// double型を指定します&lt;br /&gt;
&lt;br /&gt;
また、テンプレート引数が二つ以上ある場合は、次のように&lt;br /&gt;
複数指定します。&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;class T1, class T2&amp;gt; // テンプレートなだけにT1, T2&lt;br /&gt;
class Triangle {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; :&lt;br /&gt;
};&lt;br /&gt;
&amp;nbsp; &amp;nbsp; :&lt;br /&gt;
Triangle&amp;lt;int, double&amp;gt; tri; &amp;nbsp;// int型、double型を指定します&lt;br /&gt;
&amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&lt;br /&gt;
それでは、今回のサンプルプログラムです。&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;class T&amp;gt; &amp;nbsp;// T はテンプレート引数です(^^;)&lt;br /&gt;
class Triangle {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Triangle(T a, T b, T c) {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_a = a;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_base = b;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_c = c;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T GetHeight() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return ((m_a + m_base + m_c) / 2) * 2 / m_base;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T GetSummation() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return (m_a + m_base + m_c) / 2;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T m_a, m_base, m_c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Triangle&amp;lt;int&amp;gt; tri1(59, 50, 100);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;a = 59, b = 50, c = 100&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;height = &quot; &amp;lt;&amp;lt; tri1.GetHeight() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot; &amp;nbsp; sum = &quot; &amp;lt;&amp;lt; tri1.GetSummation() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;---&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Triangle&amp;lt;double&amp;gt; tri2(12.3, 45.6, 78.9);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;a = 12.3, b = 45.6, c = 78.9&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;height = &quot; &amp;lt;&amp;lt; tri2.GetHeight() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot; &amp;nbsp; sum = &quot; &amp;lt;&amp;lt; tri2.GetSummation() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
a = 59, b = 50, c = 100&lt;br /&gt;
height = 4&lt;br /&gt;
&amp;nbsp; &amp;nbsp;sum = 104&lt;br /&gt;
---&lt;br /&gt;
a = 12.3, b = 45.6, c = 78.9&lt;br /&gt;
height = 3&lt;br /&gt;
&amp;nbsp; &amp;nbsp;sum = 68.4&lt;br /&gt;
&lt;br /&gt;
うーん、書いておいてなんですが合っているのかどうかが&lt;br /&gt;
分からないですね...(-_-;)&lt;br /&gt;
&lt;br /&gt;
ちなみに、面積を求めるときのヘロンの公式をググったときに&lt;br /&gt;
面積 S とあったのですが、ふとこの S が何の略か気になり&lt;br /&gt;
これもまたググったところ、数学界の定説は&lt;br /&gt;
&lt;br /&gt;
和を表すsumあるいはsummationの頭文字&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
とのことです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
surface じゃなかったんだ...|дﾟ)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
今日気にかかることで、明日も気にかかることはめったにない。だから夜、&lt;br /&gt;
床につく時、たいていの悩みに対しては、安心してこう言い聞かせられる。&lt;br /&gt;
「お前には全力を尽くした。今後もう会うことはあるまい」&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ウィリアム・クーパー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私は未来のことを考えない。あっという間にやってくるからだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;アルバート・アインシュタイン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
神の到来を待ち望む者は、自分が神の御手の中に現在いることが&lt;br /&gt;
分からない。神と幸福は不離一体であるという信念を抱いて、あらゆる&lt;br /&gt;
幸福を現在のこの一瞬の中に注ぎ込むことだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;アンドレ・ジード&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
落し物の広告。昨日、日の出から日の入りの間のどこかで、それぞれ&lt;br /&gt;
六十分のダイヤモンドをちりばめた貴重な時間を二つ紛失。&lt;br /&gt;
なお拾い主には賞金なし。永遠に失われしゆえ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ホレス・マン&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/1984987695743921780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/1984987695743921780'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/03/c.html' title='C++　テンプレートクラス'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnSWbRwXPYJSLZ7T5NqvCQbPitVfu4mmIyOAUL1AsodNLE8HolyT76IjLQGsp08FhD6estOVrlTf7cvlm75P2Uf6FoY-cWEivqHwWU1Vvmin7wa2ALH2AXJqVZiIWfBLNZjp29d6qltNYA/s72-c/test2.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-298562375923015996</id><published>2014-02-25T07:46:00.000+09:00</published><updated>2014-02-25T07:46:12.268+09:00</updated><title type='text'>C++  テンプレート関数</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfqhMKZAD03O73_mjW6m1NRsTLL_zkE3P3UHlMpSpTadpqr_Jc3WvZfXZO2B4poEizjLmYPY1opUIILsGxqf7-5aHwrP6h2yhI2X65-bd_z3X1a_wnWFRBi3nMinSu4ib5trlADWndPjAI/s1600/test.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfqhMKZAD03O73_mjW6m1NRsTLL_zkE3P3UHlMpSpTadpqr_Jc3WvZfXZO2B4poEizjLmYPY1opUIILsGxqf7-5aHwrP6h2yhI2X65-bd_z3X1a_wnWFRBi3nMinSu4ib5trlADWndPjAI/s1600/test.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
テンプレート関数の機能は&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
複数の型に対応した関数を&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
つくれることです(^^)&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
テンプレート関数とは、引数や戻り値の型が曖昧な状態の関数です。&lt;br /&gt;
&lt;br /&gt;
そのためコンパイラが、テンプレート関数の呼び出し方を判断して、&lt;br /&gt;
&lt;br /&gt;
具体的な関数に置き換えて処理するのです(*^^)v　賢い！&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;class T&amp;gt;&lt;br /&gt;
T GetMaxValue(T num1, T num2)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; T temp;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; if (num1 &amp;gt; num2) temp = num1;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; else temp = num2;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return temp;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
この　class T とか書いてあるところが、テンプレート引数というものです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
別に T である必要はありませんが、分かりやすいし無難に倣っておくのが&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
良いのではないかと... テンプレートのTということで。(^^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
仮の型名なので、関数を使用するときに int や double に置き換わります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ここでは、関数の引数と戻り値に使っています。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
関数の呼び出し方法は、特に変わった点はなく&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
普通に呼び出すだけで使えます(^^)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
では、サンプルプログラムで見てみましょう。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
include &amp;lt;stdio.h&amp;gt;&lt;/div&gt;
&lt;div&gt;
#include &amp;lt;iostream&amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
using namespace std;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
// 与えられた引数のうち大きいほうの値を返します&lt;/div&gt;
&lt;div&gt;
template&amp;lt;class T&amp;gt;&lt;/div&gt;
&lt;div&gt;
T GetMaxValue(T num1, T num2)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; T temp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; if (num1 &amp;gt; num2) temp = num1;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; else temp = num2;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return temp;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int a = 10;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int b = 15;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; double c = 3.14;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; double d = 1.23;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; printf(&quot;a : %d, b : %d\n&quot;, a, b);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int ans = GetMaxValue(a, b); &amp;nbsp;//int型を指定した呼び出し&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; printf(&quot;ans : %d\n&quot;, ans);&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;c : &quot; &amp;lt;&amp;lt; c &amp;lt;&amp;lt; &quot;, d : &quot; &amp;lt;&amp;lt; d &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; double ans2 = GetMaxValue(c, d);　//double型を指定した呼び出し&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;ans2 : &quot; &amp;lt;&amp;lt; ans2 &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
# ./test&lt;/div&gt;
&lt;div&gt;
a : 10, b : 15&lt;/div&gt;
&lt;div&gt;
ans : 15&lt;/div&gt;
&lt;div&gt;
c : 3.14, d : 1.23&lt;/div&gt;
&lt;div&gt;
ans2 : 3.14&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Cでは、int型用、double型用などと2つの関数を&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
用意しなければなりませんでしたが、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
このように一つにまとめることができました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
さすが、C++&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
インクリメントされてるので、ちゃんと進んでるのがわかりますね(^^;)&lt;/div&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
取り越し苦労をして先のことばかりに目を向け、まだ嵐がやってこない&lt;br /&gt;
うちから気をもんで、どうやって防ごうかとうろたえるようでは、神に対する&lt;br /&gt;
信頼を失ってしまう。まだこれからどうなるかわからないのに、打つ手や&lt;br /&gt;
失敗した時のことまで考えて、わが身を地獄に陥れるとき、我々は&lt;br /&gt;
恐怖心を追放してくれるあの「完全な愛」（神）から、完全に見放されて&lt;br /&gt;
いるのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヘンリー・ウォード・ビーチャー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
まず確かな事実を手元に集めることだ。公平な目でありとあらゆる&lt;br /&gt;
事実を集めないうちには、問題に手も触れないことにしよう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
ついに起こらなかった害悪のために、我々はいかに多くの時間を&lt;br /&gt;
費やしたことか！&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;トーマス・ジェファーソン&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/298562375923015996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/298562375923015996'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/02/c_25.html' title='C++  テンプレート関数'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfqhMKZAD03O73_mjW6m1NRsTLL_zkE3P3UHlMpSpTadpqr_Jc3WvZfXZO2B4poEizjLmYPY1opUIILsGxqf7-5aHwrP6h2yhI2X65-bd_z3X1a_wnWFRBi3nMinSu4ib5trlADWndPjAI/s72-c/test.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-2707928474334821688</id><published>2014-02-11T21:27:00.000+09:00</published><updated>2014-02-11T21:27:46.358+09:00</updated><title type='text'>C++ 上級編の話</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1nMDp89DgDUdeNIwI77ed3rTohfuzqINvCK7lJPWqLn5Ckh8dtRq39WQ17qmBLRy-SFmHmj4rGSWPWUVDpolJo9i8jnK_WLZMjOJnmM4RiAwuHWXVkbAAAG3zVp374Xzhyk_Celub2uBo/s1600/P1010597.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1nMDp89DgDUdeNIwI77ed3rTohfuzqINvCK7lJPWqLn5Ckh8dtRq39WQ17qmBLRy-SFmHmj4rGSWPWUVDpolJo9i8jnK_WLZMjOJnmM4RiAwuHWXVkbAAAG3zVp374Xzhyk_Celub2uBo/s1600/P1010597.JPG&quot; height=&quot;150&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
長い間続いた基礎編のネタが終了し、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ついに上級編の部類に突入しました。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
では、さっそく見ていきましょう(^^)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;background-color: white; color: #222222; font-family: arial; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;テンプレート関数&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
テンプレートとは、ワープロやデザインなどで使われるフォーマットやデータのことです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
日本語で言うところのひな型、型紙というやつですね。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
C++では、テンプレート関数という便利な機能があります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
これは呼び出し側で指定した引数の型に合わせて、関数内で使用する変数の値を&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
変えることができるというものです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
凄いところは、同じことを C でやろうとすると、引数の型が違うだけの別の関数を&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
用意する必要がありました。　安直にHogeFunc2() のように...(-_-;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
あとはちょっと気の利いた対応方法として、#define マクロを使う方法があります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
しかし、 #define だと一行で記述しなければならないので、複数行に亘る場合&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
\ 記号を使って行を連結する必要があります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
これだと分かりにくいし、何より \ 記号を付けるのが面倒でしょうがないデス(&amp;gt;_&amp;lt;)&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
#define SwapNum(T, a, b) \&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { T tmp = a; \&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; a = b; &amp;nbsp; &amp;nbsp; &amp;nbsp; \&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b = tmp; }&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int a = 10;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int b = 15;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; printf(&quot;a : %d, b : %d\n&quot;, a, b);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; SwapNum(int, a, b);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; printf(&quot;a : %d, b : %d\n&quot;, a, b);&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
C++では、テンプレート関数の機能を使えば、複数の型に対応した&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
関数を記述できるようになります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
#define マクロを使わない方法もあるということを押さえておきたいところです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;演算子のオーバーロード&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
C++にも足し算のときの&amp;nbsp;+ 、掛け算やポインタで使う * 、代入のときの = など&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
たくさんの演算子があります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int 型やchar 型という普通の変数の型に対し、何かこれらの演算を行った場合&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
行われる処理は既に決まっています。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
例えば int 型の2つの変数 a, b に対して&amp;nbsp;+ 演算子を使うと、2つの値を&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
足し算する筈...、ですよね(^^)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
しかし、オブジェクトに対して同じことをしようと思った場合、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
そのまま使うことはできません(^_^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
もし使いたい場合は演算子をオーバーロードする必要があります。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
演算子をオーバーロードすると、既にある演算子に独自の働きを&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
持たせることができるようになります。　&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
便利な使い方の例としては、+演算子のオーバーロードで&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
時間を表現する2つのオブジェクトを足すと&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
繰り上げ計算を行った上で、合計時間を求める、とか&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
= 演算子をオーバーロードして、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
オブジェクト同士の代入が行われると、&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
動的に確保したメモリも含めまるっとコピーする&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
などがあります(^_^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
少々難しい内容ですが、こちらもぜひ押さえておきたいところです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;今日の名言&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
みじめな気持になる秘訣は、自分が幸福であるか否かについて&lt;br /&gt;
考えるひまを持つことだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョージ・バーナード・ショー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
じぶんがいまかかっている病気を我慢する方が、決してかからない&lt;br /&gt;
かもしれない病気について思い悩むより利口である。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ラ・ロシュフコー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
現在の重荷に耐えきれない人間はいない。現在の重荷に過去の&lt;br /&gt;
重荷が加わるから、耐えられなくなるのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョージ・マクドナルド&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
有名な法律についての金言を掲げよう。「法律は小事に関与せず」&lt;br /&gt;
悩みから逃れて、心の安らぎを求めるならば、小事にこだわっては&lt;br /&gt;
ならない。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
困難を予期するな。決して起こらないかもしれぬことに心を&lt;br /&gt;
悩ますな。常に心に太陽を持て。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ベンジャミン・フランクリン&lt;/b&gt;&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2707928474334821688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2707928474334821688'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/02/c.html' title='C++ 上級編の話'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1nMDp89DgDUdeNIwI77ed3rTohfuzqINvCK7lJPWqLn5Ckh8dtRq39WQ17qmBLRy-SFmHmj4rGSWPWUVDpolJo9i8jnK_WLZMjOJnmM4RiAwuHWXVkbAAAG3zVp374Xzhyk_Celub2uBo/s72-c/P1010597.JPG" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-180923674439207525</id><published>2014-01-29T20:57:00.002+09:00</published><updated>2014-01-29T20:57:43.999+09:00</updated><title type='text'>C++　デストラクタを仮想関数にする</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC-hJLhkIUjXr28NVzaY24R9xnPx65Ckzjqe9euqP6Xju4FymyGfZ_Ooq1DiWTkX4Oy8I0n3vbvmL5cIb0LvE1WrAtcE2pe2MAtMIECp0fp2V_8B1JQvnjgHsBK2qN0AJugm6c0sF-IqsN/s1600/test.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC-hJLhkIUjXr28NVzaY24R9xnPx65Ckzjqe9euqP6Xju4FymyGfZ_Ooq1DiWTkX4Oy8I0n3vbvmL5cIb0LvE1WrAtcE2pe2MAtMIECp0fp2V_8B1JQvnjgHsBK2qN0AJugm6c0sF-IqsN/s1600/test.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
いつものPCが不調につき。&lt;br /&gt;
&lt;br /&gt;
開発者の手助けとなるツールにEclipseという&lt;br /&gt;
&lt;br /&gt;
ものがあります。&lt;br /&gt;
&lt;br /&gt;
IDE(&lt;span style=&quot;background-color: white; font-family: sans-serif; font-size: 15px; line-height: 22.6560001373291px;&quot;&gt;Integrated Development Environment&lt;/span&gt;)&lt;br /&gt;
&lt;br /&gt;
なのでデバッグもできてしまいます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GUIでの簡単な操作、しかも無料で使えるというのは本当に素晴らしいですね！&lt;br /&gt;
&lt;br /&gt;
さて、本題に入ります(^_^;)&lt;br /&gt;
&lt;br /&gt;
継承する可能性のあるクラスのデストラクタは、仮想関数にしてください。&lt;br /&gt;
&lt;br /&gt;
今、基底クラスのポインタが、その基底クラスから派生したクラスの&lt;br /&gt;
&lt;br /&gt;
オブジェクトを指している場合を考えてみます。&lt;br /&gt;
&lt;br /&gt;
基底クラスのデストラクタが仮想関数でない場合、基底クラスのポインタに対して&lt;br /&gt;
&lt;br /&gt;
delete を実行すると、なんと派生クラスのデストラクタが呼ばれないのです(&amp;gt;_&amp;lt;)&lt;br /&gt;
&lt;br /&gt;
したがって、派生クラスのデストラクタ内でメモリの解放をしているような場合、&lt;br /&gt;
&lt;br /&gt;
基底クラスのポインタから delete を実行しても、そのメモリが解放されないという&lt;br /&gt;
&lt;br /&gt;
困った現象が起きてしまいます(-_-;)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;とある実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
I&#39;m Vegetable::SetPrice()&lt;br /&gt;
Price = I&#39;m Vegetable::GetPrice()&lt;br /&gt;
398&lt;br /&gt;
I&#39;m ~Food()&lt;br /&gt;
&lt;br /&gt;
これを回避するためには、次のように基底クラスのデストラクタを&lt;br /&gt;
&lt;br /&gt;
仮想関数にしておくことで、派生クラスのデストラクタが呼ばれるようになります。&lt;br /&gt;
&lt;br /&gt;
class Food {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; virtual ~Food(); &amp;nbsp; &amp;nbsp;//デストラクタを仮想関数にしています&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;とある実行結果2&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
I&#39;m Vegetable::SetPrice()&lt;br /&gt;
Price = I&#39;m Vegetable::GetPrice()&lt;br /&gt;
I&#39;m ~Vegetable()&lt;br /&gt;
I&#39;m ~Food()&lt;br /&gt;
&lt;br /&gt;
メモリリークが原因で、突然プログラムが落ちてしまうという問題は、&lt;br /&gt;
&lt;br /&gt;
何が原因かを特定するまで難航することがあります(?_?)&lt;br /&gt;
&lt;br /&gt;
こだわりを持って、品質のいいソフトウェア開発ができるようにしたいものです。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;こんな使い方はしなさそうな、今回の状況を試すためのサンプル&lt;/b&gt;&lt;br /&gt;
include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; //~Food();　　　　　　こちらでは派生クラスのデストラクタが呼ばれません&lt;br /&gt;
&amp;nbsp; &amp;nbsp; virtual ~Food(); &amp;nbsp; &amp;nbsp; &amp;nbsp;//こちらは実行結果2のほうになります&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ~Vegetable();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int *m_ptr;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Food::~Food()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;I&#39;m ~Food()&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
oid Food::SetPrice(int price)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;I&#39;m Food::SetPrice()&quot; &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; m_price = price;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int Food::GetPrice(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;I&#39;m Food::GetPrice()&quot; &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return m_price;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Vegetable::~Vegetable()&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;I&#39;m ~Vegetable()&quot; &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; if (m_ptr != NULL) { delete m_ptr; m_ptr = NULL; }&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
nt Vegetable::GetPrice(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;I&#39;m Vegetable::GetPrice()&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Vegetable *pmyVegetable = new Vegetable;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food *pmyFood = pmyVegetable;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; pmyVegetable-&amp;gt;SetPrice(398);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Price = &quot; &amp;lt;&amp;lt; pmyVegetable-&amp;gt;GetPrice() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; delete pmyFood;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
苦境に立って万事休した時には、できることがあれば、それをやる。できることが&lt;br /&gt;
なければ、あとは忘れるだけだ。私は未来について決して心配しない。未来に&lt;br /&gt;
どんなことが起きるかを予想できる人などいないからだ。未来に影響を及ぼす力は&lt;br /&gt;
実にたくさんある！それらの力を動かすものが何であるのか誰も知らないし、&lt;br /&gt;
その力自体も理解できない。なのに、どうして悩むのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;K・T・ケラー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
人を憎むのは、ネズミ一匹追い出すために、家全体を焼き払うようなものだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ハリー・エマーソン・フォデスディック&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
私は一文無しになっても悩みはしないだろう。悩んだところで何の益もないからだ。&lt;br /&gt;
私は最善を尽くして、あとの結果は神におまかせする。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;J・C・ペニー&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/180923674439207525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/180923674439207525'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/01/c_29.html' title='C++　デストラクタを仮想関数にする'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC-hJLhkIUjXr28NVzaY24R9xnPx65Ckzjqe9euqP6Xju4FymyGfZ_Ooq1DiWTkX4Oy8I0n3vbvmL5cIb0LvE1WrAtcE2pe2MAtMIECp0fp2V_8B1JQvnjgHsBK2qN0AJugm6c0sF-IqsN/s72-c/test.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-8148288783715912292</id><published>2014-01-23T21:21:00.000+09:00</published><updated>2014-01-23T21:21:39.871+09:00</updated><title type='text'>C++　オブジェクトの配列を初期化</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSdbJVJSHfkK2BxBhj4GzlYfVeBbQV5Ep0XCucX9t64ZxVIMplemSyINIJAzdL2eOGtzAlg6xdTRxJb7-4RGCm0yurWqMOKnB7hGXuxoD09XQY5Yb6a02R4m4RVE9AhI9YnaYF41P0nqcY/s1600/test8.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSdbJVJSHfkK2BxBhj4GzlYfVeBbQV5Ep0XCucX9t64ZxVIMplemSyINIJAzdL2eOGtzAlg6xdTRxJb7-4RGCm0yurWqMOKnB7hGXuxoD09XQY5Yb6a02R4m4RVE9AhI9YnaYF41P0nqcY/s1600/test8.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回はオブジェクトの配列を初期化する方法&lt;br /&gt;
についての紹介になります(^^)&lt;br /&gt;
&lt;br /&gt;
通常の変数と同様に、もちろんオブジェクトも&lt;br /&gt;
配列にすることができます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
初期化する場合は以下のようになります。&lt;br /&gt;
&lt;br /&gt;
//まずはDateクラスの定義&lt;br /&gt;
class Date&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Date(int year, int month, int day)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_year = year;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_month = month;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_day = day;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_year;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_month;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_day;&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; //そしてDateクラスの２つのオブジェクトを宣言と同時に初期化&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Date UseByDate[2] = { Date(2014, 1, 13), Date(2014, 2, 14) };&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
この場合は、Dateクラスの2つのオブジェクトが引数を3つ取る&lt;/div&gt;
&lt;div&gt;
コンストラクタで初期化されます(^-^)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;初期化のバリエーションについて&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
オブジェクトの配列の初期化では、要素の途中まで&lt;/div&gt;
&lt;div&gt;
初期化するということもできます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Date UseByDate[31] = { Date(2014, 1, 13), Date(2014, 2, 14) };&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
この場合、要素は31個ありますが、最初の2つだけが引数を3つ取る&lt;/div&gt;
&lt;div&gt;
コンストラクタが呼び出されます。&lt;/div&gt;
&lt;div&gt;
そして、残りの29個については、引数のないコンストラクタが呼び出されます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
また、コンストラクタの引数が一つだけの時は、引数の内容だけを&lt;/div&gt;
&lt;div&gt;
記述することもできます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
　　　:&lt;/div&gt;
&amp;nbsp; &amp;nbsp; Date(const char *datestr)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; datestr &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; //もちろん従来のように書いても構いませんし&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Date UseByDate1[2] = { Date(&quot;2014/03/15&quot;), Date(&quot;2014/04/16&quot;) };　　&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; //引数の内容だけを記述してみたってのもありです&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Date UseByDate2[2] = { &quot;2014/03/15&quot;, &quot;2014/04/16&quot; };&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
いずれにしても、同じ内容で初期化されているというのが&lt;/div&gt;
&lt;div&gt;
分かるかと思います(^^)&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
一つ一つの問題の本質を正しくつかめ。仕事を分割して&lt;br /&gt;
適当に時間割りせよ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ベンジャミン・フランクリン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
人生の全体ばかりに気を取られて思い悩んではいけない。まだ自分の手元に&lt;br /&gt;
来るかどうかわからない重荷の数と性質を、一目で読み取りとろうとするな。&lt;br /&gt;
むしろ問題が起こるたびに、「この仕事の手に負えない個所はどこだろか」と&lt;br /&gt;
自問するのだ。この問いに正直に答えれば、自分でも赤面したくなるだろう！&lt;br /&gt;
次に思い出すべきことは、過去も未来も自分を押し潰すことはできない、自分を&lt;br /&gt;
押しつぶせるのは現在だけだ、ということである。その現在ですら、もし適当に&lt;br /&gt;
分割してそれぞれの大きさの範囲を決めたうえで、自分に問い直せば、&lt;br /&gt;
取るになりぬものとなる。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;マルクス・アウレリウス&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8148288783715912292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8148288783715912292'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/01/c_23.html' title='C++　オブジェクトの配列を初期化'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSdbJVJSHfkK2BxBhj4GzlYfVeBbQV5Ep0XCucX9t64ZxVIMplemSyINIJAzdL2eOGtzAlg6xdTRxJb7-4RGCm0yurWqMOKnB7hGXuxoD09XQY5Yb6a02R4m4RVE9AhI9YnaYF41P0nqcY/s72-c/test8.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-6313043789925722731</id><published>2014-01-18T00:53:00.000+09:00</published><updated>2014-01-18T00:53:15.794+09:00</updated><title type='text'>C++  オブジェクトをメンバに持つ</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmX_YyAF2Uf3m_rXg2MhmFJlFh9WGwEUqYvKuOtZ8ljY36LaxcYIoVex3oPtxK7kfzRJCcagE9milZnQZRo830QxihgLFtJuWr8nouc9R8UFc67sCkZRhGaKgrXR7ilSDFwoASmIxdHifx/s1600/test7.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmX_YyAF2Uf3m_rXg2MhmFJlFh9WGwEUqYvKuOtZ8ljY36LaxcYIoVex3oPtxK7kfzRJCcagE9milZnQZRo830QxihgLFtJuWr8nouc9R8UFc67sCkZRhGaKgrXR7ilSDFwoASmIxdHifx/s1600/test7.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回はオブジェクトをメンバに持つクラスの&lt;br /&gt;
説明です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
通常の変数や関数と同様に、オブジェクトを&lt;br /&gt;
クラスのメンバにすることもできます。(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
オブジェクトをメンバにして新しいクラスを作ることは、よくあります。&lt;br /&gt;
例えば以下のようになります。&lt;br /&gt;
&lt;br /&gt;
//Dateクラスの定義&lt;br /&gt;
class Date&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Date(int year, int month, int day)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_year = year;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_month = month;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_day = day;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_year;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_month;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_day;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; static double sm_tax;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; static void SetTax(double tax){&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sm_tax = tax;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Date BestBeforeDate; &amp;nbsp;//DateクラスのBestBeforeDateオブジェクト&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
そのままFoodクラスの中に、Dateオブジェクトがあるイメージです(^^;)&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;メンバにしたオブジェクトを初期化するには&lt;/b&gt;&lt;br /&gt;
先のようにメンバにしたオブジェクトの初期化は、コンストラクタで行います。&lt;br /&gt;
但し、コンストラクタの中ではなく、初期化リストという部分で初期化します。&lt;br /&gt;
&lt;br /&gt;
//BestBeforeDateオブジェクトの初期化と変数m_priceの初期化&lt;br /&gt;
Food()&lt;br /&gt;
:BestBeforeDate(2014, 1, 13), m_price(105)&lt;br /&gt;
{}&lt;br /&gt;
&lt;br /&gt;
初期化リストの形式は、「:（コロン）」に続けて初期化するためのリストを&lt;br /&gt;
書いていきます。複数ある場合は、「,（カンマ）」で区切ります(^-^)&lt;br /&gt;
&lt;br /&gt;
このように、オブジェクトだけでなく int型やdouble型 などの&lt;br /&gt;
メンバ変数もここで初期化することができます。&lt;br /&gt;
&lt;br /&gt;
初期化されるときの順番は、メンバにしたオブジェクトの後に&lt;br /&gt;
コンストラクタの内容が実行されます。&lt;br /&gt;
&lt;br /&gt;
class Date&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Date(int year, int month, int day)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_year = year;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_month = month;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_day = day;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;I&#39;m Date Object.&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
class Food&lt;/div&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food()&lt;br /&gt;
&amp;nbsp; &amp;nbsp; :BestBeforeDate(2014, 1, 13), m_price(105)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;I&#39;m Food Object.&quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;br /&gt;
こんな感じに実験してみると、確かにDateの方が先に実行されて&lt;br /&gt;
いるのがわかります。&lt;br /&gt;
&lt;br /&gt;
# ./test&lt;br /&gt;
I&#39;m Date Object.&lt;br /&gt;
I&#39;m Food Object.&lt;br /&gt;
&lt;br /&gt;
ただ、初期化リストはたまにしか使わないと、ついつい書式を忘れて&lt;br /&gt;
Google先生に聞くことになりますね...(*´Д｀)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
些細なことをとやかく言うな。取るにも足りぬこと - 人生のシロアリ - に&lt;br /&gt;
自分の幸福を食いつぶされるな。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
やるべきことは、遠くにぼんやり見えるものを見ることではなく、&lt;br /&gt;
手直にはっきり見えるものを行うことである。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;トーマス・カーライル&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
もはや手の施しようのない事態になったら、事態の成り行きに任せるだけだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヘンリー・フォード&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
「記録を調べてみよう」そして、こう自問するのだ。「平均値の法則によると、&lt;br /&gt;
不安の種になっている事柄が実際に起こる確率はどのくらいだろうか？」&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
一度決断を下し、後は実行あるのみとなったら、その結果に対する責任や&lt;br /&gt;
心配を完全に捨て去ろう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ウィリアム・ジェイムズ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/6313043789925722731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/6313043789925722731'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/01/c_18.html' title='C++  オブジェクトをメンバに持つ'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmX_YyAF2Uf3m_rXg2MhmFJlFh9WGwEUqYvKuOtZ8ljY36LaxcYIoVex3oPtxK7kfzRJCcagE9milZnQZRo830QxihgLFtJuWr8nouc9R8UFc67sCkZRhGaKgrXR7ilSDFwoASmIxdHifx/s72-c/test7.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-1010773488382646072</id><published>2014-01-09T22:05:00.000+09:00</published><updated>2014-01-09T22:05:02.649+09:00</updated><title type='text'>C++ 　静的メンバ関数</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg33y_bcvhd1sMKsmZqviYYX9wdoUGLJGTe3AmU_6hsQSKJ7AxfV9kqYJa28ppJ5_hhrWhinW_m7-v0egYekYfvaF6JKMBqlQnbIVdNxCdV_LNGBy4DSzMS8YqsxoQbAvoGWAIxu6WtDBhg/s1600/test6.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg33y_bcvhd1sMKsmZqviYYX9wdoUGLJGTe3AmU_6hsQSKJ7AxfV9kqYJa28ppJ5_hhrWhinW_m7-v0egYekYfvaF6JKMBqlQnbIVdNxCdV_LNGBy4DSzMS8YqsxoQbAvoGWAIxu6WtDBhg/s1600/test6.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
静的メンバ関数とは、静的メンバ変数にだけ&lt;br /&gt;
アクセスするための関数です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
メンバ関数にstaticを付けて宣言すると、&lt;br /&gt;
静的メンバ関数になります(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; static double sm_tax;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; static void SetTax(double tax){ &amp;nbsp;//staticを付ける&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sm_tax = tax;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
なお、静的メンバ関数から同じオブジェクト内のメンバを利用するには&lt;/div&gt;
&lt;div&gt;
メンバにstaticをつけなければなりません。&lt;/div&gt;
&lt;div&gt;
つまり、static以外のメンバにアクセスはできないということです(^^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;静的メンバ関数の呼び出しかた&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
静的メンバ関数なので、静的メンバ変数と同様にオブジェクトを生成しなくても&lt;/div&gt;
&lt;div&gt;
呼び出すことができます。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
nt main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food::SetTax(1.05); &amp;nbsp;//スコープ解決演算子を使用&lt;/div&gt;
&lt;div&gt;
　　　:&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
また、オブジェクトを生成した場合は、通常のメンバ変数を呼び出すのと同じように&lt;/div&gt;
&lt;div&gt;
呼び出すことができます(^^)&lt;/div&gt;
&lt;div&gt;
　　　:&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food myFood;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; myFood.SetPrice(1500);&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
スコープ解決演算子を使って呼び出すのが分かりやすくておススメですね。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
では、例によってプログラム全体を。&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
#include &amp;lt;iostream&amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
using namespace std;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
class Food&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
public:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; static double sm_tax;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; static void SetTax(double tax){ &amp;nbsp;//staticを付ける&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sm_tax = tax;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; }&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;/div&gt;
&lt;div&gt;
private:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;/div&gt;
&lt;div&gt;
};&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
double Food::sm_tax = 0;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
void Food::SetPrice(int price)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; m_price = price;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int Food::GetPrice(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return m_price;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food::SetTax(1.05); &amp;nbsp;//スコープ解決演算子を使用&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food myFood;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; myFood.SetPrice(1500);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Food Price[1500](in tax 5%) = &quot; &amp;lt;&amp;lt; myFood.GetPrice() * myFood.sm_tax &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; //.(ピリオド)を使ってアクセス&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; myFood.SetTax(1.08); &amp;nbsp;//増税して8%になってしまった...&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Food Price[1500](in tax 8%) = &quot; &amp;lt;&amp;lt; myFood.GetPrice() * myFood.sm_tax &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
# ./test&lt;/div&gt;
&lt;div&gt;
Food Price[1500](in tax 5%) = 1575&lt;/div&gt;
&lt;div&gt;
Food Price[1500](in tax 8%) = 1620&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
新年あけまして、増税が近づいてきました...(-_-;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;今日の名言&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
コロラド州ロングズ・ピークの山腹に一本の巨木の残骸がある。博物学者によれば、&lt;br /&gt;
樹齢四百年の木だという。その木は、コロンブスがサン・サルバドルに上陸した頃は&lt;br /&gt;
苗木であったし、清教徒たちがプリマスに定住した頃には若木に成長していた。&lt;br /&gt;
その木は長い生涯の間に十四回も落雷に見舞われ、四世紀間には数えきれないほど&lt;br /&gt;
多くの雪崩や暴風雨がその木を襲った。その木はひたすら生き抜いた。しかしながら、&lt;br /&gt;
最後はカブトムシの大群が押し寄せ、その巨木を地上に倒してしまった。虫たちは&lt;br /&gt;
樹皮を破って侵入し、少しずつではあるが間断のない攻撃によって、徐々に巨木の&lt;br /&gt;
生命力を破壊してしまったのである。長い歳月に耐え、雷鳴を物ともせず、嵐にも&lt;br /&gt;
屈しなかった森の巨木が、人間の指でひねりつぶされてしまう小さな虫たちのために、&lt;br /&gt;
ついに倒されてしまったのだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ハリー・エマーソン・フォスディック&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/1010773488382646072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/1010773488382646072'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/01/c.html' title='C++ 　静的メンバ関数'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg33y_bcvhd1sMKsmZqviYYX9wdoUGLJGTe3AmU_6hsQSKJ7AxfV9kqYJa28ppJ5_hhrWhinW_m7-v0egYekYfvaF6JKMBqlQnbIVdNxCdV_LNGBy4DSzMS8YqsxoQbAvoGWAIxu6WtDBhg/s72-c/test6.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-5861576170946975837</id><published>2014-01-07T22:17:00.000+09:00</published><updated>2014-01-07T22:17:17.110+09:00</updated><title type='text'>C++　静的メンバ変数</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4S1nTDPqsBWm00cVScTCIgII8xYsFMC2mlAlOP-I0U0Qmm1BkZEnVveBFgPq0MCZMRntLl-hyoavWjSiV2Z9wuS1iqtmEK1zOKlC9WpBqrbsx5KVLf1MieVN1MNfyaKDJPZd8fbDwwO3w/s1600/test5.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4S1nTDPqsBWm00cVScTCIgII8xYsFMC2mlAlOP-I0U0Qmm1BkZEnVveBFgPq0MCZMRntLl-hyoavWjSiV2Z9wuS1iqtmEK1zOKlC9WpBqrbsx5KVLf1MieVN1MNfyaKDJPZd8fbDwwO3w/s1600/test5.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は静的メンバ変数の話です。&lt;br /&gt;
&lt;br /&gt;
これは、メンバ変数に static を付けるだけで&lt;br /&gt;
&lt;br /&gt;
「静的メンバ変数」になります。&lt;br /&gt;
&lt;br /&gt;
静的メンバ変数とは、複数のオブジェクトで&lt;br /&gt;
共通のメモリ領域を持つメンバ変数のことです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
一つのクラスから精製したオブジェクトの静的メンバ変数は、&lt;br /&gt;
値が共通になります。&lt;br /&gt;
&lt;br /&gt;
どのオブジェクトでも共通なデータは static にできますので、&lt;br /&gt;
メモリの節約に役立ちます(^^)&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; static double sm_tax; &amp;nbsp; &amp;nbsp;//staticを付ける&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;静的メンバ変数の初期化について&lt;/b&gt;&lt;br /&gt;
静的メンバ変数の初期化は cppファイルの中で一度だけ行います。&lt;br /&gt;
コンストラクタで初期化しないよう注意してください。(^^;)&lt;br /&gt;
オブジェクトの生成ごとに何度も初期化されてしまいますので(*´Д｀)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;静的メンバ変数のアクセスについて&lt;/b&gt;&lt;br /&gt;
publicな静的メンバ変数の場合、オブジェクトを生成しなくても&lt;br /&gt;
スコープ解決演算子を使ってアクセスすることができます。&lt;br /&gt;
また、オブジェクトを生成している場合は、「.（ピリオド）」を使って&lt;br /&gt;
通常のメンバ変数のようにアクセスすることもできます。&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food::sm_tax = 1.05; &amp;nbsp;//初期化&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food myFood;&lt;br /&gt;
　 &amp;nbsp; &amp;nbsp; &amp;nbsp;:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; myFood.sm_tax = 1.08; &amp;nbsp;//増税8%&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&lt;br /&gt;
では、サンプルプログラム全体です。&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; static double sm_tax; &amp;nbsp; &amp;nbsp;//staticを付ける&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
double Food::sm_tax = 1.05;&lt;br /&gt;
&lt;br /&gt;
void Food::SetPrice(int price)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; m_price = price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Food::GetPrice(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food::sm_tax = 1.05; &amp;nbsp;//初期化&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food myFood;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; myFood.SetPrice(1500);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Food Price1 = &quot; &amp;lt;&amp;lt; myFood.GetPrice() * Food::sm_tax &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; myFood.sm_tax = 1.08; &amp;nbsp;//増税8%&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Food Price2 = &quot; &amp;lt;&amp;lt; myFood.GetPrice() * Food::sm_tax &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
Food Price1 = 1575&lt;br /&gt;
Food Price2 = 1620&lt;br /&gt;
&lt;br /&gt;
うむむ、消費税8%だと　1500円のモノを買った時の値段は&lt;br /&gt;
割高感満点ですね(-_-;)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
幸福への道はただ一つしかない。それは意志の力でどうにもならない物事は&lt;br /&gt;
悩んだりしないことである。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;エピクテトス&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
随分前のことだが、ある日私は不安と幻滅をおぼえ、私の一生は自分では&lt;br /&gt;
どうにもならない力で操られているように思われた。ある朝ふと新約聖書を&lt;br /&gt;
開いてみると、次の一節が目に止まった。「我を地上に送りたまいし者、常に&lt;br /&gt;
我とともにあり-父なる神は我を見捨てたまわず」私の人生はその瞬間から&lt;br /&gt;
一変した。それ以来、私にはあらゆることが永遠に違ったものとなった。&lt;br /&gt;
一日として、この一節を繰り返さない日はなかった。近年、多くの人々が&lt;br /&gt;
私のもとを訪れて助言を求めるが、私はいつも別れ際にこの励ましの言葉を&lt;br /&gt;
伝えている。この一節に目を止めて以来、私はこの言葉によって生きてきた。&lt;br /&gt;
私はこの一節とともに歩み、この中に平和と力とを見出している。私にとっては、&lt;br /&gt;
これこそ宗教の真髄である。この言葉は、人生を価値あるものにするすべての&lt;br /&gt;
物の基盤となっている。何物にも代えがたい私の人生の教科書である。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョセフ・R・サイズー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5861576170946975837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5861576170946975837'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/01/c_7.html' title='C++　静的メンバ変数'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4S1nTDPqsBWm00cVScTCIgII8xYsFMC2mlAlOP-I0U0Qmm1BkZEnVveBFgPq0MCZMRntLl-hyoavWjSiV2Z9wuS1iqtmEK1zOKlC9WpBqrbsx5KVLf1MieVN1MNfyaKDJPZd8fbDwwO3w/s72-c/test5.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-2213086430921881742</id><published>2014-01-05T13:44:00.000+09:00</published><updated>2014-01-05T13:44:28.255+09:00</updated><title type='text'>C++　静的メンバ</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Fpp4BzjOSxFg2MRsDah800H0jr6tPhd-YnsuFOrYNGVpVn3qz8wUO9OiB0SI8ivKZ3lsQgTCClfx2xcz0xYLhsGFLfRgr42JeIc62TNC8__R0NRVcGss9ll20gfgvAlzLWqWp3oP5rro/s1600/P1010562.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Fpp4BzjOSxFg2MRsDah800H0jr6tPhd-YnsuFOrYNGVpVn3qz8wUO9OiB0SI8ivKZ3lsQgTCClfx2xcz0xYLhsGFLfRgr42JeIc62TNC8__R0NRVcGss9ll20gfgvAlzLWqWp3oP5rro/s1600/P1010562.JPG&quot; height=&quot;150&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
今回は、C++のクラスの特徴についての&lt;br /&gt;
話になります。(^^)&lt;br /&gt;
&lt;br /&gt;
C++では、クラスに静的メンバ変数というものが&lt;br /&gt;
定義できます。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
通常クラスからオブジェクトを生成すると、そのオブジェクトごとにメンバ変数用の&lt;br /&gt;
&lt;br /&gt;
メモリが割り当てられます。&lt;br /&gt;
&lt;br /&gt;
しかし、静的メンバ変数の場合、クラスで共通のメモリ領域が割り当てられます。&lt;br /&gt;
&lt;br /&gt;
そのため、各オブジェクトで同じ値を共有するような場合に&lt;br /&gt;
&lt;br /&gt;
静的メンバ変数を利用すると便利です。(^^)&lt;br /&gt;
&lt;br /&gt;
なぜなら、通常のメンバ変数と違い、オブジェクトごとにメモリ領域を&lt;br /&gt;
&lt;br /&gt;
確保しないので、メモリを節約することができるからです。&lt;br /&gt;
&lt;br /&gt;
たとえば、消費税率を入れるメンバ変数というのがある場合、この変数は&lt;br /&gt;
&lt;br /&gt;
各オブジェクト共通で使用できるはずです。&lt;br /&gt;
&lt;br /&gt;
もし、消費税率がそれぞれのオブジェクトのメンバ変数にあると、&lt;br /&gt;
&lt;br /&gt;
それはメモリ領域の無駄遣いになります(-_-;)&lt;br /&gt;
&lt;br /&gt;
また、静的メンバ関数というものもあります。&lt;br /&gt;
&lt;br /&gt;
これは、静的メンバ変数のように共通のメモリ領域と使った関数ではなく、&lt;br /&gt;
&lt;br /&gt;
静的なメンバ変数にしかアクセスできない関数のことです。(^^;)&lt;br /&gt;
使用例は次回以降で詳しくみていきます。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;オブジェクトをメンバにする&lt;/b&gt;&lt;br /&gt;
今まで、変数や関数をメンバに持つクラスというものを紹介してきました。&lt;br /&gt;
さらに、オブジェクトそのものもメンバに加えることができます。(^^)&lt;br /&gt;
&lt;br /&gt;
たとえば、時刻を計算したり、表現するTimeクラスのオブジェクトを作った場合&lt;br /&gt;
&lt;br /&gt;
いろいろな所で、活用できそうです。&lt;br /&gt;
&lt;br /&gt;
もし、予定表をつくるためScheduleクラスを作成するとしたら、&lt;br /&gt;
&lt;br /&gt;
先のオブジェクトを利用すると簡単に作成できそうな気がします。&lt;br /&gt;
&lt;br /&gt;
このように、配列、文字列や日付などあらかじめ用意しておくと&lt;br /&gt;
&lt;br /&gt;
便利なオブジェクトはたくさんあります。&lt;br /&gt;
&lt;br /&gt;
それらのオブジェクトを有効活用して、新しくクラスを作る手間を&lt;br /&gt;
&lt;br /&gt;
削減できるようにしたいものです(^^;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
何かで悩みはじめ、頭の中が水車を動かしているエジプトのラクダのように&lt;br /&gt;
回転し始めると、私は体を十分に運動させて、こうした「憂鬱な気持ち」を&lt;br /&gt;
追い払うことにしている。悩みに対する最良の解毒剤は運動である。&lt;br /&gt;
悩みのある時は、できるだけ頭脳を使わずに筋肉を使うことだ。そうすれば、&lt;br /&gt;
その効果にびっくりするに違いない。私はいつもこの手を使う。&lt;br /&gt;
運動を始めると、悩みはすぐに消えてしまう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;エディー・イーガン大佐&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
もし世界中の人間の悩みを一つ所に積み上げてその人数に分け、平等に&lt;br /&gt;
分配したら、たいていの者は自分の取り分に満足して立ち去ることだろう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ソロン&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
自分の悩みに「損害停止」の命令を出そう。これこれの事柄にはどのくらいの&lt;br /&gt;
不安が相当するか決定する-そしてそれ以上の不安は断るのである。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2213086430921881742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2213086430921881742'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2014/01/c_5.html' title='C++　静的メンバ'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0Fpp4BzjOSxFg2MRsDah800H0jr6tPhd-YnsuFOrYNGVpVn3qz8wUO9OiB0SI8ivKZ3lsQgTCClfx2xcz0xYLhsGFLfRgr42JeIc62TNC8__R0NRVcGss9ll20gfgvAlzLWqWp3oP5rro/s72-c/P1010562.JPG" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-4383441511169960006</id><published>2013-12-28T10:50:00.000+09:00</published><updated>2013-12-28T10:50:47.485+09:00</updated><title type='text'>C++　純粋仮想関数</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSNdlTr6J78TE3IY-Ydlw8LmFLpbKLOR3y4DK9jYM-V0QRSWp8XZbGdIxqHu24pTC7nlzMJGlk78Hy2H0uCZemN9MWJtzpKpk3SAtaF9b3tvtg6X3XRClpfYLeyrqxOFgspt0L21lJmhH0/s1600/test4.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSNdlTr6J78TE3IY-Ydlw8LmFLpbKLOR3y4DK9jYM-V0QRSWp8XZbGdIxqHu24pTC7nlzMJGlk78Hy2H0uCZemN9MWJtzpKpk3SAtaF9b3tvtg6X3XRClpfYLeyrqxOFgspt0L21lJmhH0/s1600/test4.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
今回はオーバーライドにまつわるお話&lt;br /&gt;
其の参 です。(^-^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
純粋仮想関数とは、基底クラスで内容を&lt;br /&gt;
定義せずに派生クラスで関数の内容を&lt;br /&gt;
定義する関数です。&lt;br /&gt;
&lt;br /&gt;
ややこしくなってしまった...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使いどころとしては、必ず継承して使うようなクラスの場合です。(^^;)&lt;br /&gt;
そのような場合は、基底クラスで仮想関数の内容を決められないからです。&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; //最初に virtual と書き、最後に = 0 と書く&lt;br /&gt;
&amp;nbsp; &amp;nbsp; virtual void SetPrice(int price) = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
protected:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
基底クラスでは、このように呼び出し方だけを記載しておきます。&lt;br /&gt;
注意する点は、純粋仮想関数を含むオブジェクトは生成できないということです。&lt;br /&gt;
&lt;br /&gt;
間違ってオブジェクトを作ろうとすると、当然コンパイルエラーです(*´Д｀)&lt;br /&gt;
そう、こんな風に...&lt;br /&gt;
&lt;br /&gt;
test.cpp: In function ‘int main()’:&lt;br /&gt;
test.cpp:59:10: error: cannot declare variable ‘myFood’ to be of abstract type ‘Food’&lt;br /&gt;
test.cpp:6:7: note: &amp;nbsp; because the following virtual functions are pure within ‘Food’:&lt;br /&gt;
test.cpp:10:18: note: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtual void Food::SetPrice(int)&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
それと、ひっそりとメンバ変数が protected に変わっています...&lt;br /&gt;
もし、private のままだと、勿論コンパイルエラーです(*´Д｀)&lt;br /&gt;
派生クラスからアクセスできませんので当然です。&lt;br /&gt;
まぁ、こんな風に...&lt;br /&gt;
&lt;br /&gt;
test.cpp: In member function ‘virtual void Vegetable::SetPrice(int)’:&lt;br /&gt;
test.cpp:14:9: error: ‘int Food::m_price’ is private&lt;br /&gt;
test.cpp:31:5: error: within this context&lt;br /&gt;
test.cpp: In member function ‘virtual void Meet::SetPrice(int)’:&lt;br /&gt;
test.cpp:14:9: error: ‘int Food::m_price’ is private&lt;br /&gt;
test.cpp:43:5: error: within this context&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
派生クラスでは、継承した純粋仮想関数をオーバーライドして&lt;br /&gt;
何をするかを定義します。&lt;br /&gt;
&lt;br /&gt;
それでは、サンプルプログラムです。&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; //純粋仮想関数&lt;br /&gt;
&amp;nbsp; &amp;nbsp; virtual void SetPrice(int price) = 0;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
protected: &amp;nbsp;//protectedにしておかないと、継承先で参照できない&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int Food::GetPrice(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//派生クラスVegetable&lt;br /&gt;
class Vegetable : public Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void Vegetable::SetPrice(int price)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; m_price = price * 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//派生クラスMeet&lt;br /&gt;
class Meet : public Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void Meet::SetPrice(int price)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; m_price = price / 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food *pFood;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Vegetable myVegetable;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Meet myMeet;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood = &amp;amp;myVegetable;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood-&amp;gt;SetPrice(500); &amp;nbsp; &amp;nbsp;//VegetableクラスのSetPrice()を呼び出す&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Vegetable Price = &quot; &amp;lt;&amp;lt; pFood-&amp;gt;GetPrice() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood = &amp;amp;myMeet;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood-&amp;gt;SetPrice(1500); &amp;nbsp; &amp;nbsp;//MeetクラスのSetPrice()を呼び出す&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Meet Price = &quot; &amp;lt;&amp;lt; pFood-&amp;gt;GetPrice() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
Vegetable Price = 1000&lt;br /&gt;
Meet Price = 750&lt;br /&gt;
&lt;br /&gt;
ハマる楽しさオーバーライド　これもC++のいいところです(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
不眠症で眠れないのは、不眠症を気にするからだ。&lt;br /&gt;
なぜ気になるかといえば、眠らないからだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;フランクリン・ピアース・アダムス&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
忍耐はどんな悩みにも効く名薬である。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;プラウトゥス&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私は貧乏と病気のどん底を生き抜いてきました。「あらゆる人に振りかかる&lt;br /&gt;
悩みをあなたはどうやって切り抜けてきたのですか」と尋ねる人があれば、&lt;br /&gt;
私はいつもこう答えます。「私は昨日耐えました。今日も耐えることができます。&lt;br /&gt;
そして明日のことは決して考えないようにしています」&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ドロシー・ディックス&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/4383441511169960006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/4383441511169960006'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2013/12/c_28.html' title='C++　純粋仮想関数'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSNdlTr6J78TE3IY-Ydlw8LmFLpbKLOR3y4DK9jYM-V0QRSWp8XZbGdIxqHu24pTC7nlzMJGlk78Hy2H0uCZemN9MWJtzpKpk3SAtaF9b3tvtg6X3XRClpfYLeyrqxOFgspt0L21lJmhH0/s72-c/test4.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-8562389543066254618</id><published>2013-12-25T21:27:00.000+09:00</published><updated>2013-12-25T21:27:44.676+09:00</updated><title type='text'>C++  仮想関数とオーバーライド</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHt8qU2Jb2sHNZQcORaz0rihV6Gs3R36_dq-dV9Kv7SBrRTB8mrtLD2AlHiwjAAogFPSDRFUBqO5HR716BHlCSiGjHKiIbVCzVnjtvlUlNK5VAgipg7vKj9eWu0Zpm0W5KiYWIGB6nXTgm/s1600/test3.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHt8qU2Jb2sHNZQcORaz0rihV6Gs3R36_dq-dV9Kv7SBrRTB8mrtLD2AlHiwjAAogFPSDRFUBqO5HR716BHlCSiGjHKiIbVCzVnjtvlUlNK5VAgipg7vKj9eWu0Zpm0W5KiYWIGB6nXTgm/s1600/test3.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
今回はオーバーライドにまつわるお話 其の弐 です。(^-^)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;仮想関数とオーバーライドとは&lt;/b&gt;&lt;br /&gt;
派生クラスで再定義したメンバ関数を&lt;br /&gt;
&lt;br /&gt;
基底クラスのポインタから呼び出すと&lt;br /&gt;
&lt;br /&gt;
通常は再定義前のメンバ関数&lt;br /&gt;
（基底クラスのメンバ関数のこと）&lt;br /&gt;
が呼ばれます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ここで再定義後のメンバ関数が呼ばれるようにするには、基底クラスで&lt;br /&gt;
その関数を仮想関数にしておく必要があります(^^;)&lt;br /&gt;
&lt;br /&gt;
仮想関数にするには、予約語 virtual を指定します。&lt;br /&gt;
そして、仮想関数を派生クラスで定義し直すことをオーバーライドといいます。&lt;br /&gt;
&lt;br /&gt;
では、仮想関数の使用例です。&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; virtual void SetPrice(int price); &amp;nbsp;//仮想関数を定義&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
　　　：&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
void Vegetable::SetPrice(int price)　　//派生クラスで&lt;/div&gt;
&lt;div&gt;
{ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //SetPrice()をオーバーライド&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food::SetPrice(price * 2); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //倍返し価格設定&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
　　　：&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food *pFood;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Vegetable myVegetable;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood = &amp;amp;myVegetable;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood-&amp;gt;SetPrice(500); &amp;nbsp; &amp;nbsp;//VegetableクラスのSetPrice()を呼び出す&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
　　　：&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
# ./test&lt;/div&gt;
&lt;div&gt;
Vegetable Price = 1000&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
「オーバーライド」と「オーバーロード」は言葉が似ています...&lt;br /&gt;
いつもごっちゃになるので注意したいところです(^^;)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;今回のソース&lt;/b&gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; virtual void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetFarmName(const char *farm);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char *GetFarmName(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char m_strFarmName[32];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void Food::SetPrice(int price)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; m_price = price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Food::GetPrice(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Vegetable::SetPrice(int price)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food::SetPrice(price * 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Vegetable::SetFarmName(const char *farm)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; strncpy(m_strFarmName, farm, 32);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *Vegetable::GetFarmName(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_strFarmName;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food *pFood;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Vegetable myVegetable;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; pFood = &amp;amp;myVegetable;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; pFood-&amp;gt;SetPrice(500); &amp;nbsp; &amp;nbsp;//VegetableクラスのSetPrice()を呼び出す&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Vegetable Price = &quot; &amp;lt;&amp;lt; pFood-&amp;gt;GetPrice() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
満面にこぼれるような笑みをたたえ、肩をそびやかし、大きく深呼吸しながら歌の&lt;br /&gt;
一節でも口ずさむことだ。歌でなくて口笛でも良い。口笛が駄目なら鼻歌でも良い。&lt;br /&gt;
早い話が、幸福に酔いしれているようにふるまいながら、同時に浮かぬ顔で沈み込んで&lt;br /&gt;
いることは肉体的に不可能だということだ！&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
頭を悩ませる問題にぶつかった時でも、私は一時間以内にそうした悩みを追放して、&lt;br /&gt;
「素晴らしきかな人生」と歌声を上げることができる。私のやり方はこうだ。自分の&lt;br /&gt;
書斎へ入り、目を閉じたままで私は本を一冊抜き出す。それがこのプレスコットの&lt;br /&gt;
「メキシコ征服記」であろうとスエトニウスの「ローマ帝王記」であろうと、いっこうに&lt;br /&gt;
構わない。なおも目を閉じたままで、行き当たりばったりにページを開く。それから&lt;br /&gt;
目を開けて一時間読みふける。読めば読むほど、私は、世界が常に苦悶にあえいで&lt;br /&gt;
きたこと、文化が常に破滅の一歩手前にあったことを、痛感するのである。歴史書の&lt;br /&gt;
各ページは、戦争、飢餓、貧窮、疫病、人間同士の非人道的行為について、あますところ&lt;br /&gt;
なく述べている。一時間歴史をひもといてのち私は、なるほど現状はひどいには&lt;br /&gt;
違いないが、過去に比べるならはるかに良くなっていることをしみじみと悟る。&lt;br /&gt;
これにより、大局的には世界はだんだん良い方向に向かっていることが把握でき、&lt;br /&gt;
また私の悩みも、そのありのままの姿から検討できる。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ロジャー・W・バブソン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8562389543066254618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/8562389543066254618'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2013/12/c_25.html' title='C++  仮想関数とオーバーライド'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHt8qU2Jb2sHNZQcORaz0rihV6Gs3R36_dq-dV9Kv7SBrRTB8mrtLD2AlHiwjAAogFPSDRFUBqO5HR716BHlCSiGjHKiIbVCzVnjtvlUlNK5VAgipg7vKj9eWu0Zpm0W5KiYWIGB6nXTgm/s72-c/test3.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-2788175861626830035</id><published>2013-12-23T10:10:00.000+09:00</published><updated>2013-12-23T10:10:20.277+09:00</updated><title type='text'>C++  メンバ関数の再定義</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI91SFeHEexKqk8jRVfwBCwVbM0JqMhLVZOyNTwxI5_j116tqrOeLOsDrbvFmbrC4YbythY2gqneZjgwUXjmvrO_8304vK4WnhXwY8U4hY5BRg9s49nhMWBcAo9-iCybvNq94sXtn_6SwN/s1600/test2.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI91SFeHEexKqk8jRVfwBCwVbM0JqMhLVZOyNTwxI5_j116tqrOeLOsDrbvFmbrC4YbythY2gqneZjgwUXjmvrO_8304vK4WnhXwY8U4hY5BRg9s49nhMWBcAo9-iCybvNq94sXtn_6SwN/s1600/test2.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
今回はオーバーライドにまつわるお話&lt;br /&gt;
其の壱 です。(^-^)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;基底クラスのメンバ関数の再定義&lt;/b&gt;&lt;br /&gt;
基底クラスのメンバ関数は、派生クラスで&lt;br /&gt;
定義しなおすことができます。&lt;br /&gt;
&lt;br /&gt;
この場合は、関数名、引数、戻り値が&lt;br /&gt;
同じでなければなりません。&lt;br /&gt;
定義しなおすと、そちらの関数が&lt;br /&gt;
呼ばれるようになります(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ここでは、基底クラスFoodに対し、派生クラスVegetableで&lt;br /&gt;
SetPrice()関数を再定義してみます。&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetFarmName(const char *farm);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char *GetFarmName(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char m_strFarmName[32];&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
　　　：&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
void Vegetable::SetPrice(int price) &amp;nbsp; &amp;nbsp;//SetPrice()の再定義&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food::SetPrice(price / 2);　//半額にする&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
派生クラスから、基底クラスの関数を呼ぶときは&lt;/div&gt;
&lt;div&gt;
スコープ解決演算子を使います(^^)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
# ./test&lt;/div&gt;
&lt;div&gt;
Food Price = 500&lt;/div&gt;
&lt;div&gt;
Vegetable Price = 250&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
どうでしょうか、関数名が被ってもいいってのは、名前に悩まされる問題が&lt;br /&gt;
軽減される気がします。&lt;br /&gt;
なぜなら、機能が同じなのでそういった名前が付けたいに違いない！&lt;br /&gt;
と思うわけでして...(^^;)&lt;br /&gt;
&lt;br /&gt;
せっかくなので、一応全部載せときます...&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetFarmName(const char *farm);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char *GetFarmName(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; char m_strFarmName[32];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void Food::SetPrice(int price)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; m_price = price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Food::GetPrice(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_price;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Vegetable::SetPrice(int price)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food::SetPrice(price / 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Vegetable::SetFarmName(const char *farm)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; strncpy(m_strFarmName, farm, 32);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char *Vegetable::GetFarmName(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return m_strFarmName;&lt;br /&gt;
}&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food myFood;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Vegetable myVegetable;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; myFood.SetPrice(500); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //FoodクラスのSetPrice()&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; myVegetable.SetPrice(500); &amp;nbsp; &amp;nbsp;//VegetableクラスのSetPrice()&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Food Price = &quot; &amp;lt;&amp;lt; myFood.GetPrice() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Vegetable Price = &quot; &amp;lt;&amp;lt; myVegetable.GetPrice() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;今日の名言&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
問題を手際よく表現することによって、問題は半ば解決されている。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;チャールズ・F.・ケタリング&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
一種類以上の問題を無理に抱えようとするな。世の中には三種類も問題を抱えている&lt;br /&gt;
人がある-過去の問題のすべて、現在の問題のすべて、未来の問題のすべてを。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;エドワード・エヴァレット・ヘール&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私たちが敵に憎しみを感じると、むしろ自分自身が敵に支配されることになる。そして&lt;br /&gt;
その支配力は私たちの睡眠・食欲・血圧・健康・幸福にまで及んでくる。敵について&lt;br /&gt;
思い悩み、苦悶し、何とか仕返しの機会を狙っていると知ったら、敵は小躍りして&lt;br /&gt;
喜ぶであろう！私たちの憎悪は少しも敵を傷つけないばかりか、かえって私たち自身が&lt;br /&gt;
日夜、地獄の苦しみを味わうことになる。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2788175861626830035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/2788175861626830035'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2013/12/c_23.html' title='C++  メンバ関数の再定義'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI91SFeHEexKqk8jRVfwBCwVbM0JqMhLVZOyNTwxI5_j116tqrOeLOsDrbvFmbrC4YbythY2gqneZjgwUXjmvrO_8304vK4WnhXwY8U4hY5BRg9s49nhMWBcAo9-iCybvNq94sXtn_6SwN/s72-c/test2.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-5230226683995735624</id><published>2013-12-18T21:50:00.000+09:00</published><updated>2013-12-18T21:50:03.545+09:00</updated><title type='text'>C++  派生クラスと基底クラス　其の弐</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPc87FN0GFf-fwG_u9_bT8zUGNnNkzf7_fvyjUteWqzSJOaH7jYeo22cDGdvet_-XLA0-BxSBfPpxx_BP3mk5h8OGk3B0KjTu6Bf74PsiesPYQ1wgK_MSQa-nnFjykTHs1r88keWArc3e8/s1600/test.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPc87FN0GFf-fwG_u9_bT8zUGNnNkzf7_fvyjUteWqzSJOaH7jYeo22cDGdvet_-XLA0-BxSBfPpxx_BP3mk5h8OGk3B0KjTu6Bf74PsiesPYQ1wgK_MSQa-nnFjykTHs1r88keWArc3e8/s1600/test.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
今回は、派生クラスのオブジェクトのアドレスを&lt;br /&gt;
基底クラスのポインタに代入するとどうなるのか、&lt;br /&gt;
について見ていきます(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;子オブジェクトのアドレスを親クラスのポンタに代入してみると&lt;/b&gt;&lt;br /&gt;
何と派生クラスのオブジェクトのアドレスを、&lt;br /&gt;
基底クラスのポインタに代入するといった&lt;br /&gt;
使い方もできます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Food &amp;nbsp;//基底クラス&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetPrice(int price);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice(void);&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
class Vegetable : public Food　//派生クラス&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
public:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; void SetFarmName(const char *farm);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; char *GetFarmName(void);&lt;/div&gt;
&lt;div&gt;
private:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; char m_strFarmName[32];&lt;/div&gt;
&lt;div&gt;
};&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
　　　：&lt;/div&gt;
&lt;div&gt;
　　　：&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food *pFood;　　　　　　　　 //Foodクラスのポインタ&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Vegetable myVegetable;　　//Vegetableクラスのオブジェクト&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood = &amp;amp;myVegetable;　　//Vegetableクラスのオブジェクトのアドレスを&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //Foodクラスのポインタに代入&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;使い方をもっと具体的に&lt;/b&gt;&lt;br /&gt;
基底クラスのポンタ配列に派生クラスからのオブジェクトのアドレスを代入しておくと、&lt;br /&gt;
派生クラスのメンバ関数を基底クラスのポインタから呼び出すことができます(^^)&lt;br /&gt;
以前のサンプルプログラムを以下のように変更します。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; ：&lt;br /&gt;
class Meet : public Food &amp;nbsp; &amp;nbsp;//新しい派生クラスMeetを追加&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
public:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; void SetFarmName(const char *farm);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; char *GetFarmName(void);&lt;/div&gt;
&lt;div&gt;
private:&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; char m_strFarmName[32];&lt;/div&gt;
&lt;div&gt;
};&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; ：&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Food *pFood[2];&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Vegetable myVegetable;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; Meet myMeet;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood[0] = &amp;amp;myVegetable;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; pFood[1] = &amp;amp;myMeet;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; for (int i = 0; i &amp;lt; 2; i++) {&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pFood[i]-&amp;gt;SetPrice((i+1) * 100);&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Price[&quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot;]=&quot;&amp;lt;&amp;lt; &amp;nbsp;pFood[i]-&amp;gt;GetPrice() &amp;lt;&amp;lt; endl;&lt;/div&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
# ./test&lt;br /&gt;
Price[0]=100&lt;br /&gt;
Price[1]=200&lt;br /&gt;
&lt;br /&gt;
継承に限らず、ポインタを駆使した処理というのは沢山でてきますので&lt;br /&gt;
ぜひとも身につけておきたいところです(^^;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
いらぬ取り越し苦労をするよりも、前もって考えたり計画する方が大事だ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ウィンストン・チーチャル&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
大きな悲しみには勇気をもって立ち向かい、小さな悲しみには忍耐をもって立ち向かえ。&lt;br /&gt;
一日の仕事を終えたら安らかに眠れ。あとは神が守ってくださる。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヴィクトル・ユーゴー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
小さな事柄が人を悩ませるのだ。象が向って来れば身をかわして逃げられもするが、&lt;br /&gt;
ハエからは身をかわすことはできない。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジョシュ・ビリングス&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
人間を殺すのは仕事ではない。悩みである。仕事は健康に良い。けれど自分の力の&lt;br /&gt;
限界以上に働くことはできない。悩みは歯車の錆である。機械が駄目になるのは、&lt;br /&gt;
絶えず回転するからではなく、絶えず摩擦するからである。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヘンリー・ウォード・ビーチャー&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5230226683995735624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/5230226683995735624'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2013/12/c_18.html' title='C++  派生クラスと基底クラス　其の弐'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPc87FN0GFf-fwG_u9_bT8zUGNnNkzf7_fvyjUteWqzSJOaH7jYeo22cDGdvet_-XLA0-BxSBfPpxx_BP3mk5h8OGk3B0KjTu6Bf74PsiesPYQ1wgK_MSQa-nnFjykTHs1r88keWArc3e8/s72-c/test.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-7208061075322114888</id><published>2013-12-16T21:25:00.000+09:00</published><updated>2013-12-16T21:25:55.608+09:00</updated><title type='text'>C++  派生クラスと基底クラス　其の一</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Se0H42E5rwHtR8Fw3A_MvRNfBcr8VsdviZUJFY-kkLJf72bF0-QPCg2tF1Oxry9CjJwXBIl13eo-8X23scPvTDKRZ0BepBBYdvkEnQsDih7GW4W9ewH9DplVSiVHfs60ci5YyOLqw-oD/s1600/test.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Se0H42E5rwHtR8Fw3A_MvRNfBcr8VsdviZUJFY-kkLJf72bF0-QPCg2tF1Oxry9CjJwXBIl13eo-8X23scPvTDKRZ0BepBBYdvkEnQsDih7GW4W9ewH9DplVSiVHfs60ci5YyOLqw-oD/s1600/test.png&quot; height=&quot;200&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
今回は、派生クラスのオブジェクトを基底クラスへ代入するという&lt;br /&gt;
ことについて見ていきます(^^)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;子オブジェクトを親オブジェクトに代入してみる&lt;/b&gt;&lt;br /&gt;
派生クラスのオブジェクトは、基底クラスのオブジェクトへ&lt;br /&gt;
代入することができます。&lt;br /&gt;
代入すると、派生クラスのメンバ変数の値が、&lt;br /&gt;
そのまま対応する基底クラスのメンバ変数にコピーされるのです(^^)/　さすがC++ 賢い！&lt;br /&gt;
&lt;br /&gt;
かなり省略してますが、以前のプログラムを利用した例です。&lt;br /&gt;
&lt;br /&gt;
class Food&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //基底クラスFoodの定義&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; : &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//派生クラスVegetableの定義&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Vegetable Pumpkin; &amp;nbsp;//Pumpkinオブジェクト生成&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food myFood; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //myFoodオブジェクト生成&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Pumpkin.SetPrice(398);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Price = &quot; &amp;lt;&amp;lt; Pumpkin.GetPrice() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Pumpkin.SetFarmName(&quot;Pascal&#39;s Farm&quot;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Farm Name = &quot; &amp;lt;&amp;lt; Pumpkin.GetFarmName() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; myFood = Pumpkin; &amp;nbsp;//Pumpkinオブジェクトを代入&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;myFood&#39;s price &quot; &amp;lt;&amp;lt; myFood.GetPrice() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;div&gt;
　　&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; return 0;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
実行結果はこうなります。(^^)&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
# ./test&lt;/div&gt;
&lt;div&gt;
Price = 398&lt;/div&gt;
&lt;div&gt;
Farm Name = Pascal&#39;s Farm&lt;/div&gt;
&lt;div&gt;
myFood&#39;s price 398&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
おぉ、Foodクラスの方では、SetPrice() を呼び出していないのに&lt;/div&gt;
&lt;div&gt;
価格が設定されているではありませんか！&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;親オブジェクトを子オブジェクトへ代入してみると？&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
一方で、基底クラスのオブジェクトを派生クラスのオブジェクトに&lt;/div&gt;
&lt;div&gt;
代入するとどうなるのでしょう。試してみます。(^^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Vegetable Pumpkin;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Food myFood;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Pumpkin.SetPrice(398);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Price = &quot; &amp;lt;&amp;lt; Pumpkin.GetPrice() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Pumpkin.SetFarmName(&quot;Pascal&#39;s Farm&quot;);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Farm Name = &quot; &amp;lt;&amp;lt; Pumpkin.GetFarmName() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; myFood.SetPrice(200); &amp;nbsp;//基底クラスに設定した値が　　　&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Pumpkin = myFood; &amp;nbsp; &amp;nbsp; &amp;nbsp;//派生クラスに反映されるのでしょうか？&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
結果は、コンパイルエラーです...(*´Д｀)&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
派生クラスにしかないメンバ変数に値が設定できないのです。&lt;/div&gt;
&lt;div&gt;
これでは困るので、親から子へ代入ができないのです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ちなみに、こんなメッセージが出ます。&lt;/div&gt;
&lt;div&gt;
test.cpp: In function ‘int main()’:&lt;/div&gt;
&lt;div&gt;
test.cpp:57:15: error: no match for ‘operator=’ in ‘Pumpkin = myFood’&lt;/div&gt;
&lt;div&gt;
test.cpp:57:15: note: candidate is:&lt;/div&gt;
&lt;div&gt;
test.cpp:15:7: note: Vegetable&amp;amp; Vegetable::operator=(const Vegetable&amp;amp;)&lt;/div&gt;
&lt;div&gt;
test.cpp:15:7: note: &amp;nbsp; no known conversion for argument 1 from ‘Food’ to ‘const Vegetable&amp;amp;’&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
実は、もっと後に出すつもりの演算子のオーバーロードという機能を使えば&lt;/div&gt;
&lt;div&gt;
このエラーそのものは、無くすことができます。&lt;/div&gt;
&lt;div&gt;
ただし、それはまた後ほど...(^^;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
ふとっちょ卵が塀の上、ふとっちょ卵が落ちちゃった。&lt;br /&gt;
王様の馬と王様の家来が皆出て来てくっつけたけど、元通りにはならないよ。&lt;br /&gt;
この古い童話にある通り、王様の馬と家来が全部束になってかかっても、過去は&lt;br /&gt;
元通りにはならない。一旦おがくずになったものをのこぎりで挽いても始まらない。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私は実業界に入って間もなく、心配することのばからしさを思い知らされた。だから&lt;br /&gt;
私は、難問にはできる限り手を尽くすように心がけているが、もし目算が外れて、&lt;br /&gt;
収拾がつかなくなったとしても、あっさり忘れることにしている。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジュリアス・ローゼンウォルト&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私は他に気がかりなことがあるとしても、それに関連する事柄全てを忘れ去り、&lt;br /&gt;
当面の仕事に没頭することにしている。その効果は実に素晴らしい。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ヘンリー・ウォード・ビーチャー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/7208061075322114888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/7208061075322114888'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2013/12/c_16.html' title='C++  派生クラスと基底クラス　其の一'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0Se0H42E5rwHtR8Fw3A_MvRNfBcr8VsdviZUJFY-kkLJf72bF0-QPCg2tF1Oxry9CjJwXBIl13eo-8X23scPvTDKRZ0BepBBYdvkEnQsDih7GW4W9ewH9DplVSiVHfs60ci5YyOLqw-oD/s72-c/test.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-7919467833513198064</id><published>2013-12-11T00:23:00.000+09:00</published><updated>2013-12-11T00:23:12.482+09:00</updated><title type='text'>C++  多重継承</title><content type='html'>複数の基底クラスから一つの派生クラスを作ることができます。&lt;br /&gt;
これを多重継承といいます。(^^)&lt;br /&gt;
一方、一つの基底クラスから派生クラスを作ることを単一継承といいます。&lt;br /&gt;
&lt;br /&gt;
多重継承の一例です。&lt;br /&gt;
&lt;br /&gt;
Copyクラス　Scannerクラス &amp;nbsp;Printerクラス　Faxクラス&lt;br /&gt;
　Copy() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Scan() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Print() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Fax()&lt;br /&gt;
&amp;nbsp; Switch() &amp;nbsp; &amp;nbsp; &amp;nbsp; Switch() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Switch() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Switch()&lt;br /&gt;
　｜＿＿＿＿＿｜＿＿＿＿＿＿｜＿＿＿＿｜&lt;br /&gt;
　　　　　　　　　　　　　　　｜&lt;br /&gt;
　　　　　　　　　　　　　　MFPクラス&lt;br /&gt;
&lt;br /&gt;
MFPとは、MultiFunctionPrinter Pは Procduct ということも...&lt;br /&gt;
要は複合機です。&lt;br /&gt;
&lt;br /&gt;
MFPクラスは、他のクラスのメンバをすべて含んでいます。&lt;br /&gt;
すなわち、MFPクラスからCopyクラスに定義してある関数が&lt;br /&gt;
使用できるということになります。(^^)&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;b&gt;多重継承の定義の仕方&lt;/b&gt;&lt;br /&gt;
多重継承の定義は、基底クラスを「, （カンマ）」で区切って記述します。&lt;br /&gt;
&lt;br /&gt;
class MFP : public Copy, public Scanner, public Printer, public Fax&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; :&lt;br /&gt;
&amp;nbsp; &amp;nbsp; :&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;多重継承はメンバが曖昧になる&lt;/b&gt;&lt;br /&gt;
多重継承で、もし複数の基底クラスに同じ名前のメンバがあった場合、&lt;br /&gt;
派生クラスには同じ名前のメンバが複数出来てしまうことになります。&lt;br /&gt;
&lt;br /&gt;
先の例では、すべてのクラスに 関数 Switch() があるため、&lt;br /&gt;
MFPクラスでは、４つの Switch（）が出来るのです(^^;)&lt;br /&gt;
&lt;br /&gt;
派生クラスからこれらの重複したメンバにアクセスするには、&lt;br /&gt;
スコープ解決演算子を使います。&lt;br /&gt;
&lt;br /&gt;
class Copy&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetSwitchStat(void) { return m_on; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetSwitch(int n) { m_on = n; }; &amp;nbsp;//Copyクラスのメンバ関数SetSwitch()&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_on;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Scanner&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetSwitchStat(void) { return m_on; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetSwitch(int n) { m_on = n; }; &amp;nbsp;//Scannerクラスのメンバ関数SetSwitch()&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_on;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Printer&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetSwitchStat(void) { return m_on; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetSwitch(int n) { m_on = n; }; &amp;nbsp;//Printerクラスのメンバ関数SetSwitch()&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_on;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Fax&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetSwitchStat(void) { return m_on; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void SetSwitch(int n) { m_on = n; }; &amp;nbsp;//Faxクラスのメンバ関数SetSwitch()&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_on;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class MFP : public Copy, public Scanner, public Printer, public Fax&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetSwitchStat(void) { return m_on; }&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_on;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; MFP mfp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; mfp.SetSwitch(0); &amp;nbsp;//MFPクラスのオブジェクトからメンバ関数を呼び出す？&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
これではコンパイラはどのSetSwitch()を使うか判断できません。&lt;br /&gt;
そのため、コンパイルエラーになります。(*´Д｀)&lt;br /&gt;
&lt;br /&gt;
# g++ -g -Wall -o test test.cpp&lt;br /&gt;
test.cpp: In function ‘int main()’:&lt;br /&gt;
test.cpp:52:9: error: request for member ‘SetSwitch’ is ambiguous&lt;br /&gt;
test.cpp:36:10: error: candidates are: void Fax::SetSwitch(int)&lt;br /&gt;
test.cpp:27:10: error: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; void Printer::SetSwitch(int)&lt;br /&gt;
test.cpp:18:10: error: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; void Scanner::SetSwitch(int)&lt;br /&gt;
test.cpp:9:10: error: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; void Copy::SetSwitch(int)&lt;br /&gt;
r&lt;br /&gt;
同名のメンバがあるときは、スコープ解決演算子を使って、&lt;br /&gt;
どのクラスのメンバを呼び出すのかを指定してください。&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; MFP mfp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; mfp.Fax::SetSwitch(0); &amp;nbsp;//Faxクラスの&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;MFP switch1 &quot; &amp;lt;&amp;lt; mfp.Fax::GetSwitchStat() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;MFP switch2 &quot; &amp;lt;&amp;lt; mfp.GetSwitchStat() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
# ./test&lt;br /&gt;
MFP switch1 0&lt;br /&gt;
MFP switch2 34332&lt;br /&gt;
&lt;br /&gt;
この例では、MFPクラスの m_on には値を設定していないので&lt;br /&gt;
不定値が出力されています。&lt;br /&gt;
このことからも、多重継承によって、メンバ変数 m_on が&lt;br /&gt;
５つあるということがわかります。(^^;)&lt;br /&gt;
　&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;color: blue;&quot;&gt;今日の名言&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
明朗になろう。耐え切れぬほどひどい不幸など、ありえないのだから。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ジェイムズ・ラッセル・ローウェル&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私はあきれ返った楽天家として通っているが、まさにそのとおりである。私は成功のこと&lt;br /&gt;
ばかり考え、決して失敗のことを考えないからだ。こうして、知らず知らずのうちに不幸に&lt;br /&gt;
背を向け、失敗を恐れる気持ちを消し去る。私はこうして自分の人生哲学を実行している。&lt;br /&gt;
どんな仕事も必ず十分に検討して、自分の力でやれるのはどの程度か、はっきり見極める&lt;br /&gt;
ことだ。それからこの目標をどうやって遂行するか計画を立てる。その際、他人の方法を&lt;br /&gt;
真似てはいけない、自分独自の方法を考え出して計画することだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;フェルディナンド・フォシュ将軍&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
私たちの疲労は仕事によって生じたのではなく、悩み、挫折、後悔が&lt;br /&gt;
原因となっていることが多い。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;デール・カーネギー&lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/7919467833513198064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/7919467833513198064'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2013/12/c_11.html' title='C++  多重継承'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-703651151091208479.post-1557305584824069972</id><published>2013-12-09T23:03:00.000+09:00</published><updated>2013-12-09T23:03:55.783+09:00</updated><title type='text'>C++  継承したメンバへのアクセス</title><content type='html'>今回は、継承したメンバのアクセス制限についての話です。&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;基底クラスでのpublicメンバの場合&lt;/b&gt;&lt;br /&gt;
基底クラスでpublicだったメンバは、派生クラスからは自分のクラスのメンバと&lt;br /&gt;
同じようにアクセスすることができます(^^)&lt;br /&gt;
&lt;br /&gt;
class Food {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int GetPrice() { return price; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void Vegetable::PricePrice() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Price = &quot; &amp;lt;&amp;lt; GetPrice() &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Vegetableクラスでは、基底クラスでpublicだったメンバ関数のGetPrice()に&lt;br /&gt;
アクセスしています。&lt;br /&gt;
基底クラスでpublicだったメンバは呼び出せるのです(^^)/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;基底クラスでのprivateメンバの場合&lt;/b&gt;&lt;br /&gt;
基底クラスでprivateだったメンバは、派生クラスからはアクセスすることはできません。&lt;br /&gt;
&lt;br /&gt;
class Food {&lt;br /&gt;
private:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void Vegetalbe::PrintPrice() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Price = &quot; &amp;lt;&amp;lt; m_price &amp;lt;&amp;lt; endl;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
基底クラスでprivateメンバにアクセスしようとすると、コンパイルエラーです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
そう、こんな風に(*´Д｀)&lt;br /&gt;
test.cpp:12:10: error: extra qualification ‘Vegetable::’ on member ‘PrintPrice’ [-fpermissive]&lt;br /&gt;
test.cpp: In member function ‘void Vegetable::PrintPrice()’:&lt;br /&gt;
test.cpp:7:9: error: ‘int Food::m_price’ is private&lt;br /&gt;
test.cpp:13:31: error: within this context&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
基底クラスでprivateだったものは使えないのです(-_-;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;アクセス指定子のprotected&lt;/b&gt;&lt;br /&gt;
protectedを使用した場合は、派生クラスからアクセスできても&lt;br /&gt;
他のクラスやグローバルな関数からアクセスできなくなります。(^^;)&lt;br /&gt;
&lt;br /&gt;
class Food {&lt;br /&gt;
protected:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; int m_price;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
class Vegetable : public Food {&lt;br /&gt;
public:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; void Vegetable::PrintPrice() {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cout &amp;lt;&amp;lt; &quot;Price = &quot; &amp;lt;&amp;lt; m_price &amp;lt;&amp;lt; endl; &amp;nbsp;//これはOK&lt;br /&gt;
&amp;nbsp; &amp;nbsp; }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp; &amp;nbsp; Vegetable vgt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; vgt.PrintPrice();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; vgt.m_price = 200;&lt;br /&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
例えば、こんな風に使おうとすると、コンパイルエラーになってしまいます...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
そう、こんな感じで(*´Д｀)&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
test.cpp:12:10: error: extra qualification ‘Vegetable::’ on member ‘PrintPrice’ [-fpermissive]&lt;/div&gt;
&lt;div&gt;
test.cpp: In function ‘int main()’:&lt;/div&gt;
&lt;div&gt;
test.cpp:7:9: error: ‘int Food::m_price’ is protected&lt;/div&gt;
&lt;div&gt;
test.cpp:22:9: error: within this context&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
アクセス指定子は、要注意ですね(^^;)&lt;/div&gt;
&lt;div&gt;
たまに、設計の意図を汲み取らず、これ　public にしたいなぁという事はあるのですが...&lt;/div&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue;&quot;&gt;&lt;b&gt;今日の名言&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
心を傷つける鎖を断ち切り、悩みをきっぱりと捨て去った者は、幸福なるかな。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;オウィディウス&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
明日を耐え抜くために必要なものだけ残して、あらゆる過去を閉め出せ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;サー・ウィリアム・オスラー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
過ぎ去ったものは、もはや再び帰らない。賢者は現在と未来について考えるだけで&lt;br /&gt;
手一杯であるから、過ぎ去った事柄をくよくよ考えている暇がない。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;フランシス・ベーコン&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
ジョージ・ハーバードは「夜は魂を脱ぎ捨てよ」と言っている。これは内省を&lt;br /&gt;
しろというのではなく、服を脱ぐようにすっぽりと魂を脱ぎ捨てるのだ。その&lt;br /&gt;
一日をなすこともなく過ごした罪も、誤りを犯した罪も、ともに脱ぎ捨てれば、&lt;br /&gt;
翌朝新しい命を持った新しい人間として、目覚めるだろう。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;サー・ウィリアム・オスラー&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
恐ろしい悪夢に比べれば、現在の恐怖のほうがまだましだ。&lt;br /&gt;
　　　　　　　　　　　　　　　　　　　　　&lt;b&gt;ウィリアム・シェイクスピア &lt;/b&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/1557305584824069972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/703651151091208479/posts/default/1557305584824069972'/><link rel='alternate' type='text/html' href='http://everydayisthebestdayoftherestofmylife.blogspot.com/2013/12/c.html' title='C++  継承したメンバへのアクセス'/><author><name>kkyama</name><uri>http://www.blogger.com/profile/02673195212795918663</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>