У меня есть сценарий, в котором мне нужно собрать все объекты типа в коллекции, но мне также нужен набор некоторых из его унаследованных типов. Пример:C++ общие указатели классов parent-children
class Particle: public someClass
{
...
public:
static std::vector<std::shared_ptr<Particle>> particleCollection;
}
class ChargedParticle: public Particle
{
...
public:
static std::vector<std::shared_ptr<ChargedParticle>> chargedParticleCollection;
}
Однако, когда я хочу, чтобы уничтожить эти объекты, я на самом деле вызывать деструктор дважды для каждого ChargedPartice:
Particle::particleCollection.clear(); // Okay
ChargedParticle::chargedParticleCollection.clear(); // Error: particles are already deleted
Как и может иметь набор дочерних объектов хранится в его статической контейнер и иметь интеллектуальные указатели, указывающие на них одним из своих родительских классов?
Я хочу, чтобы иметь возможность создавать объекты из родительского класса тоже, и иметь статический вектор-указатель родительского объекта, являющийся владельцем этих объектов.
Моя идея состоит в том, что я каким-то образом определяю пользовательский deleter для интеллектуальных указателей родительского класса, который вызывает вызов деструктора, когда объект не является элементом коллекции дочерних классов. Это возможно?
Почему вы используете статический член для хранения этих частиц? – LmTinyToon
При правильном использовании 'shared_ptr' двойные вызовы деструкторов не должны выполняться. Вы должны показать больше кода, возможно, mcve: http://stackoverflow.com/help/mcve – Waldheinz
@ АлександрЛысенко Простой случай использования: я хочу рассчитать силу на заряженной частице из-за электростатических взаимодействий. Для этого мне нужно знать все остальные позиции заряженных частиц. –