Connecting Tech Pros Worldwide Help | Site Map

C function pointer within a class method

  #1  
Old July 18th, 2007, 04:55 AM
hs.samix@gmail.com
Guest
 
Posts: n/a

Hello,

I am trying to use a library which has a function, lets call it an
external function, which wants a function pointer as one of its
arguments.

If I use that library in a C program, all works well and I have no
problems. But I used the C program only to get started with the
library. The actual program I want to use that library with is in C++.

In my C++ program, I have a method function whose pointer I want to
use as the function pointer in the external function. However, I am
running in to problems. g++ gives this error (source code is given
below):
$g++ -ansi -pedantic -Wall -o classfoo classfoo.cc
classfoo.cc: In member function 'void ClassFoo::Method()':
classfoo.cc:30: error: cannot convert 'void (ClassFoo::*)(int*)' to
'void (*)(int*)' in assignment


Below is an example program which demonstrates the above problem. In
this, vFunc1 is the external function which I cannot change (for the
curious, I am trying to use this library: http://www.ics.forth.gr/~lourakis/levmar/,
and the function I am trying to use is dlevmar_dif on that web page).
//------------------------ classfoo.cc
---------------------------------------
#include <iostream>

//a pre-defined function; not to be changed
void vFunc1(void (*func)(int *j), int i){
int m=0;//initialized to certain value
func(&m);
std::cout << m + i << std::endl;
}

//our example class
class ClassFoo{
public:
int q;
ClassFoo();
void Method();
void ModMethod(int *j);
};

ClassFoo::ClassFoo(){
q = 2;
}
void ClassFoo::Method(){
void (*FuncPtr)(int *) = NULL;
FuncPtr = &ClassFoo::ModMethod;
//vFunc1(FuncPtr,q);
}

void ClassFoo::ModMethod(int *j){
(*j) = (*j) + 2;//modify value
return;
}

int main(){

ClassFoo EgClass;
EgClass.Method();
return 0;
}
//---------------------------------------------------------------------------------


So, how do I get around this problem?

->HS

  #2  
Old July 18th, 2007, 05:15 AM
Ian Collins
Guest
 
Posts: n/a

re: C function pointer within a class method


hs.samix@gmail.com wrote:
Quote:
Hello,
>
I am trying to use a library which has a function, lets call it an
external function, which wants a function pointer as one of its
arguments.
>
If I use that library in a C program, all works well and I have no
problems. But I used the C program only to get started with the
library. The actual program I want to use that library with is in C++.
>
In my C++ program, I have a method function whose pointer I want to
use as the function pointer in the external function. However, I am
running in to problems. g++ gives this error (source code is given
below):
$g++ -ansi -pedantic -Wall -o classfoo classfoo.cc
classfoo.cc: In member function 'void ClassFoo::Method()':
classfoo.cc:30: error: cannot convert 'void (ClassFoo::*)(int*)' to
'void (*)(int*)' in assignment
>
So it should, a class member isn't a C linkage function, it has a hidden
this parameter and the wrong linkage type.

To pass a pointer to a function to a C library, you have to use a
vanilla function with extern "C" linkage

--
Ian Collins.
  #3  
Old July 18th, 2007, 06:25 PM
H.S.
Guest
 
Posts: n/a

re: C function pointer within a class method


Ian Collins wrote:
Quote:
hs.samix@gmail.com wrote:
Quote:
>Hello,
>>
>I am trying to use a library which has a function, lets call it an
>external function, which wants a function pointer as one of its
>arguments.
>>
>If I use that library in a C program, all works well and I have no
>problems. But I used the C program only to get started with the
>library. The actual program I want to use that library with is in C++.
>>
>In my C++ program, I have a method function whose pointer I want to
>use as the function pointer in the external function. However, I am
>running in to problems. g++ gives this error (source code is given
>below):
>$g++ -ansi -pedantic -Wall -o classfoo classfoo.cc
>classfoo.cc: In member function 'void ClassFoo::Method()':
>classfoo.cc:30: error: cannot convert 'void (ClassFoo::*)(int*)' to
>'void (*)(int*)' in assignment
>>
So it should, a class member isn't a C linkage function, it has a hidden
this parameter and the wrong linkage type.
>
To pass a pointer to a function to a C library, you have to use a
vanilla function with extern "C" linkage
>
Okay. I just did that. The only problem was that the function whose
pointer I am passing needed to use some member variables of the class.
That is why I had made that function as a member function as well.

Making that function (whose pointer I need) as vanilla function in C, I
got around the problem of using some member variables by saving them in
a structure and passing its pointer to the library function I am using.

It compiled ... the next stage is debugging.

Thanks for the help and explanation.
regards,
->HS

Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
Class method less robust than C function? Tony answers 43 November 19th, 2006 06:55 AM
Guidelines for overloading Render method sk answers 5 November 19th, 2005 07:09 AM
differences between a c-function and a class method gustav04 answers 6 July 23rd, 2005 02:28 AM
static class methods and data members Neil Zanella answers 4 July 18th, 2005 03:23 PM