在c ++中重新定义类错误

时间:2018-02-28 14:16:56

标签: c++ numerical-methods

我使用同样的错误搜索了其他一些页面,但是我的代码没有我能找到的任何问题。

我在quadrature.h中定义了一个名为QBase的基类:

#ifndef SRC_QUADRATURE_H_
#define SRC_QUADRATURE_H_

#include "enum_order.h"
#include "enum_quadrature_type.h"
#include <vector>
#include <memory>

class QBase
{
    protected:

        QBase (const Order _order=INVALID_ORDER);

    public:

        virtual ~QBase() {}

        virtual QuadratureType type() const = 0;

        static std::unique_ptr<QBase> build (const QuadratureType qt, const Order order=INVALID_ORDER);

        const std::vector<double> & get_points() const { return _points; }
        const std::vector<double> & get_weights() const { return _weights; }
        std::vector<double> & get_points() { return _points; }
        std::vector<double> & get_weights() { return _weights; }

    protected:

        const Order _order;

        std::vector<double> _points;
        std::vector<double> _weights;
};

#endif /* SRC_QUADRATURE_H */

我通过在gauss_legendre.h中定义的QBase派生出一个QGaussLegendre类

#ifndef SRC_QUADRATURE_GAUSSLEGENDRE_H_
#define SRC_QUADRATURE_GAUSSLEGENDRE_H_

#include "quadrature.h"

class QGaussLegendre : public QBase
{
    public: 

         QGaussLegendre (const Order _order=INVALID_ORDER) : QBase (_order){}

         ~QGaussLegendre (){}

         virtual QuadratureType type() { return QGAUSSLEGENDRE; }
};

#endif /* SRC_QUADRATURE_GAUSSLEGENDRE_H_ */

在主文件中,我使用build()成员函数来获取点和权重,如下所示

const Order order = ddp.order;
const QuadratureType qt = ddp.qt;

static std::unique_ptr<QBase> qr(QBase::build(qt,order));

const std::vector<double>& points = qr->get_points();
const std::vector<double>& weights = qr->get_weights();

直到这里我没有任何问题。现在,点和权重在文件legendre_gauss.cxx

中定义
#include "gauss_legendre.h"

QGaussLegendre::QGaussLegendre(const Order order)
{

    switch(order)
    {

       case CONSTANT:
       case FIRST:
       {
           _points.resize (1);
           _weights.resize(1);

           _points[0](0)  = 0.;

           _weights[0]= 2.;
        }
     }
}  

当我编译最后一个文件时,我收到错误:

/home/matteo/flux/gauss_legendre.cxx:13:1: 
error: redefinition of ‘QGaussLegendre::QGaussLegendre(qenum::Order)’
 QGaussLegendre::QGaussLegendre(const Order order)
 ^~~~~~~~~~~~~~
In file included from /home/matteo/flux/gauss_legendre.cxx:8:0:
/home/matteo/flux/gauss_legendre.h:25:3: 
note: ‘QGaussLegendre::QGaussLegendre(qenum::Order)’ previously 
defined here
 QGaussLegendre (const Order _order=INVALID_ORDER) : QBase (_order)
 ^~~~~~~~~~~~~~

我能解决这个问题吗?非常感谢。

1 个答案:

答案 0 :(得分:3)

  

重新定义类错误

这不是关于重新定义类的错误。这是关于重新定义函数的错误。特别是,重新定义函数QGaussLegendre::QGaussLegendre(const Order order),它是类QGaussLegendre的结构。

您首先在quadrature.h

中定义了它
QGaussLegendre (const Order _order=INVALID_ORDER) : QBase (_order){}

第二次来自legendre_gauss.cxx

QGaussLegendre::QGaussLegendre(const Order order)
{
  

我能解决这个问题吗?

解决方案是将函数恰好定义一次。