2013-06-05 2 views
0

Привет люди stackoverflow,C++ создать и скомпилировать класс

Я новичок, когда дело доходит до C++. Я попытался создать класс, но, конечно, я получаю сообщения об ошибках при компиляции моей программы. Я здесь, надеюсь, некоторые из вас скажут мне, что не так с моей программой, и что я делаю неправильно!

P.S. : Я использую OpenFOAM, поэтому некоторые вещи отличаются, например, расширение «.C» (вместо «.cpp») и использование библиотеки Foam.

Vessels.H

#ifndef Vessels_H 
#define Vessels_H 

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 

class Vessels 
{ 
public: 

Vessels(double xCoordinate, double yCoordinate, double zCoordinate, double vesselLength, double vesselRadius, double P_outside, double P_inside); 
int pointIndex(); 
double flowRate(); 
double wellModel(); 

private: 

double m_xCoordinate, m_yCoordinate, m_zCoordinate, m_vesselLength, m_vesselRadius, m_P_outside, m_P_inside; 
double flow, meshVolume, meshSize, equivalentRadius; 
int index; 

}; 

#include "Vessels.C" 
#endif 

Vessels.C

#include "Vessels.H" 

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // 

// CONSTRUCTOR 

Vessels::Vessels(double xCoordinate, double yCoordinate, double zCoordinate, double vesselLength, double vesselRadius, double P_outside, double P_inside) : m_xCoordinate(xCoordinate), m_yCoordinate(yCoordinate), m_zCoordinate(zCoordinate), m_vesselLength(vesselLength), m_vesselRadius(vesselRadius), m_P_outside(P_outside), m_P_inside(P_inside) 
{ 

} 

// METHODS 

// Corresponding index for point (xCoordinate,yCoordinate,zCoordinate) 

int Vessels::pointIndex() 
{ 
    return mesh.findCell(point(m_xCoordinate,m_yCoordinate,m_zCoordinate)); 
} 

// Calculation of flow rate in the vessel using the Hagen-Poiseuille equation 

double Vessels::flowRate() 
{ 
    return M_PI*Foam::pow(m_vesselRadius,4.0)/(8.0*mu.value*m_vesselLength)*(m_P_inside-m_P_outside); 
} 

// Numerical well model 

double Vessels::wellModel() 
{ 
    Vessels vessel(double xCoordinate, double yCoordinate, double zCoordinate, double vesselLength, double vesselRadius, double P_outside, double P_inside); 
    index = vessel.pointIndex(); 
    flow = vessel.flowRate(); 
    meshVolume = mesh.V()[index]; 
    meshSize = Foam::pow(meshVolume,1.0/3); 
    equivalentRadius = 3.0*meshSize/(3.0+2.0*M_PI*meshSize); 

    m_P_inside = P[index] + mu.value*flow/(4.0*M_PI*K)*(1.0/equivalentRadius - 1.0/m_vesselRadius); 
    return m_P_inside; 
} 

Если какой-либо интерес для любого, вот мои ошибки компилятора до сих пор:

Vessels.C: In member function ‘double Vessels::flowRate()’: 
Vessels.C:65:52: erreur: invalid operands of types ‘double’ and ‘<unresolved overloaded function type>’ to binary ‘operator*’ 
Vessels.C: In member function ‘double Vessels::wellModel()’: 
Vessels.C:73:18: erreur: request for member ‘pointIndex’ in ‘vessel’, which is of non-class type ‘Vessels(double, double, double, double, double, double, double)’ 
Vessels.C:74:17: erreur: request for member ‘flowRate’ in ‘vessel’, which is of non-class type ‘Vessels(double, double, double, double, double, double, double)’ 
Vessels.C:79:35: erreur: invalid operands of types ‘<unresolved overloaded function type>’ and ‘double’ to binary ‘operator*’ 
Vessels.C: In member function ‘double Vessels::flowRate()’: 
Vessels.C:66:1: attention : contrôle a atteint la fin non void de la fonction [-Wreturn-type] 

спасибо! и я открыт для всех советов, чтобы лучше понять, как использовать C++!

+1

Почему вы включаете в себя Vessels.C в Vessels.h? В том числе Vessels.h на Vessels.C является правильным, но наоборот. – legends2k

+0

'mu.value' - Что это? – soon

+0

@ legendends2k, потому что когда я включаю Vessels.h в свою основную программу, тогда скомпилируйте main, он автоматически скомпилирует мой класс, а также – FYas

ответ

1
Vessels vessel(double xCoordinate, double yCoordinate, double zCoordinate, double vesselLength, double vesselRadius, double P_outside, double P_inside); 

Это объявление функции, а не объекта. Похоже, вы хотите создать копию своего объекта, но я не вижу причин для этого. Просто удалите его.

double Vessels::wellModel() 
{ 
    index = pointIndex(); 
    flow = flowRate(); 
    meshVolume = mesh.V()[index]; 
    meshSize = Foam::pow(meshVolume,1.0/3); 
    equivalentRadius = 3.0*meshSize/(3.0+2.0*M_PI*meshSize); 

    m_P_inside = P[index] + mu.value*flow/(4.0*M_PI*K)*(1.0/equivalentRadius - 1.0/m_vesselRadius); 
    return m_P_inside; 
} 

значение представляет собой функцию, которая извлекает значение размерном скаляр.

В этом случае, вы забыли круглые скобки здесь:

return M_PI*Foam::pow(m_vesselRadius,4.0)/(8.0*mu.value()*m_vesselLength)*(m_P_inside-m_P_outside); 
//              ^^ 
1

Ваша первая ошибка в строке:

return M_PI*Foam::pow(m_vesselRadius,4.0)/(8.0*mu.value*m_vesselLength)*(m_P_inside-m_P_outside); 

Эта линия является слишком длинным и сложным.

Разделите эту линию на четыре или пять простых и читаемых строк.

Создайте промежуточные переменные и дайте им значащие имена.

Создайте переменную double result = ..., в которой вы сохраняете конечный результат.

Вызов pow с одной переменной при каждом аргументе, а не с расчетами.

Таким образом, вы в худшем случае изолируете свои ошибки компиляции намного лучше, и в лучшем случае, возможно, даже исправите некоторые из них.

+1

ОК, попробуй это прямо сейчас! Спасибо. – FYas

0

Я думаю, что вы делаете функцию, а не объект

Сосуды сосудов (двойной xCoordinate, двойной yCoordinate, двойной zCoordinate, двойной vesselLength, двойной vesselRadius, двойной P_outside, двойной P_inside);

Смежные вопросы