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

Dav*_*ley 5 c++ c++14

我需要编写一个包装类,为数据类的字段提供"get"方法.但是,我不知道编写"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;
}
Run Code Online (Sandbox Code Playgroud)

我知道有可能将方法返回类型设置为auto,并按预期编译和运行.但我不知道如何使用显式返回类型编写方法.

在我的真实世界示例中,我无法修改Data类,因此切换到使用std :: vector不是一个选项.

Lig*_*ica 5

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

double (*getarray())[2] { return dataptr->array; } 
Run Code Online (Sandbox Code Playgroud)

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

您可以避免最外层维度的衰减:

double (&getarray())[2][2] { return dataptr->array; }
Run Code Online (Sandbox Code Playgroud)

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

或者您可以使用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;
}
Run Code Online (Sandbox Code Playgroud)