Я строю небольшую фреймворк в C++, который содержит объекты, которые хранятся в контейнере STL, как unique_ptr
к их интерфейсу. Я думал, что unique_ptr
был лучшим выбором, так как контейнер должен быть единственным владельцем объектов.Возвращение ссылки на объект, направленный через его интерфейс
Я хотел получить ссылку на заостренный объект из контейнера, чтобы передать вызывающему. Но когда я получаю указатель, мне нужно разыменовать его, чтобы передать ссылку на контент из моей функции, которая, конечно же, не работает над абстрактным классом.
Я не хочу передавать необработанный указатель, который будет игнорировать всю концепцию, которую я разрабатывал. Я не могу отличить, поскольку не знаю конкретного типа сохраненного объекта. Единственное решение, которое мне пришло в голову, достаточно разумно, это сохранить общий указатель в контейнере и передать слабый указатель на вызывающего, но если вы знаете какой-то другой способ получить тот же результат, было бы здорово.
Это базовая структура кода, с Base
быть абстрактным классом:
class Container
{
vector<unique_ptr<Base>> m_C;
public:
Base& GetBase(int index)
{
return *(m_C.at(index)); //This do not compile as Base is abstract
}
};
EDIT:
Я не уверен, что еще нужно в качестве примера. Основной будет выглядеть следующим образом
int main() {
Container X;
// Fill X here
A tmp = X.get(10) // Let's say I want the tenth element
}
Компиляция на OSX с лязгом я получаю эту ошибку
variable type 'MXIO::MXEvent' is an abstract class
edit2: Проблема решена
Я решил эту проблему. Проблема была не в том, как функция возвращалась, а в том, как я ловил возвращение. Я использовал
auto tmp = X.get(10)
Предполагая, что автомобиль будет заботиться о принятии ссылки в то время как я использую
auto&& tmp = X.get(10)
Вы _can_ есть ссылка на абстрактный класс. Какое сообщение об ошибке вы получаете? –
«Это не скомпилировать». [Вы уверены?] (Http://ideone.com/fwNSnw) Пожалуйста, предоставьте полный воспроизводимый пример. –
Необработанный указатель подходит для кого-то, просто используя класс или интерфейс. Пока вы знаете, что срок службы (объекта) будет длиннее, чем используется необработанный указатель. –