2016-04-19 18 views
0

Ich scheine verloren zu gehen, wenn ich versuchte dynamisch 2d Vektor von (Boost) Bitsets zu erstellen.Dynamisch Zuordnung 2D Vektor C++

Mein Code:

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))); 
    } 
}; 

Wie Attribut configset mit neuen Bediener initialisieren? Vielen Dank.

+3

'configset' ist kein Zeiger, also sollte' new' nicht verwendet werden. – NathanOliver

+0

auch nicht verwandt, aber machen Sie Ihren Konstruktor öffentlich. – fritzone

+0

@NathanOliver Ja: D. Ich bin erst nach ein paar Jahren in ein C++ Projekt gewechselt. – Smarty77

Antwort

3

Wie es ist configset als Teil Ihrer Configuration Klasse zugeordnet ist. Die Größe wird intern angepasst, so dass sie zu dem passt, was Sie wollen, aber es wird zerstört, wenn die Konfiguration zerstört wird. Sollte gut funktionieren, es sei denn, Sie brauchen wirklich einen Zeiger. Wenn dies für Sie funktioniert, ersetzen Sie einfach die Zuweisung durch Aufrufe an resize, um es zu einer beliebigen Form zu machen (wie folgt: configset.resize(weeks, vector<dynamic_bitset>(groups, dynamic_bitset(players)))). Dies sollte in den meisten Situationen gut funktionieren.

Wenn Sie es explizit zuweisen möchten, müssen Sie einen Zeiger speichern. Definieren Sie Configset wie folgt:

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

Und die meisten Ihrer Code wird funktionieren. Stellen Sie sicher, dass Sie es im Destruktor löschen.

Ein noch besserer Ansatz ist es, eine unique_ptr (oder einen anderen Smart-Pointer) wie folgt zu verwenden:

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

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

Auf diese Weise dynamisch zugeordnet wird, und Sie können es als Zeiger behandeln, aber Sie werden nicht vergiss es zu löschen.

Sie müssen dies auch auf die internen Strukturen anwenden, wenn sie dynamisch durchgängig zugewiesen werden müssen. Das ist

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

Schließlich Ihre Zuordnung schafft nur eine dynamic_bitset<> und ein vector<dynamic_bitset<>> und kopiert den Zeiger auf allen Standorten. Dies ist wahrscheinlich nicht das, was Sie wollen. Entweder die Zeiger (das ist nicht Java) oder eine Schleife, um es richtig zu initialisieren.