home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!cis.ohio-state.edu!pacific.mps.ohio-state.edu!linac!att!att!allegra!alice!ark
- From: ark@alice.att.com (Andrew Koenig)
- Newsgroups: comp.std.c++
- Subject: Re: this == 0 for nonvirtual functions
- Keywords: this virtual function undefined
- Message-ID: <23528@alice.att.com>
- Date: 22 Aug 92 15:52:58 GMT
- Article-I.D.: alice.23528
- References: <1992Aug18.045605.14220@sunb10.cs.uiuc.edu> <1992Aug20.215455.17279@microsoft.com> <1992Aug21.044448.8282@sunb10.cs.uiuc.edu> <23512@alice.att.com> <1992Aug22.011400.14896@sunb10.cs.uiuc.edu>
- Reply-To: ark@alice.UUCP ()
- Distribution: usa
- Organization: AT&T Bell Laboratories, Murray Hill NJ
- Lines: 58
-
- In article <1992Aug22.011400.14896@sunb10.cs.uiuc.edu> pjl@sparc6.cs.uiuc.edu (Paul Lucas) writes:
-
- > The example I gave was the member-function:
-
- > void Link::DeleteAll() {
- > for ( Link *p = this, *q; p; p = q ) {
- > q = p->next;
- > delete p;
- > }
- > }
-
- Because this example ultimately says `delete this' (because p == this
- and it says `delete p'), I am already tempted to dismiss it out of hand.
- I think it's a Bad Idea to write member functions that invalidate their
- object, because it is so far away from what lots of people will expect.
-
- Putting that aside, though, I don't see why it's any harder to make DeleteAll
- a static member function with an explicit pointer argument:
-
- /* static */ void Link::DeleteAll(Link* p) {
- for (Link* q; p; p = q) {
- q = p->next;
- delete p;
- }
- }
-
- The code is about the same length; the only difference in use is that
- instead of saying
-
- foo->DeleteAll();
-
- you say
-
- Link::DeleteAll(foo);
-
- So I don't think this example is a particularly telling argument.
-
- Ditto for the next example (omitted for brevity).
-
- > Again, to reiterate (for Andrew's sake), I think it's a
- > zero-cost feature; code that works now will continue to work,
-
- It is not a zero-cost feature, because it would require compilers to
- generate extra code for every call of a member function inherited
- from a base class in the presence of virtual inheritance.
-
- > and programmers who ignore it will be unaffected, i.e., if they
- > don't check 'this' their programs will exhibit undefined
- > behavior (by trying to access members) and "undefined behavior"
- > is what happens now anyway.
-
- The feature would prohibit C++ implementations from detecting this==0
- as an error, which would make at least some genuine mistakes harder to find.
-
-
- --
- --Andrew Koenig
- ark@europa.att.com
-