次にC++の場合です。
C++ではストップウォッチをクラスかして作ってみます。
Stopwatch.h
#pragma once
#include <windows.h>
// ストップウォッチクラス
class Stopwatch
{
public:
// コンストラクタ
Stopwatch(void);
// デストラクタ
~Stopwatch(void);
// ストップウォッチのリセット
void Reset(void);
// ストップウォッチの経過時間の取得
double GetElapsedTime(void);
private:
LARGE_INTEGER m_Freq; // 周波数
LARGE_INTEGER m_Start; // 開始時間
};
Stopwatch.cpp
#include "Stopwatch.h"
// コンストラクタ
Stopwatch::Stopwatch(void)
{
QueryPerformanceFrequency(&m_Freq);
Reset();
}
// デストラクタ
Stopwatch::~Stopwatch(void)
{}
// ストップウォッチのリセット
void Stopwatch::Reset(void)
{
QueryPerformanceCounter(&m_Start);
}
// ストップウォッチの経過時間の取得
double Stopwatch::GetElapsedTime(void)
{
LARGE_INTEGER End;
QueryPerformanceCounter(&End);
const LONGLONG TICK_DELTA = 1000000000;
const double INV_TICK_DELTA = 1.0 / (double)TICK_DELTA;
LONGLONG elapsed = (End.QuadPart - m_Start.QuadPart);
return (double)((elapsed * TICK_DELTA) / m_Freq.QuadPart) * INV_TICK_DELTA;
}
これで実際に計測をしてみます。
main.cppなど適当な箇所で下記を記載します。
#include <windows.h> #include <stdio.h> int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Stopwatch stopwatch;
stopwatch.Reset();
Sleep(120);
double elapsed = stopwatch.GetElapsedTime();
char temp[64];
sprintf_s(temp, "time:%f\n", elapsed);
OutputDebugStringA(temp);
}
・結果
time:0.120526
似たような結果が出ましたね!
C++のクラスは構造体に似ていますが、メンバ変数の他にメンバ関数と呼ばれる関数を持つことができます。
他にpublicやprivateと書いている部分がありますが、外部から参照してほしくない値をクラス内部に隠ぺいすることができます。
構造体だと触られてしまう可能性がある値を外部から変更されないと保証することができます。
自分一人ならC言語でも管理していけるかもしれませんが、大規模な数十人が関わるプロジェクトになってくるとこの安全性が重要になってきます。
今回はこのぐらいにしておきますが、他にもC++には便利な機能が沢山あります。
なのでC言語から始めた人も怖がらずにC++に挑戦してみましょう!