C++ return a
C++ return a "NULL" object if search result not found
I'm pretty new to C++ so I tend to design with a lot of Java-isms while I'm learning. Anyway, in Java, if I had class with a 'search' method that would return an object T
from a Collection< T >
that matched a specific parameter, I would return that object and if the object was not found in the collection, I would return a NULL. Then in my calling function I would just check if(T != NULL) { ... }
In C++, I'm finding out that I can't return a NULL if the object doesn't exist. I just want to return an 'indicator' of type T that notifies the calling function that no object has been found. I don't want to throw an exception because it's not really an exceptional circumstance.
class Node { .... Attr& getAttribute(const string& attribute_name) const { //search collection //if found at i return attributes[i]; //if not found return NULL; } private: vector attributes; }
Answer by Brian R. Bondy for C++ return a "NULL" object if search result not found
If you want a NULL
return value you need to use pointers instead of references.
References can't themselves be NULL
.
(Note to the future comment posters: Yes you can have the address of a reference be NULL if you really really try to).
See my answer here for a list of differences between references and pointers.
Answer by Jesse Beder for C++ return a "NULL" object if search result not found
In C++, references can't be null. If you want to optionally return null if nothing is found, you need to return a pointer, not a reference:
Attr *getAttribute(const string& attribute_name) const { //search collection //if found at i return &attributes[i]; //if not found return nullptr; }
Otherwise, if you insist on returning by reference, then you should throw an exception if the attribute isn't found.
(By the way, I'm a little worried about your method being const
and returning a non-const
attribute. For philosophical reasons, I'd suggest returning const Attr *
. If you also may want to modify this attribute, you can overload with a non-const
method returning a non-const
attribute as well.)
Answer by codaddict for C++ return a "NULL" object if search result not found
You are unable to return NULL
because the return type of the function is an object reference
and not a pointer
.
Answer by JSB???? for C++ return a "NULL" object if search result not found
The reason that you can't return NULL here is because you've declared your return type as Attr&
. The trailing &
makes the return value a "reference", which is basically a guaranteed-not-to-be-null pointer to an existing object. If you want to be able to return null, change Attr&
to Attr*
.
Answer by Kaz Dragon for C++ return a "NULL" object if search result not found
There are several possible answers here. You want to return something that might exist. Here are some options, ranging from my least preferred to most preferred:
Return by reference, and signal can-not-find by exception.
Attr& getAttribute(const string& attribute_name) const { //search collection //if found at i return attributes[i]; //if not found throw no_such_attribute_error; }
It's likely that not finding attributes is a normal part of execution, and hence not very exceptional. The handling for this would be noisy. A null value cannot be returned because it's undefined behaviour to have null references.
Return by pointer
Attr* getAttribute(const string& attribute_name) const { //search collection //if found at i return &attributes[i]; //if not found return nullptr; }
It's easy to forget to check whether a result from getAttribute would be a non-NULL pointer, and is an easy source of bugs.
Use Boost.Optional
boost::optional
getAttribute(const string& attribute_name) const { //search collection //if found at i return attributes[i]; //if not found return boost::optional (); }
A boost::optional signifies exactly what is going on here, and has easy methods for inspecting whether such an attribute was found.
Answer by Mark Ransom for C++ return a "NULL" object if search result not found
You can easily create a static object that represents a NULL return.
class Attr; extern Attr AttrNull; class Node { .... Attr& getAttribute(const string& attribute_name) const { //search collection //if found at i return attributes[i]; //if not found return AttrNull; } bool IsNull(const Attr& test) const { return &test == &AttrNull; } private: vector attributes; };
And somewhere in a source file:
static Attr AttrNull;
Answer by Created for C++ return a "NULL" object if search result not found
You can try this:
return &Type();
Answer by A.B. for C++ return a "NULL" object if search result not found
As you have figured out that you cannot do it the way you have done in Java (or C#). Here is another suggestion, you could pass in the reference of the object as an argument and return bool value. If the result is found in your collection, you could assign it to the reference being passed and return ?true?, otherwise return ?false?. Please consider this code.
typedef std::map OPERATORS_MAP; bool OperatorList::tryGetOperator(string token, Operator& op) { bool val = false; OPERATORS_MAP::iterator it = m_operators.find(token); if (it != m_operators.end()) { op = it->second; val = true; } return val; }
The function above has to find the Operator against the key 'token', if it finds the one it returns true and assign the value to parameter Operator& op.
The caller code for this routine looks like this
Operator opr; if (OperatorList::tryGetOperator(strOperator, opr)) { //Do something here if true is returned. }
Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72
0 comments:
Post a Comment