2017-02-07 47 views
-1

我是新來的類和麪向對象編程。我們的老師讓我們創建一個程序,該程序必須包含文件.cpp,主文件.cpp和文件.hppC++:在編譯時獲取多個「多重定義」錯誤

這裏是每個文件:

首先,odometer.hpp文件:

class Odometer 
{ 
    int miles; 
    float gallons, mpg; 

public: 
    //Constructors 
    Odometer(); //Default 
    Odometer(float g, int m); 

    //Mutator Functions 
    void Set_miles(int m); 
    void Set_gallons(float g); 

    //Functions 
    void Add_trip(int m, float g); 
    int Check_mileage(float g); 
    void Print_info(); 

    //Accessor Functions 
    float Get_mpg(); 
    float Get_gallons(); 
    int Get_miles(); 
}; 

接下來,odometer.cpp文件:

#include "odometer.hpp" 
#include <iostream> 

//Constructors 
Odometer::Odometer() 
{ 
    miles = 0; 
    gallons = 0.0; 
    mpg = 0.0; 
} 

Odometer::Odometer(float g, int m) 
{ 
    miles = m; 
    gallons = g; 
    mpg = m/g; 
} 

//Mutator functions 
void Odometer::Set_miles(int m) 
{ 
    miles = m; 
} 

void Odometer::Set_gallons(float g) 
{ 
    gallons = float(g); 
} 

//Accessor functions 
float Odometer::Get_mpg() 
{ 
    return mpg; 
} 

float Odometer::Get_gallons() 
{ 
    return gallons; 
} 

int Odometer::Get_miles() 
{ 
    return miles; 
} 

//Other functions 
//Takes # of gallons & # of miles and adds it to previous values, calculating 
//new miles/gallon for whole trip 
void Odometer::Add_trip(int m, float g) 
{ 
    miles += m; 
    gallons += g; 
    mpg = miles/gallons; 
} 

int Odometer::Check_mileage(float g) 
{ 
    int newMiles = g * mpg; 
    return newMiles; 
} 

void Odometer::Print_info() 
{ 
    std::cout << "Miles: " << miles << "  Gallons: " << gallons << 
"  Miles/Gallon: " << mpg; 
} 

最後,odometer_main.cpp文件(到目前爲止,它不完整):

#include <iostream> 
#include "odometer.cpp" 

using namespace std; 

int main(void) 
{ 
    //Odometer odDefault; //Odometer object set to defaults 
    Odometer od(10, 100); //Odometer object with values set 
    return 0; 
} 

這是當我嘗試編譯所有的文件,我發現了錯誤:

 
/tmp/ccArjYHP.o: In function 'Odometer::Odometer()': 
odometer_main.cpp:(.text+0x0): multiple definition of 'Odometer::Odometer()' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x0): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Odometer()': 
odometer_main.cpp:(.text+0x0): multiple definition of 'Odometer::Odometer()' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x0): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Odometer(float, int)': 
odometer_main.cpp:(.text+0x30): multiple definition of 'Odometer::Odometer(float, int)' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x30): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Odometer(float, int)': 
odometer_main.cpp:(.text+0x30): multiple definition of 'Odometer::Odometer(float, int)' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x30): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Set_miles(int)': 
odometer_main.cpp:(.text+0x72): multiple definition of 'Odometer::Set_miles(int)' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x72): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Set_gallons(float)': 
odometer_main.cpp:(.text+0x8a): multiple definition of 'Odometer::Set_gallons(float)' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x8a): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Get_mpg()': 
odometer_main.cpp:(.text+0xa8): multiple definition of 'Odometer::Get_mpg()' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0xa8): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Get_gallons()': 
odometer_main.cpp:(.text+0xbc): multiple definition of 'Odometer::Get_gallons()' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0xbc): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Get_miles()': 
odometer_main.cpp:(.text+0xd0): multiple definition of 'Odometer::Get_miles()' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0xd0): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Add_trip(int, float)': 
odometer_main.cpp:(.text+0xe0): multiple definition of 'Odometer::Add_trip(int, float)' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0xe0): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Check_mileage(float)': 
odometer_main.cpp:(.text+0x140): multiple definition of 'Odometer::Check_mileage(float)' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x140): first defined here 
/tmp/ccArjYHP.o: In function 'Odometer::Print_info()': 
odometer_main.cpp:(.text+0x168): multiple definition of 'Odometer::Print_info()' 
/tmp/cc1W9Ght.o:odometer.cpp:(.text+0x168): first defined here 
collect2: error: ld returned 1 exit status 
makefile:2: recipe for target 'odometer' failed 
make: *** [odometer] Error 1 
+4

變化'的#include 「odometer.cpp」''到#include「odometer.hpp」' –

+0

同意。無論如何,你爲什麼補充說? –

+0

我們的老師告訴我們要這樣做,甚至在示例文件中包含它。 – CodyT96

回答

0

如果您包括您odometer.cpp到您的odometer_main.cpp,你不能還分別編譯你的里程錶。 CPP並將其與您的odometer_main.cpp鏈接。在這種情況下,是的,你會得到重複的符號。但是,典型的方法是隻將.hpp文件包含到主文件中,其他所有文件都應該編譯並鏈接正常。

1

總之,用#include "odometer.hpp"代替#include "odometer.cpp"。現在爲什麼。

您的程序由源文件組成,如main.cppodometer.cpp。這些文件包含項目中函數,變量或類的定義。您的編譯器將每個源文件(.cpp)分別編譯到目標文件(.o)中,然後鏈接器將這些目標文件鏈接在一起以形成程序。

但是,雖然您的源文件是單獨編譯的,但它們需要互相交互。 main.cpp將要創建Odometer對象並訪問Odometer成員函數等。所以我們需要一種方法來告訴main.cpp什麼是Odometer。最簡單的方法是在頭文件中定義Odometer,在main.cpp中定義#include頭。

#include預處理指令,它將另一個文件的內容插入到當前文件中。預處理器在代碼實際編譯之前運行。這個想法是,你在一個文件中有一些聲明,我們稱之爲頭文件,以及需要訪問這些聲明的多個源文件。所以每個源文件的標題將爲#include

不過,請注意main.cpp不需要訪問定義Odometer的成員函數,只需要知道這些功能,以及如何給他們打電話。該信息在odometer.hpp的類定義中,而不是在odometer.cpp中。這對#include "odometer.cpp"是個錯誤,因爲那時我們會在兩個不同的地方定義函數,鏈接器會發出抱怨。

所以一般你把你的類定義在頭文件(.hpp),把類實現的源文件(.cpp),並#include頭文件中需要訪問該類任何其他的源文件。如果以這種方式正確構建程序,則不應將#include一個.cpp文件轉換爲另一個.cpp文件。這裏

0

的多個問題:

odometer.hpp

  • Odometer(float g, int m):這是不是在odometer.cpp
  • Odometer()定義:這個默認的構造函數也應在odometer.cpp

  • 定義
  • 里程錶有三個成員變量,但只有兩個是作爲輸入,目前還不清楚有第三mpg初始化

  • 沒有包括守衛在你的頭文件

    #ifdef ODO_H

    #define ODO_H

    class Odometer{ // your class declaration };

    #endif

odometer.cpp

  • #include "odometer.hpp"

  • #include <iostream> - 因爲你正在使用std::cout

  • 提供各種定義0構造函數。

的main.cpp

  • #include "odometer.hpp" - 因爲你使用的是這裏

里程錶類解決這些問題,應該可以幫助您編譯代碼。