Methode bereits definiert



  • Ich hab eine Help-Klasse mit verschiedenen Methoden geschrieben, die auch der Fehlermeldung unten entnommen werden können.
    Die sind eigentlich ganz normal in help.h und help.cpp deklariert - so wie ich's gelernt hab.

    Beim Compilieren haut er dann allerdings folgendes raus:

    Linker-Vorgang läuft...
    helptest.obj : error LNK2005: "private: void __thiscall Help::newHelpfile(void)" (?newHelpfile@Help@@AAEXXZ) bereits in help.obj definiert
    helptest.obj : error LNK2005: "private: void __thiscall Help::deleteHelpfile(void)" (?deleteHelpfile@Help@@AAEXXZ) bereits in help.obj definiert
    helptest.obj : error LNK2005: "protected: void __thiscall Help::selectHelpfile(void)" (?selectHelpfile@Help@@IAEXXZ) bereits in help.obj definiert
    helptest.obj : error LNK2005: "protected: void __thiscall Help::searchWord(void)" (?searchWord@Help@@IAEXXZ) bereits in help.obj definiert
    helptest.obj : error LNK2005: "public: __thiscall Help::Help(void)" (??0Help@@QAE@XZ) bereits in help.obj definiert
    helptest.obj : error LNK2005: "public: __thiscall Help::~Help(void)" (??1Help@@QAE@XZ) bereits in help.obj definiert
    helptest.obj : error LNK2005: "public: int __thiscall Help::showContent(void)" (?showContent@Help@@QAEHXZ) bereits in help.obj definiert
    helptest.obj : error LNK2005: "public: void __thiscall Help::menu(void)" (?menu@Help@@QAEXXZ) bereits in help.obj definiert
    Debug/Hilfe.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
    Fehler beim Ausführen von link.exe.
    
    Hilfe.exe - 9 Fehler, 0 Warnung(en)
    

    Weiß jemand woran das liegt? Ich dachte es gibt vielleicht schon solche Methoden und hab sie umbenannt - das geht aber trotzdem nicht.



  • Wie sieht denn helptest.cpp aus?



  • So:

    #include "help.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    //#include <algorithm> 
    #define themendatei "H:\\Projekt Systementwicklung\\Quellcode\\Hilfe\\Inhalte.txt"
    using namespace std;
    
    #ifndef _HELP_CPP
    #define _HELP_CPP
    
    // legt eine neue Hilfedatei an
    void Help::newHelpfile(){
    	string dateiname;
    	char text[100];
    	bool beenden=false;
    
    	cout << endl << "neues Thema bzw. Dateiname (Bsp: neues_Thema5): ";
    	cin >> dateiname;
    
    	// Pflege der Themenübersicht
    	int zeilen=0;
    	string line;
    	ifstream is(themendatei);
    	ofstream temp_os("tempHilfe.txt");
    
    	while (!is.eof()) { 
    		zeilen++;
    		getline(is, line);
    		temp_os << line << endl;
    	}
    	temp_os << "[" << zeilen+1 << "] " << dateiname;   
    
    	is.close();
    	remove(themendatei);	//alte Themendatei löschen
    	temp_os.close();
    	rename("tempHilfe.txt", themendatei); //neue umbenennen
    
    	// neue Hilfedatei anlegen
    	dateiname=dateiname + ".txt";
    	ofstream os(dateiname.c_str());
    	cout << "Und nun zeilenweise Ihr Hilfetext: " << endl;
    
    	while (beenden==false){
    		cin.sync();
    		cin.getline(text, 100);
    		if (text[0]=='Q' && text[1]=='U' && text[2]=='I' && text[3]=='T'){
    			beenden=true;
    			cout << endl;
    		}else{
    			os << text << endl;
    		}
    	}
    }
    
    // löscht eine Hilfedatei
    void Help::deleteHelpfile(){
    	int themennr;
    	int anzlines=0;		
    	int themenindex=1;
    	string line;
    	string DatatoDelete;
    	ifstream is(themendatei);
    	ofstream os("tempHilfe1.txt");
    
    	Help::showContent();
    	cout << "Nummer des zu entfernenden Themas: ";
    	cin >> themennr;
    
    	while (!is.eof()){	
    		getline(is, line);
    		if (anzlines+1!=themennr){
    			os << "[" << themenindex << "] " << line.substr(4, 80);
    			if (!is.eof()){
    				os << endl;
    			}
    			themenindex++;
    
    		}else{
    			DatatoDelete=line.substr(4, 80);
    			cin.sync();
    		}
    		anzlines++;
    	}
    
    	if (themennr>anzlines){
    		os.close();
    		remove("tempHilfe1.txt");
    	}else{
    		DatatoDelete=DatatoDelete + ".txt";
    		remove(DatatoDelete.c_str());	//Hilfedatei löschen
    		is.close();
    		remove("Inhalte.txt");	//alte Themendatei löschen
    		os.close();
    		rename("tempHilfe1.txt", themendatei); //neue umbenennen
    	}
    }
    
    // gibt eine Hilfedatei auf dem Bildschirm aus
    void Help::selectHelpfile(){
    	ifstream is(themendatei);
    	string line;
    	int themennr;
    	int lines=showContent();
    
    	cout << "Nummer des anzuzeigenden Themas: ";
    	cin >> themennr;
    
    	if (themennr<=lines){
    		for (int i=1; i<=themennr; i++){
    			getline(is, line);
    		}
    		line = line.substr(4, 80) + ".txt";
    		ifstream show(line.c_str());
    
    		while (!show.eof()) { 
    			getline(show, line);
    			cout << line << endl;
    		}
    	}else{
    		cout << "Das Thema existiert nicht." << endl;
    	}
    }
    
    // durchsucht alle Hilfetexte nach einem Suchwort 
    void Help::searchWord(){
    	ifstream is(themendatei);
    	string wort;
    	string helptopic;
    	string helptext;
    	bool wordfound=false;
    
    	cout << "Ihr Suchwort: ";
    	cin >> wort;
    
    	while (!is.eof()) { 
    		getline(is, helptopic);
    		if (helptopic.find(wort)!=string::npos){
    			cout << "\t" << helptopic << endl;
    			wordfound=true;
    		}else{
    			string dataname=helptopic.substr(4, 80) + ".txt";
    			ifstream helpdata(dataname.c_str());
    				while (!helpdata.eof()){			
    					getline(helpdata, helptext);
    					if (helptext.find(wort)!=string::npos){
    						cout << "\t" << helptopic << endl;
    						wordfound=true;
    					}
    				}
    			helpdata.close();
    		}
    	}
    	is.close();
    	if (!wordfound){
    		cout << "Wort nicht enthalten." << endl;
    	}
    	cout << endl;
    }
    
    // Konstruktor der Klasse Help - legt ein Helpobjekt an
    Help::Help(void){}
    
    // Detruktor der Klasse Help - löscht Helpobjekt und gibt Speicher frei
    Help::~Help(void){}
    
    // gibt alle verfügbaren Hilfethemen auf dem Bildschirm aus
    int Help::showContent(){
    	int anzlines=0;
    	string line;
    	ifstream is(themendatei);
    
    	while (!is.eof()) { 
    		anzlines++;
    		getline(is, line);
    		cout << "\t" << line << endl;
    	}
    	cout << endl;
    	return anzlines;
    }
    
    // stellt ein Menu zur Verwaltung der Hilfedateien zur Verfügung
    void Help::menu(){
    	char auswahl;
    
    	while (auswahl!='e'){
    		cout << "Bitte waehlen Sie die Aktion aus:" << endl;
    		cout << "\t(s)how\t\tzur Anzeige aller Hilfethemen" << endl;
    		cout << "\t(f)ile\t\tzur Anzeige einer Hilfedatei" << endl;
    		cout << "\t(n)ew\t\tzur Eingabe eines neuen Hilfethemas" << endl;
    		cout << "\t(d)elete\tzum Entfernen eines Hilfethemas" << endl;
    		cout << "\t(e)nd\t\tzum Beenden" << endl;
    		cout << "Ihre Auswahl (mit <Enter> bestaetigen): ";
    		cin >> auswahl;
    
    		switch(auswahl){
    			case 's':
    				Help::showContent();
    				break;
    			case 'f':
    				Help::selectHelpfile();
    				break;
    			case 'n':
    				Help::newHelpfile();
    				break;
    			case 'd':
    				Help::deleteHelpfile();
    				break;
    			case 'e':
    				break;			
    			default:
    				cout << "Falscheingabe !!!" << endl;
    		}
    	}
    }
    
    /*
    void pruefenEingabe(string suchwort){
    
    }
    
    void helpFunction(){
    
    }
    */
    
    #endif
    


  • Und dieselben Methoden hast du auch in help.cpp definiert? Dann ist es doch kein Wunder, dass sich der Linker beschwert, wenn er beide zusammenfügen soll.



  • Wir begrüßen Betty 😃



  • Wir begrüßen Betty 😃



  • helptest.cpp sieht schlicht so aus:

    #include "help.h"
    
    void main(){
    	Help meine_Hilfe;
    	meine_Hilfe.menu();
    }
    

    Und help.h includiert ganz am Ende help.cpp



  • Ich begrüße euch alle zurück. Bei dem Quellcode wird mir allerdings ganz 😮



  • Gordon schrieb:

    Und help.h includiert ganz am Ende help.cpp

    Das ist der Fehler.

    Dadurch hast du den Inhalt von help.cpp in help.h, und damit auch in helptest.cpp, also hast du alle Methoden doppelt.

    Wozu überhaupt? Ist doch komplett sinnlos.



  • Wollte damit eigentlich erreichen, dass der Nutzer nur help.cpp includieren muss, aber da hab ich mich wohl selbst ans Bein ...

    Danke



  • Gordon schrieb:

    Wollte damit eigentlich erreichen, dass der Nutzer nur help.cpp includieren muss,

    .cpp-Dateien sollte man niemals includen.

    aber da hab ich mich wohl selbst ans Bein ...

    😉



  • Das war schon wieder ein sinnloser Beitrag, Du merkst ich dreh langsam durch. Auf jeden Fall hast Du Recht und das war totaler Humbuk


Anmelden zum Antworten