【问题标题】:How to store a function in a member of class? (Using function as callback)如何将函数存储在类成员中? (使用函数作为回调)
【发布时间】:2012-06-17 17:30:34
【问题描述】:

我想将函数存储为类成员并在类中调用它?很像回调函数。我的班级绘制了一个文档,但每个文档都必须以不同的方式绘制。所以我想将一个函数(在类之外编写)分配给类的一个成员,然后在我想绘制文档时调用它。

这个函数主要负责根据每个特定的文档转换对象。

这是我的课:

class CDocument
{
public:
    CDocument();
    ~CDocument();

    void *TransFunc();
}

void Transform()
{

}

int main()
    CDocument* Doc = new CDocument();
    Doc->TransFunc = Transform();
}

我知道这可能是一个简单的问题,但我无法通过谷歌搜索或搜索找到答案。

【问题讨论】:

    标签: c++ function-pointers


    【解决方案1】:

    我想,这可能是你想要的。如果您有任何问题,请回复我。

    class CDocument
    {
    public:
        CDocument():myTransFunc(NULL){}
        ~CDocument();
    
        typedef void (*TransFunc)();  // Defines a function pointer type pointing to a void function which doesn't take any parameter.
    
        TransFunc myTransFunc;  //  Actually defines a member variable of this type.
    
        void drawSomething()
        {
             if(myTransFunc)
                (*myTransFunc)();   // Uses the member variable to call a supplied function.
        }
    };
    
    void Transform()
    {
    
    }
    
    int main()
    {
        CDocument* Doc = new CDocument();
        Doc->myTransFunc = Transform;  // Assigns the member function pointer to an actual function.
    }
    

    【讨论】:

      【解决方案2】:

      您需要使用 Pointer to member function

      typedef void (CDocument::*TransFuncPtr)();
      

      然后您可以使用TransFuncPtr 作为类型


      通过您的编辑,您似乎只需要一个指向 Free 函数的指针。
      这是 small working sample

      #include<iostream>
      #include<string>
      
      typedef void (*TransFuncPtr)();
      
      class Myclass
      {
           public:
           TransFuncPtr m_funcPtr;
      };
      
      void doSomething(){std::cout<<"Callback Called";}
      
      int main()
      {
          Myclass obj;
          obj.m_funcPtr = &doSomething;
          obj.m_funcPtr();
          return 0;
      }
      

      【讨论】:

      • 但我想从类外分配一个函数。我不希望将要分配给类内成员定义的函数。这是我应该如何定义要分配给成员的函数还是类中成员的定义?
      • @Dane:对不起,我不明白你的问题。上面声明了一个指向成员函数CDocument::Transform()的指针。我似乎不明白整个inside-外面谈话。如果你能清楚地表达你的意图,也许我可以提供更好的帮助。
      • 抱歉解释不好。我更新了我的问题。我不知道这在 C++ 中是否可能以我想要或不想要的方式。我只想在类外部编写一个函数并将指向该函数的指针存储在其中一个类成员中,以便稍后我可以在类中调用该函数。它可能类似于 C# 中的委托或 Delphi 中的事件(Object Pascal)的概念。
      • @Dane:现在希望我明白你的问题是什么。我更新了答案。
      • 非常感谢。这正是我想要做的,除了我现在想将我的函数分配给类成员“Doc->TransFunc = Transform();”时出现错误“无法从'void'转换为'TransFuncPtr'”
      【解决方案3】:

      由 C++ 继承的 C 声明语法很棘手。

      你的声明

      void *TransFunc();
      

      其实是一样的

      void* TransFunc();
      

      它声明了一个函数返回一个指针,而不是一个指向函数的指针。

      要将* 绑定到声明的名称而不是类型,您必须使用一组额外的括号

      void (*TransFunc)();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多