абстрактный класс stl вектор.push_back() не компилируется
-
12-09-2019 - |
Вопрос
Допустим, у меня есть вектор 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), стал модным).