2017-02-07 2 views
-1

Ich bin neu in Klassen und objektorientierte Programmierung. Unser Lehrer lässt uns ein Programm erstellen, das eine .cpp Datei, eine Hauptdatei und eine .hpp Datei haben muss.C++: Mehrere "mehrere Definition von" Fehler beim Kompilieren

Hier sind die einzelnen Dateien:

Zuerst wird die odometer.hpp Datei:

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(); 
}; 

Als nächstes wird die odometer.cpp Datei:

#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; 
} 

Und schließlich die odometer_main.cpp Datei (bisher , es ist unvollständig):

#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; 
} 

Dies sind die Fehler, die ich immer bin, wenn ich alle Dateien versuchen Kompilieren:

 
/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

Änderung '# include "odometer.cpp"' auf 'schließen #include "odometer.hpp" ' –

+0

Einverstanden. Warum hast du das überhaupt hinzugefügt? –

+0

Unser Lehrer hat uns gesagt, dass wir es so machen sollen und es sogar in die Beispieldateien aufgenommen haben. – CodyT96

Antwort

0

Wenn Sie Ihr odometer.cpp in Ihre odometer_main.cpp sind inklusive, können Sie nicht auch separat Ihren Odometer kompilieren. cpp und verlinke es mit deinem odometer_main.cpp. In diesem Fall werden Sie doppelte Symbole erhalten. Der typische Weg besteht jedoch darin, nur die .hpp-Datei in Ihren main einzufügen, und alles andere sollte kompilieren und verlinken.

1

Kurz gesagt, ersetzen Sie #include "odometer.cpp" durch #include "odometer.hpp". Jetzt zum Warum.

Ihr Programm besteht aus Quelldateien wie main.cpp und odometer.cpp. Diese Dateien enthalten Definitionen für Funktionen, Variablen oder Klassen in Ihrem Projekt. Ihr Compiler kompiliert jede Quelldatei (.cpp) separat in Objektdateien (.o), und Ihr Linker verknüpft diese Objektdateien dann zu Ihrem Programm.

Obwohl Ihre Quelldateien separat kompiliert werden, müssen sie jedoch miteinander interagieren. main.cpp wird Odometer Objekte erstellen und Zugriff auf Odometer Mitgliedsfunktionen und so weiter. Also brauchen wir einen Weg zu sagen, main.cpp was ein Odometer ist. Der einfachste Weg, dies zu tun, ist Odometer in einer Header-Datei zu definieren, und #include dieser Header in main.cpp.

#include ist eine Präprozessordirektive, die den Inhalt einer anderen Datei in die aktuelle Datei einfügt. Der Präprozessor wird ausgeführt, bevor der Code tatsächlich kompiliert wird. Die Idee ist, dass Sie einige Deklarationen in einer Datei haben, die wir eine Header-Datei nennen, und mehrere Quelldateien, die Zugriff auf diese Deklarationen benötigen. So wird jede Quelldatei #include der Header.

Beachten Sie aber, dass main.cpp braucht keinen Zugriff auf die Definitionen von Odometer ‚s Mitgliederfunktionen, es muss nur wissen, was diese Funktionen sind und wie sie nennen. Diese Information befindet sich in der Klassendefinition in odometer.hpp, nicht in odometer.cpp. Es wäre ein Fehler zu #include "odometer.cpp", denn dann hätten wir Funktionen, die an zwei verschiedenen Orten definiert sind, und der Linker wird sich beschweren.

So im Allgemeinen Sie Ihre Klassendefinition in einer Header-Datei setzen (.hpp), legen Sie die Klassenimplementierung in einer Quelldatei (.cpp) und #include die Header-Datei in einer anderen Quelldatei, die den Zugang zu dieser Klasse benötigt. Wenn Sie Ihre Programme auf diese Weise richtig strukturieren, sollten Sie niemals eine #include Datei in eine andere Datei einlesen.

0

Das sind mehrere Probleme hier:

odometer.hpp

  • Odometer(float g, int m): Dies ist nicht definiert in odometer.cpp
  • Odometer(): Dieser Standardkonstruktor sollte auch in odometer.cpp

  • definiert werden
  • Kilometerzähler hat drei Membervariablen aber nur zwei werden als Eingabe genommen, ist es unklar, wie die dritte mpg initialisiert

  • Es gibt keine Wachen in der Header-Datei

    #ifdef ODO_H

    #define ODO_H

    class Odometer{ // your class declaration };

    #endif

odometer.cpp

  • #include "odometer.hpp"

  • #include <iostream> - da Sie verwenden std::cout

  • Definitionen sorgen für verschiedene Odometer Konstruktoren.

main.cpp

  • #include "odometer.hpp" - seit Sie Odometer Klasse hier

diese Probleme lösen sollten Sie Ihren Code kompilieren helfen verwenden.

0

Es ist wichtig, Dateiausschluss-Direktiven zu verwenden, um Mehrfacheinschlüsse zu vermeiden.

#ifndef ODOMETER_H 
#define ODOMETER_H 
#include "odometer.h" 
#endif 

Haben Sie einen Blick auf diese Frage:

Why are #ifndef and #define used in c++ header files

Auch als die Jungs kommentiert, sollten Sie die h-Datei

Verwandte Themen