[C++]Klasse in main.obj bereits definiert Fehler

Sebastian Thalhammer

Erfahrenes Mitglied
Hi Leute

Neuer Tag, neues Problem.
Folgender Quelltext und folgende Probleme damit: Der Compiler meldet mir ständig dass das Objekt in der main.obj bereits definiert wurde. kann mit dieser Fehlermeldung jedoch nichts anfangen, da die Klasse ja von mir definiert wurde (?) Ich poste hier meinen gesamten Code um Unklarheiten zu vermeiden. Hoffentlich kann mir jemand helfen.

Headerdatei der Klasse
PHP:
//Data.h//
#pragma once

// Klasse zum Handlen der Datei //

class CDataHandling
{
public:
	
	CDataHandling(const char *FileArgument);			// Konstruktor //
		
	char *FileName;						// Memberarray für Dateiname //
	int StringLength;					// Membervariable für Stringlaenge

public:
	~CDataHandling(void);						// Destruktor //
	
};

Cpp Datei der Klasse
PHP:
#include "Data.h"
#include <string>			// Stringfunktionen //

// KONSTRUKTOR //
CDataHandling::CDataHandling(const char *FileArgument)
{
	if(!FileArgument)
	{
		FileArgument = "";
		return;
	}

	// Dynamische Membervariable erzeugen und mit Argumentwert belegen //
	FileName = new char[strlen(FileArgument)+1];
	strcpy(FileName, FileArgument);

	// Membervariable für Stringlänge erzeugen //
	StringLength = (int) strlen(FileName);
	
}

// DESTRUKTOR //
CDataHandling::~CDataHandling(void)
{
	// Dynamisches Array freigeben //
	if (FileName)
		delete[] FileName;
	
}

Main.cpp
PHP:
#include <iostream>
#include <ctype.h>
#include <string>

// Einbinden der Klassendefinitionen //
#include "Data.cpp"

using namespace std;			// Stream std als Namespace definiert

// FUNKTIONSDEKLARATION //



int main (int argc, char *argv[] )
{
	
	char *CommandArgument = argv[1];

	// Bildschirm leeren //
	system("cls");	
	
// ARGUMENTÜBERPRÜFUNG //

	// Keine Parameter beim Aufruf übergeben //
	if (argc <= 1)
	{
		cout <<"Geben Sie als Parameter die einzulesende Datei ein!"<< endl;
		system("pause");
		return 0;
	}
	
	// Zu viele Parameter übergeben //
	if (argc > 2)
	{
		cout <<"Zu viele Parameter uebergeben"<< endl;
		system("pause");
		return -1;
	}

	// Dateiname als Parameter übergeben //
	if (argc == 2)
	{
		
		int iPointPosition = 0;		// Variable zur Anzeige der Punktposition des Arguments //

		// Suchen der Position des '.' Zeichens // 
		for (unsigned int count = 0; count <= strlen(CommandArgument); count++)
		{
			// Wenn der Punkt gefunden wurde wird die Schleife beendet //
			if (CommandArgument[count] == '.')
			{
				iPointPosition = count;
				break;
			}
		}
		
		// Überprüfung des Strings ab der Punktstelle // 
		if (CommandArgument[iPointPosition + 1] == 't' && CommandArgument[iPointPosition + 2] == 'x' && CommandArgument[iPointPosition + 3] == 't')
		{
			// Erstellen der Klasse CData bei der das Argument der Textfile übergeben wird //
			CDataHandling HandleFile(CommandArgument);
			
			cout << "Textdatei" << endl;
		}
		else
		{
			cout << "Ungueltiger Parameter. Geben Sie Parameter in Form von *.txt an." << endl;
			return -1;
		}

		system("pause");
		return 0;
	}
	
}


Fehlermeldung:
"public: __thiscall CDataHandling::CDataHandling(char const *)" (0CDataHandling@@QAE@PBD@Z) ist bereits in main.obj definiert
 
Zuletzt bearbeitet:
Übersetzung von MCoders Beitrag ;-):

Dein Fehler liegt im #include. Du mußt da nur die Headerdatei 'Data.h' includieren.

Erklärung:
In deinem Projekt werden 2 Dateien compiliert: data.cpp und main.cpp. Es wird also eine data.o und eine main.o erzeugt. Soweit klappt noch alles. Da Du aber die Datei data.cpp in main.cpp includiert hast (includieren wirkt sich so aus, als hättest Du den Code aus data.cpp in die datei main.cpp kopiert), hast Du in beiden Dateien die Definition des Konstruktors. Der Linker will jetzt die beiden Object-Dateien zusammenbinden, findet aber 2 Definitionen des Konstruktors -> er weiß nicht, welchen er nehmen soll -> FEHLER.

Eine andere (unkonventionelle) Möglichkeit wäre, das include zu lassen, wie es ist, aber nur die main.cpp zu kompilieren und zu linken (z.B. einfac gcc main.cpp -oprogrammname). Da dann keine Datei data.o erzeugt wird, ist die Definition auch nur einmal vorhanden.
Das nur der Vollständigkeit halber, korrekter wäre es, wenn Du data.h includierst, beide Dateien kompilierst und dann zusammenlinkst.
 
Zurück