fuchs@it.uka.de (Harald Fuchs) (11/01/90)
I tried to define a counted pointer class "Xptr" to another class "X" and ran into a problem with the address-of "operator&". I redefined this operator to return a counted rather than a normal pointer, but for Xptr::operator-> () I need the real address of my X object (i.e. an X* rather than an Xptr). Is there a way to access the "normal" address-of operator even if it is redefined for a user-defined type? // Xptr.h #include "X.h" class Xptr { class Xrep { friend class Xptr; friend Xptr operator& (const X&); unsigned short ref; X obj; Xrep (const X& x): ref (0), obj (x) {} void deref () { if (!--ref) delete this; } }; Xrep* p; static Xrep*const nil; public: Xptr (Xrep* x = 0): p (x ? x : nil) { p->ref++; } Xptr (const Xptr& x): p (x.p) { p->ref++; } ~Xptr () { p->deref (); } Xptr& operator= (const Xptr& x) { x.p->ref++; p->deref (); p = x.p; return *this; } operator char () const { return p != nil; } // Usage: if (cp) ... X& operator* () const { return p->obj; } //X* operator-> () const { return &p->obj; } // This won't work X* operator-> () const { return (X*) ((char*) p + sizeof p->ref); } // Ugly hack: don't call operator& for an X }; inline Xptr operator& (const X& x) { return new Xptr::Xrep (x); } // Usage: X obj; Xptr p = &obj; // Xptr.C #include "Xptr.h" static unsigned short null = 1; // Never deallocate Xptr::Xrep*const Xptr::nil = (Xptr::Xrep*) &null; -- Harald Fuchs <fuchs@it.uka.de> <fuchs%it.uka.de@relay.cs.net> ... <fuchs@telematik.informatik.uni-karlsruhe.dbp.de> *gulp*
jgro@lia (Jeremy Grodberg) (11/06/90)
In article <fuchs.657417082@t5000> fuchs@it.uka.de (Harald Fuchs) writes:
<I tried to define a counted pointer class "Xptr" to another class "X"
<and ran into a problem with the address-of "operator&". I redefined
<this operator to return a counted rather than a normal pointer, but for
<Xptr::operator-> () I need the real address of my X object (i.e. an X*
<rather than an Xptr). Is there a way to access the "normal" address-of
<operator even if it is redefined for a user-defined type?
< //X* operator-> () const { return &p->obj; } // This won't work
try
X* operator-> () const { return ::operator&(p->obj); }
::operator&() explicitly calls the global non-overloaded & operator.
--
Jeremy Grodberg "I don't feel witty today. Don't bug me."
jgro@lia.com