动态组件信息分发的问题

tommycpma 2005-05-27 11:40:09
class A:TObject
{
public:
 A();
 static TComboBox* m_pBox;
 static GetBox();
 static void F1();
 static void F2(TObject* Sender);
}
//--------------------------------------------
void F1()
{
m_pBox->OnChange = F2;//error
}

//Error info :Cannot convert 'void (*)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'
我应该怎么定义F2?或者说我应该怎么转换F2?


...全文
57 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
铖邑 2005-05-27
  • 打赏
  • 举报
回复
static void F2(TObject* Sender);
不能定义成静态的
tommycpma 2005-05-27
  • 打赏
  • 举报
回复
#include <map>
using namespace std;
//---------------------------------------------------------------------------
//类声明
class CLS;
class A;
typedef void(A::*PF)(CLS*);
//---------------------------------------------------------------------------
//仅仅为了做参数用的一个类
class CLS
{

};
//---------------------------------------------------------------------------
class A
{
public:
A()
 {
m_map["f1"] = &(A::f1);
  m_map["f2"] = &(A::f2);
  m_map["f3"] = &(A::f3);
  m_map["f4"] = &(A::f4);
 };
map<char*,PF> m_map;//存放函数指针的一个map
void f1(CLS*){};
void f2(CLS*){};
void f3(CLS*){};
void f4(CLS*){};
void f();
CLS *cls;
PF *p;
};
//---------------------------------------------------------------------------
class B
{
public:
map<char*,PF>* m_pmap;
CLS *pcls;
};
//---------------------------------------------------------------------------
static A *a = new A;
static B *b = new B;


main()
{
 a->f();
 a->p= &(*b->m_pmap)["f1"];
 (a->p)(a->cls);//这一句出错信息:call of nonfunction
 (*(a->p))(a->cls);//这一句出错信息:call of nonfunction

}
最新的代码,你不回帖我都没法发新代码
铖邑 2005-05-27
  • 打赏
  • 举报
回复
嘿嘿
tommycpma 2005-05-27
  • 打赏
  • 举报
回复
b->m_pmap["f1"](b->pcls);
不好意思,最近错字很多,脑子坏掉了
tommycpma 2005-05-27
  • 打赏
  • 举报
回复
b->m_pmap("f1")[b->m_pmap];//这一句出错,我不知道为什么
笔误,应该为
b->m_pmap["f1"](b->m_pmap);//这一句出错,我不知道为什么

根据xpdavis(咕嘟)的说法我只好重写我的类,抽象出来的东西如上,那句错误我不会修正,请指教,谢谢
tommycpma 2005-05-27
  • 打赏
  • 举报
回复
#include <map>
using namespace std;
//---------------------------------------------------------------------------
class CLS;
class A;
typedef void(A::*PF)(CLS*);
//---------------------------------------------------------------------------
class CLS
{

};
//---------------------------------------------------------------------------
class A
{
public:
 map<char*,PF> m_map;
 void f1(CLS*){};
 void f2(CLS*){};
 void f3(CLS*){};
 void f4(CLS*){};
 void f();
};
//---------------------------------------------------------------------------
class B
{
public:
 map<char*,PF>* m_pmap;
 CLS *pcls;
};
//---------------------------------------------------------------------------
static A *a = new A;
static B *b = new B;

void main()
{
  b->pcls = new CLS;
  b->m_pmap = &(a->m_map);
  b->m_pmap("f1")[b->m_pmap];//这一句出错,我不知道为什么
}
//Error info:Call of nonfunction
铖邑 2005-05-27
  • 打赏
  • 举报
回复
声明中带有(_closure )修饰的,必须有实例限定(可能这个是BCB特有的吧?),所以在F1中的m_pBox->OnChange = F2;这个F2也是没有实例的。楼主怎么都是用静态的呀???晕
下面这样就可以了:

class A:TObject
{
public:
A();
TComboBox* m_pBox;
GetBox();
void F1();
void __fastcall F2(TObject* Sender);
};
//--------------------------------------------
void A::F1()
{
m_pBox->OnChange = F2;//error
}
tommycpma 2005-05-27
  • 打赏
  • 举报
回复
为什么不能定义成静态的?
不定义成静态的
错误信息如下:
Cannot convert 'void (A::*)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'

602

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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