为什么这个函数指针失败
Why is this function pointer failing?
我在我的头文件中声明了一组函数和一个函数指针,如下所示。
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
但是我不确定。
相关文章:
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 函数返回时,带指针的复制构造函数失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 模板参数推导/替换失败,lambda作为函数指针
- C++ 调试断言失败,无效的空指针
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- C++指向成员的指针的类内初始化会使 MSVC 失败(但 GCC/Clang 工作)
- SFINAE 序列化共享指针失败
- 如何在类中存储指向字符串到成员函数映射的智能指针,以便它不会因类型不完整而失败?
- 通过功能指针通过DLL进行回调功能,运行时检查失败#0错误
- 为什么指针到成员函数的模板参数推断失败
- Visual Studio 2010 调用 _locking() 失败 (errno = 22) 当文件指针高于 (2^
- C++ 调试断言失败指针
- 删除SDL_VideoInfo指针时调试断言失败
- 使用通搭指针时在给定位置执行失败的原因,而不是更早?
- SetFilePointer不会失败,但也不会移动指针
- 尝试将值分配给*此指针失败
- 分配给指针失败
- 为什么这个函数指针失败