"Globale" Funktion

Dipsi

Mitglied
Hallo

Project: Dialogbasiert / MFC / VS 2003

Habe ein kleines Problem.
In einer Klasse habe ich eine Funktion die ich mehrmals benötige (in anderen Klassen / Dialogen).

Wenn ich jetzt von einer Klasse auf diese Funktion zugreiffen will, müsste ich einen Pointer setzen, oder eine neue CPP Datei erstellen und die Funktion dort erstellen.

Frage:
Ich will die Variante mit der CPP Datei machen. Muss Ich für das eine neue Klasse erstellen?
Habe versucht die Datei einfach zu erstellen und die Funktion rein zu schreiben.
Doch beim compilieren bekomme ich immer einen Fehler. (.H Datei nicht gefunden.)

Kappiert?:rolleyes:

Wie kann ich das am besten lösen?

Vielen Dank.

Gruss
 
Dipsi hat gesagt.:
Wenn ich jetzt von einer Klasse auf diese Funktion zugreiffen will, müsste ich einen Pointer setzen
Anhand deiner Beschreibung vermute ich, das die besagte Funktion unabhängig von irgendwelchen Parameter innerhalb ihrer Klasse funktioniert. Da würde es reichen, einfach ein neues Objekt dieser Klasse zu erzeugen:
C++:
CMyClass myClass;
myClass.MyFunction();
Dipsi hat gesagt.:
oder eine neue CPP Datei erstellen und die Funktion dort erstellen
Das wird so nicht funktionieren. Du müsstest natürlich die .H-Datei der Ausgangsklasse einbinden (Grund der Fehlermeldung). Der Compiler wird sich allerdings beschweren, da die Funktion schon mal definiert wurde.

Falls dir das Anlegen eines Objektes zu umständlich ist, kannst du die Funktion auch als "static" deklarieren. Dann kannst du sie ohne weitere Mühen überall aufrufen. Hier das Prinzip:
C++:
// .H, Deklaration
class MyClass
{
    static void MyFunction();
};

// .CPP, Definition
void MyClass::MyFunction()
{
    // ...
}

// Verwendung an belieber Stelle im Projekt
// die betreffenende CPP benötigt ein: #include "myclass.h"
MyClass::MyFunction();
Gruß
MCoder
 
Also zum einen ginge evtl. noch die Möglichkeit, die benötigte Funktion in einer übergeordnete Klasse zu implementieren und alle Klassen, welche die Funktion benötigen, von dieser Oberklasse abzuleiten.

Dein Ansatz ist auch möglich, vor allem dann, wenn du den #include mit der Funktion exakt da einsetzt, wo die Funktion sein soll. Und damit meine ich exakt - nicht am Anfang der Datei. Da könnte dann so aussehen:

Code:
#include <stdio.h>
...
class xyz;
...
class xyz::MeineFunktion() {
  #include "funktion.h"
}

class abc;
...
class abc::AuchMeineFunktion() {
  #include "funktion.h"
}

Du kannst dir dabei merken, daß der #include de facto nur eine Textersetzung vom Compiler darstellt. Erst werden alle #includes durch den beinhalteten Text ersetzt, dann wird compiliert. Somit kannst du mit einem #include nahezu jede Art von Programmcode "auslagern".
So habe ich früher auch programmiert, aber sauberer finde ich die Variante mit der Vererbung.
 
Wie schon aus den vorherigen Antworten hervorgeht, ist die Lösung stark davon abhängig, was die Funktion macht und wie sie das macht.
Wenn Du z.B. eine Funktion hast, die alle Leerzeichen am Anfang und am Ende eines Strings entfernt (ich weiß, gibt es schon, ist ja auch nur ein Beispiel), dann kannst Du das z.B. als globale Funktion implementieren, die eine Referenz auf den String erhält und diesen ändert. Dazu machst Du eine cpp-Datei (z.B. globals.cpp), in die Du die Funktionsdefinition (den Funktionsrumpf) schreibst. Dazu erzeugst Du eine passende h-Datei (globals.h), in die Du die Deklaration der Funktion schreibst. diese h-Datei includierst Du überall da, wo Du die entsprechende Funktion brauchst.

globals.cpp:
C++:
void TruncateCString(CString &cstrString)
{
    cstrString.TruncateLeft();
    cstrString.TruncateRight();
}
globals.h
C++:
void TruncateCString(CString &cstrString);
Verwendung:
C++:
...
#include "globals.h"
...
CString cstrTruncText = "   abcdefg    ";
...
TruncateCString(cstrTruncText);
...

P.S.: Die cpp- und die h-Datei mußt Du natürlich zu Deinem Projekt hinzufügen.
 
Zurück