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

Функция, возвращающая указатель - C++

Восстановить пароль Регистрация
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
12.12.2013, 22:59     Функция, возвращающая указатель #1
Здравствуйте.
Пускай есть класс Some_type и массив такого класса. Можно ли функцией Some_type* some_name (some_type) заполнять массив, если ею возвращается указатель на объект созданный с помощью new?

И мой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Pizza db[count];
 
  for (int i {}; i < count; ++i)
  {
    *(db+1) = get_item();
  }
 
Pizza* get_item();
{
    Pizza* item = new Pizza;
    cout << "\nEnter name of product:\n";
    cin.getline(item->name, arr_size);
    cout <<  "\nEnter name of manufacturer:\n";
    cin.getline(item->mnfc, arr_size);
    cout <<  "\nEnter size of pizza:\n";
    cin >> item->dmtr;
    cin.get();
    cout <<  "\nEnter mass of product:\n";
    cin >> item->mass;
    cin.get();
 
    return item;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 23:12     Функция, возвращающая указатель #2
Можно.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
12.12.2013, 23:16  [ТС]     Функция, возвращающая указатель #3
А почему тогда мне такую ошибку выдает?
error: no match for ‘operator=’ in ‘*(((Pizza*)(& db)) + 80u) = get_item()’|
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 23:32     Функция, возвращающая указатель #4
У вас же массив не указателей. Что вы в массив пытаетесь указатель поместить?
C++
1
*(db + i) = *get_item();
Только утечка памяти будет. Сначала сохраните указатель, потом поместите содержимое по указателю в массив, потом освободите память под указателем.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
12.12.2013, 23:41  [ТС]     Функция, возвращающая указатель #5
Спасибо!
Вы имелли ввиду примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Pizza* get_item()
{
    Pizza* item = new Pizza;
    cout << "\nEnter name of product:\n";
    cin.getline(item->name, arr_size);
    cout <<  "\nEnter name of manufacturer:\n";
    cin.getline(item->mnfc, arr_size);
    cout <<  "\nEnter size of pizza:\n";
    cin >> item->dmtr;
    cin.get();
    cout <<  "\nEnter mass of product:\n";
    cin >> item->mass;
    cin.get();
    Pizza item_copy;
    item_copy = *item;
    delete item;
    return &item_copy;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 23:50     Функция, возвращающая указатель #6
Цитата Сообщение от andrejap Посмотреть сообщение
Вы имелли ввиду примерно так:
Нет, я имел ввиду так (get_item() из первого поста):
C++
1
2
3
4
5
6
for (int i = 0; i < count; ++i)
{
    Piza* p = get_item();
    *(db + i) = *p;
    delete p;
}
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.12.2013, 00:06  [ТС]     Функция, возвращающая указатель #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Только утечка памяти будет.
Простите, а где же там будет утечка? Вот где может быть утечка в функции, кажется, понимаю. А вот в вызывающей ф-ии - не пойму.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.12.2013, 00:11     Функция, возвращающая указатель #8
Цитата Сообщение от andrejap Посмотреть сообщение
Простите, а где же там будет утечка?
Там - это где?
Цитата Сообщение от alsav22 Посмотреть сообщение
Только утечка памяти будет.
Я разве указал место? Утечка памяти будет в коде из первого поста.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.12.2013, 00:16  [ТС]     Функция, возвращающая указатель #9
То есть, если не гнаться за рационализмом, то и мой исправленный вариант прокатывает (где есть return &item_copy)?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.12.2013, 00:25     Функция, возвращающая указатель #10
Утечка памяти - это когда теряется возможность доступа к динамически выделенной памяти. А теперь скажите: в каком месте вашего кода (из первого поста) теряется такой доступ?

Добавлено через 7 минут
Цитата Сообщение от andrejap Посмотреть сообщение
То есть, если не гнаться за рационализмом, то и мой исправленный вариант прокатывает (где есть return &item_copy)?
Если очень сильно не гнаться...
Цитата Сообщение от andrejap Посмотреть сообщение
где есть return &item_copy
Лучше так не делать, компилятор пишет:
C++
1
warning C4172: возвращение адреса локальной или временной переменной
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.12.2013, 00:38  [ТС]     Функция, возвращающая указатель #11
Получается, функция get_item выделяет память, значение в этих ячейках затем идет в цикл. Но при новых "циркуляциях" цикла, эти ячейки остаются заняты значениями, а доступ к ним теряется. Да?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.12.2013, 00:46     Функция, возвращающая указатель #12
В общем и целом, да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2013, 00:47     Функция, возвращающая указатель
Еще ссылки по теме:

Структура и функция, возвращающая указатель на структуру C++
C++ Функция, возвращающая умный указатель
C++ Функция, возвращающая указатель на двумерный массив

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

Или воспользуйтесь поиском по форуму:
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
13.12.2013, 00:47  [ТС]     Функция, возвращающая указатель #13
Мерси.
Yandex
Объявления
13.12.2013, 00:47     Функция, возвращающая указатель
Ответ Создать тему
Опции темы

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