On Wed, Oct 13, 2010 at 2:28 PM, Steinar Bang <s...@dod.no> wrote: >>>>>> Steinar Bang <s...@dod.no>: > >>>>>> "Hyrum K. Wright" <hyrum_wri...@mail.utexas.edu>: >>> 2) Return everything by pointer >>> Pros: can represent the NULL value, potentially less memory overhead >>> Cons: more complex memory management (caller must delete returned value) > >> Um... why must the caller delete the returned value? I thought you were >> using refcounting smartpointers? > > Boost has two such (shared_ptr which is non-intrusive, and intrusive_ptr > which is). > http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/smart_ptr.htm > http://www.drdobbs.com/184401507 > > But personally, I wouldn't have used either, because the templated smart > pointers are more complicated than smart pointers have to be, and it > would create a dependency to boost (which btw is a nice library to have > dependencies to, and contains stuff the Standard library should have > contained, instead of what it actually contains... but that's a > different story...). > > What I would do is to: > - create a base class ReferenceCountedObject with an increment() method > and a decrement() method, and a protected virtual > freeWrappedPointer() method > - I would also create a base smart pointer class for > ReferenceCountedObject* that > - In its copy constructor(s) would increment the referenced object's > reference count > - In the assignment operator would decrement the reference count of > any object the pointer is already pointing to, and increment the > reference count of the assigned object > - In its destructor, decrement the reference count of the referenced > object > If possible, I would make the constructors and assignment operator > protected > - I would inherit from ReferenceCountedObject to make all of my wrapper > classes > - The wrapper classes would implement freeWrappedPointer() to free the > SVN API object they have a pointer to in the correct manner > - I would inherit from the base smart pointer class to create one smart > pointer for each wrapper class. These smart pointers' copy > constructors and assignment operators would delegate to the base > class for copy constructors and assignment, and implement wrapper > class specific de-referencing operators > - I would create a singleton class wrapping the API, functioning as a > factory for all API objects > - I would disallow making wrapper class instances (either by using pure > virtual classes in the API, and hidden implementation classes, or by > giving the wrappers private constructors and making the singleton API > wrapper class a friend. I think I prefer the pure virtual with > hidden implementation approach) > > The reason for not creating the wrapper objects directly is that you > would like to have control over the initial increment value. Another > reason is that having such a singleton class maps nicely to wrapping a C > API.
This is an interesting approach...and parallels what has already been done. :) Out of curiosity, have you taken a chance to look at the existing code here: http://svn.apache.org/repos/asf/subversion/branches/object-model/subversion/bindings/c++/include/Types.h ? Of particular interest are the RefCounter and CStructWrapper classes. -Hyrum