我正在研究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;
}
答案 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>
到文件的顶部。您也可以将它们用作任何struct
或class
的成员变量,而不是在函数中使用此类变量。
答案 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;
};
}