我需要编写一个包装类,为数据类的字段提供“获取”方法。但是,我不知道编写“ 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。
答案 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起)将具有更自然的语法。