C関数からC++関数を呼び出す

先に、「C++関数からC関数を呼び出す」をご覧ください。

C関数からC++関数を呼び出すのは、X-Windowのコールバック関数を書く場合等に必要になります。

ヘッダーファイル cppsub.h

クラスのインスタンスへのポインターを表わすために、``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__ */

C++ソースファイル cppsub.cpp

キャストに注意してください。

#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ソースファイル cmain.cpp

クラスのインスタンスへのポインターは、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

(C) 2003 石川直太 無保証 BSDライセンス
C/C++ tips に[戻る]
Tips に[戻る]
石川直太のホームページに[戻る]