c++ - boost 多阵列作为类成员未填充

标签 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 是使用初始化列表:

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 中给出的答案相同

但是,我想添加以下内容,我认为它在这种情况下是相关的:

在类的构造函数中执行某种操作后,您可能需要生成数组。在默认构造函数创建数组后,您可以使用“调整大小”来实现此目的。

即,而不是

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

关于c++ - boost 多阵列作为类成员未填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182992/

相关文章:

c++ - 无法在QT选项卡小部件中向选项卡(栏)和选项卡( Pane )添加样式

c++ - 连接 char 变量

c++ - 整数数组切片

php - 从数据库中检索数据

Javascript对象数组重组

c++ - 在 C++ 中用两个 char 变量评估 bool 值

c++ - 构造函数调用层次

javascript - 比较 D3.js 中的两个时间对象

c++ - 相邻打印 2 个数组

java - 多维数组 : Java