2013-12-17 4 views
2

Это программа, которая имитирует простую игру для сбора ресурсов. Роботы собирают ресурсы с карты и перемещаются случайным образом, каждый из которых выполняет некоторые действия. Моя проблема заключается в том, что я хочу получить доступ к вектору из карты классов в классе разорванных роботов «RescueBot». Программа написана в нескольких файлах, header.h, header.cpp, main.cppКак объект векторного доступа к векторным элементам

У меня есть вектор объектов типа «Robots» и пример моего файла header.h:

class Map{ 
    private: 
    char World[20][20]; // The size of Map is 20 x 20 
    vector<Robots*>RobotsVector; 
    public: 
    Map(); 
    vector<Robots*>*getRobotsVector(); 

} 

    // I access the vector with getRobotsVector() which belongs to Map class but returns 
    // Robot objects. Done this so i can access Robot objects within the Map class. 

class Robots 
{ 
private: 
    //some variables 

public: 
    //some functions 
    virtual void movement()=0; // this is the function that handles the robots moves 
    virtual void action()=0; // this is the function that handles the robots actions 
} 

class RescueBot:public Robots{ 
    void movement(); 
    void action(); 
//some unique RescueBot stuff here 
} 

Это из файла header.cpp:

#include "header.h" 
vector<Robots*>*Map::getRobotsVector(){return &RobotsVector;} 

//example of object creation and pushing into vector 
void Map::creation(){ 
    for (int x=0;x<4;x++){ 
    getRobotsVector()->push_back(new RescueBot); 
    } 
} 

void RescueBot::action(){ 
    //do stuff 

for(int i=0;i<Map::getRobotsVector()->size();i++){ 

     //Here is the problem. I cant get inside the for loop 

     Map::getRobotsVector()->at(i)->setDamaged(false); //Changes a flag in other objects 

    } 
} 

Я пытался сделать класс derivered класса роботов Map. После этого, когда я запускаю его, я получаю доступ к ресурсу в RescueBot :: action, а фактический вектор имеет в нем объекты. Если я не сделаю это, то он не скомпилируется.

Как я могу получить доступ к вектору из RescueBot :: action() ??

+0

Он не может, если вы не передаете вектор конструктору объекта, или установить указатель на вектор на каждом объекте, который вы добавляете этот вектор. Как правило, ни одна из них не является особенно хорошей идеей. – dasblinkenlight

+1

Ваше мнение об этом не так. Если RescueBot необходимо изменить Map, тогда ему необходимо взять карту в качестве параметра либо в конструкторе, либо в команде действия (лично я бы предпочел команду действия). – IdeaHat

ответ

1

Проблема в том, что у вас нет Map экземпляров.

Путь вы вызываете его в настоящее время будет работать только если метод getRobotsVector были static, но вы не хотите, чтобы.

Причина это работает, когда вы делаете Robots класс производный класс Map потому, что Map::getRobotsVector() просто означать, что вы хотите, чтобы вызвать метод getRobotsVector на экземпляре, что функция RescueBot::action работает на.

Решение состоит в том, чтобы передать экземпляр Карты в ваши action функции по ссылке.

Это то, что ваша функция действия будет выглядеть тогда:

void RescueBot::action(Map& map) { 
    // Do whatever you want with the map here. 
    // For example: 
    map.getRobotsVector()->at(i)->setDamaged(false); 
} 
+0

Поскольку OP, вероятно, будет иметь только 1 активную карту за раз, почему бы ему не захотеть сделать 'getRobotsVector'' static'? Это похоже на совершенно правильное решение IMHO. –

+0

@ PawełStawarz Это похоже на синглтон, что ужасно для некоторых [довольно хороших причин] (http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) –

+0

I не имеет только 1 функции действия. У меня есть 3 через полиморфизм. Когда я изменяю свою команду rescuebot :: action, я получаю эту ошибку в компиляторе: << прототип для «void RescueBot :: action (Map &)» не соответствует ни одному классу «RescueBot» | >> – DnkStyle

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