1

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

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

4 回答 4

4

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

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

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

于 2013-09-27T11:54:27.003 回答
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!
于 2013-09-28T06:34:00.203 回答
1

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

Method = &TTopForm::Method1;
于 2013-09-27T11:54:07.323 回答
-1

我觉得

Method = Method1;

本来应该:

Method = ObjectOfClass.Method1

不过我不确定。

于 2013-09-27T13:23:13.470 回答