Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
451 views
in Technique[技术] by (71.8m points)

C++如何设置一个有默认执行函数的……函数指针参数?

如题,
我想实现一个有默认执行函数的参数指针。类似下面这种

bool confirm(QString title,
                 QString content,
                 bool hasCheckBox = false,
                 QString checkBoxText = "",
                 void *callBack = **callBack**)
{
    if(hasCheckBox) QCheckBox *chb = new QCheckBox(checkBoxText);
    //...
    if(hasCheckBox && confirmed){
        callBack();
    }
    //...
}

请问 **callBack** 这里怎么实现?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

自己找到答案了……
其实我当时是想实现一个有默认值的函数指针做参数,它其实应该是这么写:

bool confirm(QString title,
                 QString content,
                 bool hasCheckBox = false,
                 QString checkBoxText = "",
                 void (*callBack)(void) = NULL)
{
    if(hasCheckBox) QCheckBox *chb = new QCheckBox(checkBoxText);
    //...
    //confirmed是确认按钮按下的状态
    if(confirmed)    callBack();
    //...
}

这个confirm说白了就是制作一个自定义的QMessageBox::question对话框,如果hasCheckBox,就在对话框中显示复选框,文字内容为checkBoxText的值,当点击按钮角色为AcceptRole的时候,就调用外部写好的一个函数,通过形参callBack来调用。比如:

//...
void callback(){
    QMessageBox::information(NULL, "不再提示", "已选定不再提示!");
}

confirm("请确认","删除后将无法恢复,是否确认?", true, "不再提示", callback);

//...

执行后就是这样的:
imageimage

我是想着这样写,一个函数就可以复用于更多场景,比如:

//...
void neverAsk(){
//..Never Ask codes
}

confirm("即将创建角色",QString("新角色名为%1,是否确认?").arg(user.name), true, "以后都直接确认", neverAsk);
//...

执行后就是这样的:
image

我上午的时候脑子瓦特了,首先是不应该用void *来表示参数为函数指针,实际的用函数指针的作为参数的写法应该还是类型 (*函数名)(参数列表);另外就是默认值不一定非得是函数体,也可以是空值

我当时死活就想不到这个点……所以一直纠结这里怎么写一个默认的函数体来作为默认函数执行= =|||

现在明白了,总结如上。

感谢上面两位热心朋友的帮助!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...