2016-04-19 2 views
0

Кажется, я потерялся, когда попытался динамически создать 2d-вектор (boost) битов.Динамическое размещение g 2D-вектор C++

Мой код:

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

Как инициализировать атрибут configset с нового оператора? Благодарю.

+3

'configset' не является указателем, поэтому не следует использовать' new'. – NathanOliver

+0

также не связаны, но сделайте свой конструктор общедоступным. – fritzone

+0

@NathanOliver Да: D. Просто переключился на проект C++ через несколько лет. – Smarty77

ответ

3

Как это конфигурация назначается как часть вашего класса Configuration. Он изменит размер внутри, чтобы соответствовать желаемому, но будет уничтожен при уничтожении конфигурации. Должно работать нормально, если вам действительно не нужен указатель. Если это сработает для вас, просто замените выделение на звонки на resize, чтобы сделать его любой необходимой вам формой (например: configset.resize(weeks, vector<dynamic_bitset>(groups, dynamic_bitset(players)))). В большинстве случаев это должно работать нормально.

Если вы хотите выделить его явно, вам нужно сохранить указатель. Определите конфигурацию следующим образом:

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<> и один vector<dynamic_bitset<>> и копирует указатель на все места. Это, вероятно, не то, что вы хотите. Либо снимите указатели (это не java), либо запустите цикл для его правильной инициализации.

Смежные вопросы