Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
#1

Получение объекта из множества - C++

18.11.2013, 17:23. Просмотров 239. Ответов 7
Метки нет (Все метки)

Здравствуйте!
У меня есть класс с множеством
C++
1
2
3
4
5
6
7
8
9
10
11
class AutoShop
{
    string name;
    string address;
    int amountCarsSold;
    double gainsMoney;
    set<Manager> managerSet;
    set<Client> clientSet;
    set<AutoConfiguration> autoConfigurationSet;
...
}
в AutoConfiguration есть поле id
C++
1
2
3
4
5
class AutoConfiguration
{
    int id;
...
}
Мне нужно получить объект множества по определенному id. Вот что я делал:
C++
1
2
3
4
5
6
7
8
9
10
11
template<class T> T& getObj(int _id)
    {
        set<T>::iterator iter;
        iter=getSet<T>().begin();
        while(iter!=getSet<T>().end())
        {
            if((*iter).getId()==_id)
                return *iter;
            iter++;
        }
    }
Так я ее вызывал:
C++
1
getObj<AutoConfiguration>(id);
Получал такую ошибку: error C2440: 'return' : cannot convert from 'const AutoConfiguration' to 'AutoConfiguration &'
Попытался вернуть итератор на объект, как в алгоритме find():
C++
1
2
3
4
5
6
7
8
9
10
template<class inpIter, class T> inpIter getObj(const int _id)
    {
        set<T>::iterator iter;
        iter=getSet<T>().begin();
        while(iter!=getSet<T>().end())
        {
            if((*iter++).getId()==_id)
                return iter;
        }
    }
Вызывал так:
C++
1
2
set<AutoConfiguration>::iterator iter;
        iter=getObj<set<AutoConfiguration>::iterator, AutoConfiguration>(id)
все скомпилилось, но когда начал работать с объектом
C++
1
(*iter).addModification();
выдало такую ошибку: error C2662: 'AutoConfiguration::addModification' : cannot convert 'this' pointer from 'const AutoConfiguration' to 'AutoConfiguration &'
Можете объяснить почему this константный и как это исправить что бы я мог работать с объектом?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2013, 17:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получение объекта из множества (C++):

XML и получение объекта по id - C++
Требуется прочитать XML документ, выкусить из него элементы с заданными id и обработать. Элементы могут быть составными. Вопрос: чем это...

Получение предыдущего объекта из списка (std::list) - C++
#include &lt;Iostream&gt; int main() { std::list&lt;COORD*&gt; coords; COORD* pCoord; for(uint16 i = 0; i &lt; 10; ++i) ...

Реализовать распознание объекта из некоторого множества (расширяемого) на основе вопросов и ответов - C++
Необходимо решить задачу на С++ Реализовать распознание объекта из некоторого множества (расширяемого) на основе вопросов и ответов....

Метод get_Value объекта Range, Получение значении ячеек из Excel - C++
Добрый день. Метод get_Value объекта Range (Excel), содержащего одну ячейку, возвращает значение этой ячейки в переменную типа...

Получение адреса объекта после обнуления указателя на этот объект - C++
Добрый вечер уважаемые программисты. Интересует следующий вопрос. Есть ли способ получить адрес объекта, после того, как указатель на него...

Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В - C++
Введено с клавиатуры число изъять из множества А, если оно является элементом множества А, но не является элементом множества В. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
stima
473 / 322 / 30
Регистрация: 22.03.2011
Сообщений: 1,046
Завершенные тесты: 2
18.11.2013, 17:27 #2
Обьект в std::set хранится как const T, поэтому вернуть T& не получится, но можно вернуть const T&.
Соответственно после обьект типа const T& может вызывать только const методы.
0
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
18.11.2013, 17:37  [ТС] #3
то есть если у меня есть множество с объектами типа AutoConfiguration
set<AutoConfiguration> autoConfigurationSet;
то я не могу в этих объектах ничего изменить или добавить?

Добавлено через 3 минуты
что делают в таких ситуациях, если мне нужно потом работать с данными хранящимися в AutoConfiguration?
0
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
18.11.2013, 17:44 #4
Возможно поможет const_cast: http://www.cplusplus.com/doc/tutorial/typecasting/
1
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
18.11.2013, 17:49 #5
Цитата Сообщение от Tit_Vlad Посмотреть сообщение
что делают в таких ситуациях, если мне нужно потом работать с данными хранящимися в AutoConfiguration?
Используют другой контейнер, например, std::vector. Зачем вам std::set и какие у вас определения operator < для хранимых в std::set элементов?
0
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
18.11.2013, 18:17  [ТС] #6
operator < определяется по id
bool AutoConfiguration::operator<(const AutoConfiguration& _autoConfiguration)const
{
if(id<_autoConfiguration.id)
return true;
return false;

}
set брался потому что предполагается много опеарций поиска

Добавлено через 13 минут
Спасибо!)
const_cast помог, привожу пример:
C++
1
2
3
4
5
6
7
8
9
10
11
template<class T> T* getObj(int _id)
    {
        set<T>::iterator iter;
        iter=getSet<T>().begin();
        while(iter!=getSet<T>().end())
        {
            if((*iter).getId()==_id)
                return const_cast<AutoConfiguration*>(&(*iter));
            iter++;
        }
    }
Вызов:
C++
1
getObj<AutoConfiguration>(id)->addModification();
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
18.11.2013, 19:03 #7
getSet<T>()
как выглядит этот метод?

Добавлено через 29 минут
хотя я немного не то спросил
использовать const_cast - немного кривое решение. Не вижу безвыходной ситуации, которая бы вынудила так делать
почему бы не перейти на std::map? ключом будет id, как и раньше. и не надо магии с констами и прочим
0
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
18.11.2013, 19:11  [ТС] #8
Спасибо, запомню на будущее и буду использовать map, но сейчас не хочется переписывать существующий код.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2013, 19:11
Привет! Вот еще темы с ответами:

Множества. Вычислить количество элементов множества Q, связанного c исходными множествами - C++
В общем задание звучит так : Заданы 3 упорядоченных множества F, G и H, представленные файлами f, g и h соответственно. Вычислить...

Квадрат с вершинами из первого множества накрывает все точки второго множества и имеет минимальную площадь - C++
Даны два множества точек на плоскости. Выбрать четыре различных точки первого множества так, чтобы квадрат с вершинами в этих точках...

Множества . Найти разность полученного множества с заданным - C++
Всем доброго времени суток! Необходима ваша помощь. Никак не могу сделать второй пункт задачи.Суть задачи-найти 1)объединение множества...

Множества. Проверка множества на наличие элемента в нем - C++
Во многих задачах сталкиваюсь с одной и той же проблемой: Нужно создать множество элементов, добавлять в него новые элементы и проверять...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.11.2013, 19:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru