Создать экземпляр объекта из приведенного std :: shared_ptr - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть вектор, который содержит набор общих указателей:

std::vector<std::shared_ptr<Derived>> originalVector;

В какой-то момент он приводит к Base общим указателям, это выглядит так:

std::vector<std::shared_ptr<Base>>* castedVector = reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);

Как добавить элемент Derived в приведенный вектор? По-видимому, я могу вставить в него пустой std::shared_ptr, знает ли этот новый общий указатель что-нибудь о типе, который он содержит, может ли он создать объект этого типа?

Обновление: Невозможно создать оригинальный объект после того, как shared_ptr был приведен к базовому классу. После приведения он теряет всю информацию об исходном базовом типе. Более того: это reinterpret_cast - неопределенное поведение.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019
std::vector<std::shared_ptr<Base>>* castedVector =
    reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);

Это неопределенное поведение, выполните , а не .

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

std::vector<std::shared_ptr<Base>> baseVector(originalVector.begin(), originalVector.end());

Содержит копии оригинальных указателей, которые делятся с ними правами собственности, но содержащиеся указатели имеют Base* вместо Derived*.

Очевидно, есливы вставляете новое значение в originalVector, а не в baseVector, поэтому вам нужно будет сделать новую копию всего originalVector или вставить его в оба одновременно.

0 голосов
/ 02 апреля 2019

Вы должны иметь возможность добавить указатель производного класса к вектору указателей базового класса.Производный указатель затем преобразуется в базовый указатель.Это не зависит от того, что делают умные указатели.Неважно, был ли вектор создан как вектор базовых элементов или был преобразован в него, не так ли?

std::vector<std::shared_ptr<Base>> bases;

// Create a Derived instance
auto derived = std::make_shared<Derived>();
bases.push_back(derived);

// Only create a pointer (might as well just create a Base pointer)
std::shared_ptr<Derived> emptyPointer;
bases.push_back(emptyPointer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...