#c #templates
#c #c 11 #вектор #конструктор #инициализатор-список
Вопрос:
Я делаю школьный проект, в котором я должен создать пользовательский векторный класс. И класс должен иметь возможность инициализировать векторы несколькими различными способами. Я застрял с этой инициализацией initializer_list вектора.
Единственными значениями, которые разрешены в качестве элементов, являются unsigned int .
заголовок
#include <initializer_list>
class myvec {
private:
unsigned int *arr; //pointer to array
std::size_t n; //size of myvec
public:
myvec(); // Default contructor
myvec(std::size_t size); // Creating a vec with # of element as size
myvec(const myvecamp;); // Copy constructor
myvec(const initializer_list<unsigned int>amp; list);
cpp
#include "myvec.h"
#include <initializer_list>
myvec::myvec() {
arr = new unsigned int[0];
n = 0;
}
myvec::myvec(std::size_t size) {
arr = new unsigned int[size];
n = size;
}
myvec::myvec(const myvecamp; vec) {
arr = new unsigned int[vec.n];
n = vec.n;
for (int i = 0; i < vec.n; i ) {
arr[i]=vec.arr[i];
}
}
myvec::myvec(const std::initializer_list<unsigned int> list) {
}
Чего я не понимаю, так это как должен быть написан конструктор, чтобы он работал? Долгое время безуспешно пытался найти ответы в Интернете.
Я хочу вызвать конструктор initializer_list из другого файла c как test.cpp
myvec a = {1,2,3,4};
Комментарии:
1. en.cppreference.com/w/cpp/utility/initializer_list
2. Создайте 1-argument-ctors
explicit
, если вы не знаете, почему нет.3.
std::initializer_list
не нужно передавать по ссылке. Это странный тип, который хранит ссылку на временный массив и обычно передается по значению.4. также объявление и определение не совпадают
5. Не связанный: и я никогда не получаю нечеткости, когда вижу подобные :
arr = new unsigned int[0];
Ответ №1:
Предполагая, что вы передаете std::initializer_list
аргумент по значению (и вы можете, он легкий), вы могли бы сделать что-то вроде:
myvec(std::initializer_list<unsigned int> l) : myvec(l.size()) {
std::copy(std::begin(l), std::end(l), arr);
}
То есть вы инициализируете свой внутренний массив с size()
помощью списка, и вы перебираете его с std::begin()
помощью и std::end()
копируете его элементы.
Комментарии:
1. В заголовочном файле я записываю определение как // myvec(initializer_list<unsigned int> list) : myvec(list.size()); // а в cpp-файле myvec::myvec(std::initializer_list<unsigned int> list): myvec(list.size()){ std::copy(std::being(список), std::end(список), arr); }
2. Нет. Просто напишите
myvec(initializer_list<unsigned int> list)
. инициализация членов переходит в определение (cpp в вашем случае)3. хорошо, итак, в заголовке у меня есть myvec(initializer_list<unsigned int> список); а остальное то же самое. Но я получаю ошибку при компиляции с ошибкой: ожидаемый ‘)’ перед токеном ‘<‘. в строке в файле заголовка и ошибка: ожидаемый конструктор, деструктор или преобразование типа перед токеном ‘(‘. в строке в файле cpp myvec::myvec. Извините, но не знаю, как написать код на сером фоне :/
4. Вам нужно
#include <initializer_list>
в вашем заголовке (используйте обратные метки для форматирования кода в ваших комментариях). Вам также понадобится#include <algorithm>
cpp дляstd::copy
. Надеюсь, это поможет.5. Последний комментарий 🙂 : Вы можете пропустить и
std::
, проверьте рабочую версию здесь