Compiler-Fehler
-
Wie müsste es denn dann korrekt lauten? Denn getDatum habe ich ja in der header Datei definiert und in der cpp auch implementiert. Ich bin gerade ein wenig verwirrt.
-
Dir ist klar, dass
__DATE__nicht das aktuelle Datum, sondern das Datum, zu dem du dein Programm erstellt hast zurückgibt?
-
xfthx schrieb:
Wie müsste es denn dann korrekt lauten? Denn getDatum habe ich ja in der header Datei definiert und in der cpp auch implementiert. Ich bin gerade ein wenig verwirrt.
Kommt drauf an was du genau machen möchtest, denn mir fallen schonmal 3 verschiedene Varianten ein:
Variante 1: Freie Funktion
int getDatum() { string date = __DATE__; int newDate = std::stoi(date); return newDate; } int main() { int Datum = getDatum(); }Variante 2: Memberfunktion
class getDate { public: int getDatum(); }; int getDate::getDatum() { string date = __DATE__; int newDate = std::stoi(date); return newDate; } int main() { getDate obj; // Anders als in Java ist hier KEIN new nötig int Datum = obj.getDatum(); }Variante 3: statische Memberfunktion
class getDate { public: static int getDatum(); }; int getDate::getDatum() { string date = __DATE__; int newDate = std::stoi(date); return newDate; } int main() { int Datum = getDate::getDatum(); }Variante 2 und 3 sollten dir aus Java bekannt sein. Variante 1 geht dort nicht aber das Funktionen nicht zwingend einer Klasse zugeordnet sein müssen, sollte einfach zu verstehen sein.
-
xfthx schrieb:
Wie müsste es denn dann korrekt lauten? Denn getDatum habe ich ja in der header Datei definiert und in der cpp auch implementiert. Ich bin gerade ein wenig verwirrt.
In der Headerdatei hast Du einen Memberfunktion getDatum der Klasse getDate deklariert. Die Implementierung nennt man Definition.
Korrekt wäre gewesen:
stattint getDate::getDatum() { string date = __DATE__; int newDate = std::stoi(date); return newDate; }einfach
int getDatum() { string date = __DATE__; int newDate = std::stoi(date); return newDate; }und die Headerdatei weglassen.
oder
in der Headerdatei
statt
#pragma once class getDate { public: getDate(); ~getDate(); int getDatum(); private: };#pragma once class getDate { public: getDate(); ~getDate(); static int getDatum(); private: };und beim Aufruf statt
int Datum = getDatum();int Datum = getDate::getDatum();und die Deklaration von int getDate() in Zeile 5 entfernen.
mfg Martin
-
Hi ihr,
danke für die vielen Möglichkeiten! Ich habe mich für mgaecklers letzte Variante entschieden, doch da klappt immer noch etwas nicht. Der Code sieht jetzt folgendermaßen aus:
main.cpp
#include "getDate.h" #include <iostream> #include <string> using namespace std; //int getDatum(); int main() { int Datum = getDate::getDatum(); cout << "The current date is: " << Datum << endl; system("pause"); return 0; } int getDate::getDatum() { string date = __DATE__; int newDate = std::stoi(date); return newDate; }getDate.h
#pragma once class getDate { public: getDate(); ~getDate(); static int getDatum(); private: };Als Fehlermeldung bekomme ich jetzt etwas sehr Kryptisches:
Ausnahme ausgelöst bei 0x00007FF951B0A1C8 in Hello World!.exe: Microsoft C++-Ausnahme: std::invalid_argument bei Speicherort 0x0000000AED4BF380.
Unbehandelte Ausnahme bei 0x00007FF951B0A1C8 in Hello World!.exe: Microsoft C++-Ausnahme: std::invalid_argument bei Speicherort 0x0000000AED4BF380.Was stimmt denn nun nicht?

Gruß
EDIT: Habe nun herausgefunden, was nicht stimmt. __DATE__ lässt sich nicht ohne Weiteres in einen int verwandeln. Wenn ich anstatt __DATE__ als string Zahlen eingebe, läuft das Programm sauber durch. Verwende ich die stoi-Methode verkehrt?
-
xfthx schrieb:
Habe nun herausgefunden, was nicht stimmt. __DATE__ lässt sich nicht ohne Weiteres in einen int verwandeln. Wenn ich anstatt __DATE__ als string Zahlen eingebe, läuft das Programm sauber durch. Verwende ich die stoi-Methode verkehrt?
Du rufst du Funktion richtig auf, falls du das mit Verwendung meinst. Allerdings musst du dir angucken was du der stoi Funktion vorwirfst. Das __DATE__ Makro (was übrigens das Datum während des compilierens ist und nichts was irgendwie zur Laufzeit bestimmt wird) enthält z.B. irgendwas wie "Aug 2 2015". Wenn du zu einem int konvertieren möchtest, geht das natürlich nicht ohne weiteres und die stoi Funktion wirft deswegen eine Exception. Für die stoi Funktion muss der übergebene string wenigstens mit Zahlen beginnen. Um dir jetzt einen vernünftigen Tipp zu geben müsste man erstmal wissen was du vorhast. Wieso möchtest du ein Datum in einen int konvertieren? Wenn du einfach nur das aktuelle Datum auf der Konsole ausgeben möchtest, könnte das so aussehen (bei den Datumsfunktionen gibts viele veraltete Funktionen aus C Zeiten, ich hoffe das Beispiel ist einigermaßen aktuell):
#include <iostream> #include <iomanip> #include <ctime> int main() { std::time_t result = std::time(NULL); std::cout << std::put_time(localtime(&result), "%d.%m.%Y"); }Das in eventuelle Funktionen zu verpacken überlasse ich dir.
-
Schau dir mal strftime(...) bzw. time(...) an:
http://www.cplusplus.com/reference/ctime/strftime/?kw=strftime
http://www.cplusplus.com/reference/ctime/time/?kw=timelocaltime(...) könnte auch nützlich sein:
http://www.cplusplus.com/reference/ctime/localtime/?kw=localtime
-
Danke euch allen! Ich habe einiges dazugelernt. Allerdings hätte ich noch eine andere Frage: Bei Java gibt es ja eine API, wo man nachschauen kann, was eine Methode tut, welche Inputparameter sie erwartet und was sie ausgibt usw. Gibt es etwas Ähnliches für C++? Ich habe so das Gefühl, dass es 100000 Methoden gibt, aber ich nirgends nachschauen kann, was diese machen.
Gruß
-
Eine API?

Bist du sicher, dass du das richtige Wort benutzt?
Was gefällt dir denn nicht an den Referenzen, die in diesem Thread verlinkt wurden, oder an den Alternativen, die in der als wichtig markierten Linkliste für Neulinge zu finden sind?
-
Klar, kennst du die F1-API nicht?

@xfthx
F1 ist dein Freund.
http://www.cplusplus.com/reference/ ist auch kein Feind.
Google kennt den Rest.