常用到的一个类,是修改别人的代码来的,出处忘了。
使用imp形式是为了把 windows.h 从头文件中拿掉,对于需要支持多平台的代码有用。
代码中为什么不用 std::unique_ptr<StopwatchImp> ? 因为 unique_ptr 需要在解析头文件时知道 StopwatchImp 的定义。前置申明可以,但是得在此头文件结束之前给出类的定义,Stopwatch 做不到。
// stopwatch.h
#pragma once
#include <memory>
class StopwatchImp;
class Stopwatch
{
public:
Stopwatch();
void start();
void stop();
int elapsed();
private:
std::shared_ptr<StopwatchImp> mImpStopwatch;
};
// stopwatch.cpp
#include <windows.h>
#include "stopwatch.h"
class StopwatchImp
{
public:
StopwatchImp();
void start();
void stop();
int elapsed();
private:
struct Watch
{
LARGE_INTEGER start;
LARGE_INTEGER stop;
};
int LIToMilliseconds(LARGE_INTEGER & L);
private:
Watch mTimer;
LARGE_INTEGER mFrequency;
};
int StopwatchImp::LIToMilliseconds(LARGE_INTEGER & L)
{
return (int)(1000 * (double)L.QuadPart /(double)mFrequency.QuadPart);
}
StopwatchImp::StopwatchImp()
{
mTimer.start.QuadPart=0;
mTimer.stop.QuadPart=0;
QueryPerformanceFrequency(&mFrequency);
}
void StopwatchImp::start()
{
QueryPerformanceCounter(&mTimer.start);
}
void StopwatchImp::stop()
{
QueryPerformanceCounter(&mTimer.stop);
}
int StopwatchImp::elapsed()
{
LARGE_INTEGER time;
time.QuadPart = mTimer.stop.QuadPart - mTimer.start.QuadPart;
return LIToMilliseconds(time);
}
Stopwatch::Stopwatch()
: mImpStopwatch(std::make_shared<StopwatchImp>())
{
}
void Stopwatch::start()
{
mImpStopwatch->start();
}
void Stopwatch::stop()
{
mImpStopwatch->stop();
}
int Stopwatch::elapsed()
{
return mImpStopwatch->elapsed();
}