Я пытаюсь инициализировать динамический массив в конструкторе, используя initialize_list
в С++. Как я могу этого добиться?
#include <cstdlib>
#include <initializer_list>
#include <iostream>
#include <utility>
using namespace std;
class vec {
private:
// Variable to store the number of elements contained in this vec.
size_t elements;
// Pointer to store the address of the dynamically allocated memory.
double *data;
public:
/*
* Constructor to create a vec variable with the contents of 'ilist'.
*/
vec(initializer_list<double> ilist);
}
int main() {
vec x = { 1, 2, 3 }; // should call to the constructor
return 0;
}
initializer_list
имеет метод size
, он дает вам информацию о том, сколько элементов должно быть выделено new
, так что это может быть:
vec(initializer_list<double> ilist)
{
elements = ilist.size();
data = new double[ ilist.size() ];
std::copy(ilist.begin(),ilist.end(),data);
}
спасибо @rafix07, так каждый раз заполнение массива данных нужно делать только с помощью функции копирования? поскольку ilist - это временная память
@MohanNagella лучше используйте здесь std::vector
. Но если нет, обязательно предоставьте деструктор delete[]
this->data
.
@MohanNagella Вы можете использовать copy
или необработанный цикл для перебора элементов из initializer_list и копирования данных, это не имеет значения, но вам просто нужно скопировать данные из ilist в динамически выделенные данные, чтобы инициализировать их.
@StackDanny вместо этого ты имеешь в виду delete[] data;
.
да @RemyLebeau, верно. Я немного не знал об операциях перемещения, интересно.
@MohanNagella, если вы решите реализовать массив вручную с помощью new[]
, вам необходимо реализовать конструкторы копирования/перемещения, операторы присваивания копирования/перемещения и деструктор в соответствии с Правило 3/5/0. Используя вместо этого std::vector
, вы получаете это бесплатно.
@StackDanny Да! Я забыл упомянуть деструктор, и поскольку моей целью было использование динамического массива, поэтому я использую их, но вектор, как вы сказали, лучший подход, спасибо
@RemyLebeau Я собираюсь использовать все специальные функции в этом коде, чтобы познакомиться с динамическими и перегрузками.
@MohanNagella Поэтому я полагаю, что вы должны принять ответ RemyLebeau. Также вы можете захотеть избавиться от using std::namespace std;
вы можете прочитать здесь почему.
Используйте стандартный контейнер std::vector
вместо необработанного указателя. std::vector
— это оболочка для динамического массива, и у него есть конструктор, который принимает std::initializer_list
в качестве входных данных.
#include <initializer_list>
#include <iostream>
#include <vector>
using namespace std;
class vec {
private:
vector<double> data;
public:
vec(initializer_list<double> ilist) : data(ilist) {}
};
class также отсутствует
;
(точка с запятой) в конце.