我正在尝试使用boost来创建一个多维数组,我希望所说的数组成为某个类的成员。
但是我发现它有两个问题: 1 - 我需要用
声明数组的大小boost::extents[2][2]
每次我想使用数组。否则我收到以下错误:
a.out: /usr/include/boost/multi_array/base.hpp:136: Referenceboost::detail::multi_array::value_accessor_n<T, NumDims>::access(boost::type<Reference>, boost::detail::multi_array::value_accessor_n<T, NumDims>::index, TPtr, const size_type*, const index*, const index*) const [with Reference = boost::detail::multi_array::sub_array<double, 1ul>; TPtr = double*; T = double; long unsigned int NumDims = 2ul; boost::detail::multi_array::value_accessor_n<T, NumDims>::index = long int; boost::detail::multi_array::multi_array_base::size_type = long unsigned int]: Assertion `size_type(idx - index_bases[0]) < extents[0]' failed.
2 - 好吧,也许这只是多维数组如何在C ++中使用Boost工作的一部分,我将编写我的代码,接受每个函数“声明”数组。但是,如果我这样做,我发现数组是空的。
这是一段重现此问题的代码片段。在类的“构造”期间,应该填充数组。但是,行
cout << "Result: " << testing.getArrayMember(0,1) << endl;
输出“结果:0”。
#include <iostream>
#include "boost/multi_array.hpp"
typedef boost::multi_array<double, 2> dbl_array;
using namespace std;
class TestClass {
public:
dbl_array darray;
TestClass(double x);
void fillArray(double x);
double getArrayMember(int i, int j);
};
TestClass::TestClass(double x) {
dbl_array darray(boost::extents[2][2]);
cout << "Class constructor called" << endl;
fillArray(x);
}
void TestClass::fillArray(double x) {
cout << "Filling array" << endl;
dbl_array darray(boost::extents[2][2]); // Without this line, the code fails at runtime
darray[0][0] = x;
darray[1][0] = 2.0*x;
darray[0][1] = 3.0*x;
darray[1][1] = 4.0*x;
cout << "Array filled" << endl;
}
double TestClass::getArrayMember(int i, int j) {
dbl_array darray(boost::extents[2][2]); // Without this line, the code fails at runtime
return darray[i][j];
}
int main() {
TestClass testing = TestClass(5.0);
// The result is 0 in the end
cout << "Result: " << testing.getArrayMember(0,1) << endl;
return 0;
}
我在这里做错了什么?
答案 0 :(得分:1)
选项1是使用初始化列表:
TestClass::TestClass(double x) : darray(boost::extents[2][2]) {
cout << "Class constructor called" << endl;
fillArray(x);
}
否则,类darray的成员是使用默认构造函数创建的,而不是通过行
创建的dbl_array darray(boost::extents[2][2]);
你相信。
这与initialize boost::multi_array in a class
中给出的答案相同但是,我想添加以下位,我认为这在这种情况下是相关的:
在类的构造函数中执行某种操作后,可能需要生成数组。在默认构造函数创建数组后,您可以使用“resize”来实现此目的。
是的,而不是TestClass::TestClass(double x) {
dbl_array darray(boost::extents[2][2]);
cout << "Class constructor called" << endl;
fillArray(x);
}
你可以
TestClass::TestClass(double x) {
darray.resize(boost::extents[2][2]);
cout << "Class constructor called" << endl;
fillArray(x);
}