2013-09-27 29 views
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

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

类的成员函数是与正常自由函数不同的野兽。认为它们完全不相关可能会更好。

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

+0

谢谢你,你的语法的作品,但现在()方法提供了一个“调用非功能”的错误。根据你的评论,我尝试在函数的参数列表中添加TObject * Sender,但这没有帮助。 –

+1

我看不到代码,但在你的问题中'方法'是一个*指针*成员函数。您需要提供要调用它的对象。例如,假设你有一个类型为“TTopForm”的对象't',你可以这样调用它:'(t。* Method)();'。 –

1

你需要把它的地址是这样的:

Method = &TTopForm::Method1; 
-1

我觉得

Method = Method1; 

应该是:

Method = ObjectOfClass.Method1 

我不知道但是。

+0

这确实是不对的。 – MSalters

1

杰西根据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!