C++ C++;11具有自定义向量类的标题和cpp文件的初始值设定项\u列表构造函数

C++ C++;11具有自定义向量类的标题和cpp文件的初始值设定项\u列表构造函数,c++,c++11,vector,constructor,initializer-list,C++,C++11,Vector,Constructor,Initializer List,我正在做一个学校项目,我要构建一个自定义向量类。 类应该能够以几种不同的方式初始化向量。 我被这个初始化器卡住了,向量的初始化 只允许作为元素的值是无符号int 标题 #include <initializer_list> class myvec { private: unsigned int *arr; //pointer to array std::size_t n; //size of myvec public: myvec(); // Default

我正在做一个学校项目,我要构建一个自定义向量类。 类应该能够以几种不同的方式初始化向量。 我被这个初始化器卡住了,向量的初始化

只允许作为元素的值是无符号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 myvec&); // Copy constructor
    myvec(const initializer_list<unsigned int>& list);
有3个成员职能:


这就是您所需要的。

假设您是按值传递参数(您可以,它是轻量级的),您可以执行以下操作:

myvec(std::initializer_list<unsigned int> l) : myvec(l.size()) {
  std::copy(std::begin(l), std::end(l), arr);
}
myvec(std::initializer\u list l):myvec(l.size()){ std::copy(std::begin(l)、std::end(l)、arr); }
也就是说,您可以使用列表的
size()
初始化内部数组,并使用和复制其元素对其进行迭代。

使1-argument-ctors
explicit
,除非您知道原因。
std::initializer\u list
不需要通过引用传递。这是一种奇怪的类型,它存储对临时数组的引用,通常是通过值传递的。此外,声明和定义不匹配:当我看到这样的情况时,我从不感到模糊:
arr=newunsigned int[0]在头文件中,我将定义写为//myvec(初始值设定项_list list):myvec(list.size());//在cpp文件myvec::myvec(std::initializer_list)中:myvec(list.size()){std::copy(std::being(list),std::end(list),arr);}不。只需写
myvec(initializer_list list)
。成员初始化进入定义(在您的例子中是cpp)ok,所以在标题中我有myvec(初始化器列表);其余的都一样。但是我在compile中遇到了错误,在“需要
”之前加上“error:expected”)。#在标题中包含
(使用反勾号在注释中格式化代码)。您还需要将
包含在
std::copy
的cpp中。希望这有帮助。最后一条评论:):您可能会错过并且
std:
,请检查工作版本
myvec a = {1,2,3,4};
myvec(std::initializer_list<unsigned int> l) : myvec(l.size()) {
  std::copy(std::begin(l), std::end(l), arr);
}