Я пытаюсь выяснить, как я могу выполнять итерацию через контейнер (например, std::vector) объектов, которые совместно используют основной родительский класс смежно.
Чтобы продемонстрировать проблему, используйте следующие примеры.
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();
};
Теперь, используя std::vector для итерации, будет сохраняться объект в смежной памяти, но мы будем испытывать нарезку, поскольку нет места для производных свойств.
Таким образом, мы должны использовать полиморфную технику, используя указатели, такие как
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();
}
}
Насколько я знаю, это должно работать нормально, учитывая, что классы реализованы.
Проблема: Теперь вектор содержит указатели в смежной памяти, но это не означает, что адреса, на которые они указывают, являются.
Поэтому, если я хочу, чтобы в любое время удалять и вставлять объекты в вектор "на лету", объекты будут распространяться по всему месту в памяти.
Вопрос: Кажется, что каждый предлагает сделать это std::vector, но почему это не считается проблематичным, что он не повторяется в памяти (при условии, что мы действительно используем указатель)?
Я вынужден сделать это с копией-макароном?
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();
}
}
Я предполагаю, что не может быть реального решения этого, так как хранение объектов различных размеров в линейном порядке в памяти не имеет смысла, но если кто-нибудь может дать мне несколько советов, я был бы признателен.