2013-11-16 6 views
1

Я пытаюсь инициализировать массив объектов класса в файлах .h и .cpp. Сначала я объявил его (game_map [12]) в файле .h, как показано ниже:Инициализация массива объектов класса C++

#include <string> 

    using namespace std; 

    class Game { 

    public: 
     Game(); 
     ~Game(); 
     void test(); 
     void InitializeMap(Game &game); 

    private: 
     class Room { 
     public: 
      Room (string desc); 
      Room(); 
      ~Room(); 
      void PrintDesc(Room &current); 
      void SetDirection(int array_index, Room &current); 

      string description; 
      static int adjacent[3];rooms. 
      static string direction[4]; 
     }; 

static Room game_map[12]; //Here is my array declaration 
}; 
. 
. 
. 
. 

Однако, когда я пытаюсь инициализировать game_map в файле реализации ...

#include "Game.h" 

using namespace std; 

/*Public members*/ 
Game::Game(){} 
Game::~Game(){} 
/*Private members*/ 

Room Game::game_map[12] = {Room("scary")}; //trying to initialize here 
. 
. 
. 
/*Room*/ 

int Game::Room::adjacent[] = {-1,-1,-1}; 
string Game::Room::direction[] = {"-1","-1","-1","-1"}; 

Game::Room::Room() {} 

Game::Room::Room(string descript) { 
    description = descript; 
} 


Game::Room::~Room() {} 

. 
. 
. 

Я получаю ошибка в том, что Room не определена, несмотря на то, что конструктор Room с правой стороны, по-видимому, распознается. Я попытался поставить объявление после конструктора комнаты, но это не устранило проблему. Может ли кто-нибудь сказать мне, что здесь происходит?

Спасибо!

+1

'Игра :: Room', не' Room' – David

+0

@ Dave удивительным, большое спасибо! – Adam

ответ

3

Как это

Game::Room Game::game_map[12] = {Room("scary")}; //trying to initialize here 

^^^^^^ add Game:: here 

мне не нравится внешний вид всех статических членов однако. Ясный знак, что ваш дизайн неправильный.

+0

Как вы думаете, что было бы лучшим способом добиться того, что я пытаюсь сделать? Единственный другой способ, о котором я могу думать, - это вытащить все это и сделать его глобальной переменной. Будет ли это лучше? Боюсь, у меня еще нет опыта. – Adam

+1

@Adam Я не вижу, что не так, просто сбросив статику. – john

+0

О, я не знал, что ты сможешь это сделать. Благодаря! – Adam

1

Я согласен с другим комментарием john abut, используя статический, но я получил следующее, чтобы работать, и я думаю, это то, что вам нужно. Я позволю вам разобраться в деталях того, что должно быть частным.

Ниже, как настроить классы:

game.h:

#include "room.h" 
class Game 
{ 
public: 
    Game(); 
    ~Game(); 
    void test(); 
    void InitializeMap(Game &game); 
    static Room game_map[12]; 
}; 

game.cpp:

#include "game.h" 
Game::Game() {} 
Game::~Game() {} 
Room Game::game_map[12] = {Room("scary")}; //initialize here 

room.h:

#include <string> 
class Room 
{ 
public: 
    Room (std::string desc); 
    Room(); 
    ~Room(); 
    void PrintDesc(Room &current); 
    void SetDirection(int array_index, Room &current); 

    std::string description; 
    static int adjacent[3]; // rooms. 
    static std::string direction[4]; 
}; 

room.cpp:

#include "room.h" 
Room::Room() {} 
Room::~Room() {} 
Room::Room(std::string descript) { 
    description = descript; 
} 
int Room::adjacent[] = {-1,-1,-1}; 
std::string Room::direction[] = {"-1","-1","-1","-1"}; 

И тогда вы можете проверить его в main.cpp:

#include <iostream> 
#include "game.h" 
#include "room.h" 

int main() 
{ 
    Game aGame; 
    Room *rooms = new Room[12]; 
    rooms = aGame.game_map; 

    std::cout << rooms[0].description << std::endl; 

    delete [] rooms; 

    return 0; 
} 

С выходом:

scary 
Смежные вопросы