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

Не могу добавить объект к множеству - C++

Восстановить пароль Регистрация
 
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
11.11.2013, 19:02     Не могу добавить объект к множеству #1
У меня есть функция, которая должна добавить объект в множество которое передается как параметр
Была такая, но объект не добавляла:

C++
1
2
3
4
5
template <class T> void AutoShop::add( set<T> _setSomething)
{
T obg;
__setSomething.insert(obg);
}
Я решил что если объект создается в функции,то он разрушается после выхода из нее. Поэтому я создавал его выше и передавал в функцию как параметр (как ссылку, указатель) все равно не добавляет!
вот код:

C++
1
2
3
4
template <class T> void add( set<T> _setSomething, T* _obg)
    {
        _setSomething.insert(*_obg);
    }
вот где она вызывается:

C++
1
2
3
4
5
6
7
8
switch (mapAction[act])
        {
        case manager:
        {
            Manager m;
            au1.add<Manager>(au1.getManagerSet(), &m);
            break;
        }
У меня в классе 3 таких множества и эта ф-я должна делать тоже самое для каждого из них... Можно ил это сделать через шаблонную ф-ю или лучше написать для каждого класса по функции? если не через шаблонную то все работает даже когда объект создается внутри функции:

C++
1
2
3
4
5
void AutoShop::addManager()
{
    Manager manager;
    managerSet.insert(manager);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
12.11.2013, 22:07  [ТС]     Не могу добавить объект к множеству #2
Ну!? Есть тут кто?? Скажите хоть пару слов, что не так или может лучше не парится и сделать по другому?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.11.2013, 22:14     Не могу добавить объект к множеству #3
Цитата Сообщение от Tit_Vlad Посмотреть сообщение
template <class T> void AutoShop::add( set<T> _setSomething)
У Вас аргумент передается по значению. Множество копируется, и внутри функции Вы работаете с копией. Передавайте для начала по ссылке:
C++
1
2
template <class T> 
void AutoShop::add( set<T>& _setSomething)
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
12.11.2013, 22:44  [ТС]     Не могу добавить объект к множеству #4
спасибо. но нет, все равно не работает... попытался сделать тоже самое с объектами(создавать внутри и снаружи) и вызывать ф-ю возвращающую множество выше, но все безрезультатно:
вот вызов:
C++
1
2
3
4
5
6
7
8
9
switch (mapAction[act])
        {
        case manager:
            {
                Manager m;
                set<Manager> manSet=au1.getManagerSet();
                au1.add<Manager>(manSet, m);
                break;
            }
вот реализация:
C++
1
2
3
4
template <class T> void add( set<T>& _setSomething, T& _obg)
    {
        _setSomething.insert(_obg);
    }
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.11.2013, 22:51     Не могу добавить объект к множеству #5
Что за au1? getManagerSet() возвращает копию, потом Вы в эту копию чего-то добавляете. Ну так и проверять надо тогда manSet, а не то, что снова вернет getManagerSet().
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
12.11.2013, 23:13  [ТС]     Не могу добавить объект к множеству #6
au1 - объект класса в котором есть множество хранящее объекты класса Manager.
getManagerSet() возвращает копию? A можно как-нибудь добавлять объекты к полю класса, а не к копиям?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class AutoShop
{
    string name;
    string address;
    int amountCarsSold;
    double gainsMoney;
    set<Manager> managerSet;
    set<Client> clientSet;
    set<AutoConfiguration> autoConfigurationSet;
public:
    AutoShop();
    void setInformation(string _name, string _address);
    void addManager();
    void addClient();
    void addAutoConfiguration();
    template <class T> void add( set<T>& _setSomething/*, T& _obg*/)
    {
        T obg;
        (_setSomething).insert(obg);
    }
    set<Manager> getManagerSet() const;
C++
1
2
3
4
set<Manager> AutoShop::getManagerSet() const
{
    return managerSet;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.11.2013, 23:20     Не могу добавить объект к множеству #7
Возвращаем ссылку ... и пошло поехало.
C++
1
set<Manager>& AutoShop::getManagerSet() const
Имхо, Вы взялись за какую-то навороченную систему не разобравшись в базовых вещах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2013, 22:20     Не могу добавить объект к множеству
Еще ссылки по теме:

C++ Не могу получить объект по индексу в vector, где же ошибка?
C++ Не могу понять где объект в куче или в стеке !
C++ Добавить объект класса

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

Или воспользуйтесь поиском по форуму:
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
13.11.2013, 22:20  [ТС]     Не могу добавить объект к множеству #8
Спасибо, получилось)
Пишу вдруг кому-то поможет, поправьте если я не прав.
Что бы вернуть ссылку на множество из класса, это множество должно быть объявлено как статик:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class AutoShop
{
    string name;
    string address;
    int amountCarsSold;
    double gainsMoney;
    static set<Manager> managerSet;
    static set<Client> clientSet;
    static set<AutoConfiguration> autoConfigurationSet;
public:
    AutoShop();
    void setInformation(string _name, string _address);
    template <class T> void add( set<T>& _setSomething)
    {
        T obg;
        (_setSomething).insert(obg);
    }
    set<Manager>& getManagerSet() const;
статик переменные должны быть определенны где-нибудь в .срр файле
C++
1
2
3
set<Manager> AutoShop::managerSet;
set<Client> AutoShop::clientSet;
set<AutoConfiguration> AutoShop::autoConfigurationSet;
Теперь возвращаем ссылку на множество
C++
1
2
3
4
set<Manager>& AutoShop::getManagerSet() const
{
    return managerSet;
}
И вот теперь мы можем добавить объект в множество которое является полем класса
C++
1
2
3
4
5
switch (mapAction[act])
        {
        case manager:
            au1.add<Manager>(au1.getManagerSet());
            break;
Добавлено через 21 час 49 минут
Есть поправка!
Если сэт в классе не нужны как статики, то для компиляции и правильной работы необходимо убрать конст из методов геттеров
C++
1
2
3
set<Manager>& getManagerSet();
    set<Client>& getClientSet();
    set<AutoConfiguration>& getAutoConfigurationSet();
Yandex
Объявления
13.11.2013, 22:20     Не могу добавить объект к множеству
Ответ Создать тему
Опции темы

Текущее время: 09:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru