问题是创建一个类,使得对象的非动态分配导致编译器错误。
例如:
Employee e1; // compiler error
Employee *e3 = new Employee; // works fine
答案 0 :(得分:5)
您可以这样做:
#include <memory>
struct S {
static std::unique_ptr<S> create() {
return std::unique_ptr<S>(new S);
}
private:
S() {}
};
int main() {
auto ptr = S::create();
}
请注意,使用以下内容无法正常工作:
S() = default;
我想这是因为该类被视为聚合,因此以下内容仍适用于它:
S s{};
此外,以下create
函数在上面的示例中不起作用:
static std::unique_ptr<S> create() {
return std::make_unique<S>();
}
那是因为make_unique
必须能够访问构造函数才能完成它的工作,但是构造函数是私有的是不可能的。
答案 1 :(得分:2)
您需要将构造函数设为私有,并使工厂返回对象上的共享指针。
答案 2 :(得分:0)
在类中创建一个私有析构函数。当你创建一个私有析构函数时,编译器会为非动态分配的对象生成编译器错误,因为编译器需要在它们不使用时从堆栈段中删除它们。