Re: wrapper classes and pointers
On 6/29/07 6:59 AM, in article
1183107180.847015.313000@u2g2000hsc.googlegroups.com, "ThosRTanner"
<ttanner2@bloomberg.net> wrote:
We have a class whose instances tend to be passed around by pointer,
of the sort of thing
Thing *pointer;
pointer = Thing::get_instance();
//Somewhat later
pointer->some_operation();
Now, we want to wrap Thing up in another class, so cheerfully renamed
Thing to ThingImpl and implemented class Thing with operator->()
returning a ThingImpl*.
Of course, this doesn't work, and the compiler claims that Thing
doesn't have a some_operation() method.
So either I have to implement all the ThingImpl methods in Thing, or I
have to do something else. I don't want to do the former, so what is
the best/easiest way of doing the latter ?
The problem here is that "pointer" is an actual pointer (of type Thing*),
instead of an Thing object with "pointer-like" semantics. So the most
straightforward change is to have Thing::get_instance() return a "Thing"
object by reference.
Here is a simple program to demonstrate Thing's basic implementation:
class ThingImpl
{
public:
void some_operation()
{}
};
class Thing
{
public:
Thing() : mThingImpl(new ThingImpl )
{}
// to do: copy constructor, assignment
~Thing() { delete mThingImpl; }
ThingImpl * operator->()
{
return mThingImpl;
}
const ThingImpl * operator->() const
{
return mThingImpl;
}
static Thing& get_instance()
{
static Thing sThing;
return sThing;
}
private:
ThingImpl * mThingImpl;
};
int main()
{
Thing& th = Thing::get_instance();
th->some_operation(); // OK
}
Greg
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]