##概要
最近C++を勉強中です。
C++でのクラス作成やら、ファイル分けたりやらのやり方を調べてみました。
##1.C++のクラスの作成
ヘッダファイルと、関数を実装するC++ファイルとを分けて作成する。
(ちなみに、この後継承とかもやってみたい、という思いからファイル名がParentになってます)
###ヘッダファイル
class Parent
{
public:
void showMessage(const char* message);
};
###C++ファイル
続いて、ヘッダファイルを読み込むC++ファイルを作成する
#include <iostream>
#include "Parent.h"
/**
* メッセージを出力する
*/
void Parent::showMessage(const char* message)
{
std::cout << "[message]" << message << std::endl;
}
ここまででクラスの作成はOK
###実行ファイル
作成したC++のクラスを読み込み、showMessageメソッドを実行する、実行ファイルを用意する。
#include "Parent.h"
int main()
{
Parent pt;
pt.showMessage("Hello!");
return 0;
}
###コンパイル・実行
$ g++ -o run run.cpp Parent.cpp
$ ./run
[message]Hello!
無事、結果が出力されたようです。
##2.クラスの継承
次に、継承をやってみます。
1.で作成した親クラスを変更し、
親 -> メッセージの出力のみ
子 -> メッセージの設定のみ
といった感じにしてみます。
###親クラス
/**
* 親クラス
*/
class Parent
{
public:
const char* message;
void showMessage();
};
#include <iostream>
#include "Parent.h"
/**
* メッセージを出力する
*/
void Parent::showMessage()
{
std::cout << "[message]" << this->message << std::endl;
}
###子クラス
子クラスはParentクラスを継承し、setMessageという関数を実装します。
#include "Parent.h"
/**
* 子クラス
*/
class Child : public Parent
{
public:
void setMessage(const char* message);
};
#include "Child.h"
/**
* メッセージを設定する
*/
void Child::setMessage(const char* message)
{
this->message = message;
}
###実行クラス
#include "Child.h"
int main()
{
Child ch;
ch.setMessage("Hello!");
ch.showMessage();
return 0;
}
###実行
$ g++ -o run run.cpp Parent.cpp Child.cpp
$ ./run
[message]Hello!
実行できました!
##3.関数の抽象化
###仮想関数
さらに、子クラスで実装した「setMessage」関数を、親クラスで抽象化して宣言してみます。
「仮想関数」と呼ぶようです。
こんな感じ。
/**
* 親クラス
*/
class Parent
{
public:
const char* message;
void showMessage();
// abstractのイメージ。「= 0」をつける(純粋仮想関数)
virtual void setMessage(const char* message) = 0;
};
###実行
$ g++ -o run run.cpp Parent.cpp Child.cpp
$ ./run
[message]Hello!
正常にコンパイル・実行できました。
うーん、まだC++全然慣れないっすねw
Makefileの作り方とかも勉強しようと思います。