010
28.08.2004, 13:37 Uhr
Pablo
Supertux (Operator)
|
Soweit ich weiß, ist der Unterschied ziwschen struct und class nur der, dass die Elemente von struct alle öffentlich sind. Sonst gibt es keine Unterschiede, glaube ich.
Was
macht, ist mir nicht klar.
Was A::A macht ist folgendes: Du fragst, was soll das :: und das A::. Das :: ist Bezeichnung für den Namensbereich, A::B heißt "benutze B vom Namensbreich/Klasse A". Das ist abstrakt, hier ein Beispiel:
C++: |
/* klassen.h */
#ifndef KLASSEN_BSP #define KLASSEN_BSP #include <string> #include <iostream>
class DE { std::string name; public: DE(std::string); /* Konstruktor */ void say_hello(); };
class EN { std::string name; public: EN(std::string); /* Konstruktor */ void say_hello(); }; #endif
|
Dass die Klassen gleich aussehen, ist hier ein Zufall. Was wichtig ist, dass beide Klassen die Funktion void say_hello() haben!
C++: |
/* klassen.cpp */
#include "klassen.h"
DE::DE(std::string name) { this->name = name; }
void DE::say_hello() { std::cout << "Hallo, " << this->name << "! Wie geht es dir?" << std::endl; }
EN::EN(std::string name) { this->name = name; }
void EN::say_hello() { std::cout << "Hello, " << this->name << "! How are you? " << std::endl; }
|
So, in klassen.h habe ich die Klassenprototypen. Diese Header Datei hat aber keine Implementierung der Konstruktoren und der Funktionen. Sie dienen nur dazu, dass alle andere .cpp Dateien drüber wissen, welche Struktur die Klassen haben.
In klassen.cpp habe ich die Implementierung der Klassen. Guck mal, es gibt zweimal void say_hello. Woher soll der Kompiler wissen, dass es sich um die Funktion say_hello der Klasse DE bzw. EN handelt? Woher weiß der Compiler, dass void say_hello überhaupt einer Klasse gehört?
Dafür ist :: da. Mit void DE::day_hello teile ich dem Compiler mit, dass es sich um die Funktion say_hello der Klasse DE handlelt.
C++: |
#include "klassen.h"
int main(int argc, char** argv) {
if (argc != 2) { std::cerr << "usage: " << argv[0] << " your_name" << std::endl; return 1; }
std::string name = argv[1];
DE deutsch(name); EN english(name);
deutsch.say_hello(); english.say_hello();
return 0; }
|
Diese 3. Datei dürfte die Antwort auf deine andere Frage. In den Header Dateien sind nur die Prototypen, die sorgen dafür, dass die Source Dateien (.cpp) wissen, welche Strukuturen zur Verfügung stehen, wie sie implementiert sind, ist es egal. Und so habe ich kompiliert:
bash: |
$ g++ klassen.cpp -c
|
Die Datei klassen.cpp wird nur kompiliert, eine Objekt Datei wird dadurch mit dem Namen klassen.o erzeugt.
Die Datei main.cpp wird nur kompiliert, eine Objekt Datei wird dadurch mit dem Namen main.o erzeugt.
Der Kompiler hat beide Dateien kompiliert, mit Hilfe der Header Datei klassen.h weiß der Compiler, wie die Klasse DE bzw. EN aussieht, und auch, wem die Funktionen gehört. Ich habe nur 2 .o Dateien, aber ich habe keine ausführbare Datei, d.h. ich kann noch kein Programm ausführen. D.h. aus den Objekt Dateien muss ich eine ausführbare Datei erzeugen. Dafür benutze ich den Linker. Der Linker sorgt dafür, die objekt Dateien zusammenzufügen und daraus eine ausfühbare Datei zu erzeugen.
bash: |
$ g++ -o hello main.o klassen.o
|
g++ linkt beide Objekt Dateien und erzeugt eine ausführbare Datei (hello). Nun kann ich das Programm ausführen
bash: |
rex@supertux:~/tmp/funsoft> ./hello Pablo Hallo, Pablo! Wie geht es dir? Hello, Pablo! How are you?
|
-- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! |