The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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, !*! pavlinux, 22:50 , 02-Мрт-12 (6)
    > Здравствуйте!
    > Предположим, у нас имеется функция:
    >
     
    > char* f()
    > {
    >      char *ch = new(nothrow) char[1];
    >      return (ch)? ch : -1;
    > }
    >

    Зачем в С++ юзать чистый С??? Вам чё, стринги малы, напурква чар?





Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру