Compiler-Fehler



  • Ein Unterschied zwischen Java und C++ ist, dass es in C++ freie Funktionen gibt, die zu keiner Klasse gehören. Eine genau solche Funktion hast du deklariert, aber nirgendwo definiert. Definiet hast du nur eine gleichname Funktion der Klasse getDate , die rufst du in deiner main Funktion aber nicht auf.



  • 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:
    statt

    int 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.





  • 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ß


  • Mod

    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.


Anmelden zum Antworten