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

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

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

Геттеры создают объекты - C++

18.11.2013, 22:55. Просмотров 442. Ответов 9
Метки нет (Все метки)

Пытаюсь из класса вытащить поле map
C++
1
2
3
4
5
6
7
8
9
class AutoShop
{
    map<int, Manager> mapManagers;
    map<int, Client> mapClients;
    map<int, AutoConfiguration> mapAutoConfigurations;
    template <class T> map<int, T>& getMap();
    template<> map<int, Manager>& getMap<Manager>();
...
}
при помощи геттера
C++
1
2
3
4
template<> map<int, Manager>& AutoShop::getMap<Manager>()
{
    return mapManagers;
}
а он создает объект типа Manager...
не знаю где это происходит и как это пофиксить?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2013, 22:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Геттеры создают объекты (C++):

Геттеры и геттеры - почитать по этому поводу - C++
Подскажите чего можно почитать по этому поводу чтоб доступно и понятно......спасибо))))) Добавлено через 46 минут :wall:

Сеттеры и геттеры в классах С++! - C++
Сдравствуйте!Не могли бы вы мне обьяснить зачем нужны сеттеры и геттеры в классах с++ и как их использовать в основной функции!Заранее...

Константы, геттеры/сеттеры и производительность - C++
Есть глобальная константа, определяющая размер большого количества массивов. Также есть множество обращений к массивам с использованием...

Реализация методов доступа к закрытым полям (геттеры и сеттеры) - C++
Здраствуйте. Нужно реализовать в программе методы get и set Вот мой код: Заголовочный файл #include &lt;iomanip&gt; class Matrix { ...

Нормально ли размещать геттеры, сеттеры, прочие методы из 1 строчки в .h файлах? - C++
Скажите, нормальная ли это практика в c++ помещать геттеры, сеттеры, всякие проверки (например, isInitialized) и прочие методы содержащие...

Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? - C++
Вопрос прост: как при выходе из функции сохранить объекты, которые были созданы в данной функции (указатели объектов положены в массив)?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
stima
474 / 323 / 31
Регистрация: 22.03.2011
Сообщений: 1,047
Завершенные тесты: 2
18.11.2013, 23:08 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <map>
 
class A {};
class B {};
 
class Class
{
 
public:
    template<class T>
    std::map<int, T>& get_map();
 
private:
    std::map<int, A> _a;
    std::map<int, B> _b;
 
};
 
template<>
std::map<int, A>& Class::get_map<A>() { return _a; }
 
template<>
std::map<int, B>& Class::get_map<B>() { return _b; }
 
 
int main()
{
    Class cl;
 
    std::map<int, A>& a = cl.get_map<A>(); //принимающая должна быть ссылка тоже
    std::map<int, B>& b = cl.get_map<B>();
 
    return 0;
}
1
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
18.11.2013, 23:16  [ТС] #3
У меня все так же, но при каждом вызове ф-ции создается объект(я попадаю в конструктор)
Или что-то не так?
0
stima
474 / 323 / 31
Регистрация: 22.03.2011
Сообщений: 1,047
Завершенные тесты: 2
18.11.2013, 23:52 #4
Не уверен, так как не вижу код полностью, но думаю, что вы принимаете на копию. Обратите внимание на мои 31 и 32 строки, там ссылка.
0
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
19.11.2013, 00:34  [ТС] #5
Извините, я Вас обманул, проект не ребилднулся потому и выдал не тот результат...
Объект создается здесь в момент присвоения объекта
C++
1
2
3
4
5
6
template <class T> void add()
    {
        T obj;
        map<int, T>& mapSome=getMap<T>();
        mapSome[obj.getId()]=obj;
    }
Есть варианты?
0
stima
474 / 323 / 31
Регистрация: 22.03.2011
Сообщений: 1,047
Завершенные тесты: 2
19.11.2013, 00:59 #6
C++
1
2
3
4
5
6
7
template <class T> void add()
{
        T obj; // это я так понимаю ок?
        map<int, T>& mapSome=getMap<T>();
 
        mapSome[obj.getId()]=obj; // основной ньюанс здесь. 
}
Обьясню подробно:
1. std::map при вызове operator[key], если по данному ключю нет value, то она его создает с конструктором по умолчанию.
2. Далее вызывается конструктор копирования T (const T&). Именно конструктор копирования, а не оператор присваивания, так как происходит инициализация копированием.

Далее зависит от компилятора и его оптимизаций (почитайте про RVO и NRVO). Так вот, тут может действовать частичный случай. T obj больше негде не участвует, и в зависимости "от погоды на марсе", компилятор может это переписать как
C++
1
2
3
4
5
template <class T> void add()
{
        map<int, T>& mapSome=getMap<T>();
        mapSome[obj.getId()] = T();
}
Добавлено через 10 минут
Цитата Сообщение от stima Посмотреть сообщение
Далее зависит от компилятора и его оптимизаций (почитайте про RVO и NRVO). Так вот, тут может действовать частичный случай. T obj больше негде не участвует, и в зависимости "от погоды на марсе", компилятор может это переписать как
Код C++
1
2
3
4
5
6
7
template <class T> void add()
{
* * * * map<int, T>& mapSome=getMap<T>();
* * * * mapSome[obj.getId()] = T();
}
Подкоректирую сам себя. obj участвует (вызывается obj.getId()) оптимизации не будет.
0
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
19.11.2013, 01:02  [ТС] #7
А если я не хочу частного случая, а что бы везде компилился одинаково, можно что-то сделать? как-то переписать?
0
stima
474 / 323 / 31
Регистрация: 22.03.2011
Сообщений: 1,047
Завершенные тесты: 2
19.11.2013, 01:08 #8
Вообще если честно я немного не пойму зачем вы создаете отдельно обьект T и как определяется его id.

Но а о том что вы спрашиваете, в c++11 ввели понятие move семантика и тогда
C++
1
some_map[obj.id()] = std::move(obj);
Иначе никак, так работают c++. Единственное можно "проконтролировать создание" обьекта, перегрузив конструктор копирования и оператор присваивания.
1
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
19.11.2013, 01:32 #9
C++
1
2
3
4
5
6
template <typename T>
void add( const T& value )
{
  auto& mapSome = getMap<T>();
  mapSome.emplace(value.getId(), value);
}
1
Tit_Vlad
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 28
19.11.2013, 19:26  [ТС] #10
Вот теперь работает! вот 2 рабочих варианта
C++
1
2
3
4
5
6
template <class T> void add()
    {
        /*T obj;
        getMap<T>().insert(pair<int,T>(obj.getId(), obj));*/
        getMap<T>()[(getMap<T>().size())+1];
    }
причина создания нового объекта была из-за того, что в это строке
C++
1
mapSome[obj.getId()]=obj;
при вхождении в operator[] с параметром которого еще нет в map он автоматически создает объект. Там был как раз тот случай, я создал объект и по его id(которого еще нет в map) пытался что-то записать. Извините сразу не понял, теперь вот дошло)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 19:26
Привет! Вот еще темы с ответами:

Как создают современные компьютерные игры? - C++
Интересно, как создают современные компьютерные игры?? То есть на каком языке программирования?? Я слышал в основном на с++!!! Кто нибудь...

В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться - C++
В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты...

Как создают маленькие приложения? (размером до ~50-70Кб) - C++
Доброго времени суток! Этот вопрос (Subject) меня интересует уже достаточно давно. Мне постоянно попадаются разнообразные оконные...

Определить взаимное расположение трех точек на плоскости (совпадают, на одной прямой, создают треугольник) - C++
точка на плоскости задается своими координатами. Создать программу, которая определяет взаимное расположение трех точек на плоскости...


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

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

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