Linker Fehler



  • Guten Abend Gemeinde,

    Ich sitze schon eine weile vor dieser Fehlermeldung:

    main.obj : error LNK2005: "char * * partei" (?partei@@3PAPADA) already defined in DHundt.obj
    
    fatal error LNK1169: one or more multiply defined symbols found
    

    Er meckert wahrscheinlich an diesem hier:
    char *partei[] = { "A", "B", "C", "D", "E" };

    weil, wenn ich den pointer array nicht variable initialiesiere - funktioniert's.

    Wie löse ich das Problem?

    Danke für eure Antworten. 👍

    Erstellt mit Visual C++ 2008 Express Edition (daher "#pragma once")

    Party.h

    #pragma once
    #include <iostream>
    #include <iomanip>
    #include <cctype>
    using namespace std;
    
    class Party
    {
    private:
    	char *m_name;
    	float m_stimmen,
    	m_geteiltStim,
    	m_teiler;
    	int m_sitze;
    public:
    	Party(void){} // default
    	~Party(void){} //dekonstruktor
    	//Monster-Konstr
    	Party(char *name, float stimmen) : m_name(new char[strlen(name)+1]),
    	m_stimmen(stimmen),
    	m_geteiltStim(stimmen),
    	m_sitze(0), m_teiler(1) {
    	strcpy(m_name, name);}
    	//Methoden
    	char *getName(void) { return m_name; }
    	float getGesamtStim(void) { return m_stimmen; }
    	float getGeteiltStim(void) { return m_geteiltStim; }
    	void setSitz(void) { m_sitze++; m_geteiltStim = m_stimmen/++m_teiler; }
    	int getSitze(void) { return m_sitze; }
    };
    

    //DHundt.cpp

    #pragma once
    #include "Party.h"
    
    char *partei[] = { "A", "B", "C", "D", "E" };
    const int parteiZahl = sizeof(partei)/sizeof(partei[0]);
    
    class DHundt: public Party
    {
    private:
    	Party *m_partei[parteiZahl];
    	int m_gesamtSitze;
    	float m_gesamtStimmen;
    public:
    	DHundt(void);
    	~DHundt(void);
    	DHundt(int sitzZahl) : m_gesamtSitze(sitzZahl), m_gesamtStimmen(0)
    	{
    		float stimmen;
    		cout << "Geben Sie die abgegebenen Stimmen pro Partei ein" << endl;
    		for (int i=0; i<parteiZahl; i++) 
    		{
    			cout << partei[i] << ": ";
    			cin >> stimmen; 
    			m_partei[i] = new Party(partei[i], stimmen);
    			m_gesamtStimmen += stimmen;
    		}
    	}
    	void berechne(void);
    	void gibAus(void);
    };
    

    //DHundt.h

    #include "DHundt.h"
    
    DHundt::DHundt(void){}
    DHundt::~DHundt(void){}
    void DHundt::berechne(void)
     {
    	char zeich;
    	cout << endl << "Soll jede einzelne Sitzzuteilung ausgegeben werden (j/n) ? ";
    	cin.get(zeich); 
    	bool detailAusgabe = tolower(zeich) == 'j'; cout << endl;
    	int vergebeneSitze = 0;
    	while (vergebeneSitze < m_gesamtSitze) 
    	{
    		int max = 0;
    		for (int i=1; i<parteiZahl; i++)
    			if (m_partei[i]->getGeteiltStim() > m_partei[max]->getGeteiltStim())
    			max = i;
    			++vergebeneSitze;
    			if (detailAusgabe)
    			cout << endl << "...Sitz " << vergebeneSitze
    			<< " geht an: " << m_partei[max]->getName() << " ("
    			<< setprecision(0) << setiosflags(ios::fixed)
    			<< m_partei[max]->getGeteiltStim() << ")";
    		m_partei[max]->setSitz();
    	}
    }
    void DHundt::gibAus(void)
    {
    	cout << endl << endl << "Sitzverteilung:" << endl << endl
    	<< setw(13) << "Partei | " << setw(8) << "Sitze | "
    	<< setw(23) << "Prozent (Sitze) | "
    	<< setw(22) << "Prozent (Stimmen) |" << endl
    	<< "-----------+-------+----------------------+"
    	"----------------------|" << endl;
    	for (int i=0; i<parteiZahl; i++)
    	{
    		cout << setw(10) << m_partei[i]->getName() << " | "
    		<< setw(5) << m_partei[i]->getSitze() << " | "
    		<< setw(20) << setprecision(2)
    		<< (float)m_partei[i]->getSitze()/(float)m_gesamtSitze*100
    		<< " | " << setw(20) << setprecision(2)
    		<< m_partei[i]->getGesamtStim()/m_gesamtStimmen*100 <<" | " <<endl;
    	}
    }
    
    #include "DHundt.h"
    
    int main(void) 
    {
    	int AnzahlSitze;
    	cout << "Wieviele Sitze sind zu vergeben: "; 
    	cin >> AnzahlSitze;
    	DHundt sitzVerteilung(AnzahlSitze);
    	sitzVerteilung.berechne();
    	sitzVerteilung.gibAus();
            system("pause");
            return 0;
    }
    


  • Mach

    char *partei[] = { "A", "B", "C", "D", "E" }; 
    const int parteiZahl = sizeof(partei)/sizeof(partei[0]);
    

    mal an den Anfang von Party.h.



  • Du solltest partei nicht im Header definieren.

    // dhundt.h
    extern const char* partei[];
    extern const int parteiZahl;
    
    // dhundt.cpp
    const char *partei[] = { "A", "B", "C", "D", "E" }; // const-strings!
    const int parteiZahl = sizeof(partei)/sizeof(partei[0]);
    

    Weiteres:
    (void) für leere Funktionsparameter ist überflüssig, () reicht und bedeutet dasselbe.
    std::string ist das Standard-C++-Mittel für Zeichenketten.
    DHundt ist also eine Partei, die weitere Parteien besitzt? Bist du sicher, dass das so stimmt?



  • müsste nun so passen.

    Ist const zwingend? danke



  • pampy schrieb:

    Ist const zwingend? danke

    zwingend nicht, aber es hilft fehlern vorzubeugen:

    char* text = "asd";
    text[2] = 'q'; //BÄM - Laufzeitfehler
    
    const char* txt = "asd";
    text[2] = 'q'; //Compilerfehler
    

    gehört auch zum guten ton.

    bb



  • ok, gut! Gibt's dazu weiterführendes Material das zu empfehlen kannst?

    danke!



  • jopp:
    "const correctness"
    ggf noch nen C++/cpp mit eintippen^^

    bb


Log in to reply