Seite 1 von 1

Aufteilung von Sourcecode in Header bzw. c files

Verfasst: Mi Jun 01, 2011 5:59 pm
von gizno82
Hallo

Ich beschäftige mich gerade mit der Objektorientierten Programmierung in c++.
Ich habe eine Konto Klasse mit dem Feld account und den Methoden void setMoney(float value) //einzahlen
float getMoney(float value) //auszahlen und float getAccountValue(void) // Kontostand abfragen implementiert.

Nun habe ich die Headerdatei cBankAccount.hpp der die Klasse definiert ist in die Datei cBankAccount.cpp includiert.
In der Datei cBankAccount.cpp werden sämtlichle Methoden inclusive Konstruktor und Destruktor mit Leben gefüllt.

Die Datei cBankAccount.cpp habe ich in die main.cpp includiert.

Hier mal mein Code ich wäre euch echt Dankbar wenn mir jemand Helfen könnte.

cBankAccount.cpp

Code: Alles auswählen

#include "cBankAccount.hpp"

void cBankAccount::setMoney(float value)
{
    cBankAccount::fMoney += value;
}


float cBankAccount::getMoney(float value)
{
    return (cBankAccount::fMoney -= value);
}


float cBankAccount::getAccountValue(void)
{
    return (cBankAccount::fMoney);
}

cBankAccount::cBankAccount()
{
    cBankAccount::fMoney = 0;
}


cBankAccount::~cBankAccount()
{
    cBankAccount::fMoney = 0;
}



cBankAccount.hpp

Code: Alles auswählen



class cBankAccount
{
    private:
        float fMoney;
    public:
        void setMoney(float value);
        float getMoney(float value);
        float getAccountValue(void);
        cBankAccount();
        ~cBankAccount();
};


//main.cpp

Code: Alles auswählen

#include <iostream>
#include "cBankAccount.cpp"


using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
Der Compiler spuck mir folgende Fehlermeldungen aus:

cBankAccount.cpp|4|multiple definition of `cBankAccount::setMoney(float)'|
cBankAccount\cBankAccount.cpp|4|first defined here|

Diese Fehlermeldung kommt für jede Methode.

Ich bin für jede Hilfe dankbar

Gizmo

Re: Aufteilung von Sourcecode in Header bzw. c files

Verfasst: Mi Jun 01, 2011 7:34 pm
von Bebu
Sie dir mal in Main an, was genau du includierst ;) Anschließend: Hast du schon einmal etwas von Präprozessorschaltern in Headerdateien gehört?

Re: Aufteilung von Sourcecode in Header bzw. c files

Verfasst: Mi Jun 01, 2011 10:41 pm
von Dirty Oerti
Tag :)
gizno82 hat geschrieben:Ich habe eine Konto Klasse mit dem Feld account und den Methoden void setMoney(float value) //einzahlen
float getMoney(float value) //auszahlen und float getAccountValue(void) // Kontostand abfragen implementiert.
Du solltest bei der Benennung deiner Methoden immer auch im Hinterkopf behalten, was die Methode eigentlich machen soll.
Du schreibst hier, dass du eine Methode namens "setMoney" hast, welche für das "einzahlen" zuständig ist.
Das wäre für mich widersprüchlich, da einzahlen bedeutet, den Wert zu erhöhen, sprich eine Addition.
Eine SetterMethode wie deine hier sollte vom Namen her eher dazu da sein, den Kontostand auf einen beliebigen Wert zu setzen.
So viel nur dazu mal nebenbei :)

gizno82 hat geschrieben:Die Datei cBankAccount.cpp habe ich in die main.cpp includiert.
Das ist nicht der Sinn, bzw so sollte es nicht sein.

Includiert werden nur Headerdateien (*.h oder *.hpp), nicht jedoch Dateien mit (dem letztendlichem) Programmcode (*.c oder *.cpp)
In deinem Header steht normalerweise die Deklaration, sprich du erwähnst dort nur, dass z.B. eine Klasse/Funktion existiert.

Lange Rede, kurzer Sinn: Du musst auch in deiner main.cpp die Headerdatei (also cBankaccount.hpp) includieren.

Nun zu den schon von Bebu angesprochenen Präprozessorschaltern (das ist - vereinfacht gesagt - das mit dem # davor)
Bei größeren Projekten verliert man schnell einmal den Überblick, wann was eingebunden wird.
Du kannst einen Test machen:
Bindest du einen Header 2 mal hintereinander ein, dann wird dir der Compiler einen Fehler geben, da die Funktionen/Klassen/... die im Header vorhanden sind doppelt deklariert werden.
Um dies zu verhindern benutzt man sogenannte Include-Guards: Sie verhindern, dass eine Datei mehrfach includiert wird.

Solche Include-Guards sehen folgendermaßen aus:

Code: Alles auswählen

#ifndef NAME_DES_HEADERS
#define NAME_DES_HEADERS

// Deklarationen

#endif
Was dabei passiert:

Beim ersten Includieren (was durch den Präprozessor erfolgt) wird getestet, ob ein Define mit dem Namen "NAME_DES_HEADERS" schon existiert.
Das tut es nicht, also wird ein solches Define definiert. Ab jetzt existiert also dieses Define.
Außerdem wird der Rest des Codes innerhalb des "if blocks" verarbeitet. Also deine Deklarationen.

Beim zweiten (dritten, ... ) Includieren schlägt nun die Überprüfung fehl, denn das Define "NAME_DES_HEADERS" existiert ja bereits. Damit wird alles innerhalb dem "if block" ignoriert ;)

Re: Aufteilung von Sourcecode in Header bzw. c files

Verfasst: Do Jun 02, 2011 8:33 pm
von gizno82
Hallo Leute

Erst mal danke für eure Hilfe
Ich habe jetzt die cBankAccount.hhp in der cBankAccount.cpp und in der main.cpp includiert ist das richtig ?

gruß gizmo

Re: Aufteilung von Sourcecode in Header bzw. c files

Verfasst: Do Jun 02, 2011 9:54 pm
von Bebu
Ja, das ist korrekt. Header dienen dazu, Funktionen und Klassen bekannt zu machen, sprich sie zu deklarieren. Definiert werden sie in einer Sourcedatei, das heißt hier beschreibst du, wie das ganze funktioniert. Es gibt natürlich zu jeder Regel eine Ausnahme, aber grundsätzlich sollte das so sein. Denk an die Präprozessorschalter in den Headern, sonst bekommst du Fehler wegen doppelter Deklaration von Funktionen und Klassen.

Re: Aufteilung von Sourcecode in Header bzw. c files

Verfasst: Fr Jun 03, 2011 5:30 pm
von Xin
gizno82 hat geschrieben:Ich habe jetzt die cBankAccount.hhp in der cBankAccount.cpp und in der main.cpp includiert ist das richtig ?
Hallo gizmo, weswegen nennst Du Deine Klasse cBankAccount und nicht einfach BankAccount?