Qwt源码解读之QwtSpline类

QwtSpline类提供了样条插值算法

代码分析:

1、 类接口定义:

class QWT_EXPORT QwtSpline
{
public:
    //! Spline type
    enum SplineType
    {
        //! A natural spline
        Natural,
        //! A periodic spline
        Periodic
    };

    QwtSpline();
    QwtSpline( const QwtSpline & );
    ~QwtSpline();
    QwtSpline &operator=( const QwtSpline & );

    void setSplineType( SplineType );
    SplineType splineType() const;
    bool setPoints( const QPolygonF& points ); // 尽管函数名和返回值形式看起来有点别扭,但在某些情况下还是可以接受的!
    QPolygonF points() const;

    void reset();
    bool isValid() const;
    double value( double x ) const;

    const QVector<double> &coefficientsA() const;
    const QVector<double> &coefficientsB() const;
    const QVector<double> &coefficientsC() const;
protected:
    bool buildNaturalSpline( const QPolygonF & );
    bool buildPeriodicSpline( const QPolygonF & );
private:
    class PrivateData;
    PrivateData *d_data;
};
说明:1)使用了 Pimpl 惯用法使类的私有数据成员真正的做到信息隐藏(即不可访问且不可见)。 Pimpl 惯用法将私有部分隐藏在一个不透明的指针后面。从而实现了“编译器防l墙”。关于Pimpl 的更多解释,请参考相关书籍和网上资料。
           2)类的嵌套类型PrivateData:如果定义成 class PrivateData *d_data;  这种形式,虽然合法,但是意义不同。此时PrivateData 处于外围名字空间中,而不是类的嵌套类型。

2、嵌套类型的定义代码通常写在cpp文件中:

class QwtSpline::PrivateData
{
public:
    PrivateData():
        splineType( QwtSpline::Natural )
    {
    }
    QwtSpline::SplineType splineType;
    // coefficient vectors
    QVector<double> a;
    QVector<double> b;
    QVector<double> c;
    // control points
    QPolygonF points;
};
3、由于使用了Pimpl惯用法,故类需要实现类的三法则(the Law of The Big Three),即析构函数,拷贝构造函数,拷贝赋值操作符函数。

//! Constructor
QwtSpline::QwtSpline()
{
    d_data = new PrivateData;
}
/*!
   Copy constructor
   \param other Spline used for initilization
*/
QwtSpline::QwtSpline( const QwtSpline& other )
{
    d_data = new PrivateData( *other.d_data );  // 为成员数据分配内存空间,并初始化。
}
/*!
   Assignment operator
   \param other Spline used for initilization
*/
QwtSpline &QwtSpline::operator=( const QwtSpline & other )
{
    *d_data = *other.d_data;
    return *this;
}
//! Destructor
QwtSpline::~QwtSpline()
{
    delete d_data;
} 
4、状态重置:

//! Free allocated memory and set size to 0
void QwtSpline::reset()
{
    d_data->a.resize( 0 );
    d_data->b.resize( 0 );
    d_data->c.resize( 0 );
    d_data->points.resize( 0 );
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值