クラスを表すインターフェイスにshared_ptrを使用します。
私はその後、あなたは自分のコンストラクタでクロックの実装を取るか、setclockスクリプトか何かのように、実装を設定するための別の方法を持っている可能性が
#ifndef CLOCK_HPP_INCLUDED
#define CLOCK_HPP_INCLUDED
#include <boost/shared_ptr.hpp>
class Clock
{
public:
static boost::shared_ptr<Clock> create();
virtual void init() = 0;
virtual double getSeconds() = 0;
virtual void sleepUntilNext(double howMuch) = 0;
protected: // No polymorphic deconstruction because of shared_ptr
~Clock()
{}
};
#endif
のようなものを考えています。この
例は、その後、あなたのユニットテストでは、あなたがこのような何かを行うことができ
#include "clock.hpp"
class MyClass
{
public:
myClass(boost::shared_ptr<Clock> aClock) : myClock(aClock)
{
myClock.init();
}
private:
boost::shared_ptr<Clock> myClock;
}
次のようになります。
boost::shared_ptr<Clock> mock = createMockClock();
MyClass b(mock);
mock.assertThatInitIsCalled();
また、単にリソースを無視することができます。 shared_ptrは自分自身を削除します。
これにかかるコストは、動的割り当て、仮想関数呼び出し、およびshared_ptrのオーバーヘッドによってわずかなパフォーマンスの低下になります。
利点は、モジュール性が向上し、コンパイル時間が短縮され、googlemock(それらにはインターフェイスが必要)、リソース管理が容易になります(ヌルポインタを使用することはありません)。
クラスを表すインターフェイスにshared_ptrを使用します。私はhttp://ideone.com/r1Ou7のようなものを考えている。次に、あなたのコンストラクタでクロック実装を取るか、setClockなどの実装を設定する別のメソッドを用意するだけです。 – Lalaland
@EthanSteinberg残念ながら[この記事](http://programmaticallyspeaking.blogspot.com/2010/04/beautiful-dependency-injection-in-c.html) –
によれば、その記事はshared_ptrを無視しているようです。記事がダイナミックメモリの使用を嫌う主な理由(私の提案)は、管理が難しいためです。 Shared_ptrはほとんどの管理上の問題を取り除きます。しかし、パフォーマンス上の理由(おそらく、可能性がある)のためにshared_ptrを使用できない場合は、物事は非常に複雑になるでしょう(記事が話しているように)。 – Lalaland