Такой вопрос.
От: Аноним  
Дата: 26.07.05 09:52
Оценка:
Хай.

Есть функция :

TYPE& Get()
{
if(что-то не так) return ??? //А вот что return не знаю.NULL не подходит е-но TYPE пользовательский тип(класс). Если return TYPE(),то возврат адреса локальной переменнной — не хорошо. Если return *(new TYPE())
то если я Get() где-то вызову: TYPE a = Get(),а потом уйду из места вызова(функции какой-то например) "а" уничтожится как локальная переменаяя а память
останется распределенной и удалить ее уже низя ,тоже как-то нехорошо. Шо делать,или я где-то не догоняю?
}
Re: Такой вопрос.
От: Bell Россия  
Дата: 26.07.05 09:59
Оценка: 1 (1) +2
Здравствуйте, Аноним, Вы писали:

А>Хай.


А>Есть функция :


А>TYPE& Get()

А>{
А> if(что-то не так) return ??? //А вот что return не знаю.NULL не подходит е-но TYPE пользовательский тип(класс). Если return TYPE(),то возврат адреса локальной переменнной — не хорошо. Если return *(new TYPE())
А>то если я Get() где-то вызову: TYPE a = Get(),а потом уйду из места вызова(функции какой-то например) "а" уничтожится как локальная переменаяя а память
А>останется распределенной и удалить ее уже низя ,тоже как-то нехорошо. Шо делать,или я где-то не догоняю?
А>}

1. Обычно для функций с подобной логикой в качестве возвращаемого значения используется указатель, так что имеет смысл переделать на
TYPE* Get()
{
   if(...)
      return 0;
...
}


2. Завести специальное значение типа TYPE, и возвращать его. Простейший вариант может выглядеть так:
TYPE& Get()
{
   static TYPE empty_val;
   if(...)
      return empty_val;
...
}


3. Бросить исключение.
Любите книгу — источник знаний (с) М.Горький
Re: Такой вопрос.
От: Анатолий Широков СССР  
Дата: 26.07.05 10:02
Оценка:
Вариантов немного:

TYPE& Get()
{
   if( что-то не так )
      throw "что-то не так";
   return valid_object;
}

TYPE& Get()
{
   if( что-то не так )
   {
      static TYPE invalid_object;
      return invalid_object;
   }
   return valid_object;
}
Re: Такой вопрос.
От: MaximE Великобритания  
Дата: 26.07.05 10:06
Оценка:
wrote:

> Хай.

>
> Есть функция :
>
> TYPE& Get()
> {
> if(что-то не так) return ??? //А вот что return не знаю.NULL не подходит е-но TYPE пользовательский тип(класс). Если return TYPE(),то возврат адреса локальной переменнной — не хорошо. Если return *(new TYPE())
> то если я Get() где-то вызову: TYPE a = Get(),а потом уйду из места вызова(функции какой-то например) "а" уничтожится как локальная переменаяя а память
> останется распределенной и удалить ее уже низя ,тоже как-то нехорошо. Шо делать,или я где-то не догоняю?
> }

Возвращай указатель вместо ссылки. Тогда в случае неудачи возвращай нулевой указатель.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: Такой вопрос.
От: Аноним  
Дата: 26.07.05 10:11
Оценка:
MaximE:
Это понятно.Но вопрос был не чем заменить данную конструкцию,а как правильно работать именно с этой.
Поэтому ответ — замени ссылку на указатель,конечно, подходит,но немного не то
Всем сенкс.
Re[2]: Такой вопрос.
От: Аноним  
Дата: 26.07.05 10:19
Оценка:
Анатолий Широков:Угу..спасибо.
Re[2]: Такой вопрос.
От: Аноним  
Дата: 26.07.05 10:37
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Вариантов немного:


АШ>
АШ>TYPE& Get()
АШ>{
АШ>   if( что-то не так )
АШ>      throw "что-то не так";
АШ>   return valid_object;
АШ>}

АШ>TYPE& Get()
АШ>{
АШ>   if( что-то не так )
АШ>   {
АШ>      static TYPE invalid_object;
АШ>      return invalid_object;
АШ>   }
АШ>   return valid_object;
АШ>}
АШ>


А чего бы не return *(TYPE*)0? И проверять так:


TYPE &t = Get();

if( &t ){

}


Правда Bounds Checker'ы всякие ругаться могут.
Re[3]: Такой вопрос.
От: gbt Россия  
Дата: 26.07.05 11:00
Оценка:
Hello, , you wrote:


> А чего бы не return *(TYPE*)0? И проверять так:


Разименование нулевого указателя — это UB, воспользуйтесь поиском — сколько раз
уже обсуждалось...

Вобщем нельзя так делать, хотя свиду оно и работать будет.

--
Igor Polyakov — igorpol_gbt (at) mail (dot) ru
Posted via RSDN NNTP Server 1.9
Re[4]: Такой вопрос.
От: Аноним  
Дата: 26.07.05 11:15
Оценка:
gbt:

Свиду оно еще и смотрится жутко!!!
Re[4]: Такой вопрос.
От: Аноним  
Дата: 26.07.05 11:56
Оценка: :)
Здравствуйте, gbt, Вы писали:

>> А чего бы не return *(TYPE*)0? И проверять так:


gbt>Разименование нулевого указателя — это UB, воспользуйтесь поиском — сколько раз

gbt>уже обсуждалось...

gbt>Вобщем нельзя так делать, хотя свиду оно и работать будет.


В коммерческих проектах можно. Это ведь не open source, где и за goto помидорами закидают.
Re[5]: Такой вопрос.
От: Слоноежик  
Дата: 26.07.05 14:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В коммерческих проектах можно. Это ведь не open source, где и за goto помидорами закидают.

Попробуй — тогда линчуют свои
для забивания гвоздя надо выбирать правильный микроскоп.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.