忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   
カテゴリー「C++基礎」の記事一覧

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

第8回 C++講座 『閑話休題』

中原です。

今回は、これといった名前はないのですが、C++の機能について述べていこうと思います。
 

第8回 C++講座 『閑話休題』
 

拍手[0回]

PR

第7回 C++講座 『仮想関数』

中原です。

前回ポリモフィズムと言っていましたが、それに先駆けて必要な知識を講座で行っていきたいと思います。
今回は仮想関数です。


第7回 C++講座 『仮想関数』

拍手[0回]

第6回 C++講座 『オーバーライド』


中原です。

最初にC++のオブジェクト指向の補足。

C++のクラスを作る場合。
そのクラスのみで完結している、というのがベストです。
他のクラスの仕様が変わったからと言って、そのクラスを作り変えないと駄目というのは、クラスの作り方が甘いと思っていいでしょう。

ただ、ベストというだけであって、必ずしもと言うわけではありません。
実際そのように作るのが難しい場合も多く、出来るだけそうならないよう、もし無理な場合でも出来るだけ少なくなるように作るようにしましょう。



さてさて、今日の講座はオーバーライド。
前回のオーバロードと似ていますね。
でも全然違うんです。
しっかりと、違いを理解しましょう。

今回も短く終わりそうな感じです。
では早速いってみよう!

第6回 C++講座 『オーバーライド』

拍手[0回]

第5回 C++講座 『オーバーロード』


中原です。

今回はC++の機能、オーバーロードについて説明したいと思います。

なんか1回1回が長いという不評があるようなので、短くまとめてみようかと思います。
でも、長くなったらすみませんー。

第5回 C++講座 『オーバーロード』

拍手[0回]

第4回 C++講座 『継承』


中原です。

なぜか毎週月曜と木曜に講座を書いてますね…

まずは、前回の答えから。

どうでしょう?皆さんできましたでしょうか?


< ID = 26 > コンストラクタが通りました
< ID = 21 > コンストラクタが通りました
< ID = 23 > コンストラクタが通りました
< ID = 23 > デストラクタが通りました
< ID = 30 > コンストラクタが通りました
< ID = 21 > デストラクタが通りました
< ID = 30 > デストラクタが通りました

です。

『ID = 26 のデストラクタが通りました』 は、main 関数が終わるときに通りますので、getch() の部分では、まだ通らないのです。


プログラムに沿って説明しますと、


main()
{
    
    COniichan* Tsuzi;

    COniichan Nakahara( 26 );         //コンストラクタが通る
   
    COniichan* Tawa;

    Tawa = new COniichan( 21 );    //コンストラクタが通る

    Tsuzi = new COniichan( 23 );    //コンストラクタが通る

    COniichan* Kamata;
 
    delete Tsuzi;                                 //デストラクタが通る

    Kamata = new COniichan( 30 );  //コンストラクタが通る

    delete Tawa;                                 //デストラクタが通る

    delete Kamata;                             //デストラクタが通る

    getch();
}                                                             //ID = 26 のデストラクタが通る

となるのですね。
 

さて、本日の講座は『継承』についてです。

 

第4回 C++講座 『継承』

拍手[0回]

第3回 C++講座 『C++でのメモリ確保』


えと、一回書いたものが、すべて消えてしまったという、驚愕の自体…

とってもやる気が下がってます。


が!


なんとか、気合を振り絞って書いていきましょう!





何書いてたっけ…。

思い出しながら、一つ一つ書いていこ…。




遅らせながら、中原です。

今、ブログを新しくリニューアルしようという計画がでています。

まだ、C++解説の材料が少ないために非常に見にくい状態ですが、その際には、見出しをつけたり、各パートごとに区切って、綺麗にまとめていこうかと思っております。
しばしお待ちを!


さて前回は、プログラムを書く上でのルール(コーディング規約)、メンバ関数、コンストラクタ、デストラクタ、アクセス指定子 について講義を行いました。
どうでしょう?
みなさん理解できたでしょうか?
ほんとに基本のことなので、是非覚えちゃってください。

今回はC++でのメモリ確保の方法を、コンストラクタ、デストラクタを踏まえて解説していきたいと思います。
前回はかなり長かったですが、今回はそこまで長くならないはず…。

はず…

では、Let's go!

第3回 C++講座 『C++でのメモリ確保』


拍手[1回]

第2回 C++講座 『C++の機能』


中原です。

早くも第2回です。
こういうのは、やる気があるときにやっておかないと、滞ってしまうので…。

まずは、前回の補足から。

C++の世界(拡張子が .cpp)では、struct と class の違いは全くありません。


class Character
{
    int hp;
};


とかいても、


struct Character
{
    int hp;
};


全く同じです。(これは前回言いましたね)
変数宣言のときも、どちらも

Character player;

でコンパイルが通っちゃいます。
C言語のときみたいに、わざわざ

struct Characer player;

書く必要はありません。

では何が違うのか…。
今回の講座では、その辺も含め説明していきたいと思います。

第2回 C++講座 『C++の機能』

拍手[1回]

第1回 C++講座 『C++ってなに?』

どうも、中原です。

SPI対策の日程は大体決まったのですが、まだラボの使用許可を取っていない為、正確な日時は決まってません。

一応、今週は説明会などで忙しいため、第1回は7日を予定しております。
2、3日の間に、しっかりと告知いたしますので、もう暫くお待ち下さい。


さて、来年2年生になる方々、そして現2年生の方々。
C++言語というものを使っていますか?
もうゲーム業界では必須の言語です。
これを使えないと、業界には入れないくらいに…。

とはいっても、ゲームをしっかり作っているならば、勿論大丈夫ですが。
ほんとうに 『しっかり』 作っている場合ですよ!

今1年生の方々は、この春休みにC++言語を勉強して、是非今年の製作ではC++でゲームを作っていきましょう。

今回は、本を読むのがいやだとか、買うお金がないという方たちのために、とても簡単にC++の説明をしていきたいと思います。
一応春から、新2年生に向けて、ラボでC++講座を開きたいと思っていますが、「春休みに勉強したい!」という方々のために、春休みの間、C++の簡単な勉強をブログで行っていきたいと思います。
ただ、C言語の構造体が分かっているものとしてお願いいたします。

もっと詳しいことを知りたいという方々は、是非本を読んでくださいね。

前置きが長くなりましたが、では始めていきたいと思います。


 

第1回 C++講座 『C++ってなに?』

拍手[0回]

C++でクラスの不思議

ども、こんばんわ~

久しぶりに登場のZAKIです

学校ではラボにちょこちょこ出現していますけどねw

製作もそろそろ終盤

完成に向けてラストスパートをかけているころじゃないでしょうか

今年の2年生の作品は完成度が高いのが多そうなので楽しみです

寒いですが、風引かないように体調には気をつけましょうね


さて、今回は「C++でクラスの不思議」です。

まず、このコードを見てください。

#include <stdio.h>

//インターフェイスA
class A {
public:
 virtual void MesA() = 0;
};

//インターフェイスB
class B {
public:
 virtual void MesB() = 0;
};

//実装クラスC
class C : public A , public B {
public:
 void MesA() { printf("Aのメソッドです。\n"); }
 void MesB() { printf("Bのメソッドです。\n"); }
};

//メイン関数
int main()
{
 C  c;
 void * pVoid = NULL;
 B *  pB  = NULL;
 
 pVoid = (void *)&c;

 //普通にキャストした場合
 pB = (B *)&c;
 pB->MesB();

 //void *を通してキャストした場合
 pB = (B *)pVoid;
 pB->MesB();

 return 0;
}

さぁ、このコードを実行したとき、どういう結果が出るでしょうか?

「あれ?」と思うような結果になりませんか?

拍手[0回]

GenericProgramming

ども・・・・・・・・・・・・GES会長の和佐田雅史です。
今日はC++におけるGenericProgrammingについて少しだけ・・・・・・・・・・・


前スマートポインタの所で書いたtemplate< class T>~のようにtemplateを使ったプログラムの事をジェネリックプログラミングと言います。


具体的な用途とか意味を説明しますと、型に依存しないプログラムが組める。
例えば

以下のコードはT型の変数を安全にdeleteするプログラムです。

template < class T > inline void Safe_Delete( T p )
{
    if ( p )
    {
        delete p;
        p = NULL;
    }
}

T型は勿論ポインタ型でないといけません。
※< class T >と書いていますが、< typename T >でも同じことです。

上のユーティリティーを使う時は

// new演算子で動的に作る
Character* pChara = new Character;


// 解放する
Safe_Delete< Character* >( pChara );

とすれば使えます。
※別に型は指定しなくても使えるが、一応念のためこうして記述するようにして下さい。

このGenericProgrammingを使えるようになればObject志向だけでは補えなかった柔軟性という部分を手に入れることが出来、今よりも更に効率的なプログラムが組めるようになります。


ではここでちょっと本の紹介を・・・・・・・・・・・


Effecttive C++
効率的なプログラムを組みたい人向け。中級者向き。

Effevtive STL
STLを利用したジェネリックプログラミングです。
STLで効率的にプログラムを組みたい方にはお勧めです。

More Effecttive C++
スマートポインタの実装の仕方、コンストラクタとデストラクタを用いたリーソースリークの防ぎ方等々
中級者向き。


Modern C++ Design
デザインパターンをジェネリックに実装する方法が書かれた本。
これが理解出来れば恐らく現役のクリエイターにすら匹敵する実力が身につきますが・・・・・・・・・・

基本的にはお勧めしません。最強のC++プログラマになりたい方のみ読んで下さい。
あ・・・・因みに言うまでも無いですが、上級者向きです。

※それ以上に難しいことがしたい人は基本的に洋書になります。



それではお疲れ様でした。

拍手[0回]

C++のクラスを使う

皆さん始めまして。
私、GES会長と開発部代表者を務めさせて戴いている和佐田雅史と申します。

今後プログラムの技術的な事に関しては卒業まで私が記事を担当する事になりましたので宜しくお願い申し上げます。


     クラスとは?
※今回はクラスを説明するにあたって、構造体という機能を知っているのを前提で説明させていただきます。



 

皆さんは構造体というものを1年生のときに習ったと思います。

キャラクタの構造体の中にHPMPを入れたり、ステータスを入れたりしてデータを管理していたのではないでしょうか?


 

キャラクタの構造体の中にHPMPを入れたり、ステータスを入れたりしてデータを管理していたのではないでしょうか?

 

皆さんも少なからず、構造体に関数を持たせたいと思ったことがあるはずです。

 

 C言語において構造体というのはデータを管理するもので、メンバに関数を持たせたりすることは出来ませんでした。

しかしC++のclassという機能を使うと変数や関数を持たせることが可能になります。

 

キャラクタの攻撃関数だったり、描画処理等をメンバに持たせることが可能です。

構造体でも同じような事は出来ますが、構造体は基本的にデータ集合を扱うもの

クラスはオブジェクトとして管理する事を目的としています。

 

では早速サンプルプログラムを見てみましょう。


// キャラクタベースクラスの定義

class CharacterBase

{

public:

        // メンバ変数

        int Hp;

        int Mp;

 

        // 攻撃力

        int Attackpt;

 

        // 攻撃する関数

        void Attack(int* EnemyHp);

 

        CharacterBase();// コンストラクタ

        ~CharacterBase();// デストラクタ

};


 

     メンバ変数とメソッド

// メンバ変数

int Hp;

int Mp;

 

// 攻撃力

int Attackpt;

 

クラスの中宣言されているHpMpなどの変数をメンバ変数と呼び、定義されている関数をメソッドと呼びます。

 

メンバ変数はpublicにするとクラス内、外部全てアクセス可能になります。

 

     メソッドの定義仕方

基本的にメソッドの定義は.hpp( ヘッダファイル )に書いて、クラスの本体自体はcppファイルに書きます。

 

書式

戻り値 クラス名::メソッド名(引数……)
{
}

 

 

//------------------------------------------------------------------

// 概要   : 攻撃する関数

// 引数   : 敵のHpへのポインタ

// 戻り値 : なし

//----------------------------------------------------------------------------

void CharacterBase::Attack( int* EnemyHp )

{

     ( *EnemyHp ) -= this->Attackpt;

 

     if( ( *EnemyHp ) < 0 )

     {

         MessageBox( NULL , "和佐田をやっつけた!!" , "Victory" , MB_OK );

     }

}


このようにクラスで管理すると、プログラムが組みやすくなるわけです。

プレイヤー初期処理やプレイヤー変数更新処理、プレイヤー描画処理等を一々関数を作ってソース分割なんてしなくても良くなりますしクラス内でグローバルに参照したいならprivate:指定すればクラス内で自由にアクセス可能ですし、外部から参照されない美しい設計のプログラムを書くことが出来ます。


それでは今日の講座はここまでとします。

拍手[0回]

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]