Переменная "Переопределение наследования вектора C ++" - PullRequest
0 голосов
/ 03 мая 2020

Скажем, у вас был класс

class Foo
{
  // stuff
};

, и у вас была производная версия этого класса

class Bar : public Foo
{
  // extra stuff
};

, и у вас был класс с вектором указателей на Foo s .

class FooManager
{
public:
  std::vector<Foo*> objects;
}

Не могли бы вы вывести FooManager в BarManager, где BarManager имеет вектор указателей на Bar?

Если вы сделали что-то вроде

class BarManager : public FooManager
{
  std::vector<Bar*> objects;
}

Тогда BarManager просто будет скрывать объекты FooManager, и я бы не хотел этого дополнительного члена. Я мог бы просто указать указатели sh Bar на объекты FooManager, и это сработало бы, но тогда, если бы я хотел использовать объект extra stuff, Bar, мне нужно было бы привести все Foo* с в Bar* с, и тогда возникнут проблемы, если я случайно вставлю указатель Foo в объекты.

Есть ли лучшее решение?

РЕДАКТИРОВАТЬ: я пытаюсь различные методы организации игровых классов. Все объекты получены из GameObject с чисто виртуальными методами Update () и Draw (). Все объекты принадлежат менеджеру этого типа, а затем все эти менеджеры принадлежат одному «Менеджеру менеджеров», который будет вызывать методы Update () и Draw () для менеджеров, которые в свою очередь вызывают Update () и Draw (). методы для объектов.

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Нет, это невозможно.

Как указал один пользователь, это выглядит как проблема XY. Вам следует лучше объяснить, чего вы хотите достичь.

Учитывая лишь несколько объяснений ...

Одно из решений - использовать std::vector<Foo*> objects; в FooManager и BarManager для выполнения функций. которые берут objects и приводят указатели в objects к Bar*.

class BarManager : public FooManager {
    Bar* get_at_index(std::size_t i) const { return static_cast<Bar*>(objects[i]); }
}

Другой подход - использовать шаблонный класс и затем использовать Manager<Foo> mgr; или Manager<Bar> mgr;.

template <class T>
class Manager
{
public:
  std::vector<T*> objects;
}
0 голосов
/ 04 мая 2020

Мало того, что это невозможно, это бессмысленно делать. Представь, что может случиться, если ты сможешь это сделать. Если разрешено что-то подобное:

class BarManager : public FooManager
{
  override std::vector<Bar*> objects;  // replace the base class member with this
}

Тогда, если вы определили другой подкласс Foo:

class Baz : public Foo {  // whatever

Вы можете преобразовать BarManagar * в FooManager *

FooManager *ptr = &SomeBarManager;

, а затем вставьте Баз в свои данные

ptr->objects->push_back(new Baz());

, что приведет к предсказуемому хаосу, когда кто-то попытается получить к нему доступ позже, как если бы это был Бар.

Так что настоящий вопрос ПОЧЕМУ Вы думаете о попытке сделать что-то подобное? Потому что это действительно не имеет никакого смысла, и если вы думаете, что это так, возможно, в вашем дизайне есть что-то принципиально противоречивое.

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