Article View: gnu.g++.bug
Article #666Wrong error message when accessing 'this' in non-member function
From: Patrick Steranka
Date: Sat, 02 Dec 1989 22:04
Date: Sat, 02 Dec 1989 22:04
78 lines
2951 bytes
2951 bytes
In BS, pg 164, 5.5.6 it states:
The assignment to "this" [in a constructor function] informs
the compiler that the programmer has taken control and that the
default mechanism for allocating storage should not be used.
With this in mind my questions are:
(1) Does the variable 'this' have to be set in the constructor
function or can it be set in a subroutine that is called from
a constructor?
(2) If a member function (called from within the constructor) sets
the value of 'this', does the compiler still understand that
"the programmer has taken control"?
(3) Can a "friend" function access (get or set) the value of 'this'?
After testing several examples I learned the answers to questions
1 and 2:
(1) Only a constructor can set the value 'this'.
(2) If a member method attempts to change the value of 'this', an
error occures which says something to the effect of:
'You can't modify read-only variable $this'
But the answer to question #3, is not clear. Although I know
(intuitively) the answer must be that non-member functions can't
access 'this'. The error message that I got didn't make it
clear to me.
To answer question #3, I tried the following example.
==================== OUTPUT from compiling ex7.cc ====================
g++ -o ex7 -g ex7.cc
ex7.cc: In function void def_this ():
ex7.cc:15: request for `this' not in a class, struct, or union
==================== OUTPUT from compiling ex7.cc ====================
Perhaps the error message:
"Illegal attempt to use 'this' in a non-member function"
would be more correct, or am I missing something?
This error was produced on a SUN 3/280 (running SUN OS 3.5)
using g++ (1.36.1).
============================== File: ex7.cc ==============================
#include <stream.h>
class T{
char s[500];
friend void def_this();
public:
T() {
def_this(); cout << "The value of 'this' is " << (int)this << "\n";
};
~T() {
cout << "In ~T, the value of 'this' is " << (int)this << "\n";
this = 0;
}
};
void def_this() { this = (T *) 0x43; }
main(int argc, char* argv[])
{
T a1;
}
============================== File: ex7.cc ==============================
patrick (Patrick Steranka @ Corporation for Open Systems)
-- patrick@cos.com
-- patrick%cos.com@uunet.uu.net
-- {uunet, sundc, decuac, hqda-ai, hadron}!cos!patrick
P.S. If this kind of a report is too "nit-picky", then tell
me to stop sending them and I will.
Technical Details
Message-ID:
<8912022204.AA26796@qna.cos.com>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!tut.cis.ohio-state.edu!cos.com!patrickShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!tut.cis.ohio-state.edu!cos.com!patrick From: patrick@cos.com (Patrick Steranka) Newsgroups: gnu.g++.bug Subject: Wrong error message when accessing 'this' in non-member function Message-ID: <8912022204.AA26796@qna.cos.com> Date: 2 Dec 89 22:04:29 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 78