[comp.lang.c++] CFRONT braindamaged?

dave@andromeda.rutgers.edu (Dave Bloom) (02/08/89)

Hi there. We're running AT&T's C++ Ver 1.2.1, and as far as I'm
concerned, the following should work hunky-dorey. Does anybody
see anything wrong with my syntax?

----------------------------------------------------------------------

	class zz {
	    public:
		void (*xx)(char*);
		void a(char* s) { printf("function a: %s\n", s); }
		void b(char* s) { printf("function b: %s\n", s); }
		void c(char* s) { printf("function c: %s\n", s); }
		zz(int i) {
			if(i==0)	xx= &(zz::a);
		    	else if(i==1)	xx= &(zz::b);
		    	else		xx= &(zz::c);
			}
	};
	
	main()
	{
	
		zz dave(1);
		dave.xx("Yes!!!");
	}

----------------------------------------------------------------------

Thanx.
_______________________________________________________________________________
rutgers\                                                 | Dave Bloom
 galaxy >!andromeda!dave -or- dave@andromeda.rutgers.edu | Work: (201)648-5085
pyramid/                                                 |

dean@homxb.ATT.COM (D.JONES) (02/08/89)

In article <2205@galaxy>, dave@andromeda.rutgers.edu (Dave Bloom) writes:
> Hi there. We're running AT&T's C++ Ver 1.2.1, and as far as I'm
> concerned, the following should work hunky-dorey. Does anybody
> see anything wrong with my syntax?
> 
> 	class zz {
> 	    public:
> 		void (*xx)(char*);
> 		void b(char* s) { printf("function b: %s\n", s); }
> 		zz(int i) {
> 			if(i==0)	xx= &(zz::a);
> 		    	else if(i==1)	xx= &(zz::b);
> 		    	else		xx= &(zz::c);
> 			}
> 	};
> 	main()
> 	{
> 		zz dave(1);
> 		dave.xx("Yes!!!");
> 	}
> rutgers\                                                 | Dave Bloom
>  galaxy >!andromeda!dave -or- dave@andromeda.rutgers.edu | Work: (201)648-5085
> pyramid/                                                 |

Dave,
	The problem seems to be that the compiler does not recognize xx as
a `member function',  where a,b, & c are member functions.  Since they are
member functions they expect a pointer to the object or a ``this'' pointer
as the first argument. If you call them indirectly through xx the ``this''
pointer is not added to the stack of xx, it pulls off "Yes!!!" as ``this''
and as for where the second argument, or s points,  all bets are off .....

							Dean S Jones
							UNICAD/IDS
							AT&T Bell Labs
							Holmdel, NJ

							dean@homxb.ATT.COM

Line.Eater()
Line.Eater()
Line.Eater()
Line.Eater()
Line.Eater()
Line.Eater()
Line.Eater()
Line.Eater()
Line.Eater()

tom@tnosoes.UUCP (Tom Vijlbrief) (02/11/89)

dave@andromeda.rutgers.edu (Dave Bloom) writes:

>Hi there. We're running AT&T's C++ Ver 1.2.1, and as far as I'm
>concerned, the following should work hunky-dorey. Does anybody
>see anything wrong with my syntax?

Yes, gnu g++ 1.32 reports:
t.c:8: assignment between incompatible pointer types
t.c:9: assignment between incompatible pointer types
t.c:10: assignment between incompatible pointer types

This can be corrected:
======================
       class zz {
           public:
                void    (zz::* xx)(char *);
               void a(char* s) { printf("function a: %s\n", s); }
               void b(char* s) { printf("function b: %s\n", s); }
               void c(char* s) { printf("function c: %s\n", s); }
               zz(int i) {
                       if(i==0)        xx= &(zz::a);
                       else if(i==1)   xx= &(zz::b);
                       else            xx= &(zz::c);
                       } 
       };
       main()
       {
               zz dave(1);
               dave.xx("Yes!!!");
       } 

==========
This produces:

t.c:17: invalid call via pointer-to-member function

Changing the code to:
 
       class zz {
           public:
                void    (zz::* xx)(char *);
               void a(char* s) { printf("function a: %s\n", s); }
               void b(char* s) { printf("function b: %s\n", s); }
               void c(char* s) { printf("function c: %s\n", s); }
               void e() { xx(this, "yes"); }
               zz(int i) {
                       if(i==0)        xx= &(zz::a);
                       else if(i==1)   xx= &(zz::b);
                       else            xx= &(zz::c);
                       } 
       };
       main()
       {
               zz dave(1);
               dave.e();
       } 
======
produces the correct result.

Tom
===============================================================================
Tom Vijlbrief
TNO Institute for Perception
P.O. Box 23				Phone: +31 34 63 62 77
3769 ZG  Soesterberg			E-mail: tnosoes!tom@mcvax.cwi.nl
The Netherlands				    or:	uunet!mcvax!tnosoes!tom
===============================================================================