先に、「C++関数からC関数を呼び出す」をご覧ください。
C関数からC++関数を呼び出すのは、X-Windowのコールバック関数を書く場合等に必要になります。
クラスのインスタンスへのポインターを表わすために、``void*
''
型を使います。
#ifndef __CPPSUB_H__
#define __CPPSUB_H__ 1
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
extern void *new_object(double initial_value);
extern double call_method(void *the_object, double param);
extern void delete_object(void *the_object);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __CPPSUB_H__ */
キャストに注意してください。
#include "cppsub.h"
#include <iostream>
class a_class {
public:
double a_value;
a_class(double vvv) { a_value = vvv; };
void a_method(double vvv) { a_value += vvv; };
};
void *new_object(double initial_value)
{
return static_cast<void*>(new a_class(initial_value));
}
double call_method(void *the_object, double param)
{
a_class *pc = static_cast<a_class*>(the_object);
pc->a_method(param);
std::cout << "Current a_value = " << pc->a_value << std::endl;
return pc->a_value;
}
void delete_object(void *the_object)
{
a_class *pc = static_cast<a_class*>(the_object);
delete pc;
}
クラスのインスタンスへのポインターは、C++言語側では暗黙に処理されますが、C言語で扱う場合には、この例の``the_object
''
のように明示的に扱う必要があります。
#include "cppsub.h"
int main(int argc, char **argv)
{
void *the_object;
the_object = new_object(0.0);
call_method(the_object, 1.0);
call_method(the_object, 1.0);
delete_object(the_object);
return 0;
}
gccとg++を使って、この例題をコンパイル、リンクする方法を示します。
g++ -Wall -c cppsub.c
gcc -Wall -c cmain.c
g++ -Wall -o cmain cmain.o cppsub.o