473,405 Members | 2,282 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,405 software developers and data experts.

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

Jul 19 '05 #1
7 20312
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
Jul 19 '05 #2
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" <at**********@lmf.ericsson.se> escribió en el mensaje
news:bk**********@newstree.wise.edt.ericsson.se...
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

Jul 19 '05 #3
"Pablo J Royo" <ro***@tb-solutions.com> 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
Jul 19 '05 #4
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
Jul 19 '05 #5
"Pablo J Royo" <ro***@tb-solutions.com> wrote in message news:<Hq*****************@news-reader.eresmas.com>...

<please don't top post - thank you - rearranged>
"Attila Feher" <at**********@lmf.ericsson.se> escribió en el mensaje
news:bk**********@newstree.wise.edt.ericsson.se...
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
Jul 19 '05 #6
In article <PU*****************@news-reader.eresmas.com>, 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.
Jul 19 '05 #7
In article <MP************************@news.clspco.adelphia.n et>,
jc*****@taeus.com 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.
Jul 19 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

13
by: Don Vaillancourt | last post by:
What's going on with Javascript. At the beginning there was the "undefined" value which represented an object which really didn't exist then came the null keyword. But yesterday I stumbled...
14
by: MuZZy | last post by:
Hi, Lately i've been (and still am) fixing some memory leaks problems in the project i just took over when i got this new job. Among the other issues i've noticed that for localy created objects...
4
by: Peter Hemmingsen | last post by:
Hi, I have a dotnet object (implemented in mc++ and used in c#) which have a property called "Info". The Info property is also a dotnet object (implemented in mc++). In the constructor of the...
2
by: Anastasios Papadopoulos | last post by:
Hello all, I have statements like the following in my Property Get: Public Property AccountNumber() As String Get Return MyClass.AccountNumber.ToString End Get blah blah End Property
6
by: marcwentink | last post by:
Dear Sirs, Dear Newsgroup, Imagine I have some function that only gives me an iterator to a vector, but not the vector itself. Unfortunately this vector can be empty and the iterator can point...
5
by: rengeek33 | last post by:
I am building a SQL statement for Oracle and need one part of it to read: , myvar = null, myvar2 = "1", myvar3 = "0", myvar4 = null, etc. I am constructing this string using the String...
5
RMWChaos
by: RMWChaos | last post by:
I am working on a script to create and remove DOM elements, and I want to make it as efficient as possible (no redundancies). Because DOM elements each have their own set of attributes, the function...
3
by: phub11 | last post by:
Hi all, I have a routine that checks to see if an ID has been set for the next row down in a table. Everything works fine except if I'm on the last row and no row exists; the routine just hangs: ...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.