指针在动态分配的升压multi_array的一类,而不是编译(pointers to a class

2019-09-22 22:42发布

我是很新的C ++与提升。

我想通过这门课的“世界”的目的是有一个名为类型“octreenode”的“块”的数组。 以前我有一个普通的一维数组,这工作得很好。 现在,我想移动到使用3D阵列与Boost的multi_array的功能,我真的不知道我在做什么错。

简化的代码:

class world {
public:

  typedef boost::multi_array<octreenode, 3> planetchunkarray;  // a boost_multi for chunks
  typedef planetchunkarray::index index;
  planetchunkarray *chunk;

  world(double x,double y,double z,
        int widtheast, int widthnorth, int height) :
        originx(x), originy(y), originz(z),
        chunkseast(widtheast), chunksnorth(widthnorth), chunksup(height) {

    chunk = new planetchunkarray(boost::extents[chunksnorth][chunkseast][chunksup]);
    planetchunkarray::extent_gen extents;

    for (int cz = 0; cz < chunksnorth; ++cz) {
      for (int cx = 0; cx < chunkseast; ++cx) {
        for (int cy = 0; cy < chunksup; ++cy) {
          (*chunk)[cz][cx][cy] = new octreenode(1,72);
        }
      }
    }
  }
};

在这之后,如果我试图使分配

根 - >行星[0] - >块[0] [0] [0] - >材料= 4;

我得到的错误:

error: base operand of '->' has non-pointer type 'boost::detail::multi_array::sub_array<octreenode, 1u>'|

“octreenode”有相关的构造函数,这条线在相同的语法工作时,这只是:

根 - >行星[0] - >块[0] - >材料= 4;

(具有一维阵列)。 类似地,尽管它编译精细与一维阵列,试图将组块传递给期望的指针“octreenode”对象的功能,如:

compactoctree(根 - >行星[P] - >块[CZ] [CX] [CY],0,14);

生成错误

error: cannot convert 'boost::detail::multi_array::sub_array<octreenode, 1u>' to 'octreenode*' for argument '1' to 'short int compactoctree(octreenode*, int, int)'|

会很感激的任何建议,我敢肯定,我失去了一些东西明显。

Answer 1:

您的阵列是值类型( octreenode ),而不是指针类型( octreenode*

因此,你不应该尝试将指针赋给一个动态分配的octreenode( new是堆分配,默认情况下)。

相反,只是分配一个值:

      (*chunk)[cz][cx][cy] = octreenode(1,72);

事实上,没有理由使用new第一任一位置的多阵列上:

UPDATE

在意见已经提出了更多的东西可以被优化,你认为有用的补充,有关编译错误的答案。

所以这里有云:如果你确实想初始化值完全相同所有数组元素,

  1. 您可以进行循环利用忘掉阵列形状一会儿方式更有效:

     std::fill_n(chunk.data(), chunk.num_elements(), octreenode {1, 72}); 

    如果你知道octreenode是一个POD类型,你可以

     std::uninitialzed_fill_n(chunk.data(), chunk.num_elements(), octreenode {1, 72}); 

    但智能库实现最终会调用fill_n反正(因为没有增益)。 您可以使用uninitialized_fill_n如果octreenode 不是一个POD类型,但它平凡的破坏。

  2. 事实上,没有理由摆在首位的多阵列上使用新的要么。 你可以只使用构造函数初始化列表构造multi_array的成员


住在Coliru

#include <boost/multi_array.hpp>
#include <type_traits>

struct octreenode { int a; int b; };

class world {
public:
    world(double x, double y, double z, int widtheast, int widthnorth, int height)
            : 
                originx(x), originy(y), originz(z), 
                chunkseast(widtheast), chunksnorth(widthnorth), chunksup(height),
                chunk(boost::extents[chunksnorth][chunkseast][chunksup])
    {
        octreenode v = { 1, 72 };
        std::fill_n(chunk.data(), chunk.num_elements(), v);
    }

private:
    double originx, originy, originz;
    int chunkseast, chunksnorth, chunksup;

    typedef boost::multi_array<octreenode, 3> planetchunkarray; // a boost_multi for chunks
    typedef planetchunkarray::index index;
    planetchunkarray chunk;
};

int main() {
    world w(1,2,3,4,5,6);
}


文章来源: pointers to a class in dynamically allocated boost multi_array, not compiling