[英]Setting class level 2D Array variable to passed in value - C++
我正在尝试制作一个迷宫解决方案,虽然算法是合理的(至少在我脑海中),但我一直在遇到一个带有2D阵列的障碍。 我来自C#和Java,所以语法让我感到悲伤。
这是一个SSCCE:
//Main.cpp
#include "MazeSolver.h"
int main()
{
MazeSolver mazeSolver;
char maze[51][51] = { }; // Not bothering to show code for populating the array
mazeSolver.setMaze(maze);
}
//MazeSolver.cpp
#include "MazeSolver.h"
MazeSolver::MazeSolver() { }
void MazeSolver::setMaze(char maze[51][51])
{
this->maze = maze;
}
//MazeSolver.h
#ifndef _MAZESOLVER_H
#define _MAZESOLVER_H
class MazeSolver
{
private:
char **maze; // This is likely the problem, I'm at wits end in regards to
// what notation is needed here. I do not want to hard-copy
// the entire array, I just need to access it (via pointer)
// I've also tried just using char maze[51][51] here, char *maze, etc...
public:
MazeSolver();
void setMaze(char maze[51][51]);
}
你不能分配(或转换)2d数组( array[ROWS][COLUMNS]
)到指针(又名**
)的指针,因为2d数组的内存布局(可能)与指针指针的内存布局非常不同可以指出。
检查这个线程有关此主题的更多信息。
如果建议你使用事实上的C ++标准容器, std::vector
,而不是普通数组:
class MazeSolver
{
std::vector<std::vector<char>> maze;
void setMaze( const std::vector<std::vector<char>>& new_maze )
{
maze = new_maze;
}
};
请注意,默认情况下,向量的大小为0(在初始化时),因此您应该使用元素填充它:
for( std::size_t i = 0 i < ROWS ; ++i )
{
maze.push_back( std::vector<char>() );
for( std::size_t j = 0 ; j < COLUMNS ; ++j )
maze[i].push_back( ' ' );
}
但是,C ++ 11(该语言的当前迭代)有一个std::array
容器,它类似于C数组,但具有其他标准库容器的接口:
std::array<char,ROWS*COLUMNS> maze;
<rant>
这是C ++奇怪的怪癖之一。
C ++ 2D数组不是锯齿状数组。 当你声明char maze [51] [51]时,它实际上分配了1个连续数组51 * 51个成员。 sizeof(maze) == 51*51
。 当你取消引用一个值, maze[a][b]
,它实际上做的是*(maze+51*a+b)
。 所有这一切都在引擎盖下。
Jagged Array是一个数组数组,一个char **。 在这种情况下,你有一个51指针大小==(51 * sizeof(void *))的数组。 在每个位置,指针指向一个完全不同的内存位置,分配给51个成员长。
这是恼人的,因为你不能只是转换这两个,即使是通过铸造。 您必须处理奇怪的语法,例如char (*maze)[51]
以获取指向2D数组的指针。
更令人讨厌的是以下情况:
int foo(int maze[51][51])
{
return sizeof(maze);
}
int maze[51][51];
int main(int argc, char** argv)
{
std::cout << sizeof(maze) << std::endl;//return 51*51*sizeof(int);
std::cout << foo(maze) << std::endl;//return 8, sizeof(void*);
}
所以它隐含地通过引用传递,而不是通过值传递,这与C ++的其余部分相反。
</rant>
TL;博士;
指向2D数组的指针的正确语法是char (*maze)[51];
。 您的语法适用于锯齿状数组(数组数组),这在C ++中并不相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.