我的头文件中有一组函数和一个函数指针声明如下。
public: // User declarations
void __fastcall TTopForm::Method1(void);
void __fastcall TTopForm::Method2(void);
void __fastcall TTopForm::Method3(void);
void __fastcall ( TTopForm::*Method )(void) ;
然后在我的程序中,我这样做
Method = Method1;
生成此错误消息:“必须调用成员函数或获取其地址。” 所以当然我试试这个,但没有运气。
Method = &Method1;
我做错了什么?我是电路设计师,而不是代码专家,所以请提供一些明确的代码。
感谢您的回答。我会发布我为其他可能使用C ++ Builder的人做的事情。我在他们的帮助文件中使用了typedef。在typedef中省略__fastcall是我的一个错误。
class TTopForm : public TForm
{
typedef void (__fastcall TTopForm::* TMethod)(void);
...
public: // User declarations
void __fastcall TTopForm::Method1(void);
void __fastcall TTopForm::Method2(void);
void __fastcall TTopForm::Method3(void);
...
然后在我的代码中:
TMethod Method = &TTopForm::Method1;
(TopForm->*Method)();
答案 0 :(得分:4)
正确的语法是Method = &TTopForm::Method1;
。
类的成员函数与普通的自由函数不同。认为它们完全不相关可能会更好。
您只能使用我在上面显示的语法获取地址。还需要学习很多其他东西才能正确使用它们,例如,成员函数总是需要调用一个对象。
答案 1 :(得分:2)
Jesse根据C ++标准的预期回答了这个问题。由于您专门使用C ++ Builder,因此您可以利用其__closure
编译器扩展,它比标准C ++方法指针更容易使用,并且更加灵活。例如:
class TTopForm : public TForm
{
typedef void __fastcall (__closure *TMethod)(void);
...
public: // User declarations
void __fastcall Method1(void);
void __fastcall Method2(void);
void __fastcall Method3(void);
...
};
TMethod Method = &Method1;
Method(); // calls this->Method1()
__closure
灵活性的原因在于它不限于任何特定的类。它包含对象指针的引用,因此根本不需要知道原始的类类型。例如,以下内容也有效:
typedef void __fastcall (__closure *TMethod)(void);
class TTopForm : public TForm
{
public: // User declarations
void __fastcall Method1(void);
...
};
class TBottomForm : public TForm
{
public: // User declarations
void __fastcall Method1(void);
...
};
TTopForm *TopForm = ...;
TBottomForm *BottomForm = ...;
TMethod Method;
Method = &(TopForm->Method1);
Method(); // calls TopForm->Method1()
Method = &(BottomForm->Method1);
Method(); // now calls BottomForm->Method1(), using the same TMethod variable!
答案 2 :(得分:1)
你需要拿这样的地址:
Method = &TTopForm::Method1;
答案 3 :(得分:-1)
我觉得
Method = Method1;
应该是:
Method = ObjectOfClass.Method1
但我不确定。