1

我正在写一个稀疏矩阵类。我需要一个节点类,它将作为其内容的模板。我写这门课的问题是:

如何存储内容?

我想按值存储内容。如果我通过指针存储它并且它应该被销毁,那么我就会遇到麻烦。如何在 setContents 方法中安全地执行复制?C++ 是否提供任何保证,应该放置到我的节点容器中的类具有克隆自身的能力?

我已经查看了复制构造函数,但我有些疑虑。如果包含的类没有实现复制构造函数怎么办?然后通过引用将其传递给节点是不明智的,因为如果应该删除原始对象或超出范围,这可能会导致悬空引用。

执行此操作的“标准 C++”方式是什么?

4

3 回答 3

3

标准的 C++ 方法是要求容器类使用的类型必须是可复制的(并且可能是可分配的)。这是一个非常合理的要求,标准库中的所有容器类模板都使用它。

对于内置类型和简单的 POD 类型,通常不需要用户声明的复制构造函数。不那么简单但需要具有值语义的类的编写者通常必须在任何情况下提供合适的复制构造函数。

于 2010-02-03T21:12:02.223 回答
1

我正在写一个稀疏矩阵类。我需要一个节点类,它将作为其内容的模板。

如果您在模板实现中复制节点,这只会导致节点可复制的要求。如果有人试图用一个没有公共复制构造函数的类来实例化模板,他会得到编译器错误。

实例化模板时,编译器会检查所有使用的方法/... 是否可用于用于实例化模板的类型。因此,对于您的模板,将确保所有使用它的类都具有公共复制构造函数。

拥有一个公共复制构造函数也是一个合理的要求:标准库中的容器也要求它们的元素是可复制的。如果没有定义自定义类型,编译器也会自动为新类型生成复制构造函数,因此大多数类都有一个可以使用的复制构造函数。

尽管如此,您应该记录您的模板需要复制具有通常语义的节点,以便模板的用户知道它。

于 2010-02-03T21:19:26.137 回答
0

在我的行业中,BOOST 库已经变得非常流行。 Boost.org

在 boost 中有一个称为智能指针的类。基本上,它是实现引用计数的指针的包装类。当没有人再看指针时,智能指针会自行删除。它解决了许多问题,包括悬空引用、内存泄漏等。

另外,作为另一种选择,我还建议简单地实现一个更好的复制构造函数。如果您不想在程序中添加更多库,如果您正在为其编写模板的类不是自定义的并且您可以重写默认复制构造函数。

于 2010-02-03T21:21:13.997 回答