include-Reihenfolge

schiese

Erfahrenes Mitglied
Hallo,
ich habe ein Programm, das nicht kompiliert
31.cpp
C++:
#include "person.h"
#include <iostream>

int main() {
    Person am {"Annabella Meier", 22, Geschlecht::w};
}

person.h
C++:
#ifndef PERSON_H
#define PERSON_H

#include <string>

enum class Geschlecht { m, w };

class Person {
    private:
        std::string name;
        unsigned int alter;
        Geschlecht g;
    public:
        Person(std::string name, unsigned int alter, Geschlecht g);
        std::string getName();
        unsigned int getAlter();
        void setName(const std::string& neuerName);
        void setAlter(unsigned int neuesAlter);
        bool istFrau();
        bool istMann();
};

#endif

person.cpp
C++:
#include <iostream>
#include "person.h"

Person::Person(std::string name, unsigned int alter, Geschlecht g) {
    this->name = name;
    this->alter = alter;
    this->g = g;
}

std::string Person::getName() {
    return this->name;
}

unsigned int Person::getAlter() {
    return this->alter;
}

void Person::setName(const std::string& neuerName) {
    this->name = neuerName;
}

void Person::setAlter(unsigned int neuesAlter) {
    this->alter = neuesAlter;
}

bool Person::istFrau() {
    return this->g == Geschlecht::w;
}

bool Person::istMann() {
    return this->g == Geschlecht::m;
}

31.cpp: In function 'int main()':
31.cpp:5:36: error 'Geschlecht' has not been declared

Vertausche ich allerdings die include-Befehle in 31.cpp
31.cpp
C++:
#include <iostream>
#include "person.h"
...

Kompiliert es. Ich habe mir, wie Technipion gesagt hat, den Präprozessor drüberlaufen lassen und mir die Datei angeschaut. Die Definition des enums ist in der Datei vorhanden. Wieso kompiliert er den Code dann nicht?
 
Zuerst mal: Das ist ein vorbildlicher Post @schiese. Danke dafür.

Kompiliert es. Ich habe mir, wie Technipion gesagt hat, den Präprozessor drüberlaufen lassen und mir die Datei angeschaut. Die Definition des enums ist in der Datei vorhanden. Wieso kompiliert er den Code dann nicht?
Ja hier wird es jetzt komisch, ich habe deine Schritte wiederholt. Also die Dateien main.cpp (deine 31.cpp) und person.h bzw. person.cpp angelegt. Dann habe ich mittels g++ main.cpp person.cpp -o main.bin das Programm compiliert und voilà, es hat funktioniert. Habe sicherheitshalber mit cpp nochmal überprüft, und genau wie bei dir war auch bei mir Geschlecht korrekt definiert (macht ja Sinn, sonst hätte er bei mir nicht compiliert).

Ich bin mir ehrlichgesagt noch nicht sicher, woran das bei dir liegen könnte :unsure:
Welches OS/IDE/Compiler nutzt du denn?
(Ich bin auf Ubuntu 19.04 mit g++ 8.3.0)

Gruß Technipion
 
Hallo Technipion,

vielen Dank für deine Antwort. Ich habe Windows 7 Professional (64 Bit). IDE habe ich Code::Blocks, habe aber versucht das Programm über die Eingabeaufforderung zu kompilieren. g++ habe ich in der Version 7.1.0, da im Buch steht, dass man lieber einen etwas älteren Compiler nutzen sollte, da dem Compiler evtl. noch nicht alle Neuerungen bekannt sind.

Fehlermeldung.png

Sollte ich vielleicht mal eine neuere Version des g++-Compilers installieren?
 
Ich glaube, ich habe das Problem beheben können.
Die Aufgabenstellung (aus der C++ Programmierer) sah zuerst so aus, dass man den Konstruktor nur mit dem Namen und dem Alter anlegen sollte. Das hat alles wunderbar funktioniert. Ich habe es kompilieren können. Dann sollte man es um das Geschlecht erweitern. In der Header-Datei die enum-Klasse einfügen und den Konstruktor erweitern. Das habe ich getan und ab da ging nichts mehr. Jetzt habe ich allerdings, als ich im Ordner war, festgestellt, dass ich bei der ersten Aufgabenstellung (ohne Geschlecht), die Header-Datei (person.h) auch kompiliert habe. Mein Aufruf lautete
C++:
g++ -c 31.cpp person.h person.cpp
und im Verzeichnis lag eine datei namens person.h.gch. Als ich diese gelöscht habe, konnte ich es kompilieren.

Daraus stellt sich jetzt für mich eine andere Frage. Wird immer eine bereits kompilierte Header-Datei benutzt (ja, wenn vorhanden -> Precompiled Headers) und wieso ließ sich das Programm dennoch beim Vertauschen der Einbindungsreihenfolge kompilieren?
 
Zuletzt bearbeitet:
Zurück