2014-11-09 60 views
-1

如何在其構造函數中分配另一個類內的對象數組?在另一個類中分配對象數組(C++)

class BloomFilter 
{ 
public: 
    BloomFilter(double fp, size_t capacity); 
private: 
    size_t bf_m; 
    size_t bf_k; 
}; 

class RSig { 
public: 
    RSig(int32_t sizeL1, int32_t sizeL2, double bfFpRate) : 
     numSlot_sig(sizeL1), numSlot_bf(sizeL2) 
    { 
     TL_sigMem = new BloomFilter(bfFpRate, numSlot_bf)[sizeL1]; 
    } 

private: 
    int32_t numSlot_sig, numSlot_bf; 
    BloomFilter* TL_sigMem; 
}; 

上面的代碼給我下面的錯誤:

In constructor 'RSig::RSig(int32_t, int32_t, double)’: 
error: expected ‘;’ before ‘[’ token 
     TL_sigMem = new TL_sigMem(bfFpRate, numSlot_bf)[sizeL1]; 

最好,我不想使用std::vector

+0

只是要清楚:你想'TL_sigMem'是'BloomFilter'對象,數組或'BloomFilter'指針數組? – manabreak 2014-11-09 05:30:24

+0

@manabreak我想創建'BloomFilter'對象數組。 – 2014-11-09 05:33:17

+1

當使用'std :: vector'的時候嚴重的不智能。 – 2014-11-09 05:51:19

回答

1

要創建對象的數組,語法是這樣的:

T* t = new T[<size>]; 

哪裏T是類型,t是數組的名稱,<size>是數組的大小。現在,在你的情況,你想做到這一點:

TL_sigMem = new BloomFilter[sizeL1]; 

這將創建BloomFilter的規模sizeL1的數組。然而,由於你的BloomFilter似乎並不有一個默認的構造函數,你需要要麼使用std::vector及其emplace_back()功能,馬上拿出自己的(比較複雜)的方式,或創建一個指針數組來代替:

BloomFilter** TL_sigMem; 

TL_sigMem = new BloomFilter*[sizeL1]; 

TL_sigMem[0] = new BloomFilter(...); 
+0

我想知道爲什麼C++不允許使用非默認構造函數分配對象。你能解釋一下背後的原因嗎? – 2014-11-09 05:43:25

+0

@AryaMz我可能是錯誤的人給你一個合理化的背後!這可能只是它最初設計的方式。但是,AFAIK,現代的類C語言都不允許你這麼做。 – manabreak 2014-11-09 05:46:03

3

像這樣:

#include <vector> 

class RSig 
{ 
public: 
    RSig(double rate, std::size_t len) : TL_sigMen(len, BloomFilter(rate)) {} 

private: 
    std::vector<BloomFilter> TL_sigMem; 
}; 
+0

雖然技術上正確,但OP更喜歡不使用'std :: vector'的解決方案。 – manabreak 2014-11-09 05:39:38

相關問題