在C ++中使用方法作为变量

时间:2013-06-05 15:52:14

标签: c++ variables methods

我正在研究irc机器人,以帮助我学习c ++,我想知道是否可以将方法用作这样的变量:

//Irc.h
public:

void *onJoin(char* sender, char* channel);
/////

//Main.cpp
void join(char* sender, char* channel)
{
    cout << sender << endl;
    cout << channel << endl;
}
int main()
{
    Irc irc(stuff);
    irc.onJoin = join;
}

4 个答案:

答案 0 :(得分:8)

是的,有可能。这些变量称为函数指针。可以这样写:

void onJoin( char* sender, char * channel );

int main(void)
{
    void (*func)(char *,char *);
    func = &onJoin;
    func( "sender", "channel" );
}

或者,您可以使用std::function<>。代码将是相同的,除了main()中被

替换的第一行
    std::function<void(char*,char*)> func;

在我看来,这有点清晰。如果您使用此功能,请不要忘记添加

#include <functional>

到文件的顶部。您也可以将它们用作任何structclass的成员变量,而不是在函数中使用此类变量。

答案 1 :(得分:4)

你需要一个指向函数的指针:

void* (*OnJoinFn)(char*, char*);

Irc课程中

class Irc
{
public:
  OnJoinFn onJoin;
};

可以像上面那样分配:

int main()
{
    Irc irc(stuff);
    irc.onJoin = join;
}

但是我想知道,如果你只是学习C ++,你真的需要一个指向函数的指针吗?指向函数的指针是合法且有效的,但是一个不寻常的实体,我通常希望使用其他一些机制。首先,我建议查看抽象基类:

class IIrc
{
public:
  virtual void* OnJoin(const char*, const char*) = 0;  // pure virtual
  virtual ~IIrc() {}; // Don't forget to implement a virtual destructor in any ABC
};

class MyIrc 
:
  public IIrc
{
public:
  void* OnJoin(const char* sender, const char* channel*)
  {
    // YOUR CODE HERE
  }
};

int main()
{
  IIrc* irc = new MyIrc;
  irc->OnJoin (...);
}

我冒昧地在OnJoin中引入了const正确性。

您还应该考虑不返回void*,它绕过大多数C ++的类型安全机制,但是指向实际对象或其他接口的指针。

最后,使用new(和delete,这里缺少,导致内存泄漏)是不好的做法。相反,更喜欢在堆栈上分配东西,或者,如果你真的需要动态分配,请使用智能指针。

答案 2 :(得分:1)

虽然这是可能的,但如果您需要这样做,我建议您最有可能做错事。典型的C ++方式“我们需要在不同情况下以不同方式执行此操作”是使用继承:

irc.h中的

   class ircBase
   {
     public:
      ... 
      virtual void onJoin(char *sender, char *channel) = 0;

   };
ircXX.h中的

   class ircXX: public ircBase
   {
     public:
      ... 
       virtual void onJoin(char *sender, char *channel)
       {
          cout << sender << endl;
          cout << channel << endl;
       }

   };
ircYY.h中的

   class ircYY: public ircBase
   {
     public:
      ... 
       virtual void onJoin(char *sender, char *channel)
       {
           ... do something else ... 
       }

   };

然后根据需要为对象创建一个对象。

答案 3 :(得分:0)

您正在寻找的是一个函数指针:

class Irc
{
    public:
        void (*on_join)(char*, char*);
    //  ^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
};

void join(char*, char*);

int main()
{
    Irc irc(stuff);
    irc.on_join = join;
}

或者,您可以使用std::function,以便您可以传递捕获/非捕获lambdas:

#include <functional>

class Irc
{
    public:
        std::function<void (char*, char*)> on_join;
    //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};

int main()
{
    Irc irc(stuff);
    irc.on_join = [] (char* sender, char* channel)
    {
        std::cout << sender  << std::endl;
        std::cout << channel << std::endl;
    };
}