Я создал абстрактный базовый класс Animal
, который имеет публичный виртуальный абстрактный метод makeSound()
.Я создал подкласс Cow
, который реализует Animal.makeSound()
, как и следовало ожидать (вы знаете ... "му").И у меня есть класс Farm
, который содержит закрытую переменную-член std::vector<Animal*> animals
.В одном из методов Farm
я перебираю всех животных и заставляю их издавать звук.
for(unsigned int i = 0; i < animals.size(); i++)
{
animals[i]->makeSound()
}
К сожалению, я получаю ошибку
Необработанное исключение в 0x65766974 в TestBed.exe: 0xC0000005: Место чтения нарушения доступа 0x65766974.
Есть идеи, что здесь происходит?
ОБНОВЛЕНИЕ: добавление дополнительного кода для запроса
class Farm
{
public:
Farm();
virtual ~Farm(void);
void setBarnOnFire();
private:
vector<Animal*> animals;
};
Farm::Farm()
{
animals.push_back(new Dog());
animals.push_back(new Cat());
animals.push_back(new Chicken());
animals.push_back(new Horse());
animals.push_back(new Cow());
}
Farm::setBarnOnFire()
{
for(unsigned int i = 0; i < animals.size(); i++)
{
animals[i]->makeSound()
}
}
Есть ли что-то, что я должен сделать для инициализации animals
.
РАЗРЕШЕНИЕ:
Так что вы все были правы.Я получал доступ к памяти, которой не владел.Но это заняло у меня целую вечность, чтобы выследить это.Это было связано с неправильным пониманием того, как происходит инициализация объекта.По сути, чтобы «инициализировать» переменную-член, я фактически перезаписывал ее локальной переменной.Затем я дал местным всем животным, которых я создал.Позже животные будут пытаться вызвать локальную переменную, которой больше не существует.