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 );
}