2014-11-09 7 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

+0

@manabreak Я хочу создать массив объектов BloomFilter. –

+1

Невозможно использовать 'std :: vector', когда он может быть использован. –

ответ

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++ не позволяет выделять объекты с нестандартным конструктором. Не могли бы вы объяснить причину этого? –

+0

@AryaMz Возможно, я ошибаюсь, чтобы дать вам рационализацию! Вероятно, именно так оно и было изначально спроектировано. AFAIK, ни один из современных C-подобных языков не позволяет вам это делать. – manabreak

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

 Смежные вопросы

  • Нет связанных вопросов^_^