C++: 错误: ‘class’ 没有名为的成员

标签 c++ class inheritance polymorphism member

为了我的毕业论文,我正在编写一些有限元代码,或者更准确地说,我正在修改一个现有程序,该程序基于我的教员提供的 2 类库。因此,我不能修改这些类,因为它们是通用的。

我创建了一个类 BurgersMSrc,它继承自父类 ValSrc。我用 calcFourierCoefficient 方法扩展了子类。在编译期间,我收到以下错误:

burgers1d.cpp:268:12: error: ‘class ValSrc’ has no member named ‘calcFourierCoefficient’

这是有道理的,因为变量定义为:

ValSrc* srcTerm;

没有定义方法。稍后变量被实例化为

srcTerm = new ConstVS(f);

srcTerm = new BurgersMSrc(prm);

实例化取决于问题类型。有条件地将 srcTerm 定义为 ConstVSBurgersMSrc 对象会产生:

error: ‘srcTerm’ was not declared in this scope

这也不是一个选择。

所以最后我的问题是:

If a variable is defined as a parent class, but instantiated as a child class, how do I access the child's method(s)?

非常感谢任何帮助,并提前感谢您的回答。

编辑

仅供引用,我在 C++ 方面不是很有经验,但我在 C# 和 VBA 方面有一些编程经验。然而,我确实喜欢学习,所以非常欢迎指向正确方向的指针:)

/编辑

头文件中的相关行:

#ifndef BurgersMSS_H
#define BurgersMSS_H
#include "mfem.hpp"
#include "mex.h"

class BurgersMSol: public ValSrc
{
   ...
};

class BurgersMSrc: public ValSrc
{

public:

    typedef ValSrc Super;

    BurgersMSrc(ParamDB &prm) {init(prm);}
    virtual void init(ParamDB &prm);

    ~BurgersMSrc(){}

    inline void getValues  (Vector &coords, Vector &msrc){}
    void calcFourierCoefficient(int p){}

private:

    double   nu;
    double   Tn;
    int prob;
    int nTimeSteps;
    int specModes;
    double s_n;
    double tT;
    double deltaT;
    vector <double> a_re;
    vector <double> a_im;
    int accuracy;
    double randomNr;

    double randomNumber(int p){return randomNr;}

};

#endif

CPP 文件中的相关行:

#include "BurgersMSS.h"

void BurgersMSol::init(ParamDB &prm) 
{ 
    ...
}

BurgersMSol::~BurgersMSol(){}

inline void BurgersMSol::getValues (Vector &coords, Vector &msol) 
{
    ...
}

BurgersMSrc::init(ParamDB &prm) 
{ 
    Super::init(); objectName="BurgersMSrc";
    nu = 1.0; prm.find("nu", nu);
    prob = 1; prm.find("problem", prob);
    if (prob == 3)
    {
        ...
        this->calcFourierCoefficient(accuracy);
    }
}

BurgersMSrc::~BurgersMSrc(){}

inline void BurgersMSrc::getValues  (Vector &coords, Vector &msrc)
{
    ...
}

void BurgersMSrc::calcFourierCoefficient(int p)
{   
    for(int n=0;n<specModes;n++)
    {
        if (time == 0)
        {
            a_re[n] = randomNumber(p);
            a_im[n] = randomNumber(p);
        }
        else
        {
            a_re[n] = a_re[n]*exp(-tT) + randomNumber(p);
            a_im[n] = a_im[n]*exp(-tT) + randomNumber(p);
        }
    }
}

double BurgersMSrc::randomNumber(int p)
{
    int mod = pow(10,p);    
    int rN = -mod + rand() % (2*mod);
    randomNr = rN/(double)mod;
    return randomNr;
}

主程序中的相关行:

#include "mfem.hpp"
#include "mex.h"
#include "BurgersMSS.h"
...

int main (int argc, char *argv[]) {
    ...

    ValSrc *srcTerm;
    ...

    if (problem==1) {
        ... srcTerm = new ConstVS(f);
        ...
    } else if (problem==2) {
        ... srcTerm  = new ConstVS(f);
        ...
    } else if (problem==3){
        srcTerm = new BurgersMSrc(prm); 
        ...
    } else {
        srcTerm = new BurgersMSrc(prm); 
        ...
    }

    ...
    stiffInt->setSrc(*srcTerm);
    ...

    for (int step = 0; step < nTimeSteps; step ++) {
    ...
        if (problem == 3)
        {
            srcTerm->calcFourierCoefficient(accuracy); //This line throws the error
        }
        ...
    }

    ...
    return 0;

}

最佳答案

如果 ValSrc 没有方法 calcFourierCoefficient,那么您不能在指向 ValSrc 的指针上调用该方法。您必须转换为适当的类型。例如:

BurgersMSrc* p = dynamic_cast<BurgersMSrc*>(srcTerm);

if (p)
{
  p->calcFourierCoefficient(accuracy);
} else
{
  // srcTerm was not pointing to an instance of the appropriate type
}

关于C++: 错误: ‘class’ 没有名为的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16873312/

相关文章:

java - 最终打印语句返回 null (java)

java - Hibernate继承,多态保存

c++ - 理解策略模式

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 为什么 OnDraw 不够用(在 MFC 中,Scribble 教程)

delphi - RTTI:如何获取声明为类属性的动态数组的值

java - 是否可以在 Java 中#define 一个类?

c++ - 在这种情况下是否有必要进行范围解析?

c++ - QObject::connect() 带有枚举参数

c++ - 是否有必要通过常量引用传递迭代器