Objekt doppelt definiert ?????
-
In MSVC++ reicht ein
#pragma onceam Anfang des Headers. Aber das ist natürlich nicht ganz portabel, du kannst deshalb auch die klassischen Include-Guards verwenden:
#ifndef INCLUDE_GUARD #define INCLUDE_GUARD // Code #endifBei Google solltest du dazu genügend Informationen finden.
_matze schrieb:
EDIT: Hmm, jetzt warst du schon wieder schneller.

Heute scheint irgendwie mein Tag zu sein...

-
Das geht auch in GCC.

-
Ihr Experten, das ist ein Linkerfehler.
Der Grund ist, dass der Destruktor von config im Header definiert ist. Wird dieser Header in mehreren Übersetzungseinheiten verwendet, gibt es somit eine doppelte Definition. Lösen kann man das Problem auf zwei Arten:
- Man definiert den Destruktor im cpp-File
- Man definiert ihn
inline
-
Nexus schrieb:
Heute scheint irgendwie mein Tag zu sein...

Wohl doch nicht... und meiner auch nicht...

-
Vielen Dank Euch allen. Ich werde mal sehen was ich alles zu Include Guards finde und mich da mal etwas einlesen. Vielen Dank auch mal für den Tipp mit
dem Destruktor. Ich werde das heute mal testen.
-
Bashar hat natürlich Recht. Pack den Destruktor in deine cpp-Datei.
Du hast Include Guards selbst schon eingesetzt. Sowas hier sind Include Guards.
tyrel schrieb:
#ifndef MY_WINDOW_H #define MY_WINDOW_H //... #endif
-
Vielleicht sollte man auch darauf hinweisen, dass ein using namespace std; im Header eine sehr schlechte Idee ist.
Die Erklärung dazu sollte eigentlich auch mal in die FAQ.
-
_matze schrieb:
Wohl doch nicht... und meiner auch nicht...

Naja, ich hab das auch nicht unbedingt nur wegen dieses Threads gesagt, der Tag ist auch sonst gut gelaufen.

Bashar schrieb:
Ihr Experten, das ist ein Linkerfehler.
Jeder irrt sich mal, oder? Ich habe halt gesehen, dass in config.h keine Guards drin sind. Vielleicht hätte ich mir den Post länger anschauen sollen. Das hätte ich auch gemacht, wenn weniger Code da gestanden hätte...

Um doch noch was beizutragen:
int config::readConfig(string filename)Hier sollte besser eine Übergabe per Const-Referenz stattfinden.
MyWindow* window = new MyWindow;Die Zeile verursacht ein Memory Leak. Speicher, den man mit
newanfordert, muss mitdeletewieder freigegeben werden! Auch wenn das Programm beendet wird, besteht keine Garantie, dass das Betriebssystem das für einen tut.
-
Nexus schrieb:
Bashar schrieb:
Ihr Experten, das ist ein Linkerfehler.
Jeder irrt sich mal, oder? Ich habe halt gesehen, dass in config.h keine Guards drin sind.
Und andere sehen bei egal welcher Frage zuerst, dass da void main oder iostream.h steht. Mich stört es einfach, wenn hier wie so oft reflexartig aus der Hüfte geschossen wird, ohne sich das gepostete Problem überhaupt anzuschauen. Das war hier sehr schön demonstriert, weil gleich mehrere auf die gleiche Weise reingefallen sind.
Vielleicht hätte ich mir den Post länger anschauen sollen. Das hätte ich auch gemacht, wenn weniger Code da gestanden hätte...

Die Fehlermeldung hätte doch gereicht.
-
Bashar schrieb:
[Und andere sehen bei egal welcher Frage zuerst, dass da void main oder iostream.h steht. Mich stört es einfach, wenn hier wie so oft reflexartig aus der Hüfte geschossen wird, ohne sich das gepostete Problem überhaupt anzuschauen. Das war hier sehr schön demonstriert, weil gleich mehrere auf die gleiche Weise reingefallen sind.
Ja, das kann ich gut verstehen. Hier war es so, dass ich die fehlenden Guards sah und dann gar nicht viel überlegte. Zugegeben, das war vielleicht nicht so gut, ich versuche mich in Zukunft mehr darauf zu achten.
Meistens nehme ich mir aber Zeit und gebe mir Mühe bei der Antwort. Ich selber habe zumindest das Gefühl, dass meine Beiträge einigen Leuten helfen. Dann kann es von mir aus gesehen auch mal passieren, dass man ein Problem falsch einschätzt.
-
ich möchte als Verursacher auch noch Stellung beziehen. Ich bin Neuling was C++ angeht. Grundkenntnisse ja und ein gefährliches Halbwissen. Ich fand alle Beitrag hilfreich, weil zum einen, das mit den Include Guards hatte ich ja in meiner eigenen Header Datei nicht drin und zu einem sauber definierten Code gehört das wohl (hab ich gelernt
): Zum dem wurde mir geholfen in Form der richtigen Lösung. Ich habe den Destruktor in die .cpp genommen und es rennt jetzt (zu mindest diese Problem habe ich gelöst) und ich habe wieder was gelernt. Auch die weiteren Post waren hilfreich, ich habe zwar nicht alles verstanden, aber das liegt an mir und meinem Halbwissen
ich habe zu Anregungen bekommen was man besser machen kann/soll, mehr kann ich nicht verlangen.Daher ein großes Lob an die Poster, welche sich bemüht haben mir zu helfen. Ja ihr habt mir geholfen und ihr macht hier einen super Job. Danke.

tYREL