C语言程序如何调用C++的类成员函数

bluesea_2000 2007-11-02 12:23:47
各位大虾,我希望在C里面将一个C++的成员函数(非静态)的指针传给C语言程序,然后在C里面通过函数指针的方式调用C++的成员函数
C++文件
class A
{
void funcCpp(int a);
}
main()
{
A a;
//将C++的成员函数的指针交给C程序
registerHandle(a.funcCpp);
}

C文件testC.c
FunctonHandle f;
void regiterHandle(FunctionHandle pf)
{
f = pf;
}
//C程序能够通过指针调用C++的成员函数
void callCppfunc()
{
(*f)();
}
其实中心思想就是想在C里面调用C++的成员函数(非静态的)。希望各位大虾赐教啊。
...全文
2783 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesea_2000 2007-11-17
  • 打赏
  • 举报
回复
基本解决了
C调用C++的静态函数是没有问题的,所以我在C++里面用一个静态的指针指向一个对象,在C里面通过调用C++的静态函数来操作C++的函数
sinkileu 2007-11-02
  • 打赏
  • 举报
回复
1楼好.
39457760 2007-11-02
  • 打赏
  • 举报
回复
1楼的意思是为类A 用C++做一套C语言的接口

C++ ==> C
a.Func(ParamterList) ==> Func(HandleFor_a, ParamterList)
bluesea_2000 2007-11-02
  • 打赏
  • 举报
回复
1楼是什么意思啊,可以再详细介绍一下么
我的编译平台是C++的
  • 打赏
  • 举报
回复
在Cpp里面提供一个函数使用类指针调用相应的成员函数,然后C调用这个函数.
babyvox1999 2007-11-02
  • 打赏
  • 举报
回复
既然你要把c++程序编译进去的,传对象地址可以不
ysuliu 2007-11-02
  • 打赏
  • 举报
回复
这个很简单啊。。。用dlopen啊
在C++ code中把被调用的函数封装一下,参数一般都用void *, 传进来再转换。
你把C++ code build成一个库,在C code中用dlopen打开相应的库,再用dlsym()找到想用的函数,通过得到的函数指针,就可以用了啊。。
houdy 2007-11-02
  • 打赏
  • 举报
回复
1. 要注意调用约定之间的差别.
2. 要注意C++编译器和C编译器对函数名在编译过程中进行命名修饰.
3. 注意在声明函数指针类型时,对于非静态类成员函数,别忘了还有第一个参数this.
如果注意了这些问题,应该就不难了.
蒋晟 2007-11-02
  • 打赏
  • 举报
回复
use the handle pattern
HANDLE CreateObject()
{
return (HANDLE)new A();
}
DeleteObject(HANDLE a)
{
A* pA=(A*)a;
delete pA;
}
void Foo(HANDLE a)
{
A* pA=(A*)a;
pA->Foo();
}
飞哥 2007-11-02
  • 打赏
  • 举报
回复
1 楼jixingzhong(瞌睡虫·星辰)回复于 2005-07-11 07:42:44 得分 20c和c++混合使用??

C中没有类的思想

自然没有相关的语法



要混合使用的话,

就用纯C好了,

因为C++是兼容C

C程序在C++编译器下能通过



有一点要注意

通过特殊手段,可以在C下调用C++的DLL


例子如下:

链接库头文件:
//head.h
class A
{
public:
A();
virtual ~A();
int gt();
int pt();
private:
int s;
};

.cpp
//firstso.cpp
#include <iostream>
#include "head.h"

A::A(){}
A::~A(){}
int A::gt()
{
s=10;
}
int A::pt()
{

std::cout<<s<<std::endl;
}
编译命令如下:
g++ -shared -o libmy.so firstso.cpp
这时候生成libmy.so文件,将其拷贝到系统库里面:/usr/lib/
进行二次封装:
.cpp
//secso.cpp
#include <iostream>
#include "head.h"
extern "C"

{

int f();

int f()
{
A a;
a.gt();
a.pt();
return 0;
}

}
编译命令:
gcc -shared -o sec.so secso.cpp -L. -lmy
这时候生成第二个.so文件,此时库从一个类变成了一个c的接口.
拷贝到/usr/lib
下面开始调用:
//test.c
#include "stdio.h"
#include "dlfcn.h"

#define SOFILE "sec.so"
int (*f)();
int main()
{
void *dp;
dp=dlopen(SOFILE,RTLD_LAZY);
f=dlsym(dp,"f");
f();
return 0;
}
编译命令如下:
gcc -rdynamic -s -o myapp test.c
运行Z$./myapp
10
$
jsjacky1101 2007-11-02
  • 打赏
  • 举报
回复
深奥.学习!
yuyunliuhen 2007-11-02
  • 打赏
  • 举报
回复
xue xi le

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧