0

Исходно все просто, создаем вектор, создаем объект класса и добавляем его в конец вектора:

vector <Class*> arr;
Class Object1(); 
arr.push_back(&Object1);

но, если объектов класса и классов множесто, то такая реализация неудобна. Как реализовать "автоматическое" добавление каждого нового объекта класса в свой вектор?

  • т.е. обьект добавляется в вектор независимо от нашего желания? Кстати у вас не обьект добавляется, а указатель на обьект... – AR Hovsepyan Jun 08 '19 at 05:00
  • Производить добавление в конструкторе объекта – Andrej Levkovitch Jun 08 '19 at 06:48
  • Сделать шаблонную функцию, которая принимает vector<T*>&, внутри создаёт экземпляр T, записывает его в vector и возвращает. – Дмитрий Зиненко Jun 08 '19 at 07:44
  • @AR Hovsepyan да, добавляется указатель, в коде активно применяется наследование и вектор виртуального класса, а элементы вектора - указатели на на объекты дочерних классов. – DmitryS Jun 08 '19 at 08:47
  • @Andrej Levkovitch я думал о такой реализации, но не придумал, как это сделать. Подскажите, пожалуйста) – DmitryS Jun 08 '19 at 08:49
  • @Дмитрий Зиненко а что эту функцию вызывать будет? Если вручную в main, то разницы c записью arr.push_back() нет. – DmitryS Jun 08 '19 at 09:00

1 Answers1

-1

Каждый создаваемый объект пользовательского класса будет выполнять конструктор своего класса, стало быть самое очевидное решение - это добавить в конструктор класса код, добавляющий указатель на создаваемый экземпляр в необходимый вам вектор. Где разместить этот вектор: глобально или как статический член класса уже нюанс реализации. Пример:

struct Class {
    Class() { all.push_back(this); }
    static std::vector<Class*> all;
};

Наверное, вам так же захочется убирать элементы из контейнера после их уничтожения. Для этого нужно в деструкторе добавить удаление текущего экземпляра, и чтобы здесь не делать линейный поиск, можно рассмотреть замену вектора на какой-нибудь std::unordered_map. Всё зависит от того, насколько много объектов будет, и как часто они будут создаваться/уничтожаться и нужно ли вообще этого отслеживать.

Если предполагалось, что есть какой-то "сигнал", говорящий, что объект создан и позволяющий к нему привязаться, то ничего подобного в чистом C++ нет, нужно создавать эти механизмы ручками. В каком-нибудь фреймворке типа Qt, скорее всего, такую задачу можно было бы решить средствами Meta-Object Compiler (MOC) из внешнего к создаваемым объектам коду. Похожий подход через callback-функции можно, конечно, реализовать и самостоятельно, было бы желание. Но так или иначе, какой-то код для этого должен присутствовать в конструкторе класса (или внешней функции, монопольно создающей объекты этого класса), объекты которого требуется отслеживать.

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119