#c
#c
Вопрос:
Я получаю сообщение об ошибке, возникающей в классе ‘vector’, например, в классе, к которому вы обращаетесь, когда вы #include < vector>
ошибка, которую я получаю в основном, это:
Ошибка 1 ошибка C2259: ‘Gun’: не удается создать экземпляр абстрактного класса
Этот класс, Gun, действительно абстрактный, но я проверил код, и нигде нет экземпляра, который пытался бы быть создан. Что есть, так это несколько определений
вектор< Пистолет> бла;
в качестве членов экземпляра класса, которые будут заполнены производными классами, чтобы я мог использовать их полиморфные функции.
Хотя я не могу получить доступ к классу vector, чтобы изменить его (и даже если бы я мог, я бы не хотел) Я могу видеть, в какой части кода возникает ошибка:
первая строка этого блока:
void resize(size_type _Newsize, _Ty _Val)
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() _Newsize, end());
}
Ответ №1:
Вектор, объявленный как
std::vector<Gun>
будет содержать только объекты Gun. Если вы попытаетесь поместить экземпляр, производный от Gun, то объект будет сокращен до его части Gun, которая является абстрактной. Вам нужно было бы сохранить указатели на динамически выделяемые копии в векторе, например
std::vector<Gun*>
Чтобы избавить себя от логики разыменования и удаления, используйте контейнеры указателей boost:
#include <boost/ptr_container/ptr_vector.hpp>
boost::ptr_vector<Gun>
Ответ №2:
Вы не можете, потому что когда вы выполняете vector, вы создаете объекты этого типа, если вы наследуете, что, как я понял, вам нужно сделать
Ak47 *gun1 = new Ak47(ammo);
vector<Gun*> guns;
guns[0]=amp;*gun1;
Комментарии:
1. «guns.push_back(gun1);» безопаснее и проще.
Ответ №3:
std::vector
содержит объекты по значению, поэтому будут созданы экземпляры объектов Gun, вот почему вы получаете ошибку.