Привет,
такая вот ситуация,
у меня есть класс унаследованный от базового. Объекты конечного класса хранятся в разных списках типа std::set,
И я хочу организовать еще один список указателей на все эти объекты, что бы в цикле вызывать функцию базового класса.
Незнаю понятно ли я изложил, вот тут с примером
class BaseClass
{
void DoSomeThing()
};
class EndClass : public BaseClass
{
};
//тут у меня разные списки, то-есть в разных списках хранятся однородные объекты
std::set<EndClass> Cars;
std::set<EndClass> People;
//и я хочу зделать единый список для вызова DoSomeThing()
std::list< BaseClass* > Objects;
Вся проблема в том, что если я добавлю Car в set, то как мне получить указатель на этот Car,
что бы его запихать потом в Objects.
Спасибо
Здравствуйте the_moon, Вы писали:
TM>TM>class BaseClass
TM>{
TM> void DoSomeThing()
TM>};
^^^^^^^virtual?
TM>class EndClass : public BaseClass
TM>{
TM>};
TM>std::set<EndClass> Cars;
TM>std::set<EndClass> People;
TM>std::list< BaseClass* > Objects;
TM>
TM>Вся проблема в том, что если я добавлю Car в set, то как мне получить указатель на этот Car,
TM>что бы его запихать потом в Objects.
А что мешает перебирать элементы std::set? Или в Objects может храниться не такой набор объектов, как в set?
В принципе, после вставки ты можешь получить итератор, а по нему добраться до указателя на объект:
//типа using namespace std
pair<iterator, bool> insert(const value_type& x);
...
pair<set<EndClass>,bool> p = Cars.insert(MyCar);
Objects.push_back(&*p.first);
Как написано в стандарте, insert не влияет на действительность итераторов и ссылок контейнера.
Но, на мой взгляд, связываться с указателями в данном случае, неразумно — попахивает деталями реализации.
Лучше опиши тип контейнера как
typedef std::set<BaseClass> BaseSet;
...
BaseSet Cars, People;
И храни в своем контейнере итераторы:
std::list<BaseSet::iterator> Objects;
Здравствуйте retalik, Вы писали:
R>Здравствуйте the_moon, Вы писали:
R>В принципе, после вставки ты можешь получить итератор, а по нему добраться до указателя на объект:
R>R>//типа using namespace std
R>pair<iterator, bool> insert(const value_type& x);
R>...
R>pair<set<EndClass>,bool> p = Cars.insert(MyCar);
R>Objects.push_back(&*p.first);
R>
Спасибо, заработала!