C中回调函数在C++中的实现

foobar2016 2013-02-05 12:56:10
大家好, 我今天去参加面试,其中有一个题目是把C中的回调函数在C++中实现,我当时没有想出来,现在回来也米有思路,请问大家怎么实现?

struct AllFuncs
{
void *(*function1)(void *Objects, int buflen);
void (*function2)(void *Objects, void *buf);
}

static void* function1(void *Objects, int buflen);
static void function2(void *Objects, void *buf);

/* ----------------------------------------------------------------------------
* Local variables
* --------------------------------------------------------------------------*/
static const struct AllFuncS allFuncs =
{
function1,
function2,
};

static struct SecondFuncs sfs;
static int intBuf[] = {0, 0, 0};



/* ----------------------------------------------------------------------------
* 回调函数
* --------------------------------------------------------------------------*/

static void*
function1(void *Objects, int buflen)
{
// do something
// 会使用变量sfs
}

static void
function2(void *Objects, void *buf)
{
// do something
// 会使用变量allFuncs和intBuf
}


function1和function2就是回调函数,我当时把他们在C++中定义成static,但是 allFuncs, sfs, intBuf这几个变量怎么处理? 定义成成员变量还是在实现function1和function2的时候把他们作为本地变量?

希望大家给点指点,先谢谢大家了!
...全文
234 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
caoh110 2013-02-05
C++兼容C,回调函数只不过是函数的参数是函数指针而已,可以用extern "C" 在C ++中编译通过的。 allFuncs, sfs, intBuf这几个变量怎么处理? 定义成成员变量还是在实现function1和function2的时候把他们作为本地变量? allFuncs已经给出了定义了,他里面是两个函数指针。 SecondFuncs没有给出定义,你要自己定义下。 intBuf是函数的形参,可以是局部变量或者成员变量,没有限制的
  • 打赏
  • 举报
回复
用继承和派生的方法设计也相当不错
  • 打赏
  • 举报
回复
stereoMatching 2013-02-05
抱歉,method2和method3重复了,而且我忘了让whatever继承 由于我不知道那些function的具体情况 我不知道该用private继承或public继承 选了最普通的public继承 strategy和generic function是我比较常用的方法 继承的耦合度比他们来得高,实际开发时真正需要使用继承 的时机其实不多
  • 打赏
  • 举报
回复
stereoMatching 2013-02-05
引用 3 楼 foobar2016 的回复:
引用 2 楼 stereoMatching 的回复:这段代码C++不能直接使用吗? 考官要的是什么?OOP的实现 GP的实现? 如果没有限制,时间足够的话我三种都会写出来 考的是OOP的实现,我当时没写出来,有朋友帮忙让我学习一下吗?

//method 1
class AllFuncsBase
{
public:
	virtual void* function1(void *Objects, int buflen) = 0;
	virtual void function2(void *Objects, void *buf) = 0;
	
	~virtual AllFuncsBase(){}
};

class AllFuncs : public AllFuncsBase
{
public:
   virtual void* function1(void *Objects, int buflen);
   virtual void function2(void *Objects, void *buf);
   
private:
   int buf_;
   struct SecondFuncs sfs_;   
};

//method 2
class Strategy_1
{
public:
   virtual void* function1(void *Objects, int buflen) = 0;
   virtual void function2(void *Objects, void *buf) = 0;

   ~virtual Strategy_1() {}   
};

class Whatever
{
public:
   virtual void* function1(void *Objects, int buflen) {...};
   virtual void function2(void *Objects, void *buf) {...};  
   
private:
   int buf_;
   struct SecondFuncs sfs_;   
};

class AllFuncs
{
public:
	void* function1(void *Objects, int buflen, Strategy_1 *strategy);
	//function2依此类推
};

//method 3
class Strategy_1
{
public:
   virtual void* function1(void *Objects, int buflen) = 0;
   virtual void function2(void *Objects, void *buf) = 0;

   ~virtual Strategy_1() {}   
};

class Whatever
{
public:
   virtual void* function1(void *Objects, int buflen) {...};
   virtual void function2(void *Objects, void *buf) {...};  
   
private:
   int buf_;
   struct SecondFuncs sfs_;   
};

void* function1(void *Objects, int buflen, Strategy_1 *strategy);

//method 4
class Whatever
{
public:
   void* function1(void *Objects, int buflen) {...};
   void function2(void *Objects, void *buf) {...};  
   
private:
   int buf_;
   struct SecondFuncs sfs_;   
};

template<typename Functor>
void* function1(void *Objects, int buflen, Functor strategy); //#1,function2依此类推

//#1的变种
void* function1(void *Objects, int buflen, std::function<void(void *Objects, int buflen)> strategy);
参考用,希望可以抛砖引玉
  • 打赏
  • 举报
回复
dingqiang107 2013-02-05
回调是C里分离界面与实现的手段,在C++里对应的手段是多态,所以考的是虚函数的用法。AllFuncs改写成带虚函数的基类,function1和function2在不同继承类实现。sfs和intBuf定义成成员变量,体现OOP的封装。 C改成C++的题目,重点是编程思想的转换,不是语法的转换。C++的编程思想无非就是对象,模板、异常这几样,遇到这类题目就往这上面靠。直接问“继承、封装、多态”的话,谁都会背,这里无非是换个问法而已。凡是C++的考题,万变不离其宗。
  • 打赏
  • 举报
回复
foobar2016 2013-02-05
引用 1 楼 FrankHB1989 的回复:
整个一堆extern"C"打包扔给C++编译器不就行了。
好像考的不是这个,让用C++重写
  • 打赏
  • 举报
回复
foobar2016 2013-02-05
引用 2 楼 stereoMatching 的回复:
这段代码C++不能直接使用吗? 考官要的是什么?OOP的实现 GP的实现? 如果没有限制,时间足够的话我三种都会写出来
考的是OOP的实现,我当时没写出来,有朋友帮忙让我学习一下吗?
  • 打赏
  • 举报
回复
stereoMatching 2013-02-05
这段代码C++不能直接使用吗? 考官要的是什么?OOP的实现 GP的实现? 如果没有限制,时间足够的话我三种都会写出来
  • 打赏
  • 举报
回复
FrankHB1989 2013-02-05
整个一堆extern"C"打包扔给C++编译器不就行了。
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.1w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
申请成为版主
帖子事件
创建了帖子
2013-02-05 12:56
社区公告
暂无公告