Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > map + абстрактный класс


Автор: Burka 1.6.2011, 16:04
Здраствуйте, подскажите пожалуйста можно ли используя map из stl работать с абстрактными классами?
Пример
Код

class ExampleAbstr
{ 
   virtual void a()=0;
}

class Example1 : public ExampleAbstr
{ a(){...};
}


class Example2 : public ExampleAbstr
{ a(){...};
}

std::map<std::string, ExampleAbstr> MAP /// тут будет выдавать ошибку что невозможно создать абстрактный метод.

Мне надо сделать массив Example'ов. Без повторов. Есть какой нибудь способ заставить работать map? или надо с вектором делать

Автор: Michrutka 1.6.2011, 16:06
Попробуй сделать так:
Код

std::map<std::string, ExampleAbstr*> MAP

Автор: xvr 1.6.2011, 16:36
Цитата(Burka @  1.6.2011,  16:04 Найти цитируемый пост)
или надо с вектором делать 
Ты не поверишь, но и с вектором это работать не будет!  smile Нельзя нигде создать экземпляр абстрактного класса, только производного от него. А все контейнеры должны уметь манипулировать с экземплярами своих типов данных (в частности создавать их).


Автор: boostcoder 1.6.2011, 16:41
или так:
Код

std::map<std::string, boost::shared_ptr<ExampleAbstr> > MAP;

Автор: afiskon 1.6.2011, 16:42
Только обязательно воспользуйтесь умными указателями (используйте shared_ptr/unique_ptr, ибо auto_ptr теперь деприкейтед). Не придется вручную вызывать delete и меньше шансов, что память потечет (практически нулевые, если явно не накосячить).

Автор: Burka 1.6.2011, 19:30
Цитата(boostcoder @ 1.6.2011,  16:41)
или так:
Код

std::map<std::string, boost::shared_ptr<ExampleAbstr> > MAP;

а работать с этим так же как и с обычными ссылками?
создавать через new и удалять через delete надо?

ps.

как я понял удаляться само будет, но создавать через new правильно?)

Автор: boostcoder 1.6.2011, 19:36
Код

std::map<std::string, boost::shared_ptr<ExampleAbstr> > MAP;

...
// добавлять так:
MAP.insert(std::make_pair("string", new ExampleDerived));

// или так:
MAP["string"] = boost::shared_ptr<ExampleAbstr>(new ExampleDerived);


для удаления delete не нужен.
просто выкидываешь элемент из контейнера, а смарт-поинтер сам все удаляет.

Автор: Burka 1.6.2011, 19:39
Спасибо, попробую

Добавлено через 3 минуты и 37 секунд
а какой файл подключать? <boost/shared_ptr.hpp> не находит

Автор: boostcoder 1.6.2011, 19:48
Цитата(Burka @  1.6.2011,  19:39 Найти цитируемый пост)
<boost/shared_ptr.hpp> не находит

значит у Вас boost не установлен.

Добавлено через 40 секунд
или, возможно нужно указать где лежат хидеры boost`а

Автор: afiskon 1.6.2011, 22:29
Флаг "-std=c++0x" (или "-std=gnu++0x")для GCC или MinGW начиная с версии 4.5. В VS 2010 чуть ли не из коробки, безо всяких галочек (но не факт). Можно через IDE в свойствах проекта поискать соответствующую галочку или прописать вручную где-то в тех же свойствах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)