Объект-член не найден: нет члена с именем get_event (), также имеющего дело с полиморфизмом и векторами - PullRequest
0 голосов
/ 26 февраля 2020

У меня проблемы с моим кодом:

    void room_encounter_randomizer(vector<vector<room> > *grid, int row, int col){//allocates events to the rooms.
    wumpus w1;
    int row_rand = rand() % row;
    int col_rand = rand() % col;
    for(int i =0 ; i < 4; i++){
        for(int j = 0; j < row; j++){
            for(int k = 0; k < col; k++){
                grid[i][j].get_event() = &w1;
            }   
        }
    }
}

Предполагается, что события будут произвольно назначаться для каждой комнаты. Вот мои уроки:

        class event{//abstract class
    public:
        virtual void percept() = 0;
        virtual void encounter() = 0;
    };

    class room{
    private:
        event* ev;
    public:
        event* get_event();

    };
event *room::get_event(){
    return ev;
}

class wumpus:public event{
    public:
        void percept();
        void encounter();

};

void wumpus::percept(){
    //if player is within a tile
    cout << "You smell a terrible stench..." << endl;
}
void wumpus::encounter(){
    cout << "The Wumpus eats you" << endl;
    exit(0);
}
void create_grid(){

}

Но я получаю эту ошибку:

vectortest.cpp: In function ‘void room_encounter_randomizer(std::vector<std::vector<room> >*, int, int)’:
vectortest.cpp:78:16: error: ‘__gnu_cxx::__alloc_traits<std::allocator<std::vector<room> > >::value_type’ has no member named ‘get_event’
     grid[i][j].get_event() = &w1;

Я не совсем уверен, что об этом думать. Поскольку у меня есть весь код в одном файле, разве эта функция не должна быть распознана, так как она опубликована c?

Кроме того, я не совсем уверен, как обращаться с абстрактным классом, я подумал, что попытайтесь установить указатель события объекта комнаты, равный ссылке wumpus.

1 Ответ

0 голосов
/ 26 февраля 2020

Используйте

void room_encounter_randomizer(vector<vector<room> > &grid, int row, int col)

и передайте grid как ссылку, а не как указатель.

TL; версия DR

vector<vector<room> > *grid - указатель на vector из vector с. Поскольку указатели могут быть проиндексированы как массивы (p[i] определяется стандартом C ++ как идентичный *(p+i))

grid[i] // is a vector<vector<int>>
grid[i][j] // is a vector<int>
grid[i][j][k] // is an int

Объект в grid, скорее всего, один vector из vectors , это будет фатальным во время выполнения.

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