【问题标题】:Array initialization, too many initializer values数组初始化,初始化器值太多
【发布时间】:2021-06-03 10:46:21
【问题描述】:

我正在定义一个这样的成员变量:

float m_Colors[4];

在构造函数中我想这样初始化它:

m_Color = {0.0f, 0.0f, 0.0f, 1.0f};

尽管我之前在这个特殊场合已经这样做了一百万次,但我得到了错误“太多的初始化值”。这两行非常简单的代码怎么可能有问题?请启发我。

【问题讨论】:

  • m_Colors m_Color?请出示您的确切代码(minimal reproducible example)。
  • 请注意,您可以使用 std::array 来执行此操作,而不是类似 C 的数组。
  • 不能在构造函数iirc中使用=语法

标签: c++ arrays initialization


【解决方案1】:

您不能使用初始化器语法再次重新初始化数组(在构造 class 时它已经默认初始化)。

class被构造时,你可以使用ctorinitializer list来初始化array

struct S 
{
    S( ) 
      :  floats_{ 1.0f, 2.2f, 3.3f, 4.4f } 
    {  }

private:
    float floats_[ 4 ];
};

【讨论】:

    【解决方案2】:

    如果你想为内置数组使用初始化器,你必须在声明它的时候做。 否则,您可以在构造函数中这样使用:

    float tmp[] = { 0.0f, 0.0f, 0.0f, 1.0f };
    memcpy_s(m_Colors, 4, tmp, 4);
    

    【讨论】:

    • 看起来很复杂,但它可以完成这项工作。我选择使用初始化列表。
    【解决方案3】:

    您可以使用 std::array<...> 作为您成员的数据类型。通过这种方式,您可以使用花括号对其进行初始化,并在需要时以这种方式分配它,此外您还可以获得一些额外的现代 C++ 优势。

    #include <array>
    
    class Object
    {
    public:
        Object() : m_Colors{0.0f, 0.0f, 0.0f, 1.0f}
        {
        }
    
    private:
        std::array<float, 4> m_Colors;
    };
    

    如果您需要重新分配:

    void reinit()
    {
        m_Colors = {0.0f, 0.0f, 0.0f, 1.0f};
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 2012-09-02
      • 2021-01-29
      • 2017-07-21
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2020-02-08
      相关资源
      最近更新 更多