風呂場でこんな事を考えていたので書いてみようと思います。なおこの記事はC言語を理解している人向けです。後継承やコンストラクタ等々には触れません。クラスというのはこんな考え方だと説明します。
ソースはC++を使用します。
例はロボットにします。今回はアイボにしましょう。
http://images.google.co.jp/imglanding?q=%E3%82%A2%E3%82%A4%E3%83%9C&imgurl=http://sonytsu.img.jugem.jp/20060309_31114.jpg&imgrefurl=http://sonytsu.jugem.jp/%3Feid%3D15&usg=__0iW1ZtPTCFfNb36CMLFd4V0tkho=&h=171&w=262&sz=13&hl=ja&zoom=1&um=1&itbs=1&tbnid=BaQwXnsuaJ4nSM:&tbnh=73&tbnw=112&prev=/images%3Fq%3D%25E3%2582%25A2%25E3%2582%25A4%25E3%2583%259C%26um%3D1%26hl%3Dja%26lr%3D%26tbs%3Disch:1&um=1&lr=&tbs=isch:1&start=0#tbnid=BaQwXnsuaJ4nSM&start=2
当たり前の事を言いますがこのロボットはアイボです。「アイボ」というのはソニーさんが考えた名前ですよね。製造名です。これがクラス名になります。
クラス名というのはその物(今回はロボット)の製造名です。型名です。もしソニーさんが猫のロボット、例えば「ニャンボ」を製造すればクラス名は「ニャンボ」になります。
アイボの話に戻します。アイボの外見はどのようなものでしょうか?このアイボには手足が4本ありますね。(手と足は分けておきましょう。手が2つ。足が2つ)尻尾が1本ありますね。大きさはどれぐらいなのでしょうか?50cmとしましょう。
これらはオブジェクト指向の「メンバ変数」にあたります。メンバ変数はクラスの要素なんです。このクラスは何を持っているのか。どのくらいの大きさなのか。それらの値をメンバ変数と言います。
要素だけではなく動作はどうでしょう?歩きますよね。尻尾を振りますよね。鳴くか分かりませんが鳴くとしましょうw歩くのもただ歩くのと人(飼い主)に向かって歩くことにしましょう。
これらはオブジェクト指向の「メンバ関数」にあたります。メンバ関数はメンバ変数を使い動作させるものです。歩くためには手足を動かさないといけませんよね。尻尾を振るにも尻尾を動かさないといけませんよね。鳴くにはどれくらいの大きさで、どう鳴く決めないといけませんよね。おっ、では大きさと鳴く内容もメンバ変数にしてしまいましょう。大きさはテレビの音量20(適当です。)、内容はワンワンとクゥーンにしましょう。
今決まったのは
クラス名:アイボ
メンバ変数:手足4本、尻尾1本、大きさ50cm、声の大きさ20、話す内容ワンワン、クゥーン
メンバ関数:歩く、尻尾を動かす、鳴く
ではこれをプログラムで書いてみましょう。
class Aibo { ←これがクラス名
moveObject hand[2];
moveObject leg[2];
moveObject tail[2];
int voiceScale = 20;
char speak[2] = {"ワンワン", "クゥーン"}; ←ここまでがメンバ変数
void walk(){ 手足を動かす。};
void walkToOwner() { 飼い主に向かってwalk() };
void moveTail(){ 尻尾を動かす。};
void bark(bool speak){ 声の大きさで、引数によってワンワンかクゥーンと話す。}; ←ここまでがメンバ関数
};
MoveObjectはintやcharの様な型です。
これでクラスを定義出来ました。しかし残念なことにまだこれでは終わりません。
メンバ変数、メンバ関数にはアイボしか操作出来ないもの。飼い主しか操作出来ないものを決めないといけません。
歩くというのはアイボがする動作ですよね?尻尾を動かすことも。では飼い主に向かって歩くことはどうでしょう?飼い主が「ここまでおいで。」と言うとアイボが飼い主に向かって歩き、アイボが飼い主を見つけたら自動で向かって歩きましょう。尻尾はアイボの気分で振ることにしましょう。鳴くのはアイボが勝手にも鳴くし、飼い主がワンワンと言ったらワンワン、クゥーンと言ったらクゥーンと鳴きましょう。
これをプログラムで書かないといけません。書くには宣言の前にprivate:、public:と付けなければいけません。
class Aibo { ←これがクラス名
private: MoveObject hand[2];
private: MoveObject leg[2];
private: MoveObject tail[2];
private: int voiceScale = 20;
private: char speak[2] = {"ワンワン", "クゥーン"}; ←ここまでがメンバ変数
private: void walk(){ 手足を動かす。};
public: void walkToOwner() { 飼い主に向かってwalk() };
private: void moveTail(){ 尻尾を動かす。};
public: void bark(bool speak){ 声の大きさで、trueでワンワン、falseでクゥーンと話す。}; ←ここまでがメンバ関数
};
これで歩く動作、尻尾を動かす動作はアイボだけが、飼い主に向かって歩く動作、鳴く動作は飼い主とアイボが操作出来るようになりました。walk()はAiboのメンバ関数、つまりwalk()、walkToOwner、moveTail()、bark()しか使うことが出来ません。moveTail()も同じです。
オブジェクト指向では飼い主だけが操作出来るものを決めることは出来ません!(これがあったらバグ少なくなると思うのになぁ)
「メンバ変数の前にもprivate:が付いてるぞー。どうなってるんだ?」と思った人は良く見ています。これは最後に記述します。
では最後にこのAiboクラスを使ってみましょう。
int main(){
Aibo aibo; ←aibo変数はAiboクラスです、と宣言。
aibo.walk(); ←歩く。だがこれはエラー。なぜかと言うとwalk()はprivate:だからです。
aibo.walkToOwner(); ←飼い主に向かって歩く。
aibo.moveTail(); ←尻尾を振る。だがこれはエラー。なぜかと言うとmoveTail()はprivate:だからです。
aibo.bark(true); ←鳴く。trueを渡しているのワンワン鳴く。
}
後はメンバ関数内と色々と書いてやればオッケーです。しかし実はこれでもエラーが出ます。答えは後述を見てください。
後述:メンバ変数のprivate:
先ほどのAiboクラスはエラーが出ます。問題はここ
private: int voiceScale = 20;
char speak[2] = {"ワンワン", "クゥーン"};
クラスを作る際はメンバ変数に値を決めることが出来ません。voiceScale、speakはprivate:なのでメンバ関数内かセッターで値を決めなければいけません。(実はvoiceScaleは値を決めることは出来ますがこの記事では書きません。)
おまけ:ゲッターセッター
先ほどAiboクラスでメンバ変数にprivate:を付けましたね。つまりAiboクラスしか使うことが出来ません。なぜこういう風にしたのか書きます。
まず「メンバ変数はクラス内で書きかえる。」というプログラマーでは暗黙の了解があります。メンバ変数はクラス外で勝手に値を変えない様にするのが基本です。
ではなぜクラス外で値を変える事がいけないのでしょうか。答えはバグの原因になるからです。クラス外で値が変えられるということは、「いつでも」「どこでも」値が変える事が出来ます。プログラムが大きくなればなるほど見つけることが困難になります。
ではクラス外ではメンバ変数の値を変えることが出来ないのか、というかメンバ変数の値がほしい時はどうすればいいんだという疑問が出ると思います。実は答えがあります。
答えはゲッターセッターを作ることです。先ほどのメンバ変数voiceScale、speakは値を自由に変えたいですよね。そのためにAiboクラスにゲッターセッターを作ります。
public: int getVoiceScale() { return voiceScale; } ←ゲッター
public: void setVoiceScale(int scale) { voiceScale = scale; } ←セッター
(speakも同様。)
これでvoiceScaleの値が取れますし、値をセットすることが出来ます。
なんかめんどくさい、と思ったあなた。そういう人はvoiceScale、speakをpublic:にすればいいです。しかしバグを見つける方が間違いなくめんどくさいです。「俺はメンバ変数もpublic:にするぞー。」と言う人はどうぞやってください。エラーは出ません。しかしおススメはしません。
とまぁ長くなりましたがクラスとはどういうものか分かっていただけたでしょうか。あくまでもこの記事は「クラスはこういうものなんだよ。」というものです。説明していないものがたくさんあります。
クラスは実際作って慣れていけばすぐ理解が深まります。負けずに頑張ろう!
ソースはC++を使用します。
例はロボットにします。今回はアイボにしましょう。
http://images.google.co.jp/imglanding?q=%E3%82%A2%E3%82%A4%E3%83%9C&imgurl=http://sonytsu.img.jugem.jp/20060309_31114.jpg&imgrefurl=http://sonytsu.jugem.jp/%3Feid%3D15&usg=__0iW1ZtPTCFfNb36CMLFd4V0tkho=&h=171&w=262&sz=13&hl=ja&zoom=1&um=1&itbs=1&tbnid=BaQwXnsuaJ4nSM:&tbnh=73&tbnw=112&prev=/images%3Fq%3D%25E3%2582%25A2%25E3%2582%25A4%25E3%2583%259C%26um%3D1%26hl%3Dja%26lr%3D%26tbs%3Disch:1&um=1&lr=&tbs=isch:1&start=0#tbnid=BaQwXnsuaJ4nSM&start=2
当たり前の事を言いますがこのロボットはアイボです。「アイボ」というのはソニーさんが考えた名前ですよね。製造名です。これがクラス名になります。
クラス名というのはその物(今回はロボット)の製造名です。型名です。もしソニーさんが猫のロボット、例えば「ニャンボ」を製造すればクラス名は「ニャンボ」になります。
アイボの話に戻します。アイボの外見はどのようなものでしょうか?このアイボには手足が4本ありますね。(手と足は分けておきましょう。手が2つ。足が2つ)尻尾が1本ありますね。大きさはどれぐらいなのでしょうか?50cmとしましょう。
これらはオブジェクト指向の「メンバ変数」にあたります。メンバ変数はクラスの要素なんです。このクラスは何を持っているのか。どのくらいの大きさなのか。それらの値をメンバ変数と言います。
要素だけではなく動作はどうでしょう?歩きますよね。尻尾を振りますよね。鳴くか分かりませんが鳴くとしましょうw歩くのもただ歩くのと人(飼い主)に向かって歩くことにしましょう。
これらはオブジェクト指向の「メンバ関数」にあたります。メンバ関数はメンバ変数を使い動作させるものです。歩くためには手足を動かさないといけませんよね。尻尾を振るにも尻尾を動かさないといけませんよね。鳴くにはどれくらいの大きさで、どう鳴く決めないといけませんよね。おっ、では大きさと鳴く内容もメンバ変数にしてしまいましょう。大きさはテレビの音量20(適当です。)、内容はワンワンとクゥーンにしましょう。
今決まったのは
クラス名:アイボ
メンバ変数:手足4本、尻尾1本、大きさ50cm、声の大きさ20、話す内容ワンワン、クゥーン
メンバ関数:歩く、尻尾を動かす、鳴く
ではこれをプログラムで書いてみましょう。
class Aibo { ←これがクラス名
moveObject hand[2];
moveObject leg[2];
moveObject tail[2];
int voiceScale = 20;
char speak[2] = {"ワンワン", "クゥーン"}; ←ここまでがメンバ変数
void walk(){ 手足を動かす。};
void walkToOwner() { 飼い主に向かってwalk() };
void moveTail(){ 尻尾を動かす。};
void bark(bool speak){ 声の大きさで、引数によってワンワンかクゥーンと話す。}; ←ここまでがメンバ関数
};
MoveObjectはintやcharの様な型です。
これでクラスを定義出来ました。しかし残念なことにまだこれでは終わりません。
メンバ変数、メンバ関数にはアイボしか操作出来ないもの。飼い主しか操作出来ないものを決めないといけません。
歩くというのはアイボがする動作ですよね?尻尾を動かすことも。では飼い主に向かって歩くことはどうでしょう?飼い主が「ここまでおいで。」と言うとアイボが飼い主に向かって歩き、アイボが飼い主を見つけたら自動で向かって歩きましょう。尻尾はアイボの気分で振ることにしましょう。鳴くのはアイボが勝手にも鳴くし、飼い主がワンワンと言ったらワンワン、クゥーンと言ったらクゥーンと鳴きましょう。
これをプログラムで書かないといけません。書くには宣言の前にprivate:、public:と付けなければいけません。
class Aibo { ←これがクラス名
private: MoveObject hand[2];
private: MoveObject leg[2];
private: MoveObject tail[2];
private: int voiceScale = 20;
private: char speak[2] = {"ワンワン", "クゥーン"}; ←ここまでがメンバ変数
private: void walk(){ 手足を動かす。};
public: void walkToOwner() { 飼い主に向かってwalk() };
private: void moveTail(){ 尻尾を動かす。};
public: void bark(bool speak){ 声の大きさで、trueでワンワン、falseでクゥーンと話す。}; ←ここまでがメンバ関数
};
これで歩く動作、尻尾を動かす動作はアイボだけが、飼い主に向かって歩く動作、鳴く動作は飼い主とアイボが操作出来るようになりました。walk()はAiboのメンバ関数、つまりwalk()、walkToOwner、moveTail()、bark()しか使うことが出来ません。moveTail()も同じです。
オブジェクト指向では飼い主だけが操作出来るものを決めることは出来ません!(これがあったらバグ少なくなると思うのになぁ)
「メンバ変数の前にもprivate:が付いてるぞー。どうなってるんだ?」と思った人は良く見ています。これは最後に記述します。
では最後にこのAiboクラスを使ってみましょう。
int main(){
Aibo aibo; ←aibo変数はAiboクラスです、と宣言。
aibo.walk(); ←歩く。だがこれはエラー。なぜかと言うとwalk()はprivate:だからです。
aibo.walkToOwner(); ←飼い主に向かって歩く。
aibo.moveTail(); ←尻尾を振る。だがこれはエラー。なぜかと言うとmoveTail()はprivate:だからです。
aibo.bark(true); ←鳴く。trueを渡しているのワンワン鳴く。
}
後はメンバ関数内と色々と書いてやればオッケーです。しかし実はこれでもエラーが出ます。答えは後述を見てください。
後述:メンバ変数のprivate:
先ほどのAiboクラスはエラーが出ます。問題はここ
private: int voiceScale = 20;
char speak[2] = {"ワンワン", "クゥーン"};
クラスを作る際はメンバ変数に値を決めることが出来ません。voiceScale、speakはprivate:なのでメンバ関数内かセッターで値を決めなければいけません。(実はvoiceScaleは値を決めることは出来ますがこの記事では書きません。)
おまけ:ゲッターセッター
先ほどAiboクラスでメンバ変数にprivate:を付けましたね。つまりAiboクラスしか使うことが出来ません。なぜこういう風にしたのか書きます。
まず「メンバ変数はクラス内で書きかえる。」というプログラマーでは暗黙の了解があります。メンバ変数はクラス外で勝手に値を変えない様にするのが基本です。
ではなぜクラス外で値を変える事がいけないのでしょうか。答えはバグの原因になるからです。クラス外で値が変えられるということは、「いつでも」「どこでも」値が変える事が出来ます。プログラムが大きくなればなるほど見つけることが困難になります。
ではクラス外ではメンバ変数の値を変えることが出来ないのか、というかメンバ変数の値がほしい時はどうすればいいんだという疑問が出ると思います。実は答えがあります。
答えはゲッターセッターを作ることです。先ほどのメンバ変数voiceScale、speakは値を自由に変えたいですよね。そのためにAiboクラスにゲッターセッターを作ります。
public: int getVoiceScale() { return voiceScale; } ←ゲッター
public: void setVoiceScale(int scale) { voiceScale = scale; } ←セッター
(speakも同様。)
これでvoiceScaleの値が取れますし、値をセットすることが出来ます。
なんかめんどくさい、と思ったあなた。そういう人はvoiceScale、speakをpublic:にすればいいです。しかしバグを見つける方が間違いなくめんどくさいです。「俺はメンバ変数もpublic:にするぞー。」と言う人はどうぞやってください。エラーは出ません。しかしおススメはしません。
とまぁ長くなりましたがクラスとはどういうものか分かっていただけたでしょうか。あくまでもこの記事は「クラスはこういうものなんだよ。」というものです。説明していないものがたくさんあります。
クラスは実際作って慣れていけばすぐ理解が深まります。負けずに頑張ろう!
昔のurl見てたらこのページ残ってて日記読み返してましたw
全くの不定期ですがまたちょこちょこ書いて行こうかと(*´∀`*)
気張らんとガンバロー( ▼▼)_┏━ ☆・・・
全くの不定期ですがまたちょこちょこ書いて行こうかと(*´∀`*)
気張らんとガンバロー( ▼▼)_┏━ ☆・・・



