2015-06-23 47 views
1

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

#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)); 

我该怎么做?

回答

2

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

要正确初始化阵列的各个成员,Adsorbate *adsorbates = new Adsorbate[200]; 将对所有Adsorbate实例使用默认构造函数。不建议 struct Adsorbate { Adsorbate(): m{3, 2}, ... orther instance initializations here ... { ...arbitrary constructor code here.... } ... }

阵列:

,使吸附质的默认构造函数构造其成员m与3,2你可以把它。建议的方法是创建一个std::vector<Adsorbate>。使用std :: vector看起来可能更复杂,但它不会,它会阻止你做出显然更简单的事情,这些事情可能是你不知道的灾难性事件。

如果您坚持使用裸露阵列,请务必delete[]而不是delete。区别在于delete只调用一个元素的析构函数。

2

只是初始化它在构造函数中:

class Adsorbate { 
private: 
    matrix<double> m; 
public: 
    Adsorbate() : m(3, 2) {} 
    // ... 
}; 

此外,如果你想创建的200 Adsorbate阵列,使用std::vector

std::vector<Adsorbate> adsorbates(200); 
相关问题