コンテンツにスキップ

ファイル分割#

Classの実装と実態を分けることができます。ここではヘッダーとソースファイルを分けてみます。

C++でライブラリを作成する際は、ヘッダーとソースファイルを分けることが多いです。

ヘッダーでは定義のみを書いて、ソースファイルでは実装を書くことで役割を明確にできて、コードの可読性が上がります。

また、ソースコードは先にコンパイルしておいて、ヘッダーをインクルードすることで、コンパイル時間を短縮できます。


ヘッダー#

ヘッダーは、*.hまたは*.hppという拡張子を使います。ここではhuman.hppという名前で作成します。

ヘッダーは、#pragma onceというプリプロセッサを使って、二重インクルードを防ぎます。

これはインクルードガードとも呼ばれます。かつてはヘッダーファイル名を使用して書かれていました。

#pragma once

class Human {
public:
    Human();
    virtual void greet();
};


ソースファイル#

ソースファイル側では、ヘッダーをインクルードします。

human.hppをインクルードします。

#include "human.hpp"

Human::Human()
{
}

void Human::greet()
{
    printf("Hello\n");
}

int main()
{
    Human human;
    human.greet();
}


実行結果#

Hello


オーバーライドとファイル分割#

ファイル分割ができると、同じヘッダーファイルの定義を用いたオーバーライドができます。

オーバーライドについては、05_virtual_functionを参照してください。

burger.hpp

#pragma once
#include "human.hpp"

class Burger : public Human {
public:
    Burger();
    void greet() override;
};
#include "burger.hpp"

Burger::Burger()
{
}

void Burger::greet()
{
    printf("Hello, how are you?\n");
    print("I'll suggest you a cheese burger!\n");
}

int main()
{
    Burger burger;
    burger.greet();
}