我正在写一个稀疏矩阵类。我需要一个节点类,它将是其内容的模板。我写这堂课的问题是:
如何存储内容?
我想按值存储内容。如果我用指针存储它并且它应该被销毁,那么我就有麻烦了。如何在setContents方法中安全地执行副本? C ++是否提供任何保证,应该放入我的节点容器中的类具有克隆自身的能力?
我查看了复制构造函数,但我有一些疑虑。如果包含的类没有实现复制构造函数怎么办?然后通过引用将它传递给节点是不明智的,因为如果原始对象应该被删除或超出范围,那么这可能导致悬空引用。
这种“标准C ++”的方式是什么?
答案 0 :(得分:3)
标准C ++方法是强制容器类使用的类型必须是可复制的(并且可能是可分配的)。这是一个非常合理的要求,并且被标准库中的所有容器类模板使用。
对于内置类型和简单的POD类型,通常不需要用户声明的复制构造函数。类的作者不是那么简单但需要有价值代理,通常必须在任何情况下提供合适的拷贝构造函数。
答案 1 :(得分:1)
我正在写一个稀疏矩阵类。我需要一个节点类,它将是其内容的模板。
如果您复制模板实现中的节点,这将导致节点可复制的要求。如果有人试图使用没有公共拷贝构造函数的类来实例化模板,他将会遇到编译器错误。
在实例化模板时,编译器会检查所有使用的方法/ ...是否可用于实例化模板的类型。因此,对于您的模板,将确保使用它的所有类都具有公共拷贝构造函数。
拥有公共拷贝构造函数也是一个合理的要求:标准库中的容器也要求其元素是可复制的。如果没有定义自定义的类型,编译器也会自动为新类型生成复制构造函数,因此大多数类都有一个可以使用的复制构造函数。
尽管如此,您应该记录您的模板需要使用通常的语义复制节点,以便模板的用户知道它。
答案 2 :(得分:0)
在我的行业中,BOOST库已经变得非常流行。 Boost.org
在boost中有一个叫做智能指针的类。基本上,它是实现引用计数的指针的包装类。当没有人再注意指针时,智能指针会自行删除。它解决了许多问题,包括悬空参考,内存泄漏等。
另外,我还想作为另一种选择,建议简单地实现更好的复制构造函数。如果你不想在你的程序中添加更多的库,如果你正在编写模板的类不是自定义的,那么你总是可以为任何具有更好的复制构造函数的类编写包装类。默认复制构造函数。