トップページ > 過去ログ > 記事閲覧
クラスについて
名前:虎馬 日時: 2008/05/05 21:42

最近C++言語の教本を買って勉強し始めたのですが、C++言語でクラスってありますよね その使い方は分かったのですが、どのような時に必要になるのかがいまいちよく分からないので教えていただけないでしょうか。 できれば実際に使用されるような実用的な例をお教え頂ければ幸いです。

Page: 1 |

Re: クラスについて ( No.1 )
名前:憂煉 日時:2008/05/06 23:40

たとえば… 格闘ゲームなんかではまず「キャラクタークラス」を作ります。 次に「キャラクタークラス」を継承して「Aさんクラス」、「Bさんクラス」というクラスを作ります。 「キャラクタークラス」のポインタや参照は「Aさんクラス」や「Bさんクラス」を指すことができるので、 ゲームの本体では「キャラクタークラス」に対するポインタを使い、それぞれのキャラクターは固有の関数を使うことができます。 要するに大規模なプログラム組む時に便利だぜって事です。 実際のところクラスなんて使わなくてもゲームは作れます。無理に使って「あっるぇー?」となるより使いやすい機能だけを使ってニヤニヤするべきです。
Re: クラスについて ( No.2 )
名前:管理人 日時:2008/05/06 23:40

クラスはどのような時に必要になる、というよりは、使うと便利だから使う、といったところではないでしょうか。 主な目的が生産性を上げることにありますので、クラスで出来ることを構造体と関数だけで実現しようと思えば 記述の面で面倒な部分が多くなるだけで出来ないことはありません。 あまりいい例ではありませんが、例えばプレイヤーの情報が詰まった構造体 PLAYER の処理を行う関数があるとしたら、 PLAYER 構造体を処理する関数だと分かるようにする為に全ての関数の前に Player_ をつけ、第一引数は構造体 PLAYER の アドレスをとるとします。 struct PLAYER { int x, y; int hp, mp; }; int Player_Setup( PLAYER *Player, int x, int y, int hp, int mp ); int Player_Move( PLAYER *Player, int x, int y ); int Player_Damage( PLAYER *Player, int point ); int Player_Frame( PLAYER *Player ); int Player_Draw( PLAYER *Player ); ~~プログラム部分 PLAYER pc; Player_Setup( &pc, 0, 100, 100, 40 ); Player_Move( &pc, 100, 200 ); これがクラスを使うと次のようになります。 class PLAYER { public: int Setup( int x, int y, int hp, int mp ); int Move( int x, int y ); int Damage( int point ); int Frame( void ); int Draw( void ); private: int x, y; int hp, mp; }; ~~プログラム部分 PLAYER pc; pc.Setup( 0, 100, 100, 40 ); pc.Move( 100, 200 );  関数に PLAYER 構造体のアドレスを渡す必要もなくなり、関数の前に Player_ を書く必要もありません。 そしてついでにメンバ変数の x, y, hp, mp は privete メンバなので、クラスのメンバ関数外からは アクセス出来ないようになっています。(このへんは一人でプログラムを組んでいるときはあまり関係ありませんが・・・) C++ やクラスの本領が発揮されるのはクラスの継承だとか、例外処理だとか、演算子のオーバーロードなどと 言った部分ですが、それらも C言語でもやろうと思えば似たようなことが出来ます。  ただ、上記の例も分かる通り、記述の面倒さが軽減します。上記の例では割と 構造体+関数で出来ることをそのまま クラスに置き換えただけなのでクラスにする必要性を強く感じるものではありませんが、継承や演算子のオーバーロード等の 処理に近いものを構造体+関数で実現しようと思ったときにはその面倒さの軽減=生産性の向上は非常に大きいものです。  で、実用例についてですが、私の周りでは基本的に一つの構造体専用の関数が複数あるような場合は全て構造体 ではなくクラスにしています。(文字列処理クラス、画像処理クラス、ステージクラス、ウインドウクラス、キャラクタクラス等) キャラクタクラスは継承されてプレイヤークラスや敵クラス(敵クラスは更に継承されてボスクラス、ボスクラスが 更に継承されて各ボスのクラス等)といったような使われ方をしています。  私自身はあんまりクラスを使いこなせていません。orz
Re: クラスについて ( No.3 )
名前: 日時:2008/05/07 12:50

多くはC++でクラスにしておけば、 再利用性が高くなるとか、部品化できるなどと いわれますが、クラスへの纏め方は人それぞれで これという決まったものがあるわけでは無いので、 (言語を使用する側としてはそこまでの域に 行けてないということでもありますが。。。) 個人の主観でやってみるのもひとつの手では ないかと。 私が主にクラスを使うのは、 「同種で複数のオブジェクトを扱う時に、  違う状態を持たなければならない時」や 「多重継承などを使わないと複雑でできないような時」でしょうか。。。 #前者は管理人さんが最後に書いているような #使用例に近いと思います。 #後者はほんとに手段が無いときって感じで、 #考えてる最中に1から考え直すことの方が多いかも
Re: クラスについて ( No.4 )
名前:虎馬 日時:2008/05/07 23:16

お返事が送れて申し訳ないです なるほど、難しいですが分かったような気がします、、w プログラムをやるのは初めてなので、色々使って試してみながら使い方などを少しずつ覚えていこうと思います また何かお聞きすることがあるかもしれませんが、その時はまたお願いします、、w ありがとうございました!
Re: クラスについて ( No.5 )
名前:優柔不断 日時:2008/05/08 18:36

クラスの「継承」を使えば、標準ライブラリなども含めて、クラスライブラリの拡張に役立てたりする事もできます。 他人の作ったライブラリを生かしながら自分流に機能を拡張する事も不可能ではありません。
Re: クラスについて ( No.6 )
名前:orca 日時:2008/05/09 00:46

個人的にはクラスの勉強をされるのであればC++はお勧めしません。 テンプレートや多重継承など初心者には複雑な要素が多いと思いますので で、お勧めはJavaです。(C#でもいいかも) Javaは全てがクラスを使って書かれているので必然的にクラスを使うという状況が発生します。 しかも、C++をシンプルにしたような構文なので初心者にも分かりやすいと思います。(シンプルなのはJDK1.4.2までかな?) それにJavaライブラリを読んでいれば自然と色々なデザインパターンが身につきますし、 クラスを使うことによって受けられる恩恵も自然と分かるようになると思います。 C++だとベターCのような書き方ができるので意識してクラスを使わないと上達しないかもしれません。 C++でよく分からないと感じたらJavaに行く、で理解できたらC++に戻ってくるって感じでもいいと思いますよ

Page: 1 |