【问题标题】:C++11 initializer_list constructor with header and cpp file for custom vector classC++11 initializer_list 构造函数,带有自定义向量类的头文件和 cpp 文件
【发布时间】:2014-10-08 15:08:38
【问题描述】:

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

唯一允许作为元素的值是无符号整数。

标题

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

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 myvec& 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) {

}

我不明白应该如何编写构造函数才能使其工作?在网上找了很久没有成功。

我想从另一个 c++ 文件中调用 initializer_list 构造函数 测试.cpp

myvec a = {1,2,3,4};

【问题讨论】:

  • 制作 1-argument-ctors explicit 除非你知道为什么不这样做。
  • std::initializer_list 不需要通过引用传递。它是一种奇怪的类型,它存储对临时数组的引用,并且通常按值传递。
  • 声明和定义也不匹配
  • 无关:当我看到类似的东西时,我永远不会感到困惑:arr = new unsigned int[0];

标签: c++ c++11 vector constructor initializer-list


【解决方案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() 对其进行迭代以复制其元素。

【讨论】:

  • 在头文件中我将定义写为 // myvec(initializer_list list) : myvec(list.size()); // 在 cpp 文件中 myvec::myvec(std::initializer_list list) : myvec(list.size()) { std::copy(std::being(list), std::end(列表),arr); }
  • 没有。只需写 myvec(initializer_list&lt;unsigned int&gt; list) 。成员初始化进入定义(在您的情况下为 cpp)
  • 好的,所以在标题中我有 myvec(initializer_list list);其余的都是一样的。但是我在编译时遇到错误并出现错误:在 '
  • 标题中需要#include &lt;initializer_list&gt;(使用反引号来格式化 cmets 中的代码)。对于std::copy,您还需要在cpp 中使用#include &lt;algorithm&gt;。希望这会有所帮助。
  • 最后评论 :) : 你可能会错过std::,检查工作版本here
【解决方案2】:

std::initializer_list 有 3 个成员函数:

这就是你所需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多