Ich versuche herauszufinden, wie ich durch einen Container (wie Std :: Vector) von Objekten, die eine gemeinsame Basisparentklasse zusammenhängende im Speicher gemeinsam verwenden.Iterieren durch Objekte mit einer gemeinsamen Basisklasse in unterschiedlichen Speicher
Um das Problem zu demonstrieren, verwenden wir die folgenden Beispiele.
class Base
{
public:
Base();
virtual void doStuff() = 0;
};
class DerivedA : public Base
{
private:
//specific A member variables
public:
DerivedA();
virtual void doStuff();
};
class DerivedB : public Base
{
private:
//specific B member variables
public:
DerivedB();
virtual void doStuff();
};
nun mit std :: vector die Objekte in zusammenhängenden Speicher zu wiederholen halten würde, aber wir würden dort erleben Aufschneiden nicht Raum für die abgeleiteten Eigenschaften ist.
So haben wir wie polymorphe Technik Zeiger zu verwenden, so
int main()
{
std::vector<Base*> container;
container.push_back(new DerivedA());
container.push_back(new DerivedB());
for (std::vector<Base*>::iterator i = container.begin(); i!=container.end(); i++)
{
(*(*i)).doStuff();
}
}
Soweit ich weiß, dass sollte in Ordnung, dass die Klassen implementiert sind gegeben arbeiten.
Problem: Nun wird der Vektor Zeiger in zusammenhängenden Speicher enthält, aber das bedeutet nicht, dass die Adressen, die sie verweisen auf sind.
Wenn ich also jederzeit Objekte in den Vektor löschen und einfügen kann, werden die Objekte überall im Speicher verteilt.
Frage: Es scheint wie jeder schlägt die std :: vector Art und Weise zu tun, aber warum es nicht als problematisch angesehen, dass sie nicht zusammenhängend im Speicher Iterable (vorausgesetzt, wir tatsächlich den Zeiger)?
Bin ich gezwungen, die Copy-Pasta-Art zu machen?
int main()
{
std::vector<DerivedA> containerA;
DerivedA a;
containerA.push_back(a);
std::vector<DerivedB> containerB;
DerivedB b;
containerB.push_back(b);
for (std::vector<DerivedA>::iterator i = containerA.begin(); i!=container.end(); i++)
{
(*i).doStuff();
}
for (std::vector<DerivedB>::iterator i = containerB.begin(); i!=container.end(); i++)
{
(*i).doStuff();
}
}
ich es erraten könnte keine wirkliche Lösung für dieses Problem sein, da Objekte in verschiedenen Größen linear im Speicher zu halten, dass es nicht sinnvoll, aber wenn jemand mir einen Rat geben kann, würde ich es zu schätzen wissen.
Ich denke, dein letzter Satz fasst es zusammen. Wenn Sie die Copy-Paste nicht aushalten können, verwenden Sie vielleicht einen Container, um Ihre Vektoren zu verwalten. Ich hatte bereits einen [hier] (http://codereview.stackexchange.com/questions/87729/storing-collections-of-objects-of-any-type), wenn Sie ein paar Ideen haben wollen. – Quentin
Offhand Ich kann mir eine Möglichkeit vorstellen, geerbte Typen zusammenhängend im Speicher zu behalten. Aber Sie würden zufälligen Zugriff verlieren und wahrscheinlich andere Einschränkungen haben. In der Tat wäre es so, als würde man gleichzeitig die schlechtesten Aspekte von Vektor und Liste bekommen. Wie bei allem in der Softwareentwicklung gibt es irgendwo einen Kompromiss. – TheUndeadFish
Wie viel variieren ihre Größen? Geht es Ihnen gut, wenn Sie die Größe abgeleiteter Größe und einen ungefähren Overhead-Zeiger verwenden? Sind Sie daran gebunden, Vererbung zu verwenden, um Polymorphie zu implementieren? Wie groß ist die Schnittstelle? Hast du Verstärkung? Wird die Menge abgeleiteter Klassen (zur Kompilierzeit) festgelegt und begrenzt? Dies sind keine müßigen Fragen, Antworten auf sie können einige Lösungen durchführbar machen und andere nicht. – Yakk