No.1ベストアンサー
- 回答日時:
回答ではありません。
短いプログラムだと一般的には<関数&構造体>がわかりやすいでしょう。
自分はクラスは、以下のようなものだと考えています。
1)継承を除けば、クラスと<関数&構造体>は同じもの。
2)doubleやintなどの型の拡張。
クラスの例 :複素数
オブジェクトの例:3i+1
データ例 :実数部(1)、虚数部(3)
操作の例 :2つの複素数の距離の計算
3)ある抽象化されたモノや型のデータや操作をひとまとめにしたもの。
クラスの例 :人間
オブジェクトの例:花子さん、太郎さん、…。
操作の例 :歩く
データ例 :位置座標
クラスの利点をわかりやすく言うと
1)データと操作を一体化させる。
2)操作の名前を統一できる。
言語によって以下のような利点があります。
1)継承ができる。(多重継承などがあるものもある)
(差分プログラミング)
2)データの隠蔽ができる。
補足事項
1)言われているほど継承は用いられないことが多い。
2)結局、クラスの操作をコーディングするときに手続き指向を使用する。
問題は構造化プログラミングができるかどうかです。
これを理解しているならば、クラスの利点も見えてきます。
継承機能を除けば、クラスとは手続き指向と互換性があります。
例えば、B構造体にある操作は、A構造体の操作と同じ概念なので
同じ名前にしたいとき、手続き指向で考えるなら、
きっと似た名前にしようとしますね。
typedef struct A{
} A;
typedef struct B{
} B;
void A_operation(A *, arguments, ...);
void B_operation(B *, arguments, ...);
void main(){
A *a;
B *b;
A_operation(A, arguments, ...);
B_operation(B, arguments, ...);
}
クラスで実現するならば、以下のようにしませんか?
class A{
public:
void operation(arguments, ...);
}
class B{
public:
void operation(arguments, ...);
}
void main(){
A *a = new A;
B *b = new B;
a->operation(arguments, ...);
b->operation(arguments, ...);
delete A;
delete B;
}
もし、継承、インプリメント、多重継承、などが分からない点だったら
アドバイスの意味が無かったかもしれないですね。
以上
2)doubleやintなどの型の拡張。
クラスの例 :複素数
オブジェクトの例:3i+1
データ例 :実数部(1)、虚数部(3)
操作の例 :2つの複素数の距離の計算
3)ある抽象化されたモノや型のデータや操作をひとまとめにしたもの。
クラスの例 :人間
オブジェクトの例:花子さん、太郎さん、…。
操作の例 :歩く
データ例 :位置座標
↑ホント分かりやすいです。今からちょっとクラス設計に挑戦しようと思います。
回答していただきありがとうございました。
No.2
- 回答日時:
はっきり言って、入門書の例題が悪いだけと言わざるを得ません。
たぶん C -> C++ だと思うので、C++ の STL を一例に挙げてみます。
配列の変わりに vector という(テンプレート)クラスがあります。配列の長さが実行時に動的に変化する場合、従来の関数&構造体では、メモリの管理に手間を取られていました。
しかし、vector クラスを使えば、サイズ変更は resize() の一行ですみ、また、解放も vector クラスが自動的に行ってくれるので、利用者は心配する必要がありません。
この様に、設計者と利用者が違う場合でもスムーズに、手間が少なく利用出来ます。
配列の大きさが欲しくなれば size() で得ることが出来ますし、それようの(何処で書き換えられるか分かったもんじゃない)グローバル変数を用意する必要はなくなります。
ソートしたくなれば、vector を使っていようが、list を使っていようが同じ sort 関数を用いればソートが出来てしまいます。
char* ではいちいち、どのくらい確保したから…というのを気にしてプログラムしなければいけませんが、stringを用いればそのような苦労も減ります。
また、シューティングゲームを作ることを考えます。
敵キャラを管理する必要がありますが、このとき、構造体&関数を使って、敵キャラそれぞれに独自の動きをつけようとすると、なかなかすっきりしたプログラムを作ることは出来ません。
しかし、CEnemyBase という基底クラスから敵キャラのクラスを派生させるような設計にすれば、管理は CEnemyBase のポインタ配列を持てば良いことになり、実装もすっきりしたものになります。
基底クラスにある描画する関数などは、派生クラスで独自のものにオーバーライド出来るので、わかりやすさを保ったまま細かく制御することが出来ます。
また、メンバ変数に直接アクセス出来ないようにするカプセル化も大きく力を発揮します。変数に代入する際、値のチェックなどを「確実に」するようにすると物凄い行数が必要となってしまいます。しかし、メンバ関数を通じてアクセスするようにすれば、安全なアクセスにすることができます。
また、ちょっと変更したいなと言うときのつぎはぎ的な作業もクラス化しておいた方が楽です。
そして、クラス単位に設計を分けることで複数人での分散作業もしやすくなります。
後、例えば、fwrite や fread の様にいちいちサイズを指定する必要がある関数よりも、クラスで型毎に動作が分かれている方が見やすいプログラムになりませんか?
そういった、面倒な部分を隠してしまうと言うのがとりあえず、わかりやすいメリットでは無いかと思います。
他にもメリットはたくさんあります。
もちろん、小規模のプログラムでも無理に使う必要はありませんが、大抵うまくクラスを使った方が見やすいです^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どこからも呼ばれていない無意...
-
修学旅行での演芸大会の出し物...
-
java eclipse 型に解決できません
-
packageとimport の違いって?
-
配列の重複する値とその個数を...
-
コンボボックスのマウスホイー...
-
意味の違いを教えてください Sh...
-
tomcat上でのpropertiesファイ...
-
ATLとMFCの違いは何でしょうか?
-
dllと同じプロジェクトにする方法
-
eclipse でクラスに色
-
VBAもしくはVB6:クラスの中で...
-
JAVAで直系の既知のサブクラス...
-
成人式の後中3のクラスで集まろ...
-
同一パッケージにあるクラスが...
-
UMLのクラス図はmain()も含むん...
-
グローバルIPとプライベートIP...
-
ドキュメントクラスの取得方法
-
1 つのヘッダファイルに複数の...
-
配列クラスのクラス名
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の重複する値とその個数を...
-
java eclipse 型に解決できません
-
どこからも呼ばれていない無意...
-
main()を持つクラスが2つ以上...
-
UMLのクラス図はmain()も含むん...
-
A・B・Cクラスとは?
-
同じクラスにならない確率を教...
-
eclipse でクラスに色
-
IPアドレスの3バイト目の呼び方
-
修学旅行での演芸大会の出し物...
-
「天声人語」をインターネット...
-
共通で使う関数を集めたクラス...
-
3年間同じクラスになる確率
-
dllと同じプロジェクトにする方法
-
同一パッケージにあるクラスが...
-
重複エラーを解決するには
-
ネスカフェ エクセラ と UCCク...
-
IPアドレスのクラスAを取得して...
-
1 つのヘッダファイルに複数の...
-
複数のクラスで共通した関数を...
おすすめ情報