I'm trying to learn C++, and trying to understand returning objects. I seem to see 2 ways of doing this, and need to understand what is the best practice.
Option 1:
QList<Weight *> ret;
Weight *weight = new Weight(cname, "Weight");
ret.append(weight);
ret.append(c);
return &ret;
Option 2:
QList<Weight *> *ret = new QList();
Weight *weight = new Weight(cname, "Weight");
ret->append(weight);
ret->append(c);
return ret;
(of course, I may not understand this yet either).
Which way is considered best-practice, and should be followed?
Best Answer
Option 1 is defective. When you declare an object
it only lives in the local scope. It is destroyed when the function exits. However, you can make this work with
Now, although
ret
is destroyed, a copy is made first and passed back to the caller.This is the generally preferred methodology. In fact, the copy-and-destroy operation (which accomplishes nothing, really) is usually elided, or optimized out and you get a fast, elegant program.
Option 2 works, but then you have a pointer to the heap. One way of looking at C++ is that the purpose of the language is to avoid manual memory management such as that. Sometimes you do want to manage objects on the heap, but option 1 still allows that:
where
getWeights
is your example function. (In this case, you may have to define a copy constructorQList::QList( QList const & )
, but like the previous example, it will probably not get called.)Likewise, you probably should avoid having a list of pointers. The list should store the objects directly. Try using
std::list
… practice with the language features is more important than practice implementing data structures.