Linkerfehler



  • Hallo, wenn ich in einer abgeleiteten Klasse den Basiskonstruktor der oberklasse mitbefülle krieg ich linker fehler, kein plan wo das problem liegt.

    main.obj : error LNK2005: "public: thiscall ConnectDB::ConnectDB(char *,char *,char *,char *,unsigned int)" (??0ConnectDB@@QAE@PAD000I@Z) already defined in RequestDB.obj
    main.obj : error LNK2005: "public: __thiscall ConnectDB::ConnectDB(struct HWND__ *,char *,char *,char *,char *,unsigned int)" (??0ConnectDB@@QAE@PAUHWND
    @@PAD111I@Z) already defined in RequestDB.obj
    main.obj : error LNK2005: "public: __thiscall ConnectDB::~ConnectDB(void)" (??1ConnectDB@@QAE@XZ) already defined in RequestDB.obj

    Die Basisklasse

    #ifndef _ConnectDB_H
    #define _ConnectDB_H
    #include <winsock.h>
    #include <mysql.h>
    #include <windows.h>
    
    class ConnectDB
    {
    public:
    	MYSQL* pConnection; 
    	char* pHost;
    	char* pUsername;
    	char* pPassword;
    	char* pDatabase;
    	unsigned int pPort;
    	bool status;
    	ConnectDB(char* pHost, char* pUser, char* pPass, char* pDatab, unsigned int pPort ); /* Für Konsole */
    	ConnectDB(HWND hWnd, char* pHost, char* pUser, char* pPass, char* pDatab, unsigned int pPort ); /* Für Win-API */
    	~ConnectDB();
    };
    
    ConnectDB::ConnectDB(char* pHost, char* pUsername, char* pPassword, char* pDatabase, unsigned int pPort)
    {
    		pConnection = mysql_init(NULL);
    		if(mysql_real_connect(pConnection, pHost, pUsername, pPassword, pDatabase, pPort,NULL,0)!=NULL)
    			this->status = true;
    }
    
    ConnectDB::ConnectDB(HWND hWnd, char* pHost, char* pUsername, char* pPassword, char* pDatabase, unsigned int pPort)
    {
    		pConnection = mysql_init(NULL);
    		if(mysql_real_connect(pConnection, pHost, pUsername, pPassword, pDatabase, pPort,NULL,0)==NULL)
    		{
    			MessageBox(hWnd, L"Verbindung der Datenbank\n fehlgeschlagen", L"MySQL Connection Error", MB_OK);
    		}
    		else
    			this->status = true;
    }
    
    ConnectDB::~ConnectDB()
    {
    	mysql_close(pConnection);
    }
    #endif
    

    die abgeleitete Klasse

    #pragma once
    #include "ConnectDB.h"
    
    class RequestDB :
    	public ConnectDB
    {
    public:
    	RequestDB(HWND hWnd,
    			  char* pHost,
    			  char* pUser,
    			  char* pPass,
    			  char* pDatab,
    			  unsigned int pPort) : ConnectDB(hWnd, pHost, pUser, pPass, pDatab, pPort){}
    
    	~RequestDB(void){}
    	//MYSQL_RES*	SearchDB(std::string searchArg);
    private:
    };
    

    Scheinbar ist was falsch bei dem Aufruf des Basisklassenkonstruktors, aber was?



  • Laut Compiler Fehler hast du das schonmal definiert bzw. zweimal gelinkt einmal hier ->main.obj & hier RequestDB.obj schätze das du eine Header Datei zuviel hast in main.cpp oder so 😃



  • Du solltest die Methodendefinitionen nicht direkt in den Header packen, sondern in eine eigene CPP-Datei - dann klappt's auch mit dem Linker.



  • CStoll schrieb:

    Du solltest die Methodendefinitionen nicht direkt in den Header packen, sondern in eine eigene CPP-Datei - dann klappt's auch mit dem Linker.

    ah, danke.

    wieso wirkt sich das den bei der vererbung aus? bis zu dem zeitpunkt ow ich keine klasse davon abgeleitet hat, funktionierte das wunderbar.



  • Das wirkt sich nicht wegen der Vererbung aus, sondern wegen der Tatsache, daß du den Header auf einmal in zwei Übersetzungseinheiten eingebunden hast (main.cpp und RequestDB.cpp).


Anmelden zum Antworten