Google可以使用智能指针返回types吗?
我有一个工厂,返回一个智能指针。 无论使用什么智能指针,我都无法让Google Mock嘲笑工厂方法。
模拟对象是所有方法都是虚拟的纯抽象接口的实现。 我有一个原型:
MOCK_METHOD0(Create, std::unique_ptr<IMyObjectThing>());
我得到:
"...gmock/gmock-spec-builders.h(1314): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'"
智能指针指向的types被定义。
而我得到它试图访问其中一个构造函数声明为private,但我不明白为什么。 当这是一个std :: auto_ptr,错误说没有复制构造函数,这使我困惑。
无论如何,有没有办法模拟一个方法,返回一个智能指针? 还是有更好的方法来build造一个工厂? 是我唯一的决心返回一个原始指针(blech …)?
我的环境是Visual Studio 2010 Ultimate和Windows 7.我没有使用CLI。
在大多数情况下,Google Mock要求模拟方法的参数和返回值是可复制的。 根据boost的文档 ,unique_ptr是不可复制的。 你可以select返回一个使用共享所有权的智能指针类( shared_ptr ,linked_ptr等),因此是可复制的。 或者你可以使用一个原始的指针。 由于所讨论的方法显然是构造一个对象的方法,所以我没有看到返回一个原始指针的内在问题。 只要你把结果分配给每个呼叫站点的某个共享指针,你就会没事的。
谷歌模拟框架的非(可复制)函数参数和retun值问题的一个可行的解决方法是使用代理模拟方法。
假设你有下面的接口定义(如果这样使用std::unique_ptr
的好风格似乎或多或less是一个哲学问题,我个人喜欢它来强制转移所有权):
class IFooInterface { public: virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) = 0; virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() = 0; virtual ~IFooInterface() {} };
适当的模拟类可以这样定义:
class FooInterfaceMock : public IFooInterface { public: FooInterfaceMock() {} virtual ~FooInterfaceMock() {} virtual void nonCopyableParam(std::unique_ptr<IMyObjectThing> uPtr) { nonCopyableParamProxy(uPtr.get()); } virtual std::unique_ptr<IMyObjectThing> nonCopyableReturn() { return std::unique_ptr<IMyObjectThing>(nonCopyableReturnProxy()); } MOCK_METHOD1(nonCopyableParamProxy,void (IMyObjectThing*)); MOCK_METHOD0(nonCopyableReturnProxy,IMyObjectThing* ()); };
您只需要注意, nonCopyableReturnProxy()
方法的configuration(采取的操作)将返回NULL
或在堆上dynamic分配的实例。
有一个谷歌模拟用户论坛线程讨论这个主题,其中一个维护人员指出,谷歌模拟框架将不会改变,以支持这个在将来争论他们的政策强烈阻止使用std::auto_ptr
参数。 正如前面提到的,这是一个哲学的观点,恕我直言,模拟框架的function不应该指导什么样的接口,你想devise,或者你可以使用从第三方的API。
如上所述,答案描述了一个可行的解决方法。