Вы устанавливаете p
, чтобы указать на временные объекты, которые уничтожаются сразу после назначения, оставляя p
висящим. Вместо этого вам нужно использовать new
:
Particle* p;
if (particle_type == "Featherr") { //This is never called because of the extra "r" I put, so ignore this block
p = new FeatherParticle(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale);
}
else {
p = new Particle(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale);
}
...
Но тогда вы будете нарезать объект при назначении *p
на particle1
, поэтому используйте вместо этого ссылку (или просто избавьтесь от particle1
, так как он вам не нужен):
Particle &particle1 = *p;
Но тогда вы пытаетесь превратить sh Particle
объекты в particles
, а не Particle*
указатели . Так что вы все равно нарежете particle1
. Полиморфизм работает только при использовании указателей / ссылок, поэтому вы должны хранить Particle*
указателей (что означает использование new
для particle2
):
std::vector<Particle*> particles;
...
Particle *p;
...
Particle *particle2 = new Particle(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale);
particles.push_back(p);
particles.push_back(particle2);
И не забудьте delete
все, что вы new
, когда закончите (и убедитесь, что Particle
имеет деструктор virtual
):
for(size_t i = 0; i < particles.size(); ++i) {
delete particles[i];
}
Или, в C ++ 11 и более поздних версиях:
for(auto *p : particles) {
delete p;
}
Но было бы лучше использовать std::unique_ptr
для автоматической обработки этого delete
. Используйте std::make_unique()
(C ++ 14 и новее), не используйте new
напрямую, если можете этого избежать:
std::vector<std::unique_ptr<Particle>> particles;
...
std::unique_ptr<Particle> p;
if (particle_type == "Featherr") { //This is never called because of the extra "r" I put, so ignore this block
p = std::make_unique<FeatherParticle>(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale);
// or:
// p.reset(new FeatherParticle(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale));
}
else {
p = std::make_unique<Particle>(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale);
// or:
// p.reset(new Particle(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale));
}
auto particle2 = std::make_unique<Particle>(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale);
// or:
// std::unique_ptr<Particle> particle2(new Particle(particle_name, position, rotation, velocity, gravityEffect, lifeLength, scale));
particles.push_back(std::move(p));
particles.push_back(std::move(particle2));