您的数组是值类型(octreenode
),不是指针类型 (octreenode*
)
因此,您不应该尝试将指针分配给动态分配的八叉树节点(new
默认情况下用于堆分配)。
相反,只需分配一个值:
(*chunk)[cz][cx][cy] = octreenode(1,72);
事实上,没有理由使用new
首先在多数组上:
UPDATE
在评论中,有人提出可以优化更多内容,并且您认为对有关编译错误的答案进行了有用的补充。
所以这里是:如果您确实想用完全相同的值初始化所有数组元素,
-
您可以通过暂时忘记数组形状来提高循环效率:
std::fill_n(chunk.data(), chunk.num_elements(), octreenode {1, 72});
如果你知道的话octreenode
是 POD 类型,你could write
std::uninitialzed_fill_n(chunk.data(), chunk.num_elements(), octreenode {1, 72});
但智能库的实现最终会调用fill_n
无论如何(因为没有收获)。您可以使用uninitialized_fill_n
if octreenode
is notPOD 类型,但它is很容易被破坏。
事实上,一开始也没有理由在 multi 数组上使用 new 。您可以只使用构造函数初始化列表来构造 multi_array 成员
Live On Coliru http://coliru.stacked-crooked.com/a/d102db6f3604dcbb
#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);
}