如何在C ++中为固定大小的2D数组的字段编写get方法?

时间:2019-01-10 14:36:10

标签: c++ c++14

我需要编写一个包装类,为数据类的字段提供“获取”方法。但是,我不知道编写“ getter”以返回2D数组的语法。例如:

#include <iostream>

class Data {
public:
    double array[2][2];
};

class Wrapper {
private:
    Data* dataptr;
public:
    Wrapper(Data* data) : dataptr(data) {}

    // compile error: "cannot convert ‘double (*)[2]’ to ‘double**’ in return"
    double** getarray() { return dataptr->array; } 

    // compile error: "‘getarray’ declared as function returning an array"
    //double* getarray()[2] { return dataptr->array; } 

    // this works, but what is auto resolved to?
    //auto getarray() { return dataptr->array; } 
};

int main() {

    Data d;
    d.array[0][0] = 1;
    d.array[0][1] = 2;
    d.array[1][0] = 3;
    d.array[1][1] = 4;

    Wrapper w(&d);
    auto arr = w.getarray();
    return 0;
}

我知道可以将方法返回类型设置为auto,并且可以按预期编译和运行。但是我不知道如何用显式的返回类型编写方法。

在我的真实示例中,我无法修改Data类,因此不能选择使用std :: vector。

2 个答案:

答案 0 :(得分:5)

错误消息告诉您类型!棘手的部分是语法:

double (*getarray())[2] { return dataptr->array; } 

换句话说,您几乎拥有它,但是您需要使用括号将其*绑定得更紧。

您可以避免最外尺寸的衰减:

double (&getarray())[2][2] { return dataptr->array; }

或者您可以将此类型放入别名以避免混乱。

或者您可以使用auto或切换到std::array使事情变得简单:P

#include <iostream>
#include <array>

class Data {
public:
    using ArrayType = std::array<std::array<double, 2>, 2>;
    ArrayType array;
};

class Wrapper {
private:
    Data* dataptr;
public:
    Wrapper(Data* data) : dataptr(data) {}

    Data::ArrayType& getarray() { return dataptr->array; } 
};

int main() {

    Data d;
    d.array[0][0] = 1;
    d.array[0][1] = 2;
    d.array[1][0] = 3;
    d.array[1][1] = 4;

    Wrapper w(&d);
    auto arr = w.getarray();
    return 0;
}

答案 1 :(得分:4)

更简单的是decltype(auto)(自C ++ 14起)

decltype(auto) getarray() { return dataptr->array; }

然后decltype(自C ++ 11起)(尽管成员应在方法声明之前):

auto getarray() -> decltype((dataptr->array)) { return dataptr->array; }

然后使用typedef方式:

using double2D = double[2][2];

double2D& getarray() { return dataptr->array; }

因为常规语法非常难看:

double (&getarray())[2][2] { return dataptr->array; }

使用std::array<std::array<double, 2>, 2>(自C ++ 11起)将具有更自然的语法。