C 11 конструктор initializer_list с заголовком и файлом cpp для пользовательского векторного класса

#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:: , проверьте рабочую версию здесь

Ответ №2:

std::initializer_list имеет 3 функции-члена:

И это все, что вам нужно.