Talk About Network

Google


Register and Login
Nick
Password
Register create new account Sign up is FREE and you can post replies, new topics, bookmark posts and more!
Recover lost password


Programming > C++ Moderated > Re: const point...
Latest [ Topics | Posts ] Archive Post A New Topic Post a Reply
<< Topic < Post Post 11 of 24 Topic 9518 of 9831
Post > Topic >>

Re: const pointer to class problem

by =?ISO-8859-1?Q?Daniel_Kr=FCgler?= <daniel.kruegler@[EMAIL PROTECTED] Apr 18, 2008 at 06:13 AM

On 18 Apr., 03:33, t.wa...@[EMAIL PROTECTED]
 wrote:
> I'm trying to slowly convert some C code to C++ and have encounter
> what's probably a trivial problem.
>
> The easiest way to describe the problem is with an example:
>
> class FOO
>   {
> public:
>     int Version(void){return m_ver;};

Version is a member function without const qualifier.
Thus you cannot invoke this function on a const object
or on a reference or pointer to const Version.
Additionally, while formally correct, most programmers
would remove the void parameter from above parameter
list, because in C++ it does not add anything useful
to the function signature. Note also that the final semicolon
is optional here.
To solve your problem, you want to change the signature
of this function to

int Version(void) const {return m_ver;};

or to

int Version() const {return m_ver;}

>     FOO(){m_ver = 1;};
> private:
>     int m_ver;
>   };
>
> void PrintVer(const FOO * fp)
>   {
>   int v = fp->Version();  /* error here */
>
>   cout << "The version is " << v << endl;
>   }

Given above modification this should compile now.
Considering that PrintVer could not work reasonably
with a NULL pointer argument, you could consider to
modify the definition of PrintVer as well using references
instead:

void PrintVer(const FOO& fp)
   {
   int v = fp.Version();
   //...
   }

> If I remove the const from the routine declaration, it works fine, but
> I'd rather not do that.   I guess I don't understand what the compiler
> is trying to tell me, and have no idea of how to work around this
> without removing the const.

If you add the const qualifier as shown above, you are promising
that PrintVer will not modify any data member directly and that
you can only invoke any member function with const qualifier
or free function with pointers/references to const. It's easier to
understand this constraint, if you would assume for a while that
your *original* Version would not be a member function, but a free
or static member function, like this

int Version(FOO& arg){return arg.m_ver;}

ignoring here that such free function could usually not access the
m_ver data member.
Now consider your function PrintVer function, which would invoke
this function:

void PrintVer(const FOO& fp)
   {
   int v = Version(fp);
   //...
   }

If the compiler would allow this, then it would be very easy to
break the const guarantee that PrintVer has given, because
PrintVer says "I do not allow modifications". This is so, because
given the non-const signature (either as member function or as
free or static member function) you could similarly write

int Version(FOO& arg){return ++arg.m_ver;}

but if you declare Version as

int Version(const FOO& arg){return ++arg.m_ver;}

the compiler would reject this code immediately.

In short: A const-qualified member function behaves like
a normal function, where you have added one further argument
of reference to const class type. In fact, most - if not all -
compilers will represent non-static member functions in
that or a similar way.

Last but not least: The same reasoning applies to the volatile-
qualifier or any cv-combination as well.

HTH & Greetings from Bremen,

Daniel Krügler


-- 
      [ See http://www.gotw.ca/resources/clcm.htm
for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]
 




 24 Posts in Topic:
const pointer to class problem
t.wanat@[EMAIL PROTECTED]  2008-04-17 19:33:58 
Re: const pointer to class problem
Ulrich Eckhardt <dooms  2008-04-18 05:05:12 
Re: const pointer to class problem
paradox <ksjetski@[EMA  2008-04-18 06:13:16 
Re: const pointer to class problem
Friedhelm Hoerner <f.h  2008-04-18 06:13:16 
Re: const pointer to class problem
kasthurirangan.balaji@[EM  2008-04-18 06:13:17 
Re: const pointer to class problem
Tony Delroy <tony_in_d  2008-04-18 06:13:15 
Re: const pointer to class problem
Chris Uzdavinis <cuzda  2008-04-18 06:13:17 
Re: const pointer to class problem
Christopher <cpisz@[EM  2008-04-18 06:13:18 
Re: const pointer to class problem
Oncaphillis <oncaphill  2008-04-18 06:13:15 
Re: const pointer to class problem
red floyd <no.spam@[EM  2008-04-18 06:13:16 
Re: const pointer to class problem
=?ISO-8859-1?Q?Daniel_Kr=  2008-04-18 06:13:19 
Re: const pointer to class problem
"Thomas J. Gritzan&q  2008-04-18 06:13:17 
Re: const pointer to class problem
Lionel B <me@[EMAIL PR  2008-04-18 06:13:18 
Re: const pointer to class problem
Gerhard Menzl <clcppm-  2008-04-18 06:13:17 
Re: const pointer to class problem
Thomas Lehmann <t.lehm  2008-04-18 17:16:36 
Re: const pointer to class problem
David Pol <david@[EMAI  2008-04-18 17:15:18 
Re: const pointer to class problem
rwf_20 <rfrenz@[EMAIL   2008-04-18 17:17:39 
Re: const pointer to class problem
Mathias Gaunard <loufo  2008-04-18 17:18:25 
Re: const pointer to class problem
Todd Mars <tamnt54@[EM  2008-04-18 17:18:24 
Re: const pointer to class problem
SeanW <sean_woolcock@[  2008-04-18 17:17:37 
Re: const pointer to class problem
"Jeff Baker" &l  2008-04-20 15:47:59 
Re: const pointer to class problem
"Jeff Baker" &l  2008-04-20 15:51:21 
Re: const pointer to class problem
"Jeff Baker" &l  2008-04-20 21:01:04 
Re: const pointer to class problem
Ulrich Eckhardt <dooms  2008-04-21 10:25:11 

Post A Reply:
  Go here to Signup

AddThis Feed Button


About - Advertising - Contact - Frequently Asked Questions - Privacy Policy - Terms of Use - Signup

Contact
tan12V112 Sat Jul 26 2:42:52 CDT 2008.