Re: Smart Pointers and Microsoft Foundation Classes
This is a multi-part message in MIME format.
------=_NextPart_000_0230_01C87323.8707E3F0
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
I cleaned it up more, been tired and and forgot I was using managed =
code, it now compiles with no errors
template <class T>
ref class LockProxy {
public:
LockProxy(T* pObj) : pointee (pObj) { lock l(this); }
~LockProxy() {
lock l(this);
delete pointee;
}
T* operator->() { return pointee; }
T* operator&() { return pointee&; }
LockProxy operator++() {
lock l(this); // lock on an increment
return pointee++;
}
LockProxy operator--() {
lock l(this); // lock on an decrement
return pointee--;
}
bool operator==(LockProxy(T)) {
return this==pointee;
}
bool operator<(LockProxy(T)) {
return this<pointee;
}
ostream& operator<<(ostream& os) { os << LockProxy.pointee; }
private:
T* pointee;
};
"Doug Harrison [MVP]" <dsh@mvps.org> wrote in message =
news:k28mr3he6h148ev9ogvtkcg2a7kdvafrog@4ax.com...
On Tue, 19 Feb 2008 10:19:41 -0800, "Roger Rabbit" <roger@rrabbit.com>
wrote:
Consider this, when I write win_main(...)I create a handle to my =
instance
that is running. I could use the pointer to determine if I am running =
a
second instance or not. I could for example see that I am already =
running,
so what not spawn a new tab in the document window.
Sure, you could write a class to manage that. I wouldn't call it a =
"smart
pointer", though, because that's really stretching the meaning of the =
term.
In C++, the term is used to describe a class that solves some of the
problems that come with raw pointers, such as the need to delete them =
at
some point.
For example a multi document interface text editor would create an =
abstract
Document and derive TextDocument and RichTextDocument classes. That =
seems
pretty basic, but its more tricky when a new tab surfaces. Ownership =
becomes
important which is why I started pondering smart pointers in the first =
place.
Ownership is always important. Smart pointers can help you implement =
the
ownership semantics you require.
--
Doug Harrison
Visual C++ MVP
------=_NextPart_000_0230_01C87323.8707E3F0
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; =
charset=unicode">
<META content="MSHTML 6.00.6000.16587" name=GENERATOR></HEAD>
<BODY id=MailContainerBody
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-TOP: 15px"
bgColor=#ffffff leftMargin=0 topMargin=0 CanvasTabStop="true"
name="Compose message area"><FONT size=4>I cleaned it up more, been =
tired and
and forgot I was using managed code, it now compiles with no
errors<BR><BR></FONT><FONT size=4><FONT face="Courier New">template =
<class
T><BR>ref class LockProxy {<BR>public:<BR>LockProxy(T* pObj) : =
pointee (pObj)
{ lock l(this); }<BR>~LockProxy() { <BR>lock l(this);<BR>delete
pointee;<BR>}<BR>T* operator->() { return pointee; }<BR>T* =
operator&() {
return pointee&; }<BR>LockProxy operator++() {<BR>lock l(this); // =
lock on
an increment<BR>return pointee++;<BR>}<BR>LockProxy operator--() =
{<BR>lock
l(this); // lock on an decrement<BR>return pointee--;<BR>}<BR>bool
operator==(LockProxy(T)) {<BR>return this==pointee;<BR>}<BR>bool =
operator<(LockProxy(T)) {<BR>return =
this<pointee;<BR>}<BR>ostream&
operator<<(ostream& os) { os << LockProxy.pointee;
}<BR>private:<BR>T* pointee;<BR>};<BR></FONT><BR><BR>"Doug Harrison =
[MVP]"
<dsh@mvps.org> wrote in message
news:k28mr3he6h148ev9ogvtkcg2a7kdvafrog@4ax.com...<BR>> On Tue, 19 =
Feb 2008
10:19:41 -0800, "Roger Rabbit" <roger@rrabbit.com><BR>> =
wrote:<BR>>
<BR>>>Consider this, when I write win_main(...)I create a handle =
to my
instance <BR>>>that is running. I could use the pointer to =
determine if I
am running a <BR>>>second instance or not. I could for example see =
that I
am already running, <BR>>>so what not spawn a new tab in the =
document
window.<BR>> <BR>> Sure, you could write a class to manage that. I =
wouldn't call it a "smart<BR>> pointer", though, because that's =
really
stretching the meaning of the term.<BR>> In C++, the term is used to =
describe
a class that solves some of the<BR>> problems that come with raw =
pointers,
such as the need to delete them at<BR>> some point.<BR>> =
<BR>>>For
example a multi document interface text editor would create an abstract
<BR>>>Document and derive TextDocument and RichTextDocument =
classes. That
seems <BR>>>pretty basic, but its more tricky when a new tab =
surfaces.
Ownership becomes <BR>>>important which is why I started pondering =
smart
pointers in the first <BR>>>place.<BR>> <BR>> Ownership is =
always
important. Smart pointers can help you implement the<BR>> ownership =
semantics
you require.<BR>> <BR>> -- <BR>> Doug Harrison<BR>> Visual =
C++
MVP</FONT></BODY></HTML>
------=_NextPart_000_0230_01C87323.8707E3F0--