Здравствуйте!
Предположим, у нас имеется функция:
char* f()
{
char *ch = new(nothrow) char[1];
return (ch)? ch : -1;
}
Таким образом, мы проверяем валидность возвращаемого указателя.
А теперь предположим, что наша функция возвращает не указатель а ссылку на объект(определенный пользователем, в самом худшем случае)
class A;A& f()
{
A a;
return a;
}
Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку, либо -1 ?
Спасибо
>[оверквотинг удален]
> class A;
> A& f()
> {
> A a;
> return a;
> }
>
Во-первых не "return a;", а "return &a;"
Во-вторых: Определить в пользовательском классе метод, кот. возвращает ссылку вида "return this;" если все ресурсы нормально инициализированы
Вы все перепутали - указанные Вами варианты относятся к первому методу с использованием указателей.
Фактически, ссылка и указатель - одно и то же, за исключением того, что указатель может быть невалидный или нулевой, а ссылка ВСЕГДА! ссылается на объект, ее нельзя объявить без инициализации, хотя затем объект, на который ссылается ммылка, может быть удален.
Так вот вопрос: как проверить валидность ссылки?
> Вы все перепутали - указанные Вами варианты относятся к первому методу с
> использованием указателей.
> Фактически, ссылка и указатель - одно и то же, за исключением того,
> что указатель может быть невалидный или нулевой, а ссылка ВСЕГДА! ссылается
> на объект, ее нельзя объявить без инициализации, хотя затем объект, на
> который ссылается ммылка, может быть удален.
> Так вот вопрос: как проверить валидность ссылки?Думаю Вы не первый, кто столкнулся с данной проблемой. Я для себя сделал класс-обертку над указателем и методы 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, а со старым указателем, что либо делают - то экзепшн не избежать. Другого выхода лично я не вижу.
>[оверквотинг удален]
> class A;
> A& f()
> {
> A a;
> return a;
> }
>
> Как в таком случае проверить валидность ссылки и вернуть либо саму ссылку,
> либо -1 ?
> Спасибоfacepalm. Возврат ссылки на локальный объект...
> facepalm. Возврат ссылки на локальный объект...да ладно вам.. может, автор фрагментацию памяти изучает ;)
> Здравствуйте!
> Предположим, у нас имеется функция:
>
> char* f()
> {
> char *ch = new(nothrow) char[1];
> return (ch)? ch : -1;
> }
>Зачем в С++ юзать чистый С??? Вам чё, стринги малы, напурква чар?