C++ C++;通过引用将2d数组传递给其他类

C++ C++;通过引用将2d数组传递给其他类,c++,arrays,class,reference,C++,Arrays,Class,Reference,这个想法是MapGrid创建一个包含地图元素的2d数组,我想把这个数组交给另一个MapGenerator类,这样它就可以通过编辑其中的方形元素来生成一个真实的地图 class MapGenerator { private: int MAP_HEIGHT; int MAP_WIDTH; Square * worldMap; void cmdGenerateHeightMap() {

这个想法是MapGrid创建一个包含地图元素的2d数组,我想把这个数组交给另一个MapGenerator类,这样它就可以通过编辑其中的方形元素来生成一个真实的地图

class MapGenerator {
        private:
            int MAP_HEIGHT;
            int MAP_WIDTH;
            Square * worldMap;
            void cmdGenerateHeightMap() {
             worldMap[i][j]->decraseHeight();
              ......
            }
        public:
        MapGenerator(Square &myMap, int maxHeight, maxWidth) {
                MAP_WIDTH = maxWidth
                MAP_HEIGHT = maxHeight;
                worldMap = &myMap;
                cmdGenerateHeightMap();
        }
    }    
class MapGrid {
        private:
            static const int MAP_HEIGHT = 100;
            static const int MAP_WIDTH = 100;
            Square worldMap[MAP_HEIGHT][MAP_WIDTH];
        public:
            MapGrid() {
              for (int i=0; i<MAP_HEIGHT;i++) {
                for (int j=0;j<MAP_WIDTH; j++) {
                    worldMap[i][j] = Square();
                }
              }
              MapGenerator myMap(worldMap); 
            }
            void PrintMyMap() {
            //print what the map MapGenerator made
            }
    }
类映射生成器{
私人:
int MAP_高度;
int MAP_宽度;
广场*世界地图;
void cmdGenerateHeightMap(){
worldMap[i][j]->降低高度();
......
}
公众:
MapGenerator(正方形和myMap,int maxHeight,maxWidth){
地图宽度=最大宽度
地图高度=最大高度;
worldMap=&myMap;
cmdGenerateHeightMap();
}
}    
类映射网格{
私人:
静态常数int MAP_高度=100;
静态常数int MAP_WIDTH=100;
方形世界地图[地图高度][地图宽度];
公众:
MapGrid(){

对于(int i=0;i我认为您不希望在MapGrid构造函数方法中传递
worldMap
,因为它尚未初始化为任何内容。

交换定义
MapGenerator
MapGrid
类的顺序。您试图在
MapGrid中使用
MapGenerator
构造函数,但该类仅在下面进一步定义


更新:好的,既然你已经重写了你的问题,这里有另一个猜测(你的代码实际上没有编译,所以我只能猜测):是否可能
MapGenerator
MapGrid
在不同的头文件中,并且在
MapGrid
的头文件中,您只有一个
MapGenerator
的前向声明,而不是实际的定义(您可以通过包含
MapGenerator
的头来获得该定义)?

为了实例化类的对象,您需要该类的完整信息。但是在类
MapGrid
中,尝试实例化
MapGenerator
的对象在当前的代码段排序形式中无效。请改为尝试以下操作-

class MapGenerator
{
    // .....
};

class MapGrid
{
    // ....
};

下面的代码与您在评论容易出错的行之后的代码类似。您能告诉我它的实用程序是什么吗

class MapGenerator {
    private:
        Square * worldMap;
        void cmdGenerateHeightMap() {
        //do something to the orginal copy of worldMap
        }
    public:
    MapGenerator(Square &myMap) {
            worldMap = &myMap;
            cmdGenerateHeightMap();
    }
};

class MapGrid {
    private:
        static const int MAP_HEIGHT = 100;
        static const int MAP_WIDTH = 100;
        Square worldMap[MAP_HEIGHT][MAP_WIDTH];
    public:
        MapGrid() {
          for (int i=0; i<MAP_HEIGHT;i++) {
            for (int j=0;j<MAP_WIDTH; j++) {
                worldMap[i][j] = Square();
            }
          }
          //commented following line
          //MapGenerator myMap(worldMap);
        }
        void PrintMyMap() {
        //print what the map MapGenerator made
        }


};
类映射生成器{
私人:
广场*世界地图;
void cmdGenerateHeightMap(){
//对世界地图的原始副本做些什么
}
公众:
地图生成器(方形和myMap){
worldMap=&myMap;
cmdGenerateHeightMap();
}
};
类映射网格{
私人:
静态常数int MAP_高度=100;
静态常数int MAP_WIDTH=100;
方形世界地图[地图高度][地图宽度];
公众:
MapGrid(){

对于(int i=0;i我认为
MapGenerator
不需要是一个类。
可能
cmdGenerateHeightMap
可以是一个独立的函数,而不是 成员函数。
或者,为了简化对二维阵列的访问, 我建议创建一个专用类,例如
TwoDimArray

MapGrid
的构造函数调用
cmdGenerateHeightMap
怎么样 以下内容?:

struct TwoDimArray {
  int  MAP_WIDTH;
  Square  *worldMap;
  TwoDimArray( Square* m, int w ) : worldMap( m ), MAP_WIDTH( w ) {}
  Square* operator[]( int i ) const { return worldMap + MAP_WIDTH * i; }
};

void cmdGenerateHeightMap( Square *myMap, int maxHeight, int maxWidth )
{
  TwoDimArray  worldMap( myMap, maxWidth );
  ...
  worldMap[i][j].decraseHeight();
  ...
}

class MapGrid {
  ...
  MapGrid() {
    ...
    cmdGenerateHeightMap( worldMap[0], MAP_HEIGHT, MAP_WIDTH );
  }
};

希望这有帮助

MapGenerator myMap(worldMap);“MapGrid方法中的问题是什么。好的想法是我MapGid制作默认地图。没有河流的平坦无任何东西(正方形保存该信息).MapGenerator接受默认地图并添加mountines rivers和其他类似的内容。然后它将地图返回给MapGrid以在游戏中使用。这样做了吗,真正的问题是我错误地传递了数组,我想是的,两个类都在不同的文件中。main.cpp包含header.h和in header.h,这两个类和#in都有向前声明包含到每个类头文件中。MapGeneration前向声明和#include位于MapGrid之前