【发布时间】:2014-08-04 02:54:39
【问题描述】:
这是我第一次使用 Boost,我正在尝试创建一个 Blocks 类的多数组,该数组存储在 Chunk 类中。所以每个块由 (BLOCKS_PER_CHUNK x BLOCKS_PER_CHUNK x BLOCKS_PER_CHUNK) 个块组成,基本上与 Minecraft 相同。目前我正在尝试使用两个不同的构造函数来初始化这个数组,一个使用 stl 向量作为输入,另一个使用“C 样式向量”。
块只有一个布尔值来检查它是否处于活动状态(默认值为 false)、一个块类型(基本上是一个枚举)以及一个用于变量的 getter 和 setter。
Chunk 的头部如下:
#pragma once
#include "Block.h"
#include <vector>
#include "Block.h"
#include "boost/multi_array.hpp" // Multi dimensional array
#define BLOCKS_PER_CHUNK 16
class Chunk
{
public:
Chunk();
Chunk(std::vector<Block>& blocks);
Chunk(Block* blocks); // Assumes you have a vector of the correct size
virtual ~Chunk();
void Update(float timeSinceLastUpdate);
private:
//BlockVec3D blocks;
//BlockArray blocks;
typedef boost::multi_array<Block, BLOCKS_PER_CHUNK> blockArray;
typedef blockArray::index blockArrayIndex;
blockArray m_blocks;
};
问题函数如下:
Chunk::Chunk(std::vector<Block>& blocks):
m_blocks(boost::extents[BLOCKS_PER_CHUNK][BLOCKS_PER_CHUNK][BLOCKS_PER_CHUNK])
{
assert(blocks.size() == BLOCKS_PER_CHUNK * BLOCKS_PER_CHUNK * BLOCKS_PER_CHUNK && "Number of blocks and size of the chunk do not match");
for(unsigned i = 0; i < BLOCKS_PER_CHUNK; ++i)
{
for(unsigned j = 0; j < BLOCKS_PER_CHUNK; ++j)
{
for( unsigned k = 0; k < BLOCKS_PER_CHUNK; ++k)
{
m_blocks[i][j][k] = blocks[i + BLOCKS_PER_CHUNK * (j + BLOCKS_PER_CHUNK * k) ];
}
}
}
}
Chunk::Chunk(Block* blocks)
{
for(unsigned i = 0; i < BLOCKS_PER_CHUNK; ++i)
{
for(unsigned j = 0; j < BLOCKS_PER_CHUNK; ++j)
{
for( unsigned k = 0; k < BLOCKS_PER_CHUNK; ++k)
{
m_blocks[i][j][k] = blocks[i + BLOCKS_PER_CHUNK * (j + BLOCKS_PER_CHUNK * k) ];
}
}
}
}
在尝试编译此代码时,我收到错误,例如 shape、num_dimensions、begin 和 end 不是 Block 的成员。似乎 boost 有自己的静态断言风格,它会检查必填字段,当找不到这些字段时,它会产生编译错误。显然,boost 试图将输入值视为一维子数组,当它无法找到其完整性检查所需的字段时(例如两个“子数组”具有相同的维数),它会触发错误。
容器的手册似乎没有解决这个特定问题,我不相信我无意中创建了一个多数组视图。此外,将左侧的索引转换为
boost::multi_array<Block, BLOCKS_PER_CHUNK>::index 似乎没有任何区别。正如我所提到的,我对提升还是很陌生。这样做的正确方法是什么?
【问题讨论】:
标签: c++ class boost multidimensional-array insert