【发布时间】:2018-11-18 12:06:13
【问题描述】:
我有三个类模板都使用相同的成员数据和相同方法的不同实例。
我想创建一个基类模板并让这三个继承它:
#include <vector>
#include <memory>
template <typename Sde>
class EulerFdm
{
private:
std::shared_ptr<Sde> sde;
int NT;
public:
std::vector<double> x; // The mesh array
double k; // Mesh size
double dtSqrt;
public:
EulerFdm() = default;
EulerFdm(const std::shared_ptr<Sde>& stochasticEquation, int numSubdivisions)
: sde(stochasticEquation), NT(numSubdivisions)
{
NT = numSubdivisions;
k = sde->Expiry() / static_cast<double>(NT);
dtSqrt = std::sqrt(k);
x = std::vector<double>(NT + 1);
// Create the mesh array
x[0] = 0.0;
for (std::size_t n = 1; n < x.size(); ++n)
{
x[n] = x[n - 1] + k;
}
}
double advance(double xn, double tn, double dt, double normalVar, double normalVar2) const
{
return xn + sde->Drift(xn, tn) * dt + sde->Diffusion(xn, tn) * dtSqrt * normalVar;
}
};
template <typename Sde>
class EulerHeun
{
private:
std::shared_ptr<Sde> sde;
int NT;
public:
std::vector<double> x; // The mesh array
double k; // Mesh size
double dtSqrt;
public:
EulerHeun() = default;
EulerHeun(const std::shared_ptr<Sde>& stochasticEquation, int numSubdivisions)
: sde(stochasticEquation), NT(numSubdivisions)
{
NT = numSubdivisions;
k = sde->Expiry() / static_cast<double>(NT);
dtSqrt = std::sqrt(k);
x = std::vector<double>(NT + 1);
// Create the mesh array
x[0] = 0.0;
for (std::size_t n = 1; n < x.size(); ++n)
{
x[n] = x[n - 1] + k;
}
}
double advance(double xn, double tn, double dt, double normalVar, double normalVar2) const
{
auto a = sde->Drift(xn, tn);
auto b = sde->Diffusion(xn, tn);
auto suppValue = xn + a * dt + b * std::sqrt(dt) * normalVar;
return xn + 0.5 * (sde->Drift(suppValue, tn) + a) * dt
+ 0.5 * (sde->Diffusion(suppValue, tn) + b) * std::sqrt(dt) * normalVar;
}
};
template <typename Sde>
class FdmFRKI
{
private:
std::shared_ptr<Sde> sde;
int NT;
public:
std::vector<double> x; // The mesh array
double k; // Mesh size
double dtSqrt;
public:
FdmFRKI() = default;
FdmFRKI(const std::shared_ptr<Sde>& stochasticEquation, int numSubdivisions)
: sde(stochasticEquation), NT(numSubdivisions)
{
NT = numSubdivisions;
k = sde->Expiry() / static_cast<double>(NT);
dtSqrt = std::sqrt(k);
x = std::vector<double>(NT + 1);
// Create the mesh array
x[0] = 0.0;
for (std::size_t n = 1; n < x.size(); ++n)
{
x[n] = x[n - 1] + k;
}
}
double advance(double xn, double tn, double dt, double normalVar, double normalVar2) const
{
auto sqrk = std::sqrt(dt);
auto Wincr = sqrk * normalVar;
auto F1 = sde->Drift(xn, tn);
auto G1 = sde->Diffusion(xn, tn);
auto G2 = sde->Diffusion(xn + 0.5 * G1 * (Wincr - sqrk), tn);
return xn + (F1 * dt + G2 * Wincr + (G2 - G1) * sqrk);
}
};
我尝试构建一个基类 FdmBase 如下:
template<typename Sde>
class FdmBase
{
protected:
std::shared_ptr<Sde> sde;
int NT;
public:
std::vector<double> x;
double k;
double dtSqrt;
FdmBase() = default;
FdmBase(const std::shared_ptr<Sde>& stochasticEquation, int numSubdivision) : sde(stochasticEquation), NT(numSubdivisions)
{
NT = numSubdivisions;
k = sde->Expiry() / static_cast<double>(NT);
dtSqrt = std::sqrt(k);
x = std::vector<double>(NT + 1);
// Create the mesh array
x[0] = 0.0;
for (std::size_t n = 1; n < x.size(); ++n)
{
x[n] = x[n - 1] + k;
}
}
};
但是,当我删除派生类中的私有成员时,程序无法编译。
这就是我在 main() 方法中的调用方式:
auto fdm = std::shared_ptr<EulerFdm<Sde1>>(new EulerFdm<Sde1>(sde,NT));
【问题讨论】:
-
错误信息是什么?
-
它抱怨找不到数据。
-
请包含一个 main() 函数并提供一个Compilable, Minimal, Complete, and Verifiable Example。这有助于我们帮助您。如果您可以在仍然创建故障的同时尽可能简化您的问题,这将有助于我们隔离使您的代码正常工作的问题。
-
在编辑中我写下了我如何在 main() 中调用它。当不使用继承时,它可以工作。当我正式使用继承但保留派生类的所有实现时,它也有效。当我评论私人会员数据时,我收到一条错误消息。
-
发布的代码中没有继承。发布演示问题的代码。如果您更改这个和那个并进行这个小调整并删除该行并以不同的顺序重新排列三个片段,那么将证明问题的代码没有帮助。阅读minimal reproducible example。
标签: c++ inheritance class-template