TYPE& Get()
{
if(что-то не так) return ??? //А вот что return не знаю.NULL не подходит е-но TYPE пользовательский тип(класс). Если return TYPE(),то возврат адреса локальной переменнной — не хорошо. Если return *(new TYPE())
то если я Get() где-то вызову: TYPE a = Get(),а потом уйду из места вызова(функции какой-то например) "а" уничтожится как локальная переменаяя а память
останется распределенной и удалить ее уже низя ,тоже как-то нехорошо. Шо делать,или я где-то не догоняю?
}
Здравствуйте, Аноним, Вы писали:
А>Хай.
А>Есть функция :
А>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()
{
if( что-то не так )
throw"что-то не так";
return valid_object;
}
TYPE& Get()
{
if( что-то не так )
{
static TYPE invalid_object;
return invalid_object;
}
return valid_object;
}
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;
АШ>}
АШ>
Разименование нулевого указателя — это 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 помидорами закидают.
Здравствуйте, Аноним, Вы писали:
А>В коммерческих проектах можно. Это ведь не open source, где и за goto помидорами закидают.
Попробуй — тогда линчуют свои
для забивания гвоздя надо выбирать правильный микроскоп.