2017-02-09 3 views
-1

Ich versuche, während des Studiums von C++ aus Dev C++ nach Visual Studio zu wechseln (da ich mit letzterem arbeiten muss), aber aus irgendeinem Grund eine ziemlich einfache Klasse Implementierung, die perfekt in Dev C++ funktioniert, erstellt eine lange Liste von Fehlern in Visual Studio.Visual Studio akzeptiert keine Klassenimplementierung [C++]

Die Dateien sind einfach:

  • Header-Datei, für die Deklaration von Konstrukteuren, Variablen usw.
  • CPP-Datei, die implementieren Konstrukteuren, Funktionen usw.
  • Consoleapplication-Datei (auf Visual Studio), um die Funktion "main()" zu erzeugen.

stock2.h

#ifndef STOCK2_H_ 
#define STOCK2_H_ 
class Stock 
{ 
public: 
    Stock(); 
    Stock(const char* co, int n = 0, double pr = 0.0); 
    ~Stock(); 
    void show()const; 
private: 
    std::string company; 
    int shares; 
    double share_val; 
    double total_val; 
}; 
#endif 

stock2.cpp

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include "stock2.h" 

Stock::Stock() //default constructor 
{ 
    //code 
} 

Stock::Stock(const char* co, int n, double pr) 
{ 
    //code 
} 

Stock::~Stock() 
{ 
    std::cout << "Stock object has been destroyed" << std::endl; 
} 

//Methods 

void Stock::show() const 
{ 
    //code 
} 

ConsoleApplication.cpp

#include "stdafx.h" 
#include "stock2.cpp" 
int main() 
{ 
    using std::cout; 
    const int STKS = 4; 
    Stock stocks[STKS] = { 
     Stock("NanoSmart", 12, 20.1), 
     Stock("Boffo Objects", 200, 2.0), 
     Stock(), 
     Stock("Monolithic Obelisks", 130, 3.25) 
    }; 
    cout << "Stock Holdings: \n"; 
    for (int st = 0; st<STKS; st++) 
     stocks[st].show(); 
    return 0; 
} 

Ich habe versucht, die Lösung auf andere Fragen hier gepostet zu finden, aber Ich kann wirklich nicht herausfinden, was hier falsch ist. Ich lese auch, dass man eine CPP-Datei nicht # enthalten sollte, da der Header die Verbindung zwischen der main() - und der cpp-Datei selbst sein sollte, aber wenn ich beschließe, #include stock2.H anstelle von .CPP in der Konsolenanwendung zu verwenden , dann kann der Compiler die Methodenimplementierungen nicht mehr finden.

EDIT: In der Eile habe ich vergessen, die Fehler zu posten! Sie sind alle in dieser Form:

Fehler LNK2005 "public: void __thiscall Lager :: Update (double)" (? Update @ Auf @@ QAEXN @ Z) bereits definiert in ConsoleApplication1.obj ConsoleApplication1 // Pfad \ ConsoleApplication1 \ ConsoleApplication1 \ stock2.obj

EDIT2: Da viele von Ihnen, mich über die „Solution Explorer“ fragen, ich besser fügen Sie einfach einen Screenshot zu zeigen, wie es jetzt enter image description here

+0

Welche Fehler bekommen Sie? Und wenn der Compiler (eigentlich der Linker) die Methodenimplementierungen nicht finden kann, wenn Sie die Header-Datei einschließen (was der richtige Ansatz ist), dann haben Sie Ihr Projekt falsch eingerichtet – UnholySheep

+3

Wie Sie gesagt haben, nur die Header-Dateien enthalten . Ihre Implementierungsdateien sollten automatisch kompiliert und verknüpft werden, wenn sie in Ihrer Projektdatei enthalten sind.Stellen Sie in Visual Studio sicher, dass alle Quelldateien in der Projektmappen-Exploreransicht aufgelistet sind. Sie können Dateien in diese Ansicht ziehen, um sie zu Ihrem Projekt hinzuzufügen, wenn sie fehlen. –

+0

Ich habe gerade den Fehler hinzugefügt, den ich bekomme (ich habe komplett vergessen, diese hinzuzufügen!). Wie auch immer, ich habe das Standard-Setup für Projekte in Visual Studio verwendet, also habe ich zwei primäre Ordner unter dem Projektordner: Quelldateien (für alle .cpp-Dateien) und Header-Dateien (wo ich stock2.h gespeichert habe) – kn0bbulo

Antwort

1

Sie gemacht ist enthalten stock2.cpp in Ihrem . Das bedeutet, der gesamte Code innerhalb stock2.cpp jetzt zweimal kompiliert wird, und der Linker zeigt die Fehlermeldung

Error LNK2005 "public: void __thiscall Stock::<...> already defined 

für die jetzt dupliziert Funktionen. Einfach

ersetzen
#include "stock2.cpp" 

mit

#include "stock2.h" 

Wenn Sie eine andere Fehlermeldung erhalten, wenn dies zu tun, benutzen Sie bitte die Fehlermeldung für diesen Beitrag.

Verwandte Themen