Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>You can achieve the desired effect by the liberal use of Functor delegate objects and templates:</p> <p>CAlarm.h</p> <pre><code>#ifndef CALARM_H #define CALARM_H #include "ADTtime.h" #include "CStopwatch.h" template&lt;class FunctionObject&gt; class Alarm : public StopWatch { public: Alarm(const FunctionObject&amp; fn); Alarm(double tickTime, const FunctionObject&amp; fn); virtual ~Alarm(); FunctionObject Tick(); protected: FunctionObject _delegate; double _tickTime; private: }; template&lt;class FunctionObject&gt; Alarm&lt;FunctionObject&gt;::Alarm(const FunctionObject&amp; fn) : StopWatch(), _delegate(fn), _tickTime(1.0) { } template&lt;class FunctionObject&gt; Alarm&lt;FunctionObject&gt;::Alarm(double tickTime, const FunctionObject&amp; fn) : StopWatch(), _delegate(fn), _tickTime(tickTime) { } template&lt;class FunctionObject&gt; Alarm&lt;FunctionObject&gt;::~Alarm() { if(_isRunning) Stop(); } template&lt;class FunctionObject&gt; FunctionObject Alarm&lt;FunctionObject&gt;::Tick() { if(IsRunning() == false) return _delegate; if(GetElapsedTimeInSeconds() &gt;= _tickTime) { Reset(); _delegate(); } return _delegate; } #endif </code></pre> <p>CStopwatch.h</p> <pre><code>#ifndef CSTOPWATCH_H #define CSTOPWATCH_H #include "ADTtime.h" class StopWatch : public ADTTime { public: StopWatch(); virtual ~StopWatch(); void Start(); void Restart(); void Stop(); void Reset(); virtual void CalculateElapsedTime(); virtual double GetElapsedTimeInSeconds(); virtual double GetElapsedTimeInMilliseconds(); protected: private: }; #endif </code></pre> <p>CStopwatch.cpp</p> <pre><code>#include "CStopwatch.h" StopWatch::StopWatch() : ADTTime() { /* DO NOTHING. ALL INITIALIZATION HAPPENS IN BASE CLASS */ } StopWatch::~StopWatch() { _startTime = -1; _endTime = -1; _deltaTime = -1.0; _isRunning = false; } void StopWatch::Start() { if(_isRunning == true) return; _startTime = clock(); _isRunning = true; } void StopWatch::Stop() { if(_isRunning == false) return; _isRunning = false; CalculateElapsedTime(); } void StopWatch::Restart() { Reset(); Start(); } void StopWatch::Reset() { Stop(); _startTime = 0; _endTime = 0; _deltaTime = 0.0; } void StopWatch::CalculateElapsedTime() { _endTime = clock(); _deltaTime = difftime(_startTime, _endTime); } double StopWatch::GetElapsedTimeInSeconds() { CalculateElapsedTime(); return -ADTTime::GetElapsedTimeInSeconds(); } double StopWatch::GetElapsedTimeInMilliseconds() { CalculateElapsedTime(); return -ADTTime::GetElapsedTimeInMilliseconds(); } </code></pre> <p>ADTTime.h</p> <pre><code>#ifndef ADTTIME_H #define ADTTIME_H #include &lt;ctime&gt; class ADTTime { public: clock_t GetStartTime() const; clock_t GetStartTime(); double GetStartTimeInSeconds() const; double GetStartTimeInSeconds(); clock_t GetEndTime() const; clock_t GetEndTime(); double GetEndTimeInSeconds() const; double GetEndTimeInSeconds(); virtual double GetElapsedTimeInSeconds(); virtual double GetElapsedTimeInMilliseconds(); virtual void CalculateElapsedTime()=0; bool IsRunning() const; bool IsRunning(); virtual void Start()=0; virtual void Restart()=0; virtual void Stop()=0; virtual void Reset()=0; ADTTime(); virtual ~ADTTime(); protected: bool _isRunning; clock_t _startTime; clock_t _endTime; double _deltaTime; private: }; #endif </code></pre> <p>CADTTime.cpp</p> <pre><code>#include "ADTtime.h" clock_t ADTTime::GetStartTime() const { return _startTime; } clock_t ADTTime::GetStartTime() { return static_cast&lt;const ADTTime&amp;&gt;(*this).GetStartTime(); } double ADTTime::GetStartTimeInSeconds() const { return static_cast&lt;double&gt;((_startTime / CLOCKS_PER_SEC)); } double ADTTime::GetStartTimeInSeconds() { return static_cast&lt;const ADTTime&amp;&gt;(*this).GetStartTimeInSeconds(); } clock_t ADTTime::GetEndTime() const { return _endTime; } clock_t ADTTime::GetEndTime() { return static_cast&lt;const ADTTime&amp;&gt;(*this).GetEndTime(); } double ADTTime::GetEndTimeInSeconds() const { return static_cast&lt;double&gt;((_endTime / CLOCKS_PER_SEC)); } double ADTTime::GetEndTimeInSeconds() { return static_cast&lt;const ADTTime&amp;&gt;(*this).GetEndTimeInSeconds(); } double ADTTime::GetElapsedTimeInSeconds() { return _deltaTime / CLOCKS_PER_SEC; } double ADTTime::GetElapsedTimeInMilliseconds() { return _deltaTime; } bool ADTTime::IsRunning() const { return _isRunning; } bool ADTTime::IsRunning() { return static_cast&lt;const ADTTime&amp;&gt;(*this).IsRunning(); } ADTTime::ADTTime() : _isRunning(false), _startTime(-1), _endTime(-1), _deltaTime(-1.0) { } ADTTime::~ADTTime() { _isRunning = false; _startTime = -1; _endTime = -1; _deltaTime = -1.0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload