在日常编码过程中,我们经常使用到数组,以C++的基本数据类型作为存储对象,而在某些特殊的情况下,我们需要使用到函数数组或函数指针(譬如回调函数),其实质为一个指针数组,数组内存储着各个函数的指针地址,在被调用时得到使用。现在就对C++的函数数组的使用进行简单的介绍。
1.方法1:
#include<iostream>
#include<vector>
using namespace std;
vector<void(*)()> m_vecFuc;
void fucPrint1()
{
cout<<"fucPrint1()"<<endl;
}
void fucPrint2()
{
cout<<"fucPrint2()"<<endl;
}
void fucPrint3()
{
cout<<"fucPrint3()"<<endl;
}
int main()
{
m_vecFuc.push_back(fucPrint1);
m_vecFuc.push_back(fucPrint2);
m_vecFuc.push_back(fucPrint3);
m_vecFuc[0]();
m_vecFuc[1]();
m_vecFuc[2]();
return 0;
}
在上方的代码中,将各个函数的指针作为存储元素存储于数组m_vecFuc中,调用时直接按照普通数组元素的调用方式即可,但是需要在后面加上()表示其参数列表,对于有返回值与形参元素的函数,在数组定义时对定义进行修改即可,引用时在其后面的括号中加上相应的形参元素。
2.方法2:
但是,还存在着另一个问题,在实际使用中,我们往往还涉及到了C++类中的成员函数,成员函数除了可见的形参元素外,还有一个隐藏的输入参数,即this指针,表明对应的实例对象数据成员的内存地址,而这时无法直接使用上文的代码进行函数数组元素的添加,必须要对成员函数进行转换,将this指针传入,并转变成员函数类型。
所幸C++11提供了std::function<>和 std::bind()两个标准模板函数供我们使用,function的本质是一个模板,而bind的本质是一个函数,可以将类的成员函数进行转变,变为function<>类型的函数,具体使用代码如下:
#include<iostream>
#include<vector>
#include<functional>
using namespace std;
class Base1{
public:
void p1() {cout<<"Base1::p1()"<<endl;}
void p2() {cout<<"Base1::p2()"<<endl;}
void p3() {cout<<"Base1::p3()"<<endl;}
};
vector<function<void()>> m_vecFunc;
void fucPrint1()
{
cout<<"fucPrint1()"<<endl;
}
void fucPrint2()
{
cout<<"fucPrint2()"<<endl;
}
void fucPrint3()
{
cout<<"fucPrint3()"<<endl;
}
int main()
{
Base1 b1;
m_vecFunc.push_back(fucPrint1);
m_vecFunc.push_back(fucPrint2);
m_vecFunc.push_back(fucPrint3);
m_vecFunc.push_back(bind(&Base1::p1,&b1));
m_vecFunc.push_back(bind(&Base1::p2,&b1));
m_vecFunc.push_back(bind(&Base1::p3,&b1));
m_vecFunc[0]();
m_vecFunc[1]();
m_vecFunc[2]();
m_vecFunc[3]();
m_vecFunc[4]();
m_vecFunc[5]();
cout<<"Hello world!"<<endl;
return 0;
}
通过以上代码,即可将全局函数与类的成员函数同意存储在相应类型的函数数组之中,值得注意的是,在QT的使用中还存在着一些问题。
QT的信号槽机制是其特色机制,类内的任何函数均可以当做槽函数与跟其具有相同形参的信号进行连接但是如果在类内定义了一个相应的vector<function<void()>> m_vecFunc数组,再将类内的函数通过bind方式添加到数组中,采用m_vecFunc[0]()的形式与相应信号进行connec连接,却无法成功建立槽与函数的对应关系,编译器报错:
vector<function<void()>> m_vecFunc;
m_vecFunc.push_back(bind(&MainWindow::fucSlot1,this));
connect(ui->pushButton,SIGNAL(pressed()),this,SLOT( m_vecFunc[0]()));
QObject::connect: No such slot MainWindow::m_vecFunc[0]() in ..\QT_SignalSlot_Demo_0125_1\mainwindow.cpp:11
QObject::connect: (sender name: ‘pushButton’)
QObject::connect: (receiver name: ‘MainWindow’)
如果采用以下方式进行绑定:
vector<function<void()>> m_vecFunc;
m_vecFunc.push_back((fucSlot1));
对应的报错为:error: C3867: “MainWindow::fucSlot1”: 函数调用缺少参数列表;请使用“&MainWindow::fucSlot1”创建指向成员的指针
不知是否有高手可以予以解答,是否可以使用函数数组的方式进行信号与槽函数的绑定?以上代码的具体错误原因是什么?
今天的文章C++函数数组_c++中数组的定义与使用分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/78881.html