将类级别2D数组变量设置为传入值 - C ++

时间:2014-02-10 15:06:46

标签: c++ arrays pointers 2d

我正在尝试制作一个迷宫解决方案,虽然算法是合理的(至少在我脑海中),但我一直在遇到有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]);
}

2 个答案:

答案 0 :(得分:2)

你不能将2d数组(array[ROWS][COLUMNS])分配(或转换)为指针指针(又名**),因为2d数组的内存布局(可能)与内存布局非常不同指针的指针可以指向。

检查this thread以获取有关此主题的更多信息。

如果建议您使用事实上的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;

答案 1 :(得分:1)

<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 ++中的情况不同。