【发布时间】:2017-06-02 03:44:28
【问题描述】:
我正在尝试学习可以在 C++ 中使用的各种工厂模式。我不确定为什么我不能返回一个唯一的 ptr。我可以很好地返回一个共享的ptr。这是我的代码:
class FactoryMethodExample {
FactoryMethodExample() {}
public:
static FactoryMethodExample get_instance() {
return {};
}
static FactoryMethodExample * get_pointer() {
return new FactoryMethodExample;
}
static unique_ptr<FactoryMethodExample> get_unique_instance() {
return make_unique<FactoryMethodExample>();
}
static shared_ptr<FactoryMethodExample> get_shared_instance() {
return shared_ptr<FactoryMethodExample>();
}
void verify() {
cout << "I exist" << endl;
}
};
此代码无法编译。我收到此错误:
error: calling a private constructor of class 'FactoryMethodExample'
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
【问题讨论】:
-
make_unique不能使用私有构造函数:它不是类的朋友。你必须做老式的return std::unique_ptr<FactoryMethodExample>(new FactoryMethodExample()); -
另请注意,您的
get_shared_instance()实际上并没有返回实例 - 它返回一个空共享指针。 -
如果有
std::make_shared()可用,则使用return std::make_shared<FactoryMethodExample>()(在使构造函数可访问之后),否则使用return shared_ptr<FactoryMethodExample>(new FactoryMethodExample); -
@IgorTandetnik 谢谢,你的老式方法奏效了。但是我无法通过朋友类方法使其工作。你能解释一下吗?
-
不要那样做;它是非便携式的。即使你设法与
std::make_unique成为朋友,它也可以合法地将实际工作委托给一些内部帮助函数(它不会是朋友,让你从头开始)。所以你的程序可以用一些标准库实现编译,但不能用其他实现。