我在使用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
,以强制编译器将数据放入只读存储器并从只读存储器访问数据(将数据复制到堆栈中)。创建类的数据成员时,编译器将使用默认或空的构造函数。