Я прочитал, что вы спрашиваете: «Могу ли я создать общий контейнер, который можно использовать как для кубов, так и для частиц, даже если у них разные функции-члены?»Конечно, это самая легкая часть.Вы можете даже поместить оба кубика и частиц в один контейнер, если хотите.Если вы имеете дело с указателями, вы просто используете void*
:
std::vector<void*> objects;
objects.push_back(new Particle(...));
objects.push_back(new Cube(...));
Конечно, вы ничего не можете сделать с void*
s, кроме как отбросить их обратно:
for (i = objects.begin(), i != objects.end(), ++i) {
void* p = objects[i];
Particle* particle = dynamic_cast<Particle*>(p);
if (particle) {
// do particle stuff
continue;
}
Cube* cube = dynamic_cast<Cube*>(p);
if (cube) {
// do cube stuff
}
}
И даже если вы храните Частицы только в своем векторе, скажем, вам все равно придется опуститься, чтобы работать с ними:
for (i = objects.begin(), i != objects.end(), ++i) {
void* p = objects[i];
Particle* particle = dynamic_cast<Particle*>(p);
if (particle) {
// do particle stuff
} else {
// error!! I thought someone told me this thing only had Particles...
}
}
Вы можете видеть, что делать это гораздо более неудобно, чем простоони в отдельных векторах, где вы знаете тип каждого из объектов в каждом векторе и не должны выполнять даункауты во время выполнения для работы с ними.Вот почему этот тип контейнера часто считается плохим стилем.
Другие возможности, на которые вы можете посмотреть в этой области: boost::any
или boost::variant
, которые работают с другими вещами, кроме указателей.