C++ 错误:没有类类型

Posted

技术标签:

【中文标题】C++ 错误:没有类类型【英文标题】:C++ Error: does not have a class type 【发布时间】:2011-07-28 15:42:55 【问题描述】:

我在使用 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 对象时,我在给定的一组温度 Talpha1 下设置 304 不锈钢的属性,在本例中为 alpha1。然后我创建一个 cSpline 对象 csalpha1 以供以后使用。 cSpline 对象的创建继续进行并计算样条系数。然后,当我用一组温度调用 SS304::setProp1D 时,它应该根据 T[] 中每个温度的三次样条插值来设置 alpha[] 的值。显然,为了篇幅,我省略了样条的完整实现,但实现与我得到的错误无关,即:

ss304.cpp:在成员函数‘void SS304::setProp1D(double*, int)’中:

ss304.cpp:12: 错误:'((SS304*)this)->SS304::csalpha1' 没有类类型

所以,我认为我对 C++ 中类的工作原理存在一些基本误解。我想我正在尝试像在 Python 中一样使用它们,在那里我可以正常工作。但是,显然我在 C++ 中遗漏了一些东西。我用谷歌搜索了很多,但没有找到任何我理解的帮助。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

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

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 以强制编译器将数据放入只读内存并从只读内存访问它(而不是将数据复制到堆栈上)。

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

【讨论】:

谢谢,托马斯。这回答了我的问题。我将 cSpline 构造函数更改为什么都不做,现在我直接从 SS304 构造函数中调用 setCoeffs 函数。进一步的测试将看看我是否正确地完成了所有这些,但它现在可以编译。根据几个 cmets,还有一些其他的东西需要改变。【参考方案2】:
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 不能在类定义本身中初始化。类内部只能初始化静态integral类型。

此外,您不能像之前那样在构造函数中初始化成员数组。那也是错误的。事实上,您无法初始化它们。但是,您可以这样做:

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++ 编写类之前你需要了解很多基本的东西。这是一些推荐书籍的清单;选择任何入门书籍:

The Definitive C++ Book Guide and List

【讨论】:

这样的规则总是会提醒你 C++ 标准是多么糟糕 @yi_H: 一切编程语言都以某种方式f..d up 重点是如何。在我所知道的所有语言中,php 和 C++ 在这方面是最差的。 PHP 只是一堆没有太多概念的乱七八糟的东西,而 C++ 有一些规则,如果你用一些 cmets 将它们全部打印出来并展示给打算学习该语言的人,他会跑掉,尖叫.. . (现在 c++0x 又增加了一大堆特性。别误会,它们都很有用,但现在标准的整体大小简直荒谬)。 谢谢,纳瓦兹。执行初始化字符串来设置常量并使用 local_ 数组,然后复制它们让我可以做我想做的事。托马斯的回答让我解决了“不是类类型”的问题。【参考方案3】:

在我看来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]);

【讨论】:

【参考方案4】:

你有一个函数声明:

cSpline csalpha1(double* x, double* f, int size);

我猜你想要一个成员变量所以使用cSpline csalpha1;

【讨论】:

以上是关于C++ 错误:没有类类型的主要内容,如果未能解决你的问题,请参考以下文章

错误:ISO C++ 禁止声明没有类型的“对象”

没有类类型 C++

xcode c++错误:分配抽象类类型'Grain'的对象

C++ 类 Typedef Struct 没有命名类型

C++ 线程错误:没有名为“type”的类型

c++错误类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)