Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > C function pointer within a class method

Reply
Thread Tools

C function pointer within a class method

 
 
hs.samix@gmail.com
Guest
Posts: n/a
 
      07-18-2007

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

 
Reply With Quote
 
 
 
 
Ian Collins
Guest
Posts: n/a
 
      07-18-2007
wrote:
> 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.
 
Reply With Quote
 
 
 
 
H.S.
Guest
Posts: n/a
 
      07-18-2007
Ian Collins wrote:
> wrote:
>> 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

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 On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
why a class can't access protected method from another class in thesame package,the method is interited from the ohtner class from differntpackage? junzhang1983@gmail.com Java 3 01-28-2008 02:09 AM
how to call method of the class which contains a pointer to other class method? Pawel_Iks C++ 3 07-31-2007 06:30 AM
Getting method name from within the class method Mitko Haralanov Python 17 10-20-2006 02:11 AM
can call a method, but not a method within a user-defined class aidy Ruby 5 06-04-2006 08:10 PM
Help with a utility class and having a method call another method from within Ian Python 2 09-06-2003 03:35 PM



Advertisments