Fehler den ich nicht verstehe: LNK2019



  • Abend,

    hab mir eigentlich vorgenommen hier nicht zu posten.
    Aber da mir der Fehler schon heute zum 2. Mal in die Quere kommt, bin ich gezwungen hier zu fragen. Und wer nicht fragt, der bleibt dumm...^^

    Beim ersten Mal, hab ich es irgendwie geschafft, den Fehler zu beseitigen >.>
    Leider kann ich mich nicht erinnern wie ich es geschafft habe...Schade.

    Also:

    Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __thiscall menge::anzeigen(void)" (?anzeigen@menge@@QAEXXZ)" in Funktion "_main". main.obj

    Fehler 2 fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Die Fehler tretten auf, wenn ich in der main.cpp ein Objekt erstelle.

    //IntMenge.cpp
    #include <vector>
    #include <iostream>
    #include "IntMenge.h"
    
    std::vector<int> mengen_v;		//Globaler Vector
    int zaehler = 0;				//Globale Zählvariable
    
    inline void inkrement(int& zaehler)
    {
    	zaehler++;
    }
    
    inline void menge::hinzufuegen(int el)
    {
    
    	if(menge::isMember(el) == false)
    	{
    	mengen_v.push_back(el);
    	inkrement(zaehler);
    	std::cout << "\nErfolgreich!" << std::endl;
    	}
    	else
    		std::cout << "\nIst vorhanden!" << std::endl;
    }
    
    inline bool menge::isMember(int el)
    {
    	for(unsigned int i=0; i < mengen_v.size();i++)
    	{
    		if(mengen_v.at(i) == el)
    			return true;
    		else
    			return false;
    	}
    }
    
    inline void menge::entfernen(int el)
    {
    	if(menge::isMember(el) == false)
    	{
    		for(unsigned int i=0; i < mengen_v.size(); i++)
    		{
    			if(mengen_v.at(i) == el)
    			{
    				std::cout << "\nErfolgreich gelöscht!" << std::endl;
    				mengen_v.erase(mengen_v.begin()+i-1);
    			}
    		}
    	}
    	else
    		std::cout << "\nElement nicht vorhanden!" << std::endl;
    
    }
    
    inline size_t menge::size()
    {
    	std::cout << "\nAnzahl der Elemente: ";
    	return mengen_v.size();
    }
    
    inline void menge::anzeigen()
    {
    	for(unsigned int i=0; i < mengen_v.size(); i++)
    		std::cout << mengen_v.at(i) << " , ";
    	std::cout << std::endl;
    }
    
    inline void menge::loeschen()
    {
    	mengen_v.clear();
    	std::cout << "\nAlle Elemente erfolgreich gelöscht!" << std::endl;
    }
    
    inline int menge::getMax()
    {
    	menge::maximum = mengen_v.at(0);
    	for(unsigned int i=0; i < mengen_v.size(); ++i)
    	{
    		if(menge::maximum < mengen_v.at(i))
    			menge::maximum = mengen_v.at(i);
    		else
    			i++;
    	}
    	std::cout << "\nDas groesste Element ist: " << menge::maximum << std::endl;
    	return menge::maximum;
    }
    
    inline int menge::getMin()
    {
    	menge::minimum = mengen_v.at(0);
    	for(unsigned int i=0; i < mengen_v.size(); ++i)
    	{
    		if(menge::minimum > mengen_v.at(i))
    			menge::minimum = mengen_v.at(i);
    		else
    			i++;
    	}
    	std::cout << "\nDas kleinste Element ist: " << menge::minimum << std::endl;
    	return menge::minimum;
    }
    
    //IntMenge.h
    #ifndef INTMENGE_H
    #define INTMENGE_H
    
    class menge
    {
    public:
    	void hinzufuegen(int el);	//Element >>el<< hinzufügen, falls es noch nicht existiert, andernfalls nichts tun.
    	void entfernen(int el);		//Element >>el<< entfernen, falls es vorhanden ist, andernfalls nichts tun.
    	bool isMember(int el);		//Gibt an, ob >>el<< in der Menge enthalten ist.
    	size_t size();				//Gibt die Anzahl der gespeicherten Elemente zurück.
    	void anzeigen();			//Gibt alle Elemente auf der Standardausgabe aus.
    	void loeschen();			//Alle Elemente löschen.
    	int getMax();				//Getter
    	int getMin();				//Getter
    private:
    	int maximum;			//Maximum der vorhandenen Elemente
    	int minimum;			//Minimum der vorhandenen Elemente
    };
    
    #endif
    
    //main.cpp
    #include "IntMenge.h"
    #include <iostream>
    
    int main(int argc, char** argv)
    {
    	menge o;
    	o.anzeigen();
    }
    

    Hoffentlich guckt sich jemand den Thread an,... *daumendrück*

    Wäre euch zutiefst dankbar!

    Lg Mentras



  • Entfern mal die inline s. Es gibt hier absolut keinen Grund für sie.

    Ausserdem sollte jede Klasse ihren eigenen Container haben und nicht einen globalen teilen. Vielleicht sollen ja mal mehrere unabhängige Mengen erstellt werden. Und was bringt die Funktion inkrement() genau?



  • Hmmmm, lag an den Inlines. Sollte mir das Kapitel noch einmal durchlesen.

    Danke dir Nexus. Hat geklappt!

    €dit:
    Von Containern hab ich nur was gehört,... kenn mich da noch nicht aus.
    Die Funktion inkrement... jo. Etwas sinnlos^^

    Lg



  • Und schau dir noch mal genau die Funktion 'isMember' an bzgl. der return-Anweisungen.

    Und bzgl. Container: damit ist "vector<int> mengen_v" gemeint. Mach diesen zu einem Member der Klasse 'menge'.

    P.S.: vermeide möglichst ein 'denglisch', nimm besser gleich nur englisch für deine Methoden und Member...



  • Th69 schrieb:

    P.S.: vermeide möglichst ein 'denglisch', nimm besser gleich nur englisch für deine Methoden und Member...

    Guter Tip.
    Aber wie lautet die Begründung dafür?



  • Th69 schrieb:

    P.S.: vermeide möglichst ein 'denglisch', nimm besser gleich nur englisch für deine Methoden und Member...

    Bei uns würde es heissen "Amtssprache ist DEUTSCH". Dennoch wird get, set, is verwendet, weil viele Codegeneratoren und -analysatoren (speziell in Java) das verlangen. Echt gruselig manchmal.

    Sorry for OT 🙂



  • Th69 schrieb:

    Und bzgl. Container: damit ist "vector<int> mengen_v" gemeint. Mach diesen zu einem Member der Klasse 'menge'.

    Ohh! Danke 🙂

    Werde ich mal gleich ausprobieren.


Anmelden zum Antworten