Connecting Tech Pros Worldwide Help | Site Map

C function pointer within a class method

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 18th, 2007, 03:55 AM
hs.samix@gmail.com
Guest
 
Posts: n/a
Default C function pointer within a class method


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, 04:15 AM
Ian Collins
Guest
 
Posts: n/a
Default 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, 05:25 PM
H.S.
Guest
 
Posts: n/a
Default 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

 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,662 network members.