From f9367b235b17a08845c35ede9c21240df05d3db1 Mon Sep 17 00:00:00 2001 From: Yixuan Qiu Date: Thu, 8 Dec 2016 19:56:14 -0500 Subject: [PATCH] do not mix overloading with virtual functions --- README.md | 8 +++++++- inst/include/Func.h | 14 +++++++------- inst/include/integration/Integrator.h | 2 +- vignettes/introduction.Rmd | 8 +++++++- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a69668c..6fd4d09 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,13 @@ class Func { public: virtual double operator()(const double& x) const = 0; - virtual void operator()(double* x, const int n) const + virtual void eval(double* x, const int n) const { for(int i = 0; i < n; i++) x[i] = this->operator()(x[i]); } + + virtual ~Func() {} }; ``` @@ -158,6 +160,8 @@ class MFunc { public: virtual double operator()(Constvec& x) = 0; + + virtual ~MFunc() {} }; ``` @@ -276,6 +280,8 @@ class MFuncGrad { public: virtual double f_grad(Constvec& x, Refvec grad) = 0; + + virtual ~MFuncGrad() {} }; ``` diff --git a/inst/include/Func.h b/inst/include/Func.h index 9f3adf1..021714d 100644 --- a/inst/include/Func.h +++ b/inst/include/Func.h @@ -23,14 +23,14 @@ typedef const Eigen::Ref Constvec; class Func { public: - virtual ~Func() {} - virtual double operator()(const double& x) const = 0; - virtual void operator()(double* x, const int n) const + virtual void eval(double* x, const int n) const { for(int i = 0; i < n; i++) x[i] = this->operator()(x[i]); } + + virtual ~Func() {} }; @@ -39,9 +39,9 @@ class Func class MFunc { public: - virtual ~MFunc() {} - virtual double operator()(Constvec& x) = 0; + + virtual ~MFunc() {} }; @@ -49,9 +49,9 @@ class MFunc class MFuncGrad { public: - virtual ~MFuncGrad() {} - virtual double f_grad(Constvec& x, Refvec grad) = 0; + + virtual ~MFuncGrad() {} }; diff --git a/inst/include/integration/Integrator.h b/inst/include/integration/Integrator.h index 1366d33..ab0280d 100644 --- a/inst/include/integration/Integrator.h +++ b/inst/include/integration/Integrator.h @@ -552,7 +552,7 @@ class Integrator } // Evaluate points. - f(points.data(), 2 * numKronrodRows - 1); + f.eval(points.data(), 2 * numKronrodRows - 1); Eigen::Array& fPoints = points; // Alias of points const Scalar fCenter = fPoints[0]; diff --git a/vignettes/introduction.Rmd b/vignettes/introduction.Rmd index 0b2edbb..60040b5 100644 --- a/vignettes/introduction.Rmd +++ b/vignettes/introduction.Rmd @@ -58,11 +58,13 @@ class Func { public: virtual double operator()(const double& x) const = 0; - virtual void operator()(double* x, const int n) const + virtual void eval(double* x, const int n) const { for(int i = 0; i < n; i++) x[i] = this->operator()(x[i]); } + + virtual ~Func() {} }; ``` @@ -205,6 +207,8 @@ class MFunc { public: virtual double operator()(Constvec& x) = 0; + + virtual ~MFunc() {} }; ``` @@ -364,6 +368,8 @@ class MFuncGrad { public: virtual double f_grad(Constvec& x, Refvec grad) = 0; + + virtual ~MFuncGrad() {} }; ```