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:

    1. Da Deine Methode statisch ist, müssen auch die Membervariablen auf die die Methode zugreifen soll statisch sein.

    2. 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ß,
    PuerNoctis

    EDIT: Einpaar kleine Fehlerchen korrigiert... 🙄



  • Danke für die Tipps, hat funktioniert!
    😃 👍


Anmelden zum Antworten