2013-07-01 96 views
0

我已經編輯以前的帖子給予更完整的問題,以便:對象申報錯誤

我有一個名爲定日鏡,在頭文件我想使5人objects.3從類Vector類和其中2個來自類目標。矢量類構造函數需要作爲運算符目標對象或矢量對象。我得到的錯誤是程序無法將操作符識別爲任何類型。我會給你的代碼。 我在eclipse中爲arduino項目工作。

這是定日鏡類的頭:

#ifndef HELIOSTAT_H_ 
    #define HELIOSTAT_H_ 

    #include "Target.h" 
    #include "TargetCatalog.h" 
    #include "vector.h" 
    #include "Sun.h" 



    class Heliostat { 


    private: 


    public: 

     double Pitch; 
     double Azimuth; 

     Target heliostat(4501472.0,662766.0,1.0); 
     Target reactor(4501474.0,662768.0,30.0); 
     Vector sunsVec(Sun::getPitch1year(),Sun::getAzimuth1yearArcsin()); 
     Vector reactVec(heliostat,reactor); 
     Vector normalVec(reactVec,sunsVec); 

     Heliostat(); 
     virtual ~Heliostat(); 

    }; 

    #endif /* HELIOSTAT_H_ */ 

這將有不writen知道的一些功能。 cpp幾乎沒有任何東西只有空的構造函數。

目標類標頭:

#ifndef TARGET_H_ 
#define TARGET_H_ 

class Target { 

private: 


public: 
    enum targetlist{Helio,React,Normalpoint}; 

    double gpsX; 
    double gpsY; 
    double gpsZ; 

    Target(double gpsEast, double gpsNorth, double gpsAlt); 
    virtual ~Target(); 
}; 

#endif /* TARGET_H_ */ 

載體類的頭:

#ifndef VECTOR_H_ 
#define VECTOR_H_ 

#include "Target.h" 

class Vector { 
public: 

    double easting; 
    double northing; 
    double altitude; 


    Vector(Target startTarget,Target endTarget); 
    Vector(double targetsPitch,double targetsAzimuth); 
    Vector(Vector reactorVector,Vector sunVector); 
    double calculateInclinationAngle(Vector reactorVector,Vector sunVector); 
    double getPitch(Vector helioNormalVec); 
    double getAzimuth(Vector helioNormalVec); 
    virtual ~Vector(); 

}; 

#endif /* VECTOR_H_ */ 

和vector.cpp:

#include "vector.h" 
#include "Maths.h" 
#include "Target.h" 
//vector::vector() { 
// // TODO Auto-generated constructor stub 
// 
//} 

vector::vector(Target startTarget, Target endTarget) { 
    double eastingTemp=endTarget.gpsX-startTarget.gpsX; 
    double northingTemp=endTarget.gpsY-startTarget.gpsY; 
    double altitudeTemp=endTarget.gpsZ-startTarget.gpsZ; 
    double vecMagnitude=sqrt(pow(eastingTemp,2)+pow(northingTemp,2)+pow(altitudeTemp,2)); 
    easting=eastingTemp/vecMagnitude; 
    northing=northingTemp/vecMagnitude; 
    altitude=altitudeTemp/vecMagnitude; 
} 

vector::vector(double targetsPitch, double targetsAzimuth) { 

    easting=Maths::cosDeg(targetsPitch)*Maths::sinDeg(targetsAzimuth); 
    northing=Maths::cosDeg(targetsPitch)*Maths::cosDeg(targetsAzimuth); 
    altitude=Maths::sinDeg(targetsPitch); 
} 

vector::vector(vector normReactorVec, vector normSunVec) { 

    double inclinationAngle=calculateInclinationAngle(normReactorVec,normSunVec); 
    double normalMagnitude=2*Maths::cosDeg(inclinationAngle); 
    easting=(normReactorVec.easting+normSunVec.easting)/normalMagnitude; 
    northing=(normReactorVec.northing+normSunVec.northing)/normalMagnitude; 
    altitude=(normReactorVec.altitude+normSunVec.altitude)/normalMagnitude; 
} 

double vector::calculateInclinationAngle(vector reactorVector,vector sunVector) { 

    double angleResult=(reactorVector.easting*sunVector.easting) 
      + (reactorVector.northing*sunVector.northing) 
      + (reactorVector.altitude*reactorVector.altitude); 
    double inclinationAngleDoubled=Maths::arccos(angleResult); 
    double inclinationAngle=inclinationAngleDoubled/2.0; 
    return inclinationAngle; 
} 

double vector::getPitch(vector helioNormalVec) { 
    double pitch=Maths::arcsin(helioNormalVec.altitude); 
    if (pitch<0){ 
     pitch=0; 
     Serial.println(F("error on pitch calc")); 
    } 
    return pitch; 
} 

double vector::getAzimuth(vector helioNormalVec) { 

    double pitch=getPitch(helioNormalVec); 
    double theta=Maths::arcsin(helioNormalVec.easting/Maths::cosDeg(pitch)); 
    //taking absolute of theta function abs() get only int as operators 
    if (theta<0){ 
     theta=-theta; 
    } 

    double azimuth; 
    if (helioNormalVec.easting>0){ 
     if(helioNormalVec.northing>0){ 
      azimuth=theta; 
     }else if(helioNormalVec.northing<0){ 
      azimuth=180-theta; 
     }else{ 
      azimuth=90; 
     } 
    }else if(helioNormalVec.easting<0){ 
     if(helioNormalVec.northing>0){ 
      azimuth=360-theta; 
     }else if(helioNormalVec.northing<0){ 
      azimuth=180+theta; 
     }else{ 
      azimuth=270; 
     } 
    }else{ 
     if(helioNormalVec.northing>0){ 
      azimuth=0; 
     }else if(helioNormalVec.northing<0){ 
      azimuth=180; 
     }else{ 
      Serial.println(F("error on Azimuth calc")); 
     } 
    } 
    return azimuth; 
} 

vector::~vector() { 
    // TODO Auto-generated destructor stub 
} 

關於太陽類我只是使用2個函數返回雙打。 在這個poing沒有草圖我不指望程序做我正在驗證它的語法錯誤的東西。

的錯誤,我得到說:

'Sun::getPitch1year' is not a type 

這同樣適用於:getAzimuth1yearArcsin(),TargetCatalog :: rectorTarget,TargetCatalog :: heliostatTarget,reactVec,sunsVec。 對於定日鏡標頭的第一行。

Target heliostat(4501472.0,662766.0,1.0); 
Target reactor(4501474.0,662768.0,30.0); 

我得到的語法錯誤,即:預期「」或「...」前的數字常量

有關於這些問題的任何解決方案?

+1

都包括其中這些聲明是正確的?即編譯器在這一點上看到的功能是什麼? –

+0

包含在infdef之後的標題開頭。 – kyrpav

+0

你有循環包含嗎?你可以運行預處理器,看看編譯器正在處理什麼? –

回答

0

在heiliostat.h,行

Vector sunsVec(Sun::getPitch1year(),Sun::getAzimuth1yearArcsin());

聲明一個名爲sunsVec功能,應該聲明一下類型需要。當前的代碼嘗試調用兩個函數。

與函數返回類型的電池更換太陽:getPitch1year(),併爲Sun :: getAzimuth1yearArcsin做同樣的())