gpt4 book ai didi

c++ - 制作类的 Boost Matrix 属性

转载 作者:行者123 更新时间:2023-11-30 01:47:53 27 4
gpt4 key购买 nike

我想制作一个 boost 矩阵作为我的类 Adsorbate 的属性。我事先知道它将是 (3,2)。我想做的:

#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;

class Adsorbate {
matrix<double> m(3,2);
};

以便编译器知道属性 m 的大小,从而知道我的类 Adsorbate。这样,我可以制作一个包含 200 个指针的数组:

 Adsorbate * adsorbates = (Adsorbate *) malloc(200 * sizeof(Adsorbate));

我该怎么做?

最佳答案

关于如何创建矩阵数组,您问的是如何为 C++ 数据结构创建 C 数组。调用 malloc 不会正确地初始化数组中的矩阵,如果 ublas::matrix 的实例使用它,调用“free”也不会释放动态内存,初始化实例失败和销毁实例失败都是严重的错误,因为事情似乎工作,取决于原始内存的内容,它可以是全零或应用程序可以处理的东西,但它也可以是导致灾难性故障的垃圾。 Malloc 只会返回实例的内存,但在内部,具有 ublas::matrix 实例的 Adsorbate 实例可能认为它具有指向内存或其他任何内容的有效指针。

要正确初始化数组的各个成员,Adsorbate *adsorbates = new Adsorbate[200];将为所有 Adsorbate 实例使用默认构造函数。

你可以让 Adsorbate 的默认构造函数构造它的成员 m与 3,2:
struct Adsorbate {
Adsorbate(): m{3, 2}, ... orther instance initializations here ... { ...arbitrary constructor code here.... }
...
}

不建议使用数组。建议的方法是创建一个 std::vector<Adsorbate> .使用 std::vector 可能看起来更复杂,但事实并非如此,它会阻止您做看似更简单的事情,而这些事情在您不知情的情况下可能会造成灾难性后果。

如果您坚持使用裸阵列,请确保 delete[]一个数组而不是 delete .不同之处在于 delete仅调用一个元素的析构函数。

关于c++ - 制作类的 Boost Matrix 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30992468/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com