PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ Anfängerfrage : Klasse und Funktionen


Gast
2007-02-23, 11:16:51
Hallo,

ich habe eine Frage zur Klassen in c++. Und zwar habe ich eine Klasse mit mehren Funktionen. Die Klasse ist in einer cpp Datei gespeichert. Insgesamt fast 800 Zeilen lang, was natürlich ziemlich unübersichtlich ist. Ich würde deshalb gerne einige Funktionen der Klasse in eigenen Dateien speichern. Wie mache ich das?

Ich habe es schon so versucht: "Funktion1.cpp ". Aber cpp Dateien kann ich ja nicht includen. Und in einer Header datei kann ich ja nur Funktionen deklarieren, oder ?

Trap
2007-02-23, 11:30:07
#include ist reines Text kopieren und an Stelle des #include einfügen, das funktioniert mit beliebigen Dateien.

Wenn man Definitionen in verschiedenen Dateien hat, kompiliert man die üblicherweise einzeln und linkt sie dann zusammen. Man kann die einzelnen Definitionen auch mit #include in eine Datei kopieren und die dann kompilieren, aber das ist sehr unüblich.

ShadowXX
2007-02-23, 11:38:41
Hallo,

ich habe eine Frage zur Klassen in c++. Und zwar habe ich eine Klasse mit mehren Funktionen. Die Klasse ist in einer cpp Datei gespeichert. Insgesamt fast 800 Zeilen lang, was natürlich ziemlich unübersichtlich ist. Ich würde deshalb gerne einige Funktionen der Klasse in eigenen Dateien speichern. Wie mache ich das?

Welche IDE benutzt du? Denn 800 Zeilen sind normalerweise nicht wirklich unübersichtlich, eine ordentliche IDE gibt dir eine Klassenansicht/Übersicht, so das du auch mit wesentlich komplexeren Klassen ohne Probleme und "übersichtlich" klar kommst.
(Bei uns haben einzelne Klassen oftmals weit über 5000++ Zeilen).

Gast
2007-02-23, 11:42:53
Ok.
Ich scheine da noch irgend was falsch zu machen.
In meiner Funktion1.cpp beginnt die Funktion mit:

void KlassenName::Funktion1( int a, int b){
.
.
.
}

Der Compiler meckert dann, das Klassename nicht bekannt ist. Wenn ich Klassename aber weg lasse, dann ist Funktion1 ja keine Funktion von meiner Klasse mehr ???

Gast
2007-02-23, 11:44:34
diese funktionen heissen eigentlich methoden. Definition von diesen methoden muss nicht unbedingt per "include" aus 'ne extra datei eingebunden werden. du kannst sie einfach einzeln in jeder datei implementieren.

Gast
2007-02-23, 11:46:24
Ok.
Ich scheine da noch irgend was falsch zu machen.
In meiner Funktion1.cpp beginnt die Funktion mit:

void KlassenName::Funktion1( int a, int b){
.
.
.
}

Der Compiler meckert dann, das Klassename nicht bekannt ist. Wenn ich Klassename aber weg lasse, dann ist Funktion1 ja keine Funktion von meiner Klasse mehr ???

hast header datei included?

Gast
2007-02-23, 11:49:35
@ ShadowXX

ich arbeite mit xcode auf macos. Früher habe ich mal mit Visual Studio (Express Edition) gearbeitet und da fand ich das auch übersichtlicher. Jetzt muss ich aber für ein Projekt auf xcode umsteigen. Und Umstieg + eingerostete C++ Kenntnisse sind keine gute Kombination.

Gast
2007-02-23, 11:51:56
hast header datei included?


Welche header datei meinst du? Soll ich die Klasse als Header datei includen ?

Gast
2007-02-23, 11:53:31
Welche header datei meinst du? Soll ich die Klasse als Header datei includen ?

natürlich ... die header datei mit der deklaration der classe

Gast
2007-02-23, 11:55:37
natürlich ... die header datei mit der deklaration der classe

oh halt! Wenn du definition der methode per "include" einfügst dann musst du diese datei nicht mitkompilieren. Du musst nur die Hauptdatei wo diese "includes" stehen kompilieren

Gast
2007-02-23, 12:01:11
oh halt! Wenn du definition der methode per "include" einfügst dann musst du diese datei nicht mitkompilieren. Du musst nur die Hauptdatei wo diese "includes" stehen kompilieren

ausserdem ist es üblich diese datein mit *.inc extension zu benennen .. sprich übersicht

Xmas
2007-02-23, 14:31:59
Man trennt in C++ normalerweise Klassendeklaration und -definition. Dass man dann noch die Methodendefinitionen auf mehrere Dateien verteilt ist zwar unüblich, aber möglich.

Klasse.h#ifndef _KLASSE_H_
#define _KLASSE_H_

class Klasse
{
void Methode1();
void Methode2();
//...
};
#endif

Klasse_Methode1.cpp#include "Klasse.h"

void Klasse::Methode1()
{
//...
}

Klasse_Methode2.cpp#include "Klasse.h"

void Klasse::Methode2()
{
//...
}

Gast
2007-02-23, 16:14:59
Danke Xmas für dieses Beispiel. Ich hab meine Klasse jetzt genauso umgebaut. Trotzdem erkennt der Compiler dann in den Methoden überhaupt nichts von dem was ich in dem Klassen header deklariert habe. ???

Die Dateien sind im gleichen Verzeichnis. Und es wird auch nicht bei der #include Anweisung gemeckert. (wenn ich bei #inlcude den namen der headerdatei änder gibts da ne fehlermeldung) Also wird der header schon gefunden/erkannt... bin ratlos

ShadowXX
2007-02-23, 16:37:40
Danke Xmas für dieses Beispiel. Ich hab meine Klasse jetzt genauso umgebaut. Trotzdem erkennt der Compiler dann in den Methoden überhaupt nichts von dem was ich in dem Klassen header deklariert habe. ???

Die Dateien sind im gleichen Verzeichnis. Und es wird auch nicht bei der #include Anweisung gemeckert. (wenn ich bei #inlcude den namen der headerdatei änder gibts da ne fehlermeldung) Also wird der header schon gefunden/erkannt... bin ratlos
Jede Klasse braucht noch einen Konstructor und Destructor. Und dazu ob die jeweiligen Member (vars, methoden, etc.) public, protected oder private sind.

Um bei XMas Beispiel zu bleiben:

#ifndef _KLASSE_H_
#define _KLASSE_H_

class Klassenname
{
public:
Klassenname(){} // Konstuktor
~Klassenname(){} // Destuctor

void Methode1();
void Methode2();
//...
};
#endif


Beim Konstruktor & Destructor kann man die Definition natürlich auf in die cpp legen, also:

in der Header-Datei:

#ifndef _KLASSE_H_
#define _KLASSE_H_

class Klassenname
{
public:
Klassenname(); // Konstuktor
~Klassenname(); // Destuctor

void Methode1();
void Methode2();
//...
};
#endif

-------------------------------------------------------------

und in die cpp dann:

Klassenname::Klassename()
{
// möglicher code zur initilaisierung von was
}

Klassenname::~Klassename()
{
// möglicher code zum aufräumen
}

Gast
2007-02-23, 16:47:20
Ja Konstruktor und Destruktor hab ich. Das Problem ist, dass ich in der cpp immer die Fehlermeldung kommt, das alle mögliche Sachen unbekannt sind.

im header hab ich nur die Deklaration der Klasse mit Membervaribalen, Memberklassen etc. Dann hab ich eine cpp Datei wo die Definition von fast allem ist (Konstruktor, Destruktor, Membermethoden) und eine weitere cpp Datei, wo die Definition von einer besonders umfangreichen Membermethode ist.

Die Fehlermeldung kommt schon ganz am Anfang.

Klassename::Klassenname() {
.
.

Fehler: Klassenname hier nicht definiert. (not declared in this scope)

Xmas
2007-02-24, 02:14:01
Gast,
probier mal, das #include durch die Klassendeklaration aus dem Header zu ersetzen. Wenn es dann nicht geht, müsstest du wohl mehr Code und die genaue Fehlermeldung posten.

Jede Klasse braucht noch einen Konstructor und Destructor. Und dazu ob die jeweiligen Member (vars, methoden, etc.) public, protected oder private sind.
Wenn man keinen Konstruktor deklariert, generiert der Compiler automatisch Default-Konstruktor und Copy-Konstruktor. Destruktor braucht man nur wenn man Ressourcen explizit freigeben muss. Klassenmember sind standardmäßig private (bei struct dagegen public). Daran kann es also nicht liegen.