Используйте shared_ptr для интерфейсов, представляющих ваши классы.
Я думаю что-то вроде
#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
Тогда вы можете просто взять реализацию часов в вашем конструкторе или использовать другой метод для установки реализации, например setClock или что-то в этом роде.
Примером этого будет
#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 (они все равно требуют интерфейсы), и более простое управление ресурсами (у вас никогда не будет нулевого указателя).