error LNK2019: Verweis auf nicht aufgelöstes externes Symbol
-
Ich habe ein Programm zum Berechnen von Deinfektionslösungen geschrieben.
Hier ersteinmal der Quellcode:
/*main.cpp - Haupt-C++-Datei*/ #include #include "Desinfektionsloesung.h" using namespace std; using namespace DesiLoes; int main() { //Angaben ber das Programm cout << "D E S I N F E K T I O N S L \231 S U N G S B E R E C H N E R" << endl << endl; //zur Berechnung ntige Werte einholen cout << "Bitte Menge der L\224sung, die entstehen soll angeben (ml): "; int gesMenge; cin >> gesMenge; cout << "Bitte Anteil des Desinfektionskonzentrates in Prozent angeben: "; int anteil; cin >> anteil; //Wertbergabe an die zur Berechnung bentigten Variablen der Klasse "Desinfektionsloesung" Desinfektionsloesung::Desinfektionsloesung(anteil, gesMenge); //Ausgabe der zum Anstetzen bentigten Mengen Deinfektionskonzentrat und Wasser cout << Desinfektionsloesung::berechneKonzentratanteil(); //Eingabeerwartung zum Benden des Programms system("PAUSE"); }
/*Deinfektionsloesung.cpp - C++-Datei der Klasse "Desinfektionsloesung"*/ #include "Desinfektionsloesung.h" #include using namespace std; namespace DesiLoes { int MengeGesamt; int MengeKonzentrat; int MengeWasser; int AnteilProzent; Desinfektionsloesung::Desinfektionsloesung(int a, int MG){ AnteilProzent=a; MengeGesamt=MG; } static int berechneKonzentratanteil(){ MengeKonzentrat=((AnteilProzent*MengeGesamt)/100); std::cout << "Für eine " << AnteilProzent << " %-ige Desinfelktionslsung werden \n\t" << (MengeGesamt-MengeKonzentrat) << " ml Wasser und " << MengeKonzentrat << " ml Desinfektionskonzentrat bentigt." << endl << endl; } }
/*Desinfektionsloesung.h - Header-Datei der Klasse "Desinfektiosloesung"*/ #pragma once namespace DesiLoes { class Desinfektionsloesung { private: int MengeGesamt; int MengeKonzentrat; int MengeWasser; int AnteilProzent; public: Desinfektionsloesung(int a, int MG); static int berechneKonzentratanteil(); }; }
Beim erstellen des Projekts kommt folgender Fehler:
Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: static int __cdecl DesiLoes:esinfektionsloesung::berechneKonzentratanteil(void)" (?berechneKonzentratanteil@Desinfektionsloesung@DesiLoes@@SAHXZ)" in Funktion "_main". main.obj
Fehler 2 fatal error LNK1120: 1 nicht aufgelöste externe Verweise. E:\Eigene Dateien\Visual Studio 2008\Projects\Desinfektioslösungsberechner\Debug\Desinfektioslösungsberechner.exe 1
Wenn jemand des Problems Lösung kennt, so bitte ich ihn zu antworten!
-
Was stehen die #includes in Zeile 4 und 5 so alleine da rum.
-
Heyho Fritz,
in Deiner Deinfektionsloesung.cpp liegt Deine berechneKonzentratanteil()-Methode im falschen Scope. Heißt, der Compiler hält sie für eine Funktion, und nicht für einen Bestandteil Deiner Klasse Desinfektionsloesung.
Der Aufruf in der main.cpp:
cout << Desinfektionsloesung::berechneKonzentratanteil();
läuft daher schief, da Du die Methode an sich nie fertig definiert hast und der Linker sie somit nicht findet (unresolved symbol - Deine Fehlermeldung). Die Lösung ist ganz einfach. In der Deinfektionsloesung.cpp fügst du vor Deiner Methode den Klassennamen, sowie den Scoping-Operator hinzu:
int Desinfektionsloesung::berechneKonzentratanteil()
Somit weiß der Compiler, dass Du die Methode Deiner Klasse, und nicht eine einfache Funktion definieren willst. Dann sollte es funktionieren.
Weitere Anmerkungen:
-
Da Deine Methode statisch ist, müssen auch die Membervariablen auf die die Methode zugreifen soll statisch sein.
-
Das
#pragma once
in Deiner Header ist vollkommen korrekt, und so manch anderer sollte sich angewöhnen diesen Include-Schutz zu verwenden. Allerdings ist diese Direktive nicht bei allen Compilern bekannt, daher verwendet man auch sogenannte "Include-Guards". Die funktionieren so:
#ifndef __MY_HEADER_INCLUDED__ #define __MY_HEADER_INCLUDED__ // [...] My Code [...] #endif
So stellst Du portabel sicher, dass der Header nur einmal eingebunden wird.
Gruß,
PuerNoctisEDIT: Einpaar kleine Fehlerchen korrigiert...
-
-
Danke für die Tipps, hat funktioniert!