Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/47: Рейтинг темы: голосов - 47, средняя оценка - 4.55
 Аватар для Валеркуй
2 / 2 / 3
Регистрация: 17.06.2013
Сообщений: 122

Как функции возвратить ссылку на объект?

26.05.2014, 21:19. Показов 8950. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
//Есть некая функция что писать перед функцией??? Инт написал.
int func(){
// Создаем какой-то обьект
Obj object_1;
//что-то с ней делаем
object_1.costum_method();
//Как написать return чтобы функция возратила ссылку на объект?
return object_1;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.05.2014, 21:19
Ответы с готовыми решениями:

Что можно возвратить из функции если нужный объект не создан
Добрый день! Есть функции, которые возвращают указатели на двумерные массивы, но заполнение и создание массива происходит после...

Как возвратить указатель на объект, созданный в методе?
A* B::ReturnPtrA(){ A a; a.Method1(a.Method2()); //... return &a; } Говорит, что нельзя возвращать указатель...

Как преобразовать ссылку на объект в указатель на этот объект?
Как преобразовать ссылку на объект в указатель на этот объект? Буду благодарен за помощь.

14
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
26.05.2014, 21:21
Валеркуй, никогда не возвращай ссылку или указатель на локальный объект
0
 Аватар для Валеркуй
2 / 2 / 3
Регистрация: 17.06.2013
Сообщений: 122
26.05.2014, 21:24  [ТС]
Jewbacabra, Я дело в том что не знаю как мне так сделать!!!(я от фонаря написал функцию) Просто есть объект который загружает текстуры, мне надо впихнуть его в отдельную функцию, которая потом возратит ссылку на этот объект!!!
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
26.05.2014, 21:25
Вот более-менее адекватный вариант
C++
1
2
3
4
Obj& func(Obj& object_1) {
    object_1.custom_method();
    return object_1;
}
Добавлено через 1 минуту
Цитата Сообщение от Валеркуй Посмотреть сообщение
функцию, которая потом возратит ссылку на этот объект!!!
На какой объект? После выполнения функции этот объект будет уничтожен
0
 Аватар для Валеркуй
2 / 2 / 3
Регистрация: 17.06.2013
Сообщений: 122
26.05.2014, 21:30  [ТС]
Смотри, есть у меня такая функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void kf_loop_avtorize(sf::RenderWindow & window){
        
        sf::Texture t_hero;
        t_hero.loadFromFile("C:/resources/login.png");      
        sf::Sprite s_hero;
        s_hero.setTexture(t_hero);
 
        while (window.isOpen())
        {
            kf_event(window);
            window.draw(s_hero);
            window.display();
        }
}
Мне нужно Строки
C++
1
2
3
4
         sf::Texture t_hero;
        t_hero.loadFromFile("C:/resources/login.png");      
        sf::Sprite s_hero;
        s_hero.setTexture(t_hero);
Вынести в отдельную функцию! Которая возвратит s_hero. и использовать его в цикле, для отображения window.draw(s_hero);

Добавлено через 1 минуту
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Вот более-менее адекватный вариант
Пробую.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
26.05.2014, 21:37
Валеркуй, создавай динамически и возвращай указатель
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sf::Texture* kf_loop_avtorize(sf::RenderWindow & window){
        
        sf::Texture t_hero;
        t_hero.loadFromFile("C:/resources/login.png");      
        sf::Sprite* ptr_s_hero = new sf::Sprite;
        ptr_s_hero->setTexture(t_hero);
 
        while (window.isOpen())
        {
            kf_event(window);
            window.draw(*s_hero);
            window.display();
        }
        return ptr_s_hero;
}
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.05.2014, 21:39
Цитата Сообщение от Jewbacabra Посмотреть сообщение
создавай динамически и возвращай указатель
И сразу же вопрос без ответа: кто должен освобождать память. Потом начинает хотеться смартпоинтеров или еще чего... Наверняка тут все проще, но автор так формулирует вопрос, что я вообще не понимаю что ему нужно.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
26.05.2014, 21:41
А объект вернуть - не? Если беспокоишься о скорости (по мне так зря, не об этом тебе сейчас беспокоиться нужно), так есть перемещающие конструкторы (constructor(constructor&& c), в C++ 11) .
1
 Аватар для Валеркуй
2 / 2 / 3
Регистрация: 17.06.2013
Сообщений: 122
26.05.2014, 21:46  [ТС]
Да емае!!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void kf_loop_avtorize(sf::RenderWindow & window){
        sf::Sprite s_hero = kf_load();
        while (window.isOpen())
        {
            kf_event(window);
            window.draw(s_hero);
            window.display();
        }
}
 sf::Sprite kf_load(){
        sf::Texture t_hero;
        t_hero.loadFromFile("C:/resources/login.png");      
        sf::Sprite s_hero;
        s_hero.setTexture(t_hero);
        return s_hero;
 }
Цитата Сообщение от 0x10 Посмотреть сообщение
автор так формулирует вопрос
Что-то на пдобие этого, только у меня ошибка идет.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.05.2014, 21:47
Цитата Сообщение от Валеркуй Посмотреть сообщение
у меня ошибка идет.
Какая? Телепатов нет.
0
 Аватар для Валеркуй
2 / 2 / 3
Регистрация: 17.06.2013
Сообщений: 122
26.05.2014, 21:51  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
создавай дина
Соооовсем нетак.

Добавлено через 1 минуту
Цитата Сообщение от 0x10 Посмотреть сообщение
Какая? Телепатов нет.
Правильно, так как изначально я сделал нерабочий пример.
1>c:\users\lol\documents\visual studio 2008\projects\kfni.ho.ua\kfni.ho.ua\kf_r ender_draw.h(13) : error C3861: kf_load: идентификатор не найден
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
26.05.2014, 21:52
Цитата Сообщение от Валеркуй Посмотреть сообщение
1>c:\users\lol\documents\visual studio 2008\projects\kfni.ho.ua\kfni.ho.ua\kf_r ender_draw.h(13) : error C3861: kf_load: идентификатор не найден
Чтобы исправить это, нужно объявление функции поместить до ее использования.
0
 Аватар для Валеркуй
2 / 2 / 3
Регистрация: 17.06.2013
Сообщений: 122
26.05.2014, 22:03  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Чтобы исправить это, нужно объявление функции поместить до ее использования.
(код компилит)Крашится.
http://pastebin.com/FpCrW7n8

sf::Sprite kf_load()функция должна сработать в kf_loop_avtorize 1 раз
чтобы потом kf_loop_avtorize могла использовать объект s_hero в while
П.С. Хм не знал что нужно функцию объявлять до ее использования

Добавлено через 7 минут
Вот такой код запустился и работает:
http://pastebin.com/AbiWP5qM
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
27.05.2014, 05:23
Жесть, вот только глобальных переменных нам не хватало.
1
 Аватар для Валеркуй
2 / 2 / 3
Регистрация: 17.06.2013
Сообщений: 122
28.05.2014, 20:44  [ТС]
Ахахах! Это не глобальные переменные, это .h файлик одной функции.
Вот структурная последовательность!
main.cpp
C++
1
2
3
4
5
6
7
8
9
/*Начало программы чат.*/
#include "room.h"
int main()
{
    //Создать объект и запустить уровень авторизации.
    ROOM room;
    room.autorize();
return 0;
}
room.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
/* Глобальные комнаты*/
#include "kf_render.h"
 
class ROOM{
public:
    void autorize(){
        //уровень редндера
        KF_Render Start;
        //запуск отрисовки
        Start.start();
    }
 
};
kf_render.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <SFML/Graphics.hpp>
#include "kf_render_draw.h"
#include <iostream>
using namespace std;
 
class KF_Render{
public:
    void start(){
        //создание окна
        sf::RenderWindow window(sf::VideoMode(800, 600), "Besedka V2.0");
        kf_loop_avtorize(window);
        cout << "Next lvl" <<endl;
    }
};
kf_render_draw.h
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <SFML/Graphics.hpp>
//фон
sf::Sprite s_hero;
sf::Texture t_hero;
//кнопка
sf::Sprite s_button_0;
sf::Texture t_button_0;
//вектор для мыши
sf::Vector2i pos;
//уровневая переменная
int level_value = 0;
 
//функция загрузки текстур
void kf_load(){
        t_hero.loadFromFile("C:/resources/login.png");      
        s_hero.setTexture(t_hero);
 
        t_button_0.loadFromFile("C:/resources/button_0.png");
        s_button_0.setTexture(t_button_0);
        s_button_0.setPosition(450,285);
}
//обработка событий закрытия окна
void kf_event(sf::RenderWindow & window){
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
}
//Кнопки авторизации
void kf_mouse(sf::RenderWindow & window){
 
    pos = sf::Mouse::getPosition(window);
    //кнопка логина
    s_button_0.setTextureRect(sf::IntRect(0, 0, 170, 55));
    if ((pos.x > 450) && (pos.x <620) && (pos.y > 285) && (pos.y < 340))
    {
        s_button_0.setTextureRect(sf::IntRect(0, 56, 170, 55));
        
        if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
        {
            level_value = 1;
        }
    }
 
}
//главный игровой цикл
int kf_loop_avtorize(sf::RenderWindow & window){
        
        kf_load();
        //уровень авторизации
        while (window.isOpen() && (level_value == 0))
        {
            
            kf_event(window);
            if (level_value == 0)
            {
                kf_mouse(window);
                window.draw(s_hero);
                window.draw(s_button_0);
            }
            if (level_value == 1)
            {
                kf_mouse(window);
                window.draw(s_hero);
            }
 
            window.display();
        }
        //уровень нажатия кнопки регистрации
        while (window.isOpen() && (level_value == 1))
        {
            
            kf_event(window);
            if (level_value == 1)
            {
                kf_mouse(window);
                window.draw(s_hero);
            }
 
            window.display();
        }
 
        return 0;
}
Я пока ничего не оптимизировал и есть многомного ненужного.
Например room.hpp можно вообще удалить

Добавлено через 14 минут
Цитата Сообщение от 0x10 Посмотреть сообщение
Жесть, вот только
Спасибо тебе =) Сейчас весь код привожу в более удобочитаемый вариант!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.05.2014, 20:44
Помогаю со студенческими работами здесь

Как возвратить несколько значений в функции?
Функция, реализующая обобщенный алгоритм Евклида. Нужно вернуть 3 значения: gcd, x и y. То есть нужно возвратить значения массива U....

Как принять и возвратить массив в другой функции?
пример: прототип функции ??? int main() { создаём функцию которая задаёт массив b выводим обнавлённый массив }

Как вернуть ссылку на объект?
Вот код из книжки А.Крупника &quot;Изучаем С++&quot; char suits = {'','—','','’'}; char cds = {'6','7','8','9','A','‚','„','Š','’'}; ...

Как возвратить созданый динамический двухмерный массив из функции в main?
Надо из функции mtx возвртить матрицу в главную функцию. Матрица создаеться и заполняеться в mtx. Подскажите как правильно его...

Зачем при перегрузке оператора >> в параметр включать ссылку на объект, а не сам объект?
Зачем в параметры функции включать ссылку на объект: istream &amp;operator&gt;&gt;(istream &amp;stream, myclass &amp;ob) Почему не работает так:...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru