为什么这个函数指针失败?

时间:2013-09-27 11:52:34

标签: c++ c++builder

我的头文件中有一组函数和一个函数指针声明如下。

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)();

4 个答案:

答案 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

但我不确定。