Aufteilung von Sourcecode in Header bzw. c files

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
gizno82
Beiträge: 46
Registriert: Sa Dez 19, 2009 4:03 pm

Aufteilung von Sourcecode in Header bzw. c files

Beitrag von gizno82 » Mi Jun 01, 2011 5:59 pm

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

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Aufteilung von Sourcecode in Header bzw. c files

Beitrag von Bebu » Mi Jun 01, 2011 7:34 pm

Sie dir mal in Main an, was genau du includierst ;) Anschließend: Hast du schon einmal etwas von Präprozessorschaltern in Headerdateien gehört?
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Aufteilung von Sourcecode in Header bzw. c files

Beitrag von Dirty Oerti » Mi Jun 01, 2011 10:41 pm

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 ;)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

gizno82
Beiträge: 46
Registriert: Sa Dez 19, 2009 4:03 pm

Re: Aufteilung von Sourcecode in Header bzw. c files

Beitrag von gizno82 » Do Jun 02, 2011 8:33 pm

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

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Aufteilung von Sourcecode in Header bzw. c files

Beitrag von Bebu » Do Jun 02, 2011 9:54 pm

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.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Aufteilung von Sourcecode in Header bzw. c files

Beitrag von Xin » Fr Jun 03, 2011 5:30 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten