【问题标题】:Default values for arrays members of struct [duplicate]struct的数组成员的默认值[重复]
【发布时间】:2011-10-02 21:20:49
【问题描述】:

可能重复:
Intitialzing an array in a C++ class and modifiable lvalue problem

正如this 问题中所见,可以将 ctor 赋予结构以使其成员获得默认值。您将如何继续为结构内数组的每个元素提供默认值。

struct foo
{
   int array[ 10 ];
   int simpleInt;
   foo() : simpleInt(0) {}; // only initialize the int...
}

有没有什么方法可以在一行中完成,类​​似于初始化 int 的方式?

【问题讨论】:

  • @Francis:正如现在所写的那样,这段代码在 C 中不起作用,因为它使用了构造函数。构造函数是一个 C++ 特性。
  • @Francis:不,它没有。

标签: c++ arrays constructor struct initialization


【解决方案1】:

新的 C++ 标准有办法做到这一点:

struct foo
{
   int array[ 10 ];
   int simpleInt;
   foo() : array{1,2,3,4,5,6,7,8,9,10}, simpleInt(0) {};
};

测试:https://ideone.com/enBUu

如果您的编译器还不支持这种语法,您可以随时分配给数组的每个元素:

struct foo
{
   int array[ 10 ];
   int simpleInt;
   foo() : simpleInt(0)
   {
        for(int i=0; i<10; ++i)
            array[i] = i;
   }
};

编辑:2011 年之前的 C++ 中的单线解决方案需要不同的容器类型,例如 C++ 向量(无论如何都是首选)或 boost 数组,可以是 boost.assign'ed

#include <boost/assign/list_of.hpp>
#include <boost/array.hpp>
struct foo
{
    boost::array<int, 10> array;
    int simpleInt;
    foo() : array(boost::assign::list_of(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)),
            simpleInt(0) {};
};

【讨论】:

  • 那么这种操作没有一个班轮吗?
  • @Francis - “一个班轮”是指“在 ctor-initializer 中”吗?如果它是您正在寻找的“单线”,只需将 ctor 主体提升到同一行(我不是在刻薄,只是想更好地理解您的评论)
  • @Dan - 我指的是 ctor-initializer
  • “无论如何都是首选”是什么意思?
【解决方案2】:

将数组更改为 std::vector 将允许您进行简单的初始化,并且您将获得使用矢量的其他好处。

#include <vector>
struct foo
{
  std::vector<int> array;
  int simpleInt;
  foo() : array(10, 0), simpleInt(0) {}; // initialize both
};

【讨论】:

  • 你也会得到使用向量的负面影响。
  • @Moberg 是哪个?
【解决方案3】:

如果您只想默认初始化数组(将内置类型设置为 0),您可以这样做:

struct foo
{
   int array[ 10 ];
   int simpleInt;
   foo() : array(), simpleInt(0) { }
};

【讨论】:

  • 除了 0 以外没有其他方法可以指定默认值吗?
  • @Francis:不是在 C++0x 之前,不是。有关替代方案,请参阅其他答案。
【解决方案4】:
#include <algorithm>

struct foo
{
  int array[ 10 ];
  int simpleInt;
  foo() : simpleInt(0) { std::fill(array, array+10, 42); }
};

或使用std::generate(begin, end, generator);,生成器由您决定。

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2020-04-03
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多