- ベストアンサー
C++のクラスについて
シューティングゲームの製作の為、C++を勉強しているのですが、 C++のクラスというのは、C言語でいう構造体の強化版!みたいな感じで考えて良いのでしょうか。 また、Cの構造体とC++のクラスの違いは何でしょうか。 クラスの中に関数を作る利点は何なのでしょうか。 質問が多くて申し訳ないのですが、ご教授の方よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
概念的なことは既に述べられているので 私は、具体的なプログラミングの観点から述べたいと思います。 1) コンストラクタで初期化、デストラクタで後始末ができる 特にスタック上にオブジェクトを構築した場合、自動的にデストラクタが呼ばれるので便利です。たとえば、コンストラクタでファイルを開き、 デストラクタで閉じるといった使い方ができます。これは、例外処理機構と組み合わせると、特に威力を発揮します。ファイルのRead/Write/Seek中にI/Oエラーが発生したら、自動的にファイルを閉じるようにできます。 2) 仮想関数により、派生クラスで同名の関数を作成できます。 基本クラスのポインタ(or参照)により派生クラスのオブジェクトを指し示すことが可能です。実際にどのオブジェクトの関数が呼ばれるかは、自動的に判定されるので、すっきりしたプログラムが可能です。 たとえば ドローツールを考えてみます。 円と矩形の描画をサポートします。 Cであれば、円を描くのか、矩形を描くのか判定し、必要なパラメータ(円と矩形では異なる)を取得し、専用の関数を呼んで正しく描画するまで、すべてプログラマが管理しなければなりません。しかも、名前空間もないので、円の描画関数と矩形の描画関数とは同名であってはなりません。 C++だとクラス内にパラメータもすべて管理させることができます。円と矩形の基本クラスとして図形を導入し、描画を仮想関数で実装することで、プログラマは 図形->描画 と書くだけで、 図形が円なら円のパラメータで円が描画され、 図形が矩形なら矩形のパラメータで矩形が描画されます ここで重要なのは"図形が円なら"という判定をプログラマが行わず、自動的に行われることです。(むろん、手動で行うことも可能で、それが必要な場合もありますが、できるだけ自動判定に任せるべきとされています) もう一つは、円クラスと矩形クラスで"描画"という同じ名称を使えることです。 (というかパラメータも含めて一致していなければならない) 図形が2種類しかなかったのであまりありがたみが感じられないかもしれません。しかし、これが三角形、楕円、五角形、塗りつぶされる円, 塗りつぶされる矩形..と無数に増えると図形の判定だけでも大変なことになり、さらに正しい描画関数と組み合わせるのは大変なことです。 この複雑さを管理するために"クラス"があり、データと関数を一緒にしているのです。
その他の回答 (2)
- zwi
- ベストアンサー率56% (730/1282)
>C++のクラスというのは、C言語でいう構造体の強化版!みたいな感じで考えて良いのでしょうか。 C++の言語の実装としてはその通りですね。構造体を拡張したものです。ただし、オブジェクト指向と言う側面で見るとクラスは、データと処理を一つのオブジェクトと言う単位にまとめた物です。構造体を発展させた概念では有りません。元々オブジェクト指向という考え方があり、それをC言語に当てはめて作り出されたのがC++です。 オブジェクト指向の歴史↓ http://itpro.nikkeibp.co.jp/article/COLUMN/20060420/235811/?ST=develop >また、Cの構造体とC++のクラスの違いは何でしょうか。 構造体はデータをまとめたもの。クラスは処理とデータをまとめたもの。クラスはデータ構造を極力隠蔽しメソッドを通じて外部とデータをやり取りします。なのでそのまま全部を外部に露出する構造体とは役割が違います。実際には行儀悪く全部を露出させることも出来るので、作る人次第ですが。 >クラスの中に関数を作る利点は何なのでしょうか。 データ構造やデータ処理に関わる処理手続きをクラスの外部には隠蔽して、クラス内部だけで閉じてしまうことをカプセル化と言います。 カプセル化することで内部の面倒な手続きやデータの振る舞いを理解せずに機能を使うことが出来ます。それと継承という概念を使って元のクラスに機能を追加した別のクラスを作る事が来ます(こちらの方がゲーム製作としては好都合な機能ですかね)。例えば物体と言うクラスを継承して、弾クラスにしたり自機クラスにしたり、敵機クラスにしたりして使います。 オブジェクト指向入門↓ http://itpro.nikkeibp.co.jp/article/COLUMN/20060329/233754/?ST=develop http://itpro.nikkeibp.co.jp/article/COLUMN/20060410/234873/?ST=develop http://itpro.nikkeibp.co.jp/article/COLUMN/20060413/235287/?ST=develop
お礼
わかりやすく、大変勉強になりました。リンク先も参考にして勉強したいです。 ありがとうございました!
- os6v100i
- ベストアンサー率44% (16/36)
>C++のクラスというのは、C言語でいう構造体の強化版!みたいな感じで考えて良いのでしょうか。 機能面で言えば、そういえなくもないと思います >また、Cの構造体とC++のクラスの違いは何でしょうか。 C++では構造体も一種のクラスです。 構造体はデータメンバのみのクラスといえるでしょう >クラスの中に関数を作る利点は何なのでしょうか。 色々あるのですが、オブジェクト指向から勉強されることをお勧めします。 また、シューティングゲーム製作のためと仰っていますが、オブジェクト指向で作る利点がないなら素直にC言語で作った方が良いのではないでしょうか。
お礼
オブジェクト指向をもう少し勉強してみようと思います。 ありがとうございました!
お礼
具体的で大変わかりやすかったです。大規模なものはC++の方が便利なのですね。ありがとうございました!