[c++] Code::Blocks: multiple definition

ComFreek

Mod | @comfreek
Moderator
Hallo alle,

ich habe mir gerade Code::Blocks runtergeladen und installier (auch Mingw). Funktioniert eigentlich super und das Design finde ich auch super (vs. Dev-C++)!
Nunwollte ich jetzt eine Windows-Anwendung schreiben (mit Win-API). Dann habe ich folgende Klasse in einer seperaten Datei ("classes.h") deklariert:
C++:
#ifndef CLASSES_H_INCLUDED
#define CLASSES_H_INCLUDED

class Auto
{
  public:
    Auto(){};
    int speed();
};
int Auto::speed()
{ // ==>Hier ist die Fehlermeldung
}

#endif // CLASSES_H_INCLUDED
Der Compiler meckert, dass Auto::speed mehrfach definiert ist (multiple definition of `Auto::speed()'). Wenn ich die Definition gleich in die Klasse packe, dann funktioniert es:
C++:
class Auto
{
  public:
    Auto(){};
    int speed()
    {
      // ...
    }
};
Es hat also was mit den Prototypen zu tun.
Ich hoffe, mir kann jemand helfen!
Ich bedanke mich für jeden Tipp!
 
Definiere mal um deine Klasse rum einen Namespace in der .h und .cpp Datei. Ist in C++ zwar nicht Pflicht, aber guter Stil und löst meist Namenskonflikte ohne großes rumsuchen.

in auto.h
Code:
namespace myauto
{
  class Auto
  {
  public:
  ...
    int speed();
  };
}

in auto.cpp
Code:
namespace myauto
{
  int Auto::speed()
  {
  ...
  };
}

Traveller
 
Hey!

@ComFreek: Der Fehler kommt daher, das du die Definition der Methode in den Header geschrieben hast. Bindest du die Headerdatei durch include in mehreren .cpp Dateien ein, befindet sich die Definition der Methode in den entsprechenden Dateien wieder (es ist so als hättest du den Code der Headerdatei kopiert und überall da wo #include "classes.h" steht eingefügt - genau das passiert beim Kompilieren).

Deswegen darf man keine Definitionen in Headerdateien schreiben, nur Deklarationen.

Also entweder definierst du die Methode in einer eigenen .cpp Datei oder innerhalb der Klasse (dann wird sie automatisch als inline deklariert wodurch das wieder OK ist).

CU
 
Danke für die Antworten.
@Traveller: Das habe ich ausprobiert, funktioniert trotzdem nicht. Der Fehler liegt jetzt bei der Definition.
@Reebo: Ich habe folgende Dateien im Projekt (im Code::Blocks Projekt so angezeigt):
  • MyProject
    • Sources
      • main.cpp
      • classes.cpp

Ich habe es geschafft!
Villeicht ist es für andere noch interessant, deshalb schreibe ich mal die "Lösung" hin:
Man sollte keine Headerdateien ins Projekt einbinden, stattdessen manuell "include" schreiben!

Trotzdem danke.
 
Hi.
ComFreek hat gesagt.:
Villeicht ist es für andere noch interessant, deshalb schreibe ich mal die "Lösung" hin:
Man sollte keine Headerdateien ins Projekt einbinden, stattdessen manuell "include" schreiben!
Das sollte eigentlich klar sein. Headerdateien sind nunmal zum "include" da... ;)

Außerdem kann man trotzdem Headerdateien mit ins Projekt aufnehmen - aber eben nicht als Source-, sondern als Headerdatei.

Gruß
 
Code::Blocks erkennt das automatisch als Header.
Ich binde jetzt keine Datei mehr ins Projekt ein (nur noch mit Include)!
 
Ich habe das Programm vorgestern installiert. Ich habe nur ein "paar" (vllt. paar 10000:-)) geschrieben und kompiliert.
 
Zurück