2015-06-23 44 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); 
相關問題