如何创建一个只能动态分配对象的C ++类?

时间:2016-11-02 23:05:38

标签: c++

问题是创建一个类,使得对象的非动态分配导致编译器错误。

例如:

Employee e1;  // compiler error
Employee *e3 = new Employee; // works fine

3 个答案:

答案 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)

在类中创建一个私有析构函数。当你创建一个私有析构函数时,编译器会为非动态分配的对象生成编译器错误,因为编译器需要在它们不使用时从堆栈段中删除它们。