check valid returned reference, handler2006, 01-Янв-12, 15:30 [смотреть все]Здравствуйте! Предположим, у нас имеется функция:
char* f() { char *ch = new(nothrow) char[1]; return (ch)? ch : -1; }
Таким образом, мы проверяем валидность возвращаемого указателя. А теперь предположим, что наша функция возвращает не указатель а ссылку на объект(определенный пользователем, в самом худшем случае) class A;A& f() { A a; return a; }
Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку, либо -1 ? Спасибо
|
- check valid returned reference, Alex, 18:01 , 01-Янв-12 (1)
>[оверквотинг удален] > class A; > A& f() > { > A a; > return a; > } > > Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку, > либо -1 ? > Спасибо Во-первых не "return a;", а "return &a;" Во-вторых: Определить в пользовательском классе метод, кот. возвращает ссылку вида "return this;" если все ресурсы нормально инициализированы
- check valid returned reference, handler2006, 22:21 , 01-Янв-12 (2)
Вы все перепутали - указанные Вами варианты относятся к первому методу с использованием указателей. Фактически, ссылка и указатель - одно и то же, за исключением того, что указатель может быть невалидный или нулевой, а ссылка ВСЕГДА! ссылается на объект, ее нельзя объявить без инициализации, хотя затем объект, на который ссылается ммылка, может быть удален. Так вот вопрос: как проверить валидность ссылки?
- check valid returned reference, Alex, 12:15 , 02-Янв-12 (3)
> Вы все перепутали - указанные Вами варианты относятся к первому методу с > использованием указателей. > Фактически, ссылка и указатель - одно и то же, за исключением того, > что указатель может быть невалидный или нулевой, а ссылка ВСЕГДА! ссылается > на объект, ее нельзя объявить без инициализации, хотя затем объект, на > который ссылается ммылка, может быть удален. > Так вот вопрос: как проверить валидность ссылки?Думаю Вы не первый, кто столкнулся с данной проблемой. Я для себя сделал класс-обертку над указателем и методы get,set, reset, close, кот. обрабатывают адекватно указатель. class A{ char *i; public: A(){i=NULL;}; char *get(){if(i!=NULL) return i; else return NULL;} char set(char &str){ if(str != NULL){if(i!=NULL) i = str; else{ delete[] i; i = str}} } char close(){delete[] i; i = NULL;} }; но тут возникает другая проблема - методы данного класса работают с "внешним" блоком памяти, и если вызван close, а со старым указателем, что либо делают - то экзепшн не избежать. Другого выхода лично я не вижу.
- check valid returned reference, del, 14:11 , 24-Фев-12 (4) +1
>[оверквотинг удален] > class A; > A& f() > { > A a; > return a; > } > > Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку, > либо -1 ? > Спасибо facepalm. Возврат ссылки на локальный объект...
- check valid returned reference, Alex_S, 03:30 , 02-Мрт-12 (5)
> facepalm. Возврат ссылки на локальный объект... да ладно вам.. может, автор фрагментацию памяти изучает ;)
- check valid returned reference, pavlinux, 22:50 , 02-Мрт-12 (6)
> Здравствуйте! > Предположим, у нас имеется функция: > > char* f() > { > char *ch = new(nothrow) char[1]; > return (ch)? ch : -1; > } > Зачем в С++ юзать чистый С??? Вам чё, стринги малы, напурква чар?
|