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

How to make a C++ class whose objects can only be dynamically allocated?

本文关键字:动态分配 c++ 一个对象 何创建 创建      更新时间:2023-10-16

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

例如:

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

你可以这样做:

#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必须能够访问构造函数来完成它的工作,但对于构造函数是私有的,这是不可能的。

你需要将你的构造函数设为私有,并创建一个返回对象上的共享指针的工厂。

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