Итак, вот моя проблема: я хочу вектор объектов определенного класса, который затем я могу передать другим классам для использования.
Я хочу, чтобы Вектор добавил экземпляр класса в конструктор этого класса. Поэтому я установил статический вектор внутри членов класса, и в конструкторе я хочу попробовать push_back (this), если это имеет смысл.
В настоящее время работают 2 класса, один — класс обработчика событий, который создает экземпляр класса «Obstacle» (класс, для которого я хочу вектор) каждый раз, когда происходит щелчок левой кнопкой мыши.
(Я опустил нерелевантные биты кода)
class MyEventReceiver: public IEventReceiver
{
private:
blah blahpublic:
blah blah
virtual bool OnEvent (const SEvent& event){
if(left click)
Obstacle obs(scn,randX,randY,randR);
}
}
Obstacle.h:
class Obstacle
{
private:
static std::vector<Obstacle> *obs;
public:
Obstacle(scene::ISceneManager*, float, float, float);
~Obstacle();
};
Препятствие cpp:
std::vector<Obstacle> *Obstacle::obs;
Obstacle::Obstacle(scene::ISceneManager* scn, float x, float y, float radius)
{
//get and set the passed in params blah blah
obs->push_back(this);}
Это не работает, но, надеюсь, вы увидите, чего я пытаюсь достичь. Позже я хочу функцию, которая будет возвращать ссылку на obs, чтобы другие классы могли вызывать эту функцию и получать доступ к вектору для манипулирования и чтения.
obs
как указатель, в этом нет необходимости.obs
объявлен как вектор объекты. this
указатель на объект, поэтому вам придется вызвать push_back
как obs->push_back(*this);
Вы действительно хотите изменить свой вектор, чтобы хранить его по указателю, а не по значению, так как вам не нужны отдельные копии там:
static std::vector<Obstacle*> *obs;
Не забудьте удалить свой экземпляр из этого вектора в своем деструкторе:
Obstacle::~Obstacle()
{
auto iter = std::find(obj->begin(), obj->end(), this);
if (iter != obj->end())
{
obj->erase(iter);
}
}
Вам также нужно написать конструктор копирования, который также добавляет его. Если вы этого не сделаете, вы не сможете отслеживать копии (если вы разрешите это):
Obstacle::Obstacle(const Obstacle& rhs)
// ... initialise from rhs
{
obs->push_back(this);
}
Ваш вектор объявлен неверным. Так должно быть
static std::vector<Obstacle*> obs;
то есть вектор указателей. То, что у вас было, было указателем на вектор.
Предполагая, что ваша цель состоит в том, чтобы поддерживать вектор указателей на все созданные объекты Obstacle, вы также должны будете объявить конструктор копирования (скопированные объекты Obstacle также потребуется добавить в ваш вектор) и деструктор (который должен удалять объекты из вектор). Это не будет эффективным, но это может быть хорошо для ваших нужд.