Ich habe ein Szenario, in dem ich alle Objekte eines Typs in einer Sammlung sammeln muss, aber ich brauche auch eine Sammlung von einigen seiner geerbten Typen. Beispiel:C++ freigegebenen Zeiger der Eltern-Kind-Klassen
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;
}
Jedoch, wenn ich diese Objekte zerstören will, rufe ich tatsächlich den destructor zweimal für jeden ChargedPartice:
Particle::particleCollection.clear(); // Okay
ChargedParticle::chargedParticleCollection.clear(); // Error: particles are already deleted
Wie kann ich beide habe eine Sammlung des Kindes in seinem statischen gespeicherten Objekte Container und haben intelligente Zeiger, die auf sie von einer ihrer Elternklassen zeigen?
Ich möchte in der Lage sein, Objekte auch aus der Elternklasse zu erstellen, und den statischen Smart-Zeiger-Vektor der Eltern der Besitzer dieser Objekte sein.
Meine Idee ist, dass ich irgendwie ein benutzerdefiniertes Deleter für die Smartpointer der Elternklasse definiere, das nur den Destruktor aufruft, wenn das Objekt kein Element der Sammlung der Kindklasse ist. Ist das möglich?
Warum verwenden Sie ein statisches Element, um diese Partikel zu speichern? – LmTinyToon
Bei richtiger Verwendung von 'shared_ptr' sollten doppelte Destruktoraufrufe nicht auftreten. Sie sollten mehr Code zeigen, möglicherweise eine mcve: http://stackoverflow.com/help/mcve – Waldheinz
@ АлександрЛысенко Einfacher Anwendungsfall: Ich möchte die Kraft auf einem geladenen Partikel aufgrund elektrostatischer Wechselwirkungen berechnen. Dazu muss ich alle anderen geladenen Teilchenpositionen kennen. –