абстрактный класс stl вектор.push_back() не компилируется

StackOverflow https://stackoverflow.com/questions/1256395

Вопрос

Допустим, у меня есть вектор stl, содержащий тип класса «xx».хх является абстрактным.Я столкнулся с проблемой, когда компилятор не позволяет мне «создавать экземпляр», когда я делаю что-то вроде следующего:

std::vector<xx> victor;
void pusher(xx& thing)
{
    victor.push_back(thing);
}

void main()
{
    ;
}

Я предполагаю, что это потому, что необходимо вызвать конструктор копирования.Я решил эту проблему, сохранив в векторе xx*, а не xx.Есть ли лучшее решение?Что это такое?

Это было полезно?

Решение

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

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

Другие советы

Чтобы быть более католиком, чем Папа Римский (или, в данном случае, Стив Гуиди), требования к объектам, хранящимся в контейнерах STL, заключаются в том, что они допускают возможность копирования и назначения, а абстрактный класс не является ни тем, ни другим.Итак, в этом случае лучше всего использовать контейнер указателей.Еще одна вещь, которую следует учитывать, если вы решите исправить ситуацию, не делая класс абстрактным: нарезка.

std::vector (и весь STL в целом) предназначен для хранения значений.Если у вас есть абстрактный класс, вы намерены не манипулировать значением этого типа, а манипулировать указателем или ссылками на него.Поэтому использование std::vector абстрактного класса не имеет смысла.И даже если он не является абстрактным, обычно нет смысла манипулировать классом, созданным как базовый класс, как значением, они обычно должны быть некопируемыми (конструктор копирования и оператор присваивания, объявленные закрытыми и не реализованными, являются стандартным приемом, наследующим от подходящий класс, единственной целью которого является сделать его потомка некопируемым (например, boost::noncopyable), стал модным).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top