C++ Erreur: ne pas avoir un type de classe
Je vais avoir un peu de difficulté avec des classes C++. Je suis en train d'écrire une classe (cSpline) pour en faire un spline cubique tenir sur un ensemble de points d'entrée. Je veux utiliser un cSpline objet à l'intérieur d'une autre classe (ss304, qui fournit des propriétés de type 304 acier inoxydable en fonction de la température). J'ai quatre fichiers. Voici le code que j'en suis venu avec:
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]);
}
Ce que j'essaie de faire ici est ceci: Lors de la création d'un ss304 objet, je définissez les propriétés de l'inox 304, dans ce cas, alpha1, à un ensemble donné de températures, Talpha1. Puis-je créer un cSpline objet, csalpha1, pour les utiliser plus tard. Création de la cSpline objet va de l'avant et calcule la courbe des coefficients. Puis, quand je l'appelle SS304::setProp1D avec un éventail de températures, il doit définir les valeurs de alpha[] basé sur une interpolation de spline cubique à chaque température T[]. Évidemment, j'en ai laissé la pleine mise en œuvre de la spline pour des raisons d'espace, mais la mise en œuvre n'est pas pertinent pour l'erreur que j'obtiens, qui est:
ss304.cpp: En fonction de membre de ‘void SS304::setProp1D(double*, int)’:
ss304.rpc:12: erreur: ‘((SS304*)this)->SS304::csalpha1’ n'a pas de type de classe
Donc, je pense que j'ai quelques base de l'incompréhension de la façon dont exactement les classes en C++. Je pense que je suis en train de les utiliser comme je le fais en Python, où j'ai cela fonctionne très bien. Mais, évidemment, je suis absent quelque chose en C++. J'ai googlé autour un peu, mais pas trouvé toute l'aide que j'ai compris. Toute aide serait grandement appréciée.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas initialiser un membre de données dans le constructeur en appelant le membre de données du constructeur. Vous aurez besoin d'une cession ou d'une méthode d'initialisation de l'objet:
Aussi, familiarisez-vous avec initialisation des listes et le C++ FAQ (qui peuvent être trouvés par la recherche sur le web).
J'ai converti les tableaux dans la
static const
pour forcer le compilateur à placer les données dans la Mémoire en Lecture Seule et d'y accéder à partir de la Mémoire en Lecture Seule (par rapport à la copie de données sur la pile).Le compilateur utilisera un défaut ou d'un constructeur vide lors de la création des données membres d'une classe.
Mal. En C++,
static const double
ne peut pas être initialisé dans la classe de définition de lui-même. Seulement statique intégrale type peut être initialisé à l'intérieur de la classe.Aussi, vous ne pouvez pas initialiser tableaux de membre dans le constructeur comme vous l'avez fait. C'est également à tort. En fait, il n'y a aucun moyen que vous pouvez initialiser eux. Cependant, vous pouvez faire ceci:
Maintenant, je vous suggère de lire quelque bon livre d'abord, parce que je sens qu'il y a beaucoup de choses de base que vous devez savoir avant d'écrire des classes en C++. Voici une liste de quelques livres recommandés; choisir n'importe quel livre d'introduction:
Il me semble que
cSpline csalpha1(double* x, double* f, int size);
est une fonction, alors vous devriez l'appeler alors appelinterpolate
sur la valeur de retour:Ce que vous avez est une déclaration de fonction:
Je suppose que tu voulais une variable de membre donc utiliser
cSpline csalpha1;