如何创建一个对象只能动态分配的c++类
How to make a C++ class whose objects can only be dynamically allocated?
问题是创建一个类,使对象的非动态分配导致编译器错误。
例如:
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
必须能够访问构造函数来完成它的工作,但对于构造函数是私有的,这是不可能的。
你需要将你的构造函数设为私有,并创建一个返回对象上的共享指针的工厂。
在类中创建私有析构函数。当你创建私有析构函数时,编译器会为非动态分配的对象生成编译错误,因为编译器需要在它们不使用时从堆栈段中删除它们。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 二维阵列的动态分配
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 在运行时为动态分配的内存输入值
- 释放动态分配的内存时是否需要执行此额外步骤
- 动态分配字符数组的内存