• 締切済み

クラスの利点について

手続き志向プログラミングになれてしまって困っています。クラスは関数、構造体とはどう違うのですか。参考書に載っている<クラスを使った例題>を、<関数&構造体>に置き換えたほうが短くなりますし、見やすく感じてしまいます。クラスの良さというものが分かりません。固くなった私の頭を納得させるような説明やその例題(実用的なもの)をお願いします。

みんなの回答

  • sssohei
  • ベストアンサー率33% (33/98)
回答No.2

はっきり言って、入門書の例題が悪いだけと言わざるを得ません。 たぶん C -> C++ だと思うので、C++ の STL を一例に挙げてみます。 配列の変わりに vector という(テンプレート)クラスがあります。配列の長さが実行時に動的に変化する場合、従来の関数&構造体では、メモリの管理に手間を取られていました。 しかし、vector クラスを使えば、サイズ変更は resize() の一行ですみ、また、解放も vector クラスが自動的に行ってくれるので、利用者は心配する必要がありません。 この様に、設計者と利用者が違う場合でもスムーズに、手間が少なく利用出来ます。 配列の大きさが欲しくなれば size() で得ることが出来ますし、それようの(何処で書き換えられるか分かったもんじゃない)グローバル変数を用意する必要はなくなります。 ソートしたくなれば、vector を使っていようが、list を使っていようが同じ sort 関数を用いればソートが出来てしまいます。 char* ではいちいち、どのくらい確保したから…というのを気にしてプログラムしなければいけませんが、stringを用いればそのような苦労も減ります。 また、シューティングゲームを作ることを考えます。 敵キャラを管理する必要がありますが、このとき、構造体&関数を使って、敵キャラそれぞれに独自の動きをつけようとすると、なかなかすっきりしたプログラムを作ることは出来ません。 しかし、CEnemyBase という基底クラスから敵キャラのクラスを派生させるような設計にすれば、管理は CEnemyBase のポインタ配列を持てば良いことになり、実装もすっきりしたものになります。 基底クラスにある描画する関数などは、派生クラスで独自のものにオーバーライド出来るので、わかりやすさを保ったまま細かく制御することが出来ます。 また、メンバ変数に直接アクセス出来ないようにするカプセル化も大きく力を発揮します。変数に代入する際、値のチェックなどを「確実に」するようにすると物凄い行数が必要となってしまいます。しかし、メンバ関数を通じてアクセスするようにすれば、安全なアクセスにすることができます。 また、ちょっと変更したいなと言うときのつぎはぎ的な作業もクラス化しておいた方が楽です。 そして、クラス単位に設計を分けることで複数人での分散作業もしやすくなります。 後、例えば、fwrite や fread の様にいちいちサイズを指定する必要がある関数よりも、クラスで型毎に動作が分かれている方が見やすいプログラムになりませんか? そういった、面倒な部分を隠してしまうと言うのがとりあえず、わかりやすいメリットでは無いかと思います。 他にもメリットはたくさんあります。 もちろん、小規模のプログラムでも無理に使う必要はありませんが、大抵うまくクラスを使った方が見やすいです^^;

fuuuu3
質問者

お礼

なるほどですね。ちょっと分かったような気がします。またクラス設計に挑戦してみようと思います。ありがとうございました。

回答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;      } もし、継承、インプリメント、多重継承、などが分からない点だったら アドバイスの意味が無かったかもしれないですね。 以上

fuuuu3
質問者

お礼

2)doubleやintなどの型の拡張。     クラスの例   :複素数     オブジェクトの例:3i+1     データ例    :実数部(1)、虚数部(3)     操作の例    :2つの複素数の距離の計算        3)ある抽象化されたモノや型のデータや操作をひとまとめにしたもの。     クラスの例   :人間     オブジェクトの例:花子さん、太郎さん、…。     操作の例    :歩く     データ例    :位置座標 ↑ホント分かりやすいです。今からちょっとクラス設計に挑戦しようと思います。 回答していただきありがとうございました。

関連するQ&A

  • C++のクラスについて

    シューティングゲームの製作の為、C++を勉強しているのですが、 C++のクラスというのは、C言語でいう構造体の強化版!みたいな感じで考えて良いのでしょうか。 また、Cの構造体とC++のクラスの違いは何でしょうか。 クラスの中に関数を作る利点は何なのでしょうか。 質問が多くて申し訳ないのですが、ご教授の方よろしくお願いします。

  • 構造体とクラスの違い

    お世話になります。 先日、C(C++もかな?)のベテランのプログラマの方が「構造体とクラスはまったく違うものだ」ときっぱり言い切っていらっしゃいました。私は、構造体にメソッドが加わったものがクラスだ、くらいな認識で、まったく違うものというよりはかなり近しい概念だと思っていたので少々驚いた次第です。 疑問が残りましたので、インターネットでいろいろ検索してみたのですが、おしなべて「構造体とクラスには共通点が多い」と説明されており、どうしても「まったく違うもの」と解釈できる文献を見つけることができませんでした。 果たして「構造体とクラスはまったく違うもの」なのでしょうか?

  • C++のクラスについて

    C++を勉強しているC言語経験者です。 C++のクラスについてですが、クラスのメリットとはなんでしょうか?なんだか関数ポインタを持った構造体にしか見えないと言うか・・・(あと隠蔽化機能も持ってるんですね)。私が小規模なプログラムを組んだことしかない為か、クラスの必要性が全くわかりません。クラスは具体的にどう使い、どう役に立つものなのでしょうか? 回答よろしくお願いします。

  • Java:クラスをたくさん使ったプログラミング?

    Java言語勉強中のものです。 Eclipseをつかっています。 初心者ですので、易しい言葉でご回答いただければ幸いです。 Javaの基礎についてひととおり勉強しました。 オブジェクト指向についても、だいたい・・なんとなくは理解できていると思います。 ただ、自分で作成するときに、 うまくオブジェクト指向を取り入れたプログラミングができません。 なんだかあっちこっちのものを呼び出してきてとてもややこしいです。 クラスがたくさんつかわれているプログラムは、 ほかの人がつくったプログラムをなんとかがんばって読む、というのが精一杯です。 自分ではとても思いつかない構造ばかりです。 あっちこっちからよんできているので、図やらリストやらを書いて 本当に「なんとか」理解できた、というレベルです。 クラスが5個以上になると正直もう嫌だってなります。。実用レベルにはまだまだ至っていません。 本当の意味でオブジェクト指向を理解できていないのかもしれません。 どうすればそういった、オブジェクト指向をとりいれたプログラムが書けるようになるのでしょうか? いろんなプログラムを見る、数をこなすことでしょうか? 何かおすすめの参考書や、 「こういう考え方をすれば・・・」というものがありましたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • C++の例題ください

    プログラミング言語がC++で、<Graphics.h>を使っていないプログラムの例題をください。参考書を買ったのですが、例題が少なくてクラス設計のところがうまく分かりません。よろしくお願いします。

  • クラスの分割

    画像処理のプログラムを書いているのですが、1つのクラスに必要な変数と関数をぶち込んだため、変数20~、関数20~、2000行くらいのクラスになっています。 このままでは見辛いので、クラスを処理ごとに分割して見易くしたいのですが、各関数でいくつか共通の変数を使用しているため上手く分割ができなくて困っています。 データのみのクラスを継承した子クラスを3つ作ってみたらインスタンスが3つできてしまい意味がありませんでした。 ↓の図に示すようなクラスを作りたいのですが、いくつか質問をさせてください       共通データクラス     /    |    \   子クラスA 子クラスB 子クラスC 1、変数20~、関数20~、2000行くらいのクラスは普通でしょうか?(分割する必要がありますか?) 2、↑の図はクラスの作り方として問題がありますか? 3、2で問題がない場合実現する方法として、仮想継承、関数に共通データのポインタを渡す以外に方法があるかどうか まだまだC++を勉強中で、便利な構造体程度にしか使えていませんが、どなたかご教授お願いします。

  • オブジェクト指向プログラミング

    一般に、オブジェクト指向プログラミングといわれているプログラミングに関してですが、 「関数・手続きを使用するプログラミング」と 「クラスを作成してプログラミング」というのは おおきな違いがあるのでしょうか? (クラスを作成しなくても関数・手続きで、プログラミングすれば 一緒じゃないかなぁと思っていますので・・・。) どなたか、これに関して、お返事をして頂けたら今後いろいろな面でかなり助かります。

  • クラス内で、親ではない他のクラスへアクセスしたい。

    こんばんは、C++のプログラミングに関しての質問です。 現在、勉強がてら作っているゲームプログラミングで、躓いている部分があります。 現在、プレイヤーではないオブジェクトの描画を以下のソースコードで描画しています。 for(Check_OBJ=1;Check_OBJ<OBJ_num;Check_OBJ++) OBJ_Array[Check_OBJ]->Draw_Graph(PL_Array[1]->Ref_x(),PL_Array[1]->Ref_y()); OBJ_ArrayはObjectクラス、PL_ArrayはPlayerクラス、Ref_変数名 は変数名の値を返す関数です。 このソースコードを、Objectクラスのメンバ関数Action()の中に入れたいのですが、エラーが出てしまうのです、ソースコードは以下の通りです。 void Object::Action() { Draw_Graph(PL_Array[1]->Ref_x(),PL_Array[1]->Ref_y()); } エラー内容は error C2227: '->Ref_y' : 左側がクラス、構造体、共用体、ジェネリック型へのポインターではありません。 error C2027: 認識できない型 'Player' が使われています。 です。 Playerクラスが定義されてないと認識しているのかと思い、前方宣言もしてみたのですが改善できず、どうすれば良いのか解りません。 クラス内で他のクラスへアクセスするためには何か他の処理が必要なのでしょうか・・・? 解決方法をご存知の方がいたら教えて頂けると助かります、よろしくお願いします。

  • ウィンドウクラスの指定について

    いつもお世話になっていますGedankenです。 ウィンドウズプログラムについて素朴な質問があります。 Win32 API プログラミング(C言語)ではRegisterClass などで登録した ウィンドウクラスをCreateWindow を使う時"文字列"で指定すると思いますが なぜそんなに回りくどいことをするのでしょうか。 普通に考えれば構造体へのポインタなどで指定した方がスマートだと 思うのですが、どうなのでしょうか。 多分ちゃんとした理由があると思いますが、そこについて解説お願いします。 よろしくお願いします。

  • オブジェクト指向(具体的にはどんなクラスで作ります?)

     オブジェクト指向、クラスの便利さは大体わかりました。 (赤外線やマイクロ波の専門的な説明はわかったけど、リモコンや電子レンジに具体的に見てみないと、ぴんときていない状態だと、思います。) それに、一人で作っていることもあり、また構造化プログラミングで今まで作ってきたので、具体的にどういうクラスに分け、どういうことを将来予想し、作るのかがわかりません。 仮に、シンプルな日記から作る場合、どういったクラスを作り、どういうことを予想し、作りますか? 特に、継承や他に使いまわせるようにとか、ソフトを作り、何を想定するのかを知りたいです。

専門家に質問してみよう