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; } };
#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); };
#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