• ベストアンサー

C++のクラスについて

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

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.3

概念的なことは既に述べられているので 私は、具体的なプログラミングの観点から述べたいと思います。 1) コンストラクタで初期化、デストラクタで後始末ができる 特にスタック上にオブジェクトを構築した場合、自動的にデストラクタが呼ばれるので便利です。たとえば、コンストラクタでファイルを開き、 デストラクタで閉じるといった使い方ができます。これは、例外処理機構と組み合わせると、特に威力を発揮します。ファイルのRead/Write/Seek中にI/Oエラーが発生したら、自動的にファイルを閉じるようにできます。 2) 仮想関数により、派生クラスで同名の関数を作成できます。 基本クラスのポインタ(or参照)により派生クラスのオブジェクトを指し示すことが可能です。実際にどのオブジェクトの関数が呼ばれるかは、自動的に判定されるので、すっきりしたプログラムが可能です。 たとえば ドローツールを考えてみます。 円と矩形の描画をサポートします。 Cであれば、円を描くのか、矩形を描くのか判定し、必要なパラメータ(円と矩形では異なる)を取得し、専用の関数を呼んで正しく描画するまで、すべてプログラマが管理しなければなりません。しかも、名前空間もないので、円の描画関数と矩形の描画関数とは同名であってはなりません。 C++だとクラス内にパラメータもすべて管理させることができます。円と矩形の基本クラスとして図形を導入し、描画を仮想関数で実装することで、プログラマは      図形->描画 と書くだけで、 図形が円なら円のパラメータで円が描画され、 図形が矩形なら矩形のパラメータで矩形が描画されます ここで重要なのは"図形が円なら"という判定をプログラマが行わず、自動的に行われることです。(むろん、手動で行うことも可能で、それが必要な場合もありますが、できるだけ自動判定に任せるべきとされています) もう一つは、円クラスと矩形クラスで"描画"という同じ名称を使えることです。 (というかパラメータも含めて一致していなければならない) 図形が2種類しかなかったのであまりありがたみが感じられないかもしれません。しかし、これが三角形、楕円、五角形、塗りつぶされる円, 塗りつぶされる矩形..と無数に増えると図形の判定だけでも大変なことになり、さらに正しい描画関数と組み合わせるのは大変なことです。 この複雑さを管理するために"クラス"があり、データと関数を一緒にしているのです。 

whiterozes
質問者

お礼

具体的で大変わかりやすかったです。大規模なものはC++の方が便利なのですね。ありがとうございました!

その他の回答 (2)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

>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

whiterozes
質問者

お礼

わかりやすく、大変勉強になりました。リンク先も参考にして勉強したいです。 ありがとうございました!

  • os6v100i
  • ベストアンサー率44% (16/36)
回答No.1

>C++のクラスというのは、C言語でいう構造体の強化版!みたいな感じで考えて良いのでしょうか。 機能面で言えば、そういえなくもないと思います >また、Cの構造体とC++のクラスの違いは何でしょうか。 C++では構造体も一種のクラスです。 構造体はデータメンバのみのクラスといえるでしょう >クラスの中に関数を作る利点は何なのでしょうか。 色々あるのですが、オブジェクト指向から勉強されることをお勧めします。 また、シューティングゲーム製作のためと仰っていますが、オブジェクト指向で作る利点がないなら素直にC言語で作った方が良いのではないでしょうか。

whiterozes
質問者

お礼

オブジェクト指向をもう少し勉強してみようと思います。 ありがとうございました!

関連するQ&A

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

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

  • C,C++,C++/CLIの構造体とクラス

    C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが privateかpublicかという違い「だけ」しか全くないのでしょうか? クラスにおける value class / ref class という分類はC++/CLIのもので これについては value class の方は C言語の構造体に近いという事でいいでしょうか? ref classの方は ネイティブのC++のクラスを マネージ用にしたようなもので C++/CLIの構造体は C++のそれと同じで OKですか? そしてそれらの構造体には、値型・参照型といった分類はないのでしょうか?

  • C言語とC++

    現在C言語を用いてシューティングゲームを作成しています。 ゲームを作成している方の中には、CではなくC++で作成している人もいるようなんですが、C++で作成するとどのような違いがあるのでしょうか? メリットやデメリット、将来性など詳しく教えてもらえると助かります!

  • 私の場合、C++とJavaのどちらの言語でクラス取るべき?

    今度、データ構造のクラスを取ります。 でもその言語がC++とJavaで選べます。 私自身はBASIC, C, Fortran, Assembly, C++と習ってきました。 C++の初級は余裕だったのですが(Cの知識が結構応用できた)、 中級でのclassの概念(base, derivedなど)は 今一つ理解できてないと思います(グレードはBでした)。 例文があれば、いろんなところから貼り合わせ、なんとか動くようには出来るレベルです(^^ゞ 教授は「大丈夫、C++を理解していればJavaは出来る」と言いますし、 ここのOKWebの過去ログにもそんな記述があるのですが、 未知の言語(Java)で初級コースならまだしも データ構造(配列やらリストやら)を扱うっていうのは厳しいような…うーん…。 …と言いつつもC++でも自信ないし…うーん…。 Javaは人気があるのは知っていますし、新しい言語に興味もあるのですけど…うーん…。 最近、初級コースはJavaに切り替わったそうです… でも折角C++で必修科目を埋めたのにJavaで取り直すのはちょっと…うーん…。 こんな私はどちらの言語でデータ構造のクラスを取ればよいでしょうか? 両方の言語をご存知の方、アドヴァイスをください。

  • android-JNIでクラス配列参照方法について

    androidのJNIで関数引数をクラス配列にした場合、C側ではこのポインタをどのようにすれば取得出来るのでしょうか? 一応GetByteArrayElements()を使用してクラス配列の要素数までは取得できましたが、このクラスのポインタの取得方法が出来ません。 ※クラス配列にある変数をC言語側で参照したいと考えております。 (このクラスはC言語の構造体として扱うようにしています)

  • クラスの利点について

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

  • クラスの分割

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

  • C++のクラスポインタの初期化?

    C言語しか経験がないものです。最近Irrlichtでゲームをつくりはじめました。いきなりチュートリアルがわからないので質問させていただきます。 IrrlichtDevice *device = createDevice( video::EDT_SOFTWARE, dimension2d<u32>(640, 480), 16,     false, false, false, 0); if (!device) return 1; という部分で、 (1) *devide = createDevice( ...);  なぜクラスポインタが関数で初期化できるのですか。  アドレスを入れないのはなぜなのでしょうか。 (2) if(!device)  これだとアドレス値の式を判別しているように思いますが、どういうことですか。 初歩的な質問で申し訳ございません。

  • C言語のソースをC++言語に変換したい

    C言語で書かれていたソースをC++言語に変換したいのですが どのような点に気をつければよいでしょうか 現在、プログラムの主な構造は構造体とそれを扱う関数が実装されていて、 これらをクラスを使用して書き換えようと思います。 それ以外に気にしておくものはありますか。 例えば、ヘッダファイルで<stdio.h>をインクルードしているところがありますが、 これは<cstdio>に書き換えたほうがよいかもしれない、と言われたことはあります。 printfなどはprintfのまま使用しても大丈夫ですか。 std::printfに書き換えたり、iostreamを使用する方法に書き換えたほうがいいですか。 規格としてはどのようになっているのでしょうか。 (「過去との互換性のためにあるだけであり、非推奨」とかあったりしますか。)

  • ラッキー&ワイルドとS.C.I.の違い

    ラッキー&ワイルドとS.C.I.はいずれもシューティングカーチェイスゲームですが、ゲーム内容の違いが全くわかりません。またラッキー&ワイルドはどうしてタイトーではなく、ナムコが製作したのでしょうか?

専門家に質問してみよう