C ++ Вектор классов, нельзя вызвать push_back внутри конструктора указанного класса

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

Я хочу, чтобы Вектор добавил экземпляр класса в конструктор этого класса. Поэтому я установил статический вектор внутри членов класса, и в конструкторе я хочу попробовать 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, чтобы другие классы могли вызывать эту функцию и получать доступ к вектору для манипулирования и чтения.

1

Решение

  1. Не иметь obs как указатель, в этом нет необходимости.
  2. obs объявлен как вектор объекты. this указатель на объект, поэтому вам придется вызвать push_back как obs->push_back(*this);
2

Другие решения

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

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

Ваш вектор объявлен неверным. Так должно быть

static std::vector<Obstacle*> obs;

то есть вектор указателей. То, что у вас было, было указателем на вектор.

Предполагая, что ваша цель состоит в том, чтобы поддерживать вектор указателей на все созданные объекты Obstacle, вы также должны будете объявить конструктор копирования (скопированные объекты Obstacle также потребуется добавить в ваш вектор) и деструктор (который должен удалять объекты из вектор). Это не будет эффективным, но это может быть хорошо для ваших нужд.

1
По вопросам рекламы [email protected]