【初心者歓迎】C/C++室 Ver.72【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.72【環境依存OK】 - 暇つぶし2ch985:デフォルトの名無しさん
10/05/20 19:58:30
いい言葉が出てこなかったのですが、その「クラスで目的が決まっている」って
部分が引っ掛かってた所でした。
このクラス名(目的)でこの関数はこの機能を持たせたいって意味で、名前は
同じだけど機能が違う物を定義してるってことでしょうか。

あとメインクラスの関数も呼ぶことができたのですね。

ありがとうございました。

986:デフォルトの名無しさん
10/05/20 20:21:30
クラス 基底クラス      仮想関数 結果
犬   鳴くことができる動物 鳴く   わん
猫   鳴くことができる動物 鳴く   にゃー
人   鳴くことができる動物 鳴く   あんあん

たとえばこれらのクラスに対して三回鳴けという関数を作るとして
犬猫人それぞれにまったく同じコードを3回も書くのってだるいじゃん?
ところがC++はいい子だから鳴くことができる動物に対して三回鳴けって関数を作れば犬猫人どれでもそのコードが使えちゃうわけ
やったね!三倍コードが短くなったよ!


987:デフォルトの名無しさん
10/05/20 20:24:13
もっと実用的でありながらよく分かる例を出すべき

988:デフォルトの名無しさん
10/05/20 20:24:44
class Human : Cat

989:デフォルトの名無しさん
10/05/20 20:26:18
RPGのキャラとかいい例じゃないか

990:デフォルトの名無しさん
10/05/20 20:29:09
>>985
例えばクラス・GameLogicなんてのがあったとして、こいつはゲームの処理で主にプレイヤー以外の
なんらかの物体を移動など処理するクラスとした時、例えばステージや自分からみて敵となるプレイヤーキャラの
情報はどのタイプの敵でも必要な物だから同じように取得するが、それぞれの動きの内容は、それぞれ個別に定義したい。

しかし個別ではあるが、いずれも「攻撃しろ」と言えば攻撃して欲しい。
そんなかんじ

991:デフォルトの名無しさん
10/05/20 20:31:07
実際ジョブごとにクラス作ってんだろうか

992:デフォルトの名無しさん
10/05/20 20:56:53
class ToDO { virtual void doit() { printf("やったつもり"); };
class Ore1 : public ToDO { virtual void doit() { printf("明日になればやる"); };
class Ore2 : public ToDO { virtual void doit() { printf("やってるつもりだが何か?"); };
class Ore3 : public ToDO { virtual void doit() { printf("/(^o^)\"); };

Ore1 hoge;
Ore2 huga;
Ore3 hage;
ToDO* job_list[] = { &hoge, &hoge, &hoge, &hoge, &hage };

....
list[i]->doit();

993:デフォルトの名無しさん
10/05/20 21:15:10
>>985
機能が違うなら別の名前にするかな
一度日常にあるものでカテゴリー分けしてみるといいかもしれないね

親になるクラスを設計するときは、子になるクラスにおいて共通する機能を洗い出して実装するのだけど
>>986の例を借りれば
親:生物クラス ←生物とは鳴くものだ//関数の雛型だけ用意でもよい
子:犬クラス 一般的に「ワンワン」と鳴く
孫1:ヨークシャテリアクラス「バウバウ」と鳴く
孫2:柴犬クラス「アオーン」と鳴く

今回の例でいえば、子と孫の関係になるが
ヨークシャテリア(クラス)は鳴く(関数)→「バウバウ」
ヨークシャテリア(クラス)は(子:犬として)鳴く関数)→「ワンワン」

疑問に思っているように実装すると
ヨークシャテリア(クラス)は鳴く(関数)→「ワンワン」
ヨークシャテリア(クラス)はヨークシャテリアは鳴く(関数)→「バウバウ」

994:デフォルトの名無しさん
10/05/20 22:16:42
抽象化された命令をだして、実際の動作は各オブジェクトに任せる
つまり上司と下っ端の関係みたいなもんだよ
上司は何も知らなくてもやりたいことだけを言って
下っ端が必死こいて作業をこなしていく


995:デフォルトの名無しさん
10/05/20 22:55:25
例えばウィンドウを描くプログラムがあったとして、そのウィンドウに
いろいろな部品を簡単に追加できると便利だろう。
そこで、こんなクラスを作り、

class Item {
public:
  Item();
  virtual ~Item();
  virtual void Draw();
  ...
};
class ListBox : public Window { public: virtual void Draw(){ リストボックスを描く } };
class Button : public Window { public: virtual void Draw(){ ボタンを描く } };
class Picture : public Window { public: virtual void Draw(){ 画像を描く } };

class Window {
public:
  void AddItem(Item* pItem){ items.push_back(pItem); }
  void Draw() {
    for(int i = 0; i < items.size(); ++i){ items[i]->Draw(); }
  }
private:
  std::vector<Item*>  items;
};

996:デフォルトの名無しさん
10/05/20 22:56:31
このように使う。

ListBox  listBox;
Button  yesButton, noButton;
Picture  background;

Window  window;
window.AddItem(&listBox);
window.AddItem(&yesButton);
window.AddItem(&noButton);
window.AddItem(&background);

window.Draw();

997:デフォルトの名無しさん
10/05/20 23:09:58
>>991
昔ならいざしらず、今は作ってるでしょう

998:デフォルトの名無しさん
10/05/21 07:16:08
++

999://
10/05/21 07:41:40
スレの住人喜べ
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
スレリンク(tech板)l1

1000:デフォルトの名無しさん
10/05/21 07:43:51
1000なら>>999

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch