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

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

Восстановить пароль Регистрация
 
Валеркуй
 Аватар для Валеркуй
2 / 2 / 0
Регистрация: 17.06.2013
Сообщений: 120
26.05.2014, 21:19     Как функции возвратить ссылку на объект? #1
C++
1
2
3
4
5
6
7
8
9
//Есть некая функция что писать перед функцией??? Инт написал.
int func(){
// Создаем какой-то обьект
Obj object_1;
//что-то с ней делаем
object_1.costum_method();
//Как написать return чтобы функция возратила ссылку на объект?
return object_1;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jewbacabra
1789 / 1504 / 538
Регистрация: 24.04.2014
Сообщений: 4,215
26.05.2014, 21:21     Как функции возвратить ссылку на объект? #2
Валеркуй, никогда не возвращай ссылку или указатель на локальный объект
Валеркуй
 Аватар для Валеркуй
2 / 2 / 0
Регистрация: 17.06.2013
Сообщений: 120
26.05.2014, 21:24  [ТС]     Как функции возвратить ссылку на объект? #3
Jewbacabra, Я дело в том что не знаю как мне так сделать!!!(я от фонаря написал функцию) Просто есть объект который загружает текстуры, мне надо впихнуть его в отдельную функцию, которая потом возратит ссылку на этот объект!!!
Jewbacabra
1789 / 1504 / 538
Регистрация: 24.04.2014
Сообщений: 4,215
26.05.2014, 21:25     Как функции возвратить ссылку на объект? #4
Вот более-менее адекватный вариант
C++
1
2
3
4
Obj& func(Obj& object_1) {
    object_1.custom_method();
    return object_1;
}
Добавлено через 1 минуту
Цитата Сообщение от Валеркуй Посмотреть сообщение
функцию, которая потом возратит ссылку на этот объект!!!
На какой объект? После выполнения функции этот объект будет уничтожен
Валеркуй
 Аватар для Валеркуй
2 / 2 / 0
Регистрация: 17.06.2013
Сообщений: 120
26.05.2014, 21:30  [ТС]     Как функции возвратить ссылку на объект? #5
Смотри, есть у меня такая функция:
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 Посмотреть сообщение
Вот более-менее адекватный вариант
Пробую.
Jewbacabra
1789 / 1504 / 538
Регистрация: 24.04.2014
Сообщений: 4,215
26.05.2014, 21:37     Как функции возвратить ссылку на объект? #6
Валеркуй, создавай динамически и возвращай указатель
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;
}
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.05.2014, 21:39     Как функции возвратить ссылку на объект? #7
Цитата Сообщение от Jewbacabra Посмотреть сообщение
создавай динамически и возвращай указатель
И сразу же вопрос без ответа: кто должен освобождать память. Потом начинает хотеться смартпоинтеров или еще чего... Наверняка тут все проще, но автор так формулирует вопрос, что я вообще не понимаю что ему нужно.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
26.05.2014, 21:41     Как функции возвратить ссылку на объект? #8
А объект вернуть - не? Если беспокоишься о скорости (по мне так зря, не об этом тебе сейчас беспокоиться нужно), так есть перемещающие конструкторы (constructor(constructor&& c), в C++ 11) .
Валеркуй
 Аватар для Валеркуй
2 / 2 / 0
Регистрация: 17.06.2013
Сообщений: 120
26.05.2014, 21:46  [ТС]     Как функции возвратить ссылку на объект? #9
Да емае!!!
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 Посмотреть сообщение
автор так формулирует вопрос
Что-то на пдобие этого, только у меня ошибка идет.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.05.2014, 21:47     Как функции возвратить ссылку на объект? #10
Цитата Сообщение от Валеркуй Посмотреть сообщение
у меня ошибка идет.
Какая? Телепатов нет.
Валеркуй
 Аватар для Валеркуй
2 / 2 / 0
Регистрация: 17.06.2013
Сообщений: 120
26.05.2014, 21:51  [ТС]     Как функции возвратить ссылку на объект? #11
Цитата Сообщение от Jewbacabra Посмотреть сообщение
создавай дина
Соооовсем нетак.

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

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

Добавлено через 7 минут
Вот такой код запустился и работает:
http://pastebin.com/AbiWP5qM
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
27.05.2014, 05:23     Как функции возвратить ссылку на объект? #14
Жесть, вот только глобальных переменных нам не хватало.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2014, 20:44     Как функции возвратить ссылку на объект?
Еще ссылки по теме:

C++ Как возвратить несколько значений в функции?
C++ Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С
C++ Как вернуть ссылку на объект?

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

Или воспользуйтесь поиском по форуму:
Валеркуй
 Аватар для Валеркуй
2 / 2 / 0
Регистрация: 17.06.2013
Сообщений: 120
28.05.2014, 20:44  [ТС]     Как функции возвратить ссылку на объект? #15
Ахахах! Это не глобальные переменные, это .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 Посмотреть сообщение
Жесть, вот только
Спасибо тебе =) Сейчас весь код привожу в более удобочитаемый вариант!
Yandex
Объявления
28.05.2014, 20:44     Как функции возвратить ссылку на объект?
Ответ Создать тему
Опции темы

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