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

как вернуть объект из ф-и, если, возможно, объекта не существует? - C++

Восстановить пароль Регистрация
 
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 10:46     как вернуть объект из ф-и, если, возможно, объекта не существует? #1
Пример:
C++
1
2
3
4
5
6
7
8
9
10
TTo4ka TForm1::GetPoint(const short &X,const short &Y)
{
 short Nom = p_MassivTo4ek[X][Y];
     if (Nom>0) //значит есть точка
   {
    return p_To4ka[Nom-1];
   }
   TTo4ka T;
   return T;
   }
т.е. ф-я по параметрам должна вернуть мне объект. Данная ф-я работает но, если первый return не срабатывает, я создаю объект в ф-и, который после ее закрытия не существует. Т.е., видимо не лучший вариант возврата объекта которого в принципе не существует, но по крайней мере работает. А вот вариант доработанный:
C++
1
2
3
4
5
6
7
8
9
10
TTo4ka &TForm1::GetPoint(const short &X,const short &Y)
{
 short Nom = p_MassivTo4ek[X][Y];
     if (Nom>0) //значит есть точка
   {
    return p_To4ka[Nom-1];
   }
   //   TTo4ka T;
   //   return T;
   }
А тут я хочу получить не объект а ссылку на объект. Что было бы более логично. Но тогда последний return не понятно как реализовать. Не могу я ссылаться на адрес которого не существует.
Спасибо за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2012, 10:46     как вернуть объект из ф-и, если, возможно, объекта не существует?
Посмотрите здесь:

Как сделать так, что если файл существует return true, если нет - return false C++
как вернуть массив и как неявно получить атрибут объекта C++
удаленный объект существует C++
C++ Класс строк, перегрузка операторов. Как вернуть объект класса
Как создать класс, где возможно создание только одного объекта? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.01.2012, 10:58     как вернуть объект из ф-и, если, возможно, объекта не существует? #2
Андрей2011, А почему объект то по вашему не существует? Вызывается сначала конструктор копирования, потом деструктор объекта от которого скопировали и скопированный объект возвращается. Ничего как бы не пропадает.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 11:06     как вернуть объект из ф-и, если, возможно, объекта не существует? #3
Цитата Сообщение от Андрей2011 Посмотреть сообщение
я создаю объект в ф-и, который после ее закрытия не существует
И что, что он в функции уже не существует. Так как вы возвращаете объект по значению, то он будет скопирован в место вызова и там начнёт существование. Так что первый вариант в принципе правильный - надо возвращать объект по значению, а не по ссылке.

Добавлено через 2 минуты

Не по теме:

Но это

Цитата Сообщение от Андрей2011 Посмотреть сообщение
TTo4ka
ппц... А почему бы не TT04ka, для полноты ощущений?

Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 11:13  [ТС]     как вернуть объект из ф-и, если, возможно, объекта не существует? #4
Да хоть TTTTo4ka. Вам то что?
Пишу на Builder, и в одной умной книжке прочитал что "T" ставят перед классом дабы подчеркнуть его принадлежность к компоненте. Вот и получилась TT04ka. Или TPoint. В сущности не важно.
Значит первый вариант вполне оправдан. Это радует. Ну а как быть со всторым вариантом?
Получается такая штука, что при реализации 1го варианта, при нахождении точки, она у меня копируется. А правильно было бы, думаю, возвращать адрес объекта точка. Как быть с вариантом №2 ?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 11:22     как вернуть объект из ф-и, если, возможно, объекта не существует? #5
Андрей2011,

Не по теме:

мой стёб был на счёт транслита, да ещё и литспика к нему в пару. Планируете серьёзно писать программы - избавляйтесь от этой привычки. Не планируете - забейте.


На счёт варианта 2 (да и варианта 1 в принципе тоже): здесь в принципе подошли бы исключения. Всё-таки несуществующая точка - плохая вещь, согласны? С другой стороны, эта ошибка может быть не настолько фатальной, чтобы считаться исключительной ситуацией. Тогда вариант такой: В классе хранить статический член-объект этого класса, который будет уникальным и призван сообщать о том, что поиск завершился неудачей. Именно так поступили разработчики std::string, добавив в него std::string::npos - индекс, никогда не являющийся валидным.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 11:43  [ТС]     как вернуть объект из ф-и, если, возможно, объекта не существует? #6
Так, уважаемый, silent_1991, поясните тогда уж в чем не правильно я назвал свой класс? Очень любопытно стало.
С элементом класса не вышло. (( Зато я еще раз все перепроверил и выяснил что при варианте, когда нет объекта, то ф-я возвращает 0. Что меня вполне устраивает.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 11:58     как вернуть объект из ф-и, если, возможно, объекта не существует? #7

Не по теме:

Цитата Сообщение от Андрей2011 Посмотреть сообщение
Так, уважаемый, silent_1991, поясните тогда уж в чем не правильно я назвал свой класс? Очень любопытно стало.
Как я уже и сказал, транслит в программировании неуместен. Класс "Точка"? Ну так назовите его Point (или, как вы сказали, принято в среде разработчиков на Builder, TPoint).



Цитата Сообщение от Андрей2011 Посмотреть сообщение
при варианте, когда нет объекта, то ф-я возвращает 0
А вот этого я не понял. Какая из функций возвращает 0? Первая? Тогда что подразумевается под нулём? Объект класса "Точка", инициализированный конструктором по умолчанию? Если же имеется ввиду вторая функция, то тут уж я совсем не понял, как может возвращаться 0.

Добавлено через 9 минут
Вот пример с реализацией статического члена, представляющего некий невалидный результат:
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
#include <iostream>
#include <vector>
#include <algorithm>
 
class Foo
{
public:
    static const Foo null;
    
public:
    Foo(int foo = 0):
    m_foo(foo)
    {
    }
    
    int get_foo() const
    {
        return m_foo;
    }
    
private:
    int m_foo;
};
 
const Foo Foo::null = Foo(-1);
 
bool operator==(const Foo& left, const Foo& right)
{
    return left.get_foo() == right.get_foo();
}
 
const Foo& find_foo(const std::vector<Foo>& vec, const Foo& val)
{
    std::vector<Foo>::const_iterator res = std::find(vec.begin(), vec.end(), val);
    
    return res == vec.end() ? Foo::null : *res;
}
 
int main()
{
    std::vector<Foo> vec;
    
    vec.push_back(Foo(1));
    vec.push_back(Foo(2));
    vec.push_back(Foo(3));
    
    std::cout << find_foo(vec, Foo(1)).get_foo() << std::endl
              << find_foo(vec, Foo(3)).get_foo() << std::endl
              << find_foo(vec, Foo(10)).get_foo() << std::endl;
    
    return 0;
}
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 12:02  [ТС]     как вернуть объект из ф-и, если, возможно, объекта не существует? #8
Нет. ммм...у меня у объекта есть ID. Присваиваю его при создании объекта.
Если объект не найден как в варианте 1, то ID=0;
А вот со 2м вариантом все хуже оказывается. Т.е. когда я делаю:
C++
1
2
3
4
5
6
7
TTo4ka &TForm1::GetPoint(const short &X,const short &Y)
{
 short Nom = p_MassivTo4ek[X][Y];
 
 return p_To4ka[Nom-1];
 
}
то вот возвращает мне ID=1.
Вариант со статическим объектом пробовал. В классе создается но вернуть вот не получается.
Пытался вот каким образом:
C++
1
2
3
4
5
6
7
8
9
10
TTo4ka &TForm1::GetPoint(const short &X,const short &Y)
{
 short Nom = p_MassivTo4ek[X][Y];
         if (Nom>0) //значит есть точка
   {
        return p_To4ka[Nom-1].nullPoint;    // nullPoint - статический объект
   }
   //   TTo4ka T;
   //   return T;
   }
Видимо я его как-то не правильно хочу использовать.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 12:10     как вернуть объект из ф-и, если, возможно, объекта не существует? #9
Андрей2011, посмотрите мой код.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 12:34  [ТС]     как вернуть объект из ф-и, если, возможно, объекта не существует? #10
Да, закручен сюжет.
Особенно вот это мне нравится:
C++
1
const Foo Foo::null
а потом еще и оператор отдельный. Мда. Но мысль понятна. Спасибо!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 12:42     как вернуть объект из ф-и, если, возможно, объекта не существует? #11
Андрей2011, оператор нужен, чтобы std::find работал. Если вы, конечно, об этом операторе.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 12:58  [ТС]     как вернуть объект из ф-и, если, возможно, объекта не существует? #12
а без оператора можно как-то присвоить этот самый статический объект?
например:
C++
1
2
  TTo4ka T;
  T = p_To4ka->nullPoint;    // nullPoint - статический объект
- тип как бы подходит. Но пишет мне все время
C++
1
[Linker Error] Error: Unresolved external 'TTo4ka::nullPoint' referenced from C:\MINE\ПРОГИ С++\POINT 2\DEBUG_BUILD\POINT2.OBJ
Добавлено через 3 минуты
Может проще, вот подумалось только что, создать глобальный объект TTo4ka. И присвоить ему нулевое значение. и возвращать его адрес на крайний случай))
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 13:00     как вернуть объект из ф-и, если, возможно, объекта не существует? #13
Андрей2011, оператор никак не относится к статическому объекту, я же сказал. Обращаться к объекту можно так:
C++
1
TTo4ka::nullPoint
Добавлено через 1 минуту
Андрей2011, всё же правильнее, если объект это будет располагаться в классе.
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
26.01.2012, 13:00     как вернуть объект из ф-и, если, возможно, объекта не существует? #14
а почему бы не возвращать указатель ??? там все просто, если вернуло null значит нет еще такой точечки , иначе работаем.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 13:15  [ТС]     как вернуть объект из ф-и, если, возможно, объекта не существует? #15
Согласен. не красиво когда вот глобальные объекты доп. создаются.
не хочет работать никак:
C++
1
2
  TTo4ka T;
T = TTo4ka::nullPoint;
может потому что Builder а не VC++
С указателями любопытная мысль. Просто в детстве меня учили 2м вещам. Говорить "спасибо" когда мне помогли, и использовать по возможности ссылки. )))
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 13:25     как вернуть объект из ф-и, если, возможно, объекта не существует? #16
Андрей2011, а вам зачем, скажите пожалуйста, этот временный объект T? Возвращайте сразу прямо TTo4ka::nullPoint.
А, ну и у вас же nullPoint объявлена как const? Если да, то надо либо возвращать константную ссылку, либо не объявлять nullPoint как const.
Андрей2011
29 / 23 / 2
Регистрация: 18.01.2011
Сообщений: 359
26.01.2012, 13:39  [ТС]     как вернуть объект из ф-и, если, возможно, объекта не существует? #17
ну возвращать тоже не получается. я решил что попробую сначала присвоить объект. Если сработает значит и вернуть обязан.
а в классе у меня вот что:
C++
1
2
public:
    static TTo4ka nullPoint;
вот это я и хочу присвоить. Никогда подобного не делал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2012, 14:14     как вернуть объект из ф-и, если, возможно, объекта не существует?
Еще ссылки по теме:

Что вернуть по ссылке, если объект функцией поиска не найден? C++
Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует? C++
C++ Как вернуть ссылку на объект?

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.01.2012, 14:14     как вернуть объект из ф-и, если, возможно, объекта не существует? #18
Ну так вы опять в мой код посмотрите, там же есть пример, как возвратить такой объект из функции по ссылке.
Yandex
Объявления
26.01.2012, 14:14     как вернуть объект из ф-и, если, возможно, объекта не существует?
Ответ Создать тему
Опции темы

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