如何调用类成员函数指针?

bilujun 2005-08-09 01:12:14
大概代码意思如下,Class1封装完成某项功能,同时要提供一些回调函数以便Class2进行处理
但是无法通过编译。提示都是cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)

Class1.h
typedef void Error(char* Descrption)
Class1
{
public:
Class1();
virtual ~Class1();
public:
AddErrorFun(Error* fnError);

private:
Error* fnError;
}

Class1.cpp
include "Class1.h"
Class1::Class1()
{
}

Class1::~Class1()
{
}
Class1::AddErrorFun(Error* fnError);
{
this->fnError = fnError;
}


Class2.h
include "Class1.h"
Class2
{
public:
Class2();
virtual ~Class2();
public:
void OnError(char* Description);
private:
Class1* clsTest;
}

Class2.cpp
include "Class2.h"
Class2::Class2()
{
clsTest = new Class1();
clsTest->AddErrorFun(OnError);
}
Class2::~Class2()
{
}
void Class2::OnError(char* Description);
{
AfxMessageBox(Descrption);
}
...全文
298 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bilujun 2005-08-09
  • 打赏
  • 举报
回复
呵呵,我一开始没有看你的代码,因为我只正好看到了 "此句是错的,我不知道该怎么办",就跳过了,浪费了你的感情了,^-^。决定把100分全部给你。
bilujun 2005-08-09
  • 打赏
  • 举报
回复
不错,你的也可以,必须定义一个全局函数。
Jarrylogin 2005-08-09
  • 打赏
  • 举报
回复
是的。error就是我第一贴的visit了,你产考盖一下程序不就行了么
bilujun 2005-08-09
  • 打赏
  • 举报
回复
Jarrylogin(正经事情我不会,歪门邪道样样行)
typedef void Error(char* Descrption)
Error* error;

typedef void (*Error)(char* Descrption)
Error error;
是没有什么区别,都只是声明error是个函数指针而已

windcsn(向所有的朋友学习!) 的方法肯定是可行的,java的事件机制应该就是实现借口这样处理的

一会试一下用静态函数
Jarrylogin 2005-08-09
  • 打赏
  • 举报
回复
to nelsonc(软件兔):
你查查看,这两者写法书上说是一样的
windcsn 2005-08-09
  • 打赏
  • 举报
回复
静态函数,没有this指针
Jarrylogin 2005-08-09
  • 打赏
  • 举报
回复
typedef void Error(char* Descrption) 改成 typedef void (*Error)(char* Descrption)

Error error;

error就是我的visit
bilujun 2005-08-09
  • 打赏
  • 举报
回复
to orbit(走了走了)
成员函数指针与一般函数指针也是不同的.现在就是如何处理这个问题了。
nelsonc 2005-08-09
  • 打赏
  • 举报
回复
a.function(A::print1);
==>
a.function(&A::print1);
windcsn 2005-08-09
  • 打赏
  • 举报
回复
该接口提供一些方法,然后你在需要处理这个回调事件的地方继承实现该接口,例如:
class A
{
public:
virtual void f1()=0;
}

class B
{
public:
B(A *pA);

protected:
A *m_pA;
};

class C:public A
{
public:
virtual void f1(){实现}

}

main()
{
C c;
B(&c);
....
}
hundlom 2005-08-09
  • 打赏
  • 举报
回复
clsTest->AddErrorFun(OnError);
原型:Class1::AddErrorFun(Error* fnError);
而OnError则这样定义:void OnError(char* Description);
?
dirdirdir3 2005-08-09
  • 打赏
  • 举报
回复
这个是类的成员函数,与class1定义的不符合。应该改为:
void OnError(char* Description);
{
MessageBox(...);
}
另外这句clsTest->AddErrorFun(OnError);要改为:
clsTest->AddErrorFun(&OnError);
DentistryDoctor 2005-08-09
  • 打赏
  • 举报
回复
使用静态函数,用this作为参数。
windcsn 2005-08-09
  • 打赏
  • 举报
回复
最好的办法是将类作为回调接口
bilujun 2005-08-09
  • 打赏
  • 举报
回复
楼上,我就是在
clsTest->AddErrorFun(OnError);
这句上出错
  • 打赏
  • 举报
回复
VC默认的函数调用方式是__cdecl,类成员函数的调用方式是thiscall,所以不一致
Jarrylogin 2005-08-09
  • 打赏
  • 举报
回复
// test1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>

class A{
public:
void print1(){
cout<<"(print1)"<<endl;
}

void print2(){
cout<<"(print2)"<<endl;
}
void function(void (A::*visit)(void)){

(this->*visit)();
}
};

//void (A::*visit)(void);

/*void function(void (A::*visit)(void)){
A a;
(a.*visit)();
}
*/
void main(){
/*A a;
visit=&A::print1;
(a.*visit)();
function(&A::print1);
*/
A a;
//void (*visit)(void);
//visit=&a.print1;
a.function(A::print1); /////此句是错的,我不知道该怎么办
}
this->*visit( )----->(this->*visit)();
-------------------Configuration: test1 - Win32 Debug--------------------
Compiling...
test1.cpp
Linking...

test1.exe - 0 error(s), 0 warning(s)



16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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