我想制作一个Boost Matrix作为类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数组。如果ublas::matrix实例使用了malloc,则调用malloc不会正确初始化数组中的矩阵,或者调用“free”也不会释放动态内存,初始化实例失败和销毁实例都是严重的错误,因为事情似乎可以正常工作,取决于原始内存的内容,它可以全为零或应用程序可以处理的内容,但也可以是垃圾,导致灾难性的故障。 Malloc只会为实例提供内存,但是在内部,一个具有ublas::matrix实例的Adsorbate实例可能会认为它具有指向内存或其他任何有效指针。

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

您可以这样做,以便Adsorbate的默认构造函数使用3,2构造其成员m: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/

10-09 20:40