C++ クラス -継承- [開発環境]
参考サイト
http://www.geocities.jp/ky_webid/index_old.html
http://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/inherit.html
◆継承(インヘリタンス)
クラスには継承と呼ばれるメカニズムがあり、これにより既存のクラスの再利用性が高まります。継承を使うと次のようなことが実現できます。
- 既存クラスに機能を追加した新しいクラスを定義する。
- 既存クラスの挙動をカスタマイズした新しいクラスを定義する。
クラスの継承による機能追加
ここに鉛筆があるとします。鉛筆には芯があり、書くたびにどんどん小さくなっていきます。これをクラスにしてみましょう。
class Pencil
{
private:
SIntN core; // 鉛筆の芯の長さ
public:
Void Write()
{
core -= 1; // 書くたびに芯が 1mm ずつ小さくなる
if (core < 0) core = 0;
}
};
あるとき、鉛筆の後ろに消しゴムをくっつけた新製品が売り出されました。消しゴム付き鉛筆です。消しゴム付き鉛筆は、鉛筆と同じ機能をもちながら、さらに消しゴムの機能ももっています。
このように機能が追加されたクラスは次のように定義することができます。
class ErasePencil : public Pencil
{
private:
SIntN rubber; // 消しゴムの大きさ
public:
Void Erase()
{
rubber -= 1; // 消すたびにゴムが 1 立方mm ずつ小さくなる
if (rubber < 0) rubber = 0;
}
};
class キーワードに : public Pencil を指定することで、Pencil のメンバ変数とメンバ関数を引継ぐことができます。つまり、ErasePencil はメンバ変数 core とメンバ関数 Write() をもっています。それに加えて、新しく定義したメンバ変数 rubber とメンバ関数 Erase() ももっています。したがって、次のようなコードを書くことができます。
ErasePencil pen;
pen.Write(); // Pencil クラスから引き継いだメンバ関数の呼び出し
pen.Erase(); // ErasePencil クラスで新たに定義したメンバ関数の呼び出し
このように、既存のクラスのメンバを引き継ぐことを継承といいます。引き継ぎの元となるクラスを基底クラス、引き継いで新しく定義したクラスのことを派生クラスといいます。「ErasePencil は Pencil の派生クラスである」とか「Pencil は ErasePencil の基底クラスである」という言い方をします
Windows7でgrepを使う [開発環境]
フレームワークなどの膨大なファイルから必要な文字列を所在を検索するために、Linuxではgrepコマンドが使われる。これをWindows7上で行う方法を調べた。
1. cygwinのダウンロードとインストール
このサイトから"setup.exe"をダウンロードします。
setup.exe を起動します。
インストール先を”e:\cygwin”に変更しました。ここは各自の環境により変更してください。
インターネットへの接続方法を指定します。
日本のサイトを選びました。
パッケージの選択画面です。あとから変更可能なので、ここではデフォルトのまま進みます。
完了です。
2. Cygwinの確認
デスクトップにできたCygwinアイコンを起動します。
grepのバージョンを確認してみる。
3. Cygwinを使う
① cドライブにアクセスする。
“mount”コマンドで現在のマウントポイントを確認する。
cドライブは、”/cygdrive/c”にマウントされている事がわかる。
cドライブへ移動し、”ls”コマンドでファイル内容を確認してみる。
“c:\”のファイルが確認できている。
② フォルダ移動
grepしたいディレクトリに移動する。スペースや()等の特殊記号が含まれるホルダーへの移動は記号の前に”\”を追加します。例えば、
”c:\Progeam Files (x86)” へ移動する場合、以下と記述します。
$ cd c:\Program\ Files\ \(x86\)
③ grepする
書式
$ grep [オプション] パターン ファイル
◆ <INtime>フォルダー以下にあるファイル群から”BEFORE_INIT”を含むファイルを探すには。
$ grep –n –r BEFORE_INIT INtime
◆ ヘッダーファイルのみを対象に検索する場合。
$ find INtime –name *.h | xargs grep –n –r BEFORE_INIT
xargs はfind で見つかった全ファイルのパスを、一度に grep に渡している。
オプションは
-b:行のブロック番号をつける
-c:パターンに一致した行の行数のみを出力する
-h:複数ファイルを指定した際にファイル名を出力しない
-i:大文字小文字を区別しない
-l:パターンに一致した行を含むファイル名だけを出力する
-n:パターンに一致した行のファイル内での行番号を出力する
-s:エラーメッセージのみを出力する
-v:パターンに一致しない行のみを出力する
–color:一致文字列に色を付ける
-o:一致した文字列だけを出力する
-r:特定ディレクトリ以下を再帰的に検索する
スタティックライブラリの作成と使用(C++) [開発環境]
1. スタティックライブラリ プロジェクトの作成
① [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
② プロジェクトの種類ペインで、[Visual C++] の [win32] をクリックします。
③ テンプレート ペインの [Win32 コンソール アプリケーション] をクリックします。
④ プロジェクトとして「MathFuncsLib」などの名前を付け、[プロジェクト名] フィールドに入力します。ソリューションとして「StaticLibrary」などの名前を付け、[ソリューション名] フィールドに入力します。
⑤ [OK] をクリックして、Win32 アプリケーション ウィザードを起動します。[Win32 アプリケーション ウィザード] ダイアログ ボックスの [概要] ページで、[次へ] をクリックします。
⑥ Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[アプリケーションの種類] の [スタティック ライブラリ] を選択します。
⑦ Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[追加のオプション] の下にある [プリコンパイル済みヘッダー] の選択を解除します。
⑧ [完了] をクリックして、プロジェクトを作成します。
2. クラスを追加する。
① 新しいクラスのヘッダー ファイルを作成するには、[プロジェクト] メニューの [新しい項目の追加] をクリックします。[新しい項目の追加] ダイアログ ボックスが表示されます。カテゴリ ペインで、[Visual C++] の [コード] をクリックします。テンプレート ペインの [ヘッダー ファイル (.h)] をクリックします。ヘッダー ファイルとして「MathFuncsLib.h」などの名前を付け、[追加] をクリックします。空白のファイルが表示されます。
② 加算、減算、乗算、除算などの一般的な数値演算を行うための、MyMathFuncs という名前の単純なクラスを追加します。コードは次のようになります。
// MathFuncsLib.h
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static double Add(double a, double b);
// Returns a - b
static double Subtract(double a, double b);
// Returns a * b
static double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
static double Divide(double a, double b);
};
}
③ 新しいクラスのソース ファイルを作成するには、[プロジェクト] メニューの [新しい項目の追加] をクリックします。[新しい項目の追加] ダイアログ ボックスが表示されます。カテゴリ ペインで、[Visual C++] の [コード] をクリックします。テンプレート ペインの [C++ ファイル (.cpp)] をクリックします。ソース ファイルとして「MathFuncsLib.cpp」などの名前を付け、[追加] をクリックします。空白のファイルが表示されます。
④ ソース ファイルに MyMathFuncs の機能を実装します。コードは次のようになります。
// MathFuncsLib.cpp
// compile with: /c /EHsc
// post-build command: lib MathFuncsLib.obj
#include "MathFuncsLib.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
if (b == 0)
{
throw new invalid_argument("b cannot be zero!");
}
return a / b;
}
}
⑤ プロジェクトをスタティック ライブラリにビルドするには、[プロジェクト] メニューの MathFuncsLib Properties… をクリックします。左ペインで、[構成プロパティ] の下の [全般] をクリックします。右ペインで、[構成の種類] を [スタティック ライブラリ (.lib)] に変更します。[OK] をクリックして、変更を保存します。
⑥ [ビルド] メニューの [ソリューションのビルド] をクリックし、スタティック ライブラリをコンパイルします。これにより、他のプログラムで使用できるスタティック ライブラリが作成されます。
3. このスタティックライブラリを参照するアプリケーションを作成する
① 作成したスタティック ライブラリを参照して使用するアプリケーションを作成するには、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
② プロジェクトの種類ペインで、[Visual C++] の [win32] をクリックします。
③ テンプレート ペインの [Win32 コンソール アプリケーション] をクリックします。
④ プロジェクトとして「MyExecRefsLib」などの名前を付け、[プロジェクト名] フィールドに入力します。[ソリューション] の横のドロップダウン リストで、[ソリューションに追加] をクリックします。これにより、スタティック ライブラリと同じソリューションに新しいプロジェクトが追加されます。
⑤ [OK] をクリックして、Win32 アプリケーション ウィザードを起動します。[Win32 アプリケーション ウィザード] ダイアログ ボックスの [概要] ページで、[次へ] をクリックします。
⑥ Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[アプリケーションの種類] の [コンソール アプリケーション] を選択します。
⑦ Win32 アプリケーション ウィザードの [アプリケーションの設定] ページで、[追加のオプション] の下にある [プリコンパイル済みヘッダー] の選択を解除します。
⑧ [完了] をクリックして、プロジェクトを作成します。
4. アプリケーションからスタティックライブラリのを使用するには
① 新しいコンソール アプリケーションを作成すると、空のプログラムが作成されます。ソース ファイルの名前は、前の処理でプロジェクトに付けた名前と同じになります。この例では、「MyExecRefsLib.cpp」という名前です。
② スタティック ライブラリで作成された数値演算ルーチンを使用するには、それを参照する必要があります。このためには、[プロジェクト] メニューの [参照] をクリックします。[プロパティ ページ] ダイアログ ボックスで、[共通プロパティ] ノードを展開し、[参照設定] をクリックします。次に、[新しい参照の追加] ボタンをクリックします。[参照] ダイアログ ボックスの詳細については、「[参照設定] ([<プロジェクト名> プロパティ ページ] ダイアログ ボックス - [共通プロパティ])」を参照してください。
③ [参照の追加] ダイアログ ボックスが表示されます。このダイアログ ボックスには、参照できるすべてのライブラリが表示されます。[プロジェクト] タブでは、現在のソリューション内のすべてのプロジェクト、およびそれらに含まれるすべてのライブラリが表示されます。[プロジェクト] タブで、MathFuncsLib をクリックします。次に [OK] をクリックします。[参照の追加] ダイアログ ボックスの詳細については、「[参照の追加] ダイアログ ボックス」を参照してください。
④ スタティック ライブラリのヘッダー ファイルを参照するには、インクルード ディレクトリ パスを変更する必要があります。このためには、[プロパティ ページ] ダイアログ ボックスで、[構成プロパティ] ノードを展開し、次に [C/C++] ノードを展開して、[全般] をクリックします。[追加のインクルード ディレクトリ] の横に、MathFuncsLib.h ヘッダー ファイルへのパスを入力します。
⑤ これで、MyMathFuncs クラスをこのアプリケーションで使用できます。MyExecRefsLib.cpp の内容を次のコードに置き換えます。
// MyExecRefsLib.cpp
// compile with: /EHsc /link MathFuncsLib.lib
#include <iostream>
#include "MathFuncsLib.h"
using namespace std;
int main()
{
double a = 7.4;
int b = 99;
cout << "a + b = " <<
MathFuncs::MyMathFuncs::Add(a, b) << endl;
cout << "a - b = " <<
MathFuncs::MyMathFuncs::Subtract(a, b) << endl;
cout << "a * b = " <<
MathFuncs::MyMathFuncs::Multiply(a, b) << endl;
cout << "a / b = " <<
MathFuncs::MyMathFuncs::Divide(a, b) << endl;
return 0;
}
5. アプリケーションの実行
① MyExecRefsLib が既定のプロジェクトとして選択されていることを確認します。ソリューション エクスプローラで [MyExecRefsLib] を選択し、次に [プロジェクト] メニューの [スタートアップ プロジェクトに設定] を選択します。
② プロジェクトを実行するには、[デバッグ] メニューの [デバッグなしで開始] を選択します。出力は、次のようになります。
ライブラリの基礎 [開発環境]
Linux ライブラリの3類
スタティックライブラリは、コンパイル時にコードがプログラムに組込まれます。 モジュールサイズが大きくなりますが、別のマシンにバイナリで配布したときに そのライブラリがなくても動作します。 .a で終わるファイルです。
共有ライブラリは、プログラムの実行時にロードされます。マシンによっては、 その共有ライブラリがなかったり、バージョンが違ったりして、動作しないことがあります。 .so と .sa で終わるファイルです。.sa は、古い a.out 形式で使われた共有ライブラリです。
ダイナミックライブラリは、共有ライブラリの1種です。実行時に 関数を使って ロードしたり、アンロードしたりできます。
ライブラリ化の勧め
殆ど変更しなくなってきたクラスについては「ライブラリ化」をしてすっきり整理することをお勧めします。
ライブラリの基本については、以下が参考になります。
http://marupeke296.com/DXCLS_MakeStaticLib.html
http://www.glamenv-septzen.net/nifty/others/computer/linux_ldd01.html
ライブラリの作成方法については、以下が参考になります。
http://msdn.microsoft.com/ja-jp/library/ms235627(v=vs.90).aspx
http://www.ncad.co.jp/~komata/c-kouza26.htm
http://www.geocities.jp/ky_webid/win32c/056.html
食事ワンポイント[12] [健康]
恩讐の彼方に [読書]
タイヨウのうた [映画]
勇者ヨシヒコと魔王の城 [エンターテイメント]
食事ワンポイント[11] [健康]
~プログラム実施の柱~
4.ビタミン、ミネラルをとる
スポーツ選手のエネルギー代謝は一般人のそれと比較して非常に大きく、特に瞬発力を必要とする競技では、その最大の力を発揮している時にエネルギー代謝に関わるビタミン、ミネラルがどれほど消費されているかを知ることはできません。
ビタミンB群は糖質、脂質、たんぱく質の代謝に補酵素として関わっています。また、神経の働きとも大きく関わっていることからも、特にスポーツ選手には欠くことのできないビタミンといえます。常に疲労感、倦怠感がつきまとう選手にビタミンB群のサプリメントを投与すると、その症状は改善されます。また、発汗量が増え、尿の回数が増えるという人もいます。
酸素摂取量の多いスポーツマンにとって細胞の酸化、つまり組織の老化の原因となる活性酸素の害を打ち消すビタミンA、C、Eは注目に値します。それぞれが運動能力のアップ、体の組織の強化、免疫力の強化といった報告が数多く出されている中で、こうした脂溶性のビタミンをサプリメントの形で摂取することが必要です。
丈夫な骨を保つためにはカルシウムが必要なことはいうまでもありません。カルシウムが不足すると、骨からカルシウムが溶けだし、溶けだしたカルシウムは関節に沈殿し、関節炎を引き起こし、また、カルシウム不足は筋肉のけいれんの原因にもなります。
たんぱく質のとりすぎもカルシウムを骨から溶けださせます。骨からカルシウムが溶けださないようにし、常につくりかえられている骨を丈夫に保つするためには、単独では非常に吸収されにくいカルシウムをリン、マグネシウムとのバランスをとって確実に補給することが必要です。
疲労回復をうたっているドリンクや総合ビタミンにはビタミンB群が主に入ってますね。
激しい運動をした晩にこれらのビタミンを取ると、次の日の朝の疲労感の残り方がぜんぜん違ってきます。
あとカルシウムの大切さは、このコラムを読んでから知りました。カルシウムは育ち盛りの子供のころに必要と思ってました。さらにスポーツ選手にはタンパク質のほうが重要と考えていたのでタンパク質は積極的に取ってませんでした。
まあ牛乳を飲むとお腹が痛くなって下痢してたので、あえて取ろうとは思いませんでした。
いまは毎晩飲んでますが、不思議なことに、お腹が痛くなる事は無くなってました?
iPad mini 届きました [ガジェット]
iPad mini 届きました。
納入予定は2週間後の21日でしたが、1週間早く昨日届きました。
今回注文したのは以下の3つで、Apple Store で購入したので刻印入としました。
- iPad mini Wi-Fi 16GB - ホワイト&シルバー(刻印入り)
- SoftBank Wi-Fi スポット(2年間)(無料)
- Pad mini Smart Cover - ダークグレー
本体です。奇麗ですね。
付属品です。あっさりしてます。
各種設定が終了して、Smart Coverを装着ところです。
刻印は、いつもそうありたいとの思いから、マザーテレサの言葉を使わせて頂きました。
Peace begins with a smile.「幸せは笑顔から始まる。」
それと自分の名前を刻印しました。
使用感については、使い始めたばかりですが、快適に使えています。
iPadを購入した目的の一つに、iOS用の豊富なアプリを使いたかったためなので、これからいろいろと楽しみです。
あと「SoftBank Wi-Fi」については、登録用のサイトにアクセスできなくて、ずいぶん悩みました。
携帯電話もしくは、スマホ(3G経由のみ)のみでアクセス可能とあったので、docomoスマホのwifiを停止してアクセスしましたがダメでした。
ウェブで検索したところ、softbank以外のスマホではアクセスできない様子です!
結局ソフトバンクモバイルに電話して確認する事にしました。AppleからのメールにiPadが届いてから5日後から登録するように書いてあったので、来週末にでも電話してみます。
他社スマホからのアクセスを制限する対応には疑問を感じますね。。。