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 = …Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Studio 2010并且有工厂用于创建抽象基类的两个实现之一.工厂Create方法接受bool标志并返回shared_ptr中的两个impl之一.使用if语句对我来说很好,但是当我尝试使用带有make_shared调用的三元组时,编译器会抱怨.
class Base {
public:
Base() {};
};
class Foo : public Base {
public:
Foo() {};
};
class Bar : public Base {
public:
Bar() {};
};
class Factory {
public:
static std::shared_ptr<Base> Create(bool isFoo) {
return isFoo ?
std::make_shared<Foo>() :
std::make_shared<Bar>();
}
};
int main() {
std::shared_ptr<Base> instance = Factory::Create(true);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
VS给出的错误是'没有可以执行此转换的用户定义转换运算符,或者运算符不能被调用c:\ path\file.h(78):错误C2668:'std :: tr1 :: shared_ptr <_Ty> :: shared_ptr':使用[_Ty = Base]对重载函数进行模糊调用
注意
static std::shared_ptr<Base> Create(bool isFoo) {
if (isFoo)
return std::make_shared<Foo>();
return std::make_shared<Bar>(); …Run Code Online (Sandbox Code Playgroud)