2013-06-19 42 views
0

我是C++的新手,我一直在練習將舊的Java代碼翻譯成C++。我遇到了很多錯誤,幾乎放棄了希望。我也試圖修復主文件中的錯誤,我試圖在主文件中調用一個函數,但是我得到的語法錯誤像瘋了一樣,我不知道什麼是錯的。我試着用Google搜索並搜索幾周,以瞭解如何在main.cpp中修復這些錯誤。如果可以的話,我很感激你的幫助。錯誤LNK2001:無法解析的外部符號?我絕對失去了

// NamedStorm.cpp 
// CPP=> Function definition 
#include <iostream> 
#include <string> 

#include "NamedStorm.h" 
using namespace std; 

// Makes sure that the displayOutput method work properly 
std::ostream& operator<<(ostream& out, const NamedStorm& namedStorm); 

// Default Constructor definition (removed parameter due to issues) 
NamedStorm::NamedStorm(){ 

} 

// Overload construtor definition 
NamedStorm::NamedStorm(string sName, double wSpeed, string sCat,double sPress){ 
    stormName = sName; 
    stormCategory = sCat; 
    stormPressure = sPress; 
    stormCount++; 
} 
// Destructor definition 
NamedStorm::~NamedStorm(){} 

// Accessor function definition 
void NamedStorm::displayOutput(NamedStorm storm[]){ 
    for(int i = 0; i < sizeof(storm); i++){ 
     cout << storm[i] << "\n"; 
    } 
} 

void NamedStorm::sortByNames(NamedStorm storm[]){ 
    cout << "Sorting array in decsending alphabetical order by names..." << endl; 
    for(int k = 1; k < 4; k++){ 
     for(int i = 0; i < 4 - k; i++){ 
      if((storm[i].getName()).compare(storm[i+1].getName()) > 0){ 
       NamedStorm temp; 
       temp = storm[i]; 
       storm[i] = storm[i+1]; 
       storm[i+1] = temp; 
      } 
     } 
    } 
} 

void NamedStorm::getAverageWindSpeed(NamedStorm storm[]){ 
    double averageWSpeed = 0.0; 
    double totalWindSpeed = 0.0; 

    totalWindSpeed = storm[0].maxWindSpeed 
     + storm[1].maxWindSpeed + storm[2].maxWindSpeed + storm[3].maxWindSpeed 
     + storm[4].maxWindSpeed; 

    averageWSpeed = totalWindSpeed/sizeof(storm); 
    cout << "The average max wind speeds of storms: " << averageWSpeed << "mph"<< endl; 
} 

void NamedStorm::getAverageStormPressure(NamedStorm storm[]){ 
    double averageSPress = 0.0; 
    double totalStormPressure = 0.0; 

    totalStormPressure = storm[0].getStormPressure() 
     + storm[1].getStormPressure() + storm[2].getStormPressure() + storm[3].getStormPressure() 
     + storm[4].getStormPressure(); 

    averageSPress = totalStormPressure/5; 
    cout << "The Average storm pressure: " << averageSPress << " mb" << endl; 
} 

int NamedStorm::getStormCount(){ 
    return stormCount; 
} 

double NamedStorm::getStormPressure(){ 
    return stormPressure; 
} 

double NamedStorm::getWindSpeed(){ 
    return maxWindSpeed; 
} 

string NamedStorm::getStormCategory(){ 
    return stormCategory; 
} 

string NamedStorm::getName(){ 
    return stormName; 
} 


// Mutator function definition 

//NamedStorm.h

// Header => Function Declaration 
#include <iostream> 
#include <string> 

using namespace std; 

#ifndef NAMEDSTORM_H 
#define NAMEDSTORM_H 

class NamedStorm{ 
public: 
    // Default constructor declaration 
    NamedStorm(); 

    // Overloaded constructor declaration 
    NamedStorm(string, double, string, double); 

    // Destructor declaration 
    ~NamedStorm(); 

    // Accessor (GET methods in Java) functions declarations (will return variables), use const, when not changing member variables 
    static void displayOutput(NamedStorm storm[]); 
    static void sortByNames(NamedStorm storm[]); 
    static void sortByWindSpeed(NamedStorm storm[]); 
    static void getAverageWindSpeed(NamedStorm storm[]); 
    static void getAverageStormPressure(NamedStorm storm[]); 
    int getStormCount(); 
    double getStormPressure(); 
    double getWindSpeed(); 
    string getStormCategory(); 
    string getName(); 

    // Mutator functions (SET methods in Javinese) 
    void setStormName(); 
    void setStormCategory(); 
    void setMaxWindSpeed(); 
    void setStormPressure(); 

private: 
    string stormName; 
    string stormCategory; 
    double maxWindSpeed; 
    double stormPressure; 
    static int stormCount; 
}; 

// Main.cpp的

#include <iostream> 
#include <string> 

#include "NamedStorm.h" 

using namespace std; 

NamedStorm storm[5]; 

int main(){ 
    NamedStorm Chris("Chris", 70, "Tropical Storm", 990); 
    NamedStorm Alberto("Alberto", 45, "Tropical Storm", 1007); 
    NamedStorm Gordon("Gordon", 65, "Tropical Storm", 999); 
    NamedStorm Isaac("Isaac", 80, "1", 969); 
    NamedStorm Ernesto("Ernesto", 50, "Tropical Storm", 1006); 

    storm[0] = Alberto; 
    storm[1] = Chris; 
    storm[2] = Ernesto; 
    storm[3] = Gordon; 
    storm[4] = Isaac; 

    // Error: identifier not found 
    displayOutput(); 
    sortByNames(); 
    displayOutput(); 
    sortByWindSpeed(); 
    displayOutput(); 
    getAverageStormPressure(); 
    getAverageWindSpeed(); 
    return 0; 
} 
+0

確定LNK2001錯誤不再出現,現在它只是在main.cpp中調用函數的「標識符未找到」錯誤 –

回答

0

我可能會建議將它分解成小塊(註釋所有的東西),並在添加項背每次一個 - 確保你在每個人都瞭解你的時候。

在「找不到標識符」上,它看起來像是在嘗試調用靜態類方法,但它沒有以類的名稱作爲前綴。我認爲不是:

displayOutput(); 
在主

(),你想:

NamedStorm::displayOutput(); 

但即使是因爲該方法需要一個風暴陣列,並正在提供任何參數,這是不完全正確。因此,我認爲正確的簽名是:

NamedStorm stormArray[2]; 
NamedStorm::displayOutput(stormArray); 

如果意圖是要調用全局「displayOutput()」,我沒有看到一個定義,以便將佔到在這種情況下的錯誤消息。

第二部分 - ostream運算符========================================= =====================

呃......你真的是從頂端開始!好吧,我也無法讓它工作 - 我查看了所有這些關於如何正確定義模板等的鏈接......但問題與錯誤消息一樣簡單。該參考文件尚未解決,因爲它不存在!您定義了一個新的操作符,但沒有提供實現。所有你需要的是提供實現,像這樣:現在

// this declares the operator, but it's still undefined 
std::ostream& operator<<(std::ostream& out, const NamedStorm& namedStorm); 

// add this to *define* it - otherwise it has no body so the linker looks in all the 
// obj files, can't find it and gives the unresolved reference error 
std::ostream& operator<<(std::ostream& out, const NamedStorm& namedStorm) 
{ 
//print("we needed an implementation!"); 
return out; 
} 

,實際上,你並不需要緊跟實施情況的聲明,但通常聲明會去在.h文件或將有根本沒有聲明,你可以在你的.CPP文件中實現上面的實現。但沒有其他源文件會知道它。

它通常被認爲是不良的做法辣椒項目用:

using namespace std; 

相反,更加明確與命名空間你想要的,如:

std::string myString = "we know which 'string' this is"; 

似乎更容易只是說「使用一切......「,直到你花了半天的時間追蹤一個bug,才意識到你甚至沒有看到正確的課程!

Whew ..我現在休息;-)

+0

您的建議奏效!但LNK2001錯誤再次出現... –

+0

錯誤LNK2001:無法解析的外部符號「private:static int NamedStorm :: stormCount」(?stormCount @ NamedStorm @@ 0HA)。也許它的私有變量? –

+0

這不是說「stormCount」是私人的,這是可以的,因爲你是從課堂內引用它的。這裏的問題是它是靜態的,但你試圖從構造函數中引用它,這是一個實例方法。如果在構造函數中說「NamedStorm :: stormCount ++」,它應該可以正常工作。 (可能想要在析構函數中減少它 - 不知道取決於你的需求)。很高興它爲你工作。 –

相關問題