2013-06-05 121 views
0

你好人的stackoverflow,C++創建和編譯類

我是一個newby當涉及到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.h中包含Vessels.C?在Vessels.C中包括Vessels.h是正確的,但反過來是不正確的。 – legends2k

+0

'mu.value' - 這是什麼? – soon

+0

@ legends2k因爲當我在主程序中包含Vessels.h然後編譯主程序時,它會自動編譯我的班級 – 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

我覺得你是一個函數,而不是對象

容器容器(雙x座標,y座標雙,雙zCoordinate,雙vesselLength,雙vesselRadius,雙P_outside,雙P_inside);