为什么这个函数指针失败

Why is this function pointer failing?

本文关键字:指针 失败 函数 为什么      更新时间:2023-10-16

我在我的头文件中声明了一组函数和一个函数指针,如下所示。

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

正确的语法是Method = &TTopForm::Method1;

类的成员函数与普通的自由函数是不同的野兽。最好认为它们是完全无关的。

您只能使用我上面显示的语法获取地址。您还需要学习许多其他东西才能正确使用它们,例如,成员函数始终需要调用对象。

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!

你需要像这样获取它的地址:

Method = &TTopForm::Method1;

我觉得

Method = Method1;

应该是:

Method = ObjectOfClass.Method1

但是我不确定。