类中成员函数指针,最近学习QT的时候发现 信号 和 槽 有两种实现方法:
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)//SIGNAL() 和 SLOT() 宏实现
QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)//类成员函数指针实现
sender: 信号类指针
signal: 1.信号函数, 此处应用SIGNAL()宏实现 2.sender类成员函数指针
receiver: 槽类指针
method: 1.槽函数, 此处应用SLOT()宏实现 2.receiver类成员函数指针
type: 关联方式, 默认AutoConnection
//两个例子
QObject::connect(&but, SIGNAL(clicked()),&but,SLOT(hide()));//宏实现
QObject::connect(&But, &QPushButton::clicked, &widget, &QWidget::close);//类成员函数指针实现
在学习类成员函数指针实现时发现,&符号是否存在不影响结果的存在。
//测试代码
#include<iostream>
using namespace std;
class className
{
public:
className(int value = 0):value(value){};
void setValue(int);
void getValue();
private:
int value;
};
void className::setValue(int value)
{
this->value = value;
}
void className::getValue()
{
cout << this->value << "\n";
}
int main()
{
//函数指针无&
//void (className::*classMemberPoint)(int) = className::setValue;
//函数指针有&
void (className::*classMemberPoint)(int) = &className::setValue;
className *classPoint = new className();//创建并初始化类指针
classPoint->getValue();
//类指针实现
(classPoint->*classMemberPoint)(100);
classPoint->getValue();
//类变量实现
(*classPoint.*classMemberPoint)(50);
(*classPoint).getValue();
return 0;
}
//输出结果
//0
//100
//50
通过Debug查看两种方法的地址,发现相同,说明为相同用法。所以为什么对普通的指针赋值必须要求&value,而函数指针赋值可以&func/func
最后查阅资料,发现原因是普通指针赋值要求&是由于具有二义性,但函数指针并无二义性,因此可以直接赋值或者加&。在普通的变量指针中,若无&代表变量,有&代表变量地址,函数就没有这个问题。
为了保证代码的一致性,使用&func方式更佳。
(真坑 ̄へ ̄
Comments | 1 条评论
太强了伍佬