繁体   English   中英

通过构造函数初始化std :: array私有成员

[英]Initializing std::array private member through constructor

例如,我有以下代码:

#include <iostream>
#include <array>

class Base {
public:
  Base() : mA(std::array<int,2>()) {}
  Base(std::array<int,2> arr) : mA(arr) {}
  Base(/* what to write here ??? */);
private:
  std::array<int,2> mA;
};

int main() 
{
    std::array<int,2> a = {423, 12}; // Works fine
    Base b(a); // Works fine
    Base c({10, 20}); // This is what I need. 

    return 0;
}

我应该如何定义构造函数以允许进行初始化,如上面“ main”内第三行所示? 通常,我需要一个可配置的(在编译/运行时的长度)结构,该结构允许使用数字列表进行初始化,例如{1、2、3}或(1、2、3)或类似的东西,而无需使用-逐元素复制。 为了简单起见,我选择了std :: array,但是恐怕这种初始化可能不起作用。 您会推荐哪种容器?

谢谢,Kostya

您可以添加一个采用std::initializer_list<int>的构造函数,然后将内容复制到数组中:

#include <initializer_list>
#include <algorithm>

....

Base(std::initializer_list<int> a) {
   // check size first
   std::copy(a.begin(), a.end(), mA.begin()); }
}

注意: 如果要保留运行时定义的许多元素,则应使用std::vector<int>它具有initializer_list<int>的构造函数,因此代码更简单:

class Foo {
public:
  Foo() {}
  Foo(const std::vector<int>& arr) : mA(arr) {}
  Foo(std::initializer_list<int> a) : mA(a) {}
private:
  std::vector<int> mA;
};

您可以像这样初始化它:

Foo f1({1,2,3,4,5});

要么

Foo f2{1,2,3,4,5};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM