在类成员未填充的情况下提升多阵列

时间:2017-02-12 00:44:15

标签: c++ arrays multidimensional-array boost

我正在尝试使用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;
}

我在这里做错了什么?

1 个答案:

答案 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); 
}