c ++ 11中类范围的数组初始化

时间:2014-01-22 17:33:22

标签: c++ arrays initialization

我来自Java和Ruby,所以我很难用c ++编写简单的东西,c ++更难以驯服......

我想在类构造函数中初始化一个数组,其中包含可由类中所有方法访问的预定义​​值。是的,基本的东西。

换句话说,我想做这样的事情:

Box.h

class SomeClass
{
public:
     SomeClass(int something);
     SomeMethod();
     DoSomething(int thing);
protected:
     int _something;
     int[] arr;
};

Box.cpp

SomeClass::SomeClass(int something) : something(_something)
{
    arr ={16,2,45,65,45};
    for (int x = 0; x < 5; x++)
        arr[i] = arr[i] * _something;
}

SomeClass::SomeMethod(){
    for (int x = 0; x < 5; x++)
       DoSomething(arr[i]);
}

SomeClass::DoSomething(int thing){
    //whatever
}

如何?

3 个答案:

答案 0 :(得分:1)

您可以选择初始化数组数据成员,以及可以使用的两种类型或数组:

使用C风格的数组,

struct Foo
{
  int a[5] = {1,2,3,4,5};   // initialization at point of declaration
};

struct Bar
{
  int a[5];
  Bar() : a{1,2,3,4,5} {} // initialization in constructor initialization list
};

或使用std::array

struct Foo
{
  std::array<int,5> a = {{1,2,3,4,5}};   // initialization at point of declaration
};

struct Bar
{
  std::array<int,5> a;
  Bar() : a{{1,2,3,4,5}} {} // initialization in constructor initialization list
};

答案 1 :(得分:1)

#include <iostream>
//#include <initializer_list>
#include <array>
#include <algorithm>

class foo
{
    public:
    foo() : values({{16,2,45,65,45}})
    {
        // I left the below commented out in case you want to research more and use other kinds of types for doing it.
        //std::initializer_list<int> list = {16,2,45,65,45};
        //std::copy(std::begin(list), std::end(list), std::begin(values));
    }
    void print()
    {
        std::for_each(std::begin(values), std::end(values), 
           [](int v) { std::cout << v << ' '; });
    }

    private:
    static const int SIZE = 5;
    std::array<int, 5> values;
};

int main()
{
   foo fooInstance;
   fooInstance.print();
   return 0;
}

以上是我能在短时间内做到的最好的事情。我用以下编译器测试过。您可以将其作为起点,看看您是否可以学习其他方法。诸如generate之类的算法也可以与lamda表达式一起使用,以便生成一组受控制的值(与我们的示例中的硬编码列表相反)。 http://www.compileonline.com/compile_cpp11_online.php

答案 2 :(得分:0)

如果您可以使用C ++ 11,则支持uniform initialization,它允许您在比C中的特殊情况更多的上下文中指定大括号括起的值列表。