Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Function returning a "null" reference object

Reply
Thread Tools

Function returning a "null" reference object

 
 
Pablo J Royo
Guest
Posts: n/a
 
      09-23-2003
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(string 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?



 
Reply With Quote
 
 
 
 
Attila Feher
Guest
Posts: n/a
 
      09-23-2003
Pablo J Royo wrote:
> 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(string 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...


You can throw an exception.

BTW how do you return that reference? What does it refer to? I hope not an
automatic variable.

> żHow can i do that?


No need for that upside down question mark.

--
Attila aka WW


 
Reply With Quote
 
 
 
 
Pablo J Royo
Guest
Posts: n/a
 
      09-23-2003
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(Ret,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" <> escribió en el mensaje
news:bkp207$88i$...
> Pablo J Royo wrote:
> > 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(string 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...

>
> You can throw an exception.
>
> BTW how do you return that reference? What does it refer to? I hope not

an
> automatic variable.
>
> > żHow can i do that?

>
> No need for that upside down question mark.
>
> --
> Attila aka WW
>
>



 
Reply With Quote
 
Frank Schmitt
Guest
Posts: n/a
 
      09-23-2003
"Pablo J Royo" <> writes:

> 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(string FilePath);


Make that FData& ReadFile(const string& FilePath).
I'm curious - why are you returning by reference? Is this some static data
in ReadFile()?

> 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?


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 "Refactoring", 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
 
Reply With Quote
 
Attila Feher
Guest
Posts: n/a
 
      09-23-2003
Pablo J Royo wrote:

PLEASE do not top post and SNIP!

http://www.parashift.com/c++-faq-lit...t.html#faq-5.4

Thanx.

> 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)


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.

> 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(Ret,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...

[SNIP]

Not necessarily. You can return a boost::shared_ptr 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


 
Reply With Quote
 
Gavin Deane
Guest
Posts: n/a
 
      09-23-2003
"Pablo J Royo" <> wrote in message news:<HqUbb.516$>...

<please don't top post - thank you - rearranged>

> "Attila Feher" <> escribió en el mensaje
> news:bkp207$88i$...
> > Pablo J Royo wrote:
> > > 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(string 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...

> >
> > You can throw an exception.


<snip>

> 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(Ret,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...


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
 
Reply With Quote
 
Jerry Coffin
Guest
Posts: n/a
 
      09-23-2003
In article <PUTbb.515$>, royop@tb-
solutions.com says...
> 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(string 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...


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_object;

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

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_value == &FData::null_object)', 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.
 
Reply With Quote
 
Jerry Coffin
Guest
Posts: n/a
 
      09-23-2003
In article < et>,
says...

[ ... ]

> FData::null_object;


Oops -- that should be:

FData FData::null_object;

My apologies for the screw-up.

--
Later,
Jerry.

The universe is a figment of its own imagination.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Need help understanding a const function returning an object reference. noobzillaking@gmail.com C++ 5 09-21-2007 11:18 AM
"Object reference not set to an instance of an object" Weird thing happens with reference a link nguyentrongkha@gmail.com ASP .Net 1 09-20-2007 09:46 PM
function returning reference to empty object Dejfson C++ 18 05-18-2007 01:58 PM
Static function returning object reference Christian Schilling C++ 2 03-22-2006 05:55 PM
Returning a reference to an existing C++ object as a reference JustMe Perl Misc 1 08-29-2003 07:02 AM



Advertisments