2016-02-29 169 views
0

我想在構造函數中爲結構數組動態分配存儲。我是C++新手,嘗試過各種語法變體,但現在我想知道這是否可以完成。在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 *)); 
+0

'memset'並分配存儲器 - 它設置爲特定值。既然你正在初始化'cumeTradeCount = 0','memset'也不會做任何事情。另外,尾隨的逗號會使這段代碼不能編譯。 – MuertoExcobito

回答

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 - >仍,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) 
    { } 
}; 
0
Trade* trade [MAX_TRADES]; 

不是動態分配。它是一個固定大小的數組,指向Trade指針的指數爲100

如果這是你想要的,你可以將它們全部設置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),
+0

我錯過了什麼? – Anedar