【问题标题】:How to create a constructor that accepts 2D array如何创建一个接受二维数组的构造函数
【发布时间】:2019-01-09 14:59:27
【问题描述】:

我正在为教育目的创建自己的矩阵库。 我创建了一个以

形式接受 4x4 矩阵的构造函数
Matrix(float initMatrix[4][4]){
 //init operation here
}

通过创建二维数组然后使用该变量初始化该对象来创建对象时,上述构造函数可以正常工作,例如:

float my_matrix[4][4] = {{...},{...},{...},{...}}; //shortened for brevity
Matrix matrix(my_matrix);

但是,执行以下操作时无法构建:

Matrix matrix({{...},{...},{...},{...}});

编译器告诉我

> cannot convert initializer list argument to 'float (*)[4]'

所以我添加了另一个构造函数,如下所示:

Matrix matrix(float matrix(*)[4]){}

我最终得到以下编译器错误。

error: C++ requires a type specifier for all declarations
    Vytrix(float input(*)[4]){

有人可以告诉我一种设计构造函数的灵活方式,以便我可以以干净的方式初始化类吗?

【问题讨论】:

标签: c++ arrays object multidimensional-array constructor


【解决方案1】:

你可以这样做:

struct Matrix
{
    float initMatrix[4][4];
};

int main()
{
    Matrix m{ { { 1,2,3,4 },{ 5,6,7,8 },{ 9,10,11,12 },{ 13,14,15,16 } } };
    return 0;
}

https://ideone.com/WeZjbY

【讨论】:

    【解决方案2】:

    你使用的是 C++,所以你可以使用std::array

    std::array 是带有初始化的a little wonky,因此您需要一组额外的花括号。这是一个工作示例:

    #include <array>
    
    class foo
    {
    public:
        foo(std::array<std::array<int, 2>, 3> arr) { }
    };
    
    int main()
    {
        foo f({{{1, 2}, {3, 4}, {5, 6}}});
    }
    

    【讨论】:

    • 这个bug不是早就修复了吗?
    • @o11c ideone 如果我没有多余的牙套,仍然会对我大喊大叫,所以我想我会把它们扔进去。
    • @scohe001 谢谢。我会记住你的回答,对于这个特定的项目,我决定稍微简单一点。
    【解决方案3】:

    如果你想强制维度,你可以接受对数组的 const 引用,而不是直接传递数组:

    struct Matrix {
        Matrix(const float (&initMatrix) [4][4]) {}
    };
    
    int main()
    {
        Matrix m({{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}});
        return 0;
    }
    

    在这里试试:https://onlinegdb.com/ByzOQTkrQ

    这是一个很好的答案:https://stackoverflow.com/a/17569578/2193968

    【讨论】:

      【解决方案4】:

      语法是:

      Matrix(const float (&m)[4][4]);
      

      【讨论】:

      • 这应该是评论,而不是答案。
      • @L.Kue:这将解决 OP 的问题,所以这是一个答案。你可能认为它太短了。评论主要是要求“澄清”。
      • @Jarod42 感谢您的回复,效果很好!这是否有效,因为我本质上是通过像这样声明它来传递一个指针:Matrix matrix({{......}})?
      • @KhalidAkash:C 数组不能按值传递,因此您必须通过指针/引用传递它们。 Matrix(float initMatrix[4][4]) 实际上是 Matrix(float (*initMatrix)[4])
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2017-08-27
      • 2020-02-13
      相关资源
      最近更新 更多