使用纯C函数指针调用C++的类成员函数

标签: 函数指针 函数 | 发表时间:2011-09-09 17:01 | 作者:何清龙 叽歪陈
出处:http://www.cppblog.com/
出发点:之前偶然碰见一个需要使用C代码调用C++的成员函数的场景,当时在google上没有找到解决方案,于是记录下了这个需求,今天看了GECKO的NPAPI代码,找到一种方式

原理:类的static成员是作为共享的方式被发布给外层的,所以不具有成员函数地址,所以它可以用来为我们转弯的调用类的成员函数提供一个机会。
在static成员函数中传递类本身的指针,就可以在内部调用这个指针的具体动作。

这解决了C的函数指针不能调用C++的类成员函数的困扰。


以下是一个实例:

#include <iostream>

class C;

struct test{
    
char (*a)(C *);
};

class C{
public:
    
static char xxx(C *com_on){
       
return com_on->_xxx();
    }
    
char _xxx(){
        std::cout
<<"hei!       _xxx called"<<std::endl;
        
return 'a';
    }
};

int main(){
    test x;
    C hei;
    x.a 
= hei.xxx;
    x.a(
&hei);
    
return 0;
}


第二种是使用友元函数,具体原理看待吗也就明白了,上面的代码忘记改成void*类型的,我想您能看得懂,如果不明白,下面这个应该足以说清楚

#include <iostream>

class C;

struct test{
    
char (*a)(void *);
};
char xxx(void*);

class C{
public:
    friend 
char xxx(void *com_on);
    
char _xxx(){
        std::cout
<<"hei!       _xxx called"<<std::endl;
        
return 'a';
    }
};
char xxx(void  *com_on){
    
return ((C*)com_on)->_xxx();
}
int main(){
    test x;
    C hei;
    x.a 
= xxx;
    x.a(
&hei);
    
return 0;
}
  


何清龙 2011-09-09 17:01 发表评论

相关 [函数指针 函数] 推荐:

C 语言中统一的函数指针

- kezhuw - 云风的 BLOG
有时候,我们需要把多个模块粘合在一起. 而这些模块的接口参数上有少许的不同. 在 C 语言中,参数(或是返回值)不同的函数指针属于不同的类型,如果混用,编译器会警告你类型错误. 在 C 语言中,函数定义是可以不写参数的. 这个函数定义表示了一个返回 void 的函数,参数未定. 也就是说,它是个弱类型,诸如:.

使用纯C函数指针调用C++的类成员函数

- 叽歪陈 - C++博客-首页原创精华区
出发点:之前偶然碰见一个需要使用C代码调用C++的成员函数的场景,当时在google上没有找到解决方案,于是记录下了这个需求,今天看了GECKO的NPAPI代码,找到一种方式. 原理:类的static成员是作为共享的方式被发布给外层的,所以不具有成员函数地址,所以它可以用来为我们转弯的调用类的成员函数提供一个机会.

剧情函数库

- SourBell - 学而时嘻之
(《新知客》,2010年10月). 著名物理学家徐一鸿先生在《可怕的对称》这本书中谈到对称性群的时候提到一个很有意思的笑话. 有一个客人随他的朋友参加一个笑话俱乐部的聚会. 另一个站起来叫道,“S—5”,引得所有的人都笑了起来. 这个迷惑不解的客人问道,这是怎么回事. 他的朋友解释道:“所有可能的笑话,当然不能计细小的差别,都已经被归类编上号了,我们心里都知道这些编号指的是什么.

函数图像(二)

- DreamToTrue - C++博客-λ-calculus(惊愕到手了欧耶)
    今天终于把雏形给做出来了. 主要的方法是牛顿迭代法,把屏幕上的所有点都收敛到函数图像上面. 为了提速,我是用了ThreadTool.QueueUserWorkItem和Parallel.For,还把那颗函数的语法树用Linq.Expression编译成了机器码. 下面的这些图都是二十秒钟左右就可以画出来的了.

Oracle函数介绍

- - CSDN博客数据库推荐文章
在SQL中有两种函数一种是单行函数,一种是多行函数.在sql与pl/sql中都自带了很多类型的函数,比如有字符、数字、日期、转换和混合型等多种函数用于处理单行数据,因此这些都被称为单行函数.这些函数都可以被用于select、where和oder by等子句中.下面我们就来分析单行函数,在这里我列举了oracle中一些常用的单行函数进行操作.希望你所有收获:.

MySql常用函数

- - CSDN博客数据库推荐文章
MySql函数众多,这里只是列举了一部分常用的函数. ABS(x)                                         // 返回x的绝对值. BIN(x)            //返回x的二进制(OCT返回八进制,HEX返回十六进制). CEILING(x)                                 //返回大于x的最小整数值.

三角函数的笑话

- Michael - Dongde.in 您懂的!
15则三角函数的笑话,需要点儿智商才能看懂呀. 1、sin对cos说:虽然我们相爱了,但我总是感觉不对. sin说:我总觉得我们是在三角恋. 2、sin的爸爸问sin的妈妈:sin现在正交的女朋友是谁啊. sin的妈妈说:sin正交的应该是cos吧. 3、sin对cos说:我除了你,心中还有一个人.

函数式编程初探

- - 博客 - 伯乐在线
诞生50多年之后, 函数式编程(functional programming)开始获得越来越多的关注. 不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言 层出不穷,比如Erlang、clojure、Scala、F#等等. 目前最当红的Python、Ruby、Javascript,对函数式编程的支持都 很强,就连老牌的面向对象的Java、面向过程的PHP,都忙不迭地加入对匿名函数的支持.

python内置函数大全

- - ITeye博客
最近一直在看python的document,打算在基础方面重点看一下python的keyword、Build-in Function、Build-in Constants、Build-in Types、Build-in Exception这四个方面,其实在看的时候发现整个《The Python Standard Library》章节都是很不错的,其中描述了很多不错的主题.

Jetty main函数执行

- - ITeye博客
在每个项目中都要配置路径什么的,非常的麻烦. 可以用jetty,项目本身就是服务器. 他会找项目中的WebContent. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.