Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> map + абстрактный класс, можно ли использовать вместе? 
:(
    Опции темы
Burka
Дата 1.6.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Здраствуйте, подскажите пожалуйста можно ли используя 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? или надо с вектором делать


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Michrutka
Дата 1.6.2011, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



Попробуй сделать так:
Код

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

PM MAIL   Вверх
xvr
Дата 1.6.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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


PM MAIL   Вверх
boostcoder
Дата 1.6.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



или так:
Код

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

PM WWW   Вверх
afiskon
Дата 1.6.2011, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Только обязательно воспользуйтесь умными указателями (используйте shared_ptr/unique_ptr, ибо auto_ptr теперь деприкейтед). Не придется вручную вызывать delete и меньше шансов, что память потечет (практически нулевые, если явно не накосячить).
PM MAIL WWW   Вверх
Burka
Дата 1.6.2011, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Цитата(boostcoder @ 1.6.2011,  16:41)
или так:
Код

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

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

ps.

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

Это сообщение отредактировал(а) Burka - 1.6.2011, 19:35


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
boostcoder
Дата 1.6.2011, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Код

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 не нужен.
просто выкидываешь элемент из контейнера, а смарт-поинтер сам все удаляет.

Это сообщение отредактировал(а) boostcoder - 1.6.2011, 19:38
PM WWW   Вверх
Burka
Дата 1.6.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.5.2007

Репутация: нет
Всего: 2



Спасибо, попробую

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


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
boostcoder
Дата 1.6.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

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

Добавлено через 40 секунд
или, возможно нужно указать где лежат хидеры boost`а
PM WWW   Вверх
afiskon
Дата 1.6.2011, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Флаг "-std=c++0x" (или "-std=gnu++0x")для GCC или MinGW начиная с версии 4.5. В VS 2010 чуть ли не из коробки, безо всяких галочек (но не факт). Можно через IDE в свойствах проекта поискать соответствующую галочку или прописать вручную где-то в тех же свойствах.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.