使用 init 方法来避免使用 new 分配对象是这种糟糕的设计
Using init-methods to avoid allocating object using new - is this bad design?
我最近开始使用init方法,而不是在C++设计类时将参数传递给构造函数:
Class A {
public:
A();
init(int number);
...
};
而不是:
Class A {
public:
A(int number);
};
这允许我在其他类中使用 A 作为成员,如下所示:
class B {
A m_a;
};
而不是我以前做的方式:
class B {
A *m_a;
};
(然后在 B 的构造函数中分配m_a。
使用 init 函数的好处是我不必担心删除 m_a,因为当 B 的实例被销毁时,它会被销毁。
我的问题是:使用我应该知道的初始化方法有什么缺点吗?这会溢出堆栈等吗?
到目前为止一切正常,但我认为在以这种方式编写大量代码之前,我应该先问一下。
>这是一个可怕的模式。
对象在其构造和调用 init 之间将处于未定义状态。此外,您还必须考虑使 init 线程安全,并在多次调用时使 init 健壮。
另请注意,从 c++11 开始,您可以从另一个构造函数调用构造函数。因此,init 函数消除了可能因拥有多个构造函数而产生的代码重复的论点不再适用。
您不必使用指针将类实例作为属性。
Class B {
public:
explicit B(int i); // notice the explicit, btw
A m_a;
};
B::B(int i)
: m_a(i) { // will call the constructor of "A" with "i" as argument
}
当B
的实例也被销毁时,m_a
将被销毁。
通过添加 init
方法,您违背了构造函数的目的:您可以拥有一个未完全构建的对象。而不是忘记删除m_a
,您冒着忘记初始化它的风险。
您可以按值存储属性,即使需要非默认构造函数来实例化它们。在类 B
的构造函数中,您需要通过初始化列表显式实例化m_a
,例如 B(int number):m_a(number){}
.使用初始化函数来克服这个"问题"在这里确实是不必要的,因为语言本身支持这一点。
相关文章:
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 为对象分配整数.输出将是什么?
- C++ 使用枚举类对象分配 std::map 值
- 如何在C++中为增加但记住删除先前对象的对象分配唯一标识符
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 是否可以使用 malloc 为类对象分配内存?
- 将对象分配给数组C++
- 我们可以在cpp中为对象分配函数吗
- 为模板参数类型中的新对象分配内存
- 我无法将对象分配给对象数组
- 对象分配-成员函数的使用无效错误
- 将派生对象分配给函数内的基类指针
- Arduino ESP32如何将BLEUUID对象分配到字符串中
- Rapidjson将密钥值从一个文档对象分配到另一个文档对象
- 奇怪的对象分配行为C