【问题标题】:Passing a function as an argument in c++在 C++ 中将函数作为参数传递
【发布时间】:2013-08-25 10:26:38
【问题描述】:

我有以下电话:

void Derived::GetEntry(Skill&);
InorderTraverse(GetEntry);

调用

void Base<ItemType>::InorderTraverse(void Visit(ItemType&)) const

尝试编译为书面生成

错误 C3867:“Derived::GetEntry”:函数调用缺少参数列表;使用 '&Derived::GetEntry' 创建指向成员的指针

使用 &Derived::GetEntry 生成

无法将参数 1 从 'void (__thiscall Derived::* )(Skill &)' 转换为 'void (__cdecl *)(ItemType &)'

将声明更改为 static void GetEntry... 修复了这些问题,但产生了一组新问题(即我无法访问非静态对象(非静态成员引用必须相对于特定对象)

我有一个类似的遍历操作,它适用于静态声明,因为被调用的函数只显示有关调用它的每个对象的信息。

我这几天一直在寻找答案,我觉得这很简单。有没有办法在另一个函数调用中使用非静态函数作为参数?

完整代码为:https://github.com/mindaika/SkillTree

【问题讨论】:

  • 没有看到实际代码使得理解这个问题有些问题(至少对我来说)。第一个 sn-p 甚至不是有效的 C++ 代码,因为第一行是 声明,第二行是实际的函数调用。 实际问题是什么?您是否试图将指向成员函数的指针传递给另一个用于枚举算法的函数? Zac 的链接问题很好地涵盖了这一点。
  • 如果您确切知道要传递哪些函数,并且这些函数可以从您希望调用它们的上下文中访问,您可以通过枚举替换该函数,并在调用时进行切换地点。当然,这并不灵活。
  • 我不确定 Zac 链接的问题是如何重复的,因为解决方案是“使用静态函数”,这是我试图避免的。 @WhozCraig 是的,第一行是 C++ 声明,表示函数声明为非静态的。第二行是函数调用。实际的问题是不能使用派生类函数 GetEntry 作为参数来执行函数调用 InorderTraverse(GetEntry)。我没有使用枚举算法;我正在遍历 BST 以从树中检索条目。我不确定要发布哪些其他代码来澄清。
  • 不管怎样,遍历 BST 一个枚举算法,如果有的话。无论如何,您希望传递的函数 is 还是 not 成员函数?静态很简单,但听起来您想传递派生的成员,如果是这样,它仍然可行,但涉及更多布线。

标签: c++ static-methods


【解决方案1】:

正如我在问题中提到的,我试图解决由使用静态变量引起的“内存泄漏”(它实际上不是泄漏,因为静态被破坏,但直到泄漏检测器运行之后)。我最终使用了这里描述的封装指针的修改:C++ freeing static variables

【讨论】:

    【解决方案2】:

    编辑:改为插入完整的工作示例。

    我建议你改用 std 函数指针。

    例如:

    #include <functional>
    void main()
    {
    class TheClass
    {
    public:
    
       TheClass()
       {
           m_function = ( std::tr1::bind(&TheClass::run, this) );
       };
    
       void run()
       {
              // stuff to do
       };
    
       std::tr1::function<void ()> m_function;
    };
    
    TheClass theclass;
    theclass.m_function();
    
    }
    

    m_function(); // 调用函数

    【讨论】:

    • 或者,只使用 C++11 而不是每次都附加 ::tr1 或者如果必须使用 C++03 则使用 boost。无论如何 +1。
    • @Adam 我尝试了您提供的示例,并针对我的代码进行了修改,但它似乎不起作用。但是,通过阅读其他一些 cmets,看起来 ::bind 最终是解决方案,我只需要了解如何正确使用它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多