2016-04-19 13 views
0

の動的割り振り2dベクトルの(ブースト)ビットセットを動的に作成しようとしたときに失われているようです。2次元ベクトルC++

マイコード:

新しい演算子で属性 configsetを初期化する方法
class Configuration 
{ 
    vector< vector<dynamic_bitset<> > > configset; 
    Configuration(unsigned groups, unsigned players, unsigned weeks){ 
     //allocation on heap, this works 
     vector< vector<dynamic_bitset<> > > configset(weeks, vector<dynamic_bitset<> >(groups, dynamic_bitset<>(players))); 

     //this does not work, how to create this dynamically, with new? 
     configset = new vector< vector<dynamic_bitset<> > > (weeks, new vector<dynamic_bitset<> >(groups, new dynamic_bitset<>(players))); 
    } 
}; 

?ありがとう。

+3

'configset'はポインタではないので、' new'を使うべきではありません。 – NathanOliver

+0

も関係はありませんが、あなたのコンストラクタをpublicにしてください。 – fritzone

+0

@ NathanOliverはい:D。数年後にC++プロジェクトに切り替えました。 – Smarty77

答えて

3

configsetはConfigurationクラスの一部として割り当てられています。それはあなたが望むものに合うように内部的にサイズ変更されますが、設定が破棄されると破壊されます。本当にポインタが必要な場合を除き、うまく動作するはずです。これが有効な場合は、割り当てをresizeへの呼び出しで置き換えて、必要なシェイプを作成します(configset.resize(weeks, vector<dynamic_bitset>(groups, dynamic_bitset(players)))など)。これはほとんどの状況でうまくいくはずです。

明示的に割り当てる場合は、ポインタを格納する必要があります。次のようなconfigsetを定義してください:

vector< vector<dynamic_bitset<> > > *configset; 

ほとんどのコードが動作します。デストラクタで削除してください。

アンさらに良いアプローチは、このようなunique_ptrを(またはいくつかの他のスマートポインタ)を使用することです:

unique_ptr<vector<vector<dynamic_bitset<>>>> configset; 

.... 
configset.reset(new vector....); 

それが動的に割り当てられている。この方法は、あなたはポインタとして扱うことができますが、あなたはしません削除することを忘れないでください。

これをすべての方法で動的に割り当てる必要がある場合は、これも内部構造に適用する必要があります。それは

vector<vector<dynamic_bitset<>*>*>* configset; 
or 
unique_ptr<vector<unique_ptr<vector<unique_ptr<dynamic_bitset<>>>>>> configset; 

最後に、あなたの割り当てが一つだけdynamic_bitset<>と1 vector<dynamic_bitset<>>コピーすべての場所へのポインタを作成しています。これはおそらくあなたが望むものではありません。ポインタを落とすか(これはjavaではありません)、正しく初期化するためのループがあります。