C ++ передает 2d массив по ссылке на другой класс - PullRequest
0 голосов
/ 09 марта 2011

Идея состоит в том, что MapGrid создает ands содержит 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
            }
    }

Я получаю эту ошибку: переменная «MapGenerator myMap» имеет инициализатор, но неполный тип map.h Могу ли я получить еще несколько человеческих намеков, что не так

Ответы [ 5 ]

1 голос
/ 09 марта 2011

Поменяйте местами порядок, в котором определены классы MapGenerator и MapGrid.Вы пытаетесь использовать класс MapGenerator внутри конструктора MapGrid, но этот класс определен только ниже.

ОБНОВЛЕНИЕ : Хорошо, теперь, когда вы переписали свой вопрос,Вот еще одно предположение (ваш код на самом деле не компилируется, поэтому я могу только догадываться): возможно ли, что MapGenerator и MapGrid находятся в разных заголовочных файлах, а в заголовочном файле MapGrid у вас есть только предварительное объявлениеMapGenerator вместо фактического определения (которое вы получите, включив заголовок MapGenerator)?

0 голосов
/ 09 марта 2011

Я думаю, MapGenerator не обязательно должен быть классом.
Вероятно, cmdGenerateHeightMap может быть автономной функцией вместо функции-члена.
В качестве альтернативы, чтобы упростить доступ к двумразмерный массив, я бы предложил создать выделенный класс, например TwoDimArray.
Как насчет вызова cmdGenerateHeightMap из конструктора MapGrid, как показано ниже:

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 );
  }
};

Надеюсь, этопомогает

0 голосов
/ 09 марта 2011

Следующий код похож на ваш сразу после комментирования подверженной ошибкам строки. Можете ли вы сказать мне, в чем была его полезность?

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
        }


};
0 голосов
/ 09 марта 2011

Чтобы создать экземпляр объекта для класса, вам нужна полная информация о классе. Но в классе MapGrid попытка создания экземпляра объекта для MapGenerator недопустима в текущей форме упорядочения фрагмента кода. Вместо этого попробуйте это -

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

class MapGrid
{
    // ....
};
0 голосов
/ 09 марта 2011

Я не думаю, что вы хотите передать worldMap в метод конструктора MapGrid, когда он еще не был инициализирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...