Funktionen in Extra Datei
-
Hey Leute, ich lern grad C++ mit Scara, dort muss man in Übungen unter anderem Zeichnen. Nun habe ich in meiner Zeichenbrett Datei schon gefühlte eine Million
Funktionen, diese würde ich gern Außlagern in eine "Funktion.cpp"Und diese Includen in die "Zeichenbrett.cpp" ist das irgendwie möglich? Hatte
probiert alles zu Kopieren und bei Zeichenbrett.cpp einfach #include "Funktion.cpp" dann kommt jedoch der Fehler dasXY ist bereits in Funktionen.obj definiert.
Kann man dort irgendwas machen? Wäre sau lieb

PS: In Zeichenbrett.cpp steht dann bei mir gerade:
int main() // Funktionen aufrufen. { Zeichenbrett::Oeffnen(600,400); // ZeichneKreuz(100,100); // Zeichnet ein Kreuz an X=100, Y100 ZeichneRechteck(100,100,200,200); // Zeichnet ein Leeres Rechteck am Schnittpunkt X/Y100 mit Breite/Höhe 200 Pixel, können mit CIN Eingegeben werden. }Sprich er soll die Funktion ZeichneRechteck() aus der Funktionen.cpp Aufrufen.
Danke!
-
Pack die Deklarationen (Funktionsprototypen) in eine Funktionen.h (oder .hpp), und die Definitionen/Implementationen (also die kompletten Funktionen mit Rumpf) in eine Funktionen.cpp. Die Header-Datei bindest du dann per #include-Statement in deiner Zeichenbrett.cpp ein, die Funktionen.cpp nicht, die muss nur dem Projekt hinzugefügt werden (und das ist sie automatisch, wenn du sie über die IDE erstellst). Den Header solltest du übrigens auch unbedingt mit include guards (=>Google) versehen.
-
Also ich habe jetzt verschiedene
Void
und 2-3 Int
habe alles in die Funktion.h gepackt. Jetzt geht alles 1A
Was müsste ich in die Funktionen.cpp machen?
Sprich eine Headerdatei ist wie eine Globale Datenbank auf die alle *.cpp dateien Zugreifen können?
ist eine .h automatisch eine *.dll dann?
(Sorry bin Blutiger Anfänger *g* )
-
Ehnoah schrieb:
Also ich habe jetzt verschiedene
Void
und 2-3 Int
habe alles in die Funktion.h gepackt. Jetzt geht alles 1A
Das denkst du nur. Sobald du den Header in mehr als einer Übersetzungseinheit (cpp-Datei) einbindest, bekommst du Linkerfehler wegen doppelter Definitionen. Daher kommen nur die Prototypen in den Header, die Definitionen in die cpp-Datei. Ein Beispiel ist unten.
Ehnoah schrieb:
Was müsste ich in die Funktionen.cpp machen?
Deine Funktionen implementieren, siehe Beispiel.
Ehnoah schrieb:
Sprich eine Headerdatei ist wie eine Globale Datenbank auf die alle *.cpp dateien Zugreifen können?
Alle, in denen (direkt oder indirekt) der Header eingebunden ist. Die zweite Voraussetzung ist, dass die Funktionen.cpp auch deinem Projekt hinzugefügt ist, so dass sie kompiliert wird.
Ehnoah schrieb:
ist eine .h automatisch eine *.dll dann?
Nein, eine dll ist was anderes (=>Google).
Ehnoah schrieb:
(Sorry bin Blutiger Anfänger *g* )
Kein Thema.

Beispiel:
Funktionen.h
#ifndef FUNKTIONEN_H //include-guard #define FUNKTIONEN_H //include-guard void meineFunktion1(int val); //Funktionsprototypen (Deklaration) int meineFunktion2(double d); // #endif //include-guardFunktionen.cpp
void meineFunktion1(int val) { //Funktionsdefinition std::cout << val << std::endl; //hier ist also der wirkliche Inhalt der Funktion } int meineFunktion2(double d) { //Funktionsdefinition return (int)d; }
-
Super Beispiel danke dir!
dachte ich mir schon das es so ist aber, hab gedacht wenn ich nur
ZentralesRechteck(int x1); das dann ein Fehler kommt. Aber scheint zu gehn

Danke dir vielmals.
Guard hab ich mal mit drine werde später mal schaun was der macht
-
Ehnoah schrieb:
Guard hab ich mal mit drine werde später mal schaun was der macht
Der Guard sorgt dafür, dass der Header nicht mehrmals eingebunden werden kann (sonst hättest du doppelte Deklarationen, was wieder zu Compiler-Fehlern führen würde). Er funktioniert so:
- wenn FUNKTIONEN_H definiert ist, dann wurde der Header offensichtlich schon eingebunden (daher muss dieses define vom Namen her eindeutig sein, für jeden Header musst du dir also einen neuen Namen ausdenken). Alles zwischen #ifndef und #endif wird vom Präprozessor quasi ausgeblendet, denn die Bedingung für #ifndef ist ja nicht erfüllt. Der Header wird zwar noch mal eingebunden, er enthält dann aber im Grunde nix (so dass auch keine deiner Funktionen doppelt eingebunden wird).
- wenn FUNKTIONEN_H nicht definiert ist, dann definiere es (so dass beim nächsten Mal der Header als schon eingebunden angesehen wird) und füge alles zwischen #ifndef und #endif in den Quellcode ein.
Du musst auch verstehen, was #include genau macht. Dahinter steckt nichts Kompliziertes, es ist lediglich eine simple Textersetzung. Wenn du also einen Header per #include einbindest, heißt das nichts anderes, als dass der Inhalt der Header-Datei an die Stelle des #include-Statements gesetzt wird, bevor der Quellcode dem Compiler übergeben wird.
Ähnlich simpel funktionieren Anweisungen wie #ifdef. Beispiel:
#ifdef _DEBUG //wenn du dein Projekt als Debug-Version erstellst (dann ist _DEBUG definiert), DebugBreak(); //wird diese Zeile mit DebugBreak in den Quellcode eingefügt, bevor er kompiliert wird. #endif //Ansonsten existiert diese Zeile für den Compiler nicht.
-
_matze schrieb:
Beispiel:
Funktionen.h
#ifndef FUNKTIONEN_H //include-guard #define FUNKTIONEN_H //include-guard void meineFunktion1(int val); //Funktionsprototypen (Deklaration) int meineFunktion2(double d); // #endif //include-guardDa fehlt inline.
-
314159265358979 schrieb:
Da fehlt inline.
Nein.
-