unique_ptr或shared_ptr更适合在使用依赖注入的类中使用,并且对不与其他实例共享的对象进行单元测试。
示例:
class IFoo {
public:
virtual void DoFoo()=0;
};
class RealFoo : public IFoo {
public:
virtual void DoFoo() { /* ... */ }
};
class FakeFoo : public IFoo {
public:
virtual void DoFoo() { DoFooCalled = true; }
bool DoFooCalled;
};
class Bar {
public:
explicit Bar(std::unique_ptr<IFoo> foo) : m_foo(std::move(foo)) { }
void DoBar() {
m_foo->DoFoo();
}
private:
std::unique_ptr<IFoo> m_foo;
};
class BarTest : public TestRunner {
public:
void DoBarCallsDoFoo() {
FakeFoo* rawFakeFoo = new FakeFoo(true);
std::unique_ptr<FakeFoo> fakeFooPtr(rawFakeFoo);
Bar bar(std::move(fakeFooPtr));
bar.DoBar();
Assert(rawFakeFoo->DoFooCalled);
}
};
我与我的团队中的一位同事就此进行了一次小小的辩论。我认为如果Bar对象是生产中Foo对象的唯一用户,那么unique_ptr是正确的指针类型。他认为,因为我们必须在测试用例中将ref存储到原始指针,这实际上是共享语义,而shared_ptr是正确的指针。
在这种情况下哪种指针类型正确?