繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM