所以这是我的简化代码。
class Game
{
public:
void helper(char c);
vector<vector<vector<char>>> board(5, vector<vector<char>>(10, vector<char>(40)));
Game();
};
void Game::helper(char c)
{
int tempY = 0;
int tempX = 0;
int temp1 = 0;
if (board[temp1][tempY][tempX] != 'c')
{
board[temp1][tempY][tempX] = c;
}
}
int main()
{
Game game;
game.helper('C');
cout<<game.board[0][0][0]<<endl;
}
然后我在这一行得到了2个错误:
if (board[temp1][tempY][tempX] != 'c')
1。错误C3867:&#39; Game :: board&#39 ;:非标准语法;使用&#39;&amp;&#39;创建指向成员的指针
答案 0 :(得分:2)
您需要打开编译器上的警告。
vector<vector<vector<char>>> board(5, vector<vector<char>>(10, vector<char>(40)));
正被转换为名为board
的函数,该函数返回vector<vector<vector<char>>>
并接收无效参数。您需要使用像
vector<vector<vector<char>>> board = vector<vector<vector<char>>>(5, vector<vector<char>>(10, vector<char>(40)));
或者创建一个构造函数来初始化它。
所有这一切都说你不应该真正嵌套向量。您可以打破容器的缓存友好性,因为并非所有嵌套向量都需要在内存中彼此相邻。通常你要做的是使用1d向量并使用数学伪造尺寸。
答案 1 :(得分:0)
正如其他人所说,这变得一团糟。最好只使用一个连续的内存阵列,提供多维访问器,如:
template <typename T>
class vector3d {
public:
vector3d(size_t d1=0, size_t d2=0, size_t d3=0, T const & t=T()) :
d1(d1), d2(d2), d3(d3), data(d1*d2*d3, t)
{}
T & operator()(size_t i, size_t j, size_t k) {
return data[i*d2*d3 + j*d3 + k];
}
T const & operator()(size_t i, size_t j, size_t k) const {
return data[i*d2*d3 + j*d3 + k];
}
private:
size_t d1,d2,d3;
std::vector<T> data;
};
答案 2 :(得分:0)
只是跳到这里,如果你可以使用Boost库,它们有一个multi_array
容器,允许你在运行时指定多维数组,所以你得到了很好的{ {1}}界面,没有嵌套的board[0][1][2]
,它可能(没有经过测试)比嵌套向量快得多。
例如,你会像这样宣布董事会:
vector
然后您可以像这样访问它:
boost::multi_array<char, 3> board(boost::extents[5][10][40]);
但是,对你的目的而言,这可能有点过分。只是想让你知道那里有什么。