Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Header-Datei einbinden???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.04.2004, 21:00 Uhr
Cebinem



Hallo an alle!!!
Ich hab ein Problem bei meinem Programm. Ich hoffe ihr könnt mir helfen!
Also ich will eine Klassendeklaration, die ich in einer Header-Datei ("Header.h") gespeichert hab in meine Quellcode-Datei ("Methoden einer einfachen Klasse definieren.cpp") einbinden, also mit


C++:
#include "Header.h" // ist das so richtig?


.

Beim kompilieren der Quellcodedatei ("Methoden einer einfachen Klasse definieren.cpp") erscheinen folgende Fehler:


Code:
In file included from C:/Programme/Dev-C++ 4.9.8.0/Meins/Methoden einer einfachen Klasse definieren.cpp
In member function `void
`cout' undeclared (first use
(Each undeclared identifier is
In
`



Nun meine Fragen:
1. Hab ich die Header-Datei ("Header.h") falsch eingebunden?
2. Findet der Compiler die Datei nicht?

Hier sind zum besseren Verständnis beide Dateien, also "Methoden einer einfachen Klasse definieren.cpp" und "Header.h":

"Methoden einer einfachen Klasse definieren.cpp":


C++:
#include "Header.h" // Header-Dateien einbinden
Cat::Cat(int initialAge) // Konstruktor
{
    itsAge = initialAge;
}

Cat::~Cat() // Destruktor, keine Aktionen
{
}

/* Katze erzeugen, Alter festlegen, miauen lassen
   Alter ausgeben, dann erneut miauen */


int main()
{
    Cat Frisky(8);
    Frisky.Meow();
    cout << "Frisky ist eine Katze, die " << Frisky.GetAge() << " Jahre alt ist.\n";
    Frisky.Meow();
    Frisky.SetAge(10);
    cout << "Jetzt ist Frisky " << Frisky.GetAge() << " Jahre alt.\n";
    cin.get();
    return 0;
}




"Header.h":


C++:
#include <iostream>
class Cat
{
public:
    Cat (int initialAge);
    ~Cat();
    int GetAge()
{
  return itsAge;
}

    void SetAge (int age)
{
  itsAge = age;
}

    void Meow()
{
cout << "Miau.\n";
}
private:
    int itsAge;
};



Hier noch ein paar Daten von mir:
Betriebssystem: Windows XP Professional
Compiler: DEV-C++ 4.9.8.0
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.04.2004, 21:05 Uhr
Pablo
Supertux
(Operator)


Ich würde sagen, es liegt an der Header Datei. Du hast nämlich #include <iostream> und cout ohne std::cout.

Für mich ist die Klasse in Ordnung, ich würde allerdings so probieren:


C++:
#include <iostream>
class Cat
{
public:
    Cat (int initialAge);
    ~Cat();
    int GetAge()
{
  return itsAge;
}

    void SetAge (int age)
{
  itsAge = age;
}

    void Meow()
{
std::cout << "Miau." << std::endl;
}
private:
    int itsAge;
};


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.04.2004, 22:56 Uhr
Cebinem



DANKE an Pablo für deine schnelle Hilfe!!!!!!!!!!!!!!!!!!
Das Programm funktioniert jetzt. Hab wie du es gesagt hast noch die Zeile


C++:
using namespace std;



in die Header-Datei eingefügt und schon hat es geklappt! Ich hab an diese Lösung garnicht gedacht und hab die ganze Zeit versucht die Header-Datei irdengwie anders zu inkludieren, naja nun gehts ja.

Ich hab das mit der Header-Datei nur mal ausprobiert, weil es angeblich "kein guter Programmierstil" ist, die Klassendeklaration in der selben Datei unterzubringen in der die Klassendefinition steht. Also Deklaration und Definition in eine Quellcodedatei (.cpp) zu schreiben.

Dazu folgender Textausschnitt:

"...Obwohl man durchaus die Deklaration in der gleichen Datei unterbringen kann wie die Definition, gehört dieses Vorgehen nicht zum guten Programmierstil. Die von den meisten Programmierern anerkannte Konvention ist die Unterbringung der Deklaration in einer sogenannten Header-Datei,
die gewöhnlich den gleichen Namen hat, aber auf .H, .HP oder .HPP endet..."

Nun ich persöhnlich finde, dass es sehr umständlich ist, die Deklaration immer in eine Header-Datei zu schreiben und diese dann in eine Quellcode-Datei zu inkludieren. Man kann doch auch alles in eine Quellcode-Datei schreiben und dann muss man auch nicht immer hin und her blättern zwischen den einzelnen
Dateien und außerdem kann man die Header-Datei selbst nicht kompilieren und man muss dann erst wieder in die Quellcode-Datei wechseln um Fehler beim kompilieren zu erkennen und dann wieder zurück in die Header-Datei um die Fehler zu beheben. Also ich finde das sehr umständlich. Das einzig positive ist, dass die eigentliche Quellcode-Datei nicht zu groß ist und man ein bisschen mehr den Überblick hat.

Ich wollte deswegen mal wissen, was das noch für Vorteile hat, wenn man die Deklaration in einer Header-Datei unterbringt?

DANKE nochmal an Pablo für die Hilfe!!!!!!!!!!!!!!!!!!!!

MFG
Cebinem
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.04.2004, 23:37 Uhr
kronos
Quotenfisch
(Operator)


wenn du deine klasse in mehreren source-code-dateien verwenden willst muss sie in jeder einzelnen datei deklariert werden. da ist es einfach den header einzubinden, als immer den kompletten code einzufügen, außerdem musst du nur eine datei warten.
hinzukommt, dass es durch header einfacher wird mit anderen menschen an einem projekt zu arbeiten. du bist ja auch froh einfach #include <iostream> schreiben zu können, anstatt in jede datei ein paar hundert zeilen code einfügen zu müssen.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.04.2004, 23:50 Uhr
Pablo
Supertux
(Operator)



Zitat:
Cebinem postete
DANKE an Pablo für deine schnelle Hilfe!!!!!!!!!!!!!!!!!!
Das Programm funktioniert jetzt. Hab wie du es gesagt hast noch die Zeile


C++:
using namespace std;



in die Header-Datei eingefügt und schon hat es geklappt! Ich hab an diese Lösung garnicht gedacht und hab die ganze Zeit versucht die Header-Datei irdengwie anders zu inkludieren, naja nun gehts ja.




Logisch!


Zitat:


Nun ich persöhnlich finde, dass es sehr umständlich ist, die Deklaration immer in eine Header-Datei zu schreiben und diese dann in eine Quellcode-Datei zu inkludieren. Man kann doch auch alles in eine Quellcode-Datei schreiben und dann muss man auch nicht immer hin und her blättern zwischen den einzelnen
Dateien und außerdem kann man die Header-Datei selbst nicht kompilieren und man muss dann erst wieder in die Quellcode-Datei wechseln um Fehler beim kompilieren zu erkennen und dann wieder zurück in die Header-Datei um die Fehler zu beheben. Also ich finde das sehr umständlich. Das einzig positive ist, dass die eigentliche Quellcode-Datei nicht zu groß ist und man ein bisschen mehr den Überblick hat.

Ich wollte deswegen mal wissen, was das noch für Vorteile hat, wenn man die Deklaration in einer Header-Datei unterbringt?

DANKE nochmal an Pablo für die Hilfe!!!!!!!!!!!!!!!!!!!!

MFG
Cebinem


Nein, da hast du nicht Recht. Es gibt manche header Dateien, die wichtige Funktionen definieren, die von quasi alle .c oder .cpp Dateien benutzt werden. Stell dir vor, wenn man bei jeder Datei immer wieder das gleiche schreiben müsste! Wenn das so ist, dann bleiben wir lieber beim Spagetti-Code von QBASIC. Das schöne daran ist, dass man den Code in mehreren Dateien unterteilen kann, und das führt zu einer besseren Übersicht des Programmcodes.

So kann man viele Dateien bei anderen Projekten benutzen, ohne dass der Quellcode nochmal geschrieben wird. So funktionieren auch die Librerien. Stell dir vor, wenn du bei jedem windows Programm nochmal die ganze MFC shcreiben müsstest? In einer Datei??? Oder bei KDE Programmen ganz QT???? In einer Datei?

Ein Vorteil ist auch, dass du an Portabilität gewinnst, denn nicht jedes System behandelt seine Ressourcen gleich. So kann es sein, dass iostream.h unter linux anders aussieht wie unter DOS. Trotzdem reicht der Aufruf #include <iostream> aus, damit man sich nicht mehr Sorgen darum macht.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.04.2004, 10:45 Uhr
typecast
aka loddab
(Operator)


Noch eine Anmerkung:

Setze NIE, NIEMALS using namespace std; in eine Headerdatei. Wenn du das machst, dann gilt dieses using in ALLEN Dateien, die diese Headerdatei einbinden. Das heißt, dass wenn du oder jemand anderes zufällig (und bei der Größe der STL kann das schonmal vorkommen) eine Funktion so bennest, wie sie auch in der STL vorkommt, dann hast kommt ein Kompilerfehler. Benutze in den Headern immer den Prefix std::

Was du in deinen cpp-Dateien machst, überträgt sich nicht auf die anderen Dateien. Da kannst du es machen, wie du willst (allerdings bin ich kein Freund der using-Anweisung)
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.04.2004, 11:30 Uhr
~RedEagle
Gast



Zitat:
typecast postete
(allerdings bin ich kein Freund der using-Anweisung)


Warum?? Gibt es dadurch nachteile??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.04.2004, 11:33 Uhr
typecast
aka loddab
(Operator)


Du darfst dann halt keine deiner eigenen Funktionen oder Klassen so benennen wie es die STL (in den Headerdatein, die du einbindest) tut.
Und ich bin halt ein Pechvogel und dazu auch nicht sehr kreativ, was meine Funktions/Klassennamen angeht :-)
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 05.04.2004 um 11:33 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.04.2004, 13:02 Uhr
Cebinem



an euch alle für die Erklärungen. Ich hab mir schon gedacht, dass es bei größeren Programmen von Vorteil ist, die Header-Dateien extra einzubinden.

An typecast: Ja das mit using namespace std; in der Header-Datei klingt logisch und ich werde es noch ändern und mit std:: machen, DANKE!!!

MFG
Cebinem
--
Jetzt sind wir hier, was jetzt geschieht, geschieht uns. - Anna Seghers
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
05.04.2004, 17:26 Uhr
Pablo
Supertux
(Operator)



Zitat:
~RedEagle postete
[quote]typecast postete
(allerdings bin ich kein Freund der using-Anweisung)


Warum?? Gibt es dadurch nachteile??[/quote]

Ja, und das ist etwas was ich wirklich in C vermisse.

Wenn du Namespaces hast, kannst du einfach verschiedene Funktionen haben, die den gleichen Namen haben und so. Das ist aber nicht gut, wenn jede Funktion immer etwas anderes macht. Mit dem aber die Prefixe benutzt, kann man so diese Funktionen in den verschiedenen Namespaces, ohne dass es Fehler gibt.

Der zweite Nachteil ist, wenn du dummerweise eine STL header Datei includierst und du etwas definierst, was genuaso so wie in der STL header Datei heißt und du benutzt using ..., dann kann der Compiler nicht mehr wissen, um welche Struktur es sich handelt. Wenn du aber immer die Prefixe benutzt, dann passiert sowas nicht.

Und ja, ich bin auch kein Freund von using.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: