Solved

About class member pointer

Posted on 2003-11-24
9
301 Views
Last Modified: 2010-04-01
#include<iostream.h>
#include<string>
#include <memory>
using namespace std;
class CMyClass;
typedef void (CMyClass::*TraceMsg)();
class CMyClass  
{
public:
      CMyClass();
      virtual ~CMyClass();

      TraceMsg tracemsg;

      void DefaultTrace( ){
      cout <<"test";
      };

      void Do()
      {
            (this->*tracemsg)();//is ok
      }
};

CMyClass::CMyClass()
{
      this->tracemsg = DefaultTrace;            
}

CMyClass::~CMyClass()
{}
int main()
{  
            CMyClass x;
      x.Do() //is ok;
            (x.*tracemsg)(); //wrong
      return 1;
}
(x.*tracemsg)() doesnt work ,why?
0
Comment
Question by:fyf7262284
9 Comments
 
LVL 15

Expert Comment

by:efn
ID: 9816381
tracemsg is a member, so you need to specify in which CMyClass object to find it.  That object is not necessarily x, though it could be.  For example:

(x.*(x.tracemsg))();

Also you need a semicolon at the end of the preceding line.

--efn
0
 
LVL 4

Expert Comment

by:n_fortynine
ID: 9816399
efn, GCC gives an error regarding:

line 28 # Nonstatic member function "void CMyClass::DefaultTrace()" is used incorrectly (must be either called
    or used to form a pointer to member).
         this->tracemsg = DefaultTrace;

Why does GCC not support this, while VC++ does?
0
 
LVL 15

Expert Comment

by:efn
ID: 9816462
> Why does GCC not support this, while VC++ does?

Because GCC conforms better to the C++ language standard.  Code like that line is not supposed to compile.  It should look like this:

this->tracemsg = &CMyClass::DefaultTrace;

The standard (ISO/IEC 14882:1998) says:

"A pointer to member is only formed when an explicit & is used and its operand is a qualified-id not enclosed in parentheses. [Note: that is, the expression &(qualified-id), where the qualified-id is enclosed in parentheses, does not form an expression of type ?pointer to member.?  Neither does qualified-id, because there is no implicit conversion from a qualified-id for a nonstatic member function to the type ?pointer to member function? as there is from an lvalue of function type to the type ?pointer to function? (4.3). Nor is &unqualified-id a pointer to member, even within the scope of the unqualified-id?s class.]"

(5.3.1, Unary operators, clause 3)

--efn
0
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 
LVL 15

Expert Comment

by:efn
ID: 9816467
Sorry, I missed the quotation marks in my editing.

"A pointer to member is only formed when an explicit & is used and its operand is a qualified-id not enclosed in parentheses. [Note: that is, the expression &(qualified-id), where the qualified-id is enclosed in parentheses, does not form an expression of type 'pointer to member.'  Neither does qualified-id, because there is no implicit conversion from a qualified-id for a nonstatic member function to the type 'pointer to member function' as there is from an lvalue of function type to the type 'pointer to function' (4.3). Nor is &unqualified-id a pointer to member, even within the scope of the unqualified-id's class.]"
0
 
LVL 2

Expert Comment

by:JensUniweb
ID: 9816513
First of all. There is a ; missing. On the line x.Do() there is a ; missing.

The way you're doing it is not allow in the C++ standard. It is forbidden to use pointers to functions in a class. So you need a static function. And that might not do the jobb you want.

What version of gcc did you use. For correct C++ handling you should use 3.0 or later. In 3.3 that I use it gives the correct error that you can not have a pointer to a function in a class.

Borland C++ Builder 6 does not like this eather.

What version of VC++??? Version 6.0 does not follow the C++ standard. It implements its own standard.

BTW: Don't have .h on the standard C++ include files. The correct way is #include <iostream>.
0
 
LVL 2

Expert Comment

by:JensUniweb
ID: 9816521
So, the pointer is allowed. I thought it not. Have to try.
0
 
LVL 1

Author Comment

by:fyf7262284
ID: 9816582
where can i get the "The standard (ISO/IEC 14882:1998) " document?
0
 
LVL 15

Accepted Solution

by:
efn earned 20 total points
ID: 9816630
> where can i get the "The standard (ISO/IEC 14882:1998) " document?

See:

http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.12

That page tells you about getting it from ISO and ANSI.  It's probably also available through national standards administrations in other countries.

--efn
0
 
LVL 9

Expert Comment

by:tinchos
ID: 10285815
No comment has been added lately, so it's time to clean up this TA.
I will leave the following recommendation for this question in the Cleanup topic area:

Accept: efn {http:#9816630}

Please leave any comments here within the next seven days.
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!

Tinchos
EE Cleanup Volunteer
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question