Function returning a "null" reference object

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Pablo J Royo

    Function returning a "null" reference object

    Hello:

    i have a function that reads a file as an argument and returns a reference
    to an object that contains some information obtained from the file: FData
    &ReadFile(strin g FilePath);

    But , for example, when the file doesnt exists, i should not return any
    reference to a bad constructed object, so i need something as a NULL
    reference object. I suppose i could return a pointer instead, but i have
    some code written with references which I´d like to preserve...
    ¿How can i do that?



  • Attila Feher

    #2
    Re: Function returning a "null&quot ; reference object

    Pablo J Royo wrote:[color=blue]
    > Hello:
    >
    > i have a function that reads a file as an argument and returns a
    > reference to an object that contains some information obtained from
    > the file: FData &ReadFile(strin g FilePath);
    >
    > But , for example, when the file doesnt exists, i should not return
    > any reference to a bad constructed object, so i need something as a
    > NULL reference object. I suppose i could return a pointer instead,
    > but i have some code written with references which I´d like to
    > preserve...[/color]

    You can throw an exception.

    BTW how do you return that reference? What does it refer to? I hope not an
    automatic variable.
    [color=blue]
    > ¿How can i do that?[/color]

    No need for that upside down question mark. :-)

    --
    Attila aka WW


    Comment

    • Pablo J Royo

      #3
      Re: Function returning a "null&quot ; reference object

      Thanks for your response.
      I had an object allocated with new inside the function (FData *pData =
      new...) , and i returned its contents (return *pData) but this gave me all
      kind of problems when i put the returned object in a STL vector container,
      so in fact I changed my declaration to be

      FData &ParseFileTags( FData &Ret,char *path)

      If all goes well, Ret contains good data after this call and i return that
      same object. If not, I dont want to return a reference to that object, but
      to another "NULL" object instead, or something that allows me to write

      result = ParseFileTags(R et,path);
      if (result == NULL)
      ....
      else
      .....

      I would prefer not to use exceptions, but as i write this i realize it may
      be the only true solution...


      "Attila Feher" <attila.feher@l mf.ericsson.se> escribió en el mensaje
      news:bkp207$88i $1@newstree.wis e.edt.ericsson. se...[color=blue]
      > Pablo J Royo wrote:[color=green]
      > > Hello:
      > >
      > > i have a function that reads a file as an argument and returns a
      > > reference to an object that contains some information obtained from
      > > the file: FData &ReadFile(strin g FilePath);
      > >
      > > But , for example, when the file doesnt exists, i should not return
      > > any reference to a bad constructed object, so i need something as a
      > > NULL reference object. I suppose i could return a pointer instead,
      > > but i have some code written with references which I´d like to
      > > preserve...[/color]
      >
      > You can throw an exception.
      >
      > BTW how do you return that reference? What does it refer to? I hope not[/color]
      an[color=blue]
      > automatic variable.
      >[color=green]
      > > ¿How can i do that?[/color]
      >
      > No need for that upside down question mark. :-)
      >
      > --
      > Attila aka WW
      >
      >[/color]


      Comment

      • Frank Schmitt

        #4
        Re: Function returning a &quot;null&quot ; reference object

        "Pablo J Royo" <royop@tb-solutions.com> writes:
        [color=blue]
        > Hello:
        >
        > i have a function that reads a file as an argument and returns a reference
        > to an object that contains some information obtained from the file: FData
        > &ReadFile(strin g FilePath);[/color]

        Make that FData& ReadFile(const string& FilePath).
        I'm curious - why are you returning by reference? Is this some static data
        in ReadFile()?
        [color=blue]
        > But , for example, when the file doesnt exists, i should not return any
        > reference to a bad constructed object, so i need something as a NULL
        > reference object. I suppose i could return a pointer instead, but i have
        > some code written with references which I´d like to preserve...
        > ¿How can i do that?[/color]

        Depending on whether you can change the signature of ReadFile() and/or
        what you want to do in case of error, you have (at least) the following
        possibilities:

        - add a flag to ReadFile() that indicates whether the read was successfull
        i.e. FData& ReadFile (const string& FilePath, bool& Success)
        or even bool ReadFile(const string& FilePath, FData& Data)
        - throw an exception in case of failure, and handle it in the caller
        - implement the NullObject Pattern (see "Refactorin g", Fowler et al); in
        short, derive a class NullFData from FData, implement the necessary
        member functions as doing nothing or returning default values, and
        return a NullFData from ReadFile() if the file doesn't exist

        HTH & kind regards
        frank

        --
        Frank Schmitt
        4SC AG phone: +49 89 700763-0
        e-mail: frankNO DOT SPAMschmitt AT 4sc DOT com

        Comment

        • Attila Feher

          #5
          Re: Function returning a &quot;null&quot ; reference object

          Pablo J Royo wrote:

          PLEASE do not top post and SNIP!



          Thanx.
          [color=blue]
          > Thanks for your response.
          > I had an object allocated with new inside the function (FData *pData =
          > new...) , and i returned its contents (return *pData) but this gave
          > me all kind of problems when i put the returned object in a STL
          > vector container, so in fact I changed my declaration to be
          >
          > FData &ParseFileTags( FData &Ret,char *path)[/color]

          That is a memory leak waiting to happen. Instead of a reference return a
          smart pointer. Something like the boost one.

          What you do is you are making trial and error to hide your missing knowledge
          about new/delete and containers. Not a good think. Have you ever tried to
          find out what were those "weird things" with the vector and most importantly
          *why*? What you have made here is a program, which will eat up its
          resources.
          [color=blue]
          > If all goes well, Ret contains good data after this call and i return
          > that same object. If not, I dont want to return a reference to that
          > object, but to another "NULL" object instead, or something that
          > allows me to write
          >
          > result = ParseFileTags(R et,path);
          > if (result == NULL)
          > ...
          > else
          > ....
          >
          > I would prefer not to use exceptions, but as i write this i realize
          > it may be the only true solution...[/color]
          [SNIP]

          Not necessarily. You can return a boost::shared_p tr or something like that
          and check if it has a valid pointer inside. IIRC it goes exactly like with
          a normal pointer.

          --
          Attila aka WW


          Comment

          • Gavin Deane

            #6
            Re: Function returning a &quot;null&quot ; reference object

            "Pablo J Royo" <royop@tb-solutions.com> wrote in message news:<HqUbb.516 $Hd.297012@news-reader.eresmas. com>...

            <please don't top post - thank you - rearranged>
            [color=blue]
            > "Attila Feher" <attila.feher@l mf.ericsson.se> escribió en el mensaje
            > news:bkp207$88i $1@newstree.wis e.edt.ericsson. se...[color=green]
            > > Pablo J Royo wrote:[color=darkred]
            > > > Hello:
            > > >
            > > > i have a function that reads a file as an argument and returns a
            > > > reference to an object that contains some information obtained from
            > > > the file: FData &ReadFile(strin g FilePath);
            > > >
            > > > But , for example, when the file doesnt exists, i should not return
            > > > any reference to a bad constructed object, so i need something as a
            > > > NULL reference object. I suppose i could return a pointer instead,
            > > > but i have some code written with references which I´d like to
            > > > preserve...[/color]
            > >
            > > You can throw an exception.[/color][/color]

            <snip>
            [color=blue]
            > FData &ParseFileTags( FData &Ret,char *path)
            >
            > If all goes well, Ret contains good data after this call and i return that
            > same object. If not, I dont want to return a reference to that object, but
            > to another "NULL" object instead, or something that allows me to write
            >
            > result = ParseFileTags(R et,path);
            > if (result == NULL)
            > ...
            > else
            > ....
            >
            > I would prefer not to use exceptions, but as i write this i realize it may
            > be the only true solution...[/color]

            You can't have a null reference. That's one of the reasons for
            choosing references over pointers in some circumstances. If you want
            to return a reference, you'll need to decide what object 'result' will
            refer to after the function call if ParseFileTags fails.

            GJD

            Comment

            • Jerry Coffin

              #7
              Re: Function returning a &quot;null&quot ; reference object

              In article <PUTbb.515$Hd.2 96212@news-reader.eresmas. com>, royop@tb-
              solutions.com says...[color=blue]
              > Hello:
              >
              > i have a function that reads a file as an argument and returns a reference
              > to an object that contains some information obtained from the file: FData
              > &ReadFile(strin g FilePath);
              >
              > But , for example, when the file doesnt exists, i should not return any
              > reference to a bad constructed object, so i need something as a NULL
              > reference object. I suppose i could return a pointer instead, but i have
              > some code written with references which I´d like to preserve...[/color]

              You have a number of choices. First of all, I have to wonder why you're
              returning a reference at all -- almost the only time you want a function
              to return a reference is when it's returning a reference to an object
              that was passed to it as a parameter (e.g. operator= return *this, or
              operator<< or operator>> returning a reference to the stream in which it
              was invoked).

              If you insist on doing this anyway, one possibility is to create a
              static instance of an object and return a reference to it when you need
              a null object:

              class FData {
              public:
              static FData null_object;
              // ...
              };

              FData::null_obj ect;

              FData &ReadFile(strin g const &FilePath) {
              // I know access isn't portable, but hopefully I can get away with it as
              // filling, so to speak.
              if ( !access(FilePat h.c_str(), 0))
              return FData::null_obj ect;
              // ...
              }

              Using this implicitly assumes that the object in question is relatively
              small -- if an object takes up a lots of space, you probably don't want
              to create one just to use as a null object. This allows you to use
              references, but having introduced the possibility of a null object being
              returned, your code usually has to be written a lot like if you used
              pointers -- instead of 'if ( returned_value == NULL)', you use something
              like 'if (&returned_valu e == &FData::null_ob ject)', but the basic form
              of the code becomes almost like you used pointers.

              You've already mentioned the possibility of using pointers, and (more or
              less) rejected it.

              Another possibility would be for ReadData to throw an exception if it
              can't do what it's been asked to. Normally I wouldn't suggest this for
              dealing with a situation like a missing file, but if it allows you to
              write the rest of your code a lot more cleanly, it may be justified.

              --
              Later,
              Jerry.

              The universe is a figment of its own imagination.

              Comment

              • Jerry Coffin

                #8
                Re: Function returning a &quot;null&quot ; reference object

                In article <MPG.19d9fd52b2 75a330989b12@ne ws.clspco.adelp hia.net>,
                jcoffin@taeus.c om says...

                [ ... ]
                [color=blue]
                > FData::null_obj ect;[/color]

                Oops -- that should be:

                FData FData::null_obj ect;

                My apologies for the screw-up.

                --
                Later,
                Jerry.

                The universe is a figment of its own imagination.

                Comment

                Working...