cadman Geschrieben 9. Dezember 2010 Geschrieben 9. Dezember 2010 hi, ich möchte mir einen eigenen kleine header-file anlegen und per include anweisung einbinden. wie unten dargestellt habe ich eine "fc_math.h" und eine "fc_math.cpp" datei, aber irgendwie klappt es nicht. weiß jemand rat ? fc_math.h -------------------------------------- #ifndef FC_MATH_H #define FC_MATH_H class fc_math { public: fc_bogenm(); fc_grad(); virtual ~fc_math(); protected: private: }; #endif // FC_MATH_H fc_math.cpp ------------------------------------------- #include "fc_math.h" // Umwandlung Grad in Bogenmass double fc_bogenm(double grad) { return (grad / 180.0 * 3.1415927); } // Umwandlung Bogenmass in Grad double fc_grad(double bogenmass) { return (bogenmass / 3.1415927*180.0); } Zitieren
Klotzkopp Geschrieben 9. Dezember 2010 Geschrieben 9. Dezember 2010 Eine ordentliche Fehlerbeschreibung ist immer hilfreich. Mit "irgendwie klappt es nicht" kann man nichts anfangen. Wenn du deine Methoden außerhalb der Klassendefinition definierst, musst du den Klassennamen dazuschreiben: double fc_math::fc_bogenm(double grad) Und lass den virtuellen Destruktor weg, das ist Unsinn. Zitieren
cadman Geschrieben 9. Dezember 2010 Autor Geschrieben 9. Dezember 2010 aufruf: fc_math::fc_bogenm(45.0) führt zu folgenden fehlermeldungen: c++ forbids declaration of "fc_bogenm" with no type c++ forbids declaration of "fc_grad" with no type no matching function for cal to "fc_math::fcbogenm(double)" Zitieren
Klotzkopp Geschrieben 9. Dezember 2010 Geschrieben 9. Dezember 2010 aufruf: fc_math::fc_bogenm(45.0)Dir ist klar, dass du erst eine Instanz dieser Klasse erstellen musst, bevor du die Methode aufrufen kannst? no matching function for cal to "fc_math::fcbogenm(double)"So heißt die Methode ja auch nicht. Zitieren
cadman Geschrieben 9. Dezember 2010 Autor Geschrieben 9. Dezember 2010 ich dachte ich könnte die selbstdefinierten befehle einfach so nutzen als stünden sie im eigentlichen progi Zitieren
Klotzkopp Geschrieben 9. Dezember 2010 Geschrieben 9. Dezember 2010 ich dachte ich könnte die selbstdefinierten befehle einfach so nutzen als stünden sie im eigentlichen progiKannst du auch. Zeig doch mal, wie du das aufrufst. Zitieren
cadman Geschrieben 9. Dezember 2010 Autor Geschrieben 9. Dezember 2010 #include <cstdlib> #include <iostream> #include <math.h> #include <stdio.h> #include <K:\Programmieren\c++\Bibliotheken\fc_math\fc_math.h> using namespace std; int main() { cout << "\n" << fc_math::fc_bogenm(45.0); } Zitieren
carstenj Geschrieben 9. Dezember 2010 Geschrieben 9. Dezember 2010 Hi, fc_bogenm(); du hast eine Funktion, die nichts erwartet, du übergibst aber... fc_bogenm(double); Außerdem musst du erst ein Objekt erstellt, was du nicht tust. Deine Syntax ist falsch. Richtig wäre: ... using namespace std; // Ein Objekt blah vom Typ fc_math erstellen... fc_math blah; int main() { cout << "\n" << blah.fc_bogenm(45.0); } Zitieren
Klotzkopp Geschrieben 9. Dezember 2010 Geschrieben 9. Dezember 2010 Das würde so funktionieren, wenn fc_bogenm static wäre. Da es das aber nicht ist, musst du zuerst ein Objekt deiner Klasse erzeugen. fc_math x; cout << "\n" << x.fc_bogenm(45.0);[/code] Zitieren
cadman Geschrieben 10. Dezember 2010 Autor Geschrieben 10. Dezember 2010 und wie mache ich z.b. fc_bogenm static ? Zitieren
Klotzkopp Geschrieben 10. Dezember 2010 Geschrieben 10. Dezember 2010 und wie mache ich z.b. fc_bogenm static ? Indem du in der Klassendefinition static davorschreibst. Beachte auch carstenjs Hinweis: In der Klassendefinition hast du deine Methoden ohne Parameter deklariert, definiert hast du sie aber mit einem double-Parameter. Dass muss einheitlich sein. Zitieren
carstenj Geschrieben 10. Dezember 2010 Geschrieben 10. Dezember 2010 Hi, man sollte auch wissen, was static bedeutet: C++-Programmierung: Statische Elemente in Klassen ? Wikibooks, Sammlung freier Lehr-, Sach- und Fachbücher Das nur zu machen weil, weil einem die Syntax besser gefällt oder man sich eine Zeile sparen kann halte ich nicht unbedingt für das beste Kriterium. Zitieren
cadman Geschrieben 10. Dezember 2010 Autor Geschrieben 10. Dezember 2010 ich glaube, ich muss mir da erst noch ein bißchen anlesen.. ich dachte man könnte die funktionen einfach auslagern, dann im progi dazuladen, um sie dann mit ihrem "normalen" namen zu nutzen Zitieren
cadman Geschrieben 10. Dezember 2010 Autor Geschrieben 10. Dezember 2010 steht irgendwo schritt für schritt erkälrt, wie ich einen headerfile anzulegen habe ? Zitieren
Klotzkopp Geschrieben 10. Dezember 2010 Geschrieben 10. Dezember 2010 ich dachte man könnte die funktionen einfach auslagern, dann im progi dazuladen, um sie dann mit ihrem "normalen" namen zu nutzenWas meinst du mit "normalem Namen"? War fc_bogenm vorher eine freie Funktion, und du hast sie nur zum "Auslagern" in eine Klasse gesteckt? Wenn du eine Methode einer Klasse aufrufen willst, musst du das wie gezeigt machen. Das hat nichts damit zu tun, ob diese Klasse in einer eigenen Codedatei samt Header liegt. steht irgendwo schritt für schritt erkälrt, wie ich einen headerfile anzulegen habe ?Dein Headerfile ist völlig in Ordnung, wenn man davon absieht, dass die Signaturen der Methoden nicht auf die Definitionen passen. Zeig doch mal, wie dein ganzes Programm ohne "Auslagern" aussehen würde. Vielleicht lässt sich dann nachvollziehen, wo das Verständnisproblem liegt. Zitieren
cadman Geschrieben 10. Dezember 2010 Autor Geschrieben 10. Dezember 2010 #include <cstdlib> #include <iostream> #include <math.h> #include <stdio.h> #include <K:\Programmieren\c++\Bibliotheken\fc_math\fc_math .h> using namespace std; // Umwandlung Grad in Bogenmass double fc_bogenm(double grad) { return (grad / 180.0 * 3.1415927); } int main() { cout << "\n" << fc_bogenm(45.0); } Zitieren
Klotzkopp Geschrieben 10. Dezember 2010 Geschrieben 10. Dezember 2010 Und warum hast du beim Auslagern diese Funktion in eine Klasse gesteck? Das ist weder notwendig noch besondern sinnvoll. Zitieren
cadman Geschrieben 10. Dezember 2010 Autor Geschrieben 10. Dezember 2010 also wenn ich ehrlich bin, hat es mein compiler automatisch angelegt Zitieren
Klotzkopp Geschrieben 10. Dezember 2010 Geschrieben 10. Dezember 2010 also wenn ich ehrlich bin, hat es mein compiler automatisch angelegt Ein Compiler legt keine Codedateien an, allenfalls tut das deine Entwicklungsumgebung. Das ist dann aber ein Bedienproblem. fc_math.h sollte so aussehen: #ifndef FC_MATH_H #define FC_MATH_H double fc_bogenm(double grad); #endif // FC_MATH_H[/code] Und fc_math.cpp so: [code]double fc_bogenm(double grad) { return (grad / 180.0 * 3.1415927); } Zitieren
carstenj Geschrieben 10. Dezember 2010 Geschrieben 10. Dezember 2010 Hi, wobei ich mich frage, was du (@cadman) eigentlich genau machen möchtest? Willst du Objektorientierung lernen, oder "einfach" nur deine Aufgabe lösen, mit Auslagerung in einer Headerdatei? Das, was du jetzt hast, funktioniert zwar, hat aber mit Objektorientierung nichts zu tun. Zitieren
cadman Geschrieben 10. Dezember 2010 Autor Geschrieben 10. Dezember 2010 Erst einmal danke für die Hilfe Ich stecke halt noch ganz am Anfang und teste dieses und jenes. Aber mathematische Funktionen muss man doch nicht in eine Klasse legen, wo liegt der Vorteil ? Zitieren
carstenj Geschrieben 10. Dezember 2010 Geschrieben 10. Dezember 2010 Hi, Aber mathematische Funktionen muss man doch nicht in eine Klasse legen, wo liegt der Vorteil ? es gibt keinen, ich war mir nur nicht sicher, was du lernen möchtest und wollte dich darauf hinweisen. Zitieren
cadman Geschrieben 14. Dezember 2010 Autor Geschrieben 14. Dezember 2010 Hallo, ich habe mich genau an den Code von Klotzkopp gehalten und erhalte nun eine Fehler meldung wie im Anhang dargestellt. Zitieren
Klotzkopp Geschrieben 14. Dezember 2010 Geschrieben 14. Dezember 2010 Der Linker findet keine Definition von fc_bogenm. Du musst fc_math.cpp deinem Projekt/Makefile hinzufügen. Zitieren
cadman Geschrieben 14. Dezember 2010 Autor Geschrieben 14. Dezember 2010 aber ich habe doch "fc_math.h" mit include eingebunden wie füge ich denn "fc_math.cpp" meinem projekt hinzu "projekt/makefile" was heißt das ? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.