我在使用C ++类时遇到了一些麻烦。我正在编写一个类(cSpline)来对一组输入点进行三次样条拟合。我想在另一个类中使用cSpline对象(ss304,它提供304型不锈钢的属性作为温度的函数)。我有四个文件。这是我提出的代码:
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) - &gt; SS304 :: csalpha1'没有类型
所以,我认为我对C ++中的类是如何工作有一些基本的误解。我想我正试图像在Python中那样使用它们,我在这里工作得很好。但是,显然我在C ++中缺少一些东西。我已经搜索了很多,但没有找到任何我理解的帮助。任何帮助将不胜感激。
答案 0 :(得分:2)
您无法通过调用数据成员的构造函数来初始化构造函数中的数据成员。您将需要对象的赋值或初始化方法:
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 ++ FAQ(可通过搜索网络找到)。
我将数组转换为static const
以强制编译器将数据放入只读存储器并从只读存储器访问它(而不是将数据复制到堆栈中)。
在创建类的数据成员时,编译器将使用默认或空构造函数。
答案 1 :(得分:1)
static const double T0 = 273.0; // standard temp, K
static const double rho0 = 7924.0; // density at STP, kg/m^3
错误。在C ++中,static const double
无法在类定义本身中初始化。只能在类中初始化静态积分类型。
此外,您无法在构造函数中初始化成员数组,就像您已经完成的那样。那也是错的。实际上,你无法初始化它们。但是,您可以这样做:
SS304::SS304()
{
double local_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 local_Talpha1[Na1] = { 200., 400., 500., 600., 700., 800., 1000., 1200., 1400.};
std::copy(local_alpha1, local_alpha1 + Na1, alpha1);
std::copy(local_Talpha1, local_Talpha1+ Na1, Talpha1);
}
现在我建议你先阅读一些好书,因为我觉得在用C ++编写类之前你需要了解很多基本的东西。这是一些推荐书籍的清单;选择任何入门书:
答案 2 :(得分:0)
在我看来cSpline csalpha1(double* x, double* f, int size);
是一个函数,所以你应该调用它然后在返回值上调用interpolate
:
void SS304::setProp1D(double* T, int size) {
double* alpha = new double[size];
alpha[0] = csalpha1(..., ..., ...).interpolate(T[0]);
}
答案 3 :(得分:0)
你所拥有的是一个功能声明:
cSpline csalpha1(double* x, double* f, int size);
我想你想要一个成员变量,所以使用cSpline csalpha1;