函数指针的声明方法

以前用函数指针用的少。但是今天遇到了一个需要改写的项目,里面出现了函数指针的使用。假如一个类中有一个成员是函数指针,则声明函数指针的方式如下:

T (* funcPtr)(T1, T2,....);

T是函数的返回类型,T1,T2...是输入参数。

下面的代码给出一个使用示例。

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    float       (* m_fPtr)(float);//函数指针声明
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

cpp文件(部分代码来自https://blog.csdn.net/xtlisk/article/details/51249371):

#include "mainwindow.h"
#include "ui_mainwindow.h"

float fQuake3(float x)
{
    float xhalf = 0.5 * x;
    int i = *(int*)&x; // get bits for floating value
    i = 0x5f3759df - (i >> 1); // gives initial guess
    x = *(float*)&i; // convert bits back to float
    x = x * (1.5 - xhalf * x * x); // Newton step

    //版权声明:本文为CSDN博主「xtlisk」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    //原文链接:https://blog.csdn.net/xtlisk/article/details/51249371

    return 1/x;
}

float fSqrt(float x)
{
    return sqrt(x);
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->RBtnSQRT->setChecked(true);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    if(ui->RBtnQuake3->isChecked())
    {
        m_fPtr = fQuake3;
    }
    else
    {
        m_fPtr = fSqrt;
    }

    float fInput = ui->doubleSpinBox->value();
    float fOutput = m_fPtr(fInput);
    ui->doubleSpinBox_2->setValue((double)fOutput);
}

注意m_fPtr的使用。

这个程序允许用户采用两种方法计算平方根。一种是c++ math库中自带的sqrt函数,另一种采用卡马克在quake3中采用的近似算法。计算效果:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值