在C ++构造函数

时间:2016-02-29 01:00:12

标签: c++ arrays dynamic struct constructor

我正在尝试在构造函数中为结构数组动态分配存储空间。我是C ++的新手,并尝试过各种语法变体,但现在我想知道这是否可以完成。

struct Trade
{
    int index;
}

define MAX_TRADES 5000
struct foo
{
    Trade *trade [MAX_TRADES];

    int cumeTradeCount;

    foo() :
        cumeTradeCount(0),
    {
        // here is where I want to allocate storage for cumeTradeCount Trade structures
        ....

        memset(trade, 0, cumeTradeCount   * sizeof(Trade*));
    }
}

具体来说,我想弄清楚的是我如何在构造函数中为'cumeTradeCount'结构分配存储空间。 如果我在C中这样做,我会做以下事情:

for (int i = 0; i < cumeTradeCount; ++i)
    trade[i] = calloc(1, sizeof(Trade *));

2 个答案:

答案 0 :(得分:1)

You need to read a good C++ book.。您的代码在堆栈上分配了5000个指针。

要在堆栈上分配5000个Trade个对象,只需使用Trade trade[MAX_TRADES] ...示例:

struct Trade
{
    int index;
};

#define MAX_TRADES 5000
struct foo
{
    Trade trade[MAX_TRADES];

    int cumeTradeCount;

    foo() : 
        cumeTradeCount(0)
    {
        // allocate storage for cumeTradeCount Trade structures
        //memset(trade, 0, cumeTradeCount   * sizeof(Trade*));
        // You don't need it
    }
};

对于堆,您使用运算符new在堆上进行分配。

将此更改为Trade *trade [MAX_TRADES];Trade *trade = new Trade[MAX_TRADES];

由于它是一名班级成员,下面是它的完成方式。但是不要在你的析构函数中忘记它delete ......下面有一个完整的例子......

struct Trade
{
    int index;
};

#define MAX_TRADES 5000
struct foo
{
    Trade *trade;

    int cumeTradeCount;

    foo() : trade(new Trade[MAX_TRADES]),
        cumeTradeCount(0)
    {
        // allocate storage for cumeTradeCount Trade structures
        //memset(trade, 0, cumeTradeCount   * sizeof(Trade*));
        // You don't need it
    }

    ~foo() { delete[] trade; }
};

。我强烈建议您使用std::arraystd::vector而不是原始数组。同样,在C ++中,我们更喜欢使用constconstexpr#defines - &gt;仍然,You need to read a good C++ book.

下面,将为您节省许多不可预见的麻烦。

#include <vector>
struct Trade
{
    int index;
};

#define MAX_TRADES 5000
struct foo
{
    std::vector<Trade> trade;
    int cumeTradeCount;

    foo() : trade(MAX_TRADES),
        cumeTradeCount(0)
    { }
};

答案 1 :(得分:0)

Trade* trade [MAX_TRADES];

不是动态分配。它是一个固定大小的数组,包含5000个指针 Trade

如果这是你想要的,你可以将它们全部设置为NULL或更好nullptr,然后填写你需要的那些:

trade[i] = new Trade();

不要忘记在析构函数中使用delete并实现正确的赋值,复制构造函数和复制赋值。

如果您需要动态数组,请使用以下内容:

Trade* trade[];
//in constructor
trade = new Trade*[sizeOfArray]; //remember those pointers are still uninitialized

或者如果你不需要指针:

Trade trade[];
//in constructor
trade = new Trade[sizeOfArray];

由于您在询问C ++,因此使用

会更容易
  • std::array<Trade*,NUM_TRADES>(对于固定数量的指针),
  • std::array<Trade,NUM_TRADES>(对于固定数量的Trade s),
  • std::vector<Trade*>(对于可变数量的指针),
  • std::vector<Trade>(可变数量Trade s),