在另一个类中分配对象数组(C++)

Posted

技术标签:

【中文标题】在另一个类中分配对象数组(C++)【英文标题】:Allocating array of objects inside another class (C++) 【发布时间】:2014-11-09 05:25:45 【问题描述】:

如何在另一个类的构造函数中分配对象数组?

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

【问题讨论】:

要明确一点:您希望TL_sigMemBloomFilter 对象的数组,还是BloomFilter 指针的数组? @manabreak 我想创建BloomFilter 对象的数组。 std::vector在可以用的时候不用是非常不聪明的。 【参考方案1】:

像这样:

#include <vector>

class RSig

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

private:
    std::vector<BloomFilter> TL_sigMem;
;

【讨论】:

虽然技术上正确,但 OP 更喜欢不使用 std::vector 的解决方案。【参考方案2】:

要创建一个对象数组,语法如下:

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

其中T 是类型,t 是数组的名称,&lt;size&gt; 是数组的大小。现在,根据您的情况,您希望这样做:

TL_sigMem = new BloomFilter[sizeL1];

这将创建一个大小为sizeL1BloomFilters 数组。但是,由于您的 BloomFilter 似乎没有默认构造函数,因此您需要使用 std::vector 及其 emplace_back() 函数,使用您自己的(相当复杂的)方法,或者创建一个指针数组而是:

BloomFilter** TL_sigMem;

TL_sigMem = new BloomFilter*[sizeL1];

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

【讨论】:

我想知道为什么 C++ 不允许使用非默认构造函数分配对象。你能解释一下这背后的原因吗? @AryaMz 我可能是错误的人,无法为您提供合理化的理由!这可能就是它最初设计的方式。 AFAIK,不过,没有一种现代的类 C 语言允许你这样做。

以上是关于在另一个类中分配对象数组(C++)的主要内容,如果未能解决你的问题,请参考以下文章

在Javascript中分配对象内部的数组

如何在 C++ 中分配类内数组的可修改大小

如何在 C++ 中分配一个二维指针数组

数组,数字包装类,字符串的处理

在函数 C++ 中分配内存二维数组

如何在 C++ 中分配一个大的动态数组?