我在使用C ++类时遇到了麻烦。我正在编写一个类(cSpline)以对一组输入点进行三次样条拟合。我想在另一个类(ss304,提供作为温度函数的304不锈钢类型的属性)中使用cSpline对象。我有四个文件。这是我想出的代码:

cSpline.h:

class cSpline {
private:
  double *setCoeffs(double* x_in, double* f_in, int size);
  double *coeffs;
  double *f;
  double *x;
  int sizex;
public:
  double *interpolate(double* y, int sizey);
  cSpline(double* x_in, double* f_in, int size);
};


cSpline.cpp:

cSpline::cSpline(double* x_in, double* f_in, int size) {
  f = f_in;
  x = x_in;
  sizex = size;
  coeffs = setCoeffs(x, f, size);
}

double* cSpline::setCoeffs (double* x_in, double* f_in, int size) {
  double *ypp = new double[size];
  for (int i = 0; i < size; i++) {
    ypp[i] = 0.0;
  }
  return ypp;
}

double* cSpline::interpolate(double* y, int sizey){
  double *g = new double[sizey];
  for (int i = 0; i < sizey; i++) {
    g[i] = 0.0;
  }
  return g;
}


ss304.h:

#include "cSpline.h"

class SS304 {
private:
    // Material constants
  static const double T0 =     273.0; // standard temp, K
  static const double rho0 =  7924.0; // density at STP, kg/m^3
  static const double Tm =    1700.0; // melting temp, K
  static const double Hm =  265.3+03; // heat of melting, J/kg
  static const double rhom =  7015.0; // density of molten phase at Tm (iron), kg/m^3/K
  static const double drdt =  -0.883; // temperature coefficient of densiy at Tm, kg/m^3/K
  static const double Tv =    3100.0; // vaporization temperature, K
  static const double Hv = 6.258e+06; // heat of vaporization, J/kg
    // Property Array Sizes
  static const int Na1 = 10;
    // Property Arrays
  double alpha1[Na1];   //thermal expansivity, T0 < T < Tm, 1/K
  double Talpha1[Na1];
  cSpline csalpha1(double* x, double* f, int size);
public:
  double* alpha;
  void setProp1D(double* T, int size);
  SS304();
};


ss304.cpp:

#include "ss304.h"

SS304::SS304() {
  double alpha1[Na1]  = {13.6e-6, 16.1e-6, 17.15e-6, 17.8e-6, 18.65e-6, 19.2e-06, 19.85e-06, 20.55e-06, 20.9e-06};
  double Talpha1[Na1] = {   200.,    400.,     500.,    600.,     700.,     800.,     1000.,     1200.,    1400.};

  cSpline csalpha1(Talpha1, alpha1, Na1);
}

void SS304::setProp1D(double* T, int size) {
  double* alpha = new double[size];
  alpha[0] = csalpha1.interpolate(T[0]);
}


我要在这里完成的工作是:在创建ss304对象后,我将304不锈钢的属性(在本例中为alpha1)设置为给定的温度Talpha1。然后,我创建一个cSpline对象csalpha1,供以后使用。继续创建cSpline对象并计算样条系数。然后,当我使用温度数组调用SS304 :: setProp1D时,应基于T []中每个温度下三次样条的插值来设置alpha []的值。显然,为了节省空间,我省略了样条的完整实现,但是该实现与我得到的错误无关,即:


  ss304.cpp:在成员函数“ void SS304 :: setProp1D(double *,int)”中:
  
  ss304.cpp:12:错误:“(((SS304 *)this)-> SS304 :: csalpha1”没有类类型


因此,我认为我对类在C ++中的工作方式有一些基本的误解。我想我想像在Python中一样使用它们,在那里我可以正常工作。但是,显然我在C ++中缺少某些东西。我已经在Google上搜索了很多,但是没有找到我所理解的帮助。任何帮助将不胜感激。

最佳答案

您不能通过调用数据成员的构造函数来初始化该数据成员。您将需要为对象分配或初始化方法:

SS304::SS304()
{
    static const double alpha1[Na1]  = {13.6e-6, 16.1e-6, 17.15e-6,
                                        17.8e-6, 18.65e-6, 19.2e-06,
                                        19.85e-06, 20.55e-06, 20.9e-06};
    static const double Talpha1[Na1] = {200.,    400.,     500.,
                                        600.,    700.,     800.,
                                       1000.,   1200.,    1400.};
    csalpha1.initialize(Talpha1, alpha1, Na1);
}


另外,熟悉初始化列表和C ++常见问题解答(可通过搜索网络找到)。

我将数组转换为static const,以强制编译器将数据放入只读存储器并从只读存储器访问数据(将数据复制到堆栈中)。

创建类的数据成员时,编译器将使用默认或空的构造函数。

10-08 11:37